Skip to content

Commit 3b19047

Browse files
committed
refactor: extract dashboard settings data helpers
1 parent 4c93b44 commit 3b19047

2 files changed

Lines changed: 140 additions & 95 deletions

File tree

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import {
2+
type DashboardDisplaySettings,
3+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS,
4+
} from "../dashboard-settings.js";
5+
6+
export function cloneDashboardSettingsData(
7+
settings: DashboardDisplaySettings,
8+
deps: {
9+
resolveMenuLayoutMode: (
10+
settings: DashboardDisplaySettings,
11+
) => "compact-details" | "expanded-rows";
12+
normalizeStatuslineFields: (
13+
fields: DashboardDisplaySettings["menuStatuslineFields"],
14+
) => DashboardDisplaySettings["menuStatuslineFields"];
15+
},
16+
): DashboardDisplaySettings {
17+
const layoutMode = deps.resolveMenuLayoutMode(settings);
18+
return {
19+
showPerAccountRows: settings.showPerAccountRows,
20+
showQuotaDetails: settings.showQuotaDetails,
21+
showForecastReasons: settings.showForecastReasons,
22+
showRecommendations: settings.showRecommendations,
23+
showLiveProbeNotes: settings.showLiveProbeNotes,
24+
actionAutoReturnMs: settings.actionAutoReturnMs ?? 2_000,
25+
actionPauseOnKey: settings.actionPauseOnKey ?? true,
26+
menuAutoFetchLimits: settings.menuAutoFetchLimits ?? true,
27+
menuSortEnabled:
28+
settings.menuSortEnabled ??
29+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortEnabled ??
30+
true,
31+
menuSortMode:
32+
settings.menuSortMode ??
33+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortMode ??
34+
"ready-first",
35+
menuSortPinCurrent:
36+
settings.menuSortPinCurrent ??
37+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortPinCurrent ??
38+
false,
39+
menuSortQuickSwitchVisibleRow:
40+
settings.menuSortQuickSwitchVisibleRow ?? true,
41+
uiThemePreset: settings.uiThemePreset ?? "green",
42+
uiAccentColor: settings.uiAccentColor ?? "green",
43+
menuShowStatusBadge: settings.menuShowStatusBadge ?? true,
44+
menuShowCurrentBadge: settings.menuShowCurrentBadge ?? true,
45+
menuShowLastUsed: settings.menuShowLastUsed ?? true,
46+
menuShowQuotaSummary: settings.menuShowQuotaSummary ?? true,
47+
menuShowQuotaCooldown: settings.menuShowQuotaCooldown ?? true,
48+
menuShowFetchStatus: settings.menuShowFetchStatus ?? true,
49+
menuShowDetailsForUnselectedRows: layoutMode === "expanded-rows",
50+
menuLayoutMode: layoutMode,
51+
menuQuotaTtlMs: settings.menuQuotaTtlMs ?? 5 * 60_000,
52+
menuFocusStyle: settings.menuFocusStyle ?? "row-invert",
53+
menuHighlightCurrentRow: settings.menuHighlightCurrentRow ?? true,
54+
menuStatuslineFields: [
55+
...(deps.normalizeStatuslineFields(settings.menuStatuslineFields) ?? []),
56+
],
57+
};
58+
}
59+
60+
export function dashboardSettingsDataEqual(
61+
left: DashboardDisplaySettings,
62+
right: DashboardDisplaySettings,
63+
deps: {
64+
resolveMenuLayoutMode: (
65+
settings: DashboardDisplaySettings,
66+
) => "compact-details" | "expanded-rows";
67+
normalizeStatuslineFields: (
68+
fields: DashboardDisplaySettings["menuStatuslineFields"],
69+
) => DashboardDisplaySettings["menuStatuslineFields"];
70+
},
71+
): boolean {
72+
return (
73+
left.showPerAccountRows === right.showPerAccountRows &&
74+
left.showQuotaDetails === right.showQuotaDetails &&
75+
left.showForecastReasons === right.showForecastReasons &&
76+
left.showRecommendations === right.showRecommendations &&
77+
left.showLiveProbeNotes === right.showLiveProbeNotes &&
78+
(left.actionAutoReturnMs ?? 2_000) ===
79+
(right.actionAutoReturnMs ?? 2_000) &&
80+
(left.actionPauseOnKey ?? true) === (right.actionPauseOnKey ?? true) &&
81+
(left.menuAutoFetchLimits ?? true) ===
82+
(right.menuAutoFetchLimits ?? true) &&
83+
(left.menuSortEnabled ??
84+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortEnabled ??
85+
true) ===
86+
(right.menuSortEnabled ??
87+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortEnabled ??
88+
true) &&
89+
(left.menuSortMode ??
90+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortMode ??
91+
"ready-first") ===
92+
(right.menuSortMode ??
93+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortMode ??
94+
"ready-first") &&
95+
(left.menuSortPinCurrent ??
96+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortPinCurrent ??
97+
false) ===
98+
(right.menuSortPinCurrent ??
99+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortPinCurrent ??
100+
false) &&
101+
(left.menuSortQuickSwitchVisibleRow ?? true) ===
102+
(right.menuSortQuickSwitchVisibleRow ?? true) &&
103+
(left.uiThemePreset ?? "green") === (right.uiThemePreset ?? "green") &&
104+
(left.uiAccentColor ?? "green") === (right.uiAccentColor ?? "green") &&
105+
(left.menuShowStatusBadge ?? true) ===
106+
(right.menuShowStatusBadge ?? true) &&
107+
(left.menuShowCurrentBadge ?? true) ===
108+
(right.menuShowCurrentBadge ?? true) &&
109+
(left.menuShowLastUsed ?? true) === (right.menuShowLastUsed ?? true) &&
110+
(left.menuShowQuotaSummary ?? true) ===
111+
(right.menuShowQuotaSummary ?? true) &&
112+
(left.menuShowQuotaCooldown ?? true) ===
113+
(right.menuShowQuotaCooldown ?? true) &&
114+
(left.menuShowFetchStatus ?? true) ===
115+
(right.menuShowFetchStatus ?? true) &&
116+
deps.resolveMenuLayoutMode(left) === deps.resolveMenuLayoutMode(right) &&
117+
(left.menuQuotaTtlMs ?? 5 * 60_000) ===
118+
(right.menuQuotaTtlMs ?? 5 * 60_000) &&
119+
(left.menuFocusStyle ?? "row-invert") ===
120+
(right.menuFocusStyle ?? "row-invert") &&
121+
(left.menuHighlightCurrentRow ?? true) ===
122+
(right.menuHighlightCurrentRow ?? true) &&
123+
JSON.stringify(
124+
deps.normalizeStatuslineFields(left.menuStatuslineFields),
125+
) ===
126+
JSON.stringify(deps.normalizeStatuslineFields(right.menuStatuslineFields))
127+
);
128+
}

lib/codex-manager/settings-hub.ts

Lines changed: 12 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ import {
4646
} from "./backend-settings-schema.js";
4747
import { promptBehaviorSettingsPanel } from "./behavior-settings-panel.js";
4848
import { promptDashboardDisplayPanel } from "./dashboard-display-panel.js";
49+
import {
50+
cloneDashboardSettingsData,
51+
dashboardSettingsDataEqual,
52+
} from "./dashboard-settings-data.js";
4953
import {
5054
type ExperimentalSettingsAction,
5155
getExperimentalSelectOptions,
@@ -587,107 +591,20 @@ function buildAccountListPreview(
587591
function cloneDashboardSettings(
588592
settings: DashboardDisplaySettings,
589593
): DashboardDisplaySettings {
590-
const layoutMode = resolveMenuLayoutMode(settings);
591-
return {
592-
showPerAccountRows: settings.showPerAccountRows,
593-
showQuotaDetails: settings.showQuotaDetails,
594-
showForecastReasons: settings.showForecastReasons,
595-
showRecommendations: settings.showRecommendations,
596-
showLiveProbeNotes: settings.showLiveProbeNotes,
597-
actionAutoReturnMs: settings.actionAutoReturnMs ?? 2_000,
598-
actionPauseOnKey: settings.actionPauseOnKey ?? true,
599-
menuAutoFetchLimits: settings.menuAutoFetchLimits ?? true,
600-
menuSortEnabled:
601-
settings.menuSortEnabled ??
602-
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortEnabled ??
603-
true,
604-
menuSortMode:
605-
settings.menuSortMode ??
606-
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortMode ??
607-
"ready-first",
608-
menuSortPinCurrent:
609-
settings.menuSortPinCurrent ??
610-
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortPinCurrent ??
611-
false,
612-
menuSortQuickSwitchVisibleRow:
613-
settings.menuSortQuickSwitchVisibleRow ?? true,
614-
uiThemePreset: settings.uiThemePreset ?? "green",
615-
uiAccentColor: settings.uiAccentColor ?? "green",
616-
menuShowStatusBadge: settings.menuShowStatusBadge ?? true,
617-
menuShowCurrentBadge: settings.menuShowCurrentBadge ?? true,
618-
menuShowLastUsed: settings.menuShowLastUsed ?? true,
619-
menuShowQuotaSummary: settings.menuShowQuotaSummary ?? true,
620-
menuShowQuotaCooldown: settings.menuShowQuotaCooldown ?? true,
621-
menuShowFetchStatus: settings.menuShowFetchStatus ?? true,
622-
menuShowDetailsForUnselectedRows: layoutMode === "expanded-rows",
623-
menuLayoutMode: layoutMode,
624-
menuQuotaTtlMs: settings.menuQuotaTtlMs ?? 5 * 60_000,
625-
menuFocusStyle: settings.menuFocusStyle ?? "row-invert",
626-
menuHighlightCurrentRow: settings.menuHighlightCurrentRow ?? true,
627-
menuStatuslineFields: [
628-
...normalizeStatuslineFields(settings.menuStatuslineFields),
629-
],
630-
};
594+
return cloneDashboardSettingsData(settings, {
595+
resolveMenuLayoutMode,
596+
normalizeStatuslineFields,
597+
});
631598
}
632599

633600
function dashboardSettingsEqual(
634601
left: DashboardDisplaySettings,
635602
right: DashboardDisplaySettings,
636603
): boolean {
637-
return (
638-
left.showPerAccountRows === right.showPerAccountRows &&
639-
left.showQuotaDetails === right.showQuotaDetails &&
640-
left.showForecastReasons === right.showForecastReasons &&
641-
left.showRecommendations === right.showRecommendations &&
642-
left.showLiveProbeNotes === right.showLiveProbeNotes &&
643-
(left.actionAutoReturnMs ?? 2_000) ===
644-
(right.actionAutoReturnMs ?? 2_000) &&
645-
(left.actionPauseOnKey ?? true) === (right.actionPauseOnKey ?? true) &&
646-
(left.menuAutoFetchLimits ?? true) ===
647-
(right.menuAutoFetchLimits ?? true) &&
648-
(left.menuSortEnabled ??
649-
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortEnabled ??
650-
true) ===
651-
(right.menuSortEnabled ??
652-
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortEnabled ??
653-
true) &&
654-
(left.menuSortMode ??
655-
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortMode ??
656-
"ready-first") ===
657-
(right.menuSortMode ??
658-
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortMode ??
659-
"ready-first") &&
660-
(left.menuSortPinCurrent ??
661-
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortPinCurrent ??
662-
false) ===
663-
(right.menuSortPinCurrent ??
664-
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortPinCurrent ??
665-
false) &&
666-
(left.menuSortQuickSwitchVisibleRow ?? true) ===
667-
(right.menuSortQuickSwitchVisibleRow ?? true) &&
668-
(left.uiThemePreset ?? "green") === (right.uiThemePreset ?? "green") &&
669-
(left.uiAccentColor ?? "green") === (right.uiAccentColor ?? "green") &&
670-
(left.menuShowStatusBadge ?? true) ===
671-
(right.menuShowStatusBadge ?? true) &&
672-
(left.menuShowCurrentBadge ?? true) ===
673-
(right.menuShowCurrentBadge ?? true) &&
674-
(left.menuShowLastUsed ?? true) === (right.menuShowLastUsed ?? true) &&
675-
(left.menuShowQuotaSummary ?? true) ===
676-
(right.menuShowQuotaSummary ?? true) &&
677-
(left.menuShowQuotaCooldown ?? true) ===
678-
(right.menuShowQuotaCooldown ?? true) &&
679-
(left.menuShowFetchStatus ?? true) ===
680-
(right.menuShowFetchStatus ?? true) &&
681-
resolveMenuLayoutMode(left) === resolveMenuLayoutMode(right) &&
682-
(left.menuQuotaTtlMs ?? 5 * 60_000) ===
683-
(right.menuQuotaTtlMs ?? 5 * 60_000) &&
684-
(left.menuFocusStyle ?? "row-invert") ===
685-
(right.menuFocusStyle ?? "row-invert") &&
686-
(left.menuHighlightCurrentRow ?? true) ===
687-
(right.menuHighlightCurrentRow ?? true) &&
688-
JSON.stringify(normalizeStatuslineFields(left.menuStatuslineFields)) ===
689-
JSON.stringify(normalizeStatuslineFields(right.menuStatuslineFields))
690-
);
604+
return dashboardSettingsDataEqual(left, right, {
605+
resolveMenuLayoutMode,
606+
normalizeStatuslineFields,
607+
});
691608
}
692609

693610
function cloneBackendPluginConfig(config: PluginConfig): PluginConfig {

0 commit comments

Comments
 (0)