import { i18n } from '../i18n'; const t = i18n.t; export class SimpleRequired { required = true; trigger = 'blur'; name?: string; selection?: boolean; validator = (rule: any, value: any, callback: any) => { if (value == null || value === '') { const k = this.selection ? 'rule.pleaseSelect' : 'rule.pleaseEnter'; const msg = this.name ? t(k) + t(this.name).toLowerCase() : t('rule.notNull'); callback(new Error(msg)); } callback(); }; constructor(name?: string, selection?: boolean) { this.name = name; this.selection = selection; selection && (this.trigger = 'change'); } } export class SimpleCharacter { max: number; min?: number; trigger: string = 'blur'; validator = (rule: any, value: any, callback: any) => { if (value == null || value === '') { callback(); } else if (value.length > this.max) { callback(new Error(t('rule.maxLen', [this.max]))); } else if (this.min && value.length < this.min) { callback(new Error(t('rule.minLen', [this.min]))); } callback(); }; constructor(max?: number, min?: number) { this.max = max || 255; this.min = min; } } export class Character { pattern: RegExp; trigger = 'blur'; validator = (rule: any, value: any, callback: any) => { if (value == null || value === '') { callback(); } else if (!this.pattern.test(value)) { callback(new Error(t('rule.formatErr'))); } callback(); }; constructor(pattern: RegExp) { this.pattern = pattern; } } export class SimpleNumber { trigger: string = 'blur'; min?: number; max?: number; validator = (rule: any, value: any, callback: any) => { if (value == null || value === '') { callback(); } if (!new RegExp(/^(0|-?[1-9]\d*)$/).test(value)) { const msg = t('rule.pleaseEnter') + t('rule.int').toLowerCase(); callback(new Error(msg)); } const num = parseInt(value); if (rule.min != null && num < rule.min) { callback(new Error(t('rule.min', [this.min]))); } if (this.max != null && num > this.max) { callback(new Error(t('rule.max', [this.max]))); } callback(); }; constructor(min?: number, max?: number) { this.min = min; this.max = max; } } export class Hexadecimal { trigger = 'blur'; min?: Number; max?: Number; validator = (rule: any, value: any, callback: any) => { if (value == null) { callback(); } else if (value.trim().length == 0 || !new RegExp(/^[0-9a-fA-F\s]+$/).test(value)) { callback(new Error(t('rule.hexadecimal'))); } else if (this.min != null && value.length < this.min) { callback(new Error(t('rule.minLen', [this.min]))); } else if (this.max != null && value.length > this.max) { callback(new Error(t('rule.maxLen', [this.max]))); } else { callback(); } }; constructor(min?: number, max?: Number) { this.min = min; this.max = max; } } export class Longitude extends Character { constructor() { super(new RegExp(/^-?((0|1?[0-7]?[0-9]?)(([.][0-9]{1,6})?)|180(([.][0]{1,6})?))$/)); } } export class Latitude extends Character { constructor() { super(new RegExp(/^[\-\+]?((0|([1-8]\d?))(\.\d{1,10})?|90(\.0{1,10})?)$/)); } } export class Email extends Character { constructor() { super(new RegExp(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)); } } export class Phone extends Character { constructor() { super(new RegExp(/^(0|86|17951)?(13[0-9]|15[012356789]|17[0135678]|18[0-9]|14[57])[0-9]{8}$/)); } } export class Ipv4 extends Character { constructor() { super(new RegExp(/^((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/)); } } export class Ipv6 extends Character { constructor() { super( new RegExp( /^([0-9a-fA-F]{1,4}:){7,7}([0-9a-fA-F]{1,4}|:)|([0-9a-fA-F]{1,4}:){1,6}(:[0-9a-fA-F]{1,4}|:)|([0-9a-fA-F]{1,4}:){1,5}((:[0-9a-fA-F]{1,4}){1,2}|:)|([0-9a-fA-F]{1,4}:){1,4}((:[0-9a-fA-F]{1,4}){1,3}|:)|([0-9a-fA-F]{1,4}:){1,3}((:[0-9a-fA-F]{1,4}){1,4}|:)|([0-9a-fA-F]{1,4}:){1,2}((:[0-9a-fA-F]{1,4}){1,5}|:)|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6}|:)|:((:[0-9a-fA-F]{1,4}){1,7}|:)/ ) ); } } export class IdCard { trigger = 'blur'; validator = (rule: any, value: any, callback: any) => { if (value != null && value.length != 0) { let iSum = 0; const aCity = { 11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江', 31: '上海', 32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西', 37: '山东', 41: '河南', 42: '湖北', 43: '湖南', 44: '广东', 45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏', 65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外', }; if (!/^\d{17}(\d|x)$/i.test(value)) { callback(t('rule.idCard.format')); } value = value.replace(/x$/i, 'a'); if (aCity[parseInt(value.substr(0, 2))] == null) { callback(new Error(t('rule.idCard.area'))); } const sBirthday = value.substr(6, 4) + '-' + Number(value.substr(10, 2)) + '-' + Number(value.substr(12, 2)); const d = new Date(sBirthday.replace(/-/g, '/')); if (sBirthday != d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate()) { callback(new Error(t('rule.idCard.birth'))); } for (let i = 17; i >= 0; i--) { iSum += (Math.pow(2, i) % 11) * parseInt(value.charAt(17 - i), 11); } if (iSum % 11 != 1) { callback(new Error(t('rule.idCard.error'))); } } callback(); }; } export class SimplePassword { required: boolean = true; trigger = 'blur'; min?: Number = 8; max?: Number = 16; validator = (rule: any, value: any, callback: any) => { if (value == null || value === '') { callback(new Error(t('rule.pleaseEnter') + t('pwd.pwd').toLowerCase())); } else if (value.length < 6 || value.length > 18) { callback(new Error(t('pwd.length', [6, 18]))); } else if (!new RegExp('^[^ ]+$').test(value)) { callback(new Error(t('pwd.noSpace'))); } callback(); }; } export class Username { required: boolean = true; trigger = 'blur'; min?: Number = 4; max?: Number = 16; validator = (rule: any, value: any, callback: any) => { if (value != null && value.length != 0) { if (!new RegExp('^[a-zA-Z0-9]{4,16}$').test(value)) { callback(new Error(t('rule.username.0'))); } if (/(^\_)|(\__)|(\_+$)/.test(value)) { callback(new Error(t('rule.username.1'))); } if (!new RegExp('^[^ ]+$').test(value)) { callback(new Error(t('rule.username.2'))); } } callback(); }; } export class Password { required: boolean = true; trigger = 'blur'; min?: Number = 8; max?: Number = 16; validator = (rule: any, value: any, callback: any) => { if (value == null || value === '') { callback(new Error(t('rule.pleaseEnter') + t('pwd.pwd').toLowerCase())); } else if (value.length < 8 || value.length > 20) { callback(new Error(t('pwd.length', [8, 20]))); } else if (!new RegExp('^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$').test(value)) { callback(new Error(t('pwd.required'))); } else if (!new RegExp('^[^ ]+$').test(value)) { callback(new Error(t('pwd.noSpace'))); } callback(); }; } export class Name { pattern: RegExp = new RegExp('^[a-zA-Z\u4e00-\u9fa5]{1,10}$'); trigger = 'blur'; validator = (rule: any, value: any, callback: any) => { if (value != null && value.length != 0 && !this.pattern.test(value)) { callback(new Error(t('rule.name'))); } callback(); }; }