mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-11-11 00:11:05 +00:00
parent
cecbf80a2d
commit
a694cc5cc9
@ -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);
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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'),
|
||||||
|
|||||||
@ -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);
|
||||||
|
};
|
||||||
|
|||||||
@ -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> {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user