Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 666dd64580 | |||
| 188bef2ece | |||
| 57258bca92 |
@@ -199,7 +199,7 @@ export default async function TenantDetailPage({
|
||||
<h2 className="text-xs font-semibold uppercase tracking-wider text-text-muted mb-3">
|
||||
{t("usage")}
|
||||
</h2>
|
||||
<UsageDisplay tenant={name} />
|
||||
<UsageDisplay tenant={name} canEditBudget={canEdit} />
|
||||
</section>
|
||||
|
||||
{/* Packages */}
|
||||
|
||||
@@ -127,11 +127,29 @@ export function BudgetEditableCard({
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setOpen(true)}
|
||||
className="bg-surface-1 border border-border rounded-xl p-4 text-left hover:border-text-secondary transition-colors group"
|
||||
className="bg-surface-1 border border-accent/40 rounded-xl p-4 text-left hover:border-accent transition-colors cursor-pointer focus:outline-none focus:ring-2 focus:ring-accent/40 group block w-full"
|
||||
>
|
||||
<div className="text-xs text-text-muted mb-1 flex items-center justify-between">
|
||||
<span>{t("budget")}</span>
|
||||
<span className="text-[10px] text-text-muted opacity-0 group-hover:opacity-100 transition-opacity">
|
||||
<span className="text-[10px] text-accent inline-flex items-center gap-1">
|
||||
{/* Pencil icon — unambiguous "this is editable" affordance.
|
||||
Visible at all times (was hover-only before, which on
|
||||
touch devices and at-a-glance scanning gave no
|
||||
indication the card was clickable). */}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="11"
|
||||
height="11"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z" />
|
||||
</svg>
|
||||
{t("budgetEdit")}
|
||||
</span>
|
||||
</div>
|
||||
@@ -140,14 +158,13 @@ export function BudgetEditableCard({
|
||||
</div>
|
||||
</button>
|
||||
|
||||
{open && (
|
||||
<Modal open={open} onClose={() => setOpen(false)} ariaLabel={t("budgetEditTitle")}>
|
||||
<h3 className="font-display text-lg font-semibold text-text-primary mb-2">
|
||||
{t("budgetEditTitle")}
|
||||
</h3>
|
||||
<p className="text-sm text-text-secondary mb-4">
|
||||
{t("budgetEditDescription")}
|
||||
</p>
|
||||
<Modal open={open} onClose={() => setOpen(false)} ariaLabel={t("budgetEditTitle")}>
|
||||
<h3 className="font-display text-lg font-semibold text-text-primary mb-2">
|
||||
{t("budgetEditTitle")}
|
||||
</h3>
|
||||
<p className="text-sm text-text-secondary mb-4">
|
||||
{t("budgetEditDescription")}
|
||||
</p>
|
||||
<div className="text-xs text-amber-400 bg-amber-400/10 border border-amber-400/20 rounded-lg px-3 py-2 mb-5">
|
||||
{t("budgetOrgScopeWarning")}
|
||||
</div>
|
||||
@@ -256,7 +273,6 @@ export function BudgetEditableCard({
|
||||
</div>
|
||||
</form>
|
||||
</Modal>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -189,7 +189,22 @@
|
||||
"last30Days": "Letzte 30 Tage",
|
||||
"noData": "Keine Nutzungsdaten verfügbar.",
|
||||
"dailyBreakdown": "Tagesübersicht",
|
||||
"requests": "Anfragen"
|
||||
"requests": "Anfragen",
|
||||
"budgetEdit": "Bearbeiten",
|
||||
"budgetEditTitle": "Budget festlegen",
|
||||
"budgetEditDescription": "Begrenzen Sie, wie viel Ihre Assistenten ausgeben können, bevor Anfragen abgelehnt werden.",
|
||||
"budgetOrgScopeWarning": "Dieses Budget gilt für alle Tenants Ihrer Organisation, nicht nur für diesen. Bei mehreren Tenants teilen sich diese das Limit.",
|
||||
"budgetModeUnlimited": "Kein Limit",
|
||||
"budgetModeUnlimitedDescription": "Beliebige Ausgaben, kein Limit.",
|
||||
"budgetModeCapped": "Limit festlegen",
|
||||
"budgetModeCappedDescription": "Anfragen ablehnen, sobald die Ausgaben diesen Betrag erreichen.",
|
||||
"budgetAmount": "Betrag",
|
||||
"budgetResetCadence": "Zurücksetzen",
|
||||
"budgetCadence_30d": "Alle 30 Tage",
|
||||
"budgetCadence_1mo": "Monatlich",
|
||||
"budgetCadence_1y": "Jährlich",
|
||||
"budgetInvalid": "Bitte einen positiven Betrag eingeben.",
|
||||
"budgetSaveFailed": "Budget konnte nicht gespeichert werden. Bitte erneut versuchen."
|
||||
},
|
||||
"workspace": {
|
||||
"save": "Speichern",
|
||||
|
||||
@@ -189,7 +189,22 @@
|
||||
"last30Days": "Last 30 Days",
|
||||
"noData": "No usage data available.",
|
||||
"dailyBreakdown": "Daily Breakdown",
|
||||
"requests": "requests"
|
||||
"requests": "requests",
|
||||
"budgetEdit": "Edit",
|
||||
"budgetEditTitle": "Set spending budget",
|
||||
"budgetEditDescription": "Cap how much your assistants can spend before requests start being declined.",
|
||||
"budgetOrgScopeWarning": "This budget applies to all tenants in your organization, not just this one. If you have multiple tenants, they share the same cap.",
|
||||
"budgetModeUnlimited": "No limit",
|
||||
"budgetModeUnlimitedDescription": "Spend as much as needed; no cap.",
|
||||
"budgetModeCapped": "Set a cap",
|
||||
"budgetModeCappedDescription": "Stop accepting requests once spend reaches this amount.",
|
||||
"budgetAmount": "Amount",
|
||||
"budgetResetCadence": "Reset",
|
||||
"budgetCadence_30d": "Every 30 days",
|
||||
"budgetCadence_1mo": "Monthly",
|
||||
"budgetCadence_1y": "Yearly",
|
||||
"budgetInvalid": "Please enter a positive amount.",
|
||||
"budgetSaveFailed": "Could not save budget. Please try again."
|
||||
},
|
||||
"workspace": {
|
||||
"save": "Save",
|
||||
|
||||
@@ -189,7 +189,22 @@
|
||||
"last30Days": "30 derniers jours",
|
||||
"noData": "Aucune donnée d'utilisation disponible.",
|
||||
"dailyBreakdown": "Détail journalier",
|
||||
"requests": "requêtes"
|
||||
"requests": "requêtes",
|
||||
"budgetEdit": "Modifier",
|
||||
"budgetEditTitle": "Définir un budget",
|
||||
"budgetEditDescription": "Limitez la dépense de vos assistants avant que les requêtes ne soient refusées.",
|
||||
"budgetOrgScopeWarning": "Ce budget s'applique à tous les locataires de votre organisation, pas seulement à celui-ci. Si vous avez plusieurs locataires, ils partagent le même plafond.",
|
||||
"budgetModeUnlimited": "Aucune limite",
|
||||
"budgetModeUnlimitedDescription": "Dépense libre, sans plafond.",
|
||||
"budgetModeCapped": "Définir un plafond",
|
||||
"budgetModeCappedDescription": "Refuser les requêtes une fois ce montant atteint.",
|
||||
"budgetAmount": "Montant",
|
||||
"budgetResetCadence": "Réinitialisation",
|
||||
"budgetCadence_30d": "Tous les 30 jours",
|
||||
"budgetCadence_1mo": "Mensuelle",
|
||||
"budgetCadence_1y": "Annuelle",
|
||||
"budgetInvalid": "Veuillez saisir un montant positif.",
|
||||
"budgetSaveFailed": "Impossible d'enregistrer le budget. Veuillez réessayer."
|
||||
},
|
||||
"workspace": {
|
||||
"save": "Enregistrer",
|
||||
|
||||
@@ -189,7 +189,22 @@
|
||||
"last30Days": "Ultimi 30 giorni",
|
||||
"noData": "Nessun dato di utilizzo disponibile.",
|
||||
"dailyBreakdown": "Dettaglio giornaliero",
|
||||
"requests": "richieste"
|
||||
"requests": "richieste",
|
||||
"budgetEdit": "Modifica",
|
||||
"budgetEditTitle": "Imposta budget",
|
||||
"budgetEditDescription": "Limita quanto i tuoi assistenti possono spendere prima che le richieste vengano rifiutate.",
|
||||
"budgetOrgScopeWarning": "Questo budget si applica a tutti i tenant della tua organizzazione, non solo a questo. Se hai più tenant, condividono lo stesso limite.",
|
||||
"budgetModeUnlimited": "Nessun limite",
|
||||
"budgetModeUnlimitedDescription": "Spesa libera, nessun tetto.",
|
||||
"budgetModeCapped": "Imposta un tetto",
|
||||
"budgetModeCappedDescription": "Rifiuta le richieste una volta raggiunto questo importo.",
|
||||
"budgetAmount": "Importo",
|
||||
"budgetResetCadence": "Ripristino",
|
||||
"budgetCadence_30d": "Ogni 30 giorni",
|
||||
"budgetCadence_1mo": "Mensile",
|
||||
"budgetCadence_1y": "Annuale",
|
||||
"budgetInvalid": "Inserisci un importo positivo.",
|
||||
"budgetSaveFailed": "Impossibile salvare il budget. Riprova."
|
||||
},
|
||||
"workspace": {
|
||||
"save": "Salva",
|
||||
|
||||
Reference in New Issue
Block a user