diff --git a/app/modules/billing/static/shared/js/upgrade-prompts.js b/app/modules/billing/static/shared/js/upgrade-prompts.js index be8284e6..b6910888 100644 --- a/app/modules/billing/static/shared/js/upgrade-prompts.js +++ b/app/modules/billing/static/shared/js/upgrade-prompts.js @@ -42,6 +42,11 @@ loaded: false, error: null, + // Limit reached modal state + showLimitReachedConfirm: false, + limitReachedMessage: '', + limitReachedUpgradeUrl: null, + // Computed-like getters get hasLimitsApproaching() { return this.usage?.has_limits_approaching || false; @@ -193,18 +198,24 @@ const limitName = limitNames[limitType] || limitType; const message = response.message || `You've reached your ${limitName} limit.`; - // Use browser confirm for simplicity - could be replaced with custom modal - const shouldUpgrade = confirm( - `${message}\n\n` + - `Current: ${response.current}/${response.limit}\n\n` + + const details = `${message} Current usage: ${response.current}/${response.limit}. ` + (response.upgrade_tier_name - ? `Upgrade to ${response.upgrade_tier_name} to get more ${limitName}.\n\nGo to billing page?` - : 'Contact support for more capacity.') - ); + ? `Upgrade to ${response.upgrade_tier_name} to get more ${limitName}.` + : 'Contact support for more capacity.'); - if (shouldUpgrade && response.upgrade_tier_code) { - window.location.href = this.getBillingUrl(); + this.limitReachedMessage = details; + this.limitReachedUpgradeUrl = response.upgrade_tier_code ? this.getBillingUrl() : null; + this.showLimitReachedConfirm = true; + }, + + /** + * Handle upgrade confirmation from limit reached modal + */ + confirmUpgrade() { + if (this.limitReachedUpgradeUrl) { + window.location.href = this.limitReachedUpgradeUrl; } + this.showLimitReachedConfirm = false; }, /** diff --git a/app/modules/billing/static/store/js/billing.js b/app/modules/billing/static/store/js/billing.js index 92584f93..bb7a8917 100644 --- a/app/modules/billing/static/store/js/billing.js +++ b/app/modules/billing/static/store/js/billing.js @@ -22,6 +22,8 @@ function storeBilling() { showTiersModal: false, showAddonsModal: false, showCancelModal: false, + showCancelAddonConfirm: false, + pendingCancelAddon: null, showSuccessMessage: false, showCancelMessage: false, showAddonSuccessMessage: false, @@ -172,10 +174,6 @@ function storeBilling() { }, async cancelAddon(addon) { - if (!confirm(`Are you sure you want to cancel ${addon.addon_name}?`)) { - return; - } - try { await apiClient.delete(`/store/billing/addons/${addon.id}`); Utils.showToast(I18n.t('billing.messages.addon_cancelled_successfully'), 'success'); diff --git a/app/modules/billing/static/store/js/invoices.js b/app/modules/billing/static/store/js/invoices.js index f0949281..01e81353 100644 --- a/app/modules/billing/static/store/js/invoices.js +++ b/app/modules/billing/static/store/js/invoices.js @@ -68,6 +68,11 @@ function storeInvoices() { status: '' }, + // Update status confirm state + showUpdateStatusConfirm: false, + pendingStatusInvoice: null, + pendingNewStatus: null, + // Create invoice modal showCreateModal: false, createForm: { @@ -291,16 +296,6 @@ function storeInvoices() { * Update invoice status */ async updateStatus(invoice, newStatus) { - const statusLabels = { - 'issued': 'mark as issued', - 'paid': 'mark as paid', - 'cancelled': 'cancel' - }; - - if (!confirm(`Are you sure you want to ${statusLabels[newStatus] || newStatus} this invoice?`)) { - return; - } - try { await apiClient.put(`/store/invoices/${invoice.id}/status`, { status: newStatus diff --git a/app/modules/billing/templates/billing/merchant/subscription-detail.html b/app/modules/billing/templates/billing/merchant/subscription-detail.html index 7c1a536a..a281c3f4 100644 --- a/app/modules/billing/templates/billing/merchant/subscription-detail.html +++ b/app/modules/billing/templates/billing/merchant/subscription-detail.html @@ -1,5 +1,6 @@ {# app/modules/billing/templates/billing/merchant/subscription-detail.html #} {% extends "merchant/base.html" %} +{% from 'shared/macros/modals.html' import confirm_modal %} {% block title %}Subscription Details{% endblock %} @@ -119,7 +120,7 @@ Current Plan