diff --git a/src/component/modal/setting/tanstack_general_settings/general_settings_dialog_body.tsx b/src/component/modal/setting/tanstack_general_settings/general_settings_dialog_body.tsx
index 6713100a4..c3487480e 100644
--- a/src/component/modal/setting/tanstack_general_settings/general_settings_dialog_body.tsx
+++ b/src/component/modal/setting/tanstack_general_settings/general_settings_dialog_body.tsx
@@ -8,6 +8,7 @@ import { ExportTab } from './tabs/export_tab.tsx';
import { GeneralTab } from './tabs/general_tab.tsx';
import { ImportFiltersTab } from './tabs/import_filters_tab.tsx';
import { NucleiTab } from './tabs/nuclei_tab.tsx';
+import { PanelsTab } from './tabs/panels_tab.tsx';
import { defaultGeneralSettingsFormValues } from './validation.ts';
const Tabs = styled(BPTabs)`
@@ -51,6 +52,8 @@ export const GeneralSettingsDialogBody = withForm({
} />
+ } />
+
{
+ const { Section, AppField } = form;
+ return (
+ <>
+
+
+ {({ Checkbox }) => }
+
+
+
+
+
+
+
+ >
+ );
+ },
+});
+
+const SpectraSettings = withFieldGroup({
+ defaultValues: defaultGeneralSettingsFormValues.display.panels,
+ render: ({ group }) => {
+ const { Section, AppField } = group;
+
+ return (
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ );
+ },
+});
+
+const Spectra1dSettings = withFieldGroup({
+ defaultValues: defaultGeneralSettingsFormValues.display.panels,
+ render: ({ group }) => {
+ const { Section, AppField } = group;
+
+ return (
+
+
+ {({ Select }) => }
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ );
+ },
+});
+
+const Spectra2dSettings = withFieldGroup({
+ defaultValues: defaultGeneralSettingsFormValues.display.panels,
+ render: ({ group }) => {
+ const { Section, AppField } = group;
+
+ return (
+
+
+ {({ Select }) => }
+
+
+ );
+ },
+});
+
+const ChemicalSettings = withFieldGroup({
+ defaultValues: defaultGeneralSettingsFormValues.display.panels,
+ render: ({ group }) => {
+ const { Section, AppField } = group;
+
+ return (
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ {({ Select }) => (
+
+ )}
+
+
+ );
+ },
+});
diff --git a/src/component/modal/setting/tanstack_general_settings/validation.ts b/src/component/modal/setting/tanstack_general_settings/validation.ts
index 2adbded06..af55deca3 100644
--- a/src/component/modal/setting/tanstack_general_settings/validation.ts
+++ b/src/component/modal/setting/tanstack_general_settings/validation.ts
@@ -50,12 +50,93 @@ const generalValidation = z.object({
loggingLevel: z.enum(loggingLevel).optional(),
});
-const displayValidation = z.object({
- general: z.object({
- experimentalFeatures: z.object({
- display: z.boolean(),
- }),
+const displayGeneralValidation = z.object({
+ experimentalFeatures: z.object({
+ display: z.boolean(),
}),
+ hidePanelsBar: z.boolean().optional(),
+});
+
+export const displayPanelsStatus = [
+ { label: 'Hidden', value: 'hidden' } as const,
+ { label: 'Available', value: 'available' } as const,
+ { label: 'Active', value: 'active' } as const,
+ { label: 'Open', value: 'open' } as const,
+];
+type PanelStatus = (typeof displayPanelsStatus)[number]['value'];
+const panelStatusValidation = z.enum(displayPanelsStatus.map((s) => s.value));
+const panelCodec = z.codec(
+ panelStatusValidation,
+ z
+ .object({
+ display: z.boolean(),
+ visible: z.boolean(),
+ open: z.boolean().optional(),
+ })
+ .optional(),
+ {
+ encode: (status) => {
+ const { display = false, visible = false, open = false } = status ?? {};
+ let value: PanelStatus = 'hidden';
+ const isActive = visible && display;
+
+ if (isActive && open) {
+ value = 'open';
+ } else if (isActive) {
+ value = 'active';
+ } else if (visible) {
+ value = 'available';
+ }
+
+ return value;
+ },
+ decode: (status) => {
+ let visible = false;
+ let display = false;
+ let open = false;
+
+ if (status === 'available') {
+ visible = true;
+ }
+
+ if (status === 'active') {
+ visible = true;
+ display = true;
+ }
+ if (status === 'open') {
+ visible = true;
+ display = true;
+ open = true;
+ }
+
+ return { open, visible, display };
+ },
+ },
+);
+
+const displayPanelsValidation = z
+ .object({
+ spectraPanel: panelCodec,
+ informationPanel: panelCodec,
+ peaksPanel: panelCodec,
+ integralsPanel: panelCodec,
+ rangesPanel: panelCodec,
+ structuresPanel: panelCodec,
+ processingsPanel: panelCodec,
+ zonesPanel: panelCodec,
+ summaryPanel: panelCodec,
+ multipleSpectraAnalysisPanel: panelCodec,
+ databasePanel: panelCodec,
+ predictionPanel: panelCodec,
+ automaticAssignmentPanel: panelCodec,
+ matrixGenerationPanel: panelCodec,
+ simulationPanel: panelCodec,
+ })
+ .optional();
+
+const displayValidation = z.object({
+ general: displayGeneralValidation,
+ panels: displayPanelsValidation,
});
/**
@@ -179,6 +260,9 @@ export const defaultGeneralSettingsFormValues: z.input<
display: false,
},
},
+ panels: displayPanelsValidation.encode(
+ workspaceDefaultProperties.display.panels,
+ ),
},
nmrLoaders: nmrLoadersValidation.encode(
workspaceDefaultProperties.nmrLoaders,