diff --git a/src/component/panels/filtersPanel/Filters/FiltersSectionsPanel.tsx b/src/component/panels/filtersPanel/Filters/FiltersSectionsPanel.tsx
index f872261f5..b0668f724 100644
--- a/src/component/panels/filtersPanel/Filters/FiltersSectionsPanel.tsx
+++ b/src/component/panels/filtersPanel/Filters/FiltersSectionsPanel.tsx
@@ -193,7 +193,9 @@ function FiltersInner(props: FiltersInnerProps) {
setNewFilter(null);
}
- openSection(options?.[selectedTool] ? selectedTool : '');
+ if (options?.[selectedTool]?.isFilter) {
+ openSection(selectedTool);
+ }
}, [filters, selectedTool]);
const filtersList = [...filters];
diff --git a/src/component/panels/filtersPanel/Filters/ShiftOptionsPanel.tsx b/src/component/panels/filtersPanel/Filters/ShiftOptionsPanel.tsx
new file mode 100644
index 000000000..5c9f2e9ab
--- /dev/null
+++ b/src/component/panels/filtersPanel/Filters/ShiftOptionsPanel.tsx
@@ -0,0 +1,87 @@
+import { Filter, Filters } from 'nmr-processing';
+import { useForm } from 'react-hook-form';
+
+import { useDispatch } from '../../../context/DispatchContext';
+import Label from '../../../elements/Label';
+import { NumberInput2Controller } from '../../../elements/NumberInput2Controller';
+import { Sections } from '../../../elements/Sections';
+
+import { FilterActionButtons } from './FilterActionButtons';
+import { HeaderContainer, StickyHeader } from './InnerFilterHeader';
+
+import { formLabelStyle } from '.';
+
+const { shiftX, shift2DX, shift2DY } = Filters;
+
+interface ShiftOptionsPanelProps {
+ filter: Filter;
+}
+
+export default function ShiftOptionsPanel(props: ShiftOptionsPanelProps) {
+ const { filter } = props;
+ const dispatch = useDispatch();
+ const { handleSubmit, control } = useForm({ defaultValues: filter.value });
+
+ function handleCancelFilter() {
+ dispatch({
+ type: 'RESET_SELECTED_TOOL',
+ });
+ }
+
+ function handleApplyFilter(values) {
+ const { shift } = values;
+ switch (filter.name) {
+ case shiftX.id: {
+ dispatch({
+ type: 'SHIFT_SPECTRUM',
+ payload: { shift },
+ });
+ break;
+ }
+
+ case shift2DX.id: {
+ dispatch({
+ type: 'SHIFT_SPECTRUM',
+ payload: { shiftX: shift },
+ });
+ break;
+ }
+
+ case shift2DY.id: {
+ dispatch({
+ type: 'SHIFT_SPECTRUM',
+ payload: { shiftY: shift },
+ });
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ return (
+ <>
+
+
+
+ handleSubmit(handleApplyFilter)()}
+ onCancel={handleCancelFilter}
+ />
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/component/panels/filtersPanel/Filters/index.tsx b/src/component/panels/filtersPanel/Filters/index.tsx
index 3322897eb..3c51763eb 100644
--- a/src/component/panels/filtersPanel/Filters/index.tsx
+++ b/src/component/panels/filtersPanel/Filters/index.tsx
@@ -6,6 +6,7 @@ import ApodizationOptionsPanel from './ApodizationOptionsPanel';
import BaseLineCorrectionOptionsPanel from './BaseLineCorrectionOptionsPanel';
import PhaseCorrectionOptionsPanel from './PhaseCorrectionOptionsPanel';
import PhaseCorrectionTwoDimensionsOptionsPanel from './PhaseCorrectionTwoDimensionsOptionsPanel';
+import ShiftOptionsPanel from './ShiftOptionsPanel';
import ZeroFillingOptionsPanel from './ZeroFillingOptionsPanel';
const {
@@ -14,6 +15,9 @@ const {
phaseCorrectionTwoDimensions,
zeroFilling,
baselineCorrection,
+ shiftX,
+ shift2DX,
+ shift2DY,
} = Filters;
export const filterOptionPanels = {
[apodization.id]: ApodizationOptionsPanel,
@@ -21,6 +25,9 @@ export const filterOptionPanels = {
[zeroFilling.id]: ZeroFillingOptionsPanel,
[phaseCorrectionTwoDimensions.id]: PhaseCorrectionTwoDimensionsOptionsPanel,
[baselineCorrection.id]: BaseLineCorrectionOptionsPanel,
+ [shiftX.id]: ShiftOptionsPanel,
+ [shift2DX.id]: ShiftOptionsPanel,
+ [shift2DY.id]: ShiftOptionsPanel,
};
export const formLabelStyle: LabelStyle = {
diff --git a/src/component/reducer/actions/FiltersActions.ts b/src/component/reducer/actions/FiltersActions.ts
index 00069221e..8642f01e9 100644
--- a/src/component/reducer/actions/FiltersActions.ts
+++ b/src/component/reducer/actions/FiltersActions.ts
@@ -65,10 +65,17 @@ const {
digitalFilter2D,
} = Filters;
-type ShiftSpectrumAlongXAxisAction = ActionType<
- 'SHIFT_SPECTRUM',
- { shift: number }
->;
+interface ShiftOneDimension {
+ shift: number;
+}
+interface ShiftTwoDimensions {
+ shiftX?: number;
+ shiftY?: number;
+}
+
+type ShiftSpectrumOptions = ShiftOneDimension | ShiftTwoDimensions;
+
+type ShiftSpectrumAction = ActionType<'SHIFT_SPECTRUM', ShiftSpectrumOptions>;
type ApodizationFilterAction = ActionType<
'APPLY_APODIZATION_FILTER',
{ options: ApodizationOptions }
@@ -157,7 +164,7 @@ type SetTwoDimensionPhaseCorrectionPivotPoint = ActionType<
>;
export type FiltersActions =
- | ShiftSpectrumAlongXAxisAction
+ | ShiftSpectrumAction
| ApodizationFilterAction
| ApodizationFilterLiveAction
| ZeroFillingFilterAction
@@ -571,10 +578,38 @@ function disableLivePreview(draft: Draft, id: string) {
}
}
+function isOneDimensionShift(
+ values: ShiftSpectrumOptions,
+): values is ShiftOneDimension {
+ return 'shift' in values;
+}
+
+function rollbackOrUpdateSpectrum(
+ draft: Draft,
+ options: {
+ filterKey: string;
+
+ filterUpdateDomainRules: FiltersManager.FilterDomainUpdateRules;
+ },
+) {
+ const { filterKey, filterUpdateDomainRules } = options;
+ const activeFilterIndex = getActiveFilterIndex(draft);
+
+ if (activeFilterIndex !== -1) {
+ rollbackSpectrumByFilter(draft, {
+ searchBy: 'name',
+ key: filterKey,
+ triggerSource: 'Apply',
+ });
+ } else {
+ updateView(draft, filterUpdateDomainRules);
+ }
+}
+
//action
function handleShiftSpectrumAlongXAxis(
draft: Draft,
- action: ShiftSpectrumAlongXAxisAction,
+ action: ShiftSpectrumAction,
) {
const activeSpectrum = getActiveSpectrum(draft);
@@ -583,23 +618,42 @@ function handleShiftSpectrumAlongXAxis(
}
//apply filter into the spectrum
- const { shift } = action.payload;
+ const options = action.payload;
- const activeFilterIndex = getActiveFilterIndex(draft);
const index = activeSpectrum?.index;
- FiltersManager.applyFilter(draft.data[index], [
- { name: shiftX.id, value: { shift } },
- ]);
+ if (isOneDimensionShift(options)) {
+ const { shift } = options;
- if (activeFilterIndex !== -1) {
- rollbackSpectrumByFilter(draft, {
- searchBy: 'name',
- key: shiftX.id,
- triggerSource: 'Apply',
+ FiltersManager.applyFilter(draft.data[index], [
+ { name: shiftX.id, value: { shift } },
+ ]);
+ rollbackOrUpdateSpectrum(draft, {
+ filterKey: shiftX.id,
+ filterUpdateDomainRules: shiftX.DOMAIN_UPDATE_RULES,
});
} else {
- updateView(draft, shiftX.DOMAIN_UPDATE_RULES);
+ const { shiftX, shiftY } = options;
+
+ if (shiftX) {
+ FiltersManager.applyFilter(draft.data[index], [
+ { name: shift2DX.id, value: { shift: shiftX } },
+ ]);
+ rollbackOrUpdateSpectrum(draft, {
+ filterKey: shift2DX.id,
+ filterUpdateDomainRules: shift2DX.DOMAIN_UPDATE_RULES,
+ });
+ }
+
+ if (shiftY) {
+ FiltersManager.applyFilter(draft.data[index], [
+ { name: shift2DY.id, value: { shift: shiftY } },
+ ]);
+ rollbackOrUpdateSpectrum(draft, {
+ filterKey: shift2DY.id,
+ filterUpdateDomainRules: shift2DY.DOMAIN_UPDATE_RULES,
+ });
+ }
}
}