diff --git a/app/javascript/components/miq-data-table/helper.js b/app/javascript/components/miq-data-table/helper.js
index c486ac2282a..c8a03749d39 100644
--- a/app/javascript/components/miq-data-table/helper.js
+++ b/app/javascript/components/miq-data-table/helper.js
@@ -133,7 +133,7 @@ export const rowData = (headerKeys, rows, hasCheckbox) => {
const rowItems = [];
const mergedStatus = [];
rows.forEach(({
- cells, id, clickable, clickId,
+ cells, id, clickable, clickId, disabled,
}) => {
const requiredCells = hasCheckbox ? (cells.filter((c) => !c.is_checkbox)) : cells;
const { mergedCells, merged } = mergeIcons(requiredCells);
@@ -143,6 +143,7 @@ export const rowData = (headerKeys, rows, hasCheckbox) => {
result.id = id;
if (clickId) result.clickId = clickId;
result.clickable = clickable;
+ if (disabled !== undefined) result.disabled = disabled;
return result;
}, {});
rowItems.push(reducedItems);
diff --git a/app/javascript/components/miq-data-table/index.jsx b/app/javascript/components/miq-data-table/index.jsx
index cb2c3af58bd..95d59fd8904 100644
--- a/app/javascript/components/miq-data-table/index.jsx
+++ b/app/javascript/components/miq-data-table/index.jsx
@@ -128,7 +128,8 @@ const MiqDataTable = ({
/** Function to identify if the row is clickable or not and the returns a class name */
const classNameRow = (item) => {
if (item) {
- const { clickable, id } = item;
+ const { clickable, id, disabled } = item;
+ if (disabled) return 'disabled-row';
if (clickable === false) return 'simple-row';
if (clickable === true || clickable === null) {
return (gridChecks.includes(id)
diff --git a/app/javascript/components/miq-data-table/miq-table-cell.jsx b/app/javascript/components/miq-data-table/miq-table-cell.jsx
index 709c1e0d6fc..5ccbae37f8a 100644
--- a/app/javascript/components/miq-data-table/miq-table-cell.jsx
+++ b/app/javascript/components/miq-data-table/miq-table-cell.jsx
@@ -25,8 +25,9 @@ const MiqTableCell = ({
const alignClass = longText ? 'vertical_align_top' : '';
const longerTextClass = veryLongText ? 'truncate_longer_text' : '';
+ const cellTitle = cell.data.title ? cell.data.title : cell.value;
const truncateText = (
-
+
{cell.value}
);
diff --git a/app/javascript/components/workflows/helper.js b/app/javascript/components/workflows/helper.js
index 928cd27dd81..7e5ddd4a7dc 100644
--- a/app/javascript/components/workflows/helper.js
+++ b/app/javascript/components/workflows/helper.js
@@ -7,17 +7,30 @@ const entryPointsHeaderInfo = () => [
];
/** Function to return the cell data for a row item. */
-const cellInfo = (workflow) => [
- { text: workflow.configuration_script_source ? workflow.configuration_script_source.name : '' },
- { text: workflow.name },
-];
+const cellInfo = (workflow) => {
+ const isValid = workflow.payload_valid;
+ const workflowNameTitle = !isValid ? `${workflow.name} (${__('Invalid Workflow')})` : workflow.name;
+
+ return [
+ { text: workflow.configuration_script_source ? workflow.configuration_script_source.name : '' },
+ { text: workflow.name, title: workflowNameTitle },
+ ];
+};
/** Function to return the row information for the list */
const rowInfo = (headers, response) => {
const headerKeys = headers.map((item) => item.key);
- const rows = response.resources.filter((item) => item.payload).map((workflow) => ({
- id: workflow.id.toString(), cells: cellInfo(workflow), clickable: true,
- }));
+ const rows = response.resources.map((workflow) => {
+ const isValid = workflow.payload_valid;
+ return {
+ id: workflow.id.toString(),
+ name: workflow.name,
+ cells: cellInfo(workflow),
+ clickable: isValid,
+ disabled: !isValid,
+ };
+ });
+
const miqRows = rowData(headerKeys, rows, false);
return miqRows.rowItems;
};
diff --git a/app/javascript/components/workflows/workflow-entry-points.jsx b/app/javascript/components/workflows/workflow-entry-points.jsx
index 0586482fd31..c966b80a55e 100644
--- a/app/javascript/components/workflows/workflow-entry-points.jsx
+++ b/app/javascript/components/workflows/workflow-entry-points.jsx
@@ -91,6 +91,14 @@ const WorkflowEntryPoints = ({
/** Function to handle a row's click event. */
const onSelect = (selectedItemId) => {
+ // Find the row to check if it's disabled
+ const selectedRow = data.list.rows.find((row) => row.id === selectedItemId);
+
+ // Don't allow selection of disabled rows
+ if (selectedRow && selectedRow.disabled) {
+ return;
+ }
+
setData({
...data,
selectedItemId: (data.selectedItemId === selectedItemId) ? undefined : selectedItemId,
@@ -110,6 +118,15 @@ const WorkflowEntryPoints = ({
http.post('/catalog/ae_tree_select_toggle?button=cancel', {}, { headers: {}, skipJsonParsing: true });
}
};
+ /** Function to check if a valid workflow is selected */
+ const isValidSelection = () => {
+ if (!data.selectedItemId) {
+ return false;
+ }
+ const selectedRow = data.list.rows.find((row) => row.id === data.selectedItemId);
+ return selectedRow && !selectedRow.disabled;
+ };
+
/** Function to handle the modal box apply button click event. */
const onApply = () => {
const seletedItem = data.list.rows.find((item) => item.id === data.selectedItemId);
@@ -138,7 +155,7 @@ const WorkflowEntryPoints = ({
open
modalHeading={sprintf(__('Select Embedded Workflow - %s Entry Point'), workflowTypes[type])}
primaryButtonText={__('Apply')}
- primaryButtonDisabled={!data.selectedItemId}
+ primaryButtonDisabled={!isValidSelection()}
secondaryButtonText={__('Cancel')}
onRequestSubmit={onApply}
onRequestClose={onCloseModal}
diff --git a/app/javascript/spec/settings-compan-categories/__snapshots__/settings-company-categories.spec.js.snap b/app/javascript/spec/settings-compan-categories/__snapshots__/settings-company-categories.spec.js.snap
index 83a97dadc96..9905962be2b 100644
--- a/app/javascript/spec/settings-compan-categories/__snapshots__/settings-company-categories.spec.js.snap
+++ b/app/javascript/spec/settings-compan-categories/__snapshots__/settings-company-categories.spec.js.snap
@@ -2458,7 +2458,7 @@ exports[`SettingsCompanyCategories component should render a SettingsCompanyCate
Delete
@@ -3617,7 +3617,7 @@ exports[`SettingsCompanyCategories component should render a SettingsCompanyCate
Delete
@@ -4776,7 +4776,7 @@ exports[`SettingsCompanyCategories component should render a SettingsCompanyCate
Delete
@@ -5935,7 +5935,7 @@ exports[`SettingsCompanyCategories component should render a SettingsCompanyCate
Delete
diff --git a/app/javascript/spec/settings-label-tag-mapping/__snapshots__/settings-label-tag-mapping.spec.js.snap b/app/javascript/spec/settings-label-tag-mapping/__snapshots__/settings-label-tag-mapping.spec.js.snap
index 10253bef787..416dc1ae262 100644
--- a/app/javascript/spec/settings-label-tag-mapping/__snapshots__/settings-label-tag-mapping.spec.js.snap
+++ b/app/javascript/spec/settings-label-tag-mapping/__snapshots__/settings-label-tag-mapping.spec.js.snap
@@ -1373,7 +1373,7 @@ exports[`SettingsLabelTagMapping component should render a SettingsLabelTagMappi
Delete
@@ -1887,7 +1887,7 @@ exports[`SettingsLabelTagMapping component should render a SettingsLabelTagMappi
Delete
@@ -2401,7 +2401,7 @@ exports[`SettingsLabelTagMapping component should render a SettingsLabelTagMappi
Delete
@@ -2915,7 +2915,7 @@ exports[`SettingsLabelTagMapping component should render a SettingsLabelTagMappi
Delete
@@ -4292,7 +4292,7 @@ exports[`SettingsLabelTagMapping component should render a SettingsLabelTagMappi
Delete
@@ -4806,7 +4806,7 @@ exports[`SettingsLabelTagMapping component should render a SettingsLabelTagMappi
Delete
@@ -5320,7 +5320,7 @@ exports[`SettingsLabelTagMapping component should render a SettingsLabelTagMappi
Delete
@@ -5834,7 +5834,7 @@ exports[`SettingsLabelTagMapping component should render a SettingsLabelTagMappi
Delete
diff --git a/app/javascript/spec/tenant-quota-form/__snapshots__/tenant-quota-form.spec.js.snap b/app/javascript/spec/tenant-quota-form/__snapshots__/tenant-quota-form.spec.js.snap
index ca561db1d49..2295e415ff5 100644
--- a/app/javascript/spec/tenant-quota-form/__snapshots__/tenant-quota-form.spec.js.snap
+++ b/app/javascript/spec/tenant-quota-form/__snapshots__/tenant-quota-form.spec.js.snap
@@ -812,7 +812,7 @@ exports[`Tenant Quota Form Component should render the manage quotas form for a
labelText={
@@ -830,7 +830,7 @@ exports[`Tenant Quota Form Component should render the manage quotas form for a
labelText={
@@ -859,7 +859,7 @@ exports[`Tenant Quota Form Component should render the manage quotas form for a
>
@@ -1511,7 +1511,7 @@ exports[`Tenant Quota Form Component should render the manage quotas form for a
labelText={
@@ -1540,7 +1540,7 @@ exports[`Tenant Quota Form Component should render the manage quotas form for a
>
@@ -2963,7 +2963,7 @@ exports[`Tenant Quota Form Component should render the manage quotas form for a
labelText={
@@ -2992,7 +2992,7 @@ exports[`Tenant Quota Form Component should render the manage quotas form for a
>
@@ -3615,7 +3615,7 @@ exports[`Tenant Quota Form Component should render the manage quotas form for a
labelText={
@@ -3644,7 +3644,7 @@ exports[`Tenant Quota Form Component should render the manage quotas form for a
>