Bumps @appwrite.io/console SDK to 35c3dea which introduces the Organization
class. All projects.list/create/update calls are now routed through
sdk.forConsole.organization(orgId) so requests carry the
X-Appwrite-Organization header required by the new API contract.
The plan summary table used a hardcoded `addon_<key> -> label` lookup
to render addon line items, with a fallback that called every unknown
addon an "overage". Switch to reading `addon.name` from the API
response, which the aggregation endpoint now populates from the addon
catalog.
The hardcoded map stays as a fallback for older cloud builds that
don't yet send `addon.name`, and a plain resourceId is the final
fallback in place of the misleading "overage (N)" string.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The cloud backend (already merged) now cancels pending/failed invoices on
organization delete instead of throwing BILLING_INVOICE_PENDING. The
console was still gating the delete modal via the unpaid-invoices branch
of the delete-estimation endpoint, which rendered an alternate view
without the org-name confirmation input and left the Delete button
permanently disabled.
Drop the estimation-based gate (and the now-unused estimation fetch,
component, and import) so the confirm-name form always renders. The
backend will cancel any failed invoices server-side as part of the
delete. The informational upcoming-invoice Alert is preserved.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace generic error display for 402 responses with a dedicated
budget limit error page. Includes a 'Go to billing' CTA when an
organization is in context, and a 'Change organization' secondary
action on both console-level and project-level error pages.
Optional fields (senderEmail, replyToEmail, senderName, replyToName,
username, password) could not be cleared once set. The frontend used
|| undefined which silently dropped empty strings, so the backend
never received "" and the old value persisted on reload.
smtp/+page.svelte:
- Use ?? undefined instead of || undefined so empty strings are sent
- Fix isButtonDisabled deepEqual comparison: normalize types on both
sides (?? '' for strings, ?? null for port, normalizeSecure() for
secure) to avoid false positives from null/undefined mismatches
- Derive project from data.project so it stays reactive after
invalidate() — fixes button not disabling after save without reload
- Remove second $effect that cleared fields on disable, which fought
the first effect and kept the button permanently enabled
emailTemplate.svelte:
- Use ?? undefined instead of || undefined for sender/reply fields
- Add disabled={!isSmtpEnabled} to replyToEmail and replyToName,
matching the existing behaviour of senderName and senderEmail