12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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
- })
- }
|