mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-11-01 02:56:10 +00:00
Minor: Automator feedback part 2 (#16115)
* Change ingestion pipeline unpause button to play Fixe the cron editor alignment Fix the alignment of beta tag on left menu bar * chore: Update language files with new translations and add "Play" translation * Move IngestionRunDetails modal to a common component for reuse * Add missing localization * localization changes for all languages
This commit is contained in:
parent
795879d776
commit
ac3f843d6d
@ -425,7 +425,7 @@ const TestSuitePipelineTab = ({ testSuite }: Props) => {
|
||||
<Tooltip
|
||||
title={
|
||||
editPermission
|
||||
? t('label.unpause')
|
||||
? t('label.play')
|
||||
: t('message.no-permission-for-action')
|
||||
}>
|
||||
<Button
|
||||
@ -437,7 +437,7 @@ const TestSuitePipelineTab = ({ testSuite }: Props) => {
|
||||
onClick={() =>
|
||||
handleEnableDisableIngestion(record.id || '')
|
||||
}>
|
||||
{t('label.unpause')}
|
||||
{t('label.play')}
|
||||
</Button>
|
||||
</Tooltip>
|
||||
)}
|
||||
|
||||
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright 2024 Collate.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { PipelineStatus } from '../../../generated/entity/services/ingestionPipelines/ingestionPipeline';
|
||||
|
||||
export interface IngestionRunDetailsModalProps {
|
||||
pipelineStatus?: PipelineStatus;
|
||||
handleCancel: () => void;
|
||||
}
|
||||
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright 2024 Collate.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import React from 'react';
|
||||
import { mockPipelineStatus } from '../../Settings/Services/Ingestion/Ingestion.mock';
|
||||
import IngestionRunDetailsModal from './IngestionRunDetailsModal';
|
||||
|
||||
const mockHandleCancel = jest.fn();
|
||||
|
||||
describe('IngestionRunDetailsModal', () => {
|
||||
it('should show no data placeholder when no step summary is not present', () => {
|
||||
render(<IngestionRunDetailsModal handleCancel={mockHandleCancel} />);
|
||||
|
||||
expect(screen.getByText('No data')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('should show proper data in the table when step summary is present', () => {
|
||||
render(
|
||||
<IngestionRunDetailsModal
|
||||
handleCancel={mockHandleCancel}
|
||||
pipelineStatus={mockPipelineStatus}
|
||||
/>
|
||||
);
|
||||
|
||||
expect(
|
||||
screen.getByTestId(
|
||||
`step-summary-name-${mockPipelineStatus.status[0].name}`
|
||||
)
|
||||
).toBeInTheDocument();
|
||||
expect(
|
||||
screen.getByTestId(
|
||||
`step-summary-name-${mockPipelineStatus.status[1].name}`
|
||||
)
|
||||
).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,143 @@
|
||||
/*
|
||||
* Copyright 2024 Collate.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { Button, Modal, Typography } from 'antd';
|
||||
import { ColumnType } from 'antd/lib/table';
|
||||
import { ExpandableConfig } from 'antd/lib/table/interface';
|
||||
import { startCase } from 'lodash';
|
||||
import React, { useMemo, useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { NO_DATA } from '../../../constants/constants';
|
||||
import { StepSummary } from '../../../generated/entity/services/ingestionPipelines/ingestionPipeline';
|
||||
import { formatDateTime } from '../../../utils/date-time/DateTimeUtils';
|
||||
import { getEntityName } from '../../../utils/EntityUtils';
|
||||
import Table from '../../common/Table/Table';
|
||||
import ConnectionStepCard from '../../common/TestConnection/ConnectionStepCard/ConnectionStepCard';
|
||||
import { IngestionRunDetailsModalProps } from './IngestionRunDetailsModal.interface';
|
||||
|
||||
function IngestionRunDetailsModal({
|
||||
pipelineStatus,
|
||||
handleCancel,
|
||||
}: Readonly<IngestionRunDetailsModalProps>) {
|
||||
const { t } = useTranslation();
|
||||
const [expandedKeys, setExpandedKeys] = useState<string[]>([]);
|
||||
|
||||
const columns: ColumnType<StepSummary>[] = useMemo(
|
||||
() => [
|
||||
{
|
||||
title: t('label.step'),
|
||||
dataIndex: 'name',
|
||||
render: (_, record: StepSummary) => (
|
||||
<Typography.Text data-testid={`step-summary-name-${record.name}`}>
|
||||
{getEntityName(record)}
|
||||
</Typography.Text>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: t('label.record-plural'),
|
||||
dataIndex: 'records',
|
||||
},
|
||||
{
|
||||
title: t('label.filtered'),
|
||||
dataIndex: 'filtered',
|
||||
},
|
||||
{
|
||||
title: t('label.warning-plural'),
|
||||
dataIndex: 'warnings',
|
||||
},
|
||||
{
|
||||
title: t('label.error-plural'),
|
||||
dataIndex: 'errors',
|
||||
},
|
||||
|
||||
{
|
||||
title: t('label.failure-plural'),
|
||||
dataIndex: 'failures',
|
||||
render: (failures: StepSummary['failures'], record: StepSummary) =>
|
||||
(failures?.length ?? 0) > 0 ? (
|
||||
<Button
|
||||
data-testid={`log-${record.name}`}
|
||||
size="small"
|
||||
type="link"
|
||||
onClick={() => setExpandedKeys([record.name])}>
|
||||
{t('label.log-plural')}
|
||||
</Button>
|
||||
) : (
|
||||
NO_DATA
|
||||
),
|
||||
},
|
||||
],
|
||||
[setExpandedKeys]
|
||||
);
|
||||
|
||||
const expandable: ExpandableConfig<StepSummary> = useMemo(
|
||||
() => ({
|
||||
expandedRowRender: (record) => {
|
||||
return (
|
||||
record.failures?.map((failure) => (
|
||||
<ConnectionStepCard
|
||||
isTestingConnection={false}
|
||||
key={failure.name}
|
||||
testConnectionStep={{
|
||||
name: failure.name,
|
||||
mandatory: false,
|
||||
description: failure.error,
|
||||
}}
|
||||
testConnectionStepResult={{
|
||||
name: failure.name,
|
||||
passed: false,
|
||||
mandatory: false,
|
||||
message: failure.error,
|
||||
errorLog: failure.stackTrace,
|
||||
}}
|
||||
/>
|
||||
)) ?? []
|
||||
);
|
||||
},
|
||||
indentSize: 0,
|
||||
expandIcon: () => null,
|
||||
expandedRowKeys: expandedKeys,
|
||||
rowExpandable: (record) => (record.failures?.length ?? 0) > 0,
|
||||
}),
|
||||
[expandedKeys]
|
||||
);
|
||||
|
||||
return (
|
||||
<Modal
|
||||
centered
|
||||
destroyOnClose
|
||||
open
|
||||
closable={false}
|
||||
maskClosable={false}
|
||||
okButtonProps={{ style: { display: 'none' } }}
|
||||
title={t('label.run-status-at-timestamp', {
|
||||
status: startCase(pipelineStatus?.pipelineState),
|
||||
timestamp: formatDateTime(pipelineStatus?.timestamp),
|
||||
})}
|
||||
width="80%"
|
||||
onCancel={handleCancel}>
|
||||
<Table
|
||||
bordered
|
||||
columns={columns}
|
||||
dataSource={pipelineStatus?.status ?? []}
|
||||
expandable={expandable}
|
||||
indentSize={0}
|
||||
pagination={false}
|
||||
rowKey="name"
|
||||
size="small"
|
||||
/>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
|
||||
export default IngestionRunDetailsModal;
|
||||
@ -74,6 +74,14 @@
|
||||
.left-panel-label {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.service-beta-tag {
|
||||
position: static;
|
||||
sup {
|
||||
margin-left: 8px;
|
||||
position: static;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -11,26 +11,20 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { Button, Popover, Skeleton, Space, Tag } from 'antd';
|
||||
import Modal from 'antd/lib/modal/Modal';
|
||||
import { ColumnType } from 'antd/lib/table';
|
||||
import { ExpandableConfig } from 'antd/lib/table/interface';
|
||||
import { Popover, Skeleton, Space, Tag } from 'antd';
|
||||
import classNamesFunc from 'classnames';
|
||||
import { isEmpty, startCase } from 'lodash';
|
||||
import { isEmpty, isUndefined, startCase } from 'lodash';
|
||||
import React, {
|
||||
FunctionComponent,
|
||||
useCallback,
|
||||
useEffect,
|
||||
useMemo,
|
||||
useState,
|
||||
} from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { NO_DATA } from '../../../../../constants/constants';
|
||||
import { PIPELINE_INGESTION_RUN_STATUS } from '../../../../../constants/pipeline.constants';
|
||||
import {
|
||||
IngestionPipeline,
|
||||
PipelineStatus,
|
||||
StepSummary,
|
||||
} from '../../../../../generated/entity/services/ingestionPipelines/ingestionPipeline';
|
||||
import { getRunHistoryForPipeline } from '../../../../../rest/ingestionPipelineAPI';
|
||||
import {
|
||||
@ -38,8 +32,7 @@ import {
|
||||
getCurrentMillis,
|
||||
getEpochMillisForPastDays,
|
||||
} from '../../../../../utils/date-time/DateTimeUtils';
|
||||
import Table from '../../../../common/Table/Table';
|
||||
import ConnectionStepCard from '../../../../common/TestConnection/ConnectionStepCard/ConnectionStepCard';
|
||||
import IngestionRunDetailsModal from '../../../../Modals/IngestionRunDetailsModal/IngestionRunDetailsModal';
|
||||
import './ingestion-recent-run.style.less';
|
||||
|
||||
interface Props {
|
||||
@ -63,79 +56,6 @@ export const IngestionRecentRuns: FunctionComponent<Props> = ({
|
||||
const [recentRunStatus, setRecentRunStatus] = useState<PipelineStatus[]>([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [selectedStatus, setSelectedStatus] = useState<PipelineStatus>();
|
||||
const [expandedKeys, setExpandedKeys] = useState<string[]>([]);
|
||||
const columns: ColumnType<StepSummary>[] = useMemo(
|
||||
() => [
|
||||
{
|
||||
title: t('label.step'),
|
||||
dataIndex: 'name',
|
||||
},
|
||||
{
|
||||
title: t('label.record-plural'),
|
||||
dataIndex: 'records',
|
||||
},
|
||||
{
|
||||
title: t('label.filtered'),
|
||||
dataIndex: 'filtered',
|
||||
},
|
||||
{
|
||||
title: t('label.warning-plural'),
|
||||
dataIndex: 'warnings',
|
||||
},
|
||||
{
|
||||
title: t('label.error-plural'),
|
||||
dataIndex: 'errors',
|
||||
},
|
||||
|
||||
{
|
||||
title: t('label.failure-plural'),
|
||||
dataIndex: 'failures',
|
||||
render: (failures: StepSummary['failures'], record: StepSummary) =>
|
||||
(failures?.length ?? 0) > 0 ? (
|
||||
<Button
|
||||
size="small"
|
||||
type="link"
|
||||
onClick={() => setExpandedKeys([record.name])}>
|
||||
{t('label.log-plural')}
|
||||
</Button>
|
||||
) : (
|
||||
NO_DATA
|
||||
),
|
||||
},
|
||||
],
|
||||
[setExpandedKeys]
|
||||
);
|
||||
const expandable: ExpandableConfig<StepSummary> = useMemo(
|
||||
() => ({
|
||||
expandedRowRender: (record) => {
|
||||
return (
|
||||
record.failures?.map((failure) => (
|
||||
<ConnectionStepCard
|
||||
isTestingConnection={false}
|
||||
key={failure.name}
|
||||
testConnectionStep={{
|
||||
name: failure.name,
|
||||
mandatory: false,
|
||||
description: failure.error,
|
||||
}}
|
||||
testConnectionStepResult={{
|
||||
name: failure.name,
|
||||
passed: false,
|
||||
mandatory: false,
|
||||
message: failure.error,
|
||||
errorLog: failure.stackTrace,
|
||||
}}
|
||||
/>
|
||||
)) ?? []
|
||||
);
|
||||
},
|
||||
indentSize: 0,
|
||||
expandIcon: () => null,
|
||||
expandedRowKeys: expandedKeys,
|
||||
rowExpandable: (record) => (record.failures?.length ?? 0) > 0,
|
||||
}),
|
||||
[expandedKeys]
|
||||
);
|
||||
|
||||
const fetchPipelineStatus = useCallback(async () => {
|
||||
setLoading(true);
|
||||
@ -167,10 +87,11 @@ export const IngestionRecentRuns: FunctionComponent<Props> = ({
|
||||
}, [ingestion, ingestion?.fullyQualifiedName]);
|
||||
|
||||
const handleRunStatusClick = (status: PipelineStatus) => {
|
||||
setExpandedKeys([]);
|
||||
setSelectedStatus(status);
|
||||
};
|
||||
|
||||
const handleModalCancel = () => setSelectedStatus(undefined);
|
||||
|
||||
if (loading) {
|
||||
return <Skeleton.Input size="small" />;
|
||||
}
|
||||
@ -232,29 +153,12 @@ export const IngestionRecentRuns: FunctionComponent<Props> = ({
|
||||
})
|
||||
)}
|
||||
|
||||
<Modal
|
||||
centered
|
||||
destroyOnClose
|
||||
closeIcon={<></>}
|
||||
maskClosable={false}
|
||||
okButtonProps={{ style: { display: 'none' } }}
|
||||
open={Boolean(selectedStatus)}
|
||||
title={`Run status: ${startCase(
|
||||
selectedStatus?.pipelineState
|
||||
)} at ${formatDateTime(selectedStatus?.timestamp)}`}
|
||||
width="80%"
|
||||
onCancel={() => setSelectedStatus(undefined)}>
|
||||
<Table
|
||||
bordered
|
||||
columns={columns}
|
||||
dataSource={selectedStatus?.status ?? []}
|
||||
expandable={expandable}
|
||||
indentSize={0}
|
||||
pagination={false}
|
||||
rowKey="name"
|
||||
size="small"
|
||||
{!isUndefined(selectedStatus) && (
|
||||
<IngestionRunDetailsModal
|
||||
handleCancel={handleModalCancel}
|
||||
pipelineStatus={selectedStatus}
|
||||
/>
|
||||
</Modal>
|
||||
)}
|
||||
</Space>
|
||||
);
|
||||
};
|
||||
|
||||
@ -203,7 +203,7 @@ function PipelineActions({
|
||||
disabled={getIngestionPermission(record.name)}
|
||||
type="link"
|
||||
onClick={() => onPauseUnpauseClick(recordId)}>
|
||||
{getLoadingStatus(currPauseId, record.id, t('label.unpause'))}
|
||||
{getLoadingStatus(currPauseId, record.id, t('label.play'))}
|
||||
</Button>
|
||||
)}
|
||||
<Divider className="border-gray" type="vertical" />
|
||||
|
||||
@ -507,14 +507,16 @@ const CronEditor: FC<CronEditorProp> = (props) => {
|
||||
break;
|
||||
}
|
||||
|
||||
return <div data-testid="schedule-description">{retString}</div>;
|
||||
return retString ? (
|
||||
<div data-testid="schedule-description">{retString}</div>
|
||||
) : null;
|
||||
}, [state, cronPeriodString, startText, value]);
|
||||
|
||||
return (
|
||||
<Row
|
||||
className={classNames(className, 'cron-row')}
|
||||
data-testid="cron-container"
|
||||
gutter={[16, 0]}>
|
||||
gutter={[16, 16]}>
|
||||
<Col data-testid="time-dropdown-container" span={12}>
|
||||
<Form.Item
|
||||
initialValue={selectedPeriod}
|
||||
@ -579,7 +581,7 @@ const CronEditor: FC<CronEditorProp> = (props) => {
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
<Col span={24}>{displayCronString}</Col>
|
||||
{displayCronString && <Col span={24}>{displayCronString}</Col>}
|
||||
|
||||
{isEmpty(value) && (
|
||||
<Col span={24}>
|
||||
|
||||
@ -65,3 +65,8 @@
|
||||
font-size: 12px;
|
||||
padding: 8px 5px;
|
||||
}
|
||||
.cron-row {
|
||||
.ant-form-item {
|
||||
margin: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
@ -819,6 +819,7 @@
|
||||
"pipeline-plural": "Pipelines",
|
||||
"pipeline-state": "Pipeline-Status",
|
||||
"platform": "Platform",
|
||||
"play": "Play",
|
||||
"please-enter-value": "Bitte einen Wert für {{name}} eingeben",
|
||||
"please-password-type-first": "Bitte zuerst das Passwort eingeben",
|
||||
"please-select": "Bitte auswählen",
|
||||
@ -1692,6 +1693,7 @@
|
||||
"result-limit-message": "Konfiguration zur Festlegung des Limits für Abfrageprotokolle.",
|
||||
"retention-period-description": "Retention period refers to the duration for which data is retained before it is considered eligible for deletion or archival. Example: 30 days, 6 months, 1 year or any ISO 8601 format in UTC like P23DT23H will be valid.",
|
||||
"run-sample-data-to-ingest-sample-data": "Führen Sie Musterdaten aus, um Musterdatenvermögenswerte in Ihr OpenMetadata einzufügen.",
|
||||
"run-status-at-timestamp": "Run status: {{status}} at {{timestamp}}",
|
||||
"schedule-for-ingestion-description": "Die Planung kann im stündlichen, täglichen oder wöchentlichen Rhythmus eingerichtet werden. Die Zeitzone ist UTC.",
|
||||
"scheduled-run-every": "Geplant, alle auszuführen",
|
||||
"scopes-comma-separated": "Fügen Sie den Wert der Bereiche hinzu, getrennt durch Kommata",
|
||||
|
||||
@ -819,6 +819,7 @@
|
||||
"pipeline-plural": "Pipelines",
|
||||
"pipeline-state": "Pipeline State",
|
||||
"platform": "Platform",
|
||||
"play": "Play",
|
||||
"please-enter-value": "Please enter {{name}} value",
|
||||
"please-password-type-first": "Please type password first",
|
||||
"please-select": "Please Select",
|
||||
@ -1692,6 +1693,7 @@
|
||||
"result-limit-message": "Configuration to set the limit for query logs.",
|
||||
"retention-period-description": "Retention period refers to the duration for which data is retained before it is considered eligible for deletion or archival. Example: 30 days, 6 months, 1 year or any ISO 8601 format in UTC like P23DT23H will be valid.",
|
||||
"run-sample-data-to-ingest-sample-data": "'Run sample data to ingest sample data assets into your OpenMetadata.'",
|
||||
"run-status-at-timestamp": "Run status: {{status}} at {{timestamp}}",
|
||||
"schedule-for-ingestion-description": "Scheduling can be set up at an hourly, daily, or weekly cadence. The timezone is in UTC.",
|
||||
"scheduled-run-every": "Scheduled to run every",
|
||||
"scopes-comma-separated": "Add the Scopes value, separated by commas",
|
||||
|
||||
@ -819,6 +819,7 @@
|
||||
"pipeline-plural": "Pipelines",
|
||||
"pipeline-state": "Estado de la pipeline",
|
||||
"platform": "Platform",
|
||||
"play": "Play",
|
||||
"please-enter-value": "Ingrese el valor de {{name}}",
|
||||
"please-password-type-first": "Ingrese primero la contraseña",
|
||||
"please-select": "Por favor seleccione",
|
||||
@ -1692,6 +1693,7 @@
|
||||
"result-limit-message": "Configuración para establecer el límite de los registros de consulta.",
|
||||
"retention-period-description": "Retention period se refiere a la duración durante la cual los datos se retienen antes de que sean elegibles para su eliminación o archivo.",
|
||||
"run-sample-data-to-ingest-sample-data": "'Ejecutar datos de muestra para ingresar activos de datos de muestra en tu OpenMetadata.'",
|
||||
"run-status-at-timestamp": "Run status: {{status}} at {{timestamp}}",
|
||||
"schedule-for-ingestion-description": "La programación se puede configurar en una cadencia horaria, diaria o semanal.",
|
||||
"scheduled-run-every": "Programado para ejecutarse cada",
|
||||
"scopes-comma-separated": "Agrega el valor de ámbitos, separados por comas",
|
||||
|
||||
@ -819,6 +819,7 @@
|
||||
"pipeline-plural": "Pipelines",
|
||||
"pipeline-state": "État du Pipeline",
|
||||
"platform": "Platform",
|
||||
"play": "Play",
|
||||
"please-enter-value": "Merci d'entrer une valeur pour {{name}} ",
|
||||
"please-password-type-first": "Merci d'entrer le mot de passe d'abord",
|
||||
"please-select": "Merci de sélectionner",
|
||||
@ -1692,6 +1693,7 @@
|
||||
"result-limit-message": "Configuration pour définir la limite des journaux de requête.",
|
||||
"retention-period-description": "Retention period refers to the duration for which data is retained before it is considered eligible for deletion or archival. Example: 30 days, 6 months, 1 year or any ISO 8601 format in UTC like P23DT23H will be valid.",
|
||||
"run-sample-data-to-ingest-sample-data": "Exécuter l'ingestion de données d'exemple dans OpenMetadata",
|
||||
"run-status-at-timestamp": "Run status: {{status}} at {{timestamp}}",
|
||||
"schedule-for-ingestion-description": "La programmation peut être configurée à une cadence horaire, quotidienne ou hebdomadaire. Le fuseau horaire est en UTC.",
|
||||
"scheduled-run-every": "Programmer pour être exécuté tous les",
|
||||
"scopes-comma-separated": "Liste de scopes séparée par une virgule.",
|
||||
|
||||
@ -819,6 +819,7 @@
|
||||
"pipeline-plural": "תהליכי טעינה/עיבוד",
|
||||
"pipeline-state": "מצב תהליך הטעינה/עיבוד",
|
||||
"platform": "Platform",
|
||||
"play": "Play",
|
||||
"please-enter-value": "נא להזין את ערך {{name}}",
|
||||
"please-password-type-first": "נא להקליד סיסמה תחילה",
|
||||
"please-select": "בחר בבקשה",
|
||||
@ -1692,6 +1693,7 @@
|
||||
"result-limit-message": "הגדר את הגבלת התוצאה ללוגי שאילתות.",
|
||||
"retention-period-description": "Retention period refers to the duration for which data is retained before it is considered eligible for deletion or archival. Example: 30 days, 6 months, 1 year or any ISO 8601 format in UTC like P23DT23H will be valid.",
|
||||
"run-sample-data-to-ingest-sample-data": "'הרץ נתוני דוגמה כדי לשדרג נכסי נתונים דוגמה אל OpenMetadata שלך.'",
|
||||
"run-status-at-timestamp": "Run status: {{status}} at {{timestamp}}",
|
||||
"schedule-for-ingestion-description": "ניתן להגדיר שימוש כל שעה, יומית או שבועית. אזור הזמן הוא UTC.",
|
||||
"scheduled-run-every": "מתוזמן לרוץ כל",
|
||||
"scopes-comma-separated": "הוסף את ערכי הניקוד, מופרדים בפסיקים",
|
||||
|
||||
@ -819,6 +819,7 @@
|
||||
"pipeline-plural": "パイプライン",
|
||||
"pipeline-state": "パイプラインの状態",
|
||||
"platform": "Platform",
|
||||
"play": "Play",
|
||||
"please-enter-value": "{{name}}の値を入力してください",
|
||||
"please-password-type-first": "パスワードを入力してください",
|
||||
"please-select": "選択してください",
|
||||
@ -1692,6 +1693,7 @@
|
||||
"result-limit-message": "クエリログの上限を決めるための設定です。",
|
||||
"retention-period-description": "Retention period refers to the duration for which data is retained before it is considered eligible for deletion or archival. Example: 30 days, 6 months, 1 year or any ISO 8601 format in UTC like P23DT23H will be valid.",
|
||||
"run-sample-data-to-ingest-sample-data": "'サンプルデータを実行してサンプルデータのアセットをOpenMetadataに取り込みます。'",
|
||||
"run-status-at-timestamp": "Run status: {{status}} at {{timestamp}}",
|
||||
"schedule-for-ingestion-description": "Scheduling can be set up at an hourly, daily, or weekly cadence. The timezone is in UTC.",
|
||||
"scheduled-run-every": "Scheduled to run every",
|
||||
"scopes-comma-separated": "スコープの値をカンマで区切って追加",
|
||||
|
||||
@ -819,6 +819,7 @@
|
||||
"pipeline-plural": "Pipelines",
|
||||
"pipeline-state": "Pipelinestatus",
|
||||
"platform": "Platform",
|
||||
"play": "Play",
|
||||
"please-enter-value": "Voer alstublieft de waarde voor {{name}} in",
|
||||
"please-password-type-first": "Typ eerst het wachtwoord alstublieft",
|
||||
"please-select": "Selecteer alstublieft",
|
||||
@ -1692,6 +1693,7 @@
|
||||
"result-limit-message": "Configuratie om de limiet voor querylogs in te stellen.",
|
||||
"retention-period-description": "De bewaartermijn verwijst naar de duur van het bewaren van data voordat data in aanmerking komt voor verwijdering of archivering. Voorbeelden van geldige periodes: 30 dagen, 6 maanden, 1 jaar, of een ISO 8601-indeling in UTC zoals P23DT23H.",
|
||||
"run-sample-data-to-ingest-sample-data": "'Voer voorbeelddata uit om voorbeeld-data-assets te ingesten in je OpenMetadata.'",
|
||||
"run-status-at-timestamp": "Run status: {{status}} at {{timestamp}}",
|
||||
"schedule-for-ingestion-description": "Planning kan worden ingesteld op een uurlijkse, dagelijkse of wekelijkse cadans. De tijdzone is in UTC.",
|
||||
"scheduled-run-every": "Gepland om elke keer uit te voeren",
|
||||
"scopes-comma-separated": "Voeg de herkomstwaarde toe, gescheiden door komma's",
|
||||
|
||||
@ -819,6 +819,7 @@
|
||||
"pipeline-plural": "Pipelines",
|
||||
"pipeline-state": "Estado do Pipeline",
|
||||
"platform": "Platform",
|
||||
"play": "Play",
|
||||
"please-enter-value": "Por favor, insira o valor de {{name}}",
|
||||
"please-password-type-first": "Por favor, digite a senha primeiro",
|
||||
"please-select": "Por favor, Selecione",
|
||||
@ -1692,6 +1693,7 @@
|
||||
"result-limit-message": "Configuração para definir o limite para registros de consulta.",
|
||||
"retention-period-description": "O período de retenção refere-se à duração durante a qual os dados são mantidos antes de serem considerados elegíveis para exclusão ou arquivamento. Exemplo: 30 dias, 6 meses, 1 ano ou qualquer formato ISO 8601 em UTC, como P23DT23H, será válido.",
|
||||
"run-sample-data-to-ingest-sample-data": "Executar dados de exemplo para ingerir ativos de dados de exemplo no OpenMetadata.",
|
||||
"run-status-at-timestamp": "Run status: {{status}} at {{timestamp}}",
|
||||
"schedule-for-ingestion-description": "O agendamento pode ser configurado em uma frequência horária, diária ou semanal. O fuso horário é em UTC.",
|
||||
"scheduled-run-every": "Agendado para rodar a cada",
|
||||
"scopes-comma-separated": "Adicione o valor dos Escopos, separados por vírgulas",
|
||||
|
||||
@ -819,6 +819,7 @@
|
||||
"pipeline-plural": "Пайплайны",
|
||||
"pipeline-state": "Состояние",
|
||||
"platform": "Platform",
|
||||
"play": "Play",
|
||||
"please-enter-value": "Пожалуйста введите значение {{name}} ",
|
||||
"please-password-type-first": "Пожалуйста, сначала введите пароль",
|
||||
"please-select": "Пожалуйста выберите",
|
||||
@ -1692,6 +1693,7 @@
|
||||
"result-limit-message": "Конфигурация для установки лимита журналов запросов.",
|
||||
"retention-period-description": "Retention period refers to the duration for which data is retained before it is considered eligible for deletion or archival. Example: 30 days, 6 months, 1 year or any ISO 8601 format in UTC like P23DT23H will be valid.",
|
||||
"run-sample-data-to-ingest-sample-data": "Запустите образцы данных, чтобы добавить образцы данных в свои OpenMetadata.",
|
||||
"run-status-at-timestamp": "Run status: {{status}} at {{timestamp}}",
|
||||
"schedule-for-ingestion-description": "Планирование может быть настроено на почасовой, ежедневной или еженедельной частоте. Часовой пояс указан в формате UTC.",
|
||||
"scheduled-run-every": "Запланирован запуск каждый",
|
||||
"scopes-comma-separated": "Добавьте значение областей, разделенное запятыми",
|
||||
|
||||
@ -819,6 +819,7 @@
|
||||
"pipeline-plural": "工作流",
|
||||
"pipeline-state": "工作流状态",
|
||||
"platform": "Platform",
|
||||
"play": "Play",
|
||||
"please-enter-value": "请输入{{name}}值",
|
||||
"please-password-type-first": "请先输入密码",
|
||||
"please-select": "请选择",
|
||||
@ -1692,6 +1693,7 @@
|
||||
"result-limit-message": "设置查询日志的限制",
|
||||
"retention-period-description": "Retention period refers to the duration for which data is retained before it is considered eligible for deletion or archival. Example: 30 days, 6 months, 1 year or any ISO 8601 format in UTC like P23DT23H will be valid.",
|
||||
"run-sample-data-to-ingest-sample-data": "'运行样本数据以提取样本数据资产到 OpenMetadata'",
|
||||
"run-status-at-timestamp": "Run status: {{status}} at {{timestamp}}",
|
||||
"schedule-for-ingestion-description": "可设置每小时、每天或每周的计划,时区为 UTC",
|
||||
"scheduled-run-every": "计划每次运行",
|
||||
"scopes-comma-separated": "范围值逗号分隔",
|
||||
|
||||
@ -12,6 +12,7 @@
|
||||
*/
|
||||
|
||||
import { t } from 'i18next';
|
||||
import { sortBy } from 'lodash';
|
||||
import {
|
||||
AsyncFetchListValues,
|
||||
AsyncFetchListValuesResult,
|
||||
@ -490,42 +491,29 @@ class AdvancedSearchClassBase {
|
||||
entitySearchIndex = [SearchIndex.TABLE]
|
||||
): Fields {
|
||||
let configs: Fields = {};
|
||||
const configIndexMapping: Partial<Record<SearchIndex, Fields>> = {
|
||||
[SearchIndex.TABLE]: this.tableQueryBuilderFields,
|
||||
[SearchIndex.PIPELINE]: this.pipelineQueryBuilderFields,
|
||||
[SearchIndex.DASHBOARD]: this.dashboardQueryBuilderFields,
|
||||
[SearchIndex.TOPIC]: this.topicQueryBuilderFields,
|
||||
[SearchIndex.MLMODEL]: this.mlModelQueryBuilderFields,
|
||||
[SearchIndex.CONTAINER]: this.containerQueryBuilderFields,
|
||||
[SearchIndex.SEARCH_INDEX]: this.searchIndexQueryBuilderFields,
|
||||
[SearchIndex.DASHBOARD_DATA_MODEL]: this.dataModelQueryBuilderFields,
|
||||
[SearchIndex.ALL]: {
|
||||
...this.tableQueryBuilderFields,
|
||||
...this.pipelineQueryBuilderFields,
|
||||
...this.dashboardQueryBuilderFields,
|
||||
...this.topicQueryBuilderFields,
|
||||
...this.mlModelQueryBuilderFields,
|
||||
...this.containerQueryBuilderFields,
|
||||
...this.searchIndexQueryBuilderFields,
|
||||
...this.dataModelQueryBuilderFields,
|
||||
},
|
||||
};
|
||||
|
||||
entitySearchIndex.forEach((index) => {
|
||||
switch (index) {
|
||||
case SearchIndex.TABLE:
|
||||
configs = { ...configs, ...this.tableQueryBuilderFields };
|
||||
|
||||
break;
|
||||
case SearchIndex.PIPELINE:
|
||||
configs = { ...configs, ...this.pipelineQueryBuilderFields };
|
||||
|
||||
break;
|
||||
case SearchIndex.DASHBOARD:
|
||||
configs = { ...configs, ...this.dashboardQueryBuilderFields };
|
||||
|
||||
break;
|
||||
case SearchIndex.TOPIC:
|
||||
configs = { ...configs, ...this.topicQueryBuilderFields };
|
||||
|
||||
break;
|
||||
case SearchIndex.MLMODEL:
|
||||
configs = { ...configs, ...this.mlModelQueryBuilderFields };
|
||||
|
||||
break;
|
||||
case SearchIndex.CONTAINER:
|
||||
configs = { ...configs, ...this.containerQueryBuilderFields };
|
||||
|
||||
break;
|
||||
case SearchIndex.SEARCH_INDEX:
|
||||
configs = { ...configs, ...this.searchIndexQueryBuilderFields };
|
||||
|
||||
break;
|
||||
case SearchIndex.DASHBOARD_DATA_MODEL:
|
||||
configs = { ...configs, ...this.dataModelQueryBuilderFields };
|
||||
|
||||
break;
|
||||
}
|
||||
configs = { ...configs, ...(configIndexMapping[index] ?? {}) };
|
||||
});
|
||||
|
||||
return configs;
|
||||
@ -558,11 +546,16 @@ class AdvancedSearchClassBase {
|
||||
},
|
||||
};
|
||||
|
||||
return {
|
||||
const fieldsConfig = {
|
||||
...this.getCommonConfig({ entitySearchIndex, tierOptions }),
|
||||
...(shouldAddServiceField ? serviceQueryBuilderFields : {}),
|
||||
...this.getEntitySpecificQueryBuilderFields(entitySearchIndex),
|
||||
};
|
||||
|
||||
// Sort the fields according to the label
|
||||
const sortedFieldsConfig = sortBy(Object.entries(fieldsConfig), '1.label');
|
||||
|
||||
return Object.fromEntries(sortedFieldsConfig);
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@ -12,11 +12,13 @@
|
||||
*/
|
||||
|
||||
import { Typography } from 'antd';
|
||||
import { ExpandableConfig } from 'antd/lib/table/interface';
|
||||
import { t } from 'i18next';
|
||||
import { isUndefined, startCase } from 'lodash';
|
||||
import { ServiceTypes } from 'Models';
|
||||
import React from 'react';
|
||||
import ErrorPlaceHolder from '../components/common/ErrorWithPlaceholder/ErrorPlaceHolder';
|
||||
import ConnectionStepCard from '../components/common/TestConnection/ConnectionStepCard/ConnectionStepCard';
|
||||
import { getServiceDetailsPath } from '../constants/constants';
|
||||
import {
|
||||
DATA_INSIGHTS_PIPELINE_DOCS,
|
||||
@ -37,7 +39,10 @@ import { ELASTIC_SEARCH_RE_INDEX_PAGE_TABS } from '../enums/ElasticSearch.enum';
|
||||
import { FormSubmitType } from '../enums/form.enum';
|
||||
import { PipelineType } from '../generated/api/services/ingestionPipelines/createIngestionPipeline';
|
||||
import { HiveMetastoreConnection as Connection } from '../generated/entity/services/databaseService';
|
||||
import { IngestionPipeline } from '../generated/entity/services/ingestionPipelines/ingestionPipeline';
|
||||
import {
|
||||
IngestionPipeline,
|
||||
StepSummary,
|
||||
} from '../generated/entity/services/ingestionPipelines/ingestionPipeline';
|
||||
import { Connection as MetadataConnection } from '../generated/entity/services/metadataService';
|
||||
import { SearchSourceAlias } from '../interface/search.interface';
|
||||
import { DataObj, ServicesType } from '../interface/service.interface';
|
||||
@ -357,3 +362,34 @@ export const getSuccessMessage = (
|
||||
</Typography.Text>
|
||||
);
|
||||
};
|
||||
|
||||
export const getExpandableStatusRow = (
|
||||
expandedKeys: Array<string>
|
||||
): ExpandableConfig<StepSummary> => ({
|
||||
expandedRowRender: (record) => {
|
||||
return (
|
||||
record.failures?.map((failure) => (
|
||||
<ConnectionStepCard
|
||||
isTestingConnection={false}
|
||||
key={failure.name}
|
||||
testConnectionStep={{
|
||||
name: failure.name,
|
||||
mandatory: false,
|
||||
description: failure.error,
|
||||
}}
|
||||
testConnectionStepResult={{
|
||||
name: failure.name,
|
||||
passed: false,
|
||||
mandatory: false,
|
||||
message: failure.error,
|
||||
errorLog: failure.stackTrace,
|
||||
}}
|
||||
/>
|
||||
)) ?? []
|
||||
);
|
||||
},
|
||||
indentSize: 0,
|
||||
expandIcon: () => null,
|
||||
expandedRowKeys: expandedKeys,
|
||||
rowExpandable: (record) => (record.failures?.length ?? 0) > 0,
|
||||
});
|
||||
|
||||
@ -301,12 +301,7 @@ export const getEntityIcon = (indexType: string) => {
|
||||
case SearchIndex.SEARCH_INDEX:
|
||||
case EntityType.SEARCH_SERVICE:
|
||||
case SearchIndex.SEARCH_SERVICE:
|
||||
return (
|
||||
<SearchOutlined
|
||||
className="text-sm text-inherit"
|
||||
style={{ color: DE_ACTIVE_COLOR }}
|
||||
/>
|
||||
);
|
||||
return <SearchOutlined className="text-sm text-inherit" />;
|
||||
|
||||
case EntityType.DOMAIN:
|
||||
case SearchIndex.DOMAIN:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user