UNPKG

vue-django

Version:

个人实验项目, 本框架的目标是借鉴并超越django admin的自动化思想, 实现UI前端的极简快速定制开发

133 lines (124 loc) 3.23 kB
/** * Created by denishuang on 2019/8/25. */ import arrayNormalize from '../../utils/array_normalize' export const defaultProps = { value: Object, actions: Array, items: {type: Array, default: () => []}, groups: { type: Array, default: () => [] }, url: String, method: { type: String, default: 'post' }, options: { type: Object, default: () => { return {} } }, submitName: { type: String, default: '提交' } } export function joinErrors(errors) { let es = {} for (let n in errors) { es[n] = errors[n].join('') } return es } export function defaultWidget(f) { if ('choice' === f.type && f.choices) { let size = f.choices.length return size <= 2 ? 'switch' : (size <= 4 ? 'radio' : 'select') } if(f.read_only && !f.choices) { return 'readonly' } return f.type === 'boolean' ? 'switch' : (['date', 'datetime', 'time'].includes(f.type) ? f.type : ( ['integer', 'decimal'].includes(f.type) ? 'number' : 'text')) } export function defaultRuleType(f) { if (f.multiple) { return 'array' } if (f.choices && f.choices.length > 0) { let v = f.choices[0][0] || f.choices[0]['value'] if(v) { return typeof v } } let rt = f.model ? 'number' : (['field', 'time', 'datetime'].includes(f.type) ? 'string' : (['integer', 'decimal'].includes(f.type) ? 'number' : f.type)) return rt } export function defaultSpan(f) { return f.widget === 'textarea' ? {xs: 24, sm: 24, md: 24, lg: 24, xl: 24} : { xs: 24, sm: 24, md: 12, lg: 12, xl: 8 } } export function defaultRules(f) { let rs = [] if (f.required) { rs.push({ type: defaultRuleType(f), required: true, message: `不能为空` }) } if (f.min_length) { rs.push({min: f.min_length, message: `长度最小为${f.min_length}`}) } if (f.max_length) { rs.push({max: f.max_length, message: `长度最大为${f.max_length}`}) } // console.log(f.name, rs) return rs } export function normalizeItem(i) { let a = Object.assign({}, i) a.label = a.label || a.name a.rules = a.rules || defaultRules(a) a.widget = a.widget || defaultWidget(a) let sp = a.span a.span = sp && (typeof sp === 'number' && {xs: sp, sm: sp, md: sp, lg: sp, xl: sp} || sp) || {} a.span = Object.assign({}, defaultSpan(a), a.span) return a } export function normalizeItems(items) { return arrayNormalize(items, {}, normalizeItem) } export function getItemRules(items) { let d = {} Object.keys(items).forEach((i) => { let f = items[i] let n = f.name let rs = d[n] = f.rules || [] rs.concat(defaultRules(f)) }) return d } export function flatAllGroupItems(gs) { let rs = [] gs.forEach(g => { rs = rs.concat(g.items) }) return rs } export default { defaultRules, defaultRuleType, defaultSpan, defaultWidget, defaultProps, normalizeItem, normalizeItems, getItemRules, joinErrors }