#14001 Add sort option for Test Cases (#15401)

This commit is contained in:
Shailesh Parmar 2024-02-29 17:54:29 +05:30 committed by GitHub
parent cecbf80a2d
commit a694cc5cc9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 74 additions and 37 deletions

View File

@ -36,8 +36,9 @@ import {
updateTestCaseById, updateTestCaseById,
} from '../../../rest/testAPI'; } from '../../../rest/testAPI';
import { getNameFromFQN } from '../../../utils/CommonUtils'; import { getNameFromFQN } from '../../../utils/CommonUtils';
import { getColumnNameFromEntityLink } from '../../../utils/EntityUtils';
import { getEntityFQN } from '../../../utils/FeedUtils';
import { generateFormFields } from '../../../utils/formUtils'; import { generateFormFields } from '../../../utils/formUtils';
import { getEntityFqnFromEntityLink } from '../../../utils/TableUtils';
import { showErrorToast, showSuccessToast } from '../../../utils/ToastUtils'; import { showErrorToast, showSuccessToast } from '../../../utils/ToastUtils';
import Loader from '../../common/Loader/Loader'; import Loader from '../../common/Loader/Loader';
import RichTextEditor from '../../common/RichTextEditor/RichTextEditor'; import RichTextEditor from '../../common/RichTextEditor/RichTextEditor';
@ -54,7 +55,7 @@ const EditTestCaseModal: React.FC<EditTestCaseModalProps> = ({
const { t } = useTranslation(); const { t } = useTranslation();
const [form] = Form.useForm(); const [form] = Form.useForm();
const tableFqn = useMemo( const tableFqn = useMemo(
() => getEntityFqnFromEntityLink(testCase?.entityLink ?? ''), () => getEntityFQN(testCase?.entityLink ?? ''),
[testCase] [testCase]
); );
const [selectedDefinition, setSelectedDefinition] = const [selectedDefinition, setSelectedDefinition] =
@ -191,9 +192,7 @@ const EditTestCaseModal: React.FC<EditTestCaseModalProps> = ({
displayName: testCase?.displayName, displayName: testCase?.displayName,
params: getParamsValue(definition), params: getParamsValue(definition),
table: getNameFromFQN(tableFqn), table: getNameFromFQN(tableFqn),
column: getNameFromFQN( column: getColumnNameFromEntityLink(testCase?.entityLink),
getEntityFqnFromEntityLink(testCase?.entityLink, isColumn)
),
computePassedFailedRowCount: testCase?.computePassedFailedRowCount, computePassedFailedRowCount: testCase?.computePassedFailedRowCount,
}); });
setSelectedDefinition(definition); setSelectedDefinition(definition);

View File

@ -32,9 +32,12 @@ import {
} from '../../../interface/search.interface'; } from '../../../interface/search.interface';
import { searchQuery } from '../../../rest/searchAPI'; import { searchQuery } from '../../../rest/searchAPI';
import { getNameFromFQN } from '../../../utils/CommonUtils'; import { getNameFromFQN } from '../../../utils/CommonUtils';
import { getEntityName } from '../../../utils/EntityUtils'; import {
getColumnNameFromEntityLink,
getEntityName,
} from '../../../utils/EntityUtils';
import { getEntityFQN } from '../../../utils/FeedUtils';
import { replacePlus } from '../../../utils/StringsUtils'; import { replacePlus } from '../../../utils/StringsUtils';
import { getEntityFqnFromEntityLink } from '../../../utils/TableUtils';
import ErrorPlaceHolder from '../../common/ErrorWithPlaceholder/ErrorPlaceHolder'; import ErrorPlaceHolder from '../../common/ErrorWithPlaceholder/ErrorPlaceHolder';
import Loader from '../../common/Loader/Loader'; import Loader from '../../common/Loader/Loader';
import Searchbar from '../../common/SearchBarComponent/SearchBar.component'; import Searchbar from '../../common/SearchBarComponent/SearchBar.component';
@ -186,7 +189,7 @@ export const AddTestCaseList = ({
itemKey="id" itemKey="id"
onScroll={onScroll}> onScroll={onScroll}>
{({ _source: test }) => { {({ _source: test }) => {
const tableFqn = getEntityFqnFromEntityLink(test.entityLink); const tableFqn = getEntityFQN(test.entityLink);
const tableName = getNameFromFQN(tableFqn); const tableName = getNameFromFQN(tableFqn);
const isColumn = test.entityLink.includes('::columns::'); const isColumn = test.entityLink.includes('::columns::');
@ -224,13 +227,8 @@ export const AddTestCaseList = ({
'label.column' 'label.column'
)}:`}</Typography.Text> )}:`}</Typography.Text>
<Typography.Text className="text-grey-muted text-xs"> <Typography.Text className="text-grey-muted text-xs">
{getNameFromFQN( {replacePlus(
replacePlus( getColumnNameFromEntityLink(test.entityLink)
getEntityFqnFromEntityLink(
test.entityLink,
isColumn
)
)
) ?? '--'} ) ?? '--'}
</Typography.Text> </Typography.Text>
</Space> </Space>

View File

@ -77,6 +77,23 @@ export const TestSuites = ({ summaryPanel }: { summaryPanel: ReactNode }) => {
title: t('label.name'), title: t('label.name'),
dataIndex: 'name', dataIndex: 'name',
key: 'name', key: 'name',
sorter: (a, b) => {
if (a.executable) {
// Sort for executable test suites
return (
a.executableEntityReference?.fullyQualifiedName?.localeCompare(
b.executableEntityReference?.fullyQualifiedName ?? ''
) ?? 0
);
} else {
// Sort for logical test suites
return (
a.fullyQualifiedName?.localeCompare(b.fullyQualifiedName ?? '') ??
0
);
}
},
sortDirections: ['ascend', 'descend'],
render: (name, record) => { render: (name, record) => {
return record.executable ? ( return record.executable ? (
<Link <Link

View File

@ -40,11 +40,14 @@ import {
formatDate, formatDate,
formatDateTime, formatDateTime,
} from '../../../../utils/date-time/DateTimeUtils'; } from '../../../../utils/date-time/DateTimeUtils';
import { getEntityName } from '../../../../utils/EntityUtils'; import {
getColumnNameFromEntityLink,
getEntityName,
} from '../../../../utils/EntityUtils';
import { getEntityFQN } from '../../../../utils/FeedUtils';
import { checkPermission } from '../../../../utils/PermissionsUtils'; import { checkPermission } from '../../../../utils/PermissionsUtils';
import { getIncidentManagerDetailPagePath } from '../../../../utils/RouterUtils'; import { getIncidentManagerDetailPagePath } from '../../../../utils/RouterUtils';
import { replacePlus } from '../../../../utils/StringsUtils'; import { replacePlus } from '../../../../utils/StringsUtils';
import { getEntityFqnFromEntityLink } from '../../../../utils/TableUtils';
import { showErrorToast } from '../../../../utils/ToastUtils'; import { showErrorToast } from '../../../../utils/ToastUtils';
import AppBadge from '../../../common/Badge/Badge.component'; import AppBadge from '../../../common/Badge/Badge.component';
import DeleteWidgetModal from '../../../common/DeleteWidget/DeleteWidgetModal'; import DeleteWidgetModal from '../../../common/DeleteWidget/DeleteWidgetModal';
@ -141,6 +144,8 @@ const DataQualityTab: React.FC<DataQualityTabProps> = ({
dataIndex: 'name', dataIndex: 'name',
key: 'name', key: 'name',
width: 300, width: 300,
sorter: (a, b) => a.name.localeCompare(b.name),
sortDirections: ['ascend', 'descend'],
render: (name: string, record) => { render: (name: string, record) => {
const status = record.testCaseResult?.testCaseStatus; const status = record.testCaseResult?.testCaseStatus;
const urlData = { const urlData = {
@ -166,14 +171,14 @@ const DataQualityTab: React.FC<DataQualityTabProps> = ({
}, },
}, },
...(showTableColumn ...(showTableColumn
? [ ? ([
{ {
title: t('label.table'), title: t('label.table'),
dataIndex: 'entityLink', dataIndex: 'entityLink',
key: 'table', key: 'table',
width: 150, width: 150,
render: (entityLink: string) => { render: (entityLink: string) => {
const tableFqn = getEntityFqnFromEntityLink(entityLink); const tableFqn = getEntityFQN(entityLink);
const name = getNameFromFQN(tableFqn); const name = getNameFromFQN(tableFqn);
return ( return (
@ -190,8 +195,18 @@ const DataQualityTab: React.FC<DataQualityTabProps> = ({
</Link> </Link>
); );
}, },
sorter: (a, b) => {
// Extract table name from entity link
const tableAFqn = getEntityFQN(a.entityLink);
const tableA = getNameFromFQN(tableAFqn);
const tableBFqn = getEntityFQN(b.entityLink);
const tableB = getNameFromFQN(tableBFqn);
return tableA.localeCompare(tableB);
},
sortDirections: ['ascend', 'descend'],
}, },
] ] as ColumnsType<TestCase>)
: []), : []),
{ {
title: t('label.column'), title: t('label.column'),
@ -201,8 +216,8 @@ const DataQualityTab: React.FC<DataQualityTabProps> = ({
render: (entityLink) => { render: (entityLink) => {
const isColumn = entityLink.includes('::columns::'); const isColumn = entityLink.includes('::columns::');
if (isColumn) { if (isColumn) {
const name = getNameFromFQN( const name = replacePlus(
replacePlus(getEntityFqnFromEntityLink(entityLink, isColumn)) getColumnNameFromEntityLink(entityLink) ?? ''
); );
return name; return name;
@ -210,6 +225,19 @@ const DataQualityTab: React.FC<DataQualityTabProps> = ({
return '--'; return '--';
}, },
sorter: (a, b) => {
// Extract column name from entity link if available
const columnA = a.entityLink.includes('::columns::')
? replacePlus(getColumnNameFromEntityLink(a.entityLink))
: '--';
const columnB = b.entityLink.includes('::columns::')
? replacePlus(getColumnNameFromEntityLink(b.entityLink))
: '--';
return columnA.localeCompare(columnB);
},
sortDirections: ['ascend', 'descend'],
}, },
{ {
title: t('label.last-run'), title: t('label.last-run'),

View File

@ -104,6 +104,7 @@ import {
getPartialNameFromTableFQN, getPartialNameFromTableFQN,
getTableFQNFromColumnFQN, getTableFQNFromColumnFQN,
} from './CommonUtils'; } from './CommonUtils';
import EntityLink from './EntityLink';
import { BasicEntityOverviewInfo } from './EntityUtils.interface'; import { BasicEntityOverviewInfo } from './EntityUtils.interface';
import Fqn from './Fqn'; import Fqn from './Fqn';
import { import {
@ -1774,3 +1775,12 @@ export const columnSorter = (
return name1.localeCompare(name2); return name1.localeCompare(name2);
}; };
/**
* Retrieves the column name from an entity link.
* @param entityLink The entity link string.
* @returns The column name extracted from the entity link.
*/
export const getColumnNameFromEntityLink = (entityLink: string) => {
return EntityLink.getTableColumnName(entityLink);
};

View File

@ -409,21 +409,6 @@ export const generateEntityLink = (fqn: string, includeColumn = false) => {
} }
}; };
export const getEntityFqnFromEntityLink = (
entityLink: string,
includeColumn = false
) => {
const link = entityLink.split('>')[0];
const entityLinkData = link.split('::');
const tableFqn = entityLinkData[2];
if (includeColumn) {
return `${tableFqn}.${entityLinkData[entityLinkData.length - 1]}`;
}
return tableFqn;
};
export function getTableExpandableConfig<T>( export function getTableExpandableConfig<T>(
isDraggable?: boolean isDraggable?: boolean
): ExpandableConfig<T> { ): ExpandableConfig<T> {