2
0

feat(vault): add license info card to vault navbar
Some checks failed
Build and Release / Create Release (push) Successful in 0s
Build and Release / Lint (push) Successful in 4m50s
Build and Release / Unit Tests (push) Successful in 3m19s
Build and Release / Integration Tests (PostgreSQL) (push) Successful in 3m38s
Build and Release / Build Binaries (amd64, linux, linux-latest) (push) Successful in 2m55s
Build and Release / Build Binaries (amd64, windows, windows-latest) (push) Successful in 9h5m31s
Build and Release / Build Binaries (arm64, darwin, macos) (push) Failing after 7m30s
Build and Release / Build Binary (linux/arm64) (push) Failing after 4s
Build and Release / Build Binaries (amd64, darwin, macos) (push) Failing after 7m43s

- Add license tier badge (solo/pro/enterprise) with color coding
- Add descriptions under menu items
- Add license info card showing tier, max secrets, versions, retention
- Add translations for 12 languages

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-18 16:42:51 -05:00
parent 4df64e1300
commit 319c95f673
13 changed files with 130 additions and 36 deletions

View File

@@ -4230,5 +4230,11 @@
"admin.plugins.license_grace": "Lizenz-Karenzzeit",
"admin.plugins.license_invalid": "Ungültige Lizenz",
"admin.plugins.license_not_required": "Keine Lizenz erforderlich",
"admin.plugins.none": "Keine"
"admin.plugins.none": "Keine",
"vault.license": "Lizenz",
"vault.license_tier": "Stufe",
"vault.max_secrets": "Max. Geheimnisse",
"vault.max_versions": "Max. Versionen",
"vault.audit_retention": "Audit-Aufbewahrung",
"vault.unlimited": "Unbegrenzt"
}

View File

@@ -4103,7 +4103,6 @@
"admin.ai_learning.delete_confirm": "Are you sure you want to delete this pattern?",
"admin.ai_learning.delete_selected": "Delete Selected",
"admin.ai_learning.deleted": "Pattern(s) deleted successfully",
"admin.plugins": "Plugins",
"admin.plugins.path": "Plugin Directory",
"admin.plugins.disabled": "The plugin system is disabled. Enable it in app.ini with [plugins] ENABLED = true",
@@ -4118,18 +4117,15 @@
"admin.plugins.license_invalid": "Invalid",
"admin.plugins.license_not_required": "Free",
"admin.plugins.none": "No plugins loaded",
"vault.title": "Vault",
"vault.secrets": "Secrets",
"vault.audit": "Audit Log",
"vault.tokens": "Access Tokens",
"vault.version_history": "Version History",
"vault.new_secret": "New Secret",
"vault.secrets_description": "Securely store and manage secrets for this repository",
"vault.audit_description": "View all access and modification events for this vault",
"vault.tokens_description": "Manage API access tokens for CI/CD and automation",
"vault.secret_name": "Name",
"vault.secret_type": "Type",
"vault.secret_value": "Secret Value",
@@ -4139,14 +4135,12 @@
"vault.updated": "Updated",
"vault.created_by": "Created By",
"vault.comment": "Comment",
"vault.type": "Type",
"vault.type_generic": "Generic",
"vault.type_password": "Password",
"vault.type_api_key": "API Key",
"vault.type_certificate": "Certificate",
"vault.type_ssh_key": "SSH Key",
"vault.secret_name_placeholder": "my_secret_name",
"vault.secret_name_help": "Must start with a letter and contain only letters, numbers, underscores, and hyphens",
"vault.description_placeholder": "Optional description of this secret",
@@ -4154,7 +4148,6 @@
"vault.value_help": "The value will be encrypted and stored securely",
"vault.version_comment_placeholder": "Optional comment describing this change",
"vault.enter_new_value": "Enter new value",
"vault.new_value": "New Value",
"vault.update": "Update",
"vault.update_secret": "Update Secret",
@@ -4169,38 +4162,31 @@
"vault.rollback": "Rollback",
"vault.rollback_to_this": "Rollback to this version",
"vault.restore": "Restore",
"vault.current": "Current",
"vault.deleted": "Deleted",
"vault.no_comment": "No comment",
"vault.unknown_user": "Unknown user",
"vault.no_secrets": "No Secrets",
"vault.no_secrets_description": "This repository doesn't have any secrets stored yet.",
"vault.create_first_secret": "Create your first secret",
"vault.no_versions": "No version history available",
"vault.no_audit_entries": "No Audit Entries",
"vault.no_audit_entries_description": "No vault activity has been recorded yet.",
"vault.show_deleted": "Show deleted secrets",
"vault.danger_zone": "Danger Zone",
"vault.confirm_delete": "Are you sure you want to delete this secret? It can be restored later.",
"vault.confirm_rollback": "Are you sure you want to rollback to version %d?",
"vault.secret_created": "Secret created successfully",
"vault.secret_updated": "Secret updated successfully",
"vault.secret_deleted": "Secret deleted successfully",
"vault.secret_restored": "Secret restored successfully",
"vault.secret_rolled_back": "Secret rolled back to version %d",
"vault.error_value_required": "Secret value is required",
"vault.error_update_failed": "Failed to update secret",
"vault.error_required_fields": "Name and value are required",
"vault.error_secret_exists": "A secret with this name already exists",
"vault.error_invalid_version": "Invalid version number",
"vault.error_version_not_found": "Version not found",
"vault.timestamp": "Timestamp",
"vault.action": "Action",
"vault.secret": "Secret",
@@ -4211,7 +4197,6 @@
"vault.failed": "Failed",
"vault.unknown": "Unknown",
"vault.token_access": "Token",
"vault.action_list": "List",
"vault.action_read": "Read",
"vault.action_write": "Write",
@@ -4219,7 +4204,6 @@
"vault.action_restore": "Restore",
"vault.action_rollback": "Rollback",
"vault.action_rotate_key": "Rotate Key",
"vault.new_token": "New Token",
"vault.create_token": "Create Token",
"vault.token_description": "Description",
@@ -4245,10 +4229,15 @@
"vault.no_tokens_description": "Create a token to allow API access to this vault.",
"vault.confirm_revoke_token": "Are you sure you want to revoke this token? This cannot be undone.",
"vault.token_revoked": "Token revoked successfully",
"vault.error_description_required": "Token description is required",
"vault.error_create_token_failed": "Failed to create token",
"vault.error_invalid_token_id": "Invalid token ID",
"vault.error_token_not_found": "Token not found",
"vault.error_revoke_failed": "Failed to revoke token"
}
"vault.error_revoke_failed": "Failed to revoke token",
"vault.license": "License",
"vault.license_tier": "Tier",
"vault.max_secrets": "Max Secrets",
"vault.max_versions": "Max Versions",
"vault.audit_retention": "Audit Retention",
"vault.unlimited": "Unlimited"
}

View File

@@ -3822,5 +3822,11 @@
"admin.plugins.license_grace": "Período de gracia de licencia",
"admin.plugins.license_invalid": "Licencia inválida",
"admin.plugins.license_not_required": "No requiere licencia",
"admin.plugins.none": "Ninguno"
"admin.plugins.none": "Ninguno",
"vault.license": "Licencia",
"vault.license_tier": "Nivel",
"vault.max_secrets": "Máx. secretos",
"vault.max_versions": "Máx. versiones",
"vault.audit_retention": "Retención de auditoría",
"vault.unlimited": "Ilimitado"
}

View File

@@ -4168,5 +4168,11 @@
"admin.plugins.license_grace": "Grace Period",
"admin.plugins.license_invalid": "Invalid",
"admin.plugins.license_not_required": "Free",
"admin.plugins.none": "No plugins loaded"
"admin.plugins.none": "No plugins loaded",
"vault.license": "Licence",
"vault.license_tier": "Niveau",
"vault.max_secrets": "Max. secrets",
"vault.max_versions": "Max. versions",
"vault.audit_retention": "Rétention d'audit",
"vault.unlimited": "Illimité"
}

View File

@@ -4229,5 +4229,11 @@
"vault.error_create_token_failed": "Failed to create token",
"vault.error_invalid_token_id": "Invalid token ID",
"vault.error_token_not_found": "Token not found",
"vault.error_revoke_failed": "Failed to revoke token"
"vault.error_revoke_failed": "Failed to revoke token",
"vault.license": "License",
"vault.license_tier": "Tier",
"vault.max_secrets": "Max Secrets",
"vault.max_versions": "Max Versions",
"vault.audit_retention": "Audit Retention",
"vault.unlimited": "Unlimited"
}

View File

@@ -3268,5 +3268,11 @@
"admin.plugins.license_grace": "Grace Period",
"admin.plugins.license_invalid": "Invalid",
"admin.plugins.license_not_required": "Free",
"admin.plugins.none": "No plugins loaded"
"admin.plugins.none": "No plugins loaded",
"vault.license": "Licenza",
"vault.license_tier": "Livello",
"vault.max_secrets": "Max. segreti",
"vault.max_versions": "Max. versioni",
"vault.audit_retention": "Conservazione audit",
"vault.unlimited": "Illimitato"
}

View File

@@ -4211,5 +4211,11 @@
"admin.plugins.license_grace": "Grace Period",
"admin.plugins.license_invalid": "Invalid",
"admin.plugins.license_not_required": "Free",
"admin.plugins.none": "No plugins loaded"
"admin.plugins.none": "No plugins loaded",
"vault.license": "ライセンス",
"vault.license_tier": "ティア",
"vault.max_secrets": "最大シークレット数",
"vault.max_versions": "最大バージョン数",
"vault.audit_retention": "監査保持期間",
"vault.unlimited": "無制限"
}

View File

@@ -2226,5 +2226,11 @@
"admin.plugins.license_grace": "Grace Period",
"admin.plugins.license_invalid": "Invalid",
"admin.plugins.license_not_required": "Free",
"admin.plugins.none": "No plugins loaded"
"admin.plugins.none": "No plugins loaded",
"vault.license": "라이선스",
"vault.license_tier": "티어",
"vault.max_secrets": "최대 시크릿",
"vault.max_versions": "최대 버전",
"vault.audit_retention": "감사 보존",
"vault.unlimited": "무제한"
}

View File

@@ -4009,5 +4009,11 @@
"admin.plugins.license_grace": "Grace Period",
"admin.plugins.license_invalid": "Invalid",
"admin.plugins.license_not_required": "Free",
"admin.plugins.none": "No plugins loaded"
"admin.plugins.none": "No plugins loaded",
"vault.license": "Licença",
"vault.license_tier": "Nível",
"vault.max_secrets": "Máx. segredos",
"vault.max_versions": "Máx. versões",
"vault.audit_retention": "Retenção de auditoria",
"vault.unlimited": "Ilimitado"
}

View File

@@ -3818,5 +3818,11 @@
"admin.plugins.license_grace": "Grace Period",
"admin.plugins.license_invalid": "Invalid",
"admin.plugins.license_not_required": "Free",
"admin.plugins.none": "No plugins loaded"
"admin.plugins.none": "No plugins loaded",
"vault.license": "Лицензия",
"vault.license_tier": "Уровень",
"vault.max_secrets": "Макс. секретов",
"vault.max_versions": "Макс. версий",
"vault.audit_retention": "Хранение аудита",
"vault.unlimited": "Неограниченно"
}

View File

@@ -4230,5 +4230,11 @@
"admin.plugins.license_grace": "Grace Period",
"admin.plugins.license_invalid": "Invalid",
"admin.plugins.license_not_required": "Free",
"admin.plugins.none": "No plugins loaded"
"admin.plugins.none": "No plugins loaded",
"vault.license": "许可证",
"vault.license_tier": "层级",
"vault.max_secrets": "最大密钥数",
"vault.max_versions": "最大版本数",
"vault.audit_retention": "审计保留",
"vault.unlimited": "无限制"
}

View File

@@ -4138,5 +4138,11 @@
"admin.plugins.license_grace": "Grace Period",
"admin.plugins.license_invalid": "Invalid",
"admin.plugins.license_not_required": "Free",
"admin.plugins.none": "No plugins loaded"
"admin.plugins.none": "No plugins loaded",
"vault.license": "授權",
"vault.license_tier": "層級",
"vault.max_secrets": "最大密鑰數",
"vault.max_versions": "最大版本數",
"vault.audit_retention": "稽核保留",
"vault.unlimited": "無限制"
}

View File

@@ -1,18 +1,57 @@
<div class="four wide column">
<div class="ui fluid vertical menu">
<div class="header item">
{{svg "octicon-key" 16}} {{ctx.Locale.Tr "vault.title"}}
<div class="header item tw-flex tw-items-center tw-justify-between">
<span>{{svg "octicon-key" 16}} {{ctx.Locale.Tr "vault.title"}}</span>
{{if .VaultTier}}
<span class="ui tiny {{if eq .VaultTier "enterprise"}}purple{{else if eq .VaultTier "pro"}}blue{{else}}grey{{end}} label">{{.VaultTier}}</span>
{{end}}
</div>
<a class="{{if .PageIsVaultSecrets}}active {{end}}item" href="{{.RepoLink}}/vault">
{{svg "octicon-lock" 16}} {{ctx.Locale.Tr "vault.secrets"}}
<div class="tw-font-semibold">{{svg "octicon-lock" 16}} {{ctx.Locale.Tr "vault.secrets"}}</div>
<div class="tw-text-xs text grey tw-mt-1">{{ctx.Locale.Tr "vault.secrets_description"}}</div>
</a>
{{if .IsRepoAdmin}}
{{if or .CanWrite .IsRepoAdmin}}
<a class="{{if .PageIsVaultAudit}}active {{end}}item" href="{{.RepoLink}}/vault/audit">
{{svg "octicon-log" 16}} {{ctx.Locale.Tr "vault.audit"}}
<div class="tw-font-semibold">{{svg "octicon-log" 16}} {{ctx.Locale.Tr "vault.audit"}}</div>
<div class="tw-text-xs text grey tw-mt-1">{{ctx.Locale.Tr "vault.audit_description"}}</div>
</a>
<a class="{{if .PageIsVaultTokens}}active {{end}}item" href="{{.RepoLink}}/vault/tokens">
{{svg "octicon-key-asterisk" 16}} {{ctx.Locale.Tr "vault.tokens"}}
<div class="tw-font-semibold">{{svg "octicon-key-asterisk" 16}} {{ctx.Locale.Tr "vault.tokens"}}</div>
<div class="tw-text-xs text grey tw-mt-1">{{ctx.Locale.Tr "vault.tokens_description"}}</div>
</a>
{{end}}
</div>
{{/* License Info Card */}}
{{if .VaultLicenseInfo}}
<div class="ui segment tw-mt-4">
<h5 class="ui header tw-mb-2">
{{svg "octicon-shield-check" 16}} {{ctx.Locale.Tr "vault.license"}}
</h5>
<div class="tw-text-sm">
<div class="tw-flex tw-justify-between tw-mb-1">
<span class="text grey">{{ctx.Locale.Tr "vault.license_tier"}}</span>
<span class="tw-font-semibold">{{if eq .VaultTier "enterprise"}}Enterprise{{else if eq .VaultTier "pro"}}Pro{{else}}Solo{{end}}</span>
</div>
{{if .MaxSecretsPerRepo}}
<div class="tw-flex tw-justify-between tw-mb-1">
<span class="text grey">{{ctx.Locale.Tr "vault.max_secrets"}}</span>
<span>{{if eq .MaxSecretsPerRepo -1}}{{ctx.Locale.Tr "vault.unlimited"}}{{else}}{{.MaxSecretsPerRepo}}{{end}}</span>
</div>
{{end}}
{{if .MaxVersions}}
<div class="tw-flex tw-justify-between tw-mb-1">
<span class="text grey">{{ctx.Locale.Tr "vault.max_versions"}}</span>
<span>{{if .HasUnlimitedVersions}}{{ctx.Locale.Tr "vault.unlimited"}}{{else}}{{.MaxVersions}}{{end}}</span>
</div>
{{end}}
{{if .AuditRetentionDays}}
<div class="tw-flex tw-justify-between">
<span class="text grey">{{ctx.Locale.Tr "vault.audit_retention"}}</span>
<span>{{.AuditRetentionDays}} {{ctx.Locale.Tr "vault.days"}}</span>
</div>
{{end}}
</div>
</div>
{{end}}
</div>