GEN-1727: Pluralize owner label everywhere (#18117)

* GEN-1727: Pluralize owner label everywhere

* fix: unit tests

* fix: playwright test

* adress comments

* fix playwright test
This commit is contained in:
Sachin Chaurasiya 2024-10-10 12:21:56 +05:30 committed by GitHub
parent 68e71cb3dc
commit d21ee58f02
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
50 changed files with 77 additions and 64 deletions

View File

@ -43,7 +43,7 @@ test.describe('Entity Summary Panel', () => {
await expect(
page.locator('.ant-drawer-title > [data-testid="entity-link"]')
).toBeVisible();
await expect(page.getByTestId('Owner-value')).toBeVisible();
await expect(page.getByTestId('Owners-value')).toBeVisible();
await expect(page.getByTestId('Tier-label')).toBeVisible();
await expect(page.getByTestId('Service-label')).toBeVisible();
await expect(page.getByTestId('Usage-label')).toBeVisible();
@ -58,7 +58,7 @@ test.describe('Entity Summary Panel', () => {
await expect(
page.locator('.ant-drawer-title > [data-testid="entity-link"]')
).toBeVisible();
await expect(page.getByTestId('Owner-value')).toBeVisible();
await expect(page.getByTestId('Owners-value')).toBeVisible();
await expect(page.getByTestId('Tier-label')).toBeVisible();
await expect(page.getByTestId('Service-label')).toBeVisible();
await expect(page.getByTestId('Database-label')).toBeVisible();

View File

@ -80,7 +80,7 @@ test('search dropdown should work properly for quick filters', async ({
test('should search for empty or null filters', async ({ page }) => {
const items = [
{ label: 'Owner', key: 'owners.displayName.keyword' },
{ label: 'Owners', key: 'owners.displayName.keyword' },
{ label: 'Tag', key: 'tags.tagFQN' },
{ label: 'Domain', key: 'domain.displayName.keyword' },
{ label: 'Tier', key: 'tier.tagFQN' },

View File

@ -149,7 +149,7 @@ test.describe('Listing page and add Metric flow should work', () => {
page.getByRole('cell', { name: 'Glossary Terms', exact: true })
).toBeVisible();
await expect(
page.getByRole('cell', { name: 'Owner', exact: true })
page.getByRole('cell', { name: 'Owners', exact: true })
).toBeVisible();
// check for metric entities in table

View File

@ -66,8 +66,8 @@ test.describe('Explore Tree scenarios ', () => {
await expect(
page.getByTestId('search-dropdown-Domain').locator('span')
).toContainText('Domain');
await expect(page.getByTestId('search-dropdown-Owner')).toContainText(
'Owner'
await expect(page.getByTestId('search-dropdown-Owners')).toContainText(
'Owners'
);
await expect(
page.getByTestId('search-dropdown-Tag').locator('span')

View File

@ -23,7 +23,7 @@ type EntityFields = {
export const FIELDS: EntityFields[] = [
{
id: 'Owner',
id: 'Owners',
name: 'owners.displayName.keyword',
localSearch: false,
},

View File

@ -182,7 +182,7 @@ export const TestSuites = ({ summaryPanel }: { summaryPanel: ReactNode }) => {
},
},
{
title: t('label.owner'),
title: t('label.owner-plural'),
dataIndex: 'owners',
key: 'owners',
render: (owners: EntityReference[]) => <OwnerLabel owners={owners} />,

View File

@ -129,7 +129,7 @@ describe('TestSuites component', () => {
'label.name',
'label.test-plural',
'label.success %',
'label.owner',
'label.owner-plural',
]);
expect(await screen.findByTestId('test-suite-table')).toBeInTheDocument();
expect(

View File

@ -86,7 +86,7 @@ const TableQueryRightPanel = ({
<Space className="relative" direction="vertical" size={4}>
<Space align="center" className="w-full" size={0}>
<Typography.Text className="right-panel-label">
{t('label.owner')}
{t('label.owner-plural')}
</Typography.Text>
{(EditAll || EditOwners) && (
@ -99,7 +99,7 @@ const TableQueryRightPanel = ({
}>
<Tooltip
title={t('label.edit-entity', {
entity: t('label.owner-lowercase'),
entity: t('label.owner-lowercase-plural'),
})}>
<Button
className="cursor-pointer flex-center"

View File

@ -143,7 +143,7 @@ const AddDomainForm = ({
name: 'owners',
id: 'root/owner',
required: false,
label: t('label.owner'),
label: t('label.owner-plural'),
type: FieldTypes.USER_TEAM_SELECT,
props: {
hasPermission: true,

View File

@ -80,7 +80,7 @@ describe('Test Add Domain component', () => {
expect(screen.getByTestId('color-color-input')).toBeInTheDocument();
expect(screen.getByText('label.domain-type')).toBeInTheDocument();
expect(screen.getAllByTestId('helper-icon')).toHaveLength(2);
expect(screen.getByText('label.owner')).toBeInTheDocument();
expect(screen.getByText('label.owner-plural')).toBeInTheDocument();
expect(screen.getByTestId('add-owner')).toBeInTheDocument();
expect(screen.getByText('label.expert-plural')).toBeInTheDocument();
expect(screen.getByTestId('add-experts')).toBeInTheDocument();

View File

@ -200,7 +200,7 @@ const DocumentationTab = ({
<Col data-testid="domain-owner-name" span="24">
<div className="d-flex items-center m-b-xss">
<Typography.Text className="right-panel-label">
{t('label.owner')}
{t('label.owner-plural')}
</Typography.Text>
{editOwnerPermission && domain.owners && (
<UserTeamSelectableList
@ -210,7 +210,7 @@ const DocumentationTab = ({
onUpdate={(updatedUser) => handleUpdatedOwner(updatedUser)}>
<Tooltip
title={t('label.edit-entity', {
entity: t('label.owner'),
entity: t('label.owner-plural'),
})}>
<Button
className="cursor-pointer flex-center m-l-xss"

View File

@ -73,7 +73,7 @@ const SubDomainsTable = ({
),
},
{
title: t('label.owner'),
title: t('label.owner-plural'),
dataIndex: 'owners',
key: 'owners',
render: (owners: EntityReference[]) => <OwnerLabel owners={owners} />,

View File

@ -65,7 +65,7 @@ describe('CommonEntitySummaryInfo component', () => {
);
expect(screen.queryByTestId('label.owner-label')).not.toBeInTheDocument();
expect(screen.getByTestId('label.owner-value')).toHaveTextContent(
expect(screen.getByTestId('label.owner-plural-value')).toHaveTextContent(
'No Owner'
);
expect(screen.getByTestId('Type-label')).toHaveTextContent('Type');

View File

@ -30,7 +30,7 @@ function CommonEntitySummaryInfo({
return (
<Row gutter={[0, 4]}>
{entityInfo.map((info) => {
const isOwner = info.name === t('label.owner');
const isOwner = info.name === t('label.owner-plural');
return info.visible?.includes(componentType) ? (
<Col key={info.name} span={24}>

View File

@ -82,7 +82,7 @@ const DataProductSummary = ({
<Typography.Text
className="summary-panel-section-title"
data-testid="owner-header">
{t('label.owner')}
{t('label.owner-plural')}
</Typography.Text>
</Col>
<Col span={24}>

View File

@ -13,7 +13,7 @@
export const mockCommonEntityInfo = [
{
name: 'label.owner',
name: 'label.owner-plural',
value: 'No Owner',
url: '',
isLink: false,

View File

@ -196,7 +196,7 @@ const AddGlossary = ({
name: 'owners',
id: 'root/owner',
required: false,
label: t('label.owner'),
label: t('label.owner-plural'),
type: FieldTypes.USER_TEAM_SELECT,
props: {
hasPermission: true,

View File

@ -314,7 +314,7 @@ const AddGlossaryTermForm = ({
name: 'owners',
id: 'root/owner',
required: false,
label: t('label.owner'),
label: t('label.owner-plural'),
type: FieldTypes.USER_TEAM_SELECT,
props: {
hasPermission: true,

View File

@ -158,7 +158,7 @@ const GlossaryDetailsRightPanel = ({
<Col data-testid="glossary-right-panel-owner-link" span="24">
<div className="d-flex items-center m-b-xs">
<Typography.Text className="right-panel-label">
{t('label.owner')}
{t('label.owner-plural')}
</Typography.Text>
{(permissions.EditOwners || permissions.EditAll) &&
selectedData.owners &&
@ -171,7 +171,7 @@ const GlossaryDetailsRightPanel = ({
onUpdate={(updatedUser) => handleUpdatedOwner(updatedUser)}>
<Tooltip
title={t('label.edit-entity', {
entity: t('label.owner'),
entity: t('label.owner-plural'),
})}>
<Button
className="cursor-pointer flex-center m-l-xss"

View File

@ -78,7 +78,7 @@ describe('GlossaryDetailsRightPanel', () => {
);
expect(getByTestId('glossary-right-panel-owner-link')).toHaveTextContent(
'label.owner'
'label.owner-plural'
);
expect(getByTestId('glossary-reviewer-heading-name')).toHaveTextContent(
'label.reviewer-plural'

View File

@ -163,7 +163,7 @@ const GlossaryTermTab = ({
),
},
{
title: t('label.owner'),
title: t('label.owner-plural'),
dataIndex: 'owners',
key: 'owners',
width: '17%',

View File

@ -434,7 +434,7 @@ const PipelineDetails = ({
),
},
{
title: t('label.owner'),
title: t('label.owner-plural'),
dataIndex: 'owners',
key: 'owners',
width: 120,

View File

@ -354,7 +354,7 @@ describe('Services', () => {
await screen.findByTestId('service-name-pipelineServices')
).toHaveTextContent('Glue');
expect(await screen.findByText('label.owner')).toBeInTheDocument();
expect(await screen.findByText('label.owner-plural')).toBeInTheDocument();
expect(await screen.findByText('OwnerLabel')).toBeInTheDocument();
});

View File

@ -344,7 +344,7 @@ const Services = ({ serviceName }: ServicesProps) => {
),
},
{
title: t('label.owner'),
title: t('label.owner-plural'),
dataIndex: 'owners',
key: 'owners',
width: 200,

View File

@ -120,7 +120,7 @@ const EntitySummaryDetails = ({ data }: GetInfoElementsProps) => {
<span
className="d-flex gap-1 items-center"
data-testid="owner-link">
{t('label.no-entity', { entity: t('label.owner') })}
{t('label.no-entity', { entity: t('label.owner-plural') })}
</span>
);
}

View File

@ -119,7 +119,7 @@ export const OwnerLabel = ({
const inheritedIcon = owner?.inherited ? (
<Tooltip
title={t('label.inherited-entity', {
entity: t('label.owner'),
entity: t('label.owner-plural'),
})}>
<InheritIcon
className="inherit-icon cursor-pointer"
@ -165,7 +165,7 @@ export const OwnerLabel = ({
className={classNames('no-owner font-medium text-xs', className)}
data-testid="owner-link">
{placeHolder ??
t('label.no-entity', { entity: t('label.owner') })}
t('label.no-entity', { entity: t('label.owner-plural') })}
</Typography.Text>
</div>
)}

View File

@ -267,7 +267,7 @@ export const UserTeamSelectableList = ({
size={8}>
<Typography.Text className="text-grey-muted">
{t('label.selected-entity', {
entity: label ?? t('label.owner'),
entity: label ?? t('label.owner-plural'),
})}
</Typography.Text>
<div className="user-team-popover-header-content">
@ -369,7 +369,7 @@ export const UserTeamSelectableList = ({
!popupVisible &&
(tooltipText ??
t('label.edit-entity', {
entity: t('label.owner'),
entity: t('label.owner-plural'),
}))
}>
<Button

View File

@ -22,7 +22,7 @@ export const COMMON_DROPDOWN_ITEMS = [
key: EntityFields.DOMAIN,
},
{
label: t('label.owner'),
label: t('label.owner-plural'),
key: EntityFields.OWNERS,
},
{
@ -53,7 +53,7 @@ export const DATA_ASSET_DROPDOWN_ITEMS = [
key: EntityFields.DOMAIN,
},
{
label: t('label.owner'),
label: t('label.owner-plural'),
key: EntityFields.OWNERS,
},
{
@ -174,7 +174,7 @@ export const GLOSSARY_DROPDOWN_ITEMS = [
key: EntityFields.DOMAIN,
},
{
label: t('label.owner'),
label: t('label.owner-plural'),
key: EntityFields.OWNERS,
},
{
@ -208,7 +208,7 @@ export const DATA_PRODUCT_DROPDOWN_ITEMS = [
key: EntityFields.DOMAIN,
},
{
label: t('label.owner'),
label: t('label.owner-plural'),
key: EntityFields.OWNERS,
},
];
@ -221,7 +221,7 @@ export const DOMAIN_DATAPRODUCT_DROPDOWN_ITEMS = [
key: EntityFields.ENTITY_TYPE,
},
{
label: t('label.owner'),
label: t('label.owner-plural'),
key: EntityFields.OWNERS,
},
{
@ -254,7 +254,7 @@ export const GLOSSARY_ASSETS_DROPDOWN_ITEMS = [
key: EntityFields.DOMAIN,
},
{
label: t('label.owner'),
label: t('label.owner-plural'),
key: EntityFields.OWNERS,
},
{

View File

@ -822,6 +822,7 @@
"owner": "Besitzer",
"owner-kpi": "Owner KPI",
"owner-lowercase": "besitzer",
"owner-lowercase-plural": "owners",
"owner-plural": "Besitzer",
"page-not-found": "Seite nicht gefunden",
"page-views-by-data-asset-plural": "Seitenaufrufe nach Datenanlage",

View File

@ -822,6 +822,7 @@
"owner": "Owner",
"owner-kpi": "Owner KPI",
"owner-lowercase": "owner",
"owner-lowercase-plural": "owners",
"owner-plural": "Owners",
"page-not-found": "Page Not Found",
"page-views-by-data-asset-plural": "Page Views by Data Assets",

View File

@ -822,6 +822,7 @@
"owner": "Propietario",
"owner-kpi": "Owner KPI",
"owner-lowercase": "propietario",
"owner-lowercase-plural": "owners",
"owner-plural": "Propietarios",
"page-not-found": "Página no encontrada",
"page-views-by-data-asset-plural": "Vistas de página por activos de datos",

View File

@ -822,6 +822,7 @@
"owner": "Propriétaire",
"owner-kpi": "Owner KPI",
"owner-lowercase": "propriétaire",
"owner-lowercase-plural": "owners",
"owner-plural": "Propriétaires",
"page-not-found": "Page Non Trouvée",
"page-views-by-data-asset-plural": "Vues de Page par Actif de Données",

View File

@ -822,6 +822,7 @@
"owner": "אחראי נתונים",
"owner-kpi": "Owner KPI",
"owner-lowercase": "אחראי נתונים",
"owner-lowercase-plural": "owners",
"owner-plural": "אחראי נתונים",
"page-not-found": "הדף לא נמצא",
"page-views-by-data-asset-plural": "צפיות בדפים לפי נכסי נתונים",

View File

@ -822,6 +822,7 @@
"owner": "所有者",
"owner-kpi": "Owner KPI",
"owner-lowercase": "所有者",
"owner-lowercase-plural": "owners",
"owner-plural": "所有者",
"page-not-found": "ページが存在しません",
"page-views-by-data-asset-plural": "データアセットごとのページビュー",

View File

@ -822,6 +822,7 @@
"owner": "Eigenaar",
"owner-kpi": "Owner KPI",
"owner-lowercase": "eigenaar",
"owner-lowercase-plural": "owners",
"owner-plural": "Eigenaren",
"page-not-found": "Pagina niet gevonden",
"page-views-by-data-asset-plural": "Paginaweergaven per data-asset",

View File

@ -822,6 +822,7 @@
"owner": "مالک",
"owner-kpi": "KPI مالک",
"owner-lowercase": "مالک",
"owner-lowercase-plural": "owners",
"owner-plural": "مالکان",
"page-not-found": "صفحه یافت نشد",
"page-views-by-data-asset-plural": "بازدیدهای صفحه توسط دارایی‌های داده",

View File

@ -822,6 +822,7 @@
"owner": "Proprietário",
"owner-kpi": "Owner KPI",
"owner-lowercase": "proprietário",
"owner-lowercase-plural": "owners",
"owner-plural": "Proprietários",
"page-not-found": "Página Não Encontrada",
"page-views-by-data-asset-plural": "Visualizações de Página por Ativos de Dados",

View File

@ -822,6 +822,7 @@
"owner": "Владелец",
"owner-kpi": "Owner KPI",
"owner-lowercase": "владелец",
"owner-lowercase-plural": "owners",
"owner-plural": "Владельцы",
"page-not-found": "Страница не найдена",
"page-views-by-data-asset-plural": "Просмотры объектов данных",

View File

@ -822,6 +822,7 @@
"owner": "所有者",
"owner-kpi": "Owner KPI",
"owner-lowercase": "所有者",
"owner-lowercase-plural": "owners",
"owner-plural": "所有者",
"page-not-found": "没有找到页面",
"page-views-by-data-asset-plural": "数据资产页面浏览量",

View File

@ -214,7 +214,7 @@ const MetricListPage = () => {
),
},
{
title: t('label.owner'),
title: t('label.owner-plural'),
dataIndex: 'owners',
key: 'owners',
width: 200,

View File

@ -668,7 +668,7 @@ const ServiceDetailsPage: FunctionComponent = () => {
showErrorToast(
error as AxiosError,
t('server.entity-updating-error', {
entity: t('label.owner-lowercase'),
entity: t('label.owner-lowercase-plural'),
})
);
}

View File

@ -471,7 +471,7 @@ class AdvancedSearchClassBase {
},
[EntityFields.OWNERS]: {
label: t('label.owner'),
label: t('label.owner-plural'),
type: 'select',
mainWidgetProps: this.mainWidgetProps,

View File

@ -61,7 +61,9 @@ describe('AlertsUtil tests', () => {
});
it('getFunctionDisplayName should return correct text for matchAnyOwnerName', () => {
expect(getFunctionDisplayName('matchAnyOwnerName')).toBe('label.owner');
expect(getFunctionDisplayName('matchAnyOwnerName')).toBe(
'label.owner-plural'
);
});
it('getFunctionDisplayName should return correct text for matchAnyEventType', () => {

View File

@ -83,7 +83,7 @@ export const getFunctionDisplayName = (func: string): string => {
case 'matchAnyEntityFqn':
return i18next.t('label.fqn-uppercase');
case 'matchAnyOwnerName':
return i18next.t('label.owner');
return i18next.t('label.owner-plural');
case 'matchAnyEventType':
return i18next.t('label.event-type');
case 'matchTestResult':
@ -477,7 +477,7 @@ export const getMessageFromArgumentName = (argumentName: string) => {
return t('message.field-text-is-required', {
fieldText: t('label.entity-list', {
entity: t('label.entity-name', {
entity: t('label.owner'),
entity: t('label.owner-plural'),
}),
}),
});
@ -614,7 +614,7 @@ export const getFieldByArgumentType = (
data-testid="owner-name-select"
mode="multiple"
placeholder={t('label.search-by-type', {
type: t('label.owner-lowercase'),
type: t('label.owner-lowercase-plural'),
})}
/>
);

View File

@ -92,7 +92,7 @@ describe('Database Util', () => {
render: expect.any(Function),
},
{
title: 'label.owner',
title: 'label.owner-plural',
dataIndex: 'owners',
key: 'owners',
width: 120,

View File

@ -91,7 +91,7 @@ export const schemaTableColumns: ColumnsType<DatabaseSchema> = [
),
},
{
title: t('label.owner'),
title: t('label.owner-plural'),
dataIndex: 'owners',
key: 'owners',
width: 120,

View File

@ -118,7 +118,7 @@ describe('EntityUtils unit tests', () => {
getEntityOverview(ExplorePageTabs.CHARTS, MOCK_CHART_DATA)
);
expect(result).toContain('label.owner');
expect(result).toContain('label.owner-plural');
expect(result).toContain('label.chart');
expect(result).toContain('label.url-uppercase');
expect(result).toContain('Are you an ethnic minority in your city?');
@ -140,7 +140,7 @@ describe('EntityUtils unit tests', () => {
})
);
expect(result).toContain('label.owner');
expect(result).toContain('label.owner-plural');
expect(result).toContain('label.type');
expect(result).toContain('label.service');
expect(result).toContain('label.database');

View File

@ -265,7 +265,7 @@ const getTableOverview = (
const overview = [
{
name: i18next.t('label.owner'),
name: i18next.t('label.owner-plural'),
value: <OwnerLabel hasPermission={false} owners={owners} />,
visible: [DRAWER_NAVIGATION_OPTIONS.lineage],
},
@ -376,7 +376,7 @@ const getPipelineOverview = (pipelineDetails: Pipeline) => {
const overview = [
{
name: i18next.t('label.owner'),
name: i18next.t('label.owner-plural'),
value: <OwnerLabel hasPermission={false} owners={owners} />,
visible: [DRAWER_NAVIGATION_OPTIONS.lineage],
},
@ -424,7 +424,7 @@ const getDashboardOverview = (dashboardDetails: Dashboard) => {
const overview = [
{
name: i18next.t('label.owner'),
name: i18next.t('label.owner-plural'),
value: <OwnerLabel hasPermission={false} owners={owners} />,
visible: [DRAWER_NAVIGATION_OPTIONS.lineage],
},
@ -481,7 +481,7 @@ export const getSearchIndexOverview = (
const overview = [
{
name: i18next.t('label.owner'),
name: i18next.t('label.owner-plural'),
value: <OwnerLabel hasPermission={false} owners={owners} />,
visible: [DRAWER_NAVIGATION_OPTIONS.lineage],
},
@ -513,7 +513,7 @@ const getMlModelOverview = (mlModelDetails: Mlmodel) => {
const overview = [
{
name: i18next.t('label.owner'),
name: i18next.t('label.owner-plural'),
value: <OwnerLabel hasPermission={false} owners={owners} />,
visible: [DRAWER_NAVIGATION_OPTIONS.lineage],
},
@ -609,7 +609,7 @@ const getChartOverview = (chartDetails: Chart) => {
const overview = [
{
name: i18next.t('label.owner'),
name: i18next.t('label.owner-plural'),
value: <OwnerLabel hasPermission={false} owners={owners} />,
visible: [DRAWER_NAVIGATION_OPTIONS.lineage],
},
@ -674,7 +674,7 @@ const getDataModelOverview = (dataModelDetails: DashboardDataModel) => {
const overview = [
{
name: i18next.t('label.owner'),
name: i18next.t('label.owner-plural'),
value: <OwnerLabel hasPermission={false} owners={owners} />,
visible: [DRAWER_NAVIGATION_OPTIONS.lineage],
},
@ -748,7 +748,7 @@ const getStoredProcedureOverview = (
const overview = [
{
name: i18next.t('label.owner'),
name: i18next.t('label.owner-plural'),
value: <OwnerLabel hasPermission={false} owners={owners} />,
visible: [DRAWER_NAVIGATION_OPTIONS.lineage],
},
@ -826,7 +826,7 @@ const getDatabaseOverview = (databaseDetails: Database) => {
const overview = [
{
name: i18next.t('label.owner'),
name: i18next.t('label.owner-plural'),
value: <OwnerLabel hasPermission={false} owners={owners} />,
visible: [DRAWER_NAVIGATION_OPTIONS.explore],
},
@ -866,7 +866,7 @@ const getDatabaseSchemaOverview = (databaseSchemaDetails: DatabaseSchema) => {
const overview = [
{
name: i18next.t('label.owner'),
name: i18next.t('label.owner-plural'),
value: <OwnerLabel hasPermission={false} owners={owners} />,
visible: [DRAWER_NAVIGATION_OPTIONS.explore],
},
@ -915,7 +915,7 @@ const getEntityServiceOverview = (serviceDetails: EntityServiceUnion) => {
const overview = [
{
name: i18next.t('label.owner'),
name: i18next.t('label.owner-plural'),
value: <OwnerLabel hasPermission={false} owners={owners} />,
visible: [DRAWER_NAVIGATION_OPTIONS.explore],
},

View File

@ -617,7 +617,7 @@ export const getFeedChangeFieldLabel = (fieldName?: EntityField) => {
[EntityField.TASKS]: i18next.t('label.task-plural'),
[EntityField.ML_FEATURES]: i18next.t('label.ml-feature-plural'),
[EntityField.SCHEMA_TEXT]: i18next.t('label.schema-text'),
[EntityField.OWNER]: i18next.t('label.owner'),
[EntityField.OWNER]: i18next.t('label.owner-plural'),
[EntityField.REVIEWERS]: i18next.t('label.reviewer-plural'),
[EntityField.SYNONYMS]: i18next.t('label.synonym-plural'),
[EntityField.RELATEDTERMS]: i18next.t('label.related-term-plural'),

View File

@ -89,7 +89,7 @@ export const getServiceMainTabColumns = (
]
: []),
{
title: t('label.owner'),
title: t('label.owner-plural'),
dataIndex: 'owners',
key: 'owners',
render: (owners: ServicePageData['owners']) =>