@nyaruka/temba-components 0.156.1 → 0.156.2
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/CHANGELOG.md
CHANGED
|
@@ -4,8 +4,16 @@ All notable changes to this project will be documented in this file. Dates are d
|
|
|
4
4
|
|
|
5
5
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
6
6
|
|
|
7
|
+
#### [v0.156.2](https://github.com/nyaruka/temba-components/compare/v0.156.1...v0.156.2)
|
|
8
|
+
|
|
9
|
+
- Filter smart groups from add-to-group action [`#953`](https://github.com/nyaruka/temba-components/pull/953)
|
|
10
|
+
- Hide auto translate button in localization toolbar [`#952`](https://github.com/nyaruka/temba-components/pull/952)
|
|
11
|
+
- Fix context menu not working after toggling back from table view [`#954`](https://github.com/nyaruka/temba-components/pull/954)
|
|
12
|
+
|
|
7
13
|
#### [v0.156.1](https://github.com/nyaruka/temba-components/compare/v0.156.0...v0.156.1)
|
|
8
14
|
|
|
15
|
+
> 8 April 2026
|
|
16
|
+
|
|
9
17
|
- Exclude .pnpm-store and dev dirs from npm package [`d6df2b9`](https://github.com/nyaruka/temba-components/commit/d6df2b9c660211d63d31accd4bc9260af238a8da)
|
|
10
18
|
|
|
11
19
|
#### [v0.156.0](https://github.com/nyaruka/temba-components/compare/v0.155.0...v0.156.0)
|
package/dist/temba-components.js
CHANGED
|
@@ -8791,7 +8791,7 @@ background: #ccc;
|
|
|
8791
8791
|
${this.renderUploader()}
|
|
8792
8792
|
</div>
|
|
8793
8793
|
</div>
|
|
8794
|
-
</div>`}}t([mt({type:String,attribute:!1})],cu.prototype,"endpoint",void 0),t([mt({type:Boolean})],cu.prototype,"pendingDrop",void 0),t([mt({type:Boolean})],cu.prototype,"ignoreDrops",void 0),t([mt({type:String})],cu.prototype,"icon",void 0),t([mt({type:String})],cu.prototype,"accept",void 0),t([mt({type:Number})],cu.prototype,"max",void 0),t([mt({type:Array})],cu.prototype,"attachments",void 0),t([mt({type:Boolean,attribute:!1})],cu.prototype,"uploading",void 0);let hu="dev";try{hu="0.156.
|
|
8794
|
+
</div>`}}t([mt({type:String,attribute:!1})],cu.prototype,"endpoint",void 0),t([mt({type:Boolean})],cu.prototype,"pendingDrop",void 0),t([mt({type:Boolean})],cu.prototype,"ignoreDrops",void 0),t([mt({type:String})],cu.prototype,"icon",void 0),t([mt({type:String})],cu.prototype,"accept",void 0),t([mt({type:Number})],cu.prototype,"max",void 0),t([mt({type:Array})],cu.prototype,"attachments",void 0),t([mt({type:Boolean,attribute:!1})],cu.prototype,"uploading",void 0);let hu="dev";try{hu="0.156.2"}catch(t){}const uu=hu,pu="undefined"!=typeof navigator&&/Mac|iPod|iPhone|iPad/.test(navigator.platform);function mu(t){return 0!==t.button||!(!pu||!t.ctrlKey)}function gu(t){if(t.dependency){const e=t.dependency.name||t.dependency.key;return`Cannot find a ${t.dependency.type} for ${e}`}return t.description}function fu(t){const e=20*Math.round(t/20);return Math.max(e,0)}const vu="font-family:SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;font-size:0.95em",bu={[Vd.ExpressionPrefix]:`color:${dc.expression};font-weight:600;${vu}`,[Vd.Identifier]:`color:${dc.expression};${vu}`,[Vd.FunctionName]:`color:${dc.fn};font-weight:900;${vu}`,[Vd.StringLiteral]:`color:${dc.string};${vu}`,[Vd.NumberLiteral]:`color:${dc.number};${vu}`,[Vd.Keyword]:`color:${dc.keyword};${vu}`,[Vd.Operator]:`color:${dc.operator};${vu}`,[Vd.ContextRef]:`color:${dc.expression};${vu}`,[Vd.Separator]:`color:${dc.operator};${vu}`,[Vd.Arrow]:`color:${dc.operator};${vu}`,[Vd.Bracket]:`color:${dc.operator};${vu}`,[Vd.Paren]:`color:${dc.paren};${vu}`,[Vd.Whitespace]:vu},yu=[[/claude|anthropic/i,"anthropic"],[/gpt|openai|o1|o3|o4/i,"openai"],[/gemini|google/i,"gemini"],[/azure|microsoft/i,"azure"],[/deepseek/i,"deepseek"]],xu=(t,e=!1)=>{const i=Qd(t||"",e?Nd:Rd),o=[];for(const t of i){const e=!!bu[t.type],i=o[o.length-1];i&&i.isExpr===e?i.tokens.push(t):o.push({isExpr:e,tokens:[t]})}const n=t=>{const e=bu[t.type];if(!e){const e=t.text.split("\n");return H`${e.map((t,e)=>H`${e>0?H`<br />`:null}${t}`)}`}const i=t.text.split("\n");return H`${i.map((t,i)=>H`${i>0?H`<br />`:null}${t?H`<span style="${e}">${t}</span>`:null}`)}`};return H`${o.map(t=>{const e=H`${t.tokens.map(n)}`;return t.isExpr?H`<span style="hyphens:none">${e}</span>`:e})}`},wu=(t,e,i=3)=>H`<div
|
|
8795
8795
|
style="display: -webkit-box; -webkit-line-clamp: ${i}; -webkit-box-orient: vertical; overflow: hidden; word-wrap: break-word; overflow-wrap: break-word; hyphens: auto;"
|
|
8796
8796
|
title="${e}"
|
|
8797
8797
|
>
|
|
@@ -8870,7 +8870,7 @@ background: #ccc;
|
|
|
8870
8870
|
${$u([e.flow],"flow")}
|
|
8871
8871
|
</div>
|
|
8872
8872
|
</div>
|
|
8873
|
-
`},toFormData:t=>{var e;const i=t;let o="manual";t.create_contact?o="create":i.contact_query&&(o="query");const n=[{value:"manual",name:"Select recipients manually"},{value:"query",name:"Select a contact with a query"},{value:"create",name:"Create a new contact"}],s=n.find(t=>t.value===o)||n[0];return{flow:t.flow?[t.flow]:null,recipients:[...(t.contacts||[]).map(t=>({id:t.uuid,name:t.name,type:"contact"})),...(t.groups||[]).map(t=>({id:t.uuid,name:t.name,type:"group"})),...(t.legacy_vars||[]).map(t=>({id:t,name:t,type:"expression"}))],startType:[s],contactQuery:i.contact_query||"",skipContactsInFlow:(null===(e=i.exclusions)||void 0===e?void 0:e.in_a_flow)||!1,uuid:t.uuid}},form:{flow:{type:"select",label:"Flow",helpText:"Select the flow to start",required:!0,searchable:!0,endpoint:"/api/v2/flows.json",valueKey:"uuid",nameKey:"name",placeholder:"Select a flow..."},startType:{type:"select",label:"Start Type",helpText:"How should contacts be selected?",required:!0,options:[{value:"manual",name:"Select recipients manually"},{value:"query",name:"Select a contact with a query"},{value:"create",name:"Create a new contact"}]},recipients:{type:"select",label:"Recipients",helpText:"Select who should be started in the flow",multi:!0,searchable:!0,endpoint:"/contact/omnibox/?types=gc",queryParam:"search",valueKey:"id",nameKey:"name",placeholder:"Search for contacts or groups...",expressions:"session",conditions:{visible:t=>{var e,i;return"manual"===(null===(i=null===(e=t.startType)||void 0===e?void 0:e[0])||void 0===i?void 0:i.value)}}},contactQuery:{type:"text",evaluated:!0,label:"Contact Query",helpText:"Only one matching contact will be started",placeholder:"household_id = @fields.household_id",conditions:{visible:t=>{var e,i;return"query"===(null===(i=null===(e=t.startType)||void 0===e?void 0:e[0])||void 0===i?void 0:i.value)}}},skipContactsInFlow:{type:"checkbox",label:"Skip contacts currently in a flow",helpText:"Avoid interrupting a contact who is already in a flow"}},layout:["flow","startType","recipients","contactQuery","skipContactsInFlow"],validate:t=>{var e,i;const o={},n=null===(i=null===(e=t.startType)||void 0===e?void 0:e[0])||void 0===i?void 0:i.value;return"manual"!==n||t.recipients&&0!==t.recipients.length||(o.recipients="At least one contact or group must be selected"),"query"!==n||t.contactQuery&&t.contactQuery.trim()||(o.contactQuery="Contact query is required"),{valid:0===Object.keys(o).length,errors:o}},fromFormData:t=>{const e={uuid:t.uuid,type:"start_session",flow:{uuid:t.flow[0].uuid||t.flow[0].value,name:t.flow[0].name},groups:[],contacts:[]},i=t.startType[0].value;if("create"===i)e.create_contact=!0;else if("query"===i)e.contact_query=t.contactQuery||"";else{const i=t.recipients||[];e.contacts=i.filter(t=>"contact"===t.type||!t.type&&!t.expression&&t.id).map(t=>({uuid:t.id,name:t.name})),e.groups=i.filter(t=>"group"===t.type).map(t=>({uuid:t.id,name:t.name}));const o=i.filter(t=>"expression"===t.type||t.expression).map(t=>t.value||t.name||t.id);o.length>0&&(e.legacy_vars=o)}return t.skipContactsInFlow&&(e.exclusions={in_a_flow:!0}),e}},op={name:"Update Name",group:qu.contacts,flowTypes:[Ru,Pu,Nu],render:(t,e)=>wu(H`Set to ${xu(e.name,!0)}`,`Set to ${e.name}`),form:{name:{type:"text",label:"Name",placeholder:"Enter contact name...",required:!0,evaluated:!0,helpText:"The new name for the contact. You can use expressions like @contact.name"}},sanitize:t=>{t.name&&"string"==typeof t.name&&(t.name=t.name.trim())}},np={name:"Add to Group",group:qu.contacts,flowTypes:[Ru,Pu,Nu],render:(t,e)=>H`<div>${Eu(e.groups,"group")}</div>`,toFormData:t=>({groups:t.groups||null,uuid:t.uuid}),form:{groups:{type:"select",label:"Groups",helpText:"Select the groups to add the contact to",required:!0,options:[],multi:!0,searchable:!0,endpoint:"/api/v2/groups.json",valueKey:"uuid",nameKey:"name",placeholder:"Search for groups...",allowCreate:!0,createArbitraryOption:(t,e)=>!e.find(e=>e.name.toLowerCase().trim()===t.toLowerCase().trim())&&t.trim()?{name:t.trim(),arbitrary:!0}:null}},fromFormData:t=>({uuid:t.uuid,type:"add_contact_groups",groups:(t.groups||[]).map(t=>({uuid:t.uuid,name:t.name}))})},sp={name:"Remove from Group",group:qu.contacts,flowTypes:[Ru,Pu,Nu],render:(t,e)=>e.all_groups?H`<div>Remove from all groups</div>`:H`<div>${Eu(e.groups,"group")}</div>`,toFormData:t=>({uuid:t.uuid,all_groups:t.all_groups||!1,groups:t.groups||null}),form:{groups:{type:"select",label:"Groups",helpText:"Select the groups to remove the contact from",options:[],multi:!0,searchable:!0,endpoint:"/api/v2/groups.json",valueKey:"uuid",nameKey:"name",placeholder:"Search for groups...",conditions:{visible:t=>!t.all_groups}},all_groups:{type:"checkbox",label:"Remove from All Groups",helpText:"Check this to remove the contact from all groups instead of specific ones"}},validate:t=>{const e={};return t.all_groups||t.groups&&0!==t.groups.length||(e.groups='At least one group must be selected or check "Remove from All Groups"'),{valid:0===Object.keys(e).length,errors:e}},fromFormData:t=>({uuid:t.uuid,type:"remove_contact_groups",groups:t.all_groups?[]:(t.groups||[]).map(t=>({uuid:t.uuid,name:t.name})),all_groups:t.all_groups||!1})},rp={name:"Request Opt-In",group:qu.send,flowTypes:[],render:(t,e)=>{var i;const o=(null===(i=e.optin)||void 0===i?void 0:i.name)||"Unknown opt-in";return wu(H`Request <strong>${o}</strong>`,`Request ${o}`)},toFormData:t=>({uuid:t.uuid,optin:t.optin?[t.optin]:null}),form:{optin:{type:"select",label:"Opt-In",required:!0,searchable:!0,endpoint:"/api/v2/optins.json",valueKey:"uuid",nameKey:"name",placeholder:"Search for opt-ins or type to create one...",helpText:"Select an existing opt-in to request, or type a name to create a new one.",allowCreate:!0,createArbitraryOption:(t,e)=>!e.find(e=>e.name.toLowerCase().trim()===t.toLowerCase().trim())&&t.trim()?{name:t.trim(),arbitrary:!0}:null}},fromFormData:t=>{var e;const i=null===(e=t.optin)||void 0===e?void 0:e[0];return{uuid:t.uuid,type:"request_optin",optin:{uuid:i.uuid||i.value,name:i.name}}}},ap=H`<svg
|
|
8873
|
+
`},toFormData:t=>{var e;const i=t;let o="manual";t.create_contact?o="create":i.contact_query&&(o="query");const n=[{value:"manual",name:"Select recipients manually"},{value:"query",name:"Select a contact with a query"},{value:"create",name:"Create a new contact"}],s=n.find(t=>t.value===o)||n[0];return{flow:t.flow?[t.flow]:null,recipients:[...(t.contacts||[]).map(t=>({id:t.uuid,name:t.name,type:"contact"})),...(t.groups||[]).map(t=>({id:t.uuid,name:t.name,type:"group"})),...(t.legacy_vars||[]).map(t=>({id:t,name:t,type:"expression"}))],startType:[s],contactQuery:i.contact_query||"",skipContactsInFlow:(null===(e=i.exclusions)||void 0===e?void 0:e.in_a_flow)||!1,uuid:t.uuid}},form:{flow:{type:"select",label:"Flow",helpText:"Select the flow to start",required:!0,searchable:!0,endpoint:"/api/v2/flows.json",valueKey:"uuid",nameKey:"name",placeholder:"Select a flow..."},startType:{type:"select",label:"Start Type",helpText:"How should contacts be selected?",required:!0,options:[{value:"manual",name:"Select recipients manually"},{value:"query",name:"Select a contact with a query"},{value:"create",name:"Create a new contact"}]},recipients:{type:"select",label:"Recipients",helpText:"Select who should be started in the flow",multi:!0,searchable:!0,endpoint:"/contact/omnibox/?types=gc",queryParam:"search",valueKey:"id",nameKey:"name",placeholder:"Search for contacts or groups...",expressions:"session",conditions:{visible:t=>{var e,i;return"manual"===(null===(i=null===(e=t.startType)||void 0===e?void 0:e[0])||void 0===i?void 0:i.value)}}},contactQuery:{type:"text",evaluated:!0,label:"Contact Query",helpText:"Only one matching contact will be started",placeholder:"household_id = @fields.household_id",conditions:{visible:t=>{var e,i;return"query"===(null===(i=null===(e=t.startType)||void 0===e?void 0:e[0])||void 0===i?void 0:i.value)}}},skipContactsInFlow:{type:"checkbox",label:"Skip contacts currently in a flow",helpText:"Avoid interrupting a contact who is already in a flow"}},layout:["flow","startType","recipients","contactQuery","skipContactsInFlow"],validate:t=>{var e,i;const o={},n=null===(i=null===(e=t.startType)||void 0===e?void 0:e[0])||void 0===i?void 0:i.value;return"manual"!==n||t.recipients&&0!==t.recipients.length||(o.recipients="At least one contact or group must be selected"),"query"!==n||t.contactQuery&&t.contactQuery.trim()||(o.contactQuery="Contact query is required"),{valid:0===Object.keys(o).length,errors:o}},fromFormData:t=>{const e={uuid:t.uuid,type:"start_session",flow:{uuid:t.flow[0].uuid||t.flow[0].value,name:t.flow[0].name},groups:[],contacts:[]},i=t.startType[0].value;if("create"===i)e.create_contact=!0;else if("query"===i)e.contact_query=t.contactQuery||"";else{const i=t.recipients||[];e.contacts=i.filter(t=>"contact"===t.type||!t.type&&!t.expression&&t.id).map(t=>({uuid:t.id,name:t.name})),e.groups=i.filter(t=>"group"===t.type).map(t=>({uuid:t.id,name:t.name}));const o=i.filter(t=>"expression"===t.type||t.expression).map(t=>t.value||t.name||t.id);o.length>0&&(e.legacy_vars=o)}return t.skipContactsInFlow&&(e.exclusions={in_a_flow:!0}),e}},op={name:"Update Name",group:qu.contacts,flowTypes:[Ru,Pu,Nu],render:(t,e)=>wu(H`Set to ${xu(e.name,!0)}`,`Set to ${e.name}`),form:{name:{type:"text",label:"Name",placeholder:"Enter contact name...",required:!0,evaluated:!0,helpText:"The new name for the contact. You can use expressions like @contact.name"}},sanitize:t=>{t.name&&"string"==typeof t.name&&(t.name=t.name.trim())}},np={name:"Add to Group",group:qu.contacts,flowTypes:[Ru,Pu,Nu],render:(t,e)=>H`<div>${Eu(e.groups,"group")}</div>`,toFormData:t=>({groups:t.groups||null,uuid:t.uuid}),form:{groups:{type:"select",label:"Groups",helpText:"Select the groups to add the contact to",required:!0,options:[],multi:!0,searchable:!0,endpoint:"/api/v2/groups.json",valueKey:"uuid",nameKey:"name",placeholder:"Search for groups...",shouldExclude:t=>!!t.query,allowCreate:!0,createArbitraryOption:(t,e)=>!e.find(e=>e.name.toLowerCase().trim()===t.toLowerCase().trim())&&t.trim()?{name:t.trim(),arbitrary:!0}:null}},fromFormData:t=>({uuid:t.uuid,type:"add_contact_groups",groups:(t.groups||[]).map(t=>({uuid:t.uuid,name:t.name}))})},sp={name:"Remove from Group",group:qu.contacts,flowTypes:[Ru,Pu,Nu],render:(t,e)=>e.all_groups?H`<div>Remove from all groups</div>`:H`<div>${Eu(e.groups,"group")}</div>`,toFormData:t=>({uuid:t.uuid,all_groups:t.all_groups||!1,groups:t.groups||null}),form:{groups:{type:"select",label:"Groups",helpText:"Select the groups to remove the contact from",options:[],multi:!0,searchable:!0,endpoint:"/api/v2/groups.json",valueKey:"uuid",nameKey:"name",placeholder:"Search for groups...",conditions:{visible:t=>!t.all_groups}},all_groups:{type:"checkbox",label:"Remove from All Groups",helpText:"Check this to remove the contact from all groups instead of specific ones"}},validate:t=>{const e={};return t.all_groups||t.groups&&0!==t.groups.length||(e.groups='At least one group must be selected or check "Remove from All Groups"'),{valid:0===Object.keys(e).length,errors:e}},fromFormData:t=>({uuid:t.uuid,type:"remove_contact_groups",groups:t.all_groups?[]:(t.groups||[]).map(t=>({uuid:t.uuid,name:t.name})),all_groups:t.all_groups||!1})},rp={name:"Request Opt-In",group:qu.send,flowTypes:[],render:(t,e)=>{var i;const o=(null===(i=e.optin)||void 0===i?void 0:i.name)||"Unknown opt-in";return wu(H`Request <strong>${o}</strong>`,`Request ${o}`)},toFormData:t=>({uuid:t.uuid,optin:t.optin?[t.optin]:null}),form:{optin:{type:"select",label:"Opt-In",required:!0,searchable:!0,endpoint:"/api/v2/optins.json",valueKey:"uuid",nameKey:"name",placeholder:"Search for opt-ins or type to create one...",helpText:"Select an existing opt-in to request, or type a name to create a new one.",allowCreate:!0,createArbitraryOption:(t,e)=>!e.find(e=>e.name.toLowerCase().trim()===t.toLowerCase().trim())&&t.trim()?{name:t.trim(),arbitrary:!0}:null}},fromFormData:t=>{var e;const i=null===(e=t.optin)||void 0===e?void 0:e[0];return{uuid:t.uuid,type:"request_optin",optin:{uuid:i.uuid||i.value,name:i.name}}}},ap=H`<svg
|
|
8874
8874
|
viewBox="0 0 24 24"
|
|
8875
8875
|
width="16"
|
|
8876
8876
|
height="16"
|
|
@@ -10552,7 +10552,7 @@ background: #ccc;
|
|
|
10552
10552
|
animation-timing-function: linear;
|
|
10553
10553
|
animation-fill-mode: forwards;
|
|
10554
10554
|
}
|
|
10555
|
-
`}constructor(){super(),this.saveTimer=null,this.flowType="message",this.features=[],this.activityTimer=null,this.activityInterval=100,this.isDragging=!1,this.isMouseDown=!1,this.shiftDragCopy=!1,this.currentDragIsCopy=!1,this.dragStartPos={x:0,y:0},this.currentDragItem=null,this.startPos={left:0,top:0},this.autoScrollAnimationId=null,this.autoScrollDeltaX=0,this.autoScrollDeltaY=0,this.lastPointerPos=null,this.selectedItems=new Set,this.isSelecting=!1,this.selectionBox=null,this.isTouchDevice=!1,this.isTwoFingerPanning=!1,this.twoFingerDidPan=!1,this.twoFingerStartMidX=0,this.twoFingerStartMidY=0,this.twoFingerOnCanvas=!1,this.lastPanX=0,this.lastPanY=0,this.targetId=null,this.sourceId=null,this.dragFromNodeId=null,this.originalConnectionTargetId=null,this.isValidTarget=!0,this.connectionSourceX=null,this.connectionSourceY=null,this.issuesWindowHidden=!0,this.localizationWindowHidden=!0,this.translationSettingsExpanded=!1,this.autoTranslateDialogOpen=!1,this.autoTranslating=!1,this.autoTranslateModel=null,this.autoTranslateError=null,this.revisionsWindowHidden=!0,this.revisions=[],this.viewingRevision=null,this.isLoadingRevisions=!1,this.isSaving=!1,this.saveError=null,this.zoom=1,this.zoomInitialized=!1,this.zoomFitted=!1,this.loupeEl=null,this.loupeContentEl=null,this.loupeRAF=null,this.hiddenTitles=[],this._suppressDirtySave=!1,this.savePromise=null,this.pendingTimer=new Om("Unsaved Changes",5e3,this,()=>{this.pendingPositions=null,this.copiedItemUuids=[],this.saveChanges()}),this.pendingPositions=null,this.copiedItemUuids=[],this.preRevertState=null,this.revisionsBrowseLanguageCode=null,this.deleteDialog=null,this.translationCache=new Map,this.dirtyAdapter={dirtyMessage:"Your flow is still saving. If you leave now, your latest changes may be lost.",markClean:()=>{}},this.boundBeforeUnload=t=>{t.preventDefault()},this.editingNode=null,this.editingNodeUI=null,this.editingAction=null,this.dialogOrigin=null,this.showMessageTable=!1,this.showLanguageOptions=!1,this.isCreatingNewNode=!1,this.pendingNodePosition=null,this.canvasDropPreview=null,this.addActionToNodeUuid=null,this.actionDragTargetNodeUuid=null,this.previousActionDragTargetNodeUuid=null,this.connectionPlaceholder=null,this.pendingCanvasConnection=null,this.canvasMouseDown=!1,this.boundMouseMove=this.handleMouseMove.bind(this),this.boundMouseUp=this.handleMouseUp.bind(this),this.boundGlobalMouseDown=this.handleGlobalMouseDown.bind(this),this.boundKeyDown=this.handleKeyDown.bind(this),this.boundCanvasContextMenu=this.handleCanvasContextMenu.bind(this),this.boundWheel=this.handleWheel.bind(this),this.boundTouchMove=this.handleTouchMove.bind(this),this.boundTouchEnd=this.handleTouchEnd.bind(this),this.boundTouchCancel=this.handleTouchCancel.bind(this),this.boundCanvasTouchStart=this.handleCanvasTouchStart.bind(this),this.boundWindowResize=this.updateZoomControlPositioning.bind(this),this.flushSave=async()=>{const t=this.definition?{...this.definition}:null;this.pendingTimer.unsaved&&(this.pendingPositions=null,this.copiedItemUuids=[],this.pendingTimer.dismiss()),null!==this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),this.savePromise&&await this.savePromise,t&&this.dirtyDate&&await this.saveChanges(t)},this.boundLoupeMouseMove=this.handleLoupeMouseMove.bind(this),this.boundLoupeMouseDown=this.handleLoupeMouseDown.bind(this),this.boundLoupeMouseUp=this.handleLoupeMouseUp.bind(this),this.boundLoupeKeyDown=this.handleLoupeKeyDown.bind(this),this.boundLoupeKeyUp=this.handleLoupeKeyUp.bind(this),this.loupeKeyHeld=!1,this.loupeMouseIsDown=!1,this.loupeLastMouse=null,this.loupeCloneTime=0,this.loupeClone=null,this.loupeCursorCanvas={x:0,y:0},this.editForceBase=!1}firstUpdated(t){var e;super.firstUpdated(t),this.plumber=new Dm(this.querySelector("#canvas"),this),this.plumber.zoom=this.zoom,this.setupGlobalEventListeners(),null===(e=Ed())||void 0===e||e.getState().setFlushSave(this.flushSave),Sd.getState().setFeatures(this.features),navigator.maxTouchPoints>0&&this.markTouchDevice(),this.updateZoomControlPositioning(),this.loupeEl=this.querySelector("#loupe"),this.loupeContentEl=this.querySelector("#loupe-content"),this.initLoupe(),t.has("flow")&&this.flow&&setTimeout(()=>{this.isConnected&&this.flow&&(Ed().getState().fetchRevision(`/flow/revisions/${this.flow}`),this.fetchRevisions())},0),this.plumber.on("connection:drag",t=>{this.dragFromNodeId=t.data.nodeId,this.sourceId=t.sourceId,this.connectionSourceX=t.sourceX,this.connectionSourceY=t.sourceY,this.originalConnectionTargetId=t.target.id}),this.plumber.on("connection:abort",t=>{this.makeConnection(t)}),this.plumber.on("connection:detach",t=>{this.makeConnection(t)})}makeConnection(t){if(this.sourceId&&this.targetId&&this.isValidTarget)t.target.id===this.targetId?this.plumber.connectIds(this.dragFromNodeId,this.sourceId,this.targetId):Ed().getState().updateConnection(this.dragFromNodeId,this.sourceId,this.targetId);else if(this.connectionPlaceholder&&this.connectionPlaceholder.visible&&this.sourceId){const t={left:fu(this.connectionPlaceholder.position.left),top:fu(this.connectionPlaceholder.position.top)},e=!!this.connectionPlaceholder.dragUp;this.connectionPlaceholder.position=t,this.pendingCanvasConnection={fromNodeId:this.dragFromNodeId,exitId:this.sourceId,position:t};const i=this.querySelector("#canvas");if(i){const o=i.getBoundingClientRect(),n=o.left+t.left*this.zoom-40,s=e?o.top+t.top*this.zoom+74:o.top+t.top*this.zoom+80,r=this.querySelector("temba-canvas-menu");r&&r.show(n,s,{x:t.left,y:t.top},!1,!1,"message"===this.flowType)}return void this.requestUpdate()}document.querySelectorAll("temba-flow-node").forEach(t=>{t.classList.remove("connection-target-valid","connection-target-invalid")}),this.pendingCanvasConnection||(this.sourceId=null,this.connectionSourceX=null,this.connectionSourceY=null,this.dragFromNodeId=null),this.targetId=null,this.isValidTarget=!0}willUpdate(t){var e;super.willUpdate(t),t.has("definition")&&((null===(e=this.definition)||void 0===e?void 0:e.type)&&(this.flowType=this.getFlowTypeFromDefinition(this.definition.type)),this.restoreInitialZoomFromSettings()),t.has("dirtyDate")&&this.dirtyDate&&(this.pendingTimer.pending?(this.pendingTimer.pending=!1,this._suppressDirtySave=!0):this.pendingTimer.unsaved?(this.pendingTimer.start(!1),this._suppressDirtySave=!0):this.isSaving=!0)}restoreInitialZoomFromSettings(){if(this.zoomInitialized||!this.definition)return;const t=this.getFlowSetting("zoom");if("number"==typeof t&&Number.isFinite(t)){const e=Math.max(.3,Math.min(1,Math.round(100*t)/100));this.zoom=e,this.plumber&&(this.plumber.zoom=e)}this.zoomInitialized=!0}setSimulatorTabHidden(t){var e;const i=document.querySelector("temba-simulator"),o=null===(e=null==i?void 0:i.shadowRoot)||void 0===e?void 0:e.querySelector("#phone-tab");o&&(o.hidden=t)}updated(t){var e;if(super.updated(t),t.has("features")&&Sd.getState().setFeatures(this.features),t.has("revisionsWindowHidden")&&this.setSimulatorTabHidden(!this.revisionsWindowHidden),t.has("canvasSize")&&this.updateZoomControlPositioning(),t.has("showMessageTable")&&!this.showMessageTable&&this.plumber&&requestAnimationFrame(()=>{const t=this.querySelector("#canvas");t&&(this.plumber.setContainer(t),this.plumber.repaintEverything())}),t.has("showMessageTable")&&this.updateZoomControlPositioning(),t.has("definition")&&(setTimeout(()=>this.updateCanvasSize(),0),this.translationCache.clear(),(null===(e=this.definition)||void 0===e?void 0:e.uuid)&&this.startActivityFetching()),t.has("simulatorActive")&&(this.simulatorActive?(this.closeFloatingWindows(),this.stopActivityFetching()):(this.activityInterval=100,this.startActivityFetching())),t.has("activityData")&&this.plumber&&this.plumber.setActivityData(this.activityData),t.has("dirtyDate")&&this.dirtyDate&&(this._suppressDirtySave?this._suppressDirtySave=!1:this.debouncedSave()),t.has("isSaving")){const t=document.querySelector("temba-store");this.isSaving?(window.addEventListener("beforeunload",this.boundBeforeUnload),(null==t?void 0:t.markDirty)&&t.markDirty(this.dirtyAdapter)):(window.removeEventListener("beforeunload",this.boundBeforeUnload),(null==t?void 0:t.markClean)&&t.markClean(this.dirtyAdapter))}t.has("saveError")&&this.saveError&&(this.showSaveErrorDialog(this.saveError),setTimeout(()=>{this.saveError=null},0)),t.has("languageCode")&&this.translationCache.clear()}getFlowTypeFromDefinition(t){return"voice"===t?"voice":"messaging_background"===t||"messaging_offline"===t?"background":"message"}debouncedSave(){null!==this.saveTimer&&clearTimeout(this.saveTimer),this.saveTimer=window.setTimeout(()=>{if(this.pendingTimer.unsaved)return void(this.saveTimer=null);(new Date).getTime()-this.dirtyDate.getTime()>=2e3?(this.saveChanges(),this.saveTimer=null):this.debouncedSave()},2e3)}definitionForSave(t){return{...t,_ui:{...t._ui,editor:uu}}}saveChanges(t){const e=this.definitionForSave(t||this.definition);this.isSaving=!0;const i=Ed().postJSON(`/flow/revisions/${this.flow}/`,e).then(t=>{var e;if(t.status<200||t.status>=300)this.saveError=this.extractErrorMessage(t);else{if(t.json){const i=Ed().getState();t.json.info&&i.setFlowInfo(t.json.info),void 0!==(null===(e=t.json.revision)||void 0===e?void 0:e.revision)&&i.setRevision(t.json.revision.revision),this.fetchRevisions()}Ed().getState().setDirtyDate(null)}}).catch(t=>{console.error("Failed to save flow:",t),t instanceof Response?this.saveError=`Server error (${t.status}). Your changes have not been saved.`:this.saveError="Unable to reach the server. Please check your connection and try again."}).finally(()=>{this.isSaving=!1,this.savePromise=null});return this.savePromise=i,i}extractErrorMessage(t){if(t.json){if("string"==typeof t.json.detail)return t.json.detail;if("string"==typeof t.json.error)return t.json.error;if("string"==typeof t.json.description)return t.json.description}return`Save failed with status ${t.status}.`}showSaveErrorDialog(t){const e=document.createElement("temba-dialog");e.header="Save Failed",e.primaryButtonName="",e.cancelButtonName="Dismiss";const i=document.createElement("div");i.style.cssText="padding: 20px; font-size: 14px; line-height: 1.5;",i.textContent=t,e.appendChild(i),document.body.appendChild(e),e.open=!0,e.addEventListener("temba-dialog-hidden",()=>{document.body.removeChild(e)})}startActivityFetching(){this.simulatorActive||this.fetchActivityData()}stopActivityFetching(){null!==this.activityTimer&&(clearTimeout(this.activityTimer),this.activityTimer=null)}fetchActivityData(){var t;if(!(null===(t=this.definition)||void 0===t?void 0:t.uuid))return;if(this.simulatorActive)return;const e=`/flow/activity/${this.definition.uuid}/`,i=Ed();if(!i)return;i.getState().fetchActivity(e).then(()=>{this.isConnected&&(this.activityInterval=Math.min(3e5,this.activityInterval+100),null!==this.activityTimer&&clearTimeout(this.activityTimer),this.activityTimer=window.setTimeout(()=>{this.fetchActivityData()},this.activityInterval))})}handleLanguageChange(t){Sd.getState().setLanguageCode(t)}disconnectedCallback(){var t;super.disconnectedCallback(),this.teardownLoupe(),null===(t=Ed())||void 0===t||t.getState().setFlushSave(null),this.stopAutoScroll(),window.removeEventListener("beforeunload",this.boundBeforeUnload);const e=document.querySelector("temba-store");(null==e?void 0:e.markClean)&&e.markClean(this.dirtyAdapter),null!==this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),null!==this.activityTimer&&(clearTimeout(this.activityTimer),this.activityTimer=null),this.pendingTimer.clearTimer(),document.removeEventListener("mousemove",this.boundMouseMove),document.removeEventListener("mouseup",this.boundMouseUp),document.removeEventListener("mousedown",this.boundGlobalMouseDown),document.removeEventListener("keydown",this.boundKeyDown),document.removeEventListener("touchmove",this.boundTouchMove),document.removeEventListener("touchend",this.boundTouchEnd),document.removeEventListener("touchcancel",this.boundTouchCancel),window.removeEventListener("resize",this.boundWindowResize);const i=this.querySelector("#canvas");i&&(i.removeEventListener("contextmenu",this.boundCanvasContextMenu),i.removeEventListener("touchstart",this.boundCanvasTouchStart));const o=this.querySelector("#editor");o&&o.removeEventListener("wheel",this.boundWheel),this.savePromise?this.savePromise.then(()=>Sd.getState().clearFlowData()):Sd.getState().clearFlowData()}setupGlobalEventListeners(){document.addEventListener("mousemove",this.boundMouseMove),document.addEventListener("mouseup",this.boundMouseUp),document.addEventListener("mousedown",this.boundGlobalMouseDown),document.addEventListener("keydown",this.boundKeyDown),document.addEventListener("touchmove",this.boundTouchMove,{passive:!1}),document.addEventListener("touchend",this.boundTouchEnd),document.addEventListener("touchcancel",this.boundTouchCancel),window.addEventListener("resize",this.boundWindowResize);const t=()=>{this.markTouchDevice(),document.removeEventListener("touchstart",t)};document.addEventListener("touchstart",t);const e=this.querySelector("#canvas");e&&(e.addEventListener("contextmenu",this.boundCanvasContextMenu),e.addEventListener("touchstart",this.boundCanvasTouchStart,{passive:!1}));const i=this.querySelector("#editor");i&&i.addEventListener("wheel",this.boundWheel,{passive:!1}),this.addEventListener(Io.ActionEditRequested,this.handleActionEditRequested.bind(this)),this.addEventListener(Io.AddActionRequested,this.handleAddActionRequested.bind(this)),this.addEventListener(Io.NodeEditRequested,this.handleNodeEditRequested.bind(this)),this.addEventListener(Io.NodeDeleted,this.handleNodeDeleted.bind(this)),this.addEventListener(Io.StickyNoteDeleted,t=>{var e;const i=null===(e=t.detail)||void 0===e?void 0:e.uuid;i&&Ed().getState().removeStickyNotes([i])}),this.addEventListener(Io.Selection,t=>{const e=t.target;"TEMBA-CANVAS-MENU"===e.tagName?this.handleCanvasMenuSelection(t):"TEMBA-NODE-TYPE-SELECTOR"===e.tagName&&this.handleNodeTypeSelection(t)}),this.addEventListener(Io.Canceled,t=>{const e=t.target;"TEMBA-CANVAS-MENU"===e.tagName?this.handleCanvasMenuClosed():"TEMBA-NODE-TYPE-SELECTOR"===e.tagName&&this.handleNodeTypeSelectorClosed()}),this.addEventListener(Io.DragExternal,this.handleActionDragExternal.bind(this)),this.addEventListener(Io.DragInternal,this.handleActionDragInternal.bind(this)),this.addEventListener(Io.DragStop,t=>{t.detail.isExternal&&this.handleActionDropExternal(t)}),this.addEventListener(Io.SizeChanged,t=>{const{uuid:e}=t.detail;e&&requestAnimationFrame(()=>{this.checkCollisionsAndReflow([e])})})}getPosition(t,e){var i,o,n;return"node"===e?null===(i=this.definition._ui.nodes[t])||void 0===i?void 0:i.position:null===(n=null===(o=this.definition._ui.stickies)||void 0===o?void 0:o[t])||void 0===n?void 0:n.position}handleMouseDown(t){if(mu(t))return;if(this.isReadOnly())return;this.blurActiveContentEditable();const e=t.currentTarget,i=t.target;if(i.classList.contains("exit")||i.closest(".exit")||i.closest(".linked-name"))return;const o=e.getAttribute("uuid"),n="TEMBA-FLOW-NODE"===e.tagName?"node":"sticky",s=this.getPosition(o,n);s&&(this.selectedItems.has(o)||t.ctrlKey||t.metaKey?this.selectedItems.has(o)||this.selectedItems.add(o):this.selectedItems.clear(),this.isMouseDown=!0,this.shiftDragCopy=t.shiftKey,this.dragStartPos={x:t.clientX,y:t.clientY},this.startPos={left:s.left,top:s.top},this.currentDragItem={uuid:o,position:s,element:e,type:n},t.preventDefault(),t.stopPropagation())}markTouchDevice(){var t,e;this.isTouchDevice||(this.isTouchDevice=!0,null===(t=this.querySelector("#canvas"))||void 0===t||t.classList.add("touch-device"),null===(e=this.querySelector("#editor"))||void 0===e||e.classList.add("touch-device"))}handleItemTouchStart(t){if(this.markTouchDevice(),this.isReadOnly())return;this.blurActiveContentEditable();const e=t.touches[0];if(!e)return;const i=t.currentTarget,o=t.target;if(o.classList.contains("exit")||o.closest(".exit")||o.closest(".linked-name"))return;const n=i.getAttribute("uuid"),s="TEMBA-FLOW-NODE"===i.tagName?"node":"sticky",r=this.getPosition(n,s);r&&(this.selectedItems.has(n)||this.selectedItems.clear(),this.isMouseDown=!0,this.dragStartPos={x:e.clientX,y:e.clientY},this.startPos={left:r.left,top:r.top},this.currentDragItem={uuid:n,position:r,element:i,type:s},t.stopPropagation())}handleGlobalMouseDown(t){var e;if(mu(t))return;const i=null===(e=this.querySelector("#grid"))||void 0===e?void 0:e.getBoundingClientRect();if(!i)return;if(!(t.clientX>=i.left&&t.clientX<=i.right&&t.clientY>=i.top&&t.clientY<=i.bottom))return;t.target.closest(".draggable")||this.handleCanvasMouseDown(t)}blurActiveContentEditable(){var t;let e=document.activeElement;for(;null===(t=null==e?void 0:e.shadowRoot)||void 0===t?void 0:t.activeElement;)e=e.shadowRoot.activeElement;e instanceof HTMLElement&&"true"===e.getAttribute("contenteditable")&&e.blur()}handleCanvasMouseDown(t){var e;if(this.isReadOnly())return;this.blurActiveContentEditable();const i=t.target;if("canvas"===i.id||"grid"===i.id){this.canvasMouseDown=!0,this.dragStartPos={x:t.clientX,y:t.clientY};const i=null===(e=this.querySelector("#canvas"))||void 0===e?void 0:e.getBoundingClientRect();if(i){this.selectedItems.clear();const e=(t.clientX-i.left)/this.zoom,o=(t.clientY-i.top)/this.zoom;this.selectionBox={startX:e,startY:o,endX:e,endY:o}}t.preventDefault()}}openFlowSearch(){if(this.viewingRevision)return;if(this.isDialogOrMenuOpen())return;const t=this.querySelector("temba-flow-search");t&&(t.definition=this.definition,t.languageCode=this.languageCode||"",t.scope=this.showMessageTable?"table":"flow",t.includeCategories=this.isTranslating&&this.hasAnyNodeWithLocalizeCategories(),t.show())}closeFlowSearch(){const t=this.querySelector("temba-flow-search");(null==t?void 0:t.open)&&t.hide()}handleKeyDown(t){var e;if((t.metaKey||t.ctrlKey)&&"f"===t.key)return t.preventDefault(),void this.openFlowSearch();const i=this.querySelector("temba-flow-search");if(!(null==i?void 0:i.open)){if("Delete"===t.key||"Backspace"===t.key){if(null===(e=this.deleteDialog)||void 0===e?void 0:e.open)return this.deleteSelectedItems(),void(this.deleteDialog.open=!1);this.selectedItems.size>0&&this.showDeleteConfirmation()}"Escape"===t.key&&(this.selectedItems.clear(),this.requestUpdate())}}getFlowSettings(){try{return JSON.parse(ye("flow-settings")||"{}")}catch(t){return{}}}saveFlowSetting(t,e){if(!this.flow)return;const i=this.getFlowSettings();delete i[this.flow],i[this.flow]={...i[this.flow]||{},[t]:e};const o=Object.keys(i);if(o.length>Pm.MAX_FLOW_SETTINGS)for(const t of o.slice(0,o.length-Pm.MAX_FLOW_SETTINGS))delete i[t];be("flow-settings",JSON.stringify(i))}getFlowSetting(t){var e;if(this.flow)return null===(e=this.getFlowSettings()[this.flow])||void 0===e?void 0:e[t]}setZoom(t,e){const i=Math.max(.3,Math.min(1,Math.round(100*t)/100));if(i===this.zoom)return;const o=this.querySelector("#editor"),n=this.zoom;if(this.zoom=i,this.plumber.zoom=i,this.zoomFitted=!1,this.saveFlowSetting("zoom",i),o&&e){const t=o.getBoundingClientRect(),s=e.clientX-t.left,r=e.clientY-t.top,a=(o.scrollLeft+s)/n,l=(o.scrollTop+r)/n;requestAnimationFrame(()=>{o.scrollLeft=a*i-s,o.scrollTop=l*i-r,this.plumber.repaintEverything()})}else requestAnimationFrame(()=>this.plumber.repaintEverything())}zoomIn(){this.setZoom(this.zoom+.05)}zoomOut(){this.setZoom(this.zoom-.05)}zoomToFit(){var t;if(!this.definition||0===this.definition.nodes.length)return;const e=this.querySelector("#editor");if(!e)return;let i=1/0,o=1/0,n=-1/0,s=-1/0;this.definition.nodes.forEach(t=>{var e;const r=null===(e=this.definition._ui)||void 0===e?void 0:e.nodes[t.uuid];if(!(null==r?void 0:r.position))return;const a=this.querySelector(`[id="${t.uuid}"]`);if(!a)return;const l=a.offsetWidth,d=a.offsetHeight;i=Math.min(i,r.position.left),o=Math.min(o,r.position.top),n=Math.max(n,r.position.left+l),s=Math.max(s,r.position.top+d)});const r=(null===(t=this.definition._ui)||void 0===t?void 0:t.stickies)||{};if(Object.entries(r).forEach(([t,e])=>{if(!e.position)return;const r=this.querySelector(`temba-sticky-note[uuid="${t}"]`);if(!r)return;const a=r.offsetWidth,l=r.offsetHeight;i=Math.min(i,e.position.left),o=Math.min(o,e.position.top),n=Math.max(n,e.position.left+a),s=Math.max(s,e.position.top+l)}),i===1/0)return;const a=n-i,l=s-o,d=(e.clientWidth-80)/a,c=(e.clientHeight-80)/l;let h=Math.min(d,c,1);h=Math.max(h,.3),h=Math.round(20*h)/20,this.zoom=h,this.plumber.zoom=h,this.zoomFitted=!0,this.saveFlowSetting("zoom",h);const u=(i+n)/2+40,p=(o+s)/2+40;requestAnimationFrame(()=>{e.scrollLeft=u*h-e.clientWidth/2,e.scrollTop=p*h-e.clientHeight/2,this.plumber.repaintEverything()})}zoomToFull(){this.setZoom(1)}updateZoomControlPositioning(){requestAnimationFrame(()=>{const t=this.querySelector("#editor");if(t){const e=Math.max(t.offsetWidth-t.clientWidth,0);document.documentElement.style.setProperty("--floating-tab-clip",`${e}px`)}const e=this.querySelector(".editor-toolbar");if(e){const t=e.getBoundingClientRect();Sm.START_TOP=t.bottom+20,Sm.updateAllPositions()}})}handleWheel(t){if(!t.ctrlKey&&!t.metaKey)return;t.preventDefault();const e=t.deltaY>0?-.05:.05;this.setZoom(this.zoom+e,{clientX:t.clientX,clientY:t.clientY})}initLoupe(){document.addEventListener("mousemove",this.boundLoupeMouseMove),document.addEventListener("keydown",this.boundLoupeKeyDown),document.addEventListener("keyup",this.boundLoupeKeyUp),document.addEventListener("mouseup",this.boundLoupeMouseUp);const t=this.querySelector("#editor");t&&t.addEventListener("mousedown",this.boundLoupeMouseDown,!0)}teardownLoupe(){document.removeEventListener("mousemove",this.boundLoupeMouseMove),document.removeEventListener("keydown",this.boundLoupeKeyDown),document.removeEventListener("keyup",this.boundLoupeKeyUp),document.removeEventListener("mouseup",this.boundLoupeMouseUp);const t=this.querySelector("#editor");t&&t.removeEventListener("mousedown",this.boundLoupeMouseDown,!0),this.hideLoupe()}handleLoupeKeyDown(t){"a"===t.key.toLowerCase()&&t.metaKey&&t.ctrlKey&&(t.preventDefault(),this.loupeKeyHeld=!0,this.loupeLastMouse&&this.handleLoupeMouseMove(this.loupeLastMouse))}handleLoupeKeyUp(t){this.loupeKeyHeld&&("a"!==t.key&&"Meta"!==t.key&&"Control"!==t.key||(this.loupeKeyHeld=!1,this.hideLoupe()))}handleLoupeMouseDown(){this.loupeMouseIsDown=!0,this.hideLoupe()}handleLoupeMouseUp(){this.loupeMouseIsDown=!1}handleLoupeMouseMove(t){var e;if(this.loupeLastMouse={clientX:t.clientX,clientY:t.clientY},!this.loupeKeyHeld||this.loupeMouseIsDown||this.isDragging||this.isSelecting||(null===(e=this.plumber)||void 0===e?void 0:e.connectionDragging)||this.isDialogOrMenuOpen())return void this.hideLoupe();const i=this.querySelector("#editor");if(!i)return;const o=i.getBoundingClientRect();t.clientX<o.left||t.clientX>o.right||t.clientY<o.top||t.clientY>o.bottom?this.hideLoupe():(this.loupeRAF&&cancelAnimationFrame(this.loupeRAF),this.loupeRAF=requestAnimationFrame(()=>{this.updateLoupe(t.clientX,t.clientY)}))}isDialogOrMenuOpen(){var t;if(this.editingNode||this.editingAction)return!0;if(null===(t=this.deleteDialog)||void 0===t?void 0:t.open)return!0;const e=this.querySelector("temba-canvas-menu");return!!(null==e?void 0:e.open)}hideLoupe(){this.loupeEl&&this.loupeEl.classList.remove("visible"),this.restoreTitles(),this.loupeClone&&(this.loupeClone.remove(),this.loupeClone=null),this.loupeRAF&&(cancelAnimationFrame(this.loupeRAF),this.loupeRAF=null)}suppressTitles(){this.hiddenTitles=[];const t=this.querySelector("#canvas");if(t){for(const e of t.querySelectorAll("[title]"))this.hiddenTitles.push({el:e,title:e.getAttribute("title")}),e.removeAttribute("title");for(const e of t.querySelectorAll("temba-canvas-node, temba-sticky-note"))if(e.shadowRoot)for(const t of e.shadowRoot.querySelectorAll("[title]"))this.hiddenTitles.push({el:t,title:t.getAttribute("title")}),t.removeAttribute("title")}}restoreTitles(){for(const{el:t,title:e}of this.hiddenTitles)t.setAttribute("title",e);this.hiddenTitles=[]}rebuildLoupeClone(t,e,i,o){const n=this.loupeContentEl;if(!n)return;this.loupeClone&&this.loupeClone.remove();const s=document.createElement("div");s.className="loupe-clone",s.style.width=`${t.scrollWidth}px`,s.style.height=`${t.scrollHeight}px`;const r=50,a=t.querySelectorAll("[data-node-uuid]");for(const t of a){const n=t,a=parseFloat(n.style.left)||0,l=parseFloat(n.style.top)||0,d=n.offsetWidth,c=n.offsetHeight;if(a+d<e-o-r||a>e+o+r||l+c<i-o-r||l>i+o+r)continue;const h=document.createElement("div");h.className=n.className,h.style.cssText=n.style.cssText,h.innerHTML=n.innerHTML,s.appendChild(h)}const l=t.querySelectorAll("svg.plumb-connector");for(const t of l)s.appendChild(t.cloneNode(!0));const d=t.querySelectorAll(".activity-overlay");for(const t of d)s.appendChild(t.cloneNode(!0));const c=t.querySelectorAll("temba-sticky-note");for(const t of c){const n=t,a=n.offsetWidth,l=n.offsetHeight,d=parseFloat(n.style.left)||0,c=parseFloat(n.style.top)||0;if(d+a<e-o-r||d>e+o+r||c+l<i-o-r||c>i+o+r)continue;if(!n.shadowRoot)continue;const h=document.createElement("div");h.className=n.className,h.style.cssText=n.style.cssText,h.classList.add("loupe-sticky");const u=n.shadowRoot.adoptedStyleSheets;let p="";for(const t of u)for(const e of t.cssRules){const t=e.cssText;if(t.startsWith(":host"))p+=t.replace(/:host/g,".loupe-sticky")+"\n";else{const e=t.indexOf("{");if(-1!==e){p+=`.loupe-sticky ${t.substring(0,e).trim()} ${t.substring(e)}\n`}}}h.innerHTML=`<style>${p}</style>`+n.shadowRoot.innerHTML,s.appendChild(h)}n.appendChild(s),this.loupeClone=s}updateLoupe(t,e){const i=this.loupeEl,o=this.loupeContentEl;if(!i||!o||!this.definition)return;const n=this.querySelector("#canvas");if(!n)return;const s=n.getBoundingClientRect(),r=(t-s.left)/this.zoom,a=(e-s.top)/this.zoom,l=Pm.LOUPE_DIAMETER/2,d=Math.min(1.5,2.5*this.zoom),c=l/d;i.style.left=`${t}px`,i.style.top=`${e}px`,i.classList.add("visible"),0===this.hiddenTitles.length&&this.suppressTitles();const h=20*d;o.style.backgroundSize=`${h}px ${h}px`,o.style.backgroundPosition=`${l-r*d}px ${l-a*d}px`;const u=performance.now(),p=r-this.loupeCursorCanvas.x,m=a-this.loupeCursorCanvas.y,g=Math.abs(p)>.5*c||Math.abs(m)>.5*c;(!this.loupeClone||u-this.loupeCloneTime>Pm.LOUPE_CLONE_INTERVAL&&g)&&(this.rebuildLoupeClone(n,r,a,c),this.loupeCloneTime=u,this.loupeCursorCanvas={x:r,y:a}),this.loupeClone&&(this.loupeClone.style.transform=`translate(${l-r*d}px, ${l-a*d}px) scale(${d})`)}showDeleteConfirmation(){var t;const e=this.selectedItems.size,i=1===e?"item":"items";if(null===(t=this.deleteDialog)||void 0===t?void 0:t.open)return;const o=document.createElement("temba-dialog");o.header="Delete Items",o.primaryButtonName="Delete",o.cancelButtonName="Cancel",o.destructive=!0,o.innerHTML=`<div style="padding: 20px;">Are you sure you want to delete ${e} ${i}?</div>`,o.addEventListener("temba-button-clicked",t=>{"Delete"===t.detail.button.name&&(this.deleteSelectedItems(),o.open=!1)}),document.body.appendChild(o),o.open=!0,this.deleteDialog=o,o.addEventListener("temba-dialog-hidden",()=>{document.body.removeChild(o),this.deleteDialog=null})}performReflow(){var t,e;if(!this.definition||0===this.definition.nodes.length)return;this.capturePositionsOnce();const i=(null===(t=this.definition._ui)||void 0===t?void 0:t.stickies)||{},o={};for(const t of this.definition.nodes){const i=null===(e=this.definition._ui)||void 0===e?void 0:e.nodes[t.uuid];(null==i?void 0:i.position)&&(o[t.uuid]={...i.position})}const n=this.definition.nodes[0].uuid,s=new Map,r=_m(this.definition.nodes,this.definition._ui.nodes,n,t=>{const e=this.querySelector(`[id="${t}"]`);if(e){const i={width:e.offsetWidth,height:e.offsetHeight};return s.set(t,i),i}const i={width:200,height:100};return s.set(t,i),i});if(Object.keys(i).length>0){const t=new Map;for(const e of Object.keys(i)){const o=this.querySelector(`temba-sticky-note[uuid="${e}"]`);if(o)t.set(e,{width:o.offsetWidth,height:o.offsetHeight});else{const o=i[e];t.set(e,{width:o.width||200,height:o.height||100})}}const e=function(t,e,i,o,n,s){const r={},a=Object.keys(i);if(0===a.length)return r;const l=new Map,d=new Map;for(const[i,o]of Object.entries(t)){if(!o.position)continue;const t=o.position.left,n=o.position.top;let s=a[0],r=1/0;for(const i of a){const o=e[i];if(!o)continue;const a=t-o.left,l=n-o.top,d=a*a+l*l;d<r&&(r=d,s=i)}l.set(i,s);const c=e[s],h=!!c&&t<c.left,u=d.get(s)||[];u.push({uuid:i,wasLeft:h}),d.set(s,u)}const c=[];for(const t of a){const e=i[t],n=o.get(t)||{width:200,height:100};c.push({left:e.left,top:e.top,width:n.width,height:n.height})}for(const[t,e]of d){const a=i[t];if(!a)continue;const l=o.get(t)||{width:200};for(const{uuid:i,wasLeft:o}of e){const e=n.get(i)||{width:182,height:100};let d;d=t===s&&o||!o?a.left+l.width+wm:a.left-e.width-wm;let h=a.top;d=fu(Math.max(0,d)),h=fu(Math.max(0,h));let u=50;for(;u-- >0&&Cm(d,h,e.width,e.height,c);)h=fu(h+wm);r[i]={left:d,top:h},c.push({left:d,top:h,width:e.width,height:e.height})}}return r}(i,o,r,s,t,n);Object.assign(r,e)}null!==this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),this.pendingTimer.pending=!0,Ed().getState().updateCanvasPositions(r),this.updateCanvasSize(),requestAnimationFrame(()=>{this.plumber.repaintEverything()});const a=this.querySelector("#editor");a&&a.scrollTo({left:0,top:0,behavior:"smooth"}),this.pendingTimer.start()}handlePendingDiscard(){this.pendingTimer.dismiss();if(this.copiedItemUuids.length>0||this.pendingPositions){if(null!==this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),this.copiedItemUuids.length>0){const t=this.copiedItemUuids.filter(t=>this.definition.nodes.some(e=>e.uuid===t)),e=this.copiedItemUuids.filter(t=>{var e,i;return null===(i=null===(e=this.definition._ui)||void 0===e?void 0:e.stickies)||void 0===i?void 0:i[t]});this.pendingTimer.pending=!0,t.length>0&&Ed().getState().removeNodes(t),e.length>0&&(this.pendingTimer.pending=!0,Ed().getState().removeStickyNotes(e)),this.copiedItemUuids=[]}this.pendingPositions&&(this.pendingTimer.pending=!0,Ed().getState().updateCanvasPositions(this.pendingPositions),this.pendingPositions=null),setTimeout(()=>{Ed().getState().setDirtyDate(null),this.isSaving=!1},0),requestAnimationFrame(()=>{this.plumber.repaintEverything()})}}renderPendingCard(){if(!this.pendingTimer.unsaved)return"";const t=`pc-${this.pendingTimer.resetCount}`;return H`<div class="reflow-card">
|
|
10555
|
+
`}constructor(){super(),this.saveTimer=null,this.flowType="message",this.features=[],this.activityTimer=null,this.activityInterval=100,this.isDragging=!1,this.isMouseDown=!1,this.shiftDragCopy=!1,this.currentDragIsCopy=!1,this.dragStartPos={x:0,y:0},this.currentDragItem=null,this.startPos={left:0,top:0},this.autoScrollAnimationId=null,this.autoScrollDeltaX=0,this.autoScrollDeltaY=0,this.lastPointerPos=null,this.selectedItems=new Set,this.isSelecting=!1,this.selectionBox=null,this.isTouchDevice=!1,this.isTwoFingerPanning=!1,this.twoFingerDidPan=!1,this.twoFingerStartMidX=0,this.twoFingerStartMidY=0,this.twoFingerOnCanvas=!1,this.lastPanX=0,this.lastPanY=0,this.targetId=null,this.sourceId=null,this.dragFromNodeId=null,this.originalConnectionTargetId=null,this.isValidTarget=!0,this.connectionSourceX=null,this.connectionSourceY=null,this.issuesWindowHidden=!0,this.localizationWindowHidden=!0,this.translationSettingsExpanded=!1,this.autoTranslateDialogOpen=!1,this.autoTranslating=!1,this.autoTranslateModel=null,this.autoTranslateError=null,this.revisionsWindowHidden=!0,this.revisions=[],this.viewingRevision=null,this.isLoadingRevisions=!1,this.isSaving=!1,this.saveError=null,this.zoom=1,this.zoomInitialized=!1,this.zoomFitted=!1,this.loupeEl=null,this.loupeContentEl=null,this.loupeRAF=null,this.hiddenTitles=[],this._suppressDirtySave=!1,this.savePromise=null,this.pendingTimer=new Om("Unsaved Changes",5e3,this,()=>{this.pendingPositions=null,this.copiedItemUuids=[],this.saveChanges()}),this.pendingPositions=null,this.copiedItemUuids=[],this.preRevertState=null,this.revisionsBrowseLanguageCode=null,this.deleteDialog=null,this.translationCache=new Map,this.dirtyAdapter={dirtyMessage:"Your flow is still saving. If you leave now, your latest changes may be lost.",markClean:()=>{}},this.boundBeforeUnload=t=>{t.preventDefault()},this.editingNode=null,this.editingNodeUI=null,this.editingAction=null,this.dialogOrigin=null,this.showMessageTable=!1,this.showLanguageOptions=!1,this.isCreatingNewNode=!1,this.pendingNodePosition=null,this.canvasDropPreview=null,this.addActionToNodeUuid=null,this.actionDragTargetNodeUuid=null,this.previousActionDragTargetNodeUuid=null,this.connectionPlaceholder=null,this.pendingCanvasConnection=null,this.canvasMouseDown=!1,this.boundMouseMove=this.handleMouseMove.bind(this),this.boundMouseUp=this.handleMouseUp.bind(this),this.boundGlobalMouseDown=this.handleGlobalMouseDown.bind(this),this.boundKeyDown=this.handleKeyDown.bind(this),this.boundCanvasContextMenu=this.handleCanvasContextMenu.bind(this),this.boundWheel=this.handleWheel.bind(this),this.boundTouchMove=this.handleTouchMove.bind(this),this.boundTouchEnd=this.handleTouchEnd.bind(this),this.boundTouchCancel=this.handleTouchCancel.bind(this),this.boundCanvasTouchStart=this.handleCanvasTouchStart.bind(this),this.boundWindowResize=this.updateZoomControlPositioning.bind(this),this.flushSave=async()=>{const t=this.definition?{...this.definition}:null;this.pendingTimer.unsaved&&(this.pendingPositions=null,this.copiedItemUuids=[],this.pendingTimer.dismiss()),null!==this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),this.savePromise&&await this.savePromise,t&&this.dirtyDate&&await this.saveChanges(t)},this.boundLoupeMouseMove=this.handleLoupeMouseMove.bind(this),this.boundLoupeMouseDown=this.handleLoupeMouseDown.bind(this),this.boundLoupeMouseUp=this.handleLoupeMouseUp.bind(this),this.boundLoupeKeyDown=this.handleLoupeKeyDown.bind(this),this.boundLoupeKeyUp=this.handleLoupeKeyUp.bind(this),this.loupeKeyHeld=!1,this.loupeMouseIsDown=!1,this.loupeLastMouse=null,this.loupeCloneTime=0,this.loupeClone=null,this.loupeCursorCanvas={x:0,y:0},this.editForceBase=!1}firstUpdated(t){var e;super.firstUpdated(t),this.plumber=new Dm(this.querySelector("#canvas"),this),this.plumber.zoom=this.zoom,this.setupGlobalEventListeners(),null===(e=Ed())||void 0===e||e.getState().setFlushSave(this.flushSave),Sd.getState().setFeatures(this.features),navigator.maxTouchPoints>0&&this.markTouchDevice(),this.updateZoomControlPositioning(),this.loupeEl=this.querySelector("#loupe"),this.loupeContentEl=this.querySelector("#loupe-content"),this.initLoupe(),t.has("flow")&&this.flow&&setTimeout(()=>{this.isConnected&&this.flow&&(Ed().getState().fetchRevision(`/flow/revisions/${this.flow}`),this.fetchRevisions())},0),this.plumber.on("connection:drag",t=>{this.dragFromNodeId=t.data.nodeId,this.sourceId=t.sourceId,this.connectionSourceX=t.sourceX,this.connectionSourceY=t.sourceY,this.originalConnectionTargetId=t.target.id}),this.plumber.on("connection:abort",t=>{this.makeConnection(t)}),this.plumber.on("connection:detach",t=>{this.makeConnection(t)})}makeConnection(t){if(this.sourceId&&this.targetId&&this.isValidTarget)t.target.id===this.targetId?this.plumber.connectIds(this.dragFromNodeId,this.sourceId,this.targetId):Ed().getState().updateConnection(this.dragFromNodeId,this.sourceId,this.targetId);else if(this.connectionPlaceholder&&this.connectionPlaceholder.visible&&this.sourceId){const t={left:fu(this.connectionPlaceholder.position.left),top:fu(this.connectionPlaceholder.position.top)},e=!!this.connectionPlaceholder.dragUp;this.connectionPlaceholder.position=t,this.pendingCanvasConnection={fromNodeId:this.dragFromNodeId,exitId:this.sourceId,position:t};const i=this.querySelector("#canvas");if(i){const o=i.getBoundingClientRect(),n=o.left+t.left*this.zoom-40,s=e?o.top+t.top*this.zoom+74:o.top+t.top*this.zoom+80,r=this.querySelector("temba-canvas-menu");r&&r.show(n,s,{x:t.left,y:t.top},!1,!1,"message"===this.flowType)}return void this.requestUpdate()}document.querySelectorAll("temba-flow-node").forEach(t=>{t.classList.remove("connection-target-valid","connection-target-invalid")}),this.pendingCanvasConnection||(this.sourceId=null,this.connectionSourceX=null,this.connectionSourceY=null,this.dragFromNodeId=null),this.targetId=null,this.isValidTarget=!0}willUpdate(t){var e;super.willUpdate(t),t.has("definition")&&((null===(e=this.definition)||void 0===e?void 0:e.type)&&(this.flowType=this.getFlowTypeFromDefinition(this.definition.type)),this.restoreInitialZoomFromSettings()),t.has("dirtyDate")&&this.dirtyDate&&(this.pendingTimer.pending?(this.pendingTimer.pending=!1,this._suppressDirtySave=!0):this.pendingTimer.unsaved?(this.pendingTimer.start(!1),this._suppressDirtySave=!0):this.isSaving=!0)}restoreInitialZoomFromSettings(){if(this.zoomInitialized||!this.definition)return;const t=this.getFlowSetting("zoom");if("number"==typeof t&&Number.isFinite(t)){const e=Math.max(.3,Math.min(1,Math.round(100*t)/100));this.zoom=e,this.plumber&&(this.plumber.zoom=e)}this.zoomInitialized=!0}setSimulatorTabHidden(t){var e;const i=document.querySelector("temba-simulator"),o=null===(e=null==i?void 0:i.shadowRoot)||void 0===e?void 0:e.querySelector("#phone-tab");o&&(o.hidden=t)}updated(t){var e;if(super.updated(t),t.has("features")&&Sd.getState().setFeatures(this.features),t.has("revisionsWindowHidden")&&this.setSimulatorTabHidden(!this.revisionsWindowHidden),t.has("canvasSize")&&this.updateZoomControlPositioning(),t.has("showMessageTable")&&!this.showMessageTable&&this.plumber&&requestAnimationFrame(()=>{const t=this.querySelector("#canvas");t&&(this.plumber.setContainer(t),this.plumber.repaintEverything(),t.addEventListener("contextmenu",this.boundCanvasContextMenu),t.addEventListener("touchstart",this.boundCanvasTouchStart,{passive:!1}))}),t.has("showMessageTable")&&this.updateZoomControlPositioning(),t.has("definition")&&(setTimeout(()=>this.updateCanvasSize(),0),this.translationCache.clear(),(null===(e=this.definition)||void 0===e?void 0:e.uuid)&&this.startActivityFetching()),t.has("simulatorActive")&&(this.simulatorActive?(this.closeFloatingWindows(),this.stopActivityFetching()):(this.activityInterval=100,this.startActivityFetching())),t.has("activityData")&&this.plumber&&this.plumber.setActivityData(this.activityData),t.has("dirtyDate")&&this.dirtyDate&&(this._suppressDirtySave?this._suppressDirtySave=!1:this.debouncedSave()),t.has("isSaving")){const t=document.querySelector("temba-store");this.isSaving?(window.addEventListener("beforeunload",this.boundBeforeUnload),(null==t?void 0:t.markDirty)&&t.markDirty(this.dirtyAdapter)):(window.removeEventListener("beforeunload",this.boundBeforeUnload),(null==t?void 0:t.markClean)&&t.markClean(this.dirtyAdapter))}t.has("saveError")&&this.saveError&&(this.showSaveErrorDialog(this.saveError),setTimeout(()=>{this.saveError=null},0)),t.has("languageCode")&&this.translationCache.clear()}getFlowTypeFromDefinition(t){return"voice"===t?"voice":"messaging_background"===t||"messaging_offline"===t?"background":"message"}debouncedSave(){null!==this.saveTimer&&clearTimeout(this.saveTimer),this.saveTimer=window.setTimeout(()=>{if(this.pendingTimer.unsaved)return void(this.saveTimer=null);(new Date).getTime()-this.dirtyDate.getTime()>=2e3?(this.saveChanges(),this.saveTimer=null):this.debouncedSave()},2e3)}definitionForSave(t){return{...t,_ui:{...t._ui,editor:uu}}}saveChanges(t){const e=this.definitionForSave(t||this.definition);this.isSaving=!0;const i=Ed().postJSON(`/flow/revisions/${this.flow}/`,e).then(t=>{var e;if(t.status<200||t.status>=300)this.saveError=this.extractErrorMessage(t);else{if(t.json){const i=Ed().getState();t.json.info&&i.setFlowInfo(t.json.info),void 0!==(null===(e=t.json.revision)||void 0===e?void 0:e.revision)&&i.setRevision(t.json.revision.revision),this.fetchRevisions()}Ed().getState().setDirtyDate(null)}}).catch(t=>{console.error("Failed to save flow:",t),t instanceof Response?this.saveError=`Server error (${t.status}). Your changes have not been saved.`:this.saveError="Unable to reach the server. Please check your connection and try again."}).finally(()=>{this.isSaving=!1,this.savePromise=null});return this.savePromise=i,i}extractErrorMessage(t){if(t.json){if("string"==typeof t.json.detail)return t.json.detail;if("string"==typeof t.json.error)return t.json.error;if("string"==typeof t.json.description)return t.json.description}return`Save failed with status ${t.status}.`}showSaveErrorDialog(t){const e=document.createElement("temba-dialog");e.header="Save Failed",e.primaryButtonName="",e.cancelButtonName="Dismiss";const i=document.createElement("div");i.style.cssText="padding: 20px; font-size: 14px; line-height: 1.5;",i.textContent=t,e.appendChild(i),document.body.appendChild(e),e.open=!0,e.addEventListener("temba-dialog-hidden",()=>{document.body.removeChild(e)})}startActivityFetching(){this.simulatorActive||this.fetchActivityData()}stopActivityFetching(){null!==this.activityTimer&&(clearTimeout(this.activityTimer),this.activityTimer=null)}fetchActivityData(){var t;if(!(null===(t=this.definition)||void 0===t?void 0:t.uuid))return;if(this.simulatorActive)return;const e=`/flow/activity/${this.definition.uuid}/`,i=Ed();if(!i)return;i.getState().fetchActivity(e).then(()=>{this.isConnected&&(this.activityInterval=Math.min(3e5,this.activityInterval+100),null!==this.activityTimer&&clearTimeout(this.activityTimer),this.activityTimer=window.setTimeout(()=>{this.fetchActivityData()},this.activityInterval))})}handleLanguageChange(t){Sd.getState().setLanguageCode(t)}disconnectedCallback(){var t;super.disconnectedCallback(),this.teardownLoupe(),null===(t=Ed())||void 0===t||t.getState().setFlushSave(null),this.stopAutoScroll(),window.removeEventListener("beforeunload",this.boundBeforeUnload);const e=document.querySelector("temba-store");(null==e?void 0:e.markClean)&&e.markClean(this.dirtyAdapter),null!==this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),null!==this.activityTimer&&(clearTimeout(this.activityTimer),this.activityTimer=null),this.pendingTimer.clearTimer(),document.removeEventListener("mousemove",this.boundMouseMove),document.removeEventListener("mouseup",this.boundMouseUp),document.removeEventListener("mousedown",this.boundGlobalMouseDown),document.removeEventListener("keydown",this.boundKeyDown),document.removeEventListener("touchmove",this.boundTouchMove),document.removeEventListener("touchend",this.boundTouchEnd),document.removeEventListener("touchcancel",this.boundTouchCancel),window.removeEventListener("resize",this.boundWindowResize);const i=this.querySelector("#canvas");i&&(i.removeEventListener("contextmenu",this.boundCanvasContextMenu),i.removeEventListener("touchstart",this.boundCanvasTouchStart));const o=this.querySelector("#editor");o&&o.removeEventListener("wheel",this.boundWheel),this.savePromise?this.savePromise.then(()=>Sd.getState().clearFlowData()):Sd.getState().clearFlowData()}setupGlobalEventListeners(){document.addEventListener("mousemove",this.boundMouseMove),document.addEventListener("mouseup",this.boundMouseUp),document.addEventListener("mousedown",this.boundGlobalMouseDown),document.addEventListener("keydown",this.boundKeyDown),document.addEventListener("touchmove",this.boundTouchMove,{passive:!1}),document.addEventListener("touchend",this.boundTouchEnd),document.addEventListener("touchcancel",this.boundTouchCancel),window.addEventListener("resize",this.boundWindowResize);const t=()=>{this.markTouchDevice(),document.removeEventListener("touchstart",t)};document.addEventListener("touchstart",t);const e=this.querySelector("#canvas");e&&(e.addEventListener("contextmenu",this.boundCanvasContextMenu),e.addEventListener("touchstart",this.boundCanvasTouchStart,{passive:!1}));const i=this.querySelector("#editor");i&&i.addEventListener("wheel",this.boundWheel,{passive:!1}),this.addEventListener(Io.ActionEditRequested,this.handleActionEditRequested.bind(this)),this.addEventListener(Io.AddActionRequested,this.handleAddActionRequested.bind(this)),this.addEventListener(Io.NodeEditRequested,this.handleNodeEditRequested.bind(this)),this.addEventListener(Io.NodeDeleted,this.handleNodeDeleted.bind(this)),this.addEventListener(Io.StickyNoteDeleted,t=>{var e;const i=null===(e=t.detail)||void 0===e?void 0:e.uuid;i&&Ed().getState().removeStickyNotes([i])}),this.addEventListener(Io.Selection,t=>{const e=t.target;"TEMBA-CANVAS-MENU"===e.tagName?this.handleCanvasMenuSelection(t):"TEMBA-NODE-TYPE-SELECTOR"===e.tagName&&this.handleNodeTypeSelection(t)}),this.addEventListener(Io.Canceled,t=>{const e=t.target;"TEMBA-CANVAS-MENU"===e.tagName?this.handleCanvasMenuClosed():"TEMBA-NODE-TYPE-SELECTOR"===e.tagName&&this.handleNodeTypeSelectorClosed()}),this.addEventListener(Io.DragExternal,this.handleActionDragExternal.bind(this)),this.addEventListener(Io.DragInternal,this.handleActionDragInternal.bind(this)),this.addEventListener(Io.DragStop,t=>{t.detail.isExternal&&this.handleActionDropExternal(t)}),this.addEventListener(Io.SizeChanged,t=>{const{uuid:e}=t.detail;e&&requestAnimationFrame(()=>{this.checkCollisionsAndReflow([e])})})}getPosition(t,e){var i,o,n;return"node"===e?null===(i=this.definition._ui.nodes[t])||void 0===i?void 0:i.position:null===(n=null===(o=this.definition._ui.stickies)||void 0===o?void 0:o[t])||void 0===n?void 0:n.position}handleMouseDown(t){if(mu(t))return;if(this.isReadOnly())return;this.blurActiveContentEditable();const e=t.currentTarget,i=t.target;if(i.classList.contains("exit")||i.closest(".exit")||i.closest(".linked-name"))return;const o=e.getAttribute("uuid"),n="TEMBA-FLOW-NODE"===e.tagName?"node":"sticky",s=this.getPosition(o,n);s&&(this.selectedItems.has(o)||t.ctrlKey||t.metaKey?this.selectedItems.has(o)||this.selectedItems.add(o):this.selectedItems.clear(),this.isMouseDown=!0,this.shiftDragCopy=t.shiftKey,this.dragStartPos={x:t.clientX,y:t.clientY},this.startPos={left:s.left,top:s.top},this.currentDragItem={uuid:o,position:s,element:e,type:n},t.preventDefault(),t.stopPropagation())}markTouchDevice(){var t,e;this.isTouchDevice||(this.isTouchDevice=!0,null===(t=this.querySelector("#canvas"))||void 0===t||t.classList.add("touch-device"),null===(e=this.querySelector("#editor"))||void 0===e||e.classList.add("touch-device"))}handleItemTouchStart(t){if(this.markTouchDevice(),this.isReadOnly())return;this.blurActiveContentEditable();const e=t.touches[0];if(!e)return;const i=t.currentTarget,o=t.target;if(o.classList.contains("exit")||o.closest(".exit")||o.closest(".linked-name"))return;const n=i.getAttribute("uuid"),s="TEMBA-FLOW-NODE"===i.tagName?"node":"sticky",r=this.getPosition(n,s);r&&(this.selectedItems.has(n)||this.selectedItems.clear(),this.isMouseDown=!0,this.dragStartPos={x:e.clientX,y:e.clientY},this.startPos={left:r.left,top:r.top},this.currentDragItem={uuid:n,position:r,element:i,type:s},t.stopPropagation())}handleGlobalMouseDown(t){var e;if(mu(t))return;const i=null===(e=this.querySelector("#grid"))||void 0===e?void 0:e.getBoundingClientRect();if(!i)return;if(!(t.clientX>=i.left&&t.clientX<=i.right&&t.clientY>=i.top&&t.clientY<=i.bottom))return;t.target.closest(".draggable")||this.handleCanvasMouseDown(t)}blurActiveContentEditable(){var t;let e=document.activeElement;for(;null===(t=null==e?void 0:e.shadowRoot)||void 0===t?void 0:t.activeElement;)e=e.shadowRoot.activeElement;e instanceof HTMLElement&&"true"===e.getAttribute("contenteditable")&&e.blur()}handleCanvasMouseDown(t){var e;if(this.isReadOnly())return;this.blurActiveContentEditable();const i=t.target;if("canvas"===i.id||"grid"===i.id){this.canvasMouseDown=!0,this.dragStartPos={x:t.clientX,y:t.clientY};const i=null===(e=this.querySelector("#canvas"))||void 0===e?void 0:e.getBoundingClientRect();if(i){this.selectedItems.clear();const e=(t.clientX-i.left)/this.zoom,o=(t.clientY-i.top)/this.zoom;this.selectionBox={startX:e,startY:o,endX:e,endY:o}}t.preventDefault()}}openFlowSearch(){if(this.viewingRevision)return;if(this.isDialogOrMenuOpen())return;const t=this.querySelector("temba-flow-search");t&&(t.definition=this.definition,t.languageCode=this.languageCode||"",t.scope=this.showMessageTable?"table":"flow",t.includeCategories=this.isTranslating&&this.hasAnyNodeWithLocalizeCategories(),t.show())}closeFlowSearch(){const t=this.querySelector("temba-flow-search");(null==t?void 0:t.open)&&t.hide()}handleKeyDown(t){var e;if((t.metaKey||t.ctrlKey)&&"f"===t.key)return t.preventDefault(),void this.openFlowSearch();const i=this.querySelector("temba-flow-search");if(!(null==i?void 0:i.open)){if("Delete"===t.key||"Backspace"===t.key){if(null===(e=this.deleteDialog)||void 0===e?void 0:e.open)return this.deleteSelectedItems(),void(this.deleteDialog.open=!1);this.selectedItems.size>0&&this.showDeleteConfirmation()}"Escape"===t.key&&(this.selectedItems.clear(),this.requestUpdate())}}getFlowSettings(){try{return JSON.parse(ye("flow-settings")||"{}")}catch(t){return{}}}saveFlowSetting(t,e){if(!this.flow)return;const i=this.getFlowSettings();delete i[this.flow],i[this.flow]={...i[this.flow]||{},[t]:e};const o=Object.keys(i);if(o.length>Pm.MAX_FLOW_SETTINGS)for(const t of o.slice(0,o.length-Pm.MAX_FLOW_SETTINGS))delete i[t];be("flow-settings",JSON.stringify(i))}getFlowSetting(t){var e;if(this.flow)return null===(e=this.getFlowSettings()[this.flow])||void 0===e?void 0:e[t]}setZoom(t,e){const i=Math.max(.3,Math.min(1,Math.round(100*t)/100));if(i===this.zoom)return;const o=this.querySelector("#editor"),n=this.zoom;if(this.zoom=i,this.plumber.zoom=i,this.zoomFitted=!1,this.saveFlowSetting("zoom",i),o&&e){const t=o.getBoundingClientRect(),s=e.clientX-t.left,r=e.clientY-t.top,a=(o.scrollLeft+s)/n,l=(o.scrollTop+r)/n;requestAnimationFrame(()=>{o.scrollLeft=a*i-s,o.scrollTop=l*i-r,this.plumber.repaintEverything()})}else requestAnimationFrame(()=>this.plumber.repaintEverything())}zoomIn(){this.setZoom(this.zoom+.05)}zoomOut(){this.setZoom(this.zoom-.05)}zoomToFit(){var t;if(!this.definition||0===this.definition.nodes.length)return;const e=this.querySelector("#editor");if(!e)return;let i=1/0,o=1/0,n=-1/0,s=-1/0;this.definition.nodes.forEach(t=>{var e;const r=null===(e=this.definition._ui)||void 0===e?void 0:e.nodes[t.uuid];if(!(null==r?void 0:r.position))return;const a=this.querySelector(`[id="${t.uuid}"]`);if(!a)return;const l=a.offsetWidth,d=a.offsetHeight;i=Math.min(i,r.position.left),o=Math.min(o,r.position.top),n=Math.max(n,r.position.left+l),s=Math.max(s,r.position.top+d)});const r=(null===(t=this.definition._ui)||void 0===t?void 0:t.stickies)||{};if(Object.entries(r).forEach(([t,e])=>{if(!e.position)return;const r=this.querySelector(`temba-sticky-note[uuid="${t}"]`);if(!r)return;const a=r.offsetWidth,l=r.offsetHeight;i=Math.min(i,e.position.left),o=Math.min(o,e.position.top),n=Math.max(n,e.position.left+a),s=Math.max(s,e.position.top+l)}),i===1/0)return;const a=n-i,l=s-o,d=(e.clientWidth-80)/a,c=(e.clientHeight-80)/l;let h=Math.min(d,c,1);h=Math.max(h,.3),h=Math.round(20*h)/20,this.zoom=h,this.plumber.zoom=h,this.zoomFitted=!0,this.saveFlowSetting("zoom",h);const u=(i+n)/2+40,p=(o+s)/2+40;requestAnimationFrame(()=>{e.scrollLeft=u*h-e.clientWidth/2,e.scrollTop=p*h-e.clientHeight/2,this.plumber.repaintEverything()})}zoomToFull(){this.setZoom(1)}updateZoomControlPositioning(){requestAnimationFrame(()=>{const t=this.querySelector("#editor");if(t){const e=Math.max(t.offsetWidth-t.clientWidth,0);document.documentElement.style.setProperty("--floating-tab-clip",`${e}px`)}const e=this.querySelector(".editor-toolbar");if(e){const t=e.getBoundingClientRect();Sm.START_TOP=t.bottom+20,Sm.updateAllPositions()}})}handleWheel(t){if(!t.ctrlKey&&!t.metaKey)return;t.preventDefault();const e=t.deltaY>0?-.05:.05;this.setZoom(this.zoom+e,{clientX:t.clientX,clientY:t.clientY})}initLoupe(){document.addEventListener("mousemove",this.boundLoupeMouseMove),document.addEventListener("keydown",this.boundLoupeKeyDown),document.addEventListener("keyup",this.boundLoupeKeyUp),document.addEventListener("mouseup",this.boundLoupeMouseUp);const t=this.querySelector("#editor");t&&t.addEventListener("mousedown",this.boundLoupeMouseDown,!0)}teardownLoupe(){document.removeEventListener("mousemove",this.boundLoupeMouseMove),document.removeEventListener("keydown",this.boundLoupeKeyDown),document.removeEventListener("keyup",this.boundLoupeKeyUp),document.removeEventListener("mouseup",this.boundLoupeMouseUp);const t=this.querySelector("#editor");t&&t.removeEventListener("mousedown",this.boundLoupeMouseDown,!0),this.hideLoupe()}handleLoupeKeyDown(t){"a"===t.key.toLowerCase()&&t.metaKey&&t.ctrlKey&&(t.preventDefault(),this.loupeKeyHeld=!0,this.loupeLastMouse&&this.handleLoupeMouseMove(this.loupeLastMouse))}handleLoupeKeyUp(t){this.loupeKeyHeld&&("a"!==t.key&&"Meta"!==t.key&&"Control"!==t.key||(this.loupeKeyHeld=!1,this.hideLoupe()))}handleLoupeMouseDown(){this.loupeMouseIsDown=!0,this.hideLoupe()}handleLoupeMouseUp(){this.loupeMouseIsDown=!1}handleLoupeMouseMove(t){var e;if(this.loupeLastMouse={clientX:t.clientX,clientY:t.clientY},!this.loupeKeyHeld||this.loupeMouseIsDown||this.isDragging||this.isSelecting||(null===(e=this.plumber)||void 0===e?void 0:e.connectionDragging)||this.isDialogOrMenuOpen())return void this.hideLoupe();const i=this.querySelector("#editor");if(!i)return;const o=i.getBoundingClientRect();t.clientX<o.left||t.clientX>o.right||t.clientY<o.top||t.clientY>o.bottom?this.hideLoupe():(this.loupeRAF&&cancelAnimationFrame(this.loupeRAF),this.loupeRAF=requestAnimationFrame(()=>{this.updateLoupe(t.clientX,t.clientY)}))}isDialogOrMenuOpen(){var t;if(this.editingNode||this.editingAction)return!0;if(null===(t=this.deleteDialog)||void 0===t?void 0:t.open)return!0;const e=this.querySelector("temba-canvas-menu");return!!(null==e?void 0:e.open)}hideLoupe(){this.loupeEl&&this.loupeEl.classList.remove("visible"),this.restoreTitles(),this.loupeClone&&(this.loupeClone.remove(),this.loupeClone=null),this.loupeRAF&&(cancelAnimationFrame(this.loupeRAF),this.loupeRAF=null)}suppressTitles(){this.hiddenTitles=[];const t=this.querySelector("#canvas");if(t){for(const e of t.querySelectorAll("[title]"))this.hiddenTitles.push({el:e,title:e.getAttribute("title")}),e.removeAttribute("title");for(const e of t.querySelectorAll("temba-canvas-node, temba-sticky-note"))if(e.shadowRoot)for(const t of e.shadowRoot.querySelectorAll("[title]"))this.hiddenTitles.push({el:t,title:t.getAttribute("title")}),t.removeAttribute("title")}}restoreTitles(){for(const{el:t,title:e}of this.hiddenTitles)t.setAttribute("title",e);this.hiddenTitles=[]}rebuildLoupeClone(t,e,i,o){const n=this.loupeContentEl;if(!n)return;this.loupeClone&&this.loupeClone.remove();const s=document.createElement("div");s.className="loupe-clone",s.style.width=`${t.scrollWidth}px`,s.style.height=`${t.scrollHeight}px`;const r=50,a=t.querySelectorAll("[data-node-uuid]");for(const t of a){const n=t,a=parseFloat(n.style.left)||0,l=parseFloat(n.style.top)||0,d=n.offsetWidth,c=n.offsetHeight;if(a+d<e-o-r||a>e+o+r||l+c<i-o-r||l>i+o+r)continue;const h=document.createElement("div");h.className=n.className,h.style.cssText=n.style.cssText,h.innerHTML=n.innerHTML,s.appendChild(h)}const l=t.querySelectorAll("svg.plumb-connector");for(const t of l)s.appendChild(t.cloneNode(!0));const d=t.querySelectorAll(".activity-overlay");for(const t of d)s.appendChild(t.cloneNode(!0));const c=t.querySelectorAll("temba-sticky-note");for(const t of c){const n=t,a=n.offsetWidth,l=n.offsetHeight,d=parseFloat(n.style.left)||0,c=parseFloat(n.style.top)||0;if(d+a<e-o-r||d>e+o+r||c+l<i-o-r||c>i+o+r)continue;if(!n.shadowRoot)continue;const h=document.createElement("div");h.className=n.className,h.style.cssText=n.style.cssText,h.classList.add("loupe-sticky");const u=n.shadowRoot.adoptedStyleSheets;let p="";for(const t of u)for(const e of t.cssRules){const t=e.cssText;if(t.startsWith(":host"))p+=t.replace(/:host/g,".loupe-sticky")+"\n";else{const e=t.indexOf("{");if(-1!==e){p+=`.loupe-sticky ${t.substring(0,e).trim()} ${t.substring(e)}\n`}}}h.innerHTML=`<style>${p}</style>`+n.shadowRoot.innerHTML,s.appendChild(h)}n.appendChild(s),this.loupeClone=s}updateLoupe(t,e){const i=this.loupeEl,o=this.loupeContentEl;if(!i||!o||!this.definition)return;const n=this.querySelector("#canvas");if(!n)return;const s=n.getBoundingClientRect(),r=(t-s.left)/this.zoom,a=(e-s.top)/this.zoom,l=Pm.LOUPE_DIAMETER/2,d=Math.min(1.5,2.5*this.zoom),c=l/d;i.style.left=`${t}px`,i.style.top=`${e}px`,i.classList.add("visible"),0===this.hiddenTitles.length&&this.suppressTitles();const h=20*d;o.style.backgroundSize=`${h}px ${h}px`,o.style.backgroundPosition=`${l-r*d}px ${l-a*d}px`;const u=performance.now(),p=r-this.loupeCursorCanvas.x,m=a-this.loupeCursorCanvas.y,g=Math.abs(p)>.5*c||Math.abs(m)>.5*c;(!this.loupeClone||u-this.loupeCloneTime>Pm.LOUPE_CLONE_INTERVAL&&g)&&(this.rebuildLoupeClone(n,r,a,c),this.loupeCloneTime=u,this.loupeCursorCanvas={x:r,y:a}),this.loupeClone&&(this.loupeClone.style.transform=`translate(${l-r*d}px, ${l-a*d}px) scale(${d})`)}showDeleteConfirmation(){var t;const e=this.selectedItems.size,i=1===e?"item":"items";if(null===(t=this.deleteDialog)||void 0===t?void 0:t.open)return;const o=document.createElement("temba-dialog");o.header="Delete Items",o.primaryButtonName="Delete",o.cancelButtonName="Cancel",o.destructive=!0,o.innerHTML=`<div style="padding: 20px;">Are you sure you want to delete ${e} ${i}?</div>`,o.addEventListener("temba-button-clicked",t=>{"Delete"===t.detail.button.name&&(this.deleteSelectedItems(),o.open=!1)}),document.body.appendChild(o),o.open=!0,this.deleteDialog=o,o.addEventListener("temba-dialog-hidden",()=>{document.body.removeChild(o),this.deleteDialog=null})}performReflow(){var t,e;if(!this.definition||0===this.definition.nodes.length)return;this.capturePositionsOnce();const i=(null===(t=this.definition._ui)||void 0===t?void 0:t.stickies)||{},o={};for(const t of this.definition.nodes){const i=null===(e=this.definition._ui)||void 0===e?void 0:e.nodes[t.uuid];(null==i?void 0:i.position)&&(o[t.uuid]={...i.position})}const n=this.definition.nodes[0].uuid,s=new Map,r=_m(this.definition.nodes,this.definition._ui.nodes,n,t=>{const e=this.querySelector(`[id="${t}"]`);if(e){const i={width:e.offsetWidth,height:e.offsetHeight};return s.set(t,i),i}const i={width:200,height:100};return s.set(t,i),i});if(Object.keys(i).length>0){const t=new Map;for(const e of Object.keys(i)){const o=this.querySelector(`temba-sticky-note[uuid="${e}"]`);if(o)t.set(e,{width:o.offsetWidth,height:o.offsetHeight});else{const o=i[e];t.set(e,{width:o.width||200,height:o.height||100})}}const e=function(t,e,i,o,n,s){const r={},a=Object.keys(i);if(0===a.length)return r;const l=new Map,d=new Map;for(const[i,o]of Object.entries(t)){if(!o.position)continue;const t=o.position.left,n=o.position.top;let s=a[0],r=1/0;for(const i of a){const o=e[i];if(!o)continue;const a=t-o.left,l=n-o.top,d=a*a+l*l;d<r&&(r=d,s=i)}l.set(i,s);const c=e[s],h=!!c&&t<c.left,u=d.get(s)||[];u.push({uuid:i,wasLeft:h}),d.set(s,u)}const c=[];for(const t of a){const e=i[t],n=o.get(t)||{width:200,height:100};c.push({left:e.left,top:e.top,width:n.width,height:n.height})}for(const[t,e]of d){const a=i[t];if(!a)continue;const l=o.get(t)||{width:200};for(const{uuid:i,wasLeft:o}of e){const e=n.get(i)||{width:182,height:100};let d;d=t===s&&o||!o?a.left+l.width+wm:a.left-e.width-wm;let h=a.top;d=fu(Math.max(0,d)),h=fu(Math.max(0,h));let u=50;for(;u-- >0&&Cm(d,h,e.width,e.height,c);)h=fu(h+wm);r[i]={left:d,top:h},c.push({left:d,top:h,width:e.width,height:e.height})}}return r}(i,o,r,s,t,n);Object.assign(r,e)}null!==this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),this.pendingTimer.pending=!0,Ed().getState().updateCanvasPositions(r),this.updateCanvasSize(),requestAnimationFrame(()=>{this.plumber.repaintEverything()});const a=this.querySelector("#editor");a&&a.scrollTo({left:0,top:0,behavior:"smooth"}),this.pendingTimer.start()}handlePendingDiscard(){this.pendingTimer.dismiss();if(this.copiedItemUuids.length>0||this.pendingPositions){if(null!==this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),this.copiedItemUuids.length>0){const t=this.copiedItemUuids.filter(t=>this.definition.nodes.some(e=>e.uuid===t)),e=this.copiedItemUuids.filter(t=>{var e,i;return null===(i=null===(e=this.definition._ui)||void 0===e?void 0:e.stickies)||void 0===i?void 0:i[t]});this.pendingTimer.pending=!0,t.length>0&&Ed().getState().removeNodes(t),e.length>0&&(this.pendingTimer.pending=!0,Ed().getState().removeStickyNotes(e)),this.copiedItemUuids=[]}this.pendingPositions&&(this.pendingTimer.pending=!0,Ed().getState().updateCanvasPositions(this.pendingPositions),this.pendingPositions=null),setTimeout(()=>{Ed().getState().setDirtyDate(null),this.isSaving=!1},0),requestAnimationFrame(()=>{this.plumber.repaintEverything()})}}renderPendingCard(){if(!this.pendingTimer.unsaved)return"";const t=`pc-${this.pendingTimer.resetCount}`;return H`<div class="reflow-card">
|
|
10556
10556
|
<div class="reflow-top">
|
|
10557
10557
|
<span class="reflow-label">${this.pendingTimer.label}</span>
|
|
10558
10558
|
<button class="reflow-discard" @click=${this.handlePendingDiscard}>
|
|
@@ -10733,7 +10733,7 @@ background: #ccc;
|
|
|
10733
10733
|
</div>
|
|
10734
10734
|
</div>
|
|
10735
10735
|
</temba-floating-window>
|
|
10736
|
-
`}renderLocalizationWindow(){var t;const e=this.getLocalizationLanguages();if(!e.length)return H``;const i=null===(t=this.definition)||void 0===t?void 0:t.language,o=!this.languageCode||this.languageCode===i||!e.some(t=>t.code===this.languageCode),n=o?null:e.find(t=>t.code===this.languageCode),s=this.getLocalizationProgress(o?"":this.languageCode),r="translation-settings-panel",a=Math.max(s.total-s.localized,0),l=s.total>0,d=a>0
|
|
10736
|
+
`}renderLocalizationWindow(){var t;const e=this.getLocalizationLanguages();if(!e.length)return H``;const i=null===(t=this.definition)||void 0===t?void 0:t.language,o=!this.languageCode||this.languageCode===i||!e.some(t=>t.code===this.languageCode),n=o?null:e.find(t=>t.code===this.languageCode),s=this.getLocalizationProgress(o?"":this.languageCode),r="translation-settings-panel",a=Math.max(s.total-s.localized,0),l=s.total>0,d=a>0;return H`
|
|
10737
10737
|
<temba-floating-window
|
|
10738
10738
|
id="localization-window"
|
|
10739
10739
|
name="localization"
|
|
@@ -10764,27 +10764,17 @@ background: #ccc;
|
|
|
10764
10764
|
name="${t.name}"
|
|
10765
10765
|
></temba-option>`)}
|
|
10766
10766
|
</temba-select>
|
|
10767
|
-
${
|
|
10768
|
-
class="auto-translate-button"
|
|
10769
|
-
type="button"
|
|
10770
|
-
?disabled=${u}
|
|
10771
|
-
@click=${this.handleAutoTranslateClick}
|
|
10772
|
-
>
|
|
10773
|
-
${c}
|
|
10774
|
-
</button>`:""}
|
|
10767
|
+
${""}
|
|
10775
10768
|
</div>
|
|
10776
10769
|
<div
|
|
10777
10770
|
class="localization-progress ${o?"disabled":""}"
|
|
10778
10771
|
>
|
|
10779
10772
|
<div class="localization-progress-summary">
|
|
10780
|
-
${
|
|
10781
|
-
<span>Auto translating remaining text…</span>`:o?H`<span
|
|
10773
|
+
${o?H`<span
|
|
10782
10774
|
>Select a language to see translation progress.</span
|
|
10783
10775
|
>`:l?d?H`<span>${s.localized} of ${s.total} items translated</span>`:H`<span>All items are translated.</span>`:H`<span>Add content or enable more options to start translating.</span>`}
|
|
10784
10776
|
</div>
|
|
10785
|
-
${
|
|
10786
|
-
${this.autoTranslateError}
|
|
10787
|
-
</div>`:""}
|
|
10777
|
+
${""}
|
|
10788
10778
|
<div class="localization-progress-bar-row">
|
|
10789
10779
|
<div
|
|
10790
10780
|
class="localization-progress-trigger"
|
|
@@ -11034,7 +11024,6 @@ background: #ccc;
|
|
|
11034
11024
|
${r(Mm.styles.cssText)}
|
|
11035
11025
|
</style>`,o=(null===(e=null===(t=this.definition)||void 0===t?void 0:t._ui)||void 0===e?void 0:e.stickies)||{},n=this.definition&&this.definition.nodes.length>0&&this.definition.nodes.some(t=>{var e;return!(null===(e=this.definition._ui)||void 0===e?void 0:e.nodes[t.uuid])});return H`${i} ${this.renderIssuesWindow()}
|
|
11036
11026
|
${this.renderRevisionsWindow()} ${this.renderLocalizationWindow()}
|
|
11037
|
-
${this.renderAutoTranslateDialog()}
|
|
11038
11027
|
<div id="editor-container">
|
|
11039
11028
|
${this.renderToolbar()}
|
|
11040
11029
|
<div id="editor">
|