83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
import Vue from 'vue'
 | 
						|
import { mergeRecursive } from "@/utils/ruoyi";
 | 
						|
import DictMeta from './DictMeta'
 | 
						|
import DictData from './DictData'
 | 
						|
 | 
						|
const DEFAULT_DICT_OPTIONS = {
 | 
						|
  types: [],
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @classdesc 字典
 | 
						|
 * @property {Object} label 标签对象,内部属性名为字典类型名称
 | 
						|
 * @property {Object} dict 字段数组,内部属性名为字典类型名称
 | 
						|
 * @property {Array.<DictMeta>} _dictMetas 字典元数据数组
 | 
						|
 */
 | 
						|
export default class Dict {
 | 
						|
  constructor() {
 | 
						|
    this.owner = null
 | 
						|
    this.label = {}
 | 
						|
    this.type = {}
 | 
						|
  }
 | 
						|
 | 
						|
  init(options) {
 | 
						|
    if (options instanceof Array) {
 | 
						|
      options = { types: options }
 | 
						|
    }
 | 
						|
    const opts = mergeRecursive(DEFAULT_DICT_OPTIONS, options)
 | 
						|
    if (opts.types === undefined) {
 | 
						|
      throw new Error('need dict types')
 | 
						|
    }
 | 
						|
    const ps = []
 | 
						|
    this._dictMetas = opts.types.map(t => DictMeta.parse(t))
 | 
						|
    this._dictMetas.forEach(dictMeta => {
 | 
						|
      const type = dictMeta.type
 | 
						|
      Vue.set(this.label, type, {})
 | 
						|
      Vue.set(this.type, type, [])
 | 
						|
      if (dictMeta.lazy) {
 | 
						|
        return
 | 
						|
      }
 | 
						|
      ps.push(loadDict(this, dictMeta))
 | 
						|
    })
 | 
						|
    return Promise.all(ps)
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * 重新加载字典
 | 
						|
   * @param {String} type 字典类型
 | 
						|
   */
 | 
						|
  reloadDict(type) {
 | 
						|
    const dictMeta = this._dictMetas.find(e => e.type === type)
 | 
						|
    if (dictMeta === undefined) {
 | 
						|
      return Promise.reject(`the dict meta of ${type} was not found`)
 | 
						|
    }
 | 
						|
    return loadDict(this, dictMeta)
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * 加载字典
 | 
						|
 * @param {Dict} dict 字典
 | 
						|
 * @param {DictMeta} dictMeta 字典元数据
 | 
						|
 * @returns {Promise}
 | 
						|
 */
 | 
						|
function loadDict(dict, dictMeta) {
 | 
						|
  return dictMeta.request(dictMeta)
 | 
						|
    .then(response => {
 | 
						|
      const type = dictMeta.type
 | 
						|
      let dicts = dictMeta.responseConverter(response, dictMeta)
 | 
						|
      if (!(dicts instanceof Array)) {
 | 
						|
        console.error('the return of responseConverter must be Array.<DictData>')
 | 
						|
        dicts = []
 | 
						|
      } else if (dicts.filter(d => d instanceof DictData).length !== dicts.length) {
 | 
						|
        console.error('the type of elements in dicts must be DictData')
 | 
						|
        dicts = []
 | 
						|
      }
 | 
						|
      dict.type[type].splice(0, Number.MAX_SAFE_INTEGER, ...dicts)
 | 
						|
      dicts.forEach(d => {
 | 
						|
        Vue.set(dict.label[type], d.value, d.label)
 | 
						|
      })
 | 
						|
      return dicts
 | 
						|
    })
 | 
						|
}
 |