feat(modules): show permissions before installation

This commit is contained in:
2026-08-07 01:59:35 +02:00
parent 9d522ef6e0
commit bc589a3d4f
6 changed files with 61 additions and 1 deletions
@@ -580,6 +580,16 @@ export default function ModuleManagementPanel({ settings, canWrite, canAccessMai
</div>)}
{item.description && <p className="module-package-catalog-description">{item.description}</p>}
{item.configuration_requirements.length > 0 && <p className="module-package-catalog-description">i18n:govoplan-admin.configuration_requirements.7c8f1011 {item.configuration_requirements.join(", ")}</p>}
{item.permissions.length > 0 && <details className="module-package-catalog-description">
<summary>{i18nMessage("i18n:govoplan-admin.declared_permissions.7c8f1015", { value0: item.permissions.length })}</summary>
<p className="muted small-note">i18n:govoplan-admin.installing_does_not_grant_permissions.7c8f1016</p>
<div className="module-management-details">
{permissionCategoryLabels(item).map((label) => <span key={label}>{label}</span>)}
</div>
<div className="module-management-details">
{item.permissions.map((permission) => <span key={permission.scope} title={permission.description}><code>{permission.scope}</code> {permission.label}{permission.deprecated ? " (deprecated)" : ""}</span>)}
</div>
</details>}
{item.migration_notes && <p className="module-package-catalog-description">{item.migration_notes}</p>}
{item.bridge_notes && <p className="module-package-catalog-description">{item.bridge_notes}</p>}
{item.recovery_notes && <p className="module-package-catalog-description">{item.recovery_notes}</p>}
@@ -954,6 +964,17 @@ function requiredInterfacesLabel(item: ModulePackageCatalogItem): string {
}).join(", ");
}
function permissionCategoryLabels(item: ModulePackageCatalogItem): string[] {
const counts = new Map<string, number>();
item.permissions.forEach((permission) => {
const key = `${permission.category} · ${permission.level}`;
counts.set(key, (counts.get(key) ?? 0) + 1);
});
return [...counts.entries()]
.sort(([left], [right]) => left.localeCompare(right))
.map(([key, count]) => `${key}: ${count}`);
}
function migrationSafetyLabel(value: ModulePackageCatalogItem["migration_safety"] | ModuleInstallTargetItem["migration_safety"]): string {
if (value === "requires_review") return "i18n:govoplan-admin.requires_review.8ba0b8c6";
if (value === "forward_only") return "i18n:govoplan-admin.forward_only.6c107a46";