This commit is contained in:
2026-07-02 00:34:07 +03:30
parent e097f6b2bb
commit a41dd6ef9e
12 changed files with 93 additions and 26 deletions
+30 -16
View File
@@ -38,6 +38,7 @@ import { persianToEnglishDigits } from '@/utils/persianDigits'
export const mobileValidation = (title?: string): Rule => {
const label = title ?? 'شماره تلفن'
return {
transform: (value) => persianToEnglishDigits(String(value ?? '').trim()),
validator: (_rule, value) => {
const normalized = persianToEnglishDigits(String(value ?? '').trim())
if (!normalized) {
@@ -94,14 +95,20 @@ const isValidNationalCode = (code) => {
return +chars[9] === lastDigit
}
export const requireNationalCode = (code?: string) => {
return {required: true, validator: validateNCode, trigger: 'change'}
return {
required: true,
transform: (value) => persianToEnglishDigits(String(value ?? '').trim()),
validator: validateNCode,
trigger: 'change',
}
}
async function validateNCode(rule: Rule, value: any) {
if (!value) {
const normalized = persianToEnglishDigits(String(value ?? '').trim())
if (!normalized) {
return Promise.reject('وارد کردن کد ملی الزامیست')
}
if (isValidNationalCode(value)) return Promise.resolve()
if (isValidNationalCode(normalized)) return Promise.resolve()
else return Promise.reject('کد ملی وارد شده نامعتبر است')
}
@@ -153,13 +160,16 @@ let isBuyP=true
let NumP=0
let groupTypeP: string | undefined
let meltedBalanceP = 0
const checkNumber = async (_rule: Rule, value: number) => {
if (!value) {
const checkNumber = async (_rule: Rule, value: number | string) => {
const normalizedRaw = persianToEnglishDigits(String(value ?? '').trim())
if (!normalizedRaw) {
return Promise.reject('تعداد محصول را مشخص کنید');
}
if (value % 1 !== 0) {
const numericValue = Number(normalizedRaw)
if (!Number.isFinite(numericValue)) {
return Promise.reject('تعداد محصول را مشخص کنید');
}
if (numericValue % 1 !== 0) {
return Promise.reject('استفاده از اعداد اعشاری مجاز نمی باشد')
}
if (isBuyP){
@@ -170,14 +180,14 @@ if (isBuyP){
if (!meltedBalanceP && isMainMetalWalletDealMethod(methodP)){
return Promise.reject(getInsufficientGoldWalletMessage(groupTypeP, methodP))
}
if (priceP * value > availableCash && isCashLikeDealMethod(methodP))
if (priceP * numericValue > availableCash && isCashLikeDealMethod(methodP))
return Promise.reject(getInsufficientCashWalletMessage(groupTypeP))
if (amountP * value > meltedBalanceP && isMainMetalWalletDealMethod(methodP))
if (amountP * numericValue > meltedBalanceP && isMainMetalWalletDealMethod(methodP))
return Promise.reject(getInsufficientGoldWalletMessage(groupTypeP, methodP))
else
return Promise.resolve();
}else {
if (value > NumP)
if (numericValue > NumP)
return Promise.reject('موجودی محصول ناکافی است')
else
return Promise.resolve();
@@ -200,6 +210,7 @@ export const justNumber2 = (
meltedBalanceP = meltedBalance ?? 0
return {
required: true,
transform: (value) => persianToEnglishDigits(String(value ?? '').trim()),
validator: checkNumber,
trigger: 'change'
}
@@ -211,6 +222,7 @@ export const justNumber3 = (price: number, Num?:number ,isBuy?:boolean) => {
isBuyP=isBuy
return {
required: true,
transform: (value) => persianToEnglishDigits(String(value ?? '').trim()),
validator: checkNumber,
trigger: 'change'
}
@@ -233,14 +245,16 @@ export const guideTypePassword = ref<{}>({
export const passwordRules = () => {
return [
{
transform: (value) => persianToEnglishDigits(String(value ?? '')),
validator: (rule: Rule, value: any) => {
if (value.length < 6) {
const normalized = persianToEnglishDigits(String(value ?? ''))
if (normalized.length < 6) {
return Promise.reject('رمز عبور حداقل 6 رقم')
}
const lengthCriteria = value.length >= 8
const letterCriteria = /[A-Za-z]/.test(value)
const numberCriteria = /\d/.test(value)
const specialCharacterCriteria = /[@$!%*#?&]/.test(value)
const lengthCriteria = normalized.length >= 8
const letterCriteria = /[A-Za-z]/.test(normalized)
const numberCriteria = /\d/.test(normalized)
const specialCharacterCriteria = /[@$!%*#?&]/.test(normalized)
const criteriaMet = [
lengthCriteria,
letterCriteria,
+24 -2
View File
@@ -19,11 +19,33 @@ export function shouldNormalizeInputDigits(options: {
inputmode?: string
}): boolean {
if (options.isPassword) {
return false
return true
}
if (options.type === 'price' || options.type === 'number') {
const type = String(options.type ?? '').trim().toLowerCase()
if (type === 'price' || type === 'number' || type === 'tel') {
return true
}
const mode = String(options.inputmode ?? '').trim().toLowerCase()
return mode === 'numeric' || mode === 'decimal' || mode === 'number'
}
/** تبدیل ارقام فارسی/عربی در فیلدهای عددی فرم‌های احراز هویت و پروفایل */
export function normalizeAuthFormFields(fields: {
mobile?: string | null
password?: string | null
token?: string | null
n_code?: string | number | null
}) {
if (fields.mobile != null && fields.mobile !== '') {
fields.mobile = persianToEnglishDigits(String(fields.mobile).trim())
}
if (fields.password != null && fields.password !== '') {
fields.password = persianToEnglishDigits(String(fields.password))
}
if (fields.token != null && fields.token !== '') {
fields.token = persianToEnglishDigits(String(fields.token).trim())
}
if (fields.n_code != null && fields.n_code !== '') {
fields.n_code = persianToEnglishDigits(String(fields.n_code).trim())
}
}