1(function($,_){let richTextInputId=0;class CiviRichTextInput extends HTMLElement{constructor(){super();this.input=document.createElement('textarea');this.input.id='civiRichTextInput'+richTextInputId++;this.input.style.display='none';} 2connectedCallback(){this.render();} 3render(){this.innerHTML=` 4 <div class="rich-text-toolbar crm-buttons" style="display: none;"> 5 <button type="button" class="crm-button rich-text-cancel"> 6 <i class="crm-i fa-cancel" role="img" aria-disabled="true"></i> 7 </button> 8 <button type="button" class="crm-button rich-text-save"> 9 <i class="crm-i fa-check" role="img" aria-disabled="true"></i> 10 </button> 11 </div> 12 <div class="rich-text-preview" tabindex="0"></div> 13 `;this.append(this.input);this.toolbar=this.querySelector('.rich-text-toolbar');this.cancelButton=this.querySelector('.rich-text-cancel');this.saveButton=this.querySelector('.rich-text-save');this.preview=this.querySelector('.rich-text-preview');this.cancelButton.append(ts('Cancel'));this.saveButton.append(ts('Save'));this.preview.title=ts('Click to edit');this.renderPreview();this.preview.onclick=(e)=>{e.preventDefault();this.openEditor();};this.preview.onkeystroke=(e)=>{e.preventDefault();this.openEditor();};this.cancelButton.onclick=()=>this.closeEditor();this.saveButton.onclick=()=>this.saveAndCloseEditor();if(this.hasAttribute('token-picker')){this.loadTokenPicker();}} 14renderPreview(){this.preview.innerHTML=this.value.length?this.value:'<i class="crm-i fa-pencil" role="img" aria-label="Edit"></i>';} 15loadTokenPicker(){this.tokenPicker=document.createElement('input');this.tokenPicker.classList.add('rich-text-token-picker','form-control','crm-auto-width','crm-action-menu','fa-code','collapsible-optgroups');this.toolbar.prepend(this.tokenPicker);this.tokenPicker.onchange=()=>{const token=`[${this.tokenPicker.value}]`;CRM.wysiwyg.insert(this.input,token);CRM.$(this.tokenPicker).select2('val','');};CRM.$(this.tokenPicker).crmSelect2({data:()=>this.getTokens(),placeholder:ts('Tokens')});} 16openEditor(){this.setAttribute('editing',true);CRM.wysiwyg.create(this.input);this.preview.style.display='none';this.toolbar.style.display=null;this.dispatchEvent(new Event('load'));} 17closeEditor(){CRM.wysiwyg.destroy(this.input);this.input.style.display='none';this.toolbar.style.display='none';this.preview.style.display=null;this.removeAttribute('editing');} 18saveAndCloseEditor(){this.value=CRM.wysiwyg.getVal(this.input);this.closeEditor();this.dispatchEvent(new Event('change'));} 19getTokens(){if(this.closest('af-gui-editor')){const afGuiEditor=angular.element(this.closest('af-gui-editor')).controller('afGuiEditor');return{results:afGuiEditor.getTokens(this.hasAttribute('include-submission-tokens'))};} 20else{throw new Error('civi-rich-text-input[token-picker] doesn\'t know how to get available tokens outside of af-gui-editor context yet');}} 21get value(){return this.input.value;} 22set value(v){if(!v){v='';} 23this.input.value=v;CRM.wysiwyg.setVal(this.input,v);if(this.preview){this.renderPreview();}}} 24customElements.define('civi-rich-text-input',CiviRichTextInput);CRM.wysiwyg={supportsFileUploads:!!CRM.config.wysisygScriptLocation,create:function(item){var ret=$.Deferred();if(CRM.config.wysisygScriptLocation){CRM.loadScript(CRM.config.wysisygScriptLocation).done(function(){CRM.wysiwyg._create(item).done(function(){ret.resolve();});});}else{ret.resolve();} 25return ret;},destroy:_.noop,updateElement:_.noop,getVal:function(item){return $(item).val();},setVal:function(item,val){return $(item).val(val);},insert:function(item,text){CRM.wysiwyg._insertIntoTextarea(item,text);},focus:function(item){$(item).focus();},_insertIntoTextarea:function(item,text){var itemObj=$(item);var origVal=itemObj.val();var origStart=itemObj[0].selectionStart;var origEnd=itemObj[0].selectionEnd;var newVal=origVal.substring(0,origStart)+text+origVal.substring(origEnd);itemObj.val(newVal);var newPos=(origStart+text.length);itemObj[0].selectionStart=newPos;itemObj[0].selectionEnd=newPos;itemObj.triggerHandler('change');CRM.wysiwyg.focus(item);},createCollapsed:(item)=>{const customInput=document.createElement('civi-rich-text-input');
25customInput.input=item;customInput.input.style.display='none';item.replaceWith(customInput);}};})(CRM.$,CRM._);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.