UNPKG

@xiamh/block-shareable-procedures-custom

Version:

A plugin that adds procedure blocks which are backed by explicit data models.

3 lines 29.1 kB
/*! 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={573:t=>{t.exports=e}},r={};function s(e){var o=r[e];if(void 0!==o)return o.exports;var n=r[e]={exports:{}};return t[e](n,n.exports,s),n.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={};return(()=>{s.r(o),s.d(o,{ObservableParameterModel:()=>a,ObservableProcedureModel:()=>m,ProcedureBase:()=>t,ProcedureChangeReturn:()=>d,ProcedureCreate:()=>c,ProcedureDelete:()=>u,ProcedureParameterBase:()=>r,ProcedureParameterCreate:()=>p,ProcedureParameterDelete:()=>h,ProcedureParameterRename:()=>n,ProcedureRename:()=>g,blocks:()=>E,isProcedureBlock:()=>_,registerProcedureSerializer:()=>w,triggerProceduresUpdate:()=>i,unregisterProcedureBlocks:()=>R});var e=s(573);class t extends e.Events.Abstract{constructor(e,r){super(),this.procedure=r,this.type=t.TYPE,this.isBlank=!1,this.workspaceId=e.id}toJson(){const e=super.toJson();return e.procedureId=this.procedure.getId(),e}}t.TYPE="procedure_base";class r extends t{constructor(e,t,s){super(e,t),this.parameter=s,this.type=r.TYPE}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}}r.TYPE="procedure_parameter_base";class n extends r{constructor(e,t,r,s,o,i){super(e,t,r),this.oldName=s,this.type=n.TYPE,this.newName=null!=o?o:r.getName(),this.newVarId=null!=i?i:r.getVariableModel().getId()}run(e){const{parameter:t}=r.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:s,parameter:o}=r.findMatchingParameter(t,e.procedureId,e.parameterId);if(!o)throw new Error("Cannot delete a non existant parameter");return new n(t,s,o,e.oldName,e.newName,e.newVarId)}}function i(t){if(!t.isClearing)for(const r of t.getAllBlocks(!1))e.procedures.isProcedureBlock(r)&&r.doProcedureUpdate()}n.TYPE="procedure_parameter_rename",e.registry.register(e.registry.Type.EVENT,n.TYPE,n);class a{constructor(t,r,s,o){var n;this.workspace=t,this.shouldFireEvents=!1,this.procedureModel=null,this.id=null!=s?s:e.utils.idGenerator.genUid(),this.variable=null!==(n=this.workspace.getVariable(r))&&void 0!==n?n:t.createVariable(r,"",o)}setName(t,r){var s;if(t===this.variable.name)return this;const o=this.variable.name;return this.variable=null!==(s=this.workspace.getVariable(t))&&void 0!==s?s:this.workspace.createVariable(t,"",r),i(this.workspace),this.shouldFireEvents&&e.Events.fire(new n(this.workspace,this.procedureModel,this,o)),this}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.name}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}}class d extends t{constructor(e,t,r){super(e,t),this.oldTypes=r,this.type=d.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 d(t,r,e.oldTypes)}}d.TYPE="procedure_change",e.registry.register(e.registry.Type.EVENT,d.TYPE,d);class c extends t{constructor(){super(...arguments),this.type=c.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 t=super.toJson();return t.procedure=e.serialization.procedures.saveProcedure(this.procedure),t}static fromJson(t,r){return new c(r,e.serialization.procedures.loadProcedure(m,a,t.procedure,r))}}c.TYPE="procedure_create",e.registry.register(e.registry.Type.EVENT,c.TYPE,c);class u extends t{constructor(){super(...arguments),this.type=u.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 u(t,r)}}u.TYPE="procedure_delete",e.registry.register(e.registry.Type.EVENT,u.TYPE,u);class l extends t{constructor(e,t,r){super(e,t),this.type=l.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 l(t,r,e.newState)}}l.TYPE="procedure_enable",e.registry.register(e.registry.Type.EVENT,l.TYPE,l);class p extends r{constructor(e,t,r,s){super(e,t,r),this.index=s,this.type=p.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 p(t,r,new a(t,e.name,e.id,e.varId),e.index)}}p.TYPE="procedure_parameter_create",e.registry.register(e.registry.Type.EVENT,p.TYPE,p);class h extends r{constructor(e,t,r,s){super(e,t,r),this.index=s,this.type=h.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:s,parameter:o}=r.findMatchingParameter(t,e.procedureId,e.parameterId);if(!o)throw new Error("Cannot delete a non existant parameter");return new h(t,s,o,e.index)}}h.TYPE="procedure_parameter_delete",e.registry.register(e.registry.Type.EVENT,h.TYPE,h);class g extends t{constructor(e,t,r,s){super(e,t),this.oldName=r,this.type=g.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 g(t,r,e.oldName,e.newName)}}g.TYPE="procedure_rename",e.registry.register(e.registry.Type.EVENT,g.TYPE,g);class m{constructor(t,r,s){this.workspace=t,this.parameters=[],this.returnTypes=null,this.enabled=!0,this.shouldFireEvents=!1,this.shouldTriggerUpdates=!0,this.id=null!=s?s:e.utils.idGenerator.genUid(),this.name=r}setName(t){if(t===this.name)return this;const r=this.name;return this.name=t,this.shouldTriggerUpdates&&i(this.workspace),this.shouldFireEvents&&e.Events.fire(new g(this.workspace,this,r)),this}insertParameter(t,r){return this.parameters[r]&&this.parameters[r].getId()===t.getId()||(this.parameters.splice(r,0,t),t.setProcedureModel(this),e.isObservable(t)&&(this.shouldFireEvents?t.startPublishing():t.stopPublishing()),this.shouldTriggerUpdates&&i(this.workspace),this.shouldFireEvents&&e.Events.fire(new p(this.workspace,this,t,r))),this}deleteParameter(t){if(!this.parameters[t])return this;const r=this.parameters[t];return this.parameters.splice(t,1),this.shouldTriggerUpdates&&i(this.workspace),e.isObservable(r)&&r.stopPublishing(),this.shouldFireEvents&&e.Events.fire(new h(this.workspace,this,r,t)),this}setReturnTypes(t){if(t&&t.length)throw new Error("The built-in ProcedureModel does not support typing. You need to implement your own custom ProcedureModel.");if(!!t==!!this.returnTypes)return this;const r=this.returnTypes;return this.returnTypes=t,this.shouldTriggerUpdates&&i(this.workspace),this.shouldFireEvents&&e.Events.fire(new d(this.workspace,this,r)),this}setEnabled(t){return t===this.enabled||(this.enabled=t,this.shouldTriggerUpdates&&i(this.workspace),this.shouldFireEvents&&e.Events.fire(new l(this.workspace,this))),this}startBulkUpdate(){this.shouldTriggerUpdates=!1}endBulkUpdate(){this.shouldTriggerUpdates=!0,i(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,e.Events.fire(new c(this.workspace,this));for(const t of this.parameters)e.isObservable(t)&&t.startPublishing()}stopPublishing(){i(this.workspace),e.Events.fire(new u(this.workspace,this)),this.shouldFireEvents=!1;for(const t of this.parameters)e.isObservable(t)&&t.stopPublishing()}}function _(e){return void 0!==e.getProcedureModel&&void 0!==e.doProcedureUpdate&&void 0!==e.isProcedureDef}const E=e.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"}]);e.Extensions.register("procedure_def_get_def_mixin",(function(){const t={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())}};t.model_=new m(this.workspace,e.Procedures.findLegalName(this.getFieldValue("NAME"),this)),e.Events.disable(),this.workspace.getProcedureMap().add(t.getProcedureModel()),e.Events.enable(),this.mixin(t,!0)})),e.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 n=this.workspace.getVariableById(t);s.getParameter(o).setName(n.name)},updateVarName:function(e){this.getProcedureModel().getParameters().some((t=>t.getVariableModel()===e))&&this.doProcedureUpdate()}},!0)}));const f={doProcedureUpdate:function(){this.setFieldValue(this.getProcedureModel().getName(),"NAME"),this.setEnabled(this.getProcedureModel().getEnabled()),this.updateParameters_(),this.updateMutator_()},updateParameters_:function(){const t=this.getProcedureModel().getParameters().map((e=>e.getName())),r=t.length?`${e.Msg.PROCEDURES_BEFORE_PARAMS} ${t.join(", ")}`:"";e.Events.disable();try{this.setFieldValue(r,"PARAMS")}finally{e.Events.enable()}},updateMutator_:function(){var e;if(!(null===(e=this.mutator)||void 0===e?void 0:e.isVisible()))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(t){if(this.hasStatements_!==t){if(t)this.appendStatementInput("STACK").appendField(e.Msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK","RETURN"),e.Mutator.reconnect(this.statementConnection_,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_=t}}};e.Extensions.registerMixin("procedure_def_update_shape_mixin",f),e.Extensions.register("procedure_def_validator_helper",(function(){const t=this.getField("NAME");t.setValue(e.Procedures.findLegalName("",this)),t.setValidator(e.Procedures.rename)}));const P={hasStatements_:!0,mutationToDom:function(){const t=e.utils.xml.createElement("mutation"),r=this.getProcedureModel().getParameters();for(let s=0;s<r.length;s++){const o=e.utils.xml.createElement("arg"),n=r[s].getVariableModel();o.setAttribute("name",n.name),o.setAttribute("varid",n.getId()),t.appendChild(o)}return this.hasStatements_||t.setAttribute("statements","false"),t},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 a(this.workspace,r.getAttribute("name"),void 0,s),t)}this.setStatements_("false"!==e.getAttribute("statements"))},saveExtraState:function(){const e=Object.create(null);e.procedureId=this.getProcedureModel().getId();const t=this.getProcedureModel().getParameters();return!t.length&&this.hasStatements_||(t.length&&(e.params=t.map((e=>({name:e.getName(),id:e.getVariableModel().getId(),paramId:e.getId()})))),this.hasStatements_||(e.hasStatements=!1)),e},loadExtraState:function(e){const t=this.workspace.getProcedureMap(),r=e.procedureId;if(r&&r!=this.model_.getId()&&t.has(r)&&(this.isInsertionMarker()||this.noBlockHasClaimedModel_(r))&&(t.has(this.model_.getId())&&t.delete(this.model_.getId()),this.model_=t.get(r)),e.params&&!this.getProcedureModel().getParameters().length)for(let t=0;t<e.params.length;t++){const{name:r,id:s,paramId:o}=e.params[t];this.getProcedureModel().insertParameter(new a(this.workspace,r,o,s),t)}this.doProcedureUpdate(),this.setStatements_(!1!==e.hasStatements)},noBlockHasClaimedModel_(e){const t=this.workspace.getProcedureMap().get(e);return this.workspace.getAllBlocks(!1).every((e=>!_(e)||!e.isProcedureDef()||e.getProcedureModel()!==t))},decompose:function(t){const r={type:"procedures_mutatorcontainer",inputs:{STACK:{}}};let s=r.inputs.STACK;for(const e of this.getProcedureModel().getParameters())s.block={type:"procedures_mutatorarg",id:e.getId(),fields:{NAME:e.getName()},next:{}},s=s.block.next;const o=e.serialization.blocks.append(r,t,{recordUndo:!1});return"procedures_defreturn"===this.type?o.setFieldValue(this.hasStatements_,"STATEMENTS"):o.removeInput("STATEMENT_INPUT"),o},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 a(this.workspace,s.getFieldValue("NAME"),s.id),r),s=s.nextConnection&&s.nextConnection.targetBlock(),r++}};e.Extensions.registerMutator("procedure_def_mutator",P,void 0,["procedures_mutatorarg"]);const M={customContextMenu:function(t){if(this.isInFlyout)return;const r=e.utils.xml.createElement("mutation");r.setAttribute("name",this.getFieldValue("NAME"));const s=this.getProcedureModel().getParameters();for(const t of s){const s=e.utils.xml.createElement("arg");s.setAttribute("name",t.getName()),r.appendChild(s)}const o=e.utils.xml.createElement("block");if(o.setAttribute("type",this.callType_),o.appendChild(r),t.push({enabled:!0,text:e.Msg.PROCEDURES_CREATE_DO.replace("%1",this.getFieldValue("NAME")),callback:e.ContextMenu.callbackFactory(this,o)}),!this.isCollapsed())for(const r of s){const s=r.getVariableModel(),o=e.Variables.generateVariableFieldDom(s),n=e.utils.xml.createElement("block");n.setAttribute("type","variables_get"),n.appendChild(o),t.push({enabled:!0,text:e.Msg.VARIABLES_SET_CREATE_GET.replace("%1",s.name),callback:e.ContextMenu.callbackFactory(this,n)})}}};e.Extensions.registerMixin("procedure_def_context_menu_mixin",M);const T={onchange:function(t){t.type===e.Events.BLOCK_CREATE&&t.blockId===this.id&&e.Events.fire(new c(this.workspace,this.getProcedureModel())),t.type===e.Events.BLOCK_CHANGE&&t.blockId===this.id&&"disabled"===t.element&&this.getProcedureModel().setEnabled(!t.newValue)}};e.Extensions.registerMixin("procedure_def_onchange_mixin",T),e.Extensions.register("procedure_defnoreturn_set_comment_helper",(function(){(this.workspace.options.comments||this.workspace.options.parentWorkspace&&this.workspace.options.parentWorkspace.options.comments)&&e.Msg.PROCEDURES_DEFNORETURN_COMMENT&&this.setCommentText(e.Msg.PROCEDURES_DEFNORETURN_COMMENT)})),e.Extensions.register("procedure_defreturn_set_comment_helper",(function(){(this.workspace.options.comments||this.workspace.options.parentWorkspace&&this.workspace.options.parentWorkspace.options.comments)&&e.Msg.PROCEDURES_DEFRETURN_COMMENT&&this.setCommentText(e.Msg.PROCEDURES_DEFRETURN_COMMENT)})),e.Extensions.registerMixin("procedure_defnoreturn_get_caller_block_mixin",{callType_:"procedures_callnoreturn"}),e.Extensions.registerMixin("procedure_defreturn_get_caller_block_mixin",{callType_:"procedures_callreturn"}),e.Extensions.register("procedure_def_set_no_return_helper",(function(){this.getProcedureModel().setReturnTypes(null)})),e.Extensions.register("procedure_def_set_return_helper",(function(){this.getProcedureModel().setReturnTypes([])})),e.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)})),e.Extensions.register("procedure_caller_var_mixin",(function(){this.mixin({updateVarName:function(e){this.getProcedureModel().getParameters().some((t=>t.getVariableModel()===e))&&this.doProcedureUpdate()}},!0)}));const x={previousEnabledState_:!0,paramsFromSerializedState_:[],mutationToDom:function(){const t=e.utils.xml.createElement("mutation"),r=this.getProcedureModel();if(!r)return t;t.setAttribute("name",r.getName());for(const s of r.getParameters()){const r=e.utils.xml.createElement("arg");r.setAttribute("name",s.getName()),t.appendChild(r)}return t},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},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}};e.Extensions.registerMutator("procedure_caller_mutator",x);const b={initBlockWithProcedureModel_(){this.prevParams_=[...this.getProcedureModel().getParameters()],this.doProcedureUpdate()},doProcedureUpdate:function(){if(!this.getProcedureModel())return;const e=this.getProcedureModel().getId();this.getTargetWorkspace_().getProcedureMap().has(e)?(this.updateName_(),this.updateEnabled_(),this.updateParameters_()):this.dispose()},updateName_:function(){const t=this.getProcedureModel().getName();this.setFieldValue(t,"NAME");const r=this.outputConnection?e.Msg.PROCEDURES_CALLRETURN_TOOLTIP:e.Msg.PROCEDURES_CALLNORETURN_TOOLTIP;this.setTooltip(r.replace("%1",t))},updateEnabled_:function(){this.getProcedureModel().getEnabled()?this.setEnabled(this.previousEnabledState_):(this.previousEnabledState_=this.isEnabled(),this.setEnabled(!1))},updateParameters_:function(){this.updateArgsMap_(),this.deleteAllArgInputs_(),this.addParametersLabel__(),this.createArgInputs_(),this.reattachBlocks_(),this.prevParams_=[...this.getProcedureModel().getParameters()]},updateArgsMap_:function(){for(const[e,t]of this.prevParams_.entries()){const r=this.getInputTargetBlock(`ARG${e}`);r&&this.argsMap_.set(t.getId(),r)}},deleteAllArgInputs_:function(){let e=0;for(;this.getInput(`ARG${e}`);)this.removeInput(`ARG${e}`),e++},addParametersLabel__:function(){const t=this.getInput("TOPROW");this.getProcedureModel().getParameters().length?this.getField("WITH")||(t.appendField(e.Msg.PROCEDURES_CALL_BEFORE_PARAMS,"WITH"),t.init()):this.getField("WITH")&&t.removeField("WITH")},createArgInputs_:function(t=null){t||(t=this.getProcedureModel().getParameters().map((e=>e.getName())));for(const[r,s]of t.entries())this.appendValueInput(`ARG${r}`).appendField(new e.FieldLabel(s),`ARGNAME${r}`).setAlign(e.Input.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(t,r){if(e.Names.equals(t,this.getFieldValue("NAME"))){this.setFieldValue(r,"NAME");const t=this.outputConnection?e.Msg.PROCEDURES_CALLRETURN_TOOLTIP:e.Msg.PROCEDURES_CALLNORETURN_TOOLTIP;this.setTooltip(t.replace("%1",r))}}};e.Extensions.registerMixin("procedure_caller_update_shape_mixin",b);const N={onchange:function(t){if(this.disposed||this.workspace.isFlyout)return;if(!t.recordUndo)return;if(t.type!==e.Events.BLOCK_CREATE)return;if(t.blockId!==this.id&&-1===t.ids.indexOf(this.id))return;if(this.getProcedureModel())return;const r=this.getFieldValue("NAME");let s=e.Procedures.getDefinition(r,this.workspace);this.defMatches_(s)||(s=null),s||(e.Events.setGroup(t.group),this.model_=this.createDef_(this.getFieldValue("NAME"),this.paramsFromSerializedState_),e.Events.setGroup(!1)),this.getProcedureModel()||(this.model_=this.findProcedureModel_(this.getFieldValue("NAME"),this.paramsFromSerializedState_)),this.initBlockWithProcedureModel_()},defMatches_(e){return e&&e.type===this.defType_&&JSON.stringify(e.getVars())===JSON.stringify(this.paramsFromSerializedState_)},createDef_(t,r=[]){const s=this.getRelativeToSurfaceXY(),o=e.Procedures.findLegalName(t,this);this.renameProcedure(t,o);const n={type:this.defType_,x:s.x+e.config.snapRadius*(this.RTL?-1:1),y:s.y+2*e.config.snapRadius,extraState:{params:r.map((e=>({name:e})))},fields:{NAME:o}};return e.serialization.blocks.append(n,this.getTargetWorkspace_(),{recordUndo:!0}).getProcedureModel()}};e.Extensions.registerMixin("procedure_caller_onchange_mixin",N);const y={customContextMenu:function(t){if(!this.workspace.isMovable())return;const r=this.getFieldValue("NAME"),s=this.workspace;t.push({enabled:!0,text:e.Msg.PROCEDURES_HIGHLIGHT_DEF,callback:function(){const t=e.Procedures.getDefinition(r,s);t&&t instanceof e.BlockSvg&&(s.centerOnBlock(t.id),t.select())}})}};function R(){delete e.Blocks.procedures_defnoreturn,delete e.Blocks.procedures_callnoreturn,delete e.Blocks.procedures_defreturn,delete e.Blocks.procedures_callreturn}function w(){e.serialization.registry.unregister("procedures"),e.serialization.registry.register("procedures",new e.serialization.procedures.ProcedureSerializer(m,a))}e.Extensions.registerMixin("procedure_caller_context_menu_mixin",y),e.Extensions.registerMixin("procedure_callernoreturn_get_def_block_mixin",{hasReturn_:!1,defType_:"procedures_defnoreturn"}),e.Extensions.registerMixin("procedure_callerreturn_get_def_block_mixin",{hasReturn_:!0,defType_:"procedures_defreturn"})})(),o})())); //# sourceMappingURL=index.js.map