From bbbedc60595f6718ceb8472eba20b6b11bc54a20 Mon Sep 17 00:00:00 2001 From: Mahdi Date: Mon, 19 Oct 2026 21:47:17 +0330 Subject: [PATCH] fix: polish SMS header chip and add deposit info in adm panel Tighten the wallet chip layout and let super-admins set charge deposit details shown in the header charge modal. --- apps/web/src/components/SmsHeaderWallet.vue | 312 ++++++++++++++++---- apps/web/src/layouts/AppLayout.vue | 2 +- apps/web/src/views/adm/AdmSmsView.vue | 69 ++++- 3 files changed, 322 insertions(+), 61 deletions(-) diff --git a/apps/web/src/components/SmsHeaderWallet.vue b/apps/web/src/components/SmsHeaderWallet.vue index 3420214..15a4191 100644 --- a/apps/web/src/components/SmsHeaderWallet.vue +++ b/apps/web/src/components/SmsHeaderWallet.vue @@ -10,6 +10,7 @@ const summary = ref(null); const loading = ref(false); const chargeOpen = ref(false); const warnOpen = ref(false); +const copyHint = ref(''); const NEGATIVE_KEY = 'mento_sms_negative_warning_shown'; const visible = computed(() => Boolean(summary.value?.billingEnabled)); @@ -27,6 +28,42 @@ const toneClass = computed(() => { return 'ok'; }); +const chargeInfo = computed(() => summary.value?.chargeInfo ?? null); + +function normalizeCopyText(value: string) { + const persianDigits = '۰۱۲۳۴۵۶۷۸۹'; + const arabicDigits = '٠١٢٣٤٥٦٧٨٩'; + return value + .replace(/[\u06F0-\u06F9]/g, (digit) => String(persianDigits.indexOf(digit))) + .replace(/[\u0660-\u0669]/g, (digit) => String(arabicDigits.indexOf(digit))) + .replace(/\s+/g, ''); +} + +function formatCardDisplay(value: string) { + const digits = normalizeCopyText(value); + if (!digits) return '—'; + return digits.replace(/(\d{4})(?=\d)/g, '$1 ').trim(); +} + +async function copyValue(label: string, value: string) { + const text = normalizeCopyText(value); + if (!text) { + copyHint.value = `${label} ثبت نشده است`; + return; + } + try { + await navigator.clipboard.writeText(text); + copyHint.value = `${label} کپی شد`; + } catch { + copyHint.value = 'کپی انجام نشد'; + } +} + +function closeCharge() { + chargeOpen.value = false; + copyHint.value = ''; +} + async function load() { if (!auth.isAuthenticated || !auth.user?.organizationId) { summary.value = null; @@ -79,39 +116,58 @@ defineExpose({ refresh: load });