mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-07-24 04:14:26 +08:00
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:
parent
f90ae99018
commit
2c2775c766
@ -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}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user