@blockly/block-shareable-procedures
Version:
A plugin that adds procedure blocks which are backed by explicit data models.
3 lines • 29.9 kB
JavaScript
/*! For license information please see index.js.LICENSE.txt */
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("blockly/core"));else if("function"==typeof define&&define.amd)define(["blockly/core"],t);else{var r="object"==typeof exports?t(require("blockly/core")):t(e.Blockly);for(var s in r)("object"==typeof exports?exports:e)[s]=r[s]}}(this,e=>(()=>{"use strict";var t={370:t=>{t.exports=e}},r={};function s(e){var o=r[e];if(void 0!==o)return o.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,s),i.exports}s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var o={};s.r(o),s.d(o,{ObservableParameterModel:()=>u,ObservableProcedureModel:()=>f,ProcedureBase:()=>n,ProcedureChangeReturn:()=>l,ProcedureCreate:()=>p,ProcedureDelete:()=>h,ProcedureParameterBase:()=>a,ProcedureParameterCreate:()=>m,ProcedureParameterDelete:()=>_,ProcedureParameterRename:()=>d,ProcedureRename:()=>E,blocks:()=>P,isProcedureBlock:()=>k,registerProcedureSerializer:()=>v,triggerProceduresUpdate:()=>c,unregisterProcedureBlocks:()=>I});var i=s(370);class n extends i.Events.Abstract{constructor(e,t){super(),this.procedure=t,this.type=n.TYPE,this.isBlank=!1,this.workspaceId=e.id}toJson(){const e=super.toJson();return e.procedureId=this.procedure.getId(),e}}n.TYPE="procedure_base";class a extends n{constructor(e,t,r){super(e,t),this.parameter=r,this.type=a.TYPE,this.recordUndo=!1}static findMatchingParameter(e,t,r){const s=e.getProcedureMap().get(t);if(!s)return{procedure:void 0,parameter:void 0};const o=s.getParameters().find(e=>e.getId()===r);return o?{procedure:s,parameter:o}:{procedure:s,parameter:void 0}}toJson(){const e=super.toJson();return e.parameterId=this.parameter.getId(),e}}a.TYPE="procedure_parameter_base";class d extends a{constructor(e,t,r,s,o,i){super(e,t,r),this.oldName=s,this.type=d.TYPE,this.newName=null!=o?o:r.getName(),this.newVarId=null!=i?i:r.getVariableModel().getId()}run(e){const{parameter:t}=a.findMatchingParameter(this.getEventWorkspace_(),this.procedure.getId(),this.parameter.getId());if(e){if(t.getName()!==this.oldName)return;t.setName(this.newName,this.newVarId)}else{if(t.getName()!==this.newName)return;t.setName(this.oldName)}}toJson(){const e=super.toJson();return e.newName=this.newName,e.newVarId=this.newVarId,e.oldName=this.oldName,e}static fromJson(e,t){const{procedure:r,parameter:s}=a.findMatchingParameter(t,e.procedureId,e.parameterId);if(!s)throw new Error("Cannot delete a non existant parameter");return new d(t,r,s,e.oldName,e.newName,e.newVarId)}}function c(e){if(!e.isClearing)for(const t of e.getAllBlocks(!1))i.procedures.isProcedureBlock(t)&&t.doProcedureUpdate()}d.TYPE="procedure_parameter_rename",i.registry.register(i.registry.Type.EVENT,d.TYPE,d);class u{constructor(e,t,r,s){this.workspace=e,this.shouldFireEvents=!1,this.procedureModel=null,this.id=null!=r?r:i.utils.idGenerator.genUid(),this.variable=this.createBackingVariable(t,s)}setName(e,t){var r;if(e===this.variable.getName())return this;const s=this.variable.getName();return this.variable=null!==(r=this.workspace.getVariable(e))&&void 0!==r?r:this.workspace.createVariable(e,"",t),c(this.workspace),this.shouldFireEvents&&i.Events.fire(new d(this.workspace,this.procedureModel,this,s)),this}createBackingVariable(e,t){var r;return this.variable=null!==(r=this.workspace.getVariable(e))&&void 0!==r?r:this.workspace.createVariable(e,"",t),this.variable}setTypes(e){throw new Error("The built-in ParameterModel does not support typing. You need to implement your own custom ParameterModel.")}getName(){return this.variable.getName()}getTypes(){return[]}getId(){return this.id}getVariableModel(){return this.variable}startPublishing(){this.shouldFireEvents=!0}stopPublishing(){this.shouldFireEvents=!1}setProcedureModel(e){return this.procedureModel=e,this}saveState(){const e={id:this.getId(),name:this.getName()};return this.getTypes().length?(e.types=this.getTypes(),e):e}static loadState(e,t){const r=new u(t,e.name,e.id);return e.types&&r.setTypes(e.types),r}}class l extends n{constructor(e,t,r){super(e,t),this.oldTypes=r,this.type=l.TYPE,this.newTypes=t.getReturnTypes()}run(e){const t=this.getEventWorkspace_().getProcedureMap().get(this.procedure.getId());if(!t)throw new Error("Cannot change the type of a procedure that does not exist in the procedure map");e?t.setReturnTypes(this.newTypes):t.setReturnTypes(this.oldTypes)}toJson(){const e=super.toJson();return e.oldTypes=this.oldTypes,e}static fromJson(e,t){const r=t.getProcedureMap().get(e.procedureId);if(!r)throw new Error("Cannot deserialize procedure change return event because the target procedure does not exist");return new l(t,r,e.oldTypes)}}l.TYPE="procedure_change",i.registry.register(i.registry.Type.EVENT,l.TYPE,l);class p extends n{constructor(){super(...arguments),this.type=p.TYPE}run(e){const t=this.getEventWorkspace_().getProcedureMap();if(e){if(t.get(this.procedure.getId()))return;t.add(this.procedure)}else{if(!t.get(this.procedure.getId()))return;t.delete(this.procedure.getId())}}toJson(){const e=super.toJson();return e.procedure=i.serialization.procedures.saveProcedure(this.procedure),e}static fromJson(e,t){return new p(t,i.serialization.procedures.loadProcedure(f,u,e.procedure,t))}}p.TYPE="procedure_create",i.registry.register(i.registry.Type.EVENT,p.TYPE,p);class h extends n{constructor(){super(...arguments),this.type=h.TYPE}run(e){const t=this.getEventWorkspace_().getProcedureMap();if(e){if(!t.get(this.procedure.getId()))return;t.delete(this.procedure.getId())}else{if(t.get(this.procedure.getId()))return;t.add(this.procedure)}}toJson(){return super.toJson()}static fromJson(e,t){const r=t.getProcedureMap().get(e.procedureId);if(!r)throw new Error("Cannot deserialize procedure delete event because the target procedure does not exist");return new h(t,r)}}h.TYPE="procedure_delete",i.registry.register(i.registry.Type.EVENT,h.TYPE,h);class g extends n{constructor(e,t,r){super(e,t),this.type=g.TYPE,void 0===r?(this.oldState=!t.getEnabled(),this.newState=t.getEnabled()):(this.oldState=!r,this.newState=r)}run(e){const t=this.getEventWorkspace_().getProcedureMap().get(this.procedure.getId());if(!t)throw new Error("Cannot change the enabled state of a procedure that does not exist in the procedure map");e?t.setEnabled(this.newState):t.setEnabled(this.oldState)}toJson(){const e=super.toJson();return e.newState=this.newState,e}static fromJson(e,t){const r=t.getProcedureMap().get(e.procedureId);if(!r)throw new Error("Cannot deserialize procedure enable event because the target procedure does not exist");return new g(t,r,e.newState)}}g.TYPE="procedure_enable",i.registry.register(i.registry.Type.EVENT,g.TYPE,g);class m extends a{constructor(e,t,r,s){super(e,t,r),this.index=s,this.type=m.TYPE}run(e){const t=this.getEventWorkspace_().getProcedureMap().get(this.procedure.getId());if(!t)throw new Error("Cannot add a parameter to a procedure that does not exist in the procedure map");e?t.insertParameter(this.parameter,this.index):t.deleteParameter(this.index)}toJson(){const e=super.toJson();return e.name=this.parameter.getName(),e.id=this.parameter.getId(),e.varId=this.parameter.getVariableModel().getId(),e.index=this.index,e}static fromJson(e,t){const r=t.getProcedureMap().get(e.procedureId);if(!r)throw new Error("Cannot deserialize parameter create event because the target procedure does not exist");return new m(t,r,new u(t,e.name,e.id,e.varId),e.index)}}m.TYPE="procedure_parameter_create",i.registry.register(i.registry.Type.EVENT,m.TYPE,m);class _ extends a{constructor(e,t,r,s){super(e,t,r),this.index=s,this.type=_.TYPE}run(e){const t=this.getEventWorkspace_().getProcedureMap().get(this.procedure.getId());if(!t)throw new Error("Cannot add a parameter to a procedure that does not exist in the procedure map");e?t.deleteParameter(this.index):t.insertParameter(this.parameter,this.index)}toJson(){const e=super.toJson();return e.index=this.index,e}static fromJson(e,t){const{procedure:r,parameter:s}=a.findMatchingParameter(t,e.procedureId,e.parameterId);if(!s)throw new Error("Cannot delete a non existant parameter");return new _(t,r,s,e.index)}}_.TYPE="procedure_parameter_delete",i.registry.register(i.registry.Type.EVENT,_.TYPE,_);class E extends n{constructor(e,t,r,s){super(e,t),this.oldName=r,this.type=E.TYPE,this.newName=null!=s?s:t.getName()}run(e){const t=this.getEventWorkspace_().getProcedureMap().get(this.procedure.getId());if(!t)throw new Error("Cannot change the type of a procedure that does not exist in the procedure map");if(e){if(t.getName()!==this.oldName)return;t.setName(this.newName)}else{if(t.getName()!==this.newName)return;t.setName(this.oldName)}}toJson(){const e=super.toJson();return e.newName=this.newName,e.oldName=this.oldName,e}static fromJson(e,t){const r=t.getProcedureMap().get(e.procedureId);if(!r)throw new Error("Cannot deserialize procedure rename event because the target procedure does not exist");return new E(t,r,e.oldName,e.newName)}}E.TYPE="procedure_rename",i.registry.register(i.registry.Type.EVENT,E.TYPE,E);class f{constructor(e,t,r){this.workspace=e,this.parameters=[],this.returnTypes=null,this.enabled=!0,this.shouldFireEvents=!1,this.shouldTriggerUpdates=!0,this.id=null!=r?r:i.utils.idGenerator.genUid(),this.name=t}setName(e){if(e===this.name)return this;const t=this.name;return this.name=e,this.shouldTriggerUpdates&&c(this.workspace),this.shouldFireEvents&&i.Events.fire(new E(this.workspace,this,t)),this}insertParameter(e,t){return this.parameters[t]&&this.parameters[t].getId()===e.getId()||(this.parameters.splice(t,0,e),e.setProcedureModel(this),i.isObservable(e)&&(this.shouldFireEvents?e.startPublishing():e.stopPublishing()),this.shouldTriggerUpdates&&c(this.workspace),this.shouldFireEvents&&i.Events.fire(new m(this.workspace,this,e,t))),this}deleteParameter(e){if(!this.parameters[e])return this;const t=this.parameters[e];return this.parameters.splice(e,1),this.shouldTriggerUpdates&&c(this.workspace),i.isObservable(t)&&t.stopPublishing(),this.shouldFireEvents&&i.Events.fire(new _(this.workspace,this,t,e)),this}setReturnTypes(e){if(e&&e.length)throw new Error("The built-in ProcedureModel does not support typing. You need to implement your own custom ProcedureModel.");if(!!e==!!this.returnTypes)return this;const t=this.returnTypes;return this.returnTypes=e,this.shouldTriggerUpdates&&c(this.workspace),this.shouldFireEvents&&i.Events.fire(new l(this.workspace,this,t)),this}setEnabled(e){return e===this.enabled||(this.enabled=e,this.shouldTriggerUpdates&&c(this.workspace),this.shouldFireEvents&&i.Events.fire(new g(this.workspace,this))),this}startBulkUpdate(){this.shouldTriggerUpdates=!1}endBulkUpdate(){this.shouldTriggerUpdates=!0,c(this.workspace)}getId(){return this.id}getName(){return this.name}getParameter(e){return this.parameters[e]}getParameters(){return[...this.parameters]}getReturnTypes(){return this.returnTypes}getEnabled(){return this.enabled}startPublishing(){this.shouldFireEvents=!0,i.Events.fire(new p(this.workspace,this));for(const e of this.parameters)i.isObservable(e)&&e.startPublishing()}stopPublishing(){c(this.workspace),i.Events.fire(new h(this.workspace,this)),this.shouldFireEvents=!1;for(const e of this.parameters)i.isObservable(e)&&e.stopPublishing()}saveState(){return{id:this.getId(),name:this.getName(),returnTypes:this.getReturnTypes()}}static loadState(e,t){return new f(t,e.name,e.id).setReturnTypes(e.returnTypes)}}const P=i.common.createBlockDefinitionsFromJsonArray([{type:"procedures_defnoreturn",message0:"%{BKY_PROCEDURES_DEFNORETURN_TITLE} %1 %2 %3",message1:"%{BKY_PROCEDURES_DEFNORETURN_DO} %1",args0:[{type:"field_input",name:"NAME",text:"",spellcheck:!1},{type:"field_label",name:"PARAMS",text:""},{type:"input_dummy",name:"TOP"}],args1:[{type:"input_statement",name:"STACK"}],style:"procedure_blocks",helpUrl:"%{BKY_PROCEDURES_DEFNORETURN_HELPURL}",tooltip:"%{BKY_PROCEDURES_DEFNORETURN_TOOLTIP}",extensions:["procedure_def_get_def_mixin","procedure_def_var_mixin","procedure_def_update_shape_mixin","procedure_def_context_menu_mixin","procedure_def_onchange_mixin","procedure_def_validator_helper","procedure_defnoreturn_get_caller_block_mixin","procedure_defnoreturn_set_comment_helper","procedure_def_set_no_return_helper"],mutator:"procedure_def_mutator"},{type:"procedures_callnoreturn",message0:"%1 %2",args0:[{type:"field_label",name:"NAME",text:"%{BKY_UNNAMED_KEY}"},{type:"input_dummy",name:"TOPROW"}],nextStatement:null,previousStatement:null,style:"procedure_blocks",helpUrl:"%{BKY_PROCEDURES_CALLNORETURN_HELPURL}",extensions:["procedure_caller_get_def_mixin","procedure_caller_var_mixin","procedure_caller_update_shape_mixin","procedure_caller_context_menu_mixin","procedure_caller_onchange_mixin","procedure_callernoreturn_get_def_block_mixin"],mutator:"procedure_caller_mutator"},{type:"procedures_defreturn",message0:"%{BKY_PROCEDURES_DEFRETURN_TITLE} %1 %2 %3",message1:"%{BKY_PROCEDURES_DEFRETURN_DO} %1",message2:"%{BKY_PROCEDURES_DEFRETURN_RETURN} %1",args0:[{type:"field_input",name:"NAME",text:"",spellcheck:!1},{type:"field_label",name:"PARAMS",text:""},{type:"input_dummy",name:"TOP"}],args1:[{type:"input_statement",name:"STACK"}],args2:[{type:"input_value",align:"right",name:"RETURN"}],style:"procedure_blocks",helpUrl:"%{BKY_PROCEDURES_DEFRETURN_HELPURL}",tooltip:"%{BKY_PROCEDURES_DEFRETURN_TOOLTIP}",extensions:["procedure_def_get_def_mixin","procedure_def_var_mixin","procedure_def_update_shape_mixin","procedure_def_context_menu_mixin","procedure_def_onchange_mixin","procedure_def_validator_helper","procedure_defreturn_get_caller_block_mixin","procedure_defreturn_set_comment_helper","procedure_def_set_return_helper"],mutator:"procedure_def_mutator"},{type:"procedures_callreturn",message0:"%1 %2",args0:[{type:"field_label",name:"NAME",text:"%{BKY_UNNAMED_KEY}"},{type:"input_dummy",name:"TOPROW"}],output:null,style:"procedure_blocks",helpUrl:"%{BKY_PROCEDURES_CALLRETURN_HELPURL}",extensions:["procedure_caller_get_def_mixin","procedure_caller_var_mixin","procedure_caller_update_shape_mixin","procedure_caller_context_menu_mixin","procedure_caller_onchange_mixin","procedure_callerreturn_get_def_block_mixin"],mutator:"procedure_caller_mutator"}]);i.Extensions.register("procedure_def_get_def_mixin",function(){const e={model_:null,getProcedureModel(){return this.model_},isProcedureDef:()=>!0,getVars:function(){return this.getProcedureModel().getParameters().map(e=>e.getVariableModel().name)},getVarModels:function(){return this.getProcedureModel().getParameters().map(e=>e.getVariableModel())},destroy:function(){this.isInsertionMarker()||this.workspace.getProcedureMap().delete(this.getProcedureModel().getId())}};e.model_=new f(this.workspace,i.Procedures.findLegalName(this.getFieldValue("NAME"),this)),i.Events.disable(),this.workspace.getProcedureMap().add(e.getProcedureModel()),i.Events.enable(),this.mixin(e,!0)}),i.Extensions.register("procedure_def_var_mixin",function(){this.mixin({renameVarById:function(e,t){const r=this.workspace.getVariableById(e),s=this.getProcedureModel(),o=s.getParameters().findIndex(e=>e.getVariableModel()===r);if(-1===o)return;const i=this.workspace.getVariableById(t);s.getParameter(o).setName(i.name)},updateVarName:function(e){this.getProcedureModel().getParameters().some(t=>t.getVariableModel()===e)&&this.doProcedureUpdate()}},!0)});const M={doProcedureUpdate:function(){this.setFieldValue(this.getProcedureModel().getName(),"NAME"),this.setDisabledReason(!this.getProcedureModel().getEnabled()),this.updateParameters_(),this.updateMutator_()},updateParameters_:function(){const e=this.getProcedureModel().getParameters().map(e=>e.getName()),t=e.length?`${i.Msg.PROCEDURES_BEFORE_PARAMS} ${e.join(", ")}`:"";i.Events.disable();try{this.setFieldValue(t,"PARAMS")}finally{i.Events.enable()}},updateMutator_:function(){const e=this.getIcon(i.icons.MutatorIcon.TYPE);if(!(null==e?void 0:e.bubbleIsVisible()))return;const t=this.mutator.getWorkspace();for(const e of this.getProcedureModel().getParameters()){const r=t.getBlockById(e.getId());r&&r.getFieldValue("NAME")!==e.getName()&&r.setFieldValue(e.getName(),"NAME")}},setStatements_:function(e){var t;if(this.hasStatements_!==e){if(e)this.appendStatementInput("STACK").appendField(i.Msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK","RETURN"),null===(t=this.statementConnection_)||void 0===t||t.reconnect(this,"STACK"),this.statementConnection_=null;else{const e=this.getInput("STACK").connection;if(this.statementConnection_=e.targetConnection,this.statementConnection_){const t=e.targetBlock();t.unplug(),t.bumpNeighbours()}this.removeInput("STACK",!0)}this.hasStatements_=e}}};i.Extensions.registerMixin("procedure_def_update_shape_mixin",M),i.Extensions.register("procedure_def_validator_helper",function(){const e=this.getField("NAME");e.setValue(i.Procedures.findLegalName("",this)),e.setValidator(i.Procedures.rename)});const T={hasStatements_:!0,mutationToDom:function(){const e=i.utils.xml.createElement("mutation"),t=this.getProcedureModel().getParameters();for(let r=0;r<t.length;r++){const s=i.utils.xml.createElement("arg"),o=t[r].getVariableModel();s.setAttribute("name",o.name),s.setAttribute("varid",o.getId()),e.appendChild(s)}return this.hasStatements_||e.setAttribute("statements","false"),e},domToMutation:function(e){for(let t=0;t<e.childNodes.length;t++){const r=e.childNodes[t];if("arg"!==r.nodeName.toLowerCase())continue;const s=r.getAttribute("varid");this.getProcedureModel().insertParameter(new u(this.workspace,r.getAttribute("name"),void 0,s),t)}this.setStatements_("false"!==e.getAttribute("statements"))},saveExtraState:function(e){const t=Object.create(null);if(t.procedureId=this.getProcedureModel().getId(),e){t.fullSerialization=!0;const e=this.getProcedureModel().getParameters();e.length&&(t.params=e.map(e=>({name:e.getName(),id:e.getVariableModel().getId(),paramId:e.getId()})))}return this.hasStatements_||(t.hasStatements=!1),t},loadExtraState:function(e){var t;const r=this.workspace.getProcedureMap(),s=e.procedureId;r.has(s)&&!e.fullSerialization&&(r.has(this.model_.getId())&&r.delete(this.model_.getId()),this.model_=r.get(s));const o=this.getProcedureModel(),i=null!==(t=e.params)&&void 0!==t?t:[],n=new Set(i.map(e=>e.id)),a=o.getParameters();if(e.fullSerialization)for(let e=a.length-1;e>=0;e--)n.has(a[e].getId)||o.deleteParameter(e);for(let t=0;t<i.length;t++){const{name:r,id:s,paramId:o}=e.params[t];this.getProcedureModel().insertParameter(new u(this.workspace,r,o,s),t)}this.doProcedureUpdate(),this.setStatements_(!1!==e.hasStatements)},decompose:function(e){const t={type:"procedures_mutatorcontainer",inputs:{STACK:{}}};let r=t.inputs.STACK;for(const e of this.getProcedureModel().getParameters())r.block={type:"procedures_mutatorarg",id:e.getId(),fields:{NAME:e.getName()},next:{}},r=r.block.next;const s=i.serialization.blocks.append(t,e,{recordUndo:!1});return"procedures_defreturn"===this.type?s.setFieldValue(this.hasStatements_,"STATEMENTS"):s.removeInput("STATEMENT_INPUT"),s},compose:function(e){this.deleteParamsFromModel_(e),this.renameParamsInModel_(e),this.addParamsToModel_(e);const t=e.getFieldValue("STATEMENTS");null!==t&&this.setStatements_("TRUE"===t)},deleteParamsFromModel_:function(e){const t=new Set(e.getDescendants().map(e=>e.id)),r=this.getProcedureModel();for(let e=r.getParameters().length-1;e>=0;e--)t.has(r.getParameter(e).getId())||r.deleteParameter(e)},renameParamsInModel_:function(e){const t=this.getProcedureModel();let r=0,s=e.getInputTargetBlock("STACK");for(;s&&!s.isInsertionMarker();){const e=t.getParameter(r);e&&e.getId()===s.id&&e.getName()!==s.getFieldValue("NAME")&&e.setName(s.getFieldValue("NAME")),s=s.nextConnection&&s.nextConnection.targetBlock(),r++}},addParamsToModel_:function(e){const t=this.getProcedureModel();let r=0,s=e.getInputTargetBlock("STACK");for(;s&&!s.isInsertionMarker();)t.getParameter(r)&&t.getParameter(r).getId()===s.id||t.insertParameter(new u(this.workspace,s.getFieldValue("NAME"),s.id),r),s=s.nextConnection&&s.nextConnection.targetBlock(),r++}};i.Extensions.registerMutator("procedure_def_mutator",T,void 0,["procedures_mutatorarg"]);const x={customContextMenu:function(e){if(this.isInFlyout)return;const t=i.utils.xml.createElement("mutation");t.setAttribute("name",this.getFieldValue("NAME"));const r=this.getProcedureModel().getParameters();for(const e of r){const r=i.utils.xml.createElement("arg");r.setAttribute("name",e.getName()),t.appendChild(r)}const s=i.utils.xml.createElement("block");if(s.setAttribute("type",this.callType_),s.appendChild(t),e.push({enabled:!0,text:i.Msg.PROCEDURES_CREATE_DO.replace("%1",this.getFieldValue("NAME")),callback:i.ContextMenu.callbackFactory(this,s)}),!this.isCollapsed())for(const t of r){const r=t.getVariableModel(),s=i.Variables.generateVariableFieldDom(r),o=i.utils.xml.createElement("block");o.setAttribute("type","variables_get"),o.appendChild(s),e.push({enabled:!0,text:i.Msg.VARIABLES_SET_CREATE_GET.replace("%1",r.name),callback:i.ContextMenu.callbackFactory(this,o)})}}};i.Extensions.registerMixin("procedure_def_context_menu_mixin",x);const b={onchange:function(e){e.type===i.Events.BLOCK_CREATE&&e.blockId===this.id&&i.Events.fire(new p(this.workspace,this.getProcedureModel())),e.type===i.Events.BLOCK_CHANGE&&e.blockId===this.id&&"disabled"===e.element&&this.getProcedureModel().setEnabled(this.isEnabled())}};i.Extensions.registerMixin("procedure_def_onchange_mixin",b),i.Extensions.register("procedure_defnoreturn_set_comment_helper",function(){(this.workspace.options.comments||this.workspace.options.parentWorkspace&&this.workspace.options.parentWorkspace.options.comments)&&i.Msg.PROCEDURES_DEFNORETURN_COMMENT&&this.setCommentText(i.Msg.PROCEDURES_DEFNORETURN_COMMENT)}),i.Extensions.register("procedure_defreturn_set_comment_helper",function(){(this.workspace.options.comments||this.workspace.options.parentWorkspace&&this.workspace.options.parentWorkspace.options.comments)&&i.Msg.PROCEDURES_DEFRETURN_COMMENT&&this.setCommentText(i.Msg.PROCEDURES_DEFRETURN_COMMENT)}),i.Extensions.registerMixin("procedure_defnoreturn_get_caller_block_mixin",{callType_:"procedures_callnoreturn"}),i.Extensions.registerMixin("procedure_defreturn_get_caller_block_mixin",{callType_:"procedures_callreturn"}),i.Extensions.register("procedure_def_set_no_return_helper",function(){this.getProcedureModel().setReturnTypes(null)}),i.Extensions.register("procedure_def_set_return_helper",function(){this.getProcedureModel().setReturnTypes([])}),i.Extensions.register("procedure_caller_get_def_mixin",function(){const e={model_:null,prevParams_:[],argsMap_:new Map,getProcedureModel(){return this.model_},findProcedureModel_(e,t=[]){const r=this.getTargetWorkspace_().getProcedureMap().getProcedures().find(t=>t.getName()===e);if(!r)return null;const s=r.getReturnTypes();return(this.hasReturn_?s:!s)&&r.getParameters().every((e,r)=>e.getName()===t[r])?r:null},getTargetWorkspace_(){return this.workspace.isFlyout?this.workspace.targetWorkspace:this.workspace},isProcedureDef:()=>!1,getVars:function(){return this.getProcedureModel().getParameters().map(e=>e.getVariableModel().name)},getVarModels:function(){return this.getProcedureModel().getParameters().map(e=>e.getVariableModel())}};this.mixin(e,!0)}),i.Extensions.register("procedure_caller_var_mixin",function(){this.mixin({updateVarName:function(e){this.getProcedureModel().getParameters().some(t=>t.getVariableModel()===e)&&this.doProcedureUpdate()}},!0)});const N={paramsFromSerializedState_:[],mutationToDom:function(){const e=i.utils.xml.createElement("mutation"),t=this.getProcedureModel();if(!t)return e;e.setAttribute("name",t.getName());for(const r of t.getParameters()){const t=i.utils.xml.createElement("arg");t.setAttribute("name",r.getName()),e.appendChild(t)}return e},domToMutation:function(e){const t=e.getAttribute("name"),r=[];for(const t of e.childNodes)"arg"===t.nodeName.toLowerCase()&&r.push(t.getAttribute("name"));this.deserialize_(t,r)},saveExtraState:function(){const e=Object.create(null),t=this.getProcedureModel();return t?(e.name=t.getName(),t.getParameters().length&&(e.params=t.getParameters().map(e=>e.getName())),e):(e.name=this.getFieldValue("NAME"),e.params=this.paramsFromSerializedState_,e)},loadExtraState:function(e){this.deserialize_(e.name,e.params||[])},deserialize_:function(e,t){this.setFieldValue(e,"NAME"),this.model_||(this.model_=this.findProcedureModel_(e,t)),this.getProcedureModel()?this.initBlockWithProcedureModel_():this.createArgInputs_(t),this.paramsFromSerializedState_=t}};i.Extensions.registerMutator("procedure_caller_mutator",N);const y={initBlockWithProcedureModel_(){this.prevParams_=[...this.getProcedureModel().getParameters()],this.doProcedureUpdate()},doProcedureUpdate:function(){if(!this.getProcedureModel()||this.isDeadOrDying())return;const e=this.getProcedureModel().getId();this.getTargetWorkspace_().getProcedureMap().has(e)||this.isInFlyout?(this.updateName_(),this.updateEnabled_(),this.updateParameters_()):this.dispose(!0)},updateName_:function(){const e=this.getProcedureModel().getName();this.setFieldValue(e,"NAME");const t=this.outputConnection?i.Msg.PROCEDURES_CALLRETURN_TOOLTIP:i.Msg.PROCEDURES_CALLNORETURN_TOOLTIP;this.setTooltip(t.replace("%1",e))},updateEnabled_:function(){this.setDisabledReason(!this.getProcedureModel().getEnabled(),"PROCEDURE_MODEL_DISABLED")},updateParameters_:function(){this.syncArgsMap_(),this.deleteAllArgInputs_(),this.addParametersLabel__(),this.createArgInputs_(),this.reattachBlocks_(),this.prevParams_=[...this.getProcedureModel().getParameters()]},syncArgsMap_:function(){for(const[e,t]of this.prevParams_.entries()){const r=this.getInputTargetBlock(`ARG${e}`);r&&this.argsMap_.set(t.getId(),r)}},updateArgsMap_:function(){for(const[e,t]of this.getProcedureModel().getParameters().entries()){const r=this.getInputTargetBlock(`ARG${e}`);r?this.argsMap_.set(t.getId(),r):this.argsMap_.delete(t.getId())}},deleteAllArgInputs_:function(){let e=0;for(;this.getInput(`ARG${e}`);)this.removeInput(`ARG${e}`),e++},addParametersLabel__:function(){const e=this.getInput("TOPROW");this.getProcedureModel().getParameters().length?this.getField("WITH")||(e.appendField(i.Msg.PROCEDURES_CALL_BEFORE_PARAMS,"WITH"),e.init()):this.getField("WITH")&&e.removeField("WITH")},createArgInputs_:function(e=null){e||(e=this.getProcedureModel().getParameters().map(e=>e.getName()));for(const[t,r]of e.entries())this.appendValueInput(`ARG${t}`).appendField(new i.FieldLabel(r),`ARGNAME${t}`).setAlign(i.inputs.Align.RIGHT)},reattachBlocks_:function(){const e=this.getProcedureModel().getParameters();for(const[t,r]of e.entries())this.argsMap_.has(r.getId())&&this.getInput(`ARG${t}`).connection.connect(this.argsMap_.get(r.getId()).outputConnection)},renameProcedure:function(e,t){if(i.Names.equals(e,this.getFieldValue("NAME"))){this.setFieldValue(t,"NAME");const e=this.outputConnection?i.Msg.PROCEDURES_CALLRETURN_TOOLTIP:i.Msg.PROCEDURES_CALLNORETURN_TOOLTIP;this.setTooltip(e.replace("%1",t))}}};i.Extensions.registerMixin("procedure_caller_update_shape_mixin",y);const R={onchange:function(e){if(this.disposed||this.workspace.isFlyout)return;if(e.type===i.Events.BLOCK_MOVE&&this.updateArgsMap_(!0),e.type!==i.Events.FINISHED_LOADING&&!this.eventIsCreatingThisBlockDuringPaste_(e))return;if(this.getProcedureModel())return;const t=this.getFieldValue("NAME");let r=i.Procedures.getDefinition(t,this.workspace);this.defMatches_(r)||(r=null),r||(i.Events.setGroup(e.group),this.model_=this.createDef_(this.getFieldValue("NAME"),this.paramsFromSerializedState_),i.Events.setGroup(!1)),this.getProcedureModel()||(this.model_=this.findProcedureModel_(this.getFieldValue("NAME"),this.paramsFromSerializedState_)),this.initBlockWithProcedureModel_()},eventIsCreatingThisBlockDuringPaste_(e){return e.type===i.Events.BLOCK_CREATE&&(e.blockId===this.id||-1!==e.ids.indexOf(this.id))&&e.recordUndo},defMatches_(e){return e&&e.type===this.defType_&&JSON.stringify(e.getVars())===JSON.stringify(this.paramsFromSerializedState_)},createDef_(e,t=[]){const r=this.getRelativeToSurfaceXY(),s=i.Procedures.findLegalName(e,this);this.renameProcedure(e,s);const o={type:this.defType_,x:r.x+i.config.snapRadius*(this.RTL?-1:1),y:r.y+2*i.config.snapRadius,extraState:{params:t.map(e=>({name:e}))},fields:{NAME:s}};return i.serialization.blocks.append(o,this.getTargetWorkspace_(),{recordUndo:!0}).getProcedureModel()}};i.Extensions.registerMixin("procedure_caller_onchange_mixin",R);const w={customContextMenu:function(e){if(!this.workspace.isMovable())return;const t=this.getFieldValue("NAME"),r=this.workspace;e.push({enabled:!0,text:i.Msg.PROCEDURES_HIGHLIGHT_DEF,callback:function(){const e=i.Procedures.getDefinition(t,r);e&&e instanceof i.BlockSvg&&(r.centerOnBlock(e.id),e.select())}})}};function k(e){return void 0!==e.getProcedureModel&&void 0!==e.doProcedureUpdate&&void 0!==e.isProcedureDef}function I(){delete i.Blocks.procedures_defnoreturn,delete i.Blocks.procedures_callnoreturn,delete i.Blocks.procedures_defreturn,delete i.Blocks.procedures_callreturn}function v(){i.serialization.registry.unregister("procedures"),i.serialization.registry.register("procedures",new i.serialization.procedures.ProcedureSerializer(f,u))}return i.Extensions.registerMixin("procedure_caller_context_menu_mixin",w),i.Extensions.registerMixin("procedure_callernoreturn_get_def_block_mixin",{hasReturn_:!1,defType_:"procedures_defnoreturn"}),i.Extensions.registerMixin("procedure_callerreturn_get_def_block_mixin",{hasReturn_:!0,defType_:"procedures_defreturn"}),o})());
//# sourceMappingURL=index.js.map