import { actionAddins } from "."; import { IAction,IActionResult, IActionNode, IActionProperty, IField, IContext } from "../types/ActionTypes"; import { ConditionTree } from '../types/Conditions'; /** * アクションの属性定義 */ interface IShownProps{ field:IField; show:string; condition:string; } /** * 表示/非表示アクション */ export class FieldShownAction implements IAction{ name: string; actionProps: IActionProperty[]; props:IShownProps; constructor(){ this.name="表示/非表示"; this.actionProps=[]; this.props={ field:{code:''}, show:'', condition:'' } //アクションを登録する this.register(); } /** * アクションの実行を呼び出す * @param actionNode * @param event * @returns */ async process(actionNode:IActionNode,event:any,context:IContext):Promise { let result={ canNext:true, result:false }; try{ //属性設定を取得する this.actionProps=actionNode.actionProps; if (!('field' in actionNode.ActionValue) && !('show' in actionNode.ActionValue)) { return result } this.props = actionNode.ActionValue as IShownProps; //条件式の計算結果を取得 const conditionResult = this.getConditionResult(context); if(conditionResult){ if(this.props.show==='表示'){ kintone.app.record.setFieldShown(this.props.field.code,true); }else if (this.props.show==='非表示'){ kintone.app.record.setFieldShown(this.props.field.code,false); } } result= { canNext:true, 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 FieldShownAction();