feat(admin): add optional ID column on groups list

Add a toggleable group ID column in /admin/groups column settings.
It shows the group id (e.g. #1), is hidden by default for new and
existing admins via column-settings version migration, and remains
sortable against the existing backend sort_by=id support.
This commit is contained in:
bestony committed 2026-07-14 19:19:22 +08:00
1 parent 69bc6a87dd
commit eedd9b147d
4 files changed
+117 -9

No files matched your search

+61 -7
View File
@@ -128,6 +128,12 @@
}}</span>
</template>
<template #cell-id="{ value }">
<span class="font-mono text-xs text-gray-500 dark:text-gray-400"
>#{{ value }}</span
>
</template>
<template #cell-platform="{ value }">
<span
:class="[
@@ -3612,10 +3618,19 @@ const appStore = useAppStore();
const onboardingStore = useOnboardingStore();
const ALWAYS_VISIBLE_COLUMNS = new Set(["name", "actions"]);
// Default hidden columns (hidden on first load / after schema bumps).
const DEFAULT_HIDDEN_COLUMNS = ["id"];
const HIDDEN_COLUMNS_KEY = "group-hidden-columns";
// Bump when adding new default-hidden columns so existing admins pick them up once.
const COLUMN_SETTINGS_VERSION_KEY = "group-column-settings-version";
const COLUMN_SETTINGS_VERSION = 2;
const VERSION_NEW_HIDDEN_COLUMNS: Record<number, string[]> = {
2: ["id"],
};
const allColumns = computed<Column[]>(() => [
{ key: "name", label: t("admin.groups.columns.name"), sortable: true },
{ key: "id", label: t("admin.groups.columns.id"), sortable: true },
{
key: "platform",
label: t("admin.groups.columns.platform"),
@@ -3665,16 +3680,51 @@ const loadSavedColumns = () => {
hiddenColumns.clear();
try {
const saved = localStorage.getItem(HIDDEN_COLUMNS_KEY);
if (!saved) return;
const parsed = JSON.parse(saved);
if (!Array.isArray(parsed)) return;
const validKeys = getValidHiddenColumnKeys();
parsed
.filter((key): key is string => typeof key === "string" && validKeys.has(key))
.forEach((key) => hiddenColumns.add(key));
if (saved) {
const parsed = JSON.parse(saved);
if (Array.isArray(parsed)) {
parsed
.filter(
(key): key is string =>
typeof key === "string" && validKeys.has(key),
)
.forEach((key) => hiddenColumns.add(key));
}
// Existing admins: auto-hide columns newly added as default-hidden.
const storedVersion = Number(
localStorage.getItem(COLUMN_SETTINGS_VERSION_KEY) ?? "1",
);
if (storedVersion < COLUMN_SETTINGS_VERSION) {
let mutated = false;
for (let v = storedVersion + 1; v <= COLUMN_SETTINGS_VERSION; v++) {
for (const key of VERSION_NEW_HIDDEN_COLUMNS[v] ?? []) {
if (validKeys.has(key) && !hiddenColumns.has(key)) {
hiddenColumns.add(key);
mutated = true;
}
}
}
if (mutated) {
saveColumnsToStorage();
} else {
localStorage.setItem(
COLUMN_SETTINGS_VERSION_KEY,
String(COLUMN_SETTINGS_VERSION),
);
}
}
} else {
DEFAULT_HIDDEN_COLUMNS.forEach((key) => {
if (validKeys.has(key)) hiddenColumns.add(key);
});
saveColumnsToStorage();
}
} catch (error) {
console.error("Failed to load group column settings:", error);
DEFAULT_HIDDEN_COLUMNS.forEach((key) => hiddenColumns.add(key));
}
};
@@ -3683,6 +3733,10 @@ const saveColumnsToStorage = () => {
const validKeys = getValidHiddenColumnKeys();
const keys = [...hiddenColumns].filter((key) => validKeys.has(key));
localStorage.setItem(HIDDEN_COLUMNS_KEY, JSON.stringify(keys));
localStorage.setItem(
COLUMN_SETTINGS_VERSION_KEY,
String(COLUMN_SETTINGS_VERSION),
);
} catch (error) {
console.error("Failed to save group column settings:", error);
}