| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | import { IViewModel, ISqlColumn, IView, IFormedView, IViewRoleRaw, IViewRole, IKeyOfViewModelProps } from './types'import { SqlTypes } from 'app/globalConstants'import { DefaultModelTypeSqlTypeSetting, VisualTypeSqlTypeSetting, ViewModelVisualTypes, ViewModelTypes } from './constants'import { hasProperty } from 'utils/util'export function getFormedView (view: IView): IFormedView {  const { model, variable, roles } = view  const formedView = {    ...view,    model: JSON.parse((model || '{}')),    variable: JSON.parse((variable || '[]')),    roles: (roles as IViewRoleRaw[]).map<IViewRole>(({ roleId, columnAuth, rowAuth }) => ({      roleId,      columnAuth: JSON.parse(columnAuth || '[]'),      rowAuth: JSON.parse(rowAuth || '[]')    }))  }  return formedView}function getMapKeyByValue (value: SqlTypes, map: typeof VisualTypeSqlTypeSetting | typeof DefaultModelTypeSqlTypeSetting) {  let result  Object.entries(map).some(([key, values]) => {    if (values.includes(value)) {      result = key      return true    }  })  return result}export function getValidModel (model: IViewModel, sqlColumns: ISqlColumn[]) {  if (!Array.isArray(sqlColumns)) { return {} }  const validModel = sqlColumns.reduce<IViewModel>((accModel, column) => {    const { name: columnName, type: columnType } = column    const modelItem = model[columnName]    if (!modelItem) {      accModel[columnName] = {        sqlType: columnType,        // model item which columnType not registered with SQL_TYPES in globalConstants.ts        // its default visualType is String and modelType is Category        visualType: getMapKeyByValue(columnType, VisualTypeSqlTypeSetting) || ViewModelVisualTypes.String,        modelType: getMapKeyByValue(columnType, DefaultModelTypeSqlTypeSetting) || ViewModelTypes.Category      }    } else {      accModel[columnName] = { ...modelItem, sqlType: columnType } // update newest sqlType      // verify visualType are valid by the sqlType or not      // @TODO recover visualType validation after filter visualType select options by columnType in step2      // if (SQL_TYPES.includes(columnType)) { // model item which columnType not registered with SQL_TYPES do not need verify      //   if (VisualTypeSqlTypeSetting[modelItem.visualType]      //       && !VisualTypeSqlTypeSetting[modelItem.visualType].includes(columnType)) {      //     accModel[columnName].visualType = getMapKeyByValue(columnType, VisualTypeSqlTypeSetting)      //   }      // }      // @TODO changed visualType need be shown in step2 corresponding model table cell    }    return accModel  }, {})  return validModel}export function getValidRoleModelNames (model: IViewModel, modelNames: string[]) {  if (!Array.isArray(modelNames)) { return [] }  const validModelNames = modelNames.filter((name) => !!model[name])  return validModelNames}export function getTypesOfModelCollect (model: IViewModel, type: IKeyOfViewModelProps) {  let target = {}  if (model) {    return target = Object.keys(model).reduce((iteratee, current) => {      iteratee[current] = hasProperty(model[current], type)      return iteratee    }, {})  }  return target}function cacheManager (model: IViewModel, type: IKeyOfViewModelProps) {  const cache = {}  return function (name: string, callback) {    if (cache['prevModel'] === model) {      cache[type] = cache[type] || getTypesOfModelCollect(model, type)    } else {      cache['prevModel'] = model      cache[type] = getTypesOfModelCollect(model, type)    }    return callback(cache)  }}export const getTypesOfModelByKeyName = (model: IViewModel, type: IKeyOfViewModelProps) => (name: string) => {  return cacheManager(model, type)(name, (cache) => {    if (cache && cache[type]) {      return hasProperty(cache[type], name)    }  })}export const getListsByViewModelTypes = (model: IViewModel, type: IKeyOfViewModelProps) => (modelType: ViewModelTypes) => {  return cacheManager(model, type)(name, (cache) => {    const target = cache[type]    return Object.keys(target).reduce((iteratee, current) => {      return iteratee.concat(target[current] === modelType ? current : [])    }, [])  })}
 |