import { PlusCircleOutlined } from '@ant-design/icons';
import { TableLocale } from 'antd/es/table/interface';
import { useIsDarkMode } from 'hooks/useDarkMode';
import React, { useCallback, useMemo } from 'react';
import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';
import { useTranslation } from 'react-i18next';
import {
ActionMode,
ActionType,
PipelineData,
ProcessorData,
} from 'types/api/pipeline/def';
import { tableComponents } from '../config';
import { ModalFooterTitle } from '../styles';
import { AlertMessage } from '.';
import { processorColumns } from './config';
import { FooterButton, StyledTable } from './styles';
import DragAction from './TableComponents/DragAction';
import ProcessorActions from './TableComponents/ProcessorActions';
import {
getEditedDataSource,
getProcessorUpdatedRow,
getRecordIndex,
getTableColumn,
} from './utils';
function PipelineExpandView({
handleAlert,
setActionType,
processorEditAction,
isActionMode,
setShowSaveButton,
expandedPipelineData,
setExpandedPipelineData,
prevPipelineData,
}: PipelineExpandViewProps): JSX.Element {
const { t } = useTranslation(['pipeline']);
const isDarkMode = useIsDarkMode();
const isEditingActionMode = isActionMode === ActionMode.Editing;
const deleteProcessorHandler = useCallback(
(record: ProcessorData) => (): void => {
setShowSaveButton(ActionMode.Editing);
if (expandedPipelineData && expandedPipelineData?.config) {
const filteredData = expandedPipelineData?.config.filter(
(item: ProcessorData) => item.id !== record.id,
);
const pipelineData = { ...expandedPipelineData };
pipelineData.config = filteredData;
pipelineData.config.forEach((item, index) => {
const obj = item;
obj.orderId = index + 1;
});
for (let i = 0; i < pipelineData.config.length - 1; i += 1) {
pipelineData.config[i].output = pipelineData.config[i + 1].id;
}
delete pipelineData.config[pipelineData.config.length - 1]?.output;
setExpandedPipelineData(pipelineData);
}
},
[expandedPipelineData, setShowSaveButton, setExpandedPipelineData],
);
const processorDeleteAction = useCallback(
(record: ProcessorData) => (): void => {
handleAlert({
title: `${t('delete_processor')} : ${record.name}?`,
descrition: t('delete_processor_description'),
buttontext: t('delete'),
onOk: deleteProcessorHandler(record),
});
},
[handleAlert, deleteProcessorHandler, t],
);
const onSwitchProcessorChange = useCallback(
(checked: boolean, record: ProcessorData): void => {
if (expandedPipelineData && expandedPipelineData?.config) {
setShowSaveButton(ActionMode.Editing);
const findRecordIndex = getRecordIndex(
expandedPipelineData?.config,
record,
'id',
);
const updateSwitch = {
...expandedPipelineData?.config[findRecordIndex],
enabled: checked,
};
const editedData = getEditedDataSource(
expandedPipelineData?.config,
record,
'id',
updateSwitch,
);
const modifiedProcessorData = { ...expandedPipelineData };
modifiedProcessorData.config = editedData;
setExpandedPipelineData(modifiedProcessorData);
}
},
[expandedPipelineData, setExpandedPipelineData, setShowSaveButton],
);
const columns = useMemo(() => {
const fieldColumns = getTableColumn(processorColumns);
if (isEditingActionMode) {
fieldColumns.push(
{
title: '',
dataIndex: 'action',
key: 'action',
render: (_value, record): JSX.Element => (
),
},
{
title: '',
dataIndex: 'enabled',
key: 'enabled',
render: (value, record) => (
onSwitchProcessorChange(checked, record)
}
/>
),
},
);
}
return fieldColumns;
}, [
isEditingActionMode,
processorEditAction,
processorDeleteAction,
onSwitchProcessorChange,
]);
const reorderProcessorRow = useCallback(
(updatedRow: ProcessorData[]) => (): void => {
setShowSaveButton(ActionMode.Editing);
if (expandedPipelineData) {
const modifiedProcessorData = { ...expandedPipelineData };
modifiedProcessorData.config = updatedRow;
setExpandedPipelineData(modifiedProcessorData);
}
},
[expandedPipelineData, setShowSaveButton, setExpandedPipelineData],
);
const onCancelReorderProcessorRow = useCallback(
() => (): void => {
if (expandedPipelineData) setExpandedPipelineData(expandedPipelineData);
},
[expandedPipelineData, setExpandedPipelineData],
);
const moveProcessorRow = useCallback(
(dragIndex: number, hoverIndex: number) => {
if (expandedPipelineData?.config && isEditingActionMode) {
const updatedRow = getProcessorUpdatedRow(
expandedPipelineData?.config,
dragIndex,
hoverIndex,
);
handleAlert({
title: t('reorder_processor'),
descrition: t('reorder_processor_description'),
buttontext: t('reorder'),
onOk: reorderProcessorRow(updatedRow),
onCancel: onCancelReorderProcessorRow(),
});
}
},
[
expandedPipelineData?.config,
isEditingActionMode,
handleAlert,
t,
reorderProcessorRow,
onCancelReorderProcessorRow,
],
);
const addNewProcessorHandler = useCallback((): void => {
setActionType(ActionType.AddProcessor);
}, [setActionType]);
const footer = useCallback((): JSX.Element | undefined => {
const prevPipelinesCount = prevPipelineData?.length || 0;
if (prevPipelinesCount === 0 || isEditingActionMode) {
return (
{t('add_new_processor')}
);
}
return undefined;
}, [isEditingActionMode, prevPipelineData, addNewProcessorHandler, t]);
const onRowHandler = (
_data: ProcessorData,
index?: number,
): React.HTMLAttributes =>
({
index,
moveRow: moveProcessorRow,
} as React.HTMLAttributes);
const processorData = useMemo(
() =>
expandedPipelineData?.config &&
expandedPipelineData?.config.map(
(item: ProcessorData): ProcessorData => ({
id: item.id,
orderId: item.orderId,
type: item.type,
name: item.name,
enabled: item.enabled,
}),
),
[expandedPipelineData],
);
const getLocales = (): TableLocale => ({
emptyText: ,
});
return (
);
}
PipelineExpandView.defaultProps = {
expandedPipelineData: {},
};
interface PipelineExpandViewProps {
handleAlert: (props: AlertMessage) => void;
setActionType: (actionType?: ActionType) => void;
processorEditAction: (record: ProcessorData) => () => void;
isActionMode: string;
setShowSaveButton: (actionMode: ActionMode) => void;
expandedPipelineData?: PipelineData;
setExpandedPipelineData: (data: PipelineData) => void;
prevPipelineData: Array;
}
export default PipelineExpandView;