From 167bb50f4f7d367d4d811dcaf8659c85d10ac6a9 Mon Sep 17 00:00:00 2001 From: Samir Boulahtit Date: Thu, 19 Feb 2026 16:56:25 +0100 Subject: [PATCH] fix: replace all native confirm() dialogs with styled modal macros Migrated ~68 native browser confirm() calls across 74 files to use the project's confirm_modal/confirm_modal_dynamic Jinja2 macros, providing consistent styled confirmation dialogs instead of plain browser popups. Modules updated: core, tenancy, cms, marketplace, messaging, billing, customers, orders, cart. Uses danger/warning/info variants and double-confirm pattern for destructive delete operations. Co-Authored-By: Claude Opus 4.6 --- .../static/shared/js/upgrade-prompts.js | 29 ++++++---- .../billing/static/store/js/billing.js | 6 +-- .../billing/static/store/js/invoices.js | 15 ++---- .../billing/merchant/subscription-detail.html | 10 ++-- .../templates/billing/store/billing.html | 7 ++- .../cart/templates/cart/storefront/cart.html | 12 +++-- .../cms/static/admin/js/content-pages.js | 28 +++++++--- .../cms/static/store/js/content-page-edit.js | 11 ++-- .../cms/static/store/js/content-pages.js | 18 ++++--- app/modules/cms/static/store/js/media.js | 5 +- .../templates/cms/admin/content-pages.html | 25 ++++++++- .../cms/store/content-page-edit.html | 15 +++++- .../templates/cms/store/content-pages.html | 14 ++++- .../cms/templates/cms/store/media.html | 15 +++++- .../core/static/admin/js/my-menu-config.js | 10 +--- app/modules/core/static/admin/js/settings.js | 10 +--- .../templates/core/admin/my-menu-config.html | 30 ++++++++++- .../core/templates/core/admin/settings.html | 29 +++++++++- .../customers/static/admin/js/customers.js | 9 ++-- .../templates/customers/admin/customers.html | 6 ++- .../marketplace/static/admin/js/letzshop.js | 7 ++- .../static/admin/js/marketplace-letzshop.js | 23 ++++---- .../marketplace/static/store/js/letzshop.js | 19 +++---- .../templates/marketplace/admin/letzshop.html | 7 ++- .../admin/marketplace-letzshop.html | 21 ++++++-- .../partials/letzshop-exceptions-tab.html | 2 +- .../admin/partials/letzshop-orders-tab.html | 2 +- .../admin/partials/letzshop-settings-tab.html | 2 +- .../templates/marketplace/store/letzshop.html | 17 ++++-- .../messaging/static/admin/js/messages.js | 5 +- .../static/admin/js/notifications.js | 8 +-- .../static/store/js/email-templates.js | 7 ++- .../messaging/static/store/js/messages.js | 5 +- .../static/store/js/notifications.js | 8 +-- .../templates/messaging/admin/messages.html | 7 ++- .../messaging/admin/notifications.html | 6 ++- .../messaging/store/email-templates.html | 7 ++- .../templates/messaging/store/messages.html | 7 ++- .../messaging/store/notifications.html | 7 ++- .../templates/orders/store/invoices.html | 12 +++-- .../static/admin/js/admin-user-detail.js | 25 ++++----- .../static/admin/js/admin-user-edit.js | 31 ++++------- .../tenancy/static/admin/js/admin-users.js | 20 ++++--- .../static/admin/js/merchant-detail.js | 25 +++++---- .../tenancy/static/admin/js/merchant-edit.js | 39 +++++++------- .../static/admin/js/merchant-user-detail.js | 25 ++++----- .../tenancy/static/admin/js/merchant-users.js | 27 ++++------ .../tenancy/static/admin/js/merchants.js | 22 ++++---- .../static/admin/js/platform-menu-config.js | 10 +--- .../static/admin/js/platform-modules.js | 10 +--- .../tenancy/static/admin/js/store-detail.js | 29 +++++----- .../tenancy/static/admin/js/store-edit.js | 42 ++++++--------- .../tenancy/static/admin/js/store-theme.js | 7 +-- app/modules/tenancy/static/admin/js/stores.js | 18 ++++--- .../tenancy/static/admin/js/user-detail.js | 25 ++++----- .../tenancy/static/admin/js/user-edit.js | 25 ++++----- app/modules/tenancy/static/admin/js/users.js | 36 ++++++------- .../tenancy/admin/admin-user-detail.html | 41 +++++++++++++- .../tenancy/admin/admin-user-edit.html | 54 +++++++++++++++++-- .../templates/tenancy/admin/admin-users.html | 27 +++++++++- .../tenancy/admin/merchant-detail.html | 25 ++++++++- .../tenancy/admin/merchant-edit.html | 51 ++++++++++++++++-- .../tenancy/admin/merchant-user-detail.html | 38 ++++++++++++- .../tenancy/admin/merchant-users.html | 41 +++++++++++++- .../templates/tenancy/admin/merchants.html | 14 ++++- .../tenancy/admin/module-config.html | 6 ++- .../tenancy/admin/platform-menu-config.html | 29 +++++++++- .../tenancy/admin/platform-modules.html | 29 +++++++++- .../templates/tenancy/admin/store-detail.html | 27 +++++++++- .../templates/tenancy/admin/store-edit.html | 53 +++++++++++++++++- .../templates/tenancy/admin/store-theme.html | 15 +++++- .../templates/tenancy/admin/stores.html | 15 +++++- app/templates/store/base.html | 4 ++ static/admin/js/module-config.js | 7 ++- 74 files changed, 939 insertions(+), 436 deletions(-) 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