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 >