feat: improve app ui and project metadata
This commit is contained in:
@@ -27,6 +27,21 @@ export function tierLabel(tier: string): string {
|
||||
|
||||
export type SkillGroups = { scope: string; skills: SkillView[] }[];
|
||||
|
||||
export interface SkillCount {
|
||||
key: string;
|
||||
count: number;
|
||||
}
|
||||
|
||||
export interface SkillsSummary {
|
||||
total: number;
|
||||
readonlyCount: number;
|
||||
writableCount: number;
|
||||
scopes: SkillCount[];
|
||||
tiers: SkillCount[];
|
||||
readableTables: string[];
|
||||
writableTables: string[];
|
||||
}
|
||||
|
||||
// 按 scope 分组(保持服务端 name 升序);scope 顺序按首次出现。
|
||||
export function groupByScope(
|
||||
skills: readonly SkillView[] | undefined,
|
||||
@@ -42,3 +57,41 @@ export function groupByScope(
|
||||
}
|
||||
return order.map((scope) => ({ scope, skills: map.get(scope) ?? [] }));
|
||||
}
|
||||
|
||||
export function summarizeSkills(
|
||||
skills: readonly SkillView[] | undefined,
|
||||
): SkillsSummary {
|
||||
const scopeCounts = new Map<string, number>();
|
||||
const tierCounts = new Map<string, number>();
|
||||
const readableTables = new Set<string>();
|
||||
const writableTables = new Set<string>();
|
||||
let writableCount = 0;
|
||||
|
||||
for (const skill of skills ?? []) {
|
||||
scopeCounts.set(skill.scope, (scopeCounts.get(skill.scope) ?? 0) + 1);
|
||||
tierCounts.set(skill.tier, (tierCounts.get(skill.tier) ?? 0) + 1);
|
||||
for (const table of skill.reads ?? []) {
|
||||
readableTables.add(table);
|
||||
}
|
||||
if (skill.writes && skill.writes.length > 0) {
|
||||
writableCount += 1;
|
||||
for (const table of skill.writes) {
|
||||
writableTables.add(table);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
total: skills?.length ?? 0,
|
||||
readonlyCount: (skills?.length ?? 0) - writableCount,
|
||||
writableCount,
|
||||
scopes: countsFromMap(scopeCounts),
|
||||
tiers: countsFromMap(tierCounts),
|
||||
readableTables: [...readableTables].sort(),
|
||||
writableTables: [...writableTables].sort(),
|
||||
};
|
||||
}
|
||||
|
||||
function countsFromMap(map: Map<string, number>): SkillCount[] {
|
||||
return [...map.entries()].map(([key, count]) => ({ key, count }));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user