Fix: f/e: log pipelines: changes should be preserved when collapsing edited pipelines (#3770)

* chore: pass dirty pipeline to preview action when editing

* chore: update snapshot for pipeline lists view

* chore: log pipelines list view: refactor dirty pipeline state management

* chore: use memoized value for filtered pipelines instead of useEffect based updates

* chore: update pipeline reorder logic to work on filtered view too

* chore: minor cleanup

---------

Co-authored-by: Rajat Dabade <rajat@signoz.io>
This commit is contained in:
Raj Kamal Singh 2023-10-25 18:59:10 +05:30 committed by GitHub
parent f90ae99018
commit 2c2775c766
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,8 +3,8 @@ import { Modal, Table } from 'antd';
import { ExpandableConfig } from 'antd/es/table/interface'; import { ExpandableConfig } from 'antd/es/table/interface';
import savePipeline from 'api/pipeline/post'; import savePipeline from 'api/pipeline/post';
import { useNotifications } from 'hooks/useNotifications'; import { useNotifications } from 'hooks/useNotifications';
import { cloneDeep } from 'lodash-es'; import cloneDeep from 'lodash-es/cloneDeep';
import React, { useCallback, useEffect, useMemo, useState } from 'react'; import React, { useCallback, useMemo, useState } from 'react';
import { DndProvider } from 'react-dnd'; import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend'; import { HTML5Backend } from 'react-dnd-html5-backend';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -61,31 +61,52 @@ function PipelineListsView({
const [currPipelineData, setCurrPipelineData] = useState<Array<PipelineData>>( const [currPipelineData, setCurrPipelineData] = useState<Array<PipelineData>>(
cloneDeep(pipelineData?.pipelines), cloneDeep(pipelineData?.pipelines),
); );
const [
expandedPipelineData, const [expandedPipelineId, setExpandedPipelineId] = useState<
setExpandedPipelineData, string | undefined
] = useState<PipelineData>(); >(undefined);
const expandedPipelineData = useCallback(
() => currPipelineData.find((p) => p.id === expandedPipelineId),
[currPipelineData, expandedPipelineId],
);
const setExpandedPipelineData = useCallback(
(newData: PipelineData): void => {
if (expandedPipelineId) {
const pipelineIdx = currPipelineData.findIndex(
(p) => p.id === expandedPipelineId,
);
if (pipelineIdx >= 0) {
const newPipelineData = [...currPipelineData];
newPipelineData[pipelineIdx] = newData;
setCurrPipelineData(newPipelineData);
}
}
},
[expandedPipelineId, currPipelineData],
);
const [ const [
selectedProcessorData, selectedProcessorData,
setSelectedProcessorData, setSelectedProcessorData,
] = useState<ProcessorData>(); ] = useState<ProcessorData>();
const [ const [
selectedPipelineData, selectedPipelineData,
setSelectedPipelineData, setSelectedPipelineData,
] = useState<PipelineData>(); ] = useState<PipelineData>();
const [expandedRowKeys, setExpandedRowKeys] = useState<Array<string>>(); const [expandedRowKeys, setExpandedRowKeys] = useState<Array<string>>();
const [showSaveButton, setShowSaveButton] = useState<string>(); const [showSaveButton, setShowSaveButton] = useState<string>();
const isEditingActionMode = isActionMode === ActionMode.Editing; const isEditingActionMode = isActionMode === ActionMode.Editing;
useEffect(() => { const visibleCurrPipelines = useMemo((): Array<PipelineData> => {
if (pipelineSearchValue === '') setCurrPipelineData(pipelineData?.pipelines); if (pipelineSearchValue === '') {
if (pipelineSearchValue !== '') { return currPipelineData;
const filterData = pipelineData?.pipelines.filter((data: PipelineData) =>
getDataOnSearch(data as never, pipelineSearchValue),
);
setCurrPipelineData(filterData);
} }
}, [pipelineSearchValue, pipelineData?.pipelines]); return currPipelineData.filter((data) =>
getDataOnSearch(data as never, pipelineSearchValue),
);
}, [currPipelineData, pipelineSearchValue]);
const handleAlert = useCallback( const handleAlert = useCallback(
({ title, descrition, buttontext, onCancel, onOk }: AlertMessage) => { ({ title, descrition, buttontext, onCancel, onOk }: AlertMessage) => {
@ -173,11 +194,7 @@ function PipelineListsView({
align: 'center', align: 'center',
render: (_value, record): JSX.Element => ( render: (_value, record): JSX.Element => (
<PipelineActions <PipelineActions
pipeline={ pipeline={record}
expandedPipelineData?.id === record.id
? (expandedPipelineData as PipelineData)
: record
}
editAction={pipelineEditAction(record)} editAction={pipelineEditAction(record)}
deleteAction={pipelineDeleteAction(record)} deleteAction={pipelineDeleteAction(record)}
/> />
@ -214,7 +231,6 @@ function PipelineListsView({
pipelineEditAction, pipelineEditAction,
pipelineDeleteAction, pipelineDeleteAction,
onSwitchPipelineChange, onSwitchPipelineChange,
expandedPipelineData,
]); ]);
const updatePipelineSequence = useCallback( const updatePipelineSequence = useCallback(
@ -236,8 +252,14 @@ function PipelineListsView({
(dragIndex: number, hoverIndex: number) => { (dragIndex: number, hoverIndex: number) => {
if (currPipelineData && isEditingActionMode) { if (currPipelineData && isEditingActionMode) {
const rawData = currPipelineData; const rawData = currPipelineData;
const updatedRow = getUpdatedRow(currPipelineData, dragIndex, hoverIndex);
updatedRow.forEach((item, index) => { const updatedRows = getUpdatedRow(
currPipelineData,
visibleCurrPipelines[dragIndex].orderId - 1,
visibleCurrPipelines[hoverIndex].orderId - 1,
);
updatedRows.forEach((item, index) => {
const obj = item; const obj = item;
obj.orderId = index + 1; obj.orderId = index + 1;
}); });
@ -245,7 +267,7 @@ function PipelineListsView({
title: t('reorder_pipeline'), title: t('reorder_pipeline'),
descrition: t('reorder_pipeline_description'), descrition: t('reorder_pipeline_description'),
buttontext: t('reorder'), buttontext: t('reorder'),
onOk: updatePipelineSequence(updatedRow), onOk: updatePipelineSequence(updatedRows),
onCancel: onCancelPipelineSequence(rawData), onCancel: onCancelPipelineSequence(rawData),
}); });
} }
@ -253,6 +275,7 @@ function PipelineListsView({
[ [
currPipelineData, currPipelineData,
isEditingActionMode, isEditingActionMode,
visibleCurrPipelines,
handleAlert, handleAlert,
t, t,
updatePipelineSequence, updatePipelineSequence,
@ -268,7 +291,7 @@ function PipelineListsView({
setActionType={setActionType} setActionType={setActionType}
processorEditAction={processorEditAction} processorEditAction={processorEditAction}
setShowSaveButton={setShowSaveButton} setShowSaveButton={setShowSaveButton}
expandedPipelineData={expandedPipelineData} expandedPipelineData={expandedPipelineData()}
setExpandedPipelineData={setExpandedPipelineData} setExpandedPipelineData={setExpandedPipelineData}
prevPipelineData={prevPipelineData} prevPipelineData={prevPipelineData}
/> />
@ -280,6 +303,7 @@ function PipelineListsView({
expandedPipelineData, expandedPipelineData,
setActionType, setActionType,
prevPipelineData, prevPipelineData,
setExpandedPipelineData,
], ],
); );
@ -290,7 +314,7 @@ function PipelineListsView({
keys.push(record?.id); keys.push(record?.id);
} }
setExpandedRowKeys(keys); setExpandedRowKeys(keys);
setExpandedPipelineData(record); setExpandedPipelineId(record.id);
}, },
[], [],
); );
@ -324,18 +348,7 @@ function PipelineListsView({
const onSaveConfigurationHandler = useCallback(async () => { const onSaveConfigurationHandler = useCallback(async () => {
const modifiedPipelineData = currPipelineData.map((item: PipelineData) => { const modifiedPipelineData = currPipelineData.map((item: PipelineData) => {
const pipelineData = item; const pipelineData = { ...item };
if (
expandedPipelineData !== undefined &&
item.id === expandedPipelineData?.id
) {
pipelineData.config = expandedPipelineData?.config;
}
pipelineData.config = item.config;
return pipelineData;
});
modifiedPipelineData.forEach((item: PipelineData) => {
const pipelineData = item;
delete pipelineData?.id; delete pipelineData?.id;
return pipelineData; return pipelineData;
}); });
@ -363,14 +376,7 @@ function PipelineListsView({
setCurrPipelineData(modifiedPipelineData); setCurrPipelineData(modifiedPipelineData);
setPrevPipelineData(modifiedPipelineData); setPrevPipelineData(modifiedPipelineData);
} }
}, [ }, [currPipelineData, notifications, refetchPipelineLists, setActionMode, t]);
currPipelineData,
expandedPipelineData,
notifications,
refetchPipelineLists,
setActionMode,
t,
]);
const onCancelConfigurationHandler = useCallback((): void => { const onCancelConfigurationHandler = useCallback((): void => {
setActionMode(ActionMode.Viewing); setActionMode(ActionMode.Viewing);
@ -424,7 +430,7 @@ function PipelineListsView({
setActionType={setActionType} setActionType={setActionType}
selectedProcessorData={selectedProcessorData} selectedProcessorData={selectedProcessorData}
setShowSaveButton={setShowSaveButton} setShowSaveButton={setShowSaveButton}
expandedPipelineData={expandedPipelineData} expandedPipelineData={expandedPipelineData()}
setExpandedPipelineData={setExpandedPipelineData} setExpandedPipelineData={setExpandedPipelineData}
/> />
<Container> <Container>
@ -439,7 +445,7 @@ function PipelineListsView({
expandedRowRender={expandedRowView} expandedRowRender={expandedRowView}
expandable={expandableConfig} expandable={expandableConfig}
components={tableComponents} components={tableComponents}
dataSource={currPipelineData} dataSource={visibleCurrPipelines}
onRow={onRowHandler} onRow={onRowHandler}
footer={footer} footer={footer}
pagination={false} pagination={false}