@memberjunction/ng-core-entity-forms 6.2.0-edge.5 → 6.2.0-edge.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts +2 -0
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +103 -95
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +6 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +6 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +2 -0
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +2 -0
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +2 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +21 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.d.ts +2 -0
- package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +29 -11
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +2 -0
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.js +2 -0
- package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +11 -4
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.js +14 -0
- package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +15 -0
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.js +186 -92
- package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.d.ts +2 -0
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +2 -0
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.d.ts +19 -1
- package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +20 -27
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.js +14 -6
- package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +121 -111
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +105 -103
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.js +74 -0
- package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.js +64 -0
- package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js +62 -16
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.js +28 -10
- package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.js +189 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.js +116 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js +51 -35
- package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.js +36 -18
- package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +74 -60
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js +30 -32
- package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +43 -35
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js +21 -19
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.js +45 -29
- package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js +19 -17
- package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +128 -92
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.js +129 -0
- package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js +27 -9
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +30 -12
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js +26 -8
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js +25 -6
- package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js +73 -59
- package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJQueryEntity/mjqueryentity.form.component.js +10 -8
- package/dist/lib/generated/Entities/MJQueryEntity/mjqueryentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.js +12 -4
- package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +209 -137
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js +50 -38
- package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +446 -441
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +15 -0
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +10 -0
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.js +15 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +4 -0
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.js +77 -61
- package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.d.ts +37 -0
- package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +424 -285
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/package.json +48 -48
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-editor.component.js","sourceRoot":"","sources":["../../../../src/lib/shared/components/template-editor.component.ts","../../../../src/lib/shared/components/template-editor.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAA+C,SAAS,EAAiB,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAElK,OAAO,EAAY,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAW,WAAW,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAE1E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,2BAA2B,EAAqB,6BAA6B,EAA6B,MAAM,8BAA8B,CAAC;AAExJ,OAAO,EAAE,oBAAoB,EAA0B,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;;;;;;;;;;;ICEzH,wBAAE;IAAA,gCAA6B;IAAA,wBAAQ;IAAA,iBAAO;;;;IAKlD,kCAGsC;IAFpC,8PAAS,0CAAwB,wBAAE,wBAAwB,KAAC;IAG5D,wBAAuC;IACzC,iBAAS;;;;IApBb,8BAE4C;IAA1C,yOAAS,2CAAyB,KAAK,CAAC,KAAC;IAEvC,AADF,+BAAsB,cACG;IACrB,YACF;IAAA,iBAAM;IACN,+BAAsB;IACpB,YACA;IAAA,iHAAyB;IAI7B,AADE,iBAAM,EACF;IACN,+HAAuD;IAQzD,iBAAM;;;;;IArBJ,oGAAkE;IAI9D,eACF;IADE,mFACF;IAEE,eACA;IADA,sDACA;IAAA,cAEC;IAFD,+CAEC;IAGL,cAOC;IAPD,wFAOC;;;IAIH,8BAA4C;IAC1C,wBAA6C;IAC7C,gCAAwB;IAAA,mBAAG;IAC7B,AAD6B,iBAAO,EAC9B;;;;IAIN,+BAEmC;IADjC,qNAAS,8BAAuB,KAAC;IAEjC,wBAAgC;IAChC,4BAAM;IAAA,mBAAG;IACX,AADW,iBAAO,EACZ;;;IAvCV,AADF,8BAAmC,aACP;IACxB,sHAwBC;IACD,qHAA0B;IAO1B,qHAA+C;IASnD,AADE,iBAAM,EACF;;;IAzCF,eAwBC;IAxBD,sCAwBC;IACD,eAKC;IALD,oDAKC;IAED,cAOC;IAPD,gFAOC;;;;IAeK,uCAMwC;IAN3B,4XAA2C;IAMtD,yOAAe,4BAAqB,KAAC;IACvC,iBAAc;;;IAPD,oEAA2C;IAKtD,AAHA,+DAA0C,wBAGnB;;;IAIzB,+BAAoC;IAClC,YACF;IAAA,iBAAM;;;IADJ,cACF;IADE,uGACF;;;;IAQA,4CAIkB;IAJA,sYAA6C;IAK/D,iBAAmB;;;IALD,sEAA6C;IAI7D,AADA,AADA,uBAAS,WACC,gBACK;;;IAGjB,+BAAoC;IAClC,YACF;IAAA,iBAAM;;;IADJ,cACF;IADE,8EACF;;;;IASE,AADF,+BAAwB,gBAKJ;IADhB,4XAA6C;IAH/C,iBAIkB;IAClB,iCAA+C;IAC7C,wBACF;IACF,AADE,iBAAQ,EACJ;;;IALF,cAA6C;IAA7C,sEAA6C;;;IAS7C,gCAA4B;IAC1B,wBAAwC;IAAC,wBAC3C;IAAA,iBAAO;;;IAEP,gCAA8B;IAC5B,wBAAwC;IAAC,0BAC3C;IAAA,iBAAO;;;IARX,+BAAoC;IAKhC,AAJF,sIAAuC,gHAI9B;IAKX,iBAAM;;;IATJ,cAQC;IARD,gEAQC;;;IAeD,qBACF;;;IACE,YACF;;;IADE,uGACF;;;IAKA,gCAAgC;IAC9B,wBAAkC;IAClC,iCACF;IAAA,iBAAO;;;IASH,wBAA2C;IAC3C,4BACF;;;IACE,wBAAgC;IAChC,qBACF;;;;IAXF,kCAIiC;IAD/B,0NAAS,sBAAe,KAAC;IAKvB,AAHF,0HAAyB,oGAGhB;IAIX,iBAAS;;;IAVP,mDAA8B;IAG9B,cAMC;IAND,kDAMC;;;IAoCC,AADF,+BAAyB,cACI;IACzB,wBAAqC;IAAC,iDACxC;IAAA,iBAAM;IAIA,AADF,AADF,AADF,+BAAyB,UAClB,cACsB,aACf;IAAA,2BAAW;IAAA,iBAAS;IAAA,qBAAI;IAChC,6BAAM;IAAA,aAA2B;IACnC,AADmC,iBAAO,EACpC;IAEJ,AADF,4BAAK,cACK;IAAA,mCAAkB;IAAA,iBAAS;IAAA,sBAAI;IACvC,6BAAM;IAAA,aAAmC;IAE7C,AADE,AAD2C,iBAAO,EAC5C,EACF;IAGF,AADF,AADF,4BAAK,eACsB,cACf;IAAA,8BAAa;IAAA,iBAAS;IAAA,sBAAI;IAClC,6BAAM;IAAA,aAA8C;IACtD,AADsD,iBAAO,EACvD;IAEJ,AADF,4BAAK,cACK;IAAA,uBAAM;IAAA,iBAAS;IAAA,sBAAI;IAC3B,6BAAM;IAAA,aAAoD;IAIlE,AADE,AADE,AADE,AAD4D,iBAAO,EAC7D,EACF,EACF,EACF;;IAlBQ,gBAA2B;IAA3B,oDAA2B;IAI3B,eAAmC;IAAnC,uDAAmC;IAMnC,eAA8C;IAA9C,uEAA8C;IAI9C,eAAoD;IAApD,6EAAoD;;;;IAmB5D,kCAGoE;IAAlE,0VAAiE;IACjE,wBAAqF;IACrF,YACA;IAAA,gCAAwB;IACtB,YACF;IACF,AADE,iBAAO,EACA;;;;IAPP,8FAA0E;IAEvE,cAAmD;IAAnD,4DAAmD;IACtD,cACA;IADA,gEACA;IACE,eACF;IADE,sEACF;;;IA4BY,+BAAqC;IAAA,YAA6B;IAAA,iBAAM;;;IAAnC,cAA6B;IAA7B,iDAA6B;;;;IATlE,AADF,AADF,AADF,AADF,+BAA8B,cACQ,UAC7B,cAC+B,eACD;IAAA,YAAwC;IAAA,iBAAO;IAC9E,kCAGwC;IADtC,sSAAS,4CAAiC,KAAC;IAE3C,wBAAgC;IAEpC,AADE,iBAAS,EACL;IACN,+KAA+B;IAKrC,AADE,AADE,iBAAM,EACF,EACF;;;IAbiC,eAAwC;IAAxC,qEAAwC;IAQzE,eAEC;IAFD,sDAEC;;;IArBX,+BAA6B;IAC3B,oBACmD;IACnD,0BAAI;IAAA,YAAiC;IACvC,AADuC,iBAAK,EACtC;IACN,+BAA8B;IAC5B,0KAmBC;IACH,iBAAM;;;IAzBD,cAAmD;IAAnD,4DAAmD;IACpD,yDAA4C;IAC1C,eAAiC;IAAjC,qDAAiC;IAGrC,eAmBC;IAnBD,6CAmBC;;;IA1BL,gJAAiE;;;;IAAjE,+FA4BC;;;IArDL,AADF,+BAA+B,cACF;IACzB,wBAA8B;IAAC,+CACjC;IAAA,iBAAM;IACN,6BAAoC;IAClC,oYAEF;IAAA,iBAAI;IAEJ,+BAA2B;IACzB,wJAWC;IACH,iBAAM;IAEN,+BAAiC;IAC/B,wJA8BC;IACH,iBAAM;IAGJ,AADF,gCAA2B,eACQ;IAC/B,yBAAuC;IAErC,AADF,gCAAgC,cACtB;IAAA,+BAAc;IAAA,iBAAS;IAAC,uHACnB;IAAA,6BAAM;IAAA,aAA+F;IAI1H,AADE,AADE,AADE,AADoH,iBAAO,EACrH,EACF,EACF,EACF;;;IAzDF,eAWC;IAXD,2CAWC;IAID,eA8BC;IA9BD,2CA8BC;IAQsB,gBAA+F;IAA/F,kIAA+F;;;;IA9G5H,AADF,AAFF,+BAAmC,cAEV,iBAIgB;IAAnC,iPAAyB,QAAQ,KAAC;IAClC,wBAAgC;IAAC,iCACnC;IAAA,iBAAS;IACT,kCAG2C;IAAzC,iPAAyB,cAAc,KAAC;IACxC,wBAA8B;IAAC,qCACjC;IACF,AADE,iBAAS,EACL;IAEN,+BAA0B;IAExB,sIAAkC;IA8BlC,wIAAwC;IAuE5C,AADE,iBAAM,EACF;;;IAnHA,eAA2C;IAA3C,2DAA2C;IAM3C,eAAiD;IAAjD,iEAAiD;IAQnD,eA4BC;IA5BD,4DA4BC;IAED,cAqEC;IArED,mEAqEC;;;;IAzOH,AADF,AADF,AADF,AAFF,8BAAsC,cAEF,cACL,cACD,gBACsB;IAC1C,wBAA+B;IAAC,8BAClC;IAAA,iBAAQ;IAUN,AATF,8HAAwB,gGASf;IAKX,iBAAM;IAEJ,AADF,+BAAwB,iBACmB;IACvC,yBAA2C;IAAC,2BAC9C;IAAA,iBAAQ;IAQN,AAPF,qIAAwB,kGAOf;IAKX,iBAAM;IAEJ,AADF,gCAAwB,iBACI;IACxB,yBAAqC;IAAC,yBACxC;IAAA,iBAAQ;IAYN,AAXF,wHAAwB,kGAWf;IAef,AADE,AADE,iBAAM,EACF,EACF;IAIF,AADF,AADF,gCAAiC,eACJ,iBACyB;IAChD,yBAAgC;IAAC,mCACjC;IAAA,iCAEiD;IAG7C,AAFF,6GAAkC,uFAEzB;IAIb,AADE,iBAAO,EACD;IACR,gCAA4B;IAC1B,yHAAgD;IAMhD,2HAA0E;IAgB9E,AADE,iBAAM,EACF;IACN,8CAM8B;IAJ5B,2NAAU,mCAA4B,KAAC;IAKzC,iBAAiB;IAEjB,yHAA2B;IA4H/B,AADE,iBAAM,EACF;;;IA3OE,eAaC;IAbD,iDAaC;IAMD,eAWC;IAXD,mDAWC;IAMD,eAuBC;IAvBD,mDAuBC;IAUC,eAAwC;IACxC,AADA,wDAAwC,gDACM;IAC9C,cAIC;IAJD,6DAIC;IAIH,eAKC;IALD,kFAKC;IACD,cAcC;IAdD,mHAcC;IAMH,cAA8B;IAE9B,AADA,AADA,mDAA8B,wCACE,wCACA;IAIlC,eA0HC;IA1HD,sDA0HC;;;;IAUD,kCAE0B;IADxB,yNAAS,8BAAuB,KAAC;IAEjC,wBAAgC;IAAC,8CACnC;IAAA,iBAAS;;;IATb,8BAA8B;IAC5B,wBAAqC;IACrC,0BAAI;IAAA,mCAAmB;IAAA,iBAAK;IAC5B,yBAAG;IAAA,0EAA0D;IAAA,iBAAI;IACjE,yHAAwB;IAO1B,iBAAM;;;IAPJ,eAMC;IAND,kDAMC;;;IAlTP,8BAA0F;IAExF,uGAAmC;IAoSjC,AArPF,yGAA8B,iFAqPrB;IAeX,iBAAM;;;IAnTJ,cA6CC;IA7CD,6DA6CC;IAED,cAmQC;IAnQD,uDAmQC;;ADzRL,MAAM,OAAO,uBAAwB,SAAQ,oBAAoB;IAG7D,wCAAwC;IACxC,IAAa,QAAQ,CAAC,KAA8B;QAClD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,wCAAwC;IACxC,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IA8BD,gDAAgD;IAChD,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IACD,gDAAgD;IAChD,IAAW,gBAAgB,CAAC,KAAgC;QAC1D,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAGD,oDAAoD;IACpD,IAAW,oBAAoB;QAC7B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IACD,oDAAoD;IACpD,IAAW,oBAAoB,CAAC,KAAa;QAC3C,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;IACpC,CAAC;IAGD,kDAAkD;IAClD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IACD,kDAAkD;IAClD,IAAW,kBAAkB,CAAC,KAAc;QAC1C,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAClC,CAAC;IAGD,kDAAkD;IAClD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IACD,kDAAkD;IAClD,IAAW,kBAAkB,CAAC,KAAqC;QACjE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAClC,CAAC;IAGD,iDAAiD;IACjD,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IACD,iDAAiD;IACjD,IAAW,iBAAiB,CAAC,KAAc;QACzC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACjC,CAAC;IAGD,kDAAkD;IAClD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IACD,kDAAkD;IAClD,IAAW,kBAAkB,CAAC,KAA2C;QACvE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAClC,CAAC;IAGD,kDAAkD;IAClD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IACD,kDAAkD;IAClD,IAAW,kBAAkB,CAAC,KAA4B;QACxD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAClC,CAAC;IAGD,iDAAiD;IACjD,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IACD,iDAAiD;IACjD,IAAW,iBAAiB,CAAC,KAAK;QAChC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACjC,CAAC;IAGD,6CAA6C;IAC7C,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAgC;QACvD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAGD,yDAAyD;IACzD,IAAW,yBAAyB;QAClC,OAAO,IAAI,CAAC,yBAAyB,CAAC;IACxC,CAAC;IACD,yDAAyD;IACzD,IAAW,yBAAyB,CAAC,KAAa;QAChD,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;IACzC,CAAC;IAQD,qDAAqD;IACrD,IAAW,qBAAqB;QAI9B,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IACD,qDAAqD;IACrD,IAAW,qBAAqB,CAAC,KAG/B;QACA,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACrC,CAAC;IAID,0CAA0C;IAC1C,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1C,IAAI,UAAU,CAAC,KAAiC;QAC9C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAGD,IAAY,SAAS,KAAK,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAItD,YAAoB,mBAA0C,EAAU,cAAgC;QACxG,KAAK,EAAE,CAAC;QADY,wBAAmB,GAAnB,mBAAmB,CAAuB;QAAU,mBAAc,GAAd,cAAc,CAAkB;QA/K/F,aAAQ,GAA4B,IAAI,CAAC;QAUzC,WAAM,GAAyB;YACpC,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,KAAK;YACpB,WAAW,EAAE,KAAK;SACrB,CAAC;QAEQ,kBAAa,GAAG,IAAI,YAAY,EAA6B,CAAC;QAExE;;;;;;WAMG;QACO,kBAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACnC,gBAAW,GAAG,IAAI,YAAY,EAAoB,CAAC;QAE7D;;;;;;WAMG;QACO,gBAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAElC,qBAAgB,GAA8B,EAAE,CAAC;QAUjD,yBAAoB,GAAW,CAAC,CAAC;QAUjC,uBAAkB,GAAY,KAAK,CAAC;QAUpC,uBAAkB,GAAmC,IAAI,CAAC;QAU1D,sBAAiB,GAAY,KAAK,CAAC;QAUnC,uBAAkB,GAAyC,EAAE,CAAC;QAU9D,uBAAkB,GAA0B,SAAS,CAAC;QAUtD,sBAAiB,GAAG,KAAK,CAAC;QAU1B,kBAAa,GAA8B,QAAQ,CAAC;QAUpD,8BAAyB,GAAW,EAAE,CAAC;QAW9C,4CAA4C;QACrC,0BAAqB,GAGvB,EAAE,CAAC;QAiBiB,eAAU,GAA+B,IAAI,CAAC;QAU/D,0BAAqB,GAAG,KAAK,CAAC;QAC9B,aAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;QAE/B,mBAAc,GAAa,EAAE,CAAC;QAC9B,eAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAGhC,CAAC;IAET,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACtC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACtC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACK,uBAAuB;QAC3B,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAU,EAAE,EAAE;YAC9F,IAAI,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,cAAc,IAAI,CAAC,CAAC,SAAS,KAAK,2BAA2B,CAAC,SAAS,EAAE,CAAC;gBAClG,OAAO;YACX,CAAC;YACD,MAAM,SAAS,GAAG,CAAC,CAAC,IAA8B,CAAC;YACnD,IAAI,SAAS,CAAC,YAAY,KAAK,2BAA2B,CAAC,sBAAsB,EAAE,CAAC;gBAChF,OAAO;YACX,CAAC;YACD,IAAI,mBAAmB,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7D,KAAK,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACzC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAsB;QACpC,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACtB,8CAA8C;YAC9C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACJ,gCAAgC;gBAChC,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;gBAC3B,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;gBAC9B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAC/B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YACnC,CAAC;QACL,CAAC;IACL,CAAC;IAEO,8BAA8B;QAClC,uCAAuC;QACvC,IAAI,CAAC,qBAAqB,GAAG,6BAA6B,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACtE,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,MAAM,CAC3D,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CACxD,CAAC;YAEF,OAAO;gBACH,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,oBAAoB;aACrC,CAAC;QACN,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iDAAiD;QAEhG,kEAAkE;QAClE,MAAM,WAAW,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACxE,MAAM,aAAa,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAE3E,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;gBAC5B,QAAQ,EAAE;oBACN,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,eAAe;oBACrB,KAAK,EAAE,sBAAsB;iBAChC;gBACD,YAAY,EAAE,aAAa;aAC9B,CAAC,CAAC;QACP,CAAC;QAED,mCAAmC;QACnC,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjF,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe,CAAC,eAAuB;QAChD,IAAI,CAAC;YACD,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,eAAe,KAAK,CAAC,CAAC;YAChE,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,kCAAkC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3G,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,4BAA4B,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACnG,CAAC;IACL,CAAC;IAED,+CAA+C;IACxC,KAAK,CAAC,eAAe,CAAC,eAAuB;QAClD,OAAO,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC;IAED,WAAW;QACP,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAEzB,+BAA+B;QAC/B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,eAAe;QACX,kCAAkC;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,oBAAoB;QACtB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,oBAAoB;YACpB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAE/B,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAC5C,sDAAsD;gBACtD,IAAI,CAAC;oBACD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC5D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAA0B;wBACtD,UAAU,EAAE,uBAAuB;wBACnC,WAAW,EAAE,eAAe,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG;wBAC/C,OAAO,EAAE,kCAAkC;wBAC3C,UAAU,EAAE,eAAe;qBAC9B,CAAC,CAAC;oBAEH,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;gBAC5C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;gBAC7D,CAAC;YACL,CAAC;YAED,6DAA6D;YAC7D,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;YAClC,CAAC;YAED,0FAA0F;YAC1F,uDAAuD;YACvD,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;YAC9C,CAAC;YAED,0CAA0C;YAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,oBAAoB;QACxB,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACrC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,wBAAwB;QACjC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACtC,CAAC;IAED,wDAAwD;IACjD,KAAK,CAAC,wBAAwB;QACnC,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,4BAA4B;QAC9B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAA0B,uBAAuB,CAAC,CAAC;QAC9G,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC,QAAS,CAAC,EAAE,CAAC;QAC9C,cAAc,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC5B,cAAc,CAAC,QAAQ,GAAG,IAAI,CAAC;QAE/B,8EAA8E;QAC9E,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QACxF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,cAAc,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,CAAC,cAAc,CAAC,CAAC;QACzC,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;QAE9B,mDAAmD;QACnD,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,4BAA4B;QAChC,OAAO,IAAI,CAAC,4BAA4B,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,KAAa,EAAE,gBAAyB,IAAI;QACpE,wFAAwF;QACxF,IAAI,IAAI,CAAC,kBAAkB,IAAI,aAAa,EAAE,CAAC;YAC3C,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,uDAAuD,EAAE,MAAM,EAAE,uDAAuD,EAAE,CAAC,CAAC,EAAE,CAAC;gBACzM,OAAO;YACX,CAAC;QACL,CAAC;QAED,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;YACrD,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YAClC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,kEAAkE;YAElE,2CAA2C;YAC3C,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,qBAAqB,CAAC,KAAa,EAAE,gBAAyB,IAAI;QACtE,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC1D,CAAC;IAED,gBAAgB;QACZ,IAAI,CAAC;YACD,8CAA8C;YAC9C,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACtE,IAAI,CAAC,kBAAkB,GAAG;gBACtB,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE;gBACrC,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACvB,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,KAAK,EAAE,EAAE,CAAC,EAAE;iBACf,CAAC,CAAC;aACN,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,0BAA0B;YAC1B,IAAI,CAAC,kBAAkB,GAAG;gBACtB,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE;gBACrC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC/B,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE;gBACrC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;aAC1C,CAAC;QACN,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,gBAAgB;QACd,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,qBAAqB;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO;QAEnC,IAAI,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAA0B,uBAAuB,CAAC,CAAC;QACjH,IAAI,CAAC,kBAAkB,CAAC,UAAU,GAAG,IAAI,CAAC,QAAS,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC;QAExC,8EAA8E;QAC9E,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QACxF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,YAAY,GAAG,EAAE,CAAC;QAE1C,+BAA+B;QAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAE/B,4CAA4C;QAC5C,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,qBAAqB;QACzB,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,KAAa;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM;YAAE,OAAO;QAEzF,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAErD,kEAAkE;QAClE,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,CAAC;gBAC9C,IAAI,MAAM,EAAE,CAAC;oBACT,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBAEvC,qCAAqC;oBACrC,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;wBAC5D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC9E,CAAC;oBAED,8CAA8C;oBAC9C,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACrC,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;oBAC9C,CAAC;oBAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACnD,CAAC;qBAAM,CAAC;oBACJ,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,sCAAsC,eAAe,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;gBACpJ,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;gBACzD,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,oCAAoC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;YAClH,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,wCAAwC;YACxC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;gBAC5D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9E,CAAC;YAED,mEAAmE;YACnE,IAAI,IAAI,CAAC,kBAAkB,IAAI,KAAK,KAAK,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;gBACpE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACnC,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,qBAAqB,CAAC,KAAa;QACvC,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,sBAAsB;QACtB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,kBAAkB,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC;IACpE,CAAC;IAED,sDAAsD;IACtD,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC;IACvE,CAAC;IAED,mDAAmD;IACnD,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED,mBAAmB;QACf,+EAA+E;QAC/E,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACpC,CAAC;IAED,mDAAmD;IACnD,mBAAmB;QACjB,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACpC,CAAC;IAED,eAAe;QACX,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACpC,CAAC;IAED,+CAA+C;IAC/C,eAAe;QACb,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,wBAAwB;QAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;YACrD,IAAI,CAAC,kBAAkB,CAAC;IACpD,CAAC;IAED,oBAAoB,CAAC,KAAU;QAC3B,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,uEAAuE;YACvE,OAAO;QACX,CAAC;QAED,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,8FAA8F;YAC9F,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,KAAK,CAAC,CAAC;YACjF,IAAI,CAAC,sBAAsB,CAAC,YAAY,GAAG,KAAK,CAAC;YACjD,IAAI,CAAC,wBAAwB,EAAE,CAAC;QACpC,CAAC;IACL,CAAC;IAED,oDAAoD;IACpD,oBAAoB,CAAC,KAAU;QAC7B,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,QAAoB,EAAE,KAAa;QACzD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,wCAAwC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACrD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACb,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC;YACD,QAAQ,EAAE,CAAC;QACf,CAAC,EAAE,KAAK,CAAkB,CAAC;QAC3B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,eAAe;QACnB,iFAAiF;QACjF,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACxB,0EAA0E;YAC1E,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE;gBACxB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnB,OAAO;gBACX,CAAC;gBAED,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;gBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE,YAAY,IAAI,EAAE,CAAC;gBAEjE,wDAAwD;gBACxD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;YACvC,CAAC,EAAE,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,oBAAoB;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAEzC,IAAI,CAAC;YACD,+EAA+E;YAC/E,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1C,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,QAAS,CAAC,EAAE,CAAC;YAC3C,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAEnE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC;gBACzD,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;oBAC3B,OAAO,CAAC,gBAAgB,GAAG,EAAE,CAAC;oBAC9B,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;gBACzB,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;gBAClC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;oBAC9D,OAAO,KAAK,CAAC;gBACjB,CAAC;YACL,CAAC;YAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACxD,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACI,iBAAiB;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3C,OAAO,EAAE,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAwB,EAAE,CAAC;QACxC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1C,oGAAoG;YACpG,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9E,IAAI,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,SAAS;YACb,CAAC;YACD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACrC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACI,iBAAiB;QACpB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACnD,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,oBAAoB;QACxB,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACrC,CAAC;IAED,yBAAyB,CAAC,MAAc;QACpC,IAAI,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACzC,CAAC;IAED,yDAAyD;IACzD,yBAAyB,CAAC,MAAc;QACtC,OAAO,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,iBAAiB;QACb,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,MAAM,EAAE,CAAC;YACvC,OAAO,QAAQ,CAAC,CAAC,mEAAmE;QACxF,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAErE,iDAAiD;QACjD,QAAQ,WAAW,EAAE,CAAC;YAClB,KAAK,MAAM;gBACP,OAAO,QAAQ,CAAC,CAAC,oEAAoE;YACzF,KAAK,UAAU,CAAC;YAChB,KAAK,IAAI;gBACL,OAAO,UAAU,CAAC;YACtB,KAAK,YAAY,CAAC;YAClB,KAAK,IAAI;gBACL,OAAO,YAAY,CAAC;YACxB,KAAK,KAAK;gBACN,OAAO,KAAK,CAAC;YACjB,KAAK,MAAM;gBACP,OAAO,MAAM,CAAC;YAClB,KAAK,KAAK;gBACN,OAAO,KAAK,CAAC;YACjB,KAAK,KAAK;gBACN,OAAO,KAAK,CAAC;YACjB,KAAK,MAAM,CAAC;YACZ,KAAK,OAAO,CAAC;YACb;gBACI,OAAO,QAAQ,CAAC,CAAC,kEAAkE;QAC3F,CAAC;IACL,CAAC;IAED,iDAAiD;IACjD,iBAAiB;QACf,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACf,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC1D,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,6CAA6C,EAC7C,SAAS,CACZ,CAAC;YACF,OAAO;QACX,CAAC;QAED,iCAAiC;QACjC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACrD,IAAI,CAAC,UAAU,EAAE,CAAC;gBACd,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,kCAAkC,EAClC,OAAO,CACV,CAAC;gBACF,OAAO;YACX,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAED,+BAA+B;QAC3B,yDAAyD;QACzD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,+DAA+D;IAC/D,+BAA+B;QAC7B,OAAO,IAAI,CAAC,+BAA+B,EAAE,CAAC;IAChD,CAAC;wHA9wBQ,uBAAuB;oEAAvB,uBAAuB;;;;;;YC5BpC,yFAAgB;;YAAhB,uCAuTC;;;iFD3RY,uBAAuB;cANnC,SAAS;6BACI,KAAK,YACL,oBAAoB;;kBAK7B,KAAK;;kBAGL,KAAK;;kBAOL,KAAK;;kBAML,MAAM;;kBASN,MAAM;;kBACN,MAAM;;kBASN,MAAM;;kBA4HN,SAAS;mBAAC,YAAY;;kFAhKd,uBAAuB","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, OnChanges, SimpleChanges, ViewChild, AfterViewInit, ElementRef, inject } from '@angular/core';\nimport { MJTemplateEntity, MJTemplateContentEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJEvent, MJEventType, MJGlobal } from '@memberjunction/global';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { IsDescendantElement } from '@memberjunction/ng-shared-generic';\nimport { MJConfirmService } from '@memberjunction/ng-ui-components';\nimport { TemplateEngineBase } from '@memberjunction/templates-base-types';\nimport { LanguageDescription } from '@codemirror/language';\nimport { languages } from '@codemirror/language-data';\nimport { CodeEditorComponent } from '@memberjunction/ng-code-editor';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { DEFAULT_SYSTEM_PLACEHOLDERS, SystemPlaceholder, SYSTEM_PLACEHOLDER_CATEGORIES, SystemPlaceholderCategory } from '@memberjunction/ai-core-plus';\n\nimport { BaseAngularComponent, BaseFormComponentEvent, BaseFormComponentEventCodes, PendingRecordItem } from '@memberjunction/ng-base-types';\nexport interface TemplateEditorConfig {\n allowEdit?: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n showRunButton?: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n compactMode?: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n@Component({\n standalone: false,\n selector: 'mj-template-editor',\n templateUrl: './template-editor.component.html',\n styleUrls: ['./template-editor.component.css']\n})\nexport class TemplateEditorComponent extends BaseAngularComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit {\n @Input() Template: MJTemplateEntity | null = null;\n\n /** @deprecated Use {@link Template}. */\n @Input() set template(value: MJTemplateEntity | null) {\n this.Template = value;\n }\n /** @deprecated Use {@link Template}. */\n get template(): MJTemplateEntity | null {\n return this.Template;\n }\n @Input() config: TemplateEditorConfig = {\n allowEdit: true,\n showRunButton: false,\n compactMode: false\n };\n \n @Output() ContentChange = new EventEmitter<MJTemplateContentEntity[]>();\n\n /**\n * @deprecated Use {@link ContentChange}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (contentChange) keeps working. Must stay AFTER ContentChange: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() contentChange = this.ContentChange;\n @Output() RunTemplate = new EventEmitter<MJTemplateEntity>();\n\n /**\n * @deprecated Use {@link RunTemplate}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (runTemplate) keeps working. Must stay AFTER RunTemplate: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() runTemplate = this.RunTemplate;\n \n public TemplateContents: MJTemplateContentEntity[] = [];\n\n /** @deprecated Use {@link TemplateContents}. */\n public get templateContents(): MJTemplateContentEntity[] {\n return this.TemplateContents;\n }\n /** @deprecated Use {@link TemplateContents}. */\n public set templateContents(value: MJTemplateContentEntity[]) {\n this.TemplateContents = value;\n }\n public SelectedContentIndex: number = 0;\n\n /** @deprecated Use {@link SelectedContentIndex}. */\n public get selectedContentIndex(): number {\n return this.SelectedContentIndex;\n }\n /** @deprecated Use {@link SelectedContentIndex}. */\n public set selectedContentIndex(value: number) {\n this.SelectedContentIndex = value;\n }\n public IsAddingNewContent: boolean = false;\n\n /** @deprecated Use {@link IsAddingNewContent}. */\n public get isAddingNewContent(): boolean {\n return this.IsAddingNewContent;\n }\n /** @deprecated Use {@link IsAddingNewContent}. */\n public set isAddingNewContent(value: boolean) {\n this.IsAddingNewContent = value;\n }\n public NewTemplateContent: MJTemplateContentEntity | null = null;\n\n /** @deprecated Use {@link NewTemplateContent}. */\n public get newTemplateContent(): MJTemplateContentEntity | null {\n return this.NewTemplateContent;\n }\n /** @deprecated Use {@link NewTemplateContent}. */\n public set newTemplateContent(value: MJTemplateContentEntity | null) {\n this.NewTemplateContent = value;\n }\n public HasUnsavedChanges: boolean = false;\n\n /** @deprecated Use {@link HasUnsavedChanges}. */\n public get hasUnsavedChanges(): boolean {\n return this.HasUnsavedChanges;\n }\n /** @deprecated Use {@link HasUnsavedChanges}. */\n public set hasUnsavedChanges(value: boolean) {\n this.HasUnsavedChanges = value;\n }\n public ContentTypeOptions: Array<{text: string, value: string}> = [];\n\n /** @deprecated Use {@link ContentTypeOptions}. */\n public get contentTypeOptions(): Array<{text: string, value: string}> {\n return this.ContentTypeOptions;\n }\n /** @deprecated Use {@link ContentTypeOptions}. */\n public set contentTypeOptions(value: Array<{text: string, value: string}>) {\n this.ContentTypeOptions = value;\n }\n public SupportedLanguages: LanguageDescription[] = languages;\n\n /** @deprecated Use {@link SupportedLanguages}. */\n public get supportedLanguages(): LanguageDescription[] {\n return this.SupportedLanguages;\n }\n /** @deprecated Use {@link SupportedLanguages}. */\n public set supportedLanguages(value: LanguageDescription[]) {\n this.SupportedLanguages = value;\n }\n public IsRunningTemplate = false;\n\n /** @deprecated Use {@link IsRunningTemplate}. */\n public get isRunningTemplate() {\n return this.IsRunningTemplate;\n }\n /** @deprecated Use {@link IsRunningTemplate}. */\n public set isRunningTemplate(value) {\n this.IsRunningTemplate = value;\n }\n public ActiveHelpTab: 'syntax' | 'placeholders' = 'syntax';\n\n /** @deprecated Use {@link ActiveHelpTab}. */\n public get activeHelpTab(): 'syntax' | 'placeholders' {\n return this.ActiveHelpTab;\n }\n /** @deprecated Use {@link ActiveHelpTab}. */\n public set activeHelpTab(value: 'syntax' | 'placeholders') {\n this.ActiveHelpTab = value;\n }\n public ActivePlaceholderCategory: string = '';\n\n /** @deprecated Use {@link ActivePlaceholderCategory}. */\n public get activePlaceholderCategory(): string {\n return this.ActivePlaceholderCategory;\n }\n /** @deprecated Use {@link ActivePlaceholderCategory}. */\n public set activePlaceholderCategory(value: string) {\n this.ActivePlaceholderCategory = value;\n }\n \n // System placeholders organized by category\n public PlaceholderCategories: Array<{\n category: SystemPlaceholderCategory;\n placeholders: SystemPlaceholder[];\n }> = [];\n\n /** @deprecated Use {@link PlaceholderCategories}. */\n public get placeholderCategories(): Array<{\n category: SystemPlaceholderCategory;\n placeholders: SystemPlaceholder[];\n }> {\n return this.PlaceholderCategories;\n }\n /** @deprecated Use {@link PlaceholderCategories}. */\n public set placeholderCategories(value: Array<{\n category: SystemPlaceholderCategory;\n placeholders: SystemPlaceholder[];\n }>) {\n this.PlaceholderCategories = value;\n }\n \n @ViewChild('codeEditor') CodeEditor: CodeEditorComponent | null = null;\n\n /** @deprecated Use {@link CodeEditor}. */\n get codeEditor(): CodeEditorComponent | null {\n return this.CodeEditor;\n }\n /** @deprecated Use {@link CodeEditor}. */\n set codeEditor(value: CodeEditorComponent | null) {\n this.CodeEditor = value;\n }\n private isUpdatingEditorValue = false;\n private destroy$ = new Subject<void>();\n private get _metadata() { return this.ProviderToUse; }\n private activeTimeouts: number[] = [];\n private elementRef = inject(ElementRef);\n\n constructor(private notificationService: MJNotificationService, private confirmService: MJConfirmService) {\n super();}\n\n async ngOnInit() {\n this.LoadContentTypes();\n this.organizePlaceholdersByCategory();\n this.listenForHostFormEvents();\n if (this.Template) {\n await this.LoadTemplateContents();\n }\n }\n\n /**\n * A host form that folds this editor's contents into its pending records (see GetPendingChanges)\n * also reverts them when the user discards the edit: `BaseFormComponent.CancelEdit()` calls\n * `Revert()` on every pending record and broadcasts REVERT_PENDING_CHANGES. The entities roll back\n * on their own, but this editor's rows, CodeMirror's text and the dirty flag would not know, so\n * the screen would keep showing discarded text and the next save would fail on it. Reload from\n * the saved state when the event comes from a form this editor sits inside.\n */\n private listenForHostFormEvents(): void {\n MJGlobal.Instance.GetEventListener(false).pipe(takeUntil(this.destroy$)).subscribe((e: MJEvent) => {\n if (e.event !== MJEventType.ComponentEvent || e.eventCode !== BaseFormComponentEventCodes.BASE_CODE) {\n return;\n }\n const formEvent = e.args as BaseFormComponentEvent;\n if (formEvent.subEventCode !== BaseFormComponentEventCodes.REVERT_PENDING_CHANGES) {\n return;\n }\n if (IsDescendantElement(formEvent.elementRef, this.elementRef)) {\n void this.RefreshAndDiscardChanges();\n }\n });\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (changes['template']) {\n // Template input has changed, reload contents\n if (this.Template) {\n await this.LoadTemplateContents();\n } else {\n // Template cleared, reset state\n this.TemplateContents = [];\n this.SelectedContentIndex = 0;\n this.IsAddingNewContent = false;\n this.NewTemplateContent = null;\n this.HasUnsavedChanges = false;\n }\n }\n }\n \n private organizePlaceholdersByCategory() {\n // Group placeholders by their category\n this.PlaceholderCategories = SYSTEM_PLACEHOLDER_CATEGORIES.map(category => {\n const categoryPlaceholders = DEFAULT_SYSTEM_PLACEHOLDERS.filter(\n placeholder => placeholder.category === category.name\n );\n \n return {\n category: category,\n placeholders: categoryPlaceholders\n };\n }).filter(cat => cat.placeholders.length > 0); // Only include categories that have placeholders\n \n // Add any uncategorized placeholders to a misc category if needed\n const categorized = DEFAULT_SYSTEM_PLACEHOLDERS.filter(p => p.category);\n const uncategorized = DEFAULT_SYSTEM_PLACEHOLDERS.filter(p => !p.category);\n \n if (uncategorized.length > 0) {\n this.PlaceholderCategories.push({\n category: {\n name: 'Other',\n icon: 'fa-ellipsis-h',\n color: 'var(--mj-text-muted)'\n },\n placeholders: uncategorized\n });\n }\n \n // Set the first category as active\n if (this.PlaceholderCategories.length > 0) {\n this.ActivePlaceholderCategory = this.PlaceholderCategories[0].category.name;\n }\n }\n \n /**\n * Copies a placeholder to the clipboard\n */\n public async CopyPlaceholder(placeholderName: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(`{{ ${placeholderName} }}`);\n this.notificationService.CreateSimpleNotification('Placeholder copied to clipboard!', 'success', 2000);\n } catch (error) {\n console.error('Failed to copy placeholder:', error);\n this.notificationService.CreateSimpleNotification('Failed to copy placeholder', 'error', 3000);\n }\n }\n\n /** @deprecated Use {@link CopyPlaceholder}. */\n public async copyPlaceholder(placeholderName: string): Promise<void> {\n return this.CopyPlaceholder(placeholderName);\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n \n // Clean up any active timeouts\n this.activeTimeouts.forEach(timeoutId => clearTimeout(timeoutId));\n this.activeTimeouts.length = 0;\n }\n\n ngAfterViewInit() {\n // Initial sync when view is ready\n this.syncEditorValue();\n }\n\n async LoadTemplateContents() {\n if (this.Template) {\n // Reset state first\n this.TemplateContents = [];\n this.SelectedContentIndex = 0;\n this.IsAddingNewContent = false;\n this.NewTemplateContent = null;\n this.HasUnsavedChanges = false;\n \n if (this.Template.IsSaved && this.Template.ID) {\n // Load existing template contents for saved templates\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const results = await rv.RunView<MJTemplateContentEntity>({\n EntityName: 'MJ: Template Contents',\n ExtraFilter: `TemplateID='${this.Template.ID}'`,\n OrderBy: 'Priority ASC, __mj_CreatedAt ASC',\n ResultType: 'entity_object'\n });\n \n this.TemplateContents = results.Results;\n } catch (error) {\n console.error('Error loading template contents:', error);\n }\n }\n \n // If we have contents but no selection, select the first one\n if (this.TemplateContents.length > 0) {\n this.SelectedContentIndex = 0;\n }\n \n // If no template contents exist (either new template or saved template with no content), \n // create a default one for single-content optimization\n if (this.TemplateContents.length === 0) {\n await this.CreateDefaultTemplateContent();\n }\n\n // Sync editor value after loading content\n this.syncEditorValue();\n this.ContentChange.emit(this.TemplateContents);\n }\n }\n\n /** @deprecated Use {@link LoadTemplateContents}. */\n async loadTemplateContents() {\n return this.LoadTemplateContents();\n }\n\n /**\n * Public method to refresh the template editor and discard unsaved changes\n * This should be called when canceling edits to restore the original state\n */\n public async RefreshAndDiscardChanges() {\n await this.LoadTemplateContents();\n }\n\n /** @deprecated Use {@link RefreshAndDiscardChanges}. */\n public async refreshAndDiscardChanges() {\n return this.RefreshAndDiscardChanges();\n }\n\n async CreateDefaultTemplateContent() {\n const defaultContent = await this._metadata.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n defaultContent.TemplateID = this.Template!.ID;\n defaultContent.Priority = 1;\n defaultContent.IsActive = true;\n \n // Set default to first real content type (skip \"Select Type...\" if it exists)\n const validContentTypes = this.ContentTypeOptions.filter(option => option.value !== '');\n if (validContentTypes.length > 0) {\n defaultContent.TypeID = validContentTypes[0].value;\n }\n \n this.TemplateContents = [defaultContent];\n this.SelectedContentIndex = 0;\n \n // Sync editor value after creating default content\n this.syncEditorValue();\n }\n\n /** @deprecated Use {@link CreateDefaultTemplateContent}. */\n async createDefaultTemplateContent() {\n return this.CreateDefaultTemplateContent();\n }\n\n async SelectTemplateContent(index: number, confirmSwitch: boolean = true) {\n // If we're adding new content and user clicks on existing content, ask for confirmation\n if (this.IsAddingNewContent && confirmSwitch) {\n if (!(await this.confirmService.Confirm({ title: 'Discard changes?', message: 'Switch content version and lose your unsaved changes?', detail: 'Your changes to the new content version will be lost.' }))) {\n return;\n }\n }\n \n if (index >= 0 && index < this.TemplateContents.length) {\n this.SelectedContentIndex = index;\n this.IsAddingNewContent = false;\n // Don't clear newTemplateContent to preserve the work in progress\n \n // Sync editor value when switching content\n this.syncEditorValue();\n }\n }\n\n /** @deprecated Use {@link SelectTemplateContent}. */\n async selectTemplateContent(index: number, confirmSwitch: boolean = true) {\n return this.SelectTemplateContent(index, confirmSwitch);\n }\n\n LoadContentTypes() {\n try {\n // Get content types from TemplateEngine cache\n const contentTypes = TemplateEngineBase.Instance.TemplateContentTypes;\n this.ContentTypeOptions = [\n { text: 'Select Type...', value: '' },\n ...contentTypes.map(ct => ({\n text: ct.Name,\n value: ct.ID\n }))\n ];\n } catch (error) {\n console.error('Error loading content types:', error);\n // Fallback to basic types\n this.ContentTypeOptions = [\n { text: 'Select Type...', value: '' },\n { text: 'HTML', value: 'HTML' },\n { text: 'Plain Text', value: 'Text' },\n { text: 'Markdown', value: 'Markdown' }\n ];\n }\n }\n\n /** @deprecated Use {@link LoadContentTypes}. */\n loadContentTypes() {\n return this.LoadContentTypes();\n }\n\n async AddNewTemplateContent() {\n if (!this.config.allowEdit) return;\n \n this.NewTemplateContent = await this._metadata.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n this.NewTemplateContent.TemplateID = this.Template!.ID;\n this.NewTemplateContent.Priority = this.TemplateContents.length + 1;\n this.NewTemplateContent.IsActive = true;\n \n // Set default to first real content type (skip \"Select Type...\" if it exists)\n const validContentTypes = this.ContentTypeOptions.filter(option => option.value !== '');\n if (validContentTypes.length > 0) {\n this.NewTemplateContent.TypeID = validContentTypes[0].value;\n }\n this.NewTemplateContent.TemplateText = '';\n \n // Add immediately to the array\n this.TemplateContents.push(this.NewTemplateContent);\n this.SelectedContentIndex = this.TemplateContents.length - 1;\n this.IsAddingNewContent = true;\n \n // Sync editor value when adding new content\n this.syncEditorValue();\n }\n\n /** @deprecated Use {@link AddNewTemplateContent}. */\n async addNewTemplateContent() {\n return this.AddNewTemplateContent();\n }\n\n async DeleteTemplateContent(index: number) {\n if (!this.config.allowEdit || index < 0 || index >= this.TemplateContents.length) return;\n \n const contentToDelete = this.TemplateContents[index];\n \n // Check if the entity is actually saved, not just if it has an ID\n if (contentToDelete.IsSaved) {\n try {\n const result = await contentToDelete.Delete();\n if (result) {\n this.TemplateContents.splice(index, 1);\n \n // Adjust selected index if necessary\n if (this.SelectedContentIndex >= this.TemplateContents.length) {\n this.SelectedContentIndex = Math.max(0, this.TemplateContents.length - 1);\n }\n \n // If no contents remain, create a default one\n if (this.TemplateContents.length === 0) {\n await this.CreateDefaultTemplateContent();\n }\n \n this.ContentChange.emit(this.TemplateContents);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(`Failed to delete template content. ${contentToDelete.LatestResult?.Message}`, 'error');\n }\n } catch (error) {\n console.error('Error deleting template content:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error deleting template content: ${error}`, 'error');\n }\n } else {\n // Not saved yet, just remove from array\n this.TemplateContents.splice(index, 1);\n if (this.SelectedContentIndex >= this.TemplateContents.length) {\n this.SelectedContentIndex = Math.max(0, this.TemplateContents.length - 1);\n }\n \n // Reset adding new content state if we're deleting the new content\n if (this.IsAddingNewContent && index === this.TemplateContents.length) {\n this.IsAddingNewContent = false;\n this.NewTemplateContent = null;\n }\n \n this.ContentChange.emit(this.TemplateContents);\n }\n }\n\n /** @deprecated Use {@link DeleteTemplateContent}. */\n async deleteTemplateContent(index: number) {\n return this.DeleteTemplateContent(index);\n }\n\n get CurrentTemplateContent(): MJTemplateContentEntity | null {\n if (this.IsAddingNewContent) {\n return this.NewTemplateContent;\n }\n return this.TemplateContents[this.SelectedContentIndex] || null;\n }\n\n /** @deprecated Use {@link CurrentTemplateContent}. */\n get currentTemplateContent(): MJTemplateContentEntity | null {\n return this.CurrentTemplateContent;\n }\n\n get HasMultipleContents(): boolean {\n return this.TemplateContents.length > 1 || this.IsAddingNewContent;\n }\n\n /** @deprecated Use {@link HasMultipleContents}. */\n get hasMultipleContents(): boolean {\n return this.HasMultipleContents;\n }\n\n OnContentTypeChange() {\n // Content type changes just modify the current content, no new record creation\n this.updateUnsavedChangesFlag();\n }\n\n /** @deprecated Use {@link OnContentTypeChange}. */\n onContentTypeChange() {\n return this.OnContentTypeChange();\n }\n\n OnContentChange() {\n this.updateUnsavedChangesFlag();\n }\n\n /** @deprecated Use {@link OnContentChange}. */\n onContentChange() {\n return this.OnContentChange();\n }\n\n /**\n * Updates the hasUnsavedChanges flag based on entity dirty states\n */\n private updateUnsavedChangesFlag() {\n this.HasUnsavedChanges = this.TemplateContents.some(content => content.Dirty) || \n this.IsAddingNewContent;\n }\n\n OnTemplateTextChange(event: any) {\n if (this.isUpdatingEditorValue) {\n // Ignore change events when we're programmatically updating the editor\n return;\n }\n \n if (this.CurrentTemplateContent) {\n // Extract value from event - might be event.target.value or just event depending on component\n const value = typeof event === 'string' ? event : (event.target?.value || event);\n this.CurrentTemplateContent.TemplateText = value;\n this.updateUnsavedChangesFlag();\n }\n }\n\n /** @deprecated Use {@link OnTemplateTextChange}. */\n onTemplateTextChange(event: any) {\n return this.OnTemplateTextChange(event);\n }\n\n /**\n * Helper method to track setTimeout calls for cleanup\n */\n private setTrackedTimeout(callback: () => void, delay: number): number {\n const timeoutId = setTimeout(() => {\n // Remove from tracking when it executes\n const index = this.activeTimeouts.indexOf(timeoutId);\n if (index > -1) {\n this.activeTimeouts.splice(index, 1);\n }\n callback();\n }, delay) as any as number;\n this.activeTimeouts.push(timeoutId);\n return timeoutId;\n }\n\n /**\n * Manually sync the editor value without triggering change events\n */\n private syncEditorValue() {\n // Use Promise.resolve() to wait for the next microtask after any pending changes\n Promise.resolve().then(() => {\n // Then tracked setTimeout for the next macrotask to ensure DOM is updated\n this.setTrackedTimeout(() => {\n if (!this.CodeEditor) {\n return;\n }\n \n this.isUpdatingEditorValue = true;\n const newValue = this.CurrentTemplateContent?.TemplateText || '';\n \n // Use the setValue method from mj-code-editor component\n this.CodeEditor.setValue(newValue); \n this.isUpdatingEditorValue = false;\n }, 0);\n });\n }\n\n async SaveTemplateContents(): Promise<boolean> {\n if (!this.config.allowEdit) return false;\n\n try {\n // Ensure FK is set on all contents, then persist the dirty/new ones atomically\n for (const content of this.TemplateContents) {\n content.TemplateID = this.Template!.ID;\n }\n const toSave = this.TemplateContents.filter(c => c.Dirty || !c.ID);\n\n if (toSave.length > 0) {\n const tg = await this._metadata.CreateTransactionGroup();\n for (const content of toSave) {\n content.TransactionGroup = tg;\n await content.Save();\n }\n const success = await tg.Submit();\n if (!success) {\n console.error('Failed to save template contents transaction');\n return false;\n }\n }\n\n this.IsAddingNewContent = false;\n this.NewTemplateContent = null;\n this.updateUnsavedChangesFlag();\n this.ContentChange.emit(this.TemplateContents);\n return true;\n } catch (error) {\n console.error('Error saving template contents:', error);\n return false;\n }\n }\n\n /**\n * The content rows a HOST FORM should persist inside its own save: every content that is new or\n * dirty, each stamped with the template's ID. Forms that embed this editor (Templates, AI Prompts)\n * call this from their `PopulatePendingRecords()` override, so the template and its contents\n * commit in one transaction and a content that fails validation blocks the save visibly instead\n * of being dropped on the floor. A brand-new content nobody typed into is not a change and is\n * skipped; a read-only editor contributes nothing.\n */\n public GetPendingChanges(): PendingRecordItem[] {\n if (!this.config.allowEdit || !this.Template) {\n return [];\n }\n const pending: PendingRecordItem[] = [];\n for (const content of this.TemplateContents) {\n // An unsaved entity always reports Dirty; the empty-text guard keeps a default row nobody used out.\n const untouchedNew = !content.IsSaved && !(content.TemplateText ?? '').trim();\n if (untouchedNew || !content.Dirty) {\n continue;\n }\n content.TemplateID = this.Template.ID;\n const item = new PendingRecordItem();\n item.entityObject = content;\n item.action = 'save';\n pending.push(item);\n }\n return pending;\n }\n\n /**\n * The host form has persisted the rows from {@link GetPendingChanges}: clear the local dirty state\n * and publish the saved set to listeners.\n */\n public MarkContentsSaved(): void {\n this.IsAddingNewContent = false;\n this.NewTemplateContent = null;\n this.updateUnsavedChangesFlag();\n this.ContentChange.emit(this.TemplateContents);\n }\n\n /** @deprecated Use {@link SaveTemplateContents}. */\n async saveTemplateContents(): Promise<boolean> {\n return this.SaveTemplateContents();\n }\n\n GetContentTypeDisplayText(typeId: string): string {\n if (!typeId) return '-';\n const option = this.ContentTypeOptions.find(opt => opt.value === typeId);\n return option ? option.text : typeId;\n }\n\n /** @deprecated Use {@link GetContentTypeDisplayText}. */\n getContentTypeDisplayText(typeId: string): string {\n return this.GetContentTypeDisplayText(typeId);\n }\n\n GetEditorLanguage(): string {\n if (!this.CurrentTemplateContent?.TypeID) {\n return 'jinja2'; // default to jinja2 for template syntax (compatible with Nunjucks)\n }\n\n const contentType = this.CurrentTemplateContent.TypeID.toLowerCase();\n \n // Map content types to CodeMirror language modes\n switch (contentType) {\n case 'html':\n return 'jinja2'; // Use jinja2 for HTML templates to get template syntax highlighting\n case 'markdown':\n case 'md':\n return 'markdown';\n case 'javascript':\n case 'js':\n return 'javascript';\n case 'css':\n return 'css';\n case 'json':\n return 'json';\n case 'xml':\n return 'xml';\n case 'sql':\n return 'sql';\n case 'text':\n case 'plain':\n default:\n return 'jinja2'; // Default to jinja2 since templates often contain template syntax\n }\n }\n\n /** @deprecated Use {@link GetEditorLanguage}. */\n getEditorLanguage(): string {\n return this.GetEditorLanguage();\n }\n\n /**\n * Test run the current template using the parameter dialog\n */\n async OnRunTemplate() {\n if (!this.Template?.IsSaved || !this.CurrentTemplateContent) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please save the template before running it.', \n 'warning'\n );\n return;\n }\n\n // Save any unsaved changes first\n if (this.HasUnsavedChanges) {\n const saveResult = await this.SaveTemplateContents();\n if (!saveResult) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to save template changes.', \n 'error'\n );\n return;\n }\n }\n\n // Emit the run template event\n this.RunTemplate.emit(this.Template);\n }\n\n /** @deprecated Use {@link OnRunTemplate}. */\n async onRunTemplate() {\n return this.OnRunTemplate();\n }\n\n GetContentTypeOptionsForContent(): Array<{text: string, value: string}> {\n // Always exclude \"Select Type...\" option for all content\n return this.ContentTypeOptions.filter(option => option.value !== '');\n }\n\n /** @deprecated Use {@link GetContentTypeOptionsForContent}. */\n getContentTypeOptionsForContent(): Array<{text: string, value: string}> {\n return this.GetContentTypeOptionsForContent();\n }\n}","@if (template) {\n <div class=\"template-editor\" style=\"height: 100%; display: flex; flex-direction: column;\">\n <!-- Content Versions List/Tabs -->\n @if (templateContents.length > 0) {\n <div class=\"content-versions-tabs\">\n <div class=\"content-tabs\">\n @for (content of templateContents; track content.ID || $index; let i = $index) {\n <div class=\"content-version-tab\"\n [class.active]=\"selectedContentIndex === i && !isAddingNewContent\"\n (click)=\"selectTemplateContent(i, false)\">\n <div style=\"flex: 1;\">\n <div class=\"tab-label\">\n {{ content.Type || 'Version ' + (i + 1) }}\n </div>\n <div class=\"tab-meta\">\n P:{{ content.Priority }}\n @if (!content.IsActive) {\n • <span class=\"inactive-label\">Inactive</span>\n }\n </div>\n </div>\n @if (templateContents.length > 1 && config.allowEdit) {\n <button type=\"button\"\n (click)=\"deleteTemplateContent(i); $event.stopPropagation()\"\n class=\"delete-btn\"\n title=\"Delete this content version\">\n <i class=\"fa-solid fa-trash fa-xs\"></i>\n </button>\n }\n </div>\n }\n @if (isAddingNewContent) {\n <div class=\"content-version-tab adding-new\">\n <i class=\"fa-solid fa-plus text-success\"></i>\n <span class=\"new-label\">New</span>\n </div>\n }\n <!-- Add New Content (Edit Mode Only) -->\n @if (config.allowEdit && !isAddingNewContent) {\n <div class=\"content-version-tab add-new\"\n (click)=\"addNewTemplateContent()\"\n title=\"Add new template content\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Content Editor -->\n @if (currentTemplateContent) {\n <div class=\"content-editor-container\">\n <!-- Content Metadata Bar -->\n <div class=\"content-metadata-bar\">\n <div class=\"metadata-grid\">\n <div class=\"form-group\">\n <label for=\"contentType\" class=\"form-label\">\n <i class=\"fa-solid fa-tag\"></i> Content Type\n </label>\n @if (config.allowEdit) {\n <mj-dropdown [(ngModel)]=\"currentTemplateContent.TypeID\"\n name=\"contentType\"\n [Data]=\"getContentTypeOptionsForContent()\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n (ValueChange)=\"onContentTypeChange()\">\n </mj-dropdown>\n } @else {\n <div class=\"form-control-plaintext\">\n {{ getContentTypeDisplayText(currentTemplateContent.TypeID) }}\n </div>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"priority\" class=\"form-label\">\n <i class=\"fa-solid fa-sort-numeric-up\"></i> Priority\n </label>\n @if (config.allowEdit) {\n <mj-numeric-input [(ngModel)]=\"currentTemplateContent.Priority\"\n name=\"priority\"\n [Min]=\"1\"\n [Step]=\"1\"\n [Format]=\"'n0'\">\n </mj-numeric-input>\n } @else {\n <div class=\"form-control-plaintext\">\n {{ currentTemplateContent.Priority || '-' }}\n </div>\n }\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n <i class=\"fa-solid fa-toggle-on\"></i> Status\n </label>\n @if (config.allowEdit) {\n <div class=\"form-check\">\n <input type=\"checkbox\"\n id=\"isActive\"\n class=\"form-check-input\"\n [(ngModel)]=\"currentTemplateContent.IsActive\"\n name=\"isActive\">\n <label class=\"form-check-label\" for=\"isActive\">\n Active\n </label>\n </div>\n } @else {\n <div class=\"form-control-plaintext\">\n @if (currentTemplateContent.IsActive) {\n <span class=\"badge-success\">\n <i class=\"fa-solid fa-check-circle\"></i> Active\n </span>\n } @else {\n <span class=\"badge-secondary\">\n <i class=\"fa-solid fa-pause-circle\"></i> Inactive\n </span>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Content Text Editor -->\n <div class=\"content-text-editor\">\n <div class=\"editor-header\">\n <label for=\"templateContent\" class=\"editor-label\">\n <i class=\"fa-solid fa-code\"></i> Template Content\n <span class=\"content-type-badge\"\n [class.new]=\"!currentTemplateContent.ID\"\n [class.existing]=\"!!currentTemplateContent.ID\">\n @if (!currentTemplateContent.ID) {\n New\n } @else {\n {{ getContentTypeDisplayText(currentTemplateContent.TypeID) }}\n }\n </span>\n </label>\n <div class=\"editor-actions\">\n @if (!isAddingNewContent && hasUnsavedChanges) {\n <span class=\"unsaved-indicator\">\n <i class=\"fa-solid fa-circle\"></i>\n Unsaved changes\n </span>\n }\n @if (template.IsSaved && currentTemplateContent && config.showRunButton) {\n <button type=\"button\"\n class=\"run-btn\"\n [disabled]=\"isRunningTemplate\"\n (click)=\"onRunTemplate()\"\n title=\"Test run this template\">\n @if (isRunningTemplate) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Run\n }\n </button>\n }\n </div>\n </div>\n <mj-code-editor\n #codeEditor\n (change)=\"onTemplateTextChange($event)\"\n [readonly]=\"!config.allowEdit\"\n [language]=\"getEditorLanguage()\"\n [languages]=\"supportedLanguages\"\n class=\"code-editor-wrapper\">\n </mj-code-editor>\n <!-- Template Help Section with Tabs -->\n @if (!config.compactMode) {\n <div class=\"template-help-section\">\n <!-- Tab Navigation -->\n <div class=\"help-tabs\">\n <button type=\"button\"\n class=\"help-tab\"\n [class.active]=\"activeHelpTab === 'syntax'\"\n (click)=\"activeHelpTab = 'syntax'\">\n <i class=\"fa-solid fa-code\"></i> Template Syntax\n </button>\n <button type=\"button\"\n class=\"help-tab\"\n [class.active]=\"activeHelpTab === 'placeholders'\"\n (click)=\"activeHelpTab = 'placeholders'\">\n <i class=\"fa-solid fa-at\"></i> System Placeholders\n </button>\n </div>\n <!-- Tab Content -->\n <div class=\"help-content\">\n <!-- Template Syntax Tab -->\n @if (activeHelpTab === 'syntax') {\n <div class=\"syntax-help\">\n <div class=\"section-title\">\n <i class=\"fa-solid fa-lightbulb\"></i> Template Syntax Quick Reference\n </div>\n <div class=\"syntax-grid\">\n <div>\n <div class=\"syntax-item\">\n <strong>Parameters:</strong><br>\n <code>{{'{{'}} paramName {{'}}'}}</code>\n </div>\n <div>\n <strong>Template Includes:</strong><br>\n <code>{{'{% template \"TemplateName\" %}'}}</code>\n </div>\n </div>\n <div>\n <div class=\"syntax-item\">\n <strong>Conditionals:</strong><br>\n <code>{{'{% if condition %}'}} ... {{'{% endif %}'}}</code>\n </div>\n <div>\n <strong>Loops:</strong><br>\n <code>{{'{% for item in items %}'}} ... {{'{% endfor %}'}}</code>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- System Placeholders Tab -->\n @if (activeHelpTab === 'placeholders') {\n <div class=\"placeholders-help\">\n <div class=\"section-title\">\n <i class=\"fa-solid fa-at\"></i> System Placeholders Reference\n </div>\n <p class=\"placeholders-description\">\n System placeholders are automatically available in all AI prompt templates. Simply use them in your template text and they will be replaced with their current values at execution time.\n Scoped prompt parts can use the Date & Time, User Context and Environment placeholders, written alone with no filter. A part is not a template: everything else in it is sent as written.\n </p>\n <!-- Category Sub-tabs -->\n <div class=\"category-tabs\">\n @for (categoryGroup of placeholderCategories; track categoryGroup.category.name) {\n <button type=\"button\"\n class=\"category-tab\"\n [class.active]=\"activePlaceholderCategory === categoryGroup.category.name\"\n (click)=\"activePlaceholderCategory = categoryGroup.category.name\">\n <i [class]=\"'fa-solid ' + categoryGroup.category.icon\" style=\"font-size: 0.9em;\"></i>\n {{ categoryGroup.category.name }}\n <span class=\"tab-badge\">\n {{ categoryGroup.placeholders.length }}\n </span>\n </button>\n }\n </div>\n <!-- Active Category Content -->\n <div class=\"placeholder-content\">\n @for (categoryGroup of placeholderCategories; track categoryGroup.category.name) {\n @if (activePlaceholderCategory === categoryGroup.category.name) {\n <div class=\"category-header\">\n <i [class]=\"'fa-solid ' + categoryGroup.category.icon\"\n [style.color]=\"categoryGroup.category.color\"></i>\n <h5>{{ categoryGroup.category.name }}</h5>\n </div>\n <div class=\"placeholder-grid\">\n @for (placeholder of categoryGroup.placeholders; track placeholder.name) {\n <div class=\"placeholder-item\">\n <div class=\"placeholder-item-inner\">\n <div>\n <div class=\"placeholder-name-row\">\n <code class=\"placeholder-code\">{{'{{'}} {{ placeholder.name }} {{'}}'}}</code>\n <button type=\"button\"\n class=\"copy-btn\"\n (click)=\"copyPlaceholder(placeholder.name)\"\n title=\"Copy placeholder to clipboard\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (placeholder.description) {\n <div class=\"placeholder-description\">{{ placeholder.description }}</div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n <!-- Usage Example -->\n <div class=\"usage-example\">\n <div class=\"usage-example-inner\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <div class=\"usage-example-text\">\n <strong>Usage Example:</strong> To use a system placeholder in your template, simply include it in double curly braces.\n For example: <code>\"Today is {{'{{'}} _CURRENT_DATE {{'}}'}} and the current user is {{'{{'}} _USER_NAME {{'}}'}}\"</code>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <!-- No Content State -->\n <div class=\"no-content-state\">\n <i class=\"fa-solid fa-file-plus\"></i>\n <h5>No Template Content</h5>\n <p>Create your first template content version to get started.</p>\n @if (config.allowEdit) {\n <button type=\"button\"\n (click)=\"addNewTemplateContent()\"\n class=\"btn btn-primary\">\n <i class=\"fa-solid fa-plus\"></i> Create First Content Version\n </button>\n }\n </div>\n }\n </div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"template-editor.component.js","sourceRoot":"","sources":["../../../../src/lib/shared/components/template-editor.component.ts","../../../../src/lib/shared/components/template-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, OnChanges, SimpleChanges, ViewChild, AfterViewInit, ElementRef, inject } from '@angular/core';\nimport { MJTemplateEntity, MJTemplateContentEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { EscapeSQLString, MJEvent, MJEventType, MJGlobal } from '@memberjunction/global';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { IsDescendantElement } from '@memberjunction/ng-shared-generic';\nimport { MJConfirmService } from '@memberjunction/ng-ui-components';\nimport { TemplateEngineBase } from '@memberjunction/templates-base-types';\nimport { LanguageDescription } from '@codemirror/language';\nimport { languages } from '@codemirror/language-data';\nimport { CodeEditorComponent } from '@memberjunction/ng-code-editor';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { DEFAULT_SYSTEM_PLACEHOLDERS, SystemPlaceholder, SYSTEM_PLACEHOLDER_CATEGORIES, SystemPlaceholderCategory } from '@memberjunction/ai-core-plus';\n\nimport { BaseAngularComponent, BaseFormComponentEvent, BaseFormComponentEventCodes, PendingRecordItem } from '@memberjunction/ng-base-types';\nexport interface TemplateEditorConfig {\n allowEdit?: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n showRunButton?: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n compactMode?: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n@Component({\n standalone: false,\n selector: 'mj-template-editor',\n templateUrl: './template-editor.component.html',\n styleUrls: ['./template-editor.component.css']\n})\nexport class TemplateEditorComponent extends BaseAngularComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit {\n @Input() Template: MJTemplateEntity | null = null;\n\n /** @deprecated Use {@link Template}. */\n @Input() set template(value: MJTemplateEntity | null) {\n this.Template = value;\n }\n /** @deprecated Use {@link Template}. */\n get template(): MJTemplateEntity | null {\n return this.Template;\n }\n @Input() config: TemplateEditorConfig = {\n allowEdit: true,\n showRunButton: false,\n compactMode: false\n };\n \n @Output() ContentChange = new EventEmitter<MJTemplateContentEntity[]>();\n\n /**\n * @deprecated Use {@link ContentChange}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (contentChange) keeps working. Must stay AFTER ContentChange: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() contentChange = this.ContentChange;\n @Output() RunTemplate = new EventEmitter<MJTemplateEntity>();\n\n /**\n * @deprecated Use {@link RunTemplate}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (runTemplate) keeps working. Must stay AFTER RunTemplate: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() runTemplate = this.RunTemplate;\n \n public TemplateContents: MJTemplateContentEntity[] = [];\n\n /** @deprecated Use {@link TemplateContents}. */\n public get templateContents(): MJTemplateContentEntity[] {\n return this.TemplateContents;\n }\n /** @deprecated Use {@link TemplateContents}. */\n public set templateContents(value: MJTemplateContentEntity[]) {\n this.TemplateContents = value;\n }\n public SelectedContentIndex: number = 0;\n\n /** @deprecated Use {@link SelectedContentIndex}. */\n public get selectedContentIndex(): number {\n return this.SelectedContentIndex;\n }\n /** @deprecated Use {@link SelectedContentIndex}. */\n public set selectedContentIndex(value: number) {\n this.SelectedContentIndex = value;\n }\n public IsAddingNewContent: boolean = false;\n\n /** @deprecated Use {@link IsAddingNewContent}. */\n public get isAddingNewContent(): boolean {\n return this.IsAddingNewContent;\n }\n /** @deprecated Use {@link IsAddingNewContent}. */\n public set isAddingNewContent(value: boolean) {\n this.IsAddingNewContent = value;\n }\n public NewTemplateContent: MJTemplateContentEntity | null = null;\n\n /** @deprecated Use {@link NewTemplateContent}. */\n public get newTemplateContent(): MJTemplateContentEntity | null {\n return this.NewTemplateContent;\n }\n /** @deprecated Use {@link NewTemplateContent}. */\n public set newTemplateContent(value: MJTemplateContentEntity | null) {\n this.NewTemplateContent = value;\n }\n public HasUnsavedChanges: boolean = false;\n\n /** @deprecated Use {@link HasUnsavedChanges}. */\n public get hasUnsavedChanges(): boolean {\n return this.HasUnsavedChanges;\n }\n /** @deprecated Use {@link HasUnsavedChanges}. */\n public set hasUnsavedChanges(value: boolean) {\n this.HasUnsavedChanges = value;\n }\n public ContentTypeOptions: Array<{text: string, value: string}> = [];\n\n /** @deprecated Use {@link ContentTypeOptions}. */\n public get contentTypeOptions(): Array<{text: string, value: string}> {\n return this.ContentTypeOptions;\n }\n /** @deprecated Use {@link ContentTypeOptions}. */\n public set contentTypeOptions(value: Array<{text: string, value: string}>) {\n this.ContentTypeOptions = value;\n }\n public SupportedLanguages: LanguageDescription[] = languages;\n\n /** @deprecated Use {@link SupportedLanguages}. */\n public get supportedLanguages(): LanguageDescription[] {\n return this.SupportedLanguages;\n }\n /** @deprecated Use {@link SupportedLanguages}. */\n public set supportedLanguages(value: LanguageDescription[]) {\n this.SupportedLanguages = value;\n }\n public IsRunningTemplate = false;\n\n /** @deprecated Use {@link IsRunningTemplate}. */\n public get isRunningTemplate() {\n return this.IsRunningTemplate;\n }\n /** @deprecated Use {@link IsRunningTemplate}. */\n public set isRunningTemplate(value) {\n this.IsRunningTemplate = value;\n }\n public ActiveHelpTab: 'syntax' | 'placeholders' = 'syntax';\n\n /** @deprecated Use {@link ActiveHelpTab}. */\n public get activeHelpTab(): 'syntax' | 'placeholders' {\n return this.ActiveHelpTab;\n }\n /** @deprecated Use {@link ActiveHelpTab}. */\n public set activeHelpTab(value: 'syntax' | 'placeholders') {\n this.ActiveHelpTab = value;\n }\n public ActivePlaceholderCategory: string = '';\n\n /** @deprecated Use {@link ActivePlaceholderCategory}. */\n public get activePlaceholderCategory(): string {\n return this.ActivePlaceholderCategory;\n }\n /** @deprecated Use {@link ActivePlaceholderCategory}. */\n public set activePlaceholderCategory(value: string) {\n this.ActivePlaceholderCategory = value;\n }\n \n // System placeholders organized by category\n public PlaceholderCategories: Array<{\n category: SystemPlaceholderCategory;\n placeholders: SystemPlaceholder[];\n }> = [];\n\n /** @deprecated Use {@link PlaceholderCategories}. */\n public get placeholderCategories(): Array<{\n category: SystemPlaceholderCategory;\n placeholders: SystemPlaceholder[];\n }> {\n return this.PlaceholderCategories;\n }\n /** @deprecated Use {@link PlaceholderCategories}. */\n public set placeholderCategories(value: Array<{\n category: SystemPlaceholderCategory;\n placeholders: SystemPlaceholder[];\n }>) {\n this.PlaceholderCategories = value;\n }\n \n @ViewChild('codeEditor') CodeEditor: CodeEditorComponent | null = null;\n\n /** @deprecated Use {@link CodeEditor}. */\n get codeEditor(): CodeEditorComponent | null {\n return this.CodeEditor;\n }\n /** @deprecated Use {@link CodeEditor}. */\n set codeEditor(value: CodeEditorComponent | null) {\n this.CodeEditor = value;\n }\n private isUpdatingEditorValue = false;\n private destroy$ = new Subject<void>();\n private get _metadata() { return this.ProviderToUse; }\n private activeTimeouts: number[] = [];\n /**\n * Incremented by every LoadTemplateContents() call. A load only applies its rows if it is still\n * the latest one when its awaits resolve, so an older, slower load can never replace the array\n * the user is editing (MJ#4754: the edited rows and the saved rows diverged that way).\n */\n private loadGeneration = 0;\n /** The Template the most recent load was started for; lets ngOnInit skip a duplicate load. */\n private loadStartedFor: MJTemplateEntity | null = null;\n /**\n * Where the bound Template's contents are. `TemplateContents` is only the user's real data in\n * 'loaded': while 'loading' it is a placeholder the landing load replaces, and after 'failed' it\n * is empty because the read failed, not because the template has no content. The template and\n * every writer of `TemplateContents` key on this rather than on the array's length.\n */\n public ContentsLoadState: 'idle' | 'loading' | 'loaded' | 'failed' = 'idle';\n private elementRef = inject(ElementRef);\n\n constructor(private notificationService: MJNotificationService, private confirmService: MJConfirmService) {\n super();}\n\n async ngOnInit() {\n this.LoadContentTypes();\n this.organizePlaceholdersByCategory();\n this.listenForHostFormEvents();\n // ngOnChanges runs first and has usually started the load for this Template already.\n if (this.Template && this.loadStartedFor !== this.Template) {\n await this.LoadTemplateContents();\n }\n }\n\n /**\n * A host form that folds this editor's contents into its pending records (see GetPendingChanges)\n * also reverts them when the user discards the edit: `BaseFormComponent.CancelEdit()` calls\n * `Revert()` on every pending record and broadcasts REVERT_PENDING_CHANGES. The entities roll back\n * on their own, but this editor's rows, CodeMirror's text and the dirty flag would not know, so\n * the screen would keep showing discarded text and the next save would fail on it. Reload from\n * the saved state when the event comes from a form this editor sits inside.\n */\n private listenForHostFormEvents(): void {\n MJGlobal.Instance.GetEventListener(false).pipe(takeUntil(this.destroy$)).subscribe((e: MJEvent) => {\n if (e.event !== MJEventType.ComponentEvent || e.eventCode !== BaseFormComponentEventCodes.BASE_CODE) {\n return;\n }\n const formEvent = e.args as BaseFormComponentEvent;\n if (formEvent.subEventCode !== BaseFormComponentEventCodes.REVERT_PENDING_CHANGES) {\n return;\n }\n if (IsDescendantElement(formEvent.elementRef, this.elementRef)) {\n void this.RefreshAndDiscardChanges();\n }\n });\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n // Hosts bind either the Template input or its deprecated `template` alias; Angular reports\n // the change under whichever name was bound.\n if (changes['Template'] || changes['template']) {\n // Template input has changed, reload contents\n if (this.Template) {\n await this.LoadTemplateContents();\n } else {\n // Template cleared, reset state\n this.ContentsLoadState = 'idle';\n this.TemplateContents = [];\n this.SelectedContentIndex = 0;\n this.IsAddingNewContent = false;\n this.NewTemplateContent = null;\n this.HasUnsavedChanges = false;\n }\n }\n }\n \n private organizePlaceholdersByCategory() {\n // Group placeholders by their category\n this.PlaceholderCategories = SYSTEM_PLACEHOLDER_CATEGORIES.map(category => {\n const categoryPlaceholders = DEFAULT_SYSTEM_PLACEHOLDERS.filter(\n placeholder => placeholder.category === category.name\n );\n \n return {\n category: category,\n placeholders: categoryPlaceholders\n };\n }).filter(cat => cat.placeholders.length > 0); // Only include categories that have placeholders\n \n // Add any uncategorized placeholders to a misc category if needed\n const categorized = DEFAULT_SYSTEM_PLACEHOLDERS.filter(p => p.category);\n const uncategorized = DEFAULT_SYSTEM_PLACEHOLDERS.filter(p => !p.category);\n \n if (uncategorized.length > 0) {\n this.PlaceholderCategories.push({\n category: {\n name: 'Other',\n icon: 'fa-ellipsis-h',\n color: 'var(--mj-text-muted)'\n },\n placeholders: uncategorized\n });\n }\n \n // Set the first category as active\n if (this.PlaceholderCategories.length > 0) {\n this.ActivePlaceholderCategory = this.PlaceholderCategories[0].category.name;\n }\n }\n \n /**\n * Copies a placeholder to the clipboard\n */\n public async CopyPlaceholder(placeholderName: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(`{{ ${placeholderName} }}`);\n this.notificationService.CreateSimpleNotification('Placeholder copied to clipboard!', 'success', 2000);\n } catch (error) {\n console.error('Failed to copy placeholder:', error);\n this.notificationService.CreateSimpleNotification('Failed to copy placeholder', 'error', 3000);\n }\n }\n\n /** @deprecated Use {@link CopyPlaceholder}. */\n public async copyPlaceholder(placeholderName: string): Promise<void> {\n return this.CopyPlaceholder(placeholderName);\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n \n // Clean up any active timeouts\n this.activeTimeouts.forEach(timeoutId => clearTimeout(timeoutId));\n this.activeTimeouts.length = 0;\n }\n\n ngAfterViewInit() {\n // Initial sync when view is ready\n this.syncEditorValue();\n }\n\n /**\n * (Re)loads the contents of the bound Template and emits them through {@link ContentChange}.\n * This editor owns those rows: a host form folds them into its own save through\n * {@link GetPendingChanges} (or calls {@link SaveTemplateContents}) rather than loading and saving\n * a copy of its own. If several loads overlap, only the latest one applies.\n */\n async LoadTemplateContents() {\n const template = this.Template;\n if (!template) {\n return;\n }\n const generation = ++this.loadGeneration;\n this.loadStartedFor = template;\n this.ContentsLoadState = 'loading';\n this.TemplateContents = [];\n this.SelectedContentIndex = 0;\n this.IsAddingNewContent = false;\n this.NewTemplateContent = null;\n this.HasUnsavedChanges = false;\n\n const loaded = await this.fetchTemplateContents(template);\n if (generation !== this.loadGeneration) {\n return; // superseded by a newer load: its outcome, failure included, is not the user's\n }\n if ('failure' in loaded) {\n // No default row and no empty state over a failed read: either would invite the user to\n // create a row over contents we simply could not see. The template shows a retry instead.\n this.reportLoadFailure(template, loaded.failure);\n this.ContentsLoadState = 'failed';\n // Hosts mirror the rows from ContentChange; tell them the rows they hold are gone.\n this.ContentChange.emit(this.TemplateContents);\n return;\n }\n // A saved template with no rows (or a new template) gets one default row, so the\n // single-content case needs no \"add\" click.\n let contents = loaded.rows;\n if (contents.length === 0) {\n const defaultContent = await this.buildDefaultTemplateContent(template);\n if (generation !== this.loadGeneration) {\n return;\n }\n contents = [defaultContent];\n }\n this.TemplateContents = contents;\n this.ContentsLoadState = 'loaded';\n this.syncEditorValue();\n this.ContentChange.emit(this.TemplateContents);\n }\n\n private reportLoadFailure(template: MJTemplateEntity, failure: string): void {\n console.error(`Failed to load template contents for template ${template.ID}: ${failure}`);\n this.notificationService.CreateSimpleNotification(`Failed to load template contents: ${failure}`, 'error', 5000);\n }\n\n /**\n * Reads the saved contents of a template: no rows for a template that is not saved yet, and the\n * failure message when the read fails. It does not report the failure: only the caller knows\n * whether this read is still the one the screen is waiting for.\n */\n private async fetchTemplateContents(template: MJTemplateEntity): Promise<{ rows: MJTemplateContentEntity[] } | { failure: string }> {\n if (!template.IsSaved || !template.ID) {\n return { rows: [] };\n }\n let failure: string;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTemplateContentEntity>({\n EntityName: 'MJ: Template Contents',\n ExtraFilter: `TemplateID='${EscapeSQLString(template.ID)}'`,\n OrderBy: 'Priority ASC, __mj_CreatedAt ASC',\n ResultType: 'entity_object'\n });\n if (result.Success) {\n return { rows: result.Results };\n }\n failure = result.ErrorMessage || 'unknown error';\n } catch (error) {\n failure = error instanceof Error ? error.message : String(error);\n }\n return { failure };\n }\n\n /** @deprecated Use {@link LoadTemplateContents}. */\n async loadTemplateContents() {\n return this.LoadTemplateContents();\n }\n\n /**\n * Public method to refresh the template editor and discard unsaved changes\n * This should be called when canceling edits to restore the original state\n */\n public async RefreshAndDiscardChanges() {\n await this.LoadTemplateContents();\n }\n\n /** @deprecated Use {@link RefreshAndDiscardChanges}. */\n public async refreshAndDiscardChanges() {\n return this.RefreshAndDiscardChanges();\n }\n\n async CreateDefaultTemplateContent() {\n if (!this.Template) {\n throw new Error('TemplateEditorComponent.CreateDefaultTemplateContent: no Template is bound');\n }\n this.TemplateContents = [await this.buildDefaultTemplateContent(this.Template)];\n this.SelectedContentIndex = 0;\n\n // Sync editor value after creating default content\n this.syncEditorValue();\n }\n\n /** Builds (does not save) the single content row a template starts with. */\n private async buildDefaultTemplateContent(template: MJTemplateEntity): Promise<MJTemplateContentEntity> {\n const defaultContent = await this._metadata.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n defaultContent.TemplateID = template.ID;\n defaultContent.Priority = 1;\n defaultContent.IsActive = true;\n\n // Set default to first real content type (skip \"Select Type...\" if it exists)\n const validContentTypes = this.GetContentTypeOptionsForContent();\n if (validContentTypes.length > 0) {\n defaultContent.TypeID = validContentTypes[0].value;\n }\n return defaultContent;\n }\n\n /** @deprecated Use {@link CreateDefaultTemplateContent}. */\n async createDefaultTemplateContent() {\n return this.CreateDefaultTemplateContent();\n }\n\n async SelectTemplateContent(index: number, confirmSwitch: boolean = true) {\n // If we're adding new content and user clicks on existing content, ask for confirmation\n if (this.IsAddingNewContent && confirmSwitch) {\n if (!(await this.confirmService.Confirm({ title: 'Discard changes?', message: 'Switch content version and lose your unsaved changes?', detail: 'Your changes to the new content version will be lost.' }))) {\n return;\n }\n }\n \n if (index >= 0 && index < this.TemplateContents.length) {\n this.SelectedContentIndex = index;\n this.IsAddingNewContent = false;\n // Don't clear newTemplateContent to preserve the work in progress\n \n // Sync editor value when switching content\n this.syncEditorValue();\n }\n }\n\n /** @deprecated Use {@link SelectTemplateContent}. */\n async selectTemplateContent(index: number, confirmSwitch: boolean = true) {\n return this.SelectTemplateContent(index, confirmSwitch);\n }\n\n LoadContentTypes() {\n try {\n // Get content types from TemplateEngine cache\n const contentTypes = TemplateEngineBase.Instance.TemplateContentTypes;\n this.ContentTypeOptions = [\n { text: 'Select Type...', value: '' },\n ...contentTypes.map(ct => ({\n text: ct.Name,\n value: ct.ID\n }))\n ];\n } catch (error) {\n console.error('Error loading content types:', error);\n // Fallback to basic types\n this.ContentTypeOptions = [\n { text: 'Select Type...', value: '' },\n { text: 'HTML', value: 'HTML' },\n { text: 'Plain Text', value: 'Text' },\n { text: 'Markdown', value: 'Markdown' }\n ];\n }\n }\n\n /** @deprecated Use {@link LoadContentTypes}. */\n loadContentTypes() {\n return this.LoadContentTypes();\n }\n\n async AddNewTemplateContent() {\n // While a load is in flight (or after it failed) TemplateContents is a placeholder: a row\n // pushed onto it would vanish when the load lands. Re-checked after the await below.\n if (!this.config.allowEdit || this.ContentsLoadState !== 'loaded') return;\n const generation = this.loadGeneration;\n\n const newContent = await this._metadata.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n if (this.ContentsLoadState !== 'loaded' || generation !== this.loadGeneration) {\n return;\n }\n this.NewTemplateContent = newContent;\n this.NewTemplateContent.TemplateID = this.Template!.ID;\n this.NewTemplateContent.Priority = this.TemplateContents.length + 1;\n this.NewTemplateContent.IsActive = true;\n \n // Set default to first real content type (skip \"Select Type...\" if it exists)\n const validContentTypes = this.ContentTypeOptions.filter(option => option.value !== '');\n if (validContentTypes.length > 0) {\n this.NewTemplateContent.TypeID = validContentTypes[0].value;\n }\n this.NewTemplateContent.TemplateText = '';\n \n // Add immediately to the array\n this.TemplateContents.push(this.NewTemplateContent);\n this.SelectedContentIndex = this.TemplateContents.length - 1;\n this.IsAddingNewContent = true;\n \n // Sync editor value when adding new content\n this.syncEditorValue();\n }\n\n /** @deprecated Use {@link AddNewTemplateContent}. */\n async addNewTemplateContent() {\n return this.AddNewTemplateContent();\n }\n\n async DeleteTemplateContent(index: number) {\n if (!this.config.allowEdit || index < 0 || index >= this.TemplateContents.length) return;\n \n const contentToDelete = this.TemplateContents[index];\n \n // Check if the entity is actually saved, not just if it has an ID\n if (contentToDelete.IsSaved) {\n try {\n const result = await contentToDelete.Delete();\n if (result) {\n this.TemplateContents.splice(index, 1);\n \n // Adjust selected index if necessary\n if (this.SelectedContentIndex >= this.TemplateContents.length) {\n this.SelectedContentIndex = Math.max(0, this.TemplateContents.length - 1);\n }\n \n // If no contents remain, create a default one\n if (this.TemplateContents.length === 0) {\n await this.CreateDefaultTemplateContent();\n }\n \n this.ContentChange.emit(this.TemplateContents);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(`Failed to delete template content. ${contentToDelete.LatestResult?.Message}`, 'error');\n }\n } catch (error) {\n console.error('Error deleting template content:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error deleting template content: ${error}`, 'error');\n }\n } else {\n // Not saved yet, just remove from array\n this.TemplateContents.splice(index, 1);\n if (this.SelectedContentIndex >= this.TemplateContents.length) {\n this.SelectedContentIndex = Math.max(0, this.TemplateContents.length - 1);\n }\n \n // Reset adding new content state if we're deleting the new content\n if (this.IsAddingNewContent && index === this.TemplateContents.length) {\n this.IsAddingNewContent = false;\n this.NewTemplateContent = null;\n }\n \n this.ContentChange.emit(this.TemplateContents);\n }\n }\n\n /** @deprecated Use {@link DeleteTemplateContent}. */\n async deleteTemplateContent(index: number) {\n return this.DeleteTemplateContent(index);\n }\n\n get CurrentTemplateContent(): MJTemplateContentEntity | null {\n if (this.IsAddingNewContent) {\n return this.NewTemplateContent;\n }\n return this.TemplateContents[this.SelectedContentIndex] || null;\n }\n\n /** @deprecated Use {@link CurrentTemplateContent}. */\n get currentTemplateContent(): MJTemplateContentEntity | null {\n return this.CurrentTemplateContent;\n }\n\n get HasMultipleContents(): boolean {\n return this.TemplateContents.length > 1 || this.IsAddingNewContent;\n }\n\n /** @deprecated Use {@link HasMultipleContents}. */\n get hasMultipleContents(): boolean {\n return this.HasMultipleContents;\n }\n\n OnContentTypeChange() {\n // Content type changes just modify the current content, no new record creation\n this.updateUnsavedChangesFlag();\n }\n\n /** @deprecated Use {@link OnContentTypeChange}. */\n onContentTypeChange() {\n return this.OnContentTypeChange();\n }\n\n OnContentChange() {\n this.updateUnsavedChangesFlag();\n }\n\n /** @deprecated Use {@link OnContentChange}. */\n onContentChange() {\n return this.OnContentChange();\n }\n\n /**\n * Updates the hasUnsavedChanges flag based on entity dirty states\n */\n private updateUnsavedChangesFlag() {\n this.HasUnsavedChanges = this.TemplateContents.some(content => content.Dirty) || \n this.IsAddingNewContent;\n }\n\n OnTemplateTextChange(event: any) {\n if (this.isUpdatingEditorValue) {\n // Ignore change events when we're programmatically updating the editor\n return;\n }\n \n if (this.CurrentTemplateContent) {\n // Extract value from event - might be event.target.value or just event depending on component\n const value = typeof event === 'string' ? event : (event.target?.value || event);\n this.CurrentTemplateContent.TemplateText = value;\n this.updateUnsavedChangesFlag();\n }\n }\n\n /** @deprecated Use {@link OnTemplateTextChange}. */\n onTemplateTextChange(event: any) {\n return this.OnTemplateTextChange(event);\n }\n\n /**\n * Helper method to track setTimeout calls for cleanup\n */\n private setTrackedTimeout(callback: () => void, delay: number): number {\n const timeoutId = setTimeout(() => {\n // Remove from tracking when it executes\n const index = this.activeTimeouts.indexOf(timeoutId);\n if (index > -1) {\n this.activeTimeouts.splice(index, 1);\n }\n callback();\n }, delay) as any as number;\n this.activeTimeouts.push(timeoutId);\n return timeoutId;\n }\n\n /**\n * Manually sync the editor value without triggering change events\n */\n private syncEditorValue() {\n // Use Promise.resolve() to wait for the next microtask after any pending changes\n Promise.resolve().then(() => {\n // Then tracked setTimeout for the next macrotask to ensure DOM is updated\n this.setTrackedTimeout(() => {\n if (!this.CodeEditor) {\n return;\n }\n \n this.isUpdatingEditorValue = true;\n const newValue = this.CurrentTemplateContent?.TemplateText || '';\n \n // Use the setValue method from mj-code-editor component\n this.CodeEditor.setValue(newValue); \n this.isUpdatingEditorValue = false;\n }, 0);\n });\n }\n\n /**\n * Persists the new and changed content rows — the same instances the user edited here — in one\n * transaction. Every failure is logged and shown to the user; the caller gets `false`.\n */\n async SaveTemplateContents(): Promise<boolean> {\n if (!this.config.allowEdit) return false;\n const template = this.Template;\n if (!template) {\n console.error('TemplateEditorComponent.SaveTemplateContents: no Template is bound, nothing to save the contents against');\n return false;\n }\n\n try {\n // Ensure FK is set on all contents (a new template only has its ID once it is saved),\n // then persist the dirty/new ones atomically\n for (const content of this.TemplateContents) {\n content.TemplateID = template.ID;\n }\n const toSave = this.TemplateContents.filter(c => c.Dirty || !c.ID);\n if (toSave.length > 0 && !(await this.submitTemplateContents(template, toSave))) {\n return false;\n }\n\n this.IsAddingNewContent = false;\n this.NewTemplateContent = null;\n this.updateUnsavedChangesFlag();\n this.ContentChange.emit(this.TemplateContents);\n return true;\n } catch (error) {\n this.reportSaveFailure(template, error instanceof Error ? error.message : String(error));\n return false;\n }\n }\n\n private async submitTemplateContents(template: MJTemplateEntity, toSave: MJTemplateContentEntity[]): Promise<boolean> {\n const tg = await this._metadata.CreateTransactionGroup();\n try {\n for (const content of toSave) {\n content.TransactionGroup = tg;\n // Inside a transaction group Save() only queues the row; false here means it was\n // refused before queueing (e.g. validation).\n if (!(await content.Save())) {\n this.reportSaveFailure(template, this.describeContentFailure(content));\n return false;\n }\n }\n if (await tg.Submit()) {\n return true;\n }\n const failed = toSave.filter(c => c.LatestResult && !c.LatestResult.Success);\n this.reportSaveFailure(template, failed.length > 0\n ? failed.map(c => this.describeContentFailure(c)).join('; ')\n : 'the transaction was rejected');\n return false;\n } finally {\n // A row that keeps this group would send its next Delete() into a completed group, which\n // reports success without sending anything (the version would come back on reload).\n for (const content of toSave) {\n if (content.TransactionGroup === tg) {\n content.TransactionGroup = null;\n }\n }\n }\n }\n\n private describeContentFailure(content: MJTemplateContentEntity): string {\n return `content ${content.ID || '(new)'}: ${content.LatestResult?.CompleteMessage || 'unknown error'}`;\n }\n\n private reportSaveFailure(template: MJTemplateEntity, detail: string): void {\n console.error(`Failed to save template contents for template ${template.ID}: ${detail}`);\n this.notificationService.CreateSimpleNotification(`Failed to save template contents: ${detail}`, 'error', 5000);\n }\n\n /**\n * The content rows a HOST FORM should persist inside its own save: every content that is new or\n * dirty, each stamped with the template's ID. Forms that embed this editor (Templates, AI Prompts)\n * call this from their `PopulatePendingRecords()` override, so the template and its contents\n * commit in one transaction and a content that fails validation blocks the save visibly instead\n * of being dropped on the floor. A brand-new content nobody typed into is not a change and is\n * skipped; a read-only editor contributes nothing.\n */\n public GetPendingChanges(): PendingRecordItem[] {\n if (!this.config.allowEdit || !this.Template) {\n return [];\n }\n const pending: PendingRecordItem[] = [];\n for (const content of this.TemplateContents) {\n // An unsaved entity always reports Dirty; the empty-text guard keeps a default row nobody used out.\n const untouchedNew = !content.IsSaved && !(content.TemplateText ?? '').trim();\n if (untouchedNew || !content.Dirty) {\n continue;\n }\n content.TemplateID = this.Template.ID;\n const item = new PendingRecordItem();\n item.entityObject = content;\n item.action = 'save';\n pending.push(item);\n }\n return pending;\n }\n\n /**\n * The host form has persisted the rows from {@link GetPendingChanges}: clear the local dirty state\n * and publish the saved set to listeners.\n */\n public MarkContentsSaved(): void {\n this.IsAddingNewContent = false;\n this.NewTemplateContent = null;\n this.updateUnsavedChangesFlag();\n this.ContentChange.emit(this.TemplateContents);\n }\n\n /** @deprecated Use {@link SaveTemplateContents}. */\n async saveTemplateContents(): Promise<boolean> {\n return this.SaveTemplateContents();\n }\n\n GetContentTypeDisplayText(typeId: string): string {\n if (!typeId) return '-';\n const option = this.ContentTypeOptions.find(opt => opt.value === typeId);\n return option ? option.text : typeId;\n }\n\n /** @deprecated Use {@link GetContentTypeDisplayText}. */\n getContentTypeDisplayText(typeId: string): string {\n return this.GetContentTypeDisplayText(typeId);\n }\n\n GetEditorLanguage(): string {\n if (!this.CurrentTemplateContent?.TypeID) {\n return 'jinja2'; // default to jinja2 for template syntax (compatible with Nunjucks)\n }\n\n const contentType = this.CurrentTemplateContent.TypeID.toLowerCase();\n \n // Map content types to CodeMirror language modes\n switch (contentType) {\n case 'html':\n return 'jinja2'; // Use jinja2 for HTML templates to get template syntax highlighting\n case 'markdown':\n case 'md':\n return 'markdown';\n case 'javascript':\n case 'js':\n return 'javascript';\n case 'css':\n return 'css';\n case 'json':\n return 'json';\n case 'xml':\n return 'xml';\n case 'sql':\n return 'sql';\n case 'text':\n case 'plain':\n default:\n return 'jinja2'; // Default to jinja2 since templates often contain template syntax\n }\n }\n\n /** @deprecated Use {@link GetEditorLanguage}. */\n getEditorLanguage(): string {\n return this.GetEditorLanguage();\n }\n\n /**\n * Test run the current template using the parameter dialog\n */\n async OnRunTemplate() {\n if (!this.Template?.IsSaved || !this.CurrentTemplateContent) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please save the template before running it.', \n 'warning'\n );\n return;\n }\n\n // Save any unsaved changes first\n if (this.HasUnsavedChanges) {\n const saveResult = await this.SaveTemplateContents();\n if (!saveResult) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to save template changes.', \n 'error'\n );\n return;\n }\n }\n\n // Emit the run template event\n this.RunTemplate.emit(this.Template);\n }\n\n /** @deprecated Use {@link OnRunTemplate}. */\n async onRunTemplate() {\n return this.OnRunTemplate();\n }\n\n GetContentTypeOptionsForContent(): Array<{text: string, value: string}> {\n // Always exclude \"Select Type...\" option for all content\n return this.ContentTypeOptions.filter(option => option.value !== '');\n }\n\n /** @deprecated Use {@link GetContentTypeOptionsForContent}. */\n getContentTypeOptionsForContent(): Array<{text: string, value: string}> {\n return this.GetContentTypeOptionsForContent();\n }\n}","@if (template) {\n <div class=\"template-editor\" style=\"height: 100%; display: flex; flex-direction: column;\">\n @if (ContentsLoadState === 'loading') {\n <mj-loading text=\"Loading template contents...\" size=\"medium\"></mj-loading>\n } @else if (ContentsLoadState === 'failed') {\n <!-- The read failed: the template's contents are unknown, so neither \"no content\" nor \"create\" -->\n <div class=\"contents-load-failed\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <h5>Template contents could not be loaded</h5>\n <p>Nothing is shown so nothing can be saved over contents that were not read.</p>\n <button type=\"button\" mjButton variant=\"secondary\" size=\"sm\" (click)=\"RefreshAndDiscardChanges()\">\n <i class=\"fa-solid fa-rotate-right\"></i> Retry\n </button>\n </div>\n } @else {\n <!-- Content Versions List/Tabs -->\n @if (templateContents.length > 0) {\n <div class=\"content-versions-tabs\">\n <div class=\"content-tabs\">\n @for (content of templateContents; track content.ID || $index; let i = $index) {\n <div class=\"content-version-tab\"\n [class.active]=\"selectedContentIndex === i && !isAddingNewContent\"\n (click)=\"selectTemplateContent(i, false)\">\n <div style=\"flex: 1;\">\n <div class=\"tab-label\">\n <!-- From TypeID (what the Content Type dropdown edits); the view-joined Type field is only refreshed on reload -->\n {{ content.TypeID ? GetContentTypeDisplayText(content.TypeID) : 'Version ' + (i + 1) }}\n </div>\n <div class=\"tab-meta\">\n P:{{ content.Priority }}\n @if (!content.IsActive) {\n • <span class=\"inactive-label\">Inactive</span>\n }\n </div>\n </div>\n @if (templateContents.length > 1 && config.allowEdit) {\n <button type=\"button\"\n (click)=\"deleteTemplateContent(i); $event.stopPropagation()\"\n class=\"delete-btn\"\n title=\"Delete this content version\">\n <i class=\"fa-solid fa-trash fa-xs\"></i>\n </button>\n }\n </div>\n }\n @if (isAddingNewContent) {\n <div class=\"content-version-tab adding-new\">\n <i class=\"fa-solid fa-plus text-success\"></i>\n <span class=\"new-label\">New</span>\n </div>\n }\n <!-- Add New Content (Edit Mode Only) -->\n @if (config.allowEdit && !isAddingNewContent) {\n <div class=\"content-version-tab add-new\"\n (click)=\"addNewTemplateContent()\"\n title=\"Add new template content\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Content Editor -->\n @if (currentTemplateContent) {\n <div class=\"content-editor-container\">\n <!-- Content Metadata Bar -->\n <div class=\"content-metadata-bar\">\n <div class=\"metadata-grid\">\n <div class=\"form-group\">\n <label for=\"contentType\" class=\"form-label\">\n <i class=\"fa-solid fa-tag\"></i> Content Type\n </label>\n @if (config.allowEdit) {\n <mj-dropdown [(ngModel)]=\"currentTemplateContent.TypeID\"\n name=\"contentType\"\n [Data]=\"getContentTypeOptionsForContent()\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n (ValueChange)=\"onContentTypeChange()\">\n </mj-dropdown>\n } @else {\n <div class=\"form-control-plaintext\">\n {{ getContentTypeDisplayText(currentTemplateContent.TypeID) }}\n </div>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"priority\" class=\"form-label\">\n <i class=\"fa-solid fa-sort-numeric-up\"></i> Priority\n </label>\n @if (config.allowEdit) {\n <mj-numeric-input [(ngModel)]=\"currentTemplateContent.Priority\"\n name=\"priority\"\n [Min]=\"1\"\n [Step]=\"1\"\n [Format]=\"'n0'\">\n </mj-numeric-input>\n } @else {\n <div class=\"form-control-plaintext\">\n {{ currentTemplateContent.Priority || '-' }}\n </div>\n }\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n <i class=\"fa-solid fa-toggle-on\"></i> Status\n </label>\n @if (config.allowEdit) {\n <div class=\"form-check\">\n <input type=\"checkbox\"\n id=\"isActive\"\n class=\"form-check-input\"\n [(ngModel)]=\"currentTemplateContent.IsActive\"\n name=\"isActive\">\n <label class=\"form-check-label\" for=\"isActive\">\n Active\n </label>\n </div>\n } @else {\n <div class=\"form-control-plaintext\">\n @if (currentTemplateContent.IsActive) {\n <span class=\"badge-success\">\n <i class=\"fa-solid fa-check-circle\"></i> Active\n </span>\n } @else {\n <span class=\"badge-secondary\">\n <i class=\"fa-solid fa-pause-circle\"></i> Inactive\n </span>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Content Text Editor -->\n <div class=\"content-text-editor\">\n <div class=\"editor-header\">\n <label for=\"templateContent\" class=\"editor-label\">\n <i class=\"fa-solid fa-code\"></i> Template Content\n <span class=\"content-type-badge\"\n [class.new]=\"!currentTemplateContent.ID\"\n [class.existing]=\"!!currentTemplateContent.ID\">\n @if (!currentTemplateContent.ID) {\n New\n } @else {\n {{ getContentTypeDisplayText(currentTemplateContent.TypeID) }}\n }\n </span>\n </label>\n <div class=\"editor-actions\">\n @if (!isAddingNewContent && hasUnsavedChanges) {\n <span class=\"unsaved-indicator\">\n <i class=\"fa-solid fa-circle\"></i>\n Unsaved changes\n </span>\n }\n @if (template.IsSaved && currentTemplateContent && config.showRunButton) {\n <button type=\"button\"\n class=\"run-btn\"\n [disabled]=\"isRunningTemplate\"\n (click)=\"onRunTemplate()\"\n title=\"Test run this template\">\n @if (isRunningTemplate) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Run\n }\n </button>\n }\n </div>\n </div>\n <mj-code-editor\n #codeEditor\n (change)=\"onTemplateTextChange($event)\"\n [readonly]=\"!config.allowEdit\"\n [language]=\"getEditorLanguage()\"\n [languages]=\"supportedLanguages\"\n class=\"code-editor-wrapper\">\n </mj-code-editor>\n <!-- Template Help Section with Tabs -->\n @if (!config.compactMode) {\n <div class=\"template-help-section\">\n <!-- Tab Navigation -->\n <div class=\"help-tabs\">\n <button type=\"button\"\n class=\"help-tab\"\n [class.active]=\"activeHelpTab === 'syntax'\"\n (click)=\"activeHelpTab = 'syntax'\">\n <i class=\"fa-solid fa-code\"></i> Template Syntax\n </button>\n <button type=\"button\"\n class=\"help-tab\"\n [class.active]=\"activeHelpTab === 'placeholders'\"\n (click)=\"activeHelpTab = 'placeholders'\">\n <i class=\"fa-solid fa-at\"></i> System Placeholders\n </button>\n </div>\n <!-- Tab Content -->\n <div class=\"help-content\">\n <!-- Template Syntax Tab -->\n @if (activeHelpTab === 'syntax') {\n <div class=\"syntax-help\">\n <div class=\"section-title\">\n <i class=\"fa-solid fa-lightbulb\"></i> Template Syntax Quick Reference\n </div>\n <div class=\"syntax-grid\">\n <div>\n <div class=\"syntax-item\">\n <strong>Parameters:</strong><br>\n <code>{{'{{'}} paramName {{'}}'}}</code>\n </div>\n <div>\n <strong>Template Includes:</strong><br>\n <code>{{'{% template \"TemplateName\" %}'}}</code>\n </div>\n </div>\n <div>\n <div class=\"syntax-item\">\n <strong>Conditionals:</strong><br>\n <code>{{'{% if condition %}'}} ... {{'{% endif %}'}}</code>\n </div>\n <div>\n <strong>Loops:</strong><br>\n <code>{{'{% for item in items %}'}} ... {{'{% endfor %}'}}</code>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- System Placeholders Tab -->\n @if (activeHelpTab === 'placeholders') {\n <div class=\"placeholders-help\">\n <div class=\"section-title\">\n <i class=\"fa-solid fa-at\"></i> System Placeholders Reference\n </div>\n <p class=\"placeholders-description\">\n System placeholders are automatically available in all AI prompt templates. Simply use them in your template text and they will be replaced with their current values at execution time.\n Scoped prompt parts can use the Date & Time, User Context and Environment placeholders, written alone with no filter. A part is not a template: everything else in it is sent as written.\n </p>\n <!-- Category Sub-tabs -->\n <div class=\"category-tabs\">\n @for (categoryGroup of placeholderCategories; track categoryGroup.category.name) {\n <button type=\"button\"\n class=\"category-tab\"\n [class.active]=\"activePlaceholderCategory === categoryGroup.category.name\"\n (click)=\"activePlaceholderCategory = categoryGroup.category.name\">\n <i [class]=\"'fa-solid ' + categoryGroup.category.icon\" style=\"font-size: 0.9em;\"></i>\n {{ categoryGroup.category.name }}\n <span class=\"tab-badge\">\n {{ categoryGroup.placeholders.length }}\n </span>\n </button>\n }\n </div>\n <!-- Active Category Content -->\n <div class=\"placeholder-content\">\n @for (categoryGroup of placeholderCategories; track categoryGroup.category.name) {\n @if (activePlaceholderCategory === categoryGroup.category.name) {\n <div class=\"category-header\">\n <i [class]=\"'fa-solid ' + categoryGroup.category.icon\"\n [style.color]=\"categoryGroup.category.color\"></i>\n <h5>{{ categoryGroup.category.name }}</h5>\n </div>\n <div class=\"placeholder-grid\">\n @for (placeholder of categoryGroup.placeholders; track placeholder.name) {\n <div class=\"placeholder-item\">\n <div class=\"placeholder-item-inner\">\n <div>\n <div class=\"placeholder-name-row\">\n <code class=\"placeholder-code\">{{'{{'}} {{ placeholder.name }} {{'}}'}}</code>\n <button type=\"button\"\n class=\"copy-btn\"\n (click)=\"copyPlaceholder(placeholder.name)\"\n title=\"Copy placeholder to clipboard\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (placeholder.description) {\n <div class=\"placeholder-description\">{{ placeholder.description }}</div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n <!-- Usage Example -->\n <div class=\"usage-example\">\n <div class=\"usage-example-inner\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <div class=\"usage-example-text\">\n <strong>Usage Example:</strong> To use a system placeholder in your template, simply include it in double curly braces.\n For example: <code>\"Today is {{'{{'}} _CURRENT_DATE {{'}}'}} and the current user is {{'{{'}} _USER_NAME {{'}}'}}\"</code>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <!-- No Content State -->\n <div class=\"no-content-state\">\n <i class=\"fa-solid fa-file-plus\"></i>\n <h5>No Template Content</h5>\n <p>Create your first template content version to get started.</p>\n @if (config.allowEdit) {\n <button type=\"button\"\n (click)=\"addNewTemplateContent()\"\n class=\"btn btn-primary\">\n <i class=\"fa-solid fa-plus\"></i> Create First Content Version\n </button>\n }\n </div>\n }\n }\n </div>\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-core-entity-forms",
|
|
3
|
-
"version": "6.2.0-edge.
|
|
3
|
+
"version": "6.2.0-edge.6",
|
|
4
4
|
"description": "MemberJunction Core Entity Angular Forms",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"@angular/compiler": "21.2.22",
|
|
15
15
|
"@angular/compiler-cli": "21.2.22",
|
|
16
|
-
"@memberjunction/ng-test-utils": "6.2.0-edge.
|
|
16
|
+
"@memberjunction/ng-test-utils": "6.2.0-edge.6"
|
|
17
17
|
},
|
|
18
18
|
"peerDependencies": {
|
|
19
19
|
"@angular/cdk": "^21.2.14",
|
|
@@ -25,52 +25,52 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@codemirror/language": "^6.12.4",
|
|
27
27
|
"@codemirror/language-data": "^6.5.2",
|
|
28
|
-
"@memberjunction/actions-base": "6.2.0-edge.
|
|
29
|
-
"@memberjunction/ai": "6.2.0-edge.
|
|
30
|
-
"@memberjunction/ai-core-plus": "6.2.0-edge.
|
|
31
|
-
"@memberjunction/ai-engine-base": "6.2.0-edge.
|
|
32
|
-
"@memberjunction/core": "6.2.0-edge.
|
|
33
|
-
"@memberjunction/core-entities": "6.2.0-edge.
|
|
34
|
-
"@memberjunction/feature-pipelines": "6.2.0-edge.
|
|
35
|
-
"@memberjunction/global": "6.2.0-edge.
|
|
36
|
-
"@memberjunction/graphql-dataprovider": "6.2.0-edge.
|
|
37
|
-
"@memberjunction/ng-action-gallery": "6.2.0-edge.
|
|
38
|
-
"@memberjunction/ng-actions": "6.2.0-edge.
|
|
39
|
-
"@memberjunction/ng-agents": "6.2.0-edge.
|
|
40
|
-
"@memberjunction/ng-artifacts": "6.2.0-edge.
|
|
41
|
-
"@memberjunction/ng-ai-test-harness": "6.2.0-edge.
|
|
42
|
-
"@memberjunction/ng-base-application": "6.2.0-edge.
|
|
43
|
-
"@memberjunction/ng-base-forms": "6.2.0-edge.
|
|
44
|
-
"@memberjunction/ng-base-types": "6.2.0-edge.
|
|
45
|
-
"@memberjunction/ng-code-editor": "6.2.0-edge.
|
|
46
|
-
"@memberjunction/ng-deep-diff": "6.2.0-edge.
|
|
47
|
-
"@memberjunction/ng-entity-relationship-diagram": "6.2.0-edge.
|
|
48
|
-
"@memberjunction/ng-entity-viewer": "6.2.0-edge.
|
|
49
|
-
"@memberjunction/ng-flow-editor": "6.2.0-edge.
|
|
50
|
-
"@memberjunction/ng-hierarchy-tree": "6.2.0-edge.
|
|
51
|
-
"@memberjunction/ng-join-grid": "6.2.0-edge.
|
|
52
|
-
"@memberjunction/ng-link-directives": "6.2.0-edge.
|
|
53
|
-
"@memberjunction/ng-list-management": "6.2.0-edge.
|
|
54
|
-
"@memberjunction/ng-markdown": "6.2.0-edge.
|
|
55
|
-
"@memberjunction/ng-notifications": "6.2.0-edge.
|
|
56
|
-
"@memberjunction/ng-record-clone": "6.2.0-edge.
|
|
57
|
-
"@memberjunction/ng-record-process-studio": "6.2.0-edge.
|
|
58
|
-
"@memberjunction/ng-rubrics": "6.2.0-edge.
|
|
59
|
-
"@memberjunction/ng-resource-permissions": "6.2.0-edge.
|
|
60
|
-
"@memberjunction/ng-search": "6.2.0-edge.
|
|
61
|
-
"@memberjunction/ng-shared": "6.2.0-edge.
|
|
62
|
-
"@memberjunction/ng-shared-generic": "6.2.0-edge.
|
|
63
|
-
"@memberjunction/ng-tabstrip": "6.2.0-edge.
|
|
64
|
-
"@memberjunction/ng-task-graph-editor": "6.2.0-edge.
|
|
65
|
-
"@memberjunction/ng-testing": "6.2.0-edge.
|
|
66
|
-
"@memberjunction/ng-timeline": "6.2.0-edge.
|
|
67
|
-
"@memberjunction/ng-trees": "6.2.0-edge.
|
|
68
|
-
"@memberjunction/ng-ui-components": "6.2.0-edge.
|
|
69
|
-
"@memberjunction/ng-versions": "6.2.0-edge.
|
|
70
|
-
"@memberjunction/predictive-studio-core": "6.2.0-edge.
|
|
71
|
-
"@memberjunction/record-cloning-base": "6.2.0-edge.
|
|
72
|
-
"@memberjunction/rubrics-base": "6.2.0-edge.
|
|
73
|
-
"@memberjunction/templates-base-types": "6.2.0-edge.
|
|
28
|
+
"@memberjunction/actions-base": "6.2.0-edge.6",
|
|
29
|
+
"@memberjunction/ai": "6.2.0-edge.6",
|
|
30
|
+
"@memberjunction/ai-core-plus": "6.2.0-edge.6",
|
|
31
|
+
"@memberjunction/ai-engine-base": "6.2.0-edge.6",
|
|
32
|
+
"@memberjunction/core": "6.2.0-edge.6",
|
|
33
|
+
"@memberjunction/core-entities": "6.2.0-edge.6",
|
|
34
|
+
"@memberjunction/feature-pipelines": "6.2.0-edge.6",
|
|
35
|
+
"@memberjunction/global": "6.2.0-edge.6",
|
|
36
|
+
"@memberjunction/graphql-dataprovider": "6.2.0-edge.6",
|
|
37
|
+
"@memberjunction/ng-action-gallery": "6.2.0-edge.6",
|
|
38
|
+
"@memberjunction/ng-actions": "6.2.0-edge.6",
|
|
39
|
+
"@memberjunction/ng-agents": "6.2.0-edge.6",
|
|
40
|
+
"@memberjunction/ng-artifacts": "6.2.0-edge.6",
|
|
41
|
+
"@memberjunction/ng-ai-test-harness": "6.2.0-edge.6",
|
|
42
|
+
"@memberjunction/ng-base-application": "6.2.0-edge.6",
|
|
43
|
+
"@memberjunction/ng-base-forms": "6.2.0-edge.6",
|
|
44
|
+
"@memberjunction/ng-base-types": "6.2.0-edge.6",
|
|
45
|
+
"@memberjunction/ng-code-editor": "6.2.0-edge.6",
|
|
46
|
+
"@memberjunction/ng-deep-diff": "6.2.0-edge.6",
|
|
47
|
+
"@memberjunction/ng-entity-relationship-diagram": "6.2.0-edge.6",
|
|
48
|
+
"@memberjunction/ng-entity-viewer": "6.2.0-edge.6",
|
|
49
|
+
"@memberjunction/ng-flow-editor": "6.2.0-edge.6",
|
|
50
|
+
"@memberjunction/ng-hierarchy-tree": "6.2.0-edge.6",
|
|
51
|
+
"@memberjunction/ng-join-grid": "6.2.0-edge.6",
|
|
52
|
+
"@memberjunction/ng-link-directives": "6.2.0-edge.6",
|
|
53
|
+
"@memberjunction/ng-list-management": "6.2.0-edge.6",
|
|
54
|
+
"@memberjunction/ng-markdown": "6.2.0-edge.6",
|
|
55
|
+
"@memberjunction/ng-notifications": "6.2.0-edge.6",
|
|
56
|
+
"@memberjunction/ng-record-clone": "6.2.0-edge.6",
|
|
57
|
+
"@memberjunction/ng-record-process-studio": "6.2.0-edge.6",
|
|
58
|
+
"@memberjunction/ng-rubrics": "6.2.0-edge.6",
|
|
59
|
+
"@memberjunction/ng-resource-permissions": "6.2.0-edge.6",
|
|
60
|
+
"@memberjunction/ng-search": "6.2.0-edge.6",
|
|
61
|
+
"@memberjunction/ng-shared": "6.2.0-edge.6",
|
|
62
|
+
"@memberjunction/ng-shared-generic": "6.2.0-edge.6",
|
|
63
|
+
"@memberjunction/ng-tabstrip": "6.2.0-edge.6",
|
|
64
|
+
"@memberjunction/ng-task-graph-editor": "6.2.0-edge.6",
|
|
65
|
+
"@memberjunction/ng-testing": "6.2.0-edge.6",
|
|
66
|
+
"@memberjunction/ng-timeline": "6.2.0-edge.6",
|
|
67
|
+
"@memberjunction/ng-trees": "6.2.0-edge.6",
|
|
68
|
+
"@memberjunction/ng-ui-components": "6.2.0-edge.6",
|
|
69
|
+
"@memberjunction/ng-versions": "6.2.0-edge.6",
|
|
70
|
+
"@memberjunction/predictive-studio-core": "6.2.0-edge.6",
|
|
71
|
+
"@memberjunction/record-cloning-base": "6.2.0-edge.6",
|
|
72
|
+
"@memberjunction/rubrics-base": "6.2.0-edge.6",
|
|
73
|
+
"@memberjunction/templates-base-types": "6.2.0-edge.6",
|
|
74
74
|
"@types/d3": "^7.4.3",
|
|
75
75
|
"ag-grid-angular": "^35.0.1",
|
|
76
76
|
"ag-grid-community": "^35.0.1",
|