fix: replace all native confirm() dialogs with styled modal macros
Some checks failed
CI / ruff (push) Successful in 9s
CI / validate (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / deploy (push) Has been cancelled
CI / pytest (push) Has been cancelled

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 <noreply@anthropic.com>
This commit is contained in:
2026-02-19 16:56:25 +01:00
parent 182610283d
commit 167bb50f4f
74 changed files with 939 additions and 436 deletions

View File

@@ -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;
},
/**

View File

@@ -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');

View File

@@ -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