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
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:
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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é"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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": "無制限"
|
||||
}
|
||||
@@ -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": "무제한"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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": "Неограниченно"
|
||||
}
|
||||
@@ -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": "无限制"
|
||||
}
|
||||
@@ -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": "無限制"
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user