ttk-app-core
Version:
@ttk/recat enterprise develop framework
200 lines (170 loc) • 6.27 kB
JavaScript
import React from 'react'
import { action as MetaAction, AppLoader } from '@ttk/meta-engine';
import { List, fromJS } from 'immutable'
import moment from 'moment'
import config from './config'
class action {
constructor(option) {
this.metaAction = option.metaAction
this.config = config.current
this.webapi = this.config.webapi
}
gf = (field) => {
let value = this.metaAction.gf(field)
value = value && value.toJS() || null
return value
}
onInit = ({ component, injections }) => {
this.component = component
this.injections = injections
if (this.component.props.setOkListener)
this.component.props.setOkListener(this.onOk)
this.loadOperations()
if (this.component.props.id) {
injections.reduce('init')
this.load()
} else {
injections.reduce('init', { parentId: this.component.props.parentId })
}
this.parentMenuFocus()
}
load = async () => {
const response = await this.webapi.menu.findFullById(this.component.props.id)
let operationIds = response.operations && response.operations.map(o => o.operationId)
this.selectOperations(operationIds)
this.injections.reduce('load', response)
}
loadOperations = async () => {
const operations = await this.webapi.operation.query({})
let options = operations.map(o => ({ label: o.name, value: o.id }))
this.injections.reduce('loadOperations', { operations, options })
}
onOk = async () => {
return await this.save()
}
save = async () => {
const form = this.metaAction.gf('data.form').toJS()
const ok = await this.check([{
path: 'data.form.name', value: form.name
}, {
path: 'data.form.code', value: form.code
}])
if (!ok) return false
let operationIds = this.gf('data.other.selectedOperations') || []
let operations = operationIds.map(oid => {
let mo = { menuId: form.id, operationId: oid }
if (form.operations) {
let operation = form.operations.find(m => m.operationId == oid)
if (operation) {
mo.id = operation.id
}
}
return mo
})
form.operations = operations
form.parentId = form.parentId == undefined ? 0 : form.parentId
if (form.id) {
const response = await this.webapi.menu.update(form)
this.metaAction.toast('success', '修改成功')
return response
}
else {
const response = await this.webapi.menu.create(form)
this.metaAction.toast('success', '新增成功')
return response
}
}
fieldChange = async (fieldPath, value) => {
await this.check([{ path: fieldPath, value }])
}
check = async (fieldPathAndValues) => {
if (!fieldPathAndValues)
return
var checkResults = []
for (var o of fieldPathAndValues) {
let r = { ...o }
if (o.path == 'data.form.nickname') {
Object.assign(r, await this.checkName(o.value))
}
else if (o.path == 'data.form.code') {
Object.assign(r, await this.checkCode(o.value))
}
checkResults.push(r)
}
var json = {}
var hasError = true
checkResults.forEach(o => {
json[o.path] = o.value
json[o.errorPath] = o.message
if (o.message)
hasError = false
})
this.metaAction.sfs(json)
return hasError
}
checkCode = async (code) => {
var message
if (!code)
message = '请录入编码'
return { errorPath: 'data.other.error.code', message }
}
checkName = async (name) => {
var message
if (!name)
message = '请录入名称'
return { errorPath: 'data.other.error.name', message }
}
selectOperations = (curIds) => {
let operations = this.gf('data.operations') || []
let preIds = this.gf('data.other.selectedOperations') || []
if (preIds.length > curIds.length) {
let clearIds = preIds.filter(preId => !curIds.find(id => id == preId))
curIds = this.clearSubOperation(curIds, clearIds, operations)
} else {
curIds = this.addDependentOperation(curIds, operations)
}
this.injections.reduce('selectOperations', curIds)
}
addDependentOperation(ids, operations) {
for (let i = 0; i < ids.length; i++) {
let id = ids[i]
let op = operations.find(o => o.id == id && o.dependentId)
if (op && !ids.find(theid => theid == op.dependentId)) {
ids.push(op.dependentId)
}
}
return ids
}
clearSubOperation(curIds, clearIds, operations) {
for (let i = 0; i < clearIds.length; i++) {
let id = clearIds[i]
operations.filter(op => op.dependentId == id).forEach(op => {
let index = curIds.findIndex(theid => theid == op.id)
if (index != -1) {
delete curIds[index]
}
if (!clearIds.find(cid => cid == op.id)) {
clearIds.push(op.id)
}
})
}
return curIds.filter(id => id)
}
parentMenuFocus = async () => {
const response = await this.webapi.menu.query({})
this.metaAction.sf('data.other.parents', fromJS(response))
}
parentMenuChange = (v) => {
const menuDataSource = this.metaAction.gf('data.other.parents')
const menu = menuDataSource.find(o => o.get('id') == v)
this.metaAction.sf(`data.form.parent`, menu)
this.metaAction.sf(`data.form.parentId`, menu.get('id'))
}
}
export default function creator(option) {
const metaAction = new MetaAction(option),
o = new action({ ...option, metaAction }),
ret = { ...metaAction, ...o }
metaAction.config({ metaHandlers: ret })
return ret
}