feat: make sidebar table page size configurable in settings

This commit is contained in:
t8y2 2026-06-17 02:00:15 +08:00
parent a052bcd2cd
commit 5a08d42258
11 changed files with 66 additions and 3 deletions

View File

@ -101,6 +101,7 @@ const editAppLayout = ref(settingsStore.editorSettings.appLayout);
const editShowTrayIcon = ref(settingsStore.desktopSettings.show_tray_icon);
const editIconTheme = ref<DesktopIconTheme>(settingsStore.desktopSettings.icon_theme);
const editDebugLoggingEnabled = ref(settingsStore.desktopSettings.debug_logging_enabled);
const editSidebarTablePageSize = ref(settingsStore.desktopSettings.sidebar_table_page_size ?? 500);
const debugLogCopied = ref(false);
const debugLogDownloaded = ref(false);
const editShowColumnCommentsInHeader = ref(settingsStore.editorSettings.showColumnCommentsInHeader);
@ -346,6 +347,7 @@ watch(
editShowTrayIcon.value = settingsStore.desktopSettings.show_tray_icon;
editIconTheme.value = settingsStore.desktopSettings.icon_theme;
editDebugLoggingEnabled.value = settingsStore.desktopSettings.debug_logging_enabled;
editSidebarTablePageSize.value = settingsStore.desktopSettings.sidebar_table_page_size ?? 500;
editShowColumnCommentsInHeader.value = settingsStore.editorSettings.showColumnCommentsInHeader;
editShowColumnTypesInHeader.value = settingsStore.editorSettings.showColumnTypesInHeader;
editCompactColumnHeaderActions.value = settingsStore.editorSettings.compactColumnHeaderActions;
@ -402,6 +404,7 @@ function hasChanges(): boolean {
editShowTrayIcon.value !== settingsStore.desktopSettings.show_tray_icon ||
editIconTheme.value !== settingsStore.desktopSettings.icon_theme ||
editDebugLoggingEnabled.value !== settingsStore.desktopSettings.debug_logging_enabled ||
editSidebarTablePageSize.value !== (settingsStore.desktopSettings.sidebar_table_page_size ?? 500) ||
editShowColumnCommentsInHeader.value !== settingsStore.editorSettings.showColumnCommentsInHeader ||
editShowColumnTypesInHeader.value !== settingsStore.editorSettings.showColumnTypesInHeader ||
editCompactColumnHeaderActions.value !== settingsStore.editorSettings.compactColumnHeaderActions ||
@ -464,6 +467,7 @@ async function persistSettings() {
show_tray_icon: editShowTrayIcon.value,
icon_theme: editIconTheme.value,
debug_logging_enabled: editDebugLoggingEnabled.value,
sidebar_table_page_size: editSidebarTablePageSize.value,
});
if (sidebarObjectDisplayChanged) {
await connectionStore.refreshAllTree();
@ -493,6 +497,7 @@ function resetDefaults() {
editShowTrayIcon.value = DEFAULT_DESKTOP_SETTINGS.show_tray_icon;
editIconTheme.value = DEFAULT_DESKTOP_SETTINGS.icon_theme;
editDebugLoggingEnabled.value = DEFAULT_DESKTOP_SETTINGS.debug_logging_enabled;
editSidebarTablePageSize.value = 500;
editShowColumnCommentsInHeader.value = DEFAULT_EDITOR_SETTINGS.showColumnCommentsInHeader;
editShowColumnTypesInHeader.value = DEFAULT_EDITOR_SETTINGS.showColumnTypesInHeader;
editCompactColumnHeaderActions.value = DEFAULT_EDITOR_SETTINGS.compactColumnHeaderActions;
@ -992,6 +997,7 @@ watch(
editShowTrayIcon.value = settingsStore.desktopSettings.show_tray_icon;
editIconTheme.value = settingsStore.desktopSettings.icon_theme;
editDebugLoggingEnabled.value = settingsStore.desktopSettings.debug_logging_enabled;
editSidebarTablePageSize.value = settingsStore.desktopSettings.sidebar_table_page_size ?? 500;
webdavPassword.value = "";
await refreshWebDavPasswordStatus();
syncAiEditState();
@ -2045,6 +2051,29 @@ watch(
{{ t("settings.sidebarHiddenTablePrefixesDescription") }}
</p>
</div>
<div class="flex items-center justify-between gap-4 rounded-md border bg-muted/20 px-3 py-2">
<div class="space-y-1">
<Label for="sidebar-table-page-size">{{ t("settings.sidebarTablePageSize") }}</Label>
<p class="text-xs text-muted-foreground">
{{ t("settings.sidebarTablePageSizeDescription") }}
</p>
</div>
<Input
id="sidebar-table-page-size"
type="number"
class="w-24 text-right"
:min="100"
:max="10000"
:step="100"
:model-value="editSidebarTablePageSize"
@update:model-value="
(value: string | number) => {
const n = typeof value === 'string' ? parseInt(value) : value;
if (!isNaN(n)) editSidebarTablePageSize = n;
}
"
/>
</div>
</section>
<!-- Data Tab -->

View File

@ -2215,6 +2215,8 @@ export default {
sidebarHiddenTablePrefixes: "Hidden table name prefixes",
sidebarHiddenTablePrefixesDescription: "One prefix per line. Only sidebar table, view, and collection labels are shortened; tooltips and actions still use the full name.",
sidebarHiddenTablePrefixesPlaceholder: "Example:\nODS_\nT8Y2_LONG_",
sidebarTablePageSize: "Sidebar page size",
sidebarTablePageSizeDescription: "Maximum number of tables/objects loaded per page in the sidebar tree. Increase if you have many tables and want fewer pages.",
sidebarHideTableComments: "Hide table comments in sidebar",
sidebarHideTableCommentsDescription: "Hide the inline table/view comments shown next to names in the sidebar tree to save horizontal space.",
sidebarAllowHorizontalScroll: "Allow sidebar horizontal scroll",

View File

@ -1912,6 +1912,8 @@ export default {
sidebarHiddenTablePrefixes: "Prefijos ocultos de tablas",
sidebarHiddenTablePrefixesDescription: "Un prefijo por linea. Solo acorta etiquetas de tablas, vistas y colecciones en la barra lateral; las acciones y ayudas usan el nombre completo.",
sidebarHiddenTablePrefixesPlaceholder: "Ejemplo:\nODS_\nT8Y2_LONG_",
sidebarTablePageSize: "Tamaño de página de la barra lateral",
sidebarTablePageSizeDescription: "Número máximo de tablas/objetos cargados por página en el árbol lateral. Auméntalo si tienes muchas tablas para reducir páginas.",
sidebarHideTableComments: "Ocultar comentarios de tablas en la barra lateral",
sidebarHideTableCommentsDescription: "Oculta los comentarios de tablas/vistas junto a los nombres en el árbol de la barra lateral para ahorrar espacio horizontal.",
sidebarAllowHorizontalScroll: "Permitir desplazamiento horizontal lateral",

View File

@ -1985,6 +1985,8 @@ export default {
sidebarHiddenTablePrefixes: "Prefissi dei nomi delle tabelle nascosti",
sidebarHiddenTablePrefixesDescription: "Un prefisso per riga. Solo le etichette di tabelle, viste e collezioni della barra laterale vengono abbreviate; i suggerimenti e le azioni utilizzano ancora il nome completo.",
sidebarHiddenTablePrefixesPlaceholder: "Esempio:\nODS_\nT8Y2_LONG_",
sidebarTablePageSize: "Dimensione pagina barra laterale",
sidebarTablePageSizeDescription: "Numero massimo di tabelle/oggetti caricati per pagina nell'albero laterale. Aumentalo se hai molte tabelle per ridurre le pagine.",
sidebarHideTableComments: "Nascondi i commenti delle tabelle nella barra laterale",
sidebarHideTableCommentsDescription: "Nascondi i commenti in linea delle tabelle/viste mostrati accanto ai nomi nell'albero della barra laterale per risparmiare spazio orizzontale.",
sidebarAllowHorizontalScroll: "Consenti scorrimento orizzontale barra laterale",

View File

@ -2200,6 +2200,8 @@ export default {
sidebarHiddenTablePrefixes: "非表示テーブル名プレフィックス",
sidebarHiddenTablePrefixesDescription: "1行に1つのプレフィックス。サイドバーのテーブル、ビュー、コレクションラベルのみ短縮されます。ツールチップと操作は完全な名前を使用します。",
sidebarHiddenTablePrefixesPlaceholder: "Example:\nODS_\nT8Y2_LONG_",
sidebarTablePageSize: "サイドバーのページサイズ",
sidebarTablePageSizeDescription: "サイドバーツリーで1ページあたりに読み込むテーブル/オブジェクトの最大数です。テーブルが多い場合は増やすとページ切り替えが減ります。",
sidebarHideTableComments: "サイドバーのテーブルコメントを非表示",
sidebarHideTableCommentsDescription: "横のスペースを節約するため、サイドバーツリーで名前の横に表示されるテーブル/ビューコメントを非表示にします。",
sidebarAllowHorizontalScroll: "サイドバーの横スクロールを許可",

View File

@ -1996,6 +1996,8 @@ export default {
sidebarHiddenTablePrefixes: "Prefixos de nome de tabela ocultos",
sidebarHiddenTablePrefixesDescription: "Um prefixo por linha. Apenas os rótulos de tabela, view e coleção da barra lateral são encurtados; tooltips e ações ainda usam o nome completo.",
sidebarHiddenTablePrefixesPlaceholder: "Exemplo:\nODS_\nT8Y2_LONG_",
sidebarTablePageSize: "Tamanho da página da barra lateral",
sidebarTablePageSizeDescription: "Número máximo de tabelas/objetos carregados por página na árvore lateral. Aumente se tiver muitas tabelas para reduzir páginas.",
sidebarHideTableComments: "Ocultar comentários de tabela na barra lateral",
sidebarHideTableCommentsDescription: "Ocultar os comentários inline de tabela/view exibidos ao lado dos nomes na árvore da barra lateral para economizar espaço horizontal.",
sidebarAllowHorizontalScroll: "Permitir rolagem horizontal da barra lateral",

View File

@ -2239,6 +2239,8 @@ export default {
sidebarHiddenTablePrefixes: "隐藏表名前缀",
sidebarHiddenTablePrefixesDescription: "每行一个前缀,仅影响侧边栏表、视图和集合的显示名称,悬浮提示和实际操作仍使用完整名称。",
sidebarHiddenTablePrefixesPlaceholder: "例如:\nODS_\nT8Y2_LONG_",
sidebarTablePageSize: "侧边栏分页大小",
sidebarTablePageSizeDescription: "侧边栏树每页最多加载的表/对象数量。表多时可以调大减少翻页次数。",
sidebarHideTableComments: "隐藏侧边栏表注释",
sidebarHideTableCommentsDescription: "隐藏侧边栏中表名旁边显示的表/视图注释,以节省横向空间。",
sidebarAllowHorizontalScroll: "允许侧边栏横向滚动",

View File

@ -2022,6 +2022,8 @@ export default {
sidebarHiddenTablePrefixes: "隱藏資料表名稱字首",
sidebarHiddenTablePrefixesDescription: "每行一個字首。只縮短側邊欄中的資料表、檢視和集合標籤;工具提示和實際操作仍使用完整名稱。",
sidebarHiddenTablePrefixesPlaceholder: "範例:\nODS_\nT8Y2_LONG_",
sidebarTablePageSize: "側邊欄分頁大小",
sidebarTablePageSizeDescription: "側邊欄樹每頁最多載入的資料表/物件數量。資料表多時可調大減少翻頁次數。",
sidebarHideTableComments: "隱藏側邊欄資料表註解",
sidebarHideTableCommentsDescription: "隱藏側邊欄樹狀清單中名稱旁的資料表/檢視註解,以節省橫向空間。",
sidebarAllowHorizontalScroll: "允許側邊欄水平捲動",

View File

@ -51,7 +51,11 @@ import { useSettingsStore } from "@/stores/settingsStore";
const PINNED_TREE_NODES_STORAGE_KEY = "dbx-pinned-tree-nodes";
const ACTIVE_CONNECTION_STORAGE_KEY = "dbx-active-connection";
const SIDEBAR_OBJECT_GROUP_PAGE_SIZE = 500;
function sidebarObjectGroupPageSize(): number {
const settingsStore = useSettingsStore();
const size = settingsStore.desktopSettings.sidebar_table_page_size;
return typeof size === "number" && size > 0 ? size : 500;
}
type ImportSource = "dbx" | "navicat" | "dbeaver" | "datagrip";
// Temporary storage for DataGrip import payload (used to read Keychain passwords after import)
@ -1321,9 +1325,9 @@ export const useConnectionStore = defineStore("connection", () => {
effectiveSchema,
objectTypes,
offset: 0,
pageSize: SIDEBAR_OBJECT_GROUP_PAGE_SIZE,
pageSize: sidebarObjectGroupPageSize(),
});
children = page.hasMore && !sidebarSearchQuery.value ? [...page.children, buildLoadMoreNode(node, page.nextOffset, SIDEBAR_OBJECT_GROUP_PAGE_SIZE)] : page.children;
children = page.hasMore && !sidebarSearchQuery.value ? [...page.children, buildLoadMoreNode(node, page.nextOffset, sidebarObjectGroupPageSize())] : page.children;
node.objectCount = page.objectCount;
} else {
const objects = await api.listObjects(node.connectionId, node.database, querySchema, objectTypes);

View File

@ -44,6 +44,7 @@ export interface DesktopSettings {
driver_store_dir?: string | null;
plugin_store_dir?: string | null;
agent_store_dir?: string | null;
sidebar_table_page_size?: number | null;
}
export type DesktopIconTheme = "default" | "black";
@ -58,10 +59,12 @@ export const DEFAULT_DESKTOP_SETTINGS: DesktopSettings = {
driver_store_dir: null,
plugin_store_dir: null,
agent_store_dir: null,
sidebar_table_page_size: 500,
};
function normalizeDesktopSettings(settings: Partial<DesktopSettings> | null | undefined): DesktopSettings {
const iconTheme = settings?.icon_theme === "black" ? "black" : DEFAULT_DESKTOP_SETTINGS.icon_theme;
const sidebarTablePageSize = typeof settings?.sidebar_table_page_size === "number" && settings.sidebar_table_page_size > 0 ? settings.sidebar_table_page_size : DEFAULT_DESKTOP_SETTINGS.sidebar_table_page_size;
return {
show_tray_icon: settings?.show_tray_icon ?? DEFAULT_DESKTOP_SETTINGS.show_tray_icon,
icon_theme: iconTheme,
@ -70,6 +73,7 @@ function normalizeDesktopSettings(settings: Partial<DesktopSettings> | null | un
driver_store_dir: settings?.driver_store_dir?.trim() || DEFAULT_DESKTOP_SETTINGS.driver_store_dir,
plugin_store_dir: settings?.plugin_store_dir?.trim() || DEFAULT_DESKTOP_SETTINGS.plugin_store_dir,
agent_store_dir: settings?.agent_store_dir?.trim() || DEFAULT_DESKTOP_SETTINGS.agent_store_dir,
sidebar_table_page_size: sidebarTablePageSize,
};
}

View File

@ -46,6 +46,12 @@ pub struct DesktopSettings {
pub plugin_store_dir: Option<String>,
#[serde(default)]
pub agent_store_dir: Option<String>,
#[serde(default = "default_sidebar_table_page_size")]
pub sidebar_table_page_size: usize,
}
fn default_sidebar_table_page_size() -> usize {
500
}
impl Default for DesktopSettings {
@ -58,6 +64,7 @@ impl Default for DesktopSettings {
driver_store_dir: None,
plugin_store_dir: None,
agent_store_dir: None,
sidebar_table_page_size: 500,
}
}
}
@ -626,6 +633,11 @@ impl Storage {
.map(str::trim)
.filter(|value| !value.is_empty())
.map(ToString::to_string),
sidebar_table_page_size: settings
.get("sidebar_table_page_size")
.and_then(|value| value.as_u64())
.map(|value| value as usize)
.unwrap_or_else(|| DesktopSettings::default().sidebar_table_page_size),
})
}