99 lines
2.9 KiB
TypeScript
99 lines
2.9 KiB
TypeScript
|
||
import { actionAddins } from ".";
|
||
import { IAction, IActionProperty, IActionNode, IContext, IActionResult } from "../types/ActionTypes";
|
||
import { ConditionTree } from '../types/Conditions';
|
||
/**
|
||
* アクションの属性定義
|
||
*/
|
||
interface IErrorShowProps {
|
||
message: string;
|
||
condition: string;
|
||
}
|
||
|
||
export class ErrorShowAction implements IAction {
|
||
name: string;
|
||
actionProps: IActionProperty[]; //调用从import导入关于显示类的定义
|
||
props: IErrorShowProps;//从上方的interface 定义这个props所需要接受的属性
|
||
constructor() { //解构函数定义需要的类名
|
||
this.name = "エラー表示";
|
||
this.actionProps = [];
|
||
this.props = {
|
||
message: '',
|
||
condition: ''
|
||
}
|
||
this.register(); //重置以上注册表
|
||
}
|
||
|
||
/**
|
||
* アクションの実行を呼び出す
|
||
* @param actionNode
|
||
* @param event
|
||
* @returns
|
||
*/
|
||
async process(actionNode: IActionNode, event: any, context: IContext): Promise<IActionResult> { //异步处理某函数下的:xx属性
|
||
let result = {
|
||
canNext: true,
|
||
result: false
|
||
};
|
||
try { //尝试执行以下代码部分
|
||
this.actionProps = actionNode.actionProps;
|
||
if (!('message' in actionNode.ActionValue) && !('condition' in actionNode.ActionValue)) { //如果message以及condition两者都不存在的情况下return
|
||
return result
|
||
}
|
||
this.props = actionNode.ActionValue as IErrorShowProps;
|
||
const conditionResult = this.getConditionResult(context);
|
||
if (conditionResult) {
|
||
event.error = this.props.message;
|
||
} else {
|
||
result = {
|
||
canNext: false,
|
||
result: true
|
||
}
|
||
}
|
||
return result;
|
||
} catch (error) {
|
||
event.error = error;
|
||
console.error(error);
|
||
result.canNext = false;
|
||
return result;
|
||
}
|
||
|
||
}
|
||
/**
|
||
*
|
||
* @param context 条件式を実行する
|
||
* @returns
|
||
*/
|
||
getConditionResult(context: any): boolean {
|
||
const tree = this.getCondition(this.props.condition);
|
||
if (!tree) {
|
||
//条件を設定されていません
|
||
return true;
|
||
}
|
||
return tree.evaluate(tree.root, context);
|
||
}
|
||
|
||
/**
|
||
* @param condition 条件式ツリーを取得する
|
||
* @returns
|
||
*/
|
||
getCondition(condition: string): ConditionTree | null {
|
||
try {
|
||
const tree = new ConditionTree();
|
||
tree.fromJson(condition);
|
||
if (tree.getConditions(tree.root).length > 0) {
|
||
return tree;
|
||
} else {
|
||
return null;
|
||
}
|
||
} catch (error) {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
register(): void {
|
||
actionAddins[this.name] = this;
|
||
}
|
||
|
||
}
|
||
new ErrorShowAction(); |