@firestitch/html-editor 9.5.5 → 9.5.8
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/app/classes/plugin.d.ts +7 -7
- package/app/components/html-editor/html-editor.component.d.ts +54 -54
- package/app/components/html-renderer/html-renderer.component.d.ts +9 -9
- package/app/consts/paragraph-buttons.const.d.ts +1 -1
- package/app/consts/rich-buttons.const.d.ts +1 -1
- package/app/consts/text-buttons.const.d.ts +1 -1
- package/app/enums/default-plugin.enum.d.ts +14 -14
- package/app/fs-html-editor.module.d.ts +25 -25
- package/app/injects/config.inject.d.ts +3 -3
- package/app/interfaces/html-editor-config.d.ts +31 -31
- package/app/interfaces/plugin-button.d.ts +12 -12
- package/app/interfaces/plugin-config.d.ts +5 -5
- package/app/plugins/checklist.plugin.d.ts +7 -7
- package/app/plugins/code.plugin.d.ts +9 -9
- package/app/plugins/configs/mention-plugin.config.d.ts +13 -12
- package/app/plugins/configs/screen-record-plugin.config.d.ts +7 -7
- package/app/plugins/mention.plugin.d.ts +15 -12
- package/app/plugins/screen-record.plugin.d.ts +11 -11
- package/app/services/froala-loader.service.d.ts +17 -17
- package/app/utils/loader.d.ts +7 -7
- package/bundles/firestitch-html-editor.umd.js +1031 -1008
- package/bundles/firestitch-html-editor.umd.js.map +1 -1
- package/bundles/firestitch-html-editor.umd.min.js +2 -2
- package/bundles/firestitch-html-editor.umd.min.js.map +1 -1
- package/esm2015/app/classes/plugin.js +4 -4
- package/esm2015/app/components/html-editor/html-editor.component.js +445 -435
- package/esm2015/app/components/html-renderer/html-renderer.component.js +33 -33
- package/esm2015/app/consts/paragraph-buttons.const.js +8 -8
- package/esm2015/app/consts/rich-buttons.const.js +6 -6
- package/esm2015/app/consts/text-buttons.const.js +18 -18
- package/esm2015/app/fs-html-editor.module.js +56 -56
- package/esm2015/app/injects/config.inject.js +3 -3
- package/esm2015/app/plugins/checklist.plugin.js +34 -34
- package/esm2015/app/plugins/code.plugin.js +62 -62
- package/esm2015/app/plugins/configs/mention-plugin.config.js +1 -1
- package/esm2015/app/plugins/mention.plugin.js +87 -73
- package/esm2015/app/plugins/screen-record.plugin.js +91 -91
- package/esm2015/app/services/froala-loader.service.js +80 -80
- package/esm2015/app/utils/loader.js +82 -82
- package/esm2015/firestitch-html-editor.js +8 -8
- package/esm2015/public_api.js +11 -11
- package/esm5/app/classes/plugin.js +8 -8
- package/esm5/app/components/html-editor/html-editor.component.js +471 -461
- package/esm5/app/components/html-renderer/html-renderer.component.js +38 -38
- package/esm5/app/consts/paragraph-buttons.const.js +8 -8
- package/esm5/app/consts/rich-buttons.const.js +6 -6
- package/esm5/app/consts/text-buttons.const.js +18 -18
- package/esm5/app/fs-html-editor.module.js +61 -61
- package/esm5/app/injects/config.inject.js +3 -3
- package/esm5/app/plugins/checklist.plugin.js +40 -40
- package/esm5/app/plugins/code.plugin.js +69 -69
- package/esm5/app/plugins/configs/mention-plugin.config.js +1 -1
- package/esm5/app/plugins/mention.plugin.js +93 -79
- package/esm5/app/plugins/screen-record.plugin.js +105 -105
- package/esm5/app/services/froala-loader.service.js +95 -95
- package/esm5/app/utils/loader.js +82 -82
- package/esm5/firestitch-html-editor.js +8 -8
- package/esm5/public_api.js +11 -11
- package/fesm2015/firestitch-html-editor.js +952 -928
- package/fesm2015/firestitch-html-editor.js.map +1 -1
- package/fesm5/firestitch-html-editor.js +1032 -1008
- package/fesm5/firestitch-html-editor.js.map +1 -1
- package/firestitch-html-editor.d.ts +9 -9
- package/firestitch-html-editor.metadata.json +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +16 -16
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/common"),require("@firestitch/skeleton"),require("@angular/forms"),require("@firestitch/file"),require("rxjs"),require("rxjs/operators"),require("lodash-es"),require("@angular/platform-browser"),require("tributejs")):"function"==typeof define&&define.amd?define("@firestitch/html-editor",["exports","@angular/core","@angular/common","@firestitch/skeleton","@angular/forms","@firestitch/file","rxjs","rxjs/operators","lodash-es","@angular/platform-browser","tributejs"],t):t(((e=e||self).firestitch=e.firestitch||{},e.firestitch["html-editor"]={}),e.ng.core,e.ng.common,e.skeleton,e.ng.forms,e.file,e.rxjs,e.rxjs.operators,e.lodashEs,e.ng.platformBrowser,e.Tribute)}(this,(function(e,t,n,o,i,r,a,s,l,c,u){"use strict";u=u&&Object.prototype.hasOwnProperty.call(u,"default")?u.default:u;
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/common"),require("@firestitch/skeleton"),require("@angular/forms"),require("@firestitch/file"),require("rxjs"),require("rxjs/operators"),require("lodash-es"),require("@angular/platform-browser"),require("tributejs"),require("@firestitch/common")):"function"==typeof define&&define.amd?define("@firestitch/html-editor",["exports","@angular/core","@angular/common","@firestitch/skeleton","@angular/forms","@firestitch/file","rxjs","rxjs/operators","lodash-es","@angular/platform-browser","tributejs","@firestitch/common"],t):t(((e=e||self).firestitch=e.firestitch||{},e.firestitch["html-editor"]={}),e.ng.core,e.ng.common,e.skeleton,e.ng.forms,e.file,e.rxjs,e.rxjs.operators,e.lodashEs,e.ng.platformBrowser,e.Tribute,e.common$1)}(this,(function(e,t,n,o,i,r,a,s,l,c,u,f){"use strict";u=u&&Object.prototype.hasOwnProperty.call(u,"default")?u.default:u;
|
|
2
2
|
/*! *****************************************************************************
|
|
3
3
|
Copyright (c) Microsoft Corporation.
|
|
4
4
|
|
|
@@ -13,5 +13,5 @@
|
|
|
13
13
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
14
14
|
PERFORMANCE OF THIS SOFTWARE.
|
|
15
15
|
***************************************************************************** */
|
|
16
|
-
var f=function(e,t){return(f=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function d(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}f(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var p=function(){return(p=Object.assign||function(e){for(var t,n=1,o=arguments.length;n<o;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function h(e,t,n,o){var i,r=arguments.length,a=r<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,o);else for(var s=e.length-1;s>=0;s--)(i=e[s])&&(a=(r<3?i(a):r>3?i(t,n,a):i(t,n))||a);return r>3&&a&&Object.defineProperty(t,n,a),a}function g(e,t){return function(n,o){t(n,o,e)}}function m(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function b(e,t,n,o){return new(n||(n=Promise))((function(i,r){function a(e){try{l(o.next(e))}catch(e){r(e)}}function s(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}l((o=o.apply(e,t||[])).next())}))}function y(e,t){var n,o,i,r,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return r={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(r[Symbol.iterator]=function(){return this}),r;function s(r){return function(s){return function(r){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,o&&(i=2&r[0]?o.return:r[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,r[1])).done)return i;switch(o=0,i&&(r=[2&r[0],i.value]),r[0]){case 0:case 1:i=r;break;case 4:return a.label++,{value:r[1],done:!1};case 5:a.label++,o=r[1],r=[0];continue;case 7:r=a.ops.pop(),a.trys.pop();continue;default:if(!(i=a.trys,(i=i.length>0&&i[i.length-1])||6!==r[0]&&2!==r[0])){a=0;continue}if(3===r[0]&&(!i||r[1]>i[0]&&r[1]<i[3])){a.label=r[1];break}if(6===r[0]&&a.label<i[1]){a.label=i[1],i=r;break}if(i&&a.label<i[2]){a.label=i[2],a.ops.push(r);break}i[2]&&a.ops.pop(),a.trys.pop();continue}r=t.call(e,a)}catch(e){r=[6,e],o=0}finally{n=i=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}([r,s])}}}Object.create;function v(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var o,i,r=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(o=r.next()).done;)a.push(o.value)}catch(e){i={error:e}}finally{try{o&&!o.done&&(n=r.return)&&n.call(r)}finally{if(i)throw i.error}}return a}Object.create;var _=["insertTable","insertImage","insertLink","insertVideo"],w=["paragraphFormat","code","bold","italic","underline","strikeThrough","subscript","superscript","fontFamily","fontSize","textColor","backgroundColor","inlineClass","inlineStyle","clearFormatting","quote"],k=["align","formatOL","formatUL","checklist","indent","outdent"],x=new t.InjectionToken("fs-html-editor.default-config"),C=new t.InjectionToken("fs-html-editor.config");var P,j,E,O,R,L,S=(P="/assets/js/froala/",j="/assets/css/",E=document.getElementsByTagName("head")[0],O=new Map,R={froala:"froala_editor.min.js",align:"plugins/align.min.js",colors:"plugins/colors.min.js",image:"plugins/image.min.js",link:"plugins/link.min.js",lists:"plugins/lists.min.js",paragraph_format:"plugins/paragraph_format.min.js",table:"plugins/table.min.js",url:"plugins/url.min.js",video:"plugins/video.min.js",quote:"plugins/quote.min.js",draggable:"plugins/draggable.min.js",font_size:"plugins/font_size.min.js"},L={froala:"froala_editor.pkgd.min.css"},{setResourceBase:function(e){P=e},setStylesBase:function(e){j=e},loadResource:function(e){return function(e){if(!O.has(e)){var t=new a.Observable((function(t){var n=document.createElement("script");n.src=e,E.appendChild(n),n.onload=function(){t.next(),t.complete()},n.onerror=function(e){t.error(e)}})).pipe(s.shareReplay(1));O.set(e,t)}return O.get(e)}(P+(R[e]||e))},loadStyles:function(e){return function(e){if(!O.has(e)){var t=new a.Observable((function(t){var n=document.createElement("link");n.id=e,n.rel="stylesheet",n.href=""+e,E.appendChild(n),n.onload=function(){t.next(),t.complete()},n.onerror=function(e){t.error(e)}}));O.set(e,t)}return O.get(e)}(j+(L[e]||e))}}),z=function(){function e(e){this._defaultConfig=e,this._froalaLoaded=new a.BehaviorSubject(!1),this._defaultPluginsLoaded=new a.BehaviorSubject(!1),this._loaded$=a.combineLatest([this._froalaLoaded,this._defaultPluginsLoaded]).pipe(s.map((function(e){var t=v(e,2),n=t[0];return t[1]&&n})),s.shareReplay(1)),this._defaultConfig&&(this._defaultConfig.assetsJSPath&&S.setResourceBase(this._defaultConfig.assetsJSPath),this._defaultConfig.assetsCSSPath&&S.setStylesBase(this._defaultConfig.assetsCSSPath)),this._load()}return Object.defineProperty(e.prototype,"loaded$",{get:function(){return this._loaded$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ready",{get:function(){return this._froalaLoaded.getValue()&&this._defaultPluginsLoaded.getValue()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"FroalaEditor",{get:function(){return this._FroalaEditor},enumerable:!0,configurable:!0}),e.prototype._load=function(){var e=this;a.combineLatest([S.loadResource("froala"),S.loadStyles("froala")]).pipe(s.tap((function(){e._FroalaEditor=window.FroalaEditor,e._froalaDone()})),s.concatMap((function(){return e._loadPlugins()})),s.tap((function(){e._defaultPluginsDone()}))).subscribe()},e.prototype._loadPlugins=function(){var e=this._defaultConfig.defaultPlugins.reduce((function(e,t){var n=S.loadResource(t);return e.push(n),e}),[]);return a.combineLatest(e)},e.prototype._froalaDone=function(){this._froalaLoaded.next(!0)},e.prototype._defaultPluginsDone=function(){this._defaultPluginsLoaded.next(!0)},e.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Optional},{type:t.Inject,args:[C]}]}]},e.ɵprov=t.ɵɵdefineInjectable({factory:function(){return new e(t.ɵɵinject(C,8))},token:e,providedIn:"root"}),e=h([t.Injectable({providedIn:"root"}),g(0,t.Optional()),g(0,t.Inject(C)),m("design:paramtypes",[Object])],e)}(),T=function(){function e(e,t,n){this._defaultConfig=e,this._cdRef=t,this._fr=n,this.classFocused=!1,this.classDisabled=!1,this.config={},this.initialized=!1,this._initialize$=new a.ReplaySubject,this._froalaReady$=new a.BehaviorSubject(null),this._destroy$=new a.Subject,this.onChange=function(e){},this.onTouched=function(){}}var n;return n=e,Object.defineProperty(e.prototype,"el",{get:function(){return this.elRef.nativeElement},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"html",{get:function(){return this._html},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"editor",{get:function(){return this._editor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"froalaLoaded$",{get:function(){return this._fr.loaded$},enumerable:!0,configurable:!0}),e.prototype.ngOnInit=function(){this.config=this.config||{},this.config.autofocus=!1!==this.config.autofocus&&!this.config.disabled,this.initialized=!this.config.initOnClick,this._listenLazyInit()},e.prototype.ngAfterViewInit=function(){this.config.initOnClick&&this.hasContent()||(this.initialized=!0,this._initialize$.next())},e.prototype.hasContent=function(){var e=document.createElement("div");return!!e.querySelector("img")||(e.innerHTML=this._html,!!e.innerText.length)},e.prototype.initialize=function(e){var t=this;void 0===e&&(e={});var n=this._createConfig();this._initPlugins(n),this._editor=new this._fr.FroalaEditor(this.el,this._createOptions(),(function(){t._froalaReady$.next({config:n,options:e})}))},e.prototype._processImageUpload=function(e){var t=this,n=new r.FileProcessor,o=new r.FsFile(e);return n.process([o],this.config.image).pipe(s.switchMap((function(e){var n=v(e,1)[0];return t.config.image.upload(n.file)})))},e.prototype._getTextNode=function(e){if(e){if(e.nodeType===Node.TEXT_NODE)return e;if(e.childNodes)return this._getTextNode(e.childNodes[0])}},e.prototype.uninitializedClick=function(e){if(!e.defaultPrevented){var t=e.target;if(t&&"A"===t.nodeName&&t.getAttribute("href")){var n=t.getAttribute("target");t.setAttribute("target","_blank"),setTimeout((function(){n?t.setAttribute("target",n):t.removeAttribute("target")}))}else this.config.initClick&&this.config.initClick(e),this._initialize$.next(),this.initialized=!0}},e.prototype.updateSize=function(){window.dispatchEvent(new Event("resize"))},e.prototype.validate=function(e){var t={};if(this.config.maxLength&&this._html){var n=this.config.maxLength,o=this._html.length;o>n&&(t.maxLengthError="Must be "+n+" characters or fewer. You entered "+o+" characters.")}return Object.keys(t).length?t:null},e.prototype.focus=function(e){"end"===(e=e||{}).cursorPosition?this.editor.selection.setAtEnd(this.editor.$el.get(0)):this.editor.selection.setAtStart(this.editor.$el.get(0)),this.editor.selection.restore();var t=this.editor.selection.element();t&&t.scrollIntoView({block:"center"})},e.prototype.clear=function(){this.writeValue("")},e.prototype.disable=function(){this.classDisabled=!0},e.prototype.setHtml=function(e){this.writeValue(e)},e.prototype.writeValue=function(e){if(this._html=e||"",this.editor&&this.editor.html)try{this.editor.html.set(this._html)}catch(e){}this._cdRef.markForCheck()},e.prototype.registerOnChange=function(e){this.onChange=e},e.prototype.registerOnTouched=function(e){this.onTouched=e},e.prototype.ngOnDestroy=function(){this._initialize$.complete(),this._destroy$.next(),this._destroy$.complete(),this.destroy()},e.prototype.destroy=function(){this.editor&&this.editor.destroy(),this.initialized=!1,this._cdRef.markForCheck(),this.el.innerHTML=""},e.prototype._createConfig=function(){return l.merge({froalaConfig:{}},this._defaultConfig,this.config)},e.prototype._change=function(e){this.onChange(e)},e.prototype._initPlugins=function(e){var t=this;(e.plugins||[]).forEach((function(e){t._fr.FroalaEditor.PLUGINS[e.config.name]=function(t){return e.editor=t,e.initialize(),e},(e.config.buttons||[]).forEach((function(e){t._fr.FroalaEditor.DefineIcon(e.name,{NAME:e.name,PATH:e.svgPath}),t._fr.FroalaEditor.RegisterCommand(e.name,{icon:e.name,title:e.tooltip,undo:e.undo,focus:e.focus,showOnMobile:e.showOnMobile,refreshAfterCallback:e.refreshAfterCallback,callback:function(){e.click&&e.click(this)},refresh:function(e){e.refresh&&e.refresh(this,e)}})}))}))},e.prototype._createOptions=function(){var e=this._createConfig();return l.merge({},{key:e.activationKey,placeholderText:e.placeholder,linkAlwaysBlank:!0,tabSpaces:2,typingTimer:250,tooltips:!1,wordPasteModal:!1,imageDefaultWidth:0,imageDefaultAlign:"left",quickInsertEnabled:!1,paragraphDefaultSelection:"Format",videoUpload:!1,paragraphFormat:{N:"Normal",H1:"Heading 1",H2:"Heading 2",H3:"Heading 3",H4:"Heading 4",BLOCKQUOTE:"Quote"},paragraphFormatSelection:!0,toolbarButtonsXS:{moreText:{buttons:w,buttonsVisible:1},moreParagraph:{buttons:k,buttonsVisible:2},moreRich:{buttons:_,buttonsVisible:0}},toolbarButtons:{moreText:{buttons:w,buttonsVisible:3},moreParagraph:{buttons:k,buttonsVisible:5},moreRich:{buttons:_,buttonsVisible:3}}},e.froalaConfig)},e.prototype._listenLazyInit=function(){var e=this;this.froalaLoaded$.pipe(s.filter((function(e){return e})),s.switchMap((function(){return e._initialize$})),s.tap((function(){var t=window.getSelection(),n={};t.baseNode&&(n.selection={node:t.baseNode.nodeValue,offset:t.baseOffset}),e.initialize(n)})),s.switchMap((function(){return e._froalaReady$})),s.filter((function(e){return!!e})),s.tap((function(t){var n=t.config,o=t.options;e._setupFroala(n,o)}))).subscribe()},e.prototype._contentChanged=function(){var e=this._editor.html.get();this.html!==e&&this._change(e)},e.prototype._setupFroala=function(e,t){var n=this;this._cdRef.markForCheck(),this.setHtml(this._html),e.disabled&&this.disable(),e.froalaConfig.events&&e.froalaConfig.events.initialized&&e.froalaConfig.events.initialized(),this._editor.events.on("focus",(function(){n.classFocused=!0,n._cdRef.markForCheck()})),this._editor.events.on("blur",(function(){n.classFocused=!1,n._cdRef.markForCheck()})),this._editor.events.on("contentChanged",(function(){n._contentChanged()})),this._editor.events.on("paste.afterCleanup",(function(e){var t=document.createElement("div");return t.innerHTML=e,t.querySelectorAll("*").forEach((function(e){for(var t=0;t<e.attributes.length;t++){var n=e.attributes[0].name;"href"!==n&&e.removeAttribute(n)}})),t.innerHTML})),this._editor.events.on("keydown",(function(){n.onTouched()})),this.config.image&&this.config.image.upload&&(this._editor.events.on("image.beforePasteUpload",(function(e){return fetch(e.getAttribute("src")).then((function(t){t.blob().then((function(t){n._processImageUpload(t).pipe(s.takeUntil(n._destroy$)).subscribe((function(t){e.setAttribute("src",t),e.removeAttribute("data-fr-image-pasted"),n._contentChanged()}))}))})),!1})),this._editor.events.on("image.beforeUpload",(function(e){return n._processImageUpload(e[0]).pipe(s.takeUntil(n._destroy$)).subscribe((function(e){n.editor.image.insert(e,null,null,n.editor.image.get())})),!1}))),this.el.querySelector(".fr-second-toolbar")&&this.el.querySelector(".fr-second-toolbar").remove();var o=t.selection;if(o){var i=Array.from(this.el.querySelectorAll(".fr-element *")).find((function(e){return o.node===e.textContent}));if(i){var r=document.createRange(),a=window.getSelection();r.setStart(this._getTextNode(i),o.offset),r.collapse(!0),a.removeAllRanges(),a.addRange(r)}else this.config.autofocus&&this.focus()}else this.config.autofocus&&this.focus()},e.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Optional},{type:t.Inject,args:[C]}]},{type:t.ChangeDetectorRef},{type:z}]},h([t.HostBinding("class.focused"),m("design:type",Object)],e.prototype,"classFocused",void 0),h([t.HostBinding("class.disabled"),m("design:type",Object)],e.prototype,"classDisabled",void 0),h([t.ViewChild("elRef"),m("design:type",t.ElementRef)],e.prototype,"elRef",void 0),h([t.Input(),m("design:type",Object)],e.prototype,"config",void 0),e=n=h([t.Component({selector:"fs-html-editor",template:'<div class="fs-html-editor-default">\n <ng-container *ngIf="initialized">\n <ng-container *fsSkeleton="(froalaLoaded$ | async) !== false">\n </ng-container>\n </ng-container>\n\n <div #elRef></div>\n\n <div class="bottom-line"></div>\n <div class="disabled-line"></div>\n <fs-html-renderer\n *ngIf="!initialized"\n [html]="html"\n (click)="uninitializedClick($event)">\n </fs-html-renderer>\n</div>\n',providers:[{provide:i.NG_VALUE_ACCESSOR,useExisting:t.forwardRef((function(){return n})),multi:!0},{provide:i.NG_VALIDATORS,useExisting:t.forwardRef((function(){return n})),multi:!0}],changeDetection:t.ChangeDetectionStrategy.OnPush,styles:[':host ::ng-deep .fr-box.fr-basic .fr-wrapper{border:0;border-bottom:1px solid #949494;margin-bottom:1px;background-color:transparent}:host ::ng-deep .fr-box.fr-basic .fr-element{padding:0;font-family:inherit;color:inherit;font-size:inherit;line-height:inherit;min-height:auto}:host ::ng-deep .fr-dropdown-menu .fr-dropdown-wrapper,:host ::ng-deep .fr-dropdown:after,:host ::ng-deep .fr-more-toolbar,:host ::ng-deep .fr-toolbar{transition:none!important}:host ::ng-deep .fr-toolbar{position:-webkit-sticky;position:sticky;z-index:2;border-radius:0;background-color:transparent}:host ::ng-deep .fr-toolbar .fr-btn-grp{margin:0 20px 0 0}:host ::ng-deep .fr-toolbar .fr-btn-grp:nth-child(1):after,:host ::ng-deep .fr-toolbar .fr-btn-grp:nth-child(2):after{content:"";position:absolute;top:9px;height:30px;border-left:1px solid #e5e5e5;margin-left:10px}:host ::ng-deep .fr-toolbar div:first-of-type:before{border:none}:host ::ng-deep .fr-toolbar.fr-toolbar-open .fr-newline{height:auto}:host ::ng-deep .fr-toolbar .fr-btn-grp:first-child{margin-left:0}:host ::ng-deep .fr-toolbar.fr-top{border:0}:host ::ng-deep .fr-toolbar .fr-newline{margin:0}:host ::ng-deep .fr-toolbar .fr-more-toolbar{z-index:auto}:host ::ng-deep .fr-toolbar .fr-command.fr-btn{z-index:auto}:host ::ng-deep .fr-toolbar .fr-command.fr-btn.fr-dropdown:after{right:3px}:host ::ng-deep .fr-toolbar .fr-command.fr-btn.fr-dropdown.fr-selection span{margin-right:24px}:host ::ng-deep .fr-toolbar .fr-command.fr-btn.fr-open{border-radius:4px;margin:4px 2px}:host ::ng-deep .fr-view ol,:host ::ng-deep .fr-view ul{list-style-position:unset}:host.disabled ::ng-deep .fr-box.fr-basic{opacity:.5;pointer-events:none}:host.disabled ::ng-deep .fr-box.fr-basic .fr-wrapper{border:none}:host.disabled ::ng-deep .disabled-line{display:block}::ng-deep .fr-popup{z-index:1001!important}::ng-deep .fr-video-by-url-layer .fr-checkbox-line{display:none}.disabled-line{display:none;position:absolute;bottom:-1px;z-index:1;background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x;height:1px;width:100%}.bottom-line{opacity:0;transform-origin:50%;transform:scaleX(.5);transition:background-color .3s cubic-bezier(.55,0,.55,.2);width:100%;border-bottom:2px solid #949494;position:absolute;bottom:-1px;z-index:1}:host{position:relative;display:block}:host.focused .bottom-line{opacity:1;display:block;transform:scaleX(1);transition:transform .3s cubic-bezier(.25,.8,.25,1),opacity .1s cubic-bezier(.25,.8,.25,1),background-color .3s cubic-bezier(.25,.8,.25,1)}::ng-deep .fs-html-editor-mention-container{position:absolute;top:0;left:0;height:auto;max-height:300px;max-width:500px;overflow:auto;display:block;z-index:999999;box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);border-bottom-left-radius:4px;border-bottom-right-radius:4px;background:#fff}::ng-deep .fs-html-editor-mention-container ul{margin:0;padding:0;list-style:none}::ng-deep .fs-html-editor-mention-container li{padding:0 16px;cursor:pointer;line-height:48px}::ng-deep .fs-html-editor-mention-container li.highlight,::ng-deep .fs-html-editor-mention-container li:hover{background:#f5f5f5}::ng-deep .fs-html-editor-mention-container li.no-match{cursor:default}']}),g(0,t.Optional()),g(0,t.Inject(C)),m("design:paramtypes",[Object,t.ChangeDetectorRef,z])],e)}(),M=function(){function e(e,t){this.sanitized=e,this._cdRef=t}return Object.defineProperty(e.prototype,"setHtml",{set:function(e){this.trustedHtml=this.sanitized.bypassSecurityTrustHtml(e),this._cdRef.markForCheck()},enumerable:!0,configurable:!0}),e.ctorParameters=function(){return[{type:c.DomSanitizer},{type:t.ChangeDetectorRef}]},h([t.Input("html"),m("design:type",Object),m("design:paramtypes",[Object])],e.prototype,"setHtml",null),e=h([t.Component({selector:"fs-html-renderer",template:'<div class="fr-view fs-html-editor-default" [innerHtml]="trustedHtml"></div>\n',changeDetection:t.ChangeDetectionStrategy.OnPush,styles:[""]}),m("design:paramtypes",[c.DomSanitizer,t.ChangeDetectorRef])],e)}(),F=function(){function e(){}var i;return i=e,e.forRoot=function(e){return void 0===e&&(e={}),{ngModule:i,providers:[{provide:x,useValue:e},{provide:C,useFactory:A,deps:[x]}]}},e=i=h([t.NgModule({imports:[n.CommonModule,o.FsSkeletonModule],exports:[T,M],declarations:[T,M]})],e)}();function A(e){return p({defaultPlugins:["align","colors","image","link","lists","paragraph_format","quote","table","url","video","draggable","font_size"]},e)}var H=function(){function e(){}return e.prototype.initialize=function(){},e.prototype.destroy=function(){},e}(),I=function(e){function t(n){var o=e.call(this)||this;return o.config=n,o.config=p(p({},n),{buttons:[{name:n.name,tooltip:n.tooltip,svgPath:n.iconPath,click:function(e){o._closeAll(),o._tribute.showMenuForCollection(e.el)}}]}),o._tribute=new u({values:l.debounce(o._loadValues.bind(o),200),searchOpts:{pre:"",post:"",skip:!0},containerClass:"fs-html-editor-mention-container "+(o.config.containerClass||""),itemClass:"fs-html-editor-mention-menu-item "+(o.config.menuItemClass||""),trigger:o.config.trigger,allowSpaces:!0,menuItemTemplate:function(e){return o.config.menuItemTemplate(e.original)},selectTemplate:function(e){var t=o.config.selectedTemplate(e.original),n=document.createElement("p");n.innerHTML=t;var i=n.firstElementChild;return i||((i=document.createElement("span")).innerHTML=t),i.setAttribute("contenteditable","false"),i.classList.add("fr-deletable"),i.outerHTML}}),t._tributes.push(o._tribute),o}return d(t,e),t.prototype.initialize=function(){var e=this;this._tribute.attach(this.editor.el),this.editor.events.on("keydown",(function(t){if("Enter"===t.key&&e._tribute.isActive)return!1}),!0)},t.prototype.destroy=function(){},t.prototype._closeAll=function(){t._tributes.forEach((function(e){e.menu&&e.hideMenu()}))},t.prototype._loadValues=function(e,t){return this.config.fetch(e).subscribe((function(e){t(e)}))},t._tributes=[],t}(H),D=function(e){function t(t){void 0===t&&(t={name:"checklist"});var n=e.call(this)||this;return n.config=t,n.config=p(p({},t),{name:"checklist",buttons:[{name:"checklist",svgPath:"M8.4,10.3l-1.2,1.2l4,4L20,6.7l-1.2-1.2l-7.6,7.6L8.4,10.3z M18.2,18.2H5.8V5.8h8.9V4H5.8C4.8,4,4,4.8,4,5.8v12.4c0,1,0.8,1.8,1.8,1.8h12.4c1,0,1.8-0.8,1.8-1.8v-7.1h-1.8V18.2z",click:function(e){e.html.insert('<ul class="checklist"><li></li></ul>')}}]}),n}return d(t,e),t.prototype.initialize=function(){this.editor.events.on("click",(function(e){var t=e.target;if("LI"===t.nodeName&&e.offsetX<0){var n=function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(v(arguments[t]));return e}([t],t.querySelectorAll("li"));t.classList.contains("checked")?n.forEach((function(e){e.classList.remove("checked")})):n.forEach((function(e){e.classList.add("checked")}))}}),!1)},t}(H),N=function(e){function t(t){void 0===t&&(t={name:"code"});var n=e.call(this)||this;return n.config=t,n.config=p(p({},t),{name:"code",buttons:[{name:"code",svgPath:"M8.9,7.3L4.2,12l4.7,4.7l1.1-1.1L6.4,12L10,8.4L8.9,7.3z M15.1,7.3L14,8.4l3.6,3.6L14,15.6l1.1,1.1l4.7-4.7L15.1,7.3z",click:function(e){var t=e.selection.get(),o=n._getCodeEl(t.baseNode);o?o.classList.remove("code"):e.html.insert('<p class="code">'+e.selection.get().toString().replace(/\n{1,}/g,"<br>")+"</p>")}}]}),n}return d(t,e),t.prototype.initialize=function(){var e=this;this.editor.events.on("keydown",(function(t){if(13===t.keyCode){var n=e.editor.selection.get();if(n&&e._getCodeEl(n.baseNode)){t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation();var o="<br>",i=n.baseNode;if("#text"===i.nodeName&&n.baseOffset===i.length)i.nextSibling&&"BR"===i.nextSibling.nodeName||(o+="<br>");else{var r=Array.from(i.childNodes).splice(n.baseOffset-1,1).pop();r&&"BR"!==r.nodeName&&(o+="<br>")}return e.editor.html.insert(o),!1}}}),!0)},t.prototype.destroy=function(){},t.prototype._getCodeEl=function(e){if(e){if(e.classList&&e.classList.contains("code"))return e;if(e.parentElement)return this._getCodeEl(e.parentElement)}return null},t}(H),V=function(e){function t(t){void 0===t&&(t={});var n=e.call(this)||this;return n.config=t,n.config=p(p({},t),{name:t.name||"screenRecord",buttons:[{name:"screenRecord",svgPath:"M14.7,7.7v6.1H7.1V7.7H14.7 M16.3,9.6V6.9c0-0.4-0.3-0.8-0.8-0.8H6.4c-0.4,0-0.8,0.3-0.8,0.8v7.6c0,0.4,0.3,0.8,0.8,0.8h9.1c0.4,0,0.8-0.3,0.8-0.8v-2.7l1.7,1.7c0.3,0.3,0.8,0.3,1.1,0c0.1-0.1,0.2-0.3,0.2-0.5V8.4c0-0.4-0.3-0.8-0.8-0.8\n\tc-0.2,0-0.4,0.1-0.5,0.2L16.3,9.6z M21.5,1.6H2.9c-0.7,0-1.3,0.7-1.3,1.6v14.6c0,0.9,0.6,1.6,1.3,1.6h7.6v1.1l-5,1c-0.2,0-0.4,0.3-0.4,0.6c0,0.3,0.2,0.4,0.4,0.4c0,0,0,0,0.1,0l5.3-1h2.6l5.3,1c0,0,0,0,0.1,0c0.2,0,0.4-0.2,0.4-0.4\n c0-0.3-0.1-0.6-0.4-0.6l-5-1v-1.1h7.6c0.7,0,1.3-0.7,1.3-1.6V3.2C22.9,2.3,22.3,1.6,21.5,1.6z M21.1,17.3H3.3V3.7h17.8L21.1,17.3L21.1,17.3z",tooltip:"Screen Record",click:function(e){navigator.mediaDevices.getDisplayMedia({video:!0}).then((function(n){var o=[],i=new MediaRecorder(n,{mimeType:"video/webm; codecs=vp9"});n.addEventListener("inactive",(function(r){i.stop(),i=null,n.getTracks().forEach((function(e){return e.stop()})),n=null;var a=new Blob(o,{type:"video/webm"});t.upload(a).subscribe((function(n){e.html.insert('<span class="fr-screen-record fr-deletable fr-draggable"><video controls style="max-width:'+t.maxWidth+'"><source src="'+n+'" type="video/webm"></video></span>')}))})),i.addEventListener("dataavailable",(function(e){e.data&&e.data.size>0&&o.push(e.data)})),i.start(10)})).catch((function(e){}))}}]}),n}return d(t,e),t.prototype.initialize=function(){return b(this,void 0,void 0,(function(){var e,t=this;return y(this,(function(n){switch(n.label){case 0:return[4,S.loadStyles("froala").toPromise()];case 1:return n.sent(),e=window.FroalaEditor,this.editor.events.on("mouseup",(function(e){var n=t._getEl(e.target);n&&(t.editor.popups.hideAll(),t._activeEl=n,t._showPopup(n))})),e.POPUP_TEMPLATES["screenRecordPlugin.popup"]="[_BUTTONS_]",e.DefineIcon("popupClose",{NAME:"trash",SVG_KEY:"remove"}),e.RegisterCommand("popupClose",{title:"Remove",undo:!1,focus:!1,callback:function(){t._activeEl&&t._activeEl.remove()}}),[2]}}))}))},t.prototype._createPopup=function(){var e={buttons:'<div class="fr-buttons">'+this.editor.button.buildList(["popupClose"])+"</div>"};return this.editor.popups.create("screenRecordPlugin.popup",e)},t.prototype._showPopup=function(e){var t=this.editor.popups.get("screenRecordPlugin.popup");t||(t=this._createPopup()),this.editor.popups.setContainer("screenRecordPlugin.popup",this.editor.$(e));var n=e.offsetLeft+e.offsetWidth/2;this.editor.popups.show("screenRecordPlugin.popup",n,null)},t.prototype._getEl=function(e){if(e&&e.classList)return e.classList.contains("fr-screen-record")?e:this._getEl(e.parentNode)},t}(H);e.ChecklistPlugin=D,e.CodePlugin=N,e.FS_HTML_EDITOR_CONFIG=C,e.FsHtmlEditorComponent=T,e.FsHtmlEditorModule=F,e.FsHtmlRendererComponent=M,e.MentionPlugin=I,e.ParagraphButtons=k,e.RichButtons=_,e.ScreenRecordPlugin=V,e.TextButtons=w,e.ɵa=A,e.ɵb=x,e.ɵc=z,e.ɵe=H,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
16
|
+
var d=function(e,t){return(d=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function p(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}d(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var h=function(){return(h=Object.assign||function(e){for(var t,n=1,o=arguments.length;n<o;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function g(e,t,n,o){var i,r=arguments.length,a=r<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,o);else for(var s=e.length-1;s>=0;s--)(i=e[s])&&(a=(r<3?i(a):r>3?i(t,n,a):i(t,n))||a);return r>3&&a&&Object.defineProperty(t,n,a),a}function m(e,t){return function(n,o){t(n,o,e)}}function b(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function y(e,t,n,o){return new(n||(n=Promise))((function(i,r){function a(e){try{l(o.next(e))}catch(e){r(e)}}function s(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}l((o=o.apply(e,t||[])).next())}))}function v(e,t){var n,o,i,r,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return r={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(r[Symbol.iterator]=function(){return this}),r;function s(r){return function(s){return function(r){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,o&&(i=2&r[0]?o.return:r[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,r[1])).done)return i;switch(o=0,i&&(r=[2&r[0],i.value]),r[0]){case 0:case 1:i=r;break;case 4:return a.label++,{value:r[1],done:!1};case 5:a.label++,o=r[1],r=[0];continue;case 7:r=a.ops.pop(),a.trys.pop();continue;default:if(!(i=a.trys,(i=i.length>0&&i[i.length-1])||6!==r[0]&&2!==r[0])){a=0;continue}if(3===r[0]&&(!i||r[1]>i[0]&&r[1]<i[3])){a.label=r[1];break}if(6===r[0]&&a.label<i[1]){a.label=i[1],i=r;break}if(i&&a.label<i[2]){a.label=i[2],a.ops.push(r);break}i[2]&&a.ops.pop(),a.trys.pop();continue}r=t.call(e,a)}catch(e){r=[6,e],o=0}finally{n=i=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}([r,s])}}}Object.create;function _(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var o,i,r=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(o=r.next()).done;)a.push(o.value)}catch(e){i={error:e}}finally{try{o&&!o.done&&(n=r.return)&&n.call(r)}finally{if(i)throw i.error}}return a}Object.create;var w=["insertTable","insertImage","insertLink","insertVideo"],k=["paragraphFormat","code","bold","italic","underline","strikeThrough","subscript","superscript","fontFamily","fontSize","textColor","backgroundColor","inlineClass","inlineStyle","clearFormatting","quote"],x=["align","formatOL","formatUL","checklist","indent","outdent"],C=new t.InjectionToken("fs-html-editor.default-config"),P=new t.InjectionToken("fs-html-editor.config");var E,j,O,L,R,S,z=(E="/assets/js/froala/",j="/assets/css/",O=document.getElementsByTagName("head")[0],L=new Map,R={froala:"froala_editor.min.js",align:"plugins/align.min.js",colors:"plugins/colors.min.js",image:"plugins/image.min.js",link:"plugins/link.min.js",lists:"plugins/lists.min.js",paragraph_format:"plugins/paragraph_format.min.js",table:"plugins/table.min.js",url:"plugins/url.min.js",video:"plugins/video.min.js",quote:"plugins/quote.min.js",draggable:"plugins/draggable.min.js",font_size:"plugins/font_size.min.js"},S={froala:"froala_editor.pkgd.min.css"},{setResourceBase:function(e){E=e},setStylesBase:function(e){j=e},loadResource:function(e){return function(e){if(!L.has(e)){var t=new a.Observable((function(t){var n=document.createElement("script");n.src=e,O.appendChild(n),n.onload=function(){t.next(),t.complete()},n.onerror=function(e){t.error(e)}})).pipe(s.shareReplay(1));L.set(e,t)}return L.get(e)}(E+(R[e]||e))},loadStyles:function(e){return function(e){if(!L.has(e)){var t=new a.Observable((function(t){var n=document.createElement("link");n.id=e,n.rel="stylesheet",n.href=""+e,O.appendChild(n),n.onload=function(){t.next(),t.complete()},n.onerror=function(e){t.error(e)}}));L.set(e,t)}return L.get(e)}(j+(S[e]||e))}}),T=function(){function e(e){this._defaultConfig=e,this._froalaLoaded=new a.BehaviorSubject(!1),this._defaultPluginsLoaded=new a.BehaviorSubject(!1),this._loaded$=a.combineLatest([this._froalaLoaded,this._defaultPluginsLoaded]).pipe(s.map((function(e){var t=_(e,2),n=t[0];return t[1]&&n})),s.shareReplay(1)),this._defaultConfig&&(this._defaultConfig.assetsJSPath&&z.setResourceBase(this._defaultConfig.assetsJSPath),this._defaultConfig.assetsCSSPath&&z.setStylesBase(this._defaultConfig.assetsCSSPath)),this._load()}return Object.defineProperty(e.prototype,"loaded$",{get:function(){return this._loaded$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ready",{get:function(){return this._froalaLoaded.getValue()&&this._defaultPluginsLoaded.getValue()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"FroalaEditor",{get:function(){return this._FroalaEditor},enumerable:!0,configurable:!0}),e.prototype._load=function(){var e=this;a.combineLatest([z.loadResource("froala"),z.loadStyles("froala")]).pipe(s.tap((function(){e._FroalaEditor=window.FroalaEditor,e._froalaDone()})),s.concatMap((function(){return e._loadPlugins()})),s.tap((function(){e._defaultPluginsDone()}))).subscribe()},e.prototype._loadPlugins=function(){var e=this._defaultConfig.defaultPlugins.reduce((function(e,t){var n=z.loadResource(t);return e.push(n),e}),[]);return a.combineLatest(e)},e.prototype._froalaDone=function(){this._froalaLoaded.next(!0)},e.prototype._defaultPluginsDone=function(){this._defaultPluginsLoaded.next(!0)},e.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Optional},{type:t.Inject,args:[P]}]}]},e.ɵprov=t.ɵɵdefineInjectable({factory:function(){return new e(t.ɵɵinject(P,8))},token:e,providedIn:"root"}),e=g([t.Injectable({providedIn:"root"}),m(0,t.Optional()),m(0,t.Inject(P)),b("design:paramtypes",[Object])],e)}(),M=function(){function e(e,t,n){this._defaultConfig=e,this._cdRef=t,this._fr=n,this.classFocused=!1,this.classDisabled=!1,this.config={},this.initialized=!1,this._initialize$=new a.ReplaySubject,this._froalaReady$=new a.BehaviorSubject(null),this._destroy$=new a.Subject,this.onChange=function(e){},this.onTouched=function(){}}var n;return n=e,Object.defineProperty(e.prototype,"el",{get:function(){return this.elRef.nativeElement},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"html",{get:function(){return this._html},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"editor",{get:function(){return this._editor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"froalaLoaded$",{get:function(){return this._fr.loaded$},enumerable:!0,configurable:!0}),e.prototype.ngOnInit=function(){this.config=this.config||{},this.config.autofocus=!1!==this.config.autofocus&&!this.config.disabled,this.initialized=!this.config.initOnClick,this._listenLazyInit()},e.prototype.ngAfterViewInit=function(){this.config.initOnClick&&this.hasContent()||(this.initialized=!0,this._initialize$.next())},e.prototype.hasContent=function(){var e=document.createElement("div");return!!e.querySelector("img")||(e.innerHTML=this._html,!!e.innerText.length)},e.prototype.initialize=function(e){var t=this;void 0===e&&(e={});var n=this._createConfig();this._initPlugins(n),this._editor=new this._fr.FroalaEditor(this.el,this._createOptions(),(function(){t._froalaReady$.next({config:n,options:e})}))},e.prototype._processImageUpload=function(e){var t=this,n=new r.FileProcessor,o=new r.FsFile(e);return n.process([o],this.config.image).pipe(s.switchMap((function(e){var n=_(e,1)[0];return t.config.image.upload(n.file)})))},e.prototype._getTextNode=function(e){if(e){if(e.nodeType===Node.TEXT_NODE)return e;if(e.childNodes)return this._getTextNode(e.childNodes[0])}},e.prototype.uninitializedClick=function(e){if(!e.defaultPrevented){var t=e.target;if(t&&"A"===t.nodeName&&t.getAttribute("href")){var n=t.getAttribute("target");t.setAttribute("target","_blank"),setTimeout((function(){n?t.setAttribute("target",n):t.removeAttribute("target")}))}else this.config.initClick&&this.config.initClick(e),this._initialize$.next(),this.initialized=!0}},e.prototype.updateSize=function(){window.dispatchEvent(new Event("resize"))},e.prototype.validate=function(e){var t={};if(this.config.maxLength&&this._html){var n=this.config.maxLength,o=this._html.length;o>n&&(t.maxLengthError="Must be "+n+" characters or fewer. You entered "+o+" characters.")}return Object.keys(t).length?t:null},e.prototype.focus=function(e){"end"===(e=e||{}).cursorPosition?this.editor.selection.setAtEnd(this.editor.$el.get(0)):this.editor.selection.setAtStart(this.editor.$el.get(0)),this.editor.selection.restore();var t=this.editor.selection.element();t&&t.scrollIntoView({block:"center"})},e.prototype.clear=function(){this.writeValue("")},e.prototype.disable=function(){this.classDisabled=!0},e.prototype.setHtml=function(e){this.writeValue(e)},e.prototype.writeValue=function(e){if(this._html=e||"",this.editor&&this.editor.html)try{this.editor.html.set(this._html)}catch(e){}this._cdRef.markForCheck()},e.prototype.registerOnChange=function(e){this.onChange=e},e.prototype.registerOnTouched=function(e){this.onTouched=e},e.prototype.ngOnDestroy=function(){this._initialize$.complete(),this._destroy$.next(),this._destroy$.complete(),this.destroy()},e.prototype.destroy=function(){this.editor&&this.editor.destroy(),this.initialized=!1,this._cdRef.markForCheck(),this.el.innerHTML=""},e.prototype._createConfig=function(){return l.merge({froalaConfig:{}},this._defaultConfig,this.config)},e.prototype._change=function(e){this.onChange(e)},e.prototype._initPlugins=function(e){var t=this;(e.plugins||[]).forEach((function(e){t._fr.FroalaEditor.PLUGINS[e.config.name]=function(t){return e.editor=t,e.initialize(),e},(e.config.buttons||[]).forEach((function(e){t._fr.FroalaEditor.DefineIcon(e.name,{NAME:e.name,PATH:e.svgPath}),t._fr.FroalaEditor.RegisterCommand(e.name,{icon:e.name,title:e.tooltip,undo:e.undo,focus:e.focus,showOnMobile:e.showOnMobile,refreshAfterCallback:e.refreshAfterCallback,callback:function(){e.click&&e.click(this)},refresh:function(e){e.refresh&&e.refresh(this,e)}})}))}))},e.prototype._createOptions=function(){var e=this._createConfig();return l.merge({},{key:e.activationKey,placeholderText:e.placeholder,linkAlwaysBlank:!0,tabSpaces:2,typingTimer:250,tooltips:!1,wordPasteModal:!1,imageDefaultWidth:0,imageDefaultAlign:"left",quickInsertEnabled:!1,paragraphDefaultSelection:"Format",videoUpload:!1,paragraphFormat:{N:"Normal",H1:"Heading 1",H2:"Heading 2",H3:"Heading 3",H4:"Heading 4",BLOCKQUOTE:"Quote"},paragraphFormatSelection:!0,toolbarButtonsXS:{moreText:{buttons:k,buttonsVisible:1},moreParagraph:{buttons:x,buttonsVisible:2},moreRich:{buttons:w,buttonsVisible:0}},toolbarButtons:{moreText:{buttons:k,buttonsVisible:3},moreParagraph:{buttons:x,buttonsVisible:5},moreRich:{buttons:w,buttonsVisible:3}}},e.froalaConfig)},e.prototype._listenLazyInit=function(){var e=this;this.froalaLoaded$.pipe(s.filter((function(e){return e})),s.switchMap((function(){return e._initialize$})),s.tap((function(){var t=window.getSelection(),n={};t.baseNode&&(n.selection={node:t.baseNode.nodeValue,offset:t.baseOffset}),e.initialize(n)})),s.switchMap((function(){return e._froalaReady$})),s.filter((function(e){return!!e})),s.tap((function(t){var n=t.config,o=t.options;e._setupFroala(n,o)}))).subscribe()},e.prototype._contentChanged=function(){var e=this._editor.html.get();this.html!==e&&this._change(e)},e.prototype._setupFroala=function(e,t){var n=this;this._cdRef.markForCheck(),this.setHtml(this._html),e.disabled&&this.disable(),e.froalaConfig.events&&e.froalaConfig.events.initialized&&e.froalaConfig.events.initialized(),this._editor.events.on("focus",(function(){n.classFocused=!0,n._cdRef.markForCheck()})),this._editor.events.on("blur",(function(){n.classFocused=!1,n._cdRef.markForCheck()})),a.fromEventPattern((function(e){n._editor.events.on("contentChanged",e)}),(function(){})).pipe(s.startWith(this._html),s.map((function(){return n.editor.html.get()})),s.distinctUntilChanged(),s.skip(1)).subscribe((function(){n._contentChanged()})),this._editor.events.on("paste.afterCleanup",(function(e){var t=document.createElement("div");return t.innerHTML=e,t.querySelectorAll("*").forEach((function(e){for(var t=0;t<e.attributes.length;t++){var n=e.attributes[0].name;"href"!==n&&e.removeAttribute(n)}})),t.innerHTML})),this._editor.events.on("keydown",(function(){n.onTouched()})),this.config.image&&this.config.image.upload&&(this._editor.events.on("image.beforePasteUpload",(function(e){return fetch(e.getAttribute("src")).then((function(t){t.blob().then((function(t){n._processImageUpload(t).pipe(s.takeUntil(n._destroy$)).subscribe((function(t){e.setAttribute("src",t),e.removeAttribute("data-fr-image-pasted"),n._contentChanged()}))}))})),!1})),this._editor.events.on("image.beforeUpload",(function(e){return n._processImageUpload(e[0]).pipe(s.takeUntil(n._destroy$)).subscribe((function(e){n.editor.image.insert(e,null,null,n.editor.image.get())})),!1}))),this.el.querySelector(".fr-second-toolbar")&&this.el.querySelector(".fr-second-toolbar").remove();var o=t.selection;if(o){var i=Array.from(this.el.querySelectorAll(".fr-element *")).find((function(e){return o.node===e.textContent}));if(i){var r=document.createRange(),l=window.getSelection();r.setStart(this._getTextNode(i),o.offset),r.collapse(!0),l.removeAllRanges(),l.addRange(r)}else this.config.autofocus&&this.focus()}else this.config.autofocus&&this.focus()},e.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Optional},{type:t.Inject,args:[P]}]},{type:t.ChangeDetectorRef},{type:T}]},g([t.HostBinding("class.focused"),b("design:type",Object)],e.prototype,"classFocused",void 0),g([t.HostBinding("class.disabled"),b("design:type",Object)],e.prototype,"classDisabled",void 0),g([t.ViewChild("elRef"),b("design:type",t.ElementRef)],e.prototype,"elRef",void 0),g([t.Input(),b("design:type",Object)],e.prototype,"config",void 0),e=n=g([t.Component({selector:"fs-html-editor",template:'<div class="fs-html-editor-default">\n <ng-container *ngIf="initialized">\n <ng-container *fsSkeleton="(froalaLoaded$ | async) !== false">\n </ng-container>\n </ng-container>\n\n <div #elRef></div>\n\n <div class="bottom-line"></div>\n <div class="disabled-line"></div>\n <fs-html-renderer\n *ngIf="!initialized"\n [html]="html"\n (click)="uninitializedClick($event)">\n </fs-html-renderer>\n</div>\n',providers:[{provide:i.NG_VALUE_ACCESSOR,useExisting:t.forwardRef((function(){return n})),multi:!0},{provide:i.NG_VALIDATORS,useExisting:t.forwardRef((function(){return n})),multi:!0}],changeDetection:t.ChangeDetectionStrategy.OnPush,styles:[':host ::ng-deep .fr-box.fr-basic .fr-wrapper{border:0;border-bottom:1px solid #949494;margin-bottom:1px;background-color:transparent}:host ::ng-deep .fr-box.fr-basic .fr-element{padding:0;font-family:inherit;color:inherit;font-size:inherit;line-height:inherit;min-height:auto}:host ::ng-deep .fr-dropdown-menu .fr-dropdown-wrapper,:host ::ng-deep .fr-dropdown:after,:host ::ng-deep .fr-more-toolbar,:host ::ng-deep .fr-toolbar{transition:none!important}:host ::ng-deep .fr-toolbar.fr-top{position:-webkit-sticky;position:sticky;z-index:2;border-radius:0;background-color:#fff}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp{margin:0 20px 0 0}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:nth-child(1):after,:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:nth-child(2):after{content:"";position:absolute;top:9px;height:30px;border-left:1px solid #e5e5e5;margin-left:10px}:host ::ng-deep .fr-toolbar.fr-top div:first-of-type:before{border:none}:host ::ng-deep .fr-toolbar.fr-top.fr-toolbar-open .fr-newline{height:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:first-child{margin-left:0}:host ::ng-deep .fr-toolbar.fr-top.fr-top{border:0}:host ::ng-deep .fr-toolbar.fr-top .fr-newline{margin:0}:host ::ng-deep .fr-toolbar.fr-top .fr-more-toolbar{z-index:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn{z-index:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-dropdown:after{right:3px}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-dropdown.fr-selection span{margin-right:24px}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-open{border-radius:4px;margin:4px 2px}:host ::ng-deep .fr-view ol,:host ::ng-deep .fr-view ul{list-style-position:unset}:host.disabled ::ng-deep .fr-box.fr-basic{opacity:.5;pointer-events:none}:host.disabled ::ng-deep .fr-box.fr-basic .fr-wrapper{border:none}:host.disabled ::ng-deep .disabled-line{display:block}::ng-deep .fr-popup{z-index:1001!important}::ng-deep .fr-video-by-url-layer .fr-checkbox-line{display:none}.disabled-line{display:none;position:absolute;bottom:-1px;z-index:1;background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x;height:1px;width:100%}.bottom-line{opacity:0;transform-origin:50%;transform:scaleX(.5);transition:background-color .3s cubic-bezier(.55,0,.55,.2);width:100%;border-bottom:2px solid #949494;position:absolute;bottom:-1px;z-index:1}:host{position:relative;display:block}:host.focused .bottom-line{opacity:1;display:block;transform:scaleX(1);transition:transform .3s cubic-bezier(.25,.8,.25,1),opacity .1s cubic-bezier(.25,.8,.25,1),background-color .3s cubic-bezier(.25,.8,.25,1)}::ng-deep .fs-html-editor-mention-container{position:absolute;top:0;left:0;height:auto;max-height:300px;max-width:500px;overflow:auto;display:block;z-index:999999;box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);border-bottom-left-radius:4px;border-bottom-right-radius:4px;background:#fff}::ng-deep .fs-html-editor-mention-container ul{margin:0;padding:0;list-style:none}::ng-deep .fs-html-editor-mention-container li{padding:0 16px;cursor:pointer;line-height:48px}::ng-deep .fs-html-editor-mention-container li.highlight,::ng-deep .fs-html-editor-mention-container li:hover{background:#f5f5f5}::ng-deep .fs-html-editor-mention-container li.no-match{cursor:default}']}),m(0,t.Optional()),m(0,t.Inject(P)),b("design:paramtypes",[Object,t.ChangeDetectorRef,T])],e)}(),F=function(){function e(e,t){this.sanitized=e,this._cdRef=t}return Object.defineProperty(e.prototype,"setHtml",{set:function(e){this.trustedHtml=this.sanitized.bypassSecurityTrustHtml(e),this._cdRef.markForCheck()},enumerable:!0,configurable:!0}),e.ctorParameters=function(){return[{type:c.DomSanitizer},{type:t.ChangeDetectorRef}]},g([t.Input("html"),b("design:type",Object),b("design:paramtypes",[Object])],e.prototype,"setHtml",null),e=g([t.Component({selector:"fs-html-renderer",template:'<div class="fr-view fs-html-editor-default" [innerHtml]="trustedHtml"></div>\n',changeDetection:t.ChangeDetectionStrategy.OnPush,styles:[""]}),b("design:paramtypes",[c.DomSanitizer,t.ChangeDetectorRef])],e)}(),A=function(){function e(){}var i;return i=e,e.forRoot=function(e){return void 0===e&&(e={}),{ngModule:i,providers:[{provide:C,useValue:e},{provide:P,useFactory:H,deps:[C]}]}},e=i=g([t.NgModule({imports:[n.CommonModule,o.FsSkeletonModule],exports:[M,F],declarations:[M,F]})],e)}();function H(e){return h({defaultPlugins:["align","colors","image","link","lists","paragraph_format","quote","table","url","video","draggable","font_size"]},e)}var I=function(){function e(){}return e.prototype.initialize=function(){},e.prototype.destroy=function(){},e}(),D=function(e){function t(n){var o=e.call(this)||this;return o.config=n,o._guid=f.guid(),o.selected=function(e){o.config.selected&&t._currentGuid===o._guid&&o.config.selected(e.detail.item.original)},o.config=h(h({},n),{buttons:[{name:n.name,tooltip:n.tooltip,svgPath:n.iconPath,click:function(e){o._closeAll(),o._tribute.showMenuForCollection(e.el)}}]}),o._tribute=new u({values:l.debounce(o._loadValues.bind(o),200),searchOpts:{pre:"",post:"",skip:!0},containerClass:"fs-html-editor-mention-container "+(o.config.containerClass||""),itemClass:"fs-html-editor-mention-menu-item "+(o.config.menuItemClass||""),trigger:o.config.trigger,allowSpaces:!0,menuItemTemplate:function(e){return o.config.menuItemTemplate(e.original)},selectTemplate:function(e){var t=o.config.selectedTemplate(e.original),n=document.createElement("p");n.innerHTML=t;var i=n.firstElementChild;return i||((i=document.createElement("span")).innerHTML=t),i.setAttribute("contenteditable","false"),i.classList.add("fr-deletable"),i.outerHTML}}),t._tributes.push(o._tribute),o}return p(t,e),t.prototype.initialize=function(){var e=this;this._tribute.attach(this.editor.el),this.editor.events.on("keydown",(function(t){if("Enter"===t.key&&e._tribute.isActive)return!1}),!0),this.editor.el.addEventListener("tribute-replaced",this.selected)},t.prototype.destroy=function(){this.editor.el.removeEventListener("tribute-replaced",this.selected)},t.prototype._closeAll=function(){t._tributes.forEach((function(e){e.menu&&e.hideMenu()}))},t.prototype._loadValues=function(e,n){return t._currentGuid=this._guid,this.config.fetch(e).subscribe((function(e){n(e)}))},t._currentGuid=null,t._tributes=[],t}(I),N=function(e){function t(t){void 0===t&&(t={name:"checklist"});var n=e.call(this)||this;return n.config=t,n.config=h(h({},t),{name:"checklist",buttons:[{name:"checklist",svgPath:"M8.4,10.3l-1.2,1.2l4,4L20,6.7l-1.2-1.2l-7.6,7.6L8.4,10.3z M18.2,18.2H5.8V5.8h8.9V4H5.8C4.8,4,4,4.8,4,5.8v12.4c0,1,0.8,1.8,1.8,1.8h12.4c1,0,1.8-0.8,1.8-1.8v-7.1h-1.8V18.2z",click:function(e){e.html.insert('<ul class="checklist"><li></li></ul>')}}]}),n}return p(t,e),t.prototype.initialize=function(){this.editor.events.on("click",(function(e){var t=e.target;if("LI"===t.nodeName&&e.offsetX<0){var n=function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(_(arguments[t]));return e}([t],t.querySelectorAll("li"));t.classList.contains("checked")?n.forEach((function(e){e.classList.remove("checked")})):n.forEach((function(e){e.classList.add("checked")}))}}),!1)},t}(I),V=function(e){function t(t){void 0===t&&(t={name:"code"});var n=e.call(this)||this;return n.config=t,n.config=h(h({},t),{name:"code",buttons:[{name:"code",svgPath:"M8.9,7.3L4.2,12l4.7,4.7l1.1-1.1L6.4,12L10,8.4L8.9,7.3z M15.1,7.3L14,8.4l3.6,3.6L14,15.6l1.1,1.1l4.7-4.7L15.1,7.3z",click:function(e){var t=e.selection.get(),o=n._getCodeEl(t.baseNode);o?o.classList.remove("code"):e.html.insert('<p class="code">'+e.selection.get().toString().replace(/\n{1,}/g,"<br>")+"</p>")}}]}),n}return p(t,e),t.prototype.initialize=function(){var e=this;this.editor.events.on("keydown",(function(t){if(13===t.keyCode){var n=e.editor.selection.get();if(n&&e._getCodeEl(n.baseNode)){t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation();var o="<br>",i=n.baseNode;if("#text"===i.nodeName&&n.baseOffset===i.length)i.nextSibling&&"BR"===i.nextSibling.nodeName||(o+="<br>");else{var r=Array.from(i.childNodes).splice(n.baseOffset-1,1).pop();r&&"BR"!==r.nodeName&&(o+="<br>")}return e.editor.html.insert(o),!1}}}),!0)},t.prototype.destroy=function(){},t.prototype._getCodeEl=function(e){if(e){if(e.classList&&e.classList.contains("code"))return e;if(e.parentElement)return this._getCodeEl(e.parentElement)}return null},t}(I),$=function(e){function t(t){void 0===t&&(t={});var n=e.call(this)||this;return n.config=t,n.config=h(h({},t),{name:t.name||"screenRecord",buttons:[{name:"screenRecord",svgPath:"M14.7,7.7v6.1H7.1V7.7H14.7 M16.3,9.6V6.9c0-0.4-0.3-0.8-0.8-0.8H6.4c-0.4,0-0.8,0.3-0.8,0.8v7.6c0,0.4,0.3,0.8,0.8,0.8h9.1c0.4,0,0.8-0.3,0.8-0.8v-2.7l1.7,1.7c0.3,0.3,0.8,0.3,1.1,0c0.1-0.1,0.2-0.3,0.2-0.5V8.4c0-0.4-0.3-0.8-0.8-0.8\n\tc-0.2,0-0.4,0.1-0.5,0.2L16.3,9.6z M21.5,1.6H2.9c-0.7,0-1.3,0.7-1.3,1.6v14.6c0,0.9,0.6,1.6,1.3,1.6h7.6v1.1l-5,1c-0.2,0-0.4,0.3-0.4,0.6c0,0.3,0.2,0.4,0.4,0.4c0,0,0,0,0.1,0l5.3-1h2.6l5.3,1c0,0,0,0,0.1,0c0.2,0,0.4-0.2,0.4-0.4\n c0-0.3-0.1-0.6-0.4-0.6l-5-1v-1.1h7.6c0.7,0,1.3-0.7,1.3-1.6V3.2C22.9,2.3,22.3,1.6,21.5,1.6z M21.1,17.3H3.3V3.7h17.8L21.1,17.3L21.1,17.3z",tooltip:"Screen Record",click:function(e){navigator.mediaDevices.getDisplayMedia({video:!0}).then((function(n){var o=[],i=new MediaRecorder(n,{mimeType:"video/webm; codecs=vp9"});n.addEventListener("inactive",(function(r){i.stop(),i=null,n.getTracks().forEach((function(e){return e.stop()})),n=null;var a=new Blob(o,{type:"video/webm"});t.upload(a).subscribe((function(n){e.html.insert('<span class="fr-screen-record fr-deletable fr-draggable"><video controls style="max-width:'+t.maxWidth+'"><source src="'+n+'" type="video/webm"></video></span>')}))})),i.addEventListener("dataavailable",(function(e){e.data&&e.data.size>0&&o.push(e.data)})),i.start(10)})).catch((function(e){}))}}]}),n}return p(t,e),t.prototype.initialize=function(){return y(this,void 0,void 0,(function(){var e,t=this;return v(this,(function(n){switch(n.label){case 0:return[4,z.loadStyles("froala").toPromise()];case 1:return n.sent(),e=window.FroalaEditor,this.editor.events.on("mouseup",(function(e){var n=t._getEl(e.target);n&&(t.editor.popups.hideAll(),t._activeEl=n,t._showPopup(n))})),e.POPUP_TEMPLATES["screenRecordPlugin.popup"]="[_BUTTONS_]",e.DefineIcon("popupClose",{NAME:"trash",SVG_KEY:"remove"}),e.RegisterCommand("popupClose",{title:"Remove",undo:!1,focus:!1,callback:function(){t._activeEl&&t._activeEl.remove()}}),[2]}}))}))},t.prototype._createPopup=function(){var e={buttons:'<div class="fr-buttons">'+this.editor.button.buildList(["popupClose"])+"</div>"};return this.editor.popups.create("screenRecordPlugin.popup",e)},t.prototype._showPopup=function(e){var t=this.editor.popups.get("screenRecordPlugin.popup");t||(t=this._createPopup()),this.editor.popups.setContainer("screenRecordPlugin.popup",this.editor.$(e));var n=e.offsetLeft+e.offsetWidth/2;this.editor.popups.show("screenRecordPlugin.popup",n,null)},t.prototype._getEl=function(e){if(e&&e.classList)return e.classList.contains("fr-screen-record")?e:this._getEl(e.parentNode)},t}(I);e.ChecklistPlugin=N,e.CodePlugin=V,e.FS_HTML_EDITOR_CONFIG=P,e.FsHtmlEditorComponent=M,e.FsHtmlEditorModule=A,e.FsHtmlRendererComponent=F,e.MentionPlugin=D,e.ParagraphButtons=x,e.RichButtons=w,e.ScreenRecordPlugin=$,e.TextButtons=k,e.ɵa=H,e.ɵb=C,e.ɵc=T,e.ɵe=I,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
17
17
|
//# sourceMappingURL=firestitch-html-editor.umd.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","ng://@firestitch/html-editor/app/consts/rich-buttons.const.ts","ng://@firestitch/html-editor/app/consts/text-buttons.const.ts","ng://@firestitch/html-editor/app/consts/paragraph-buttons.const.ts","ng://@firestitch/html-editor/app/injects/config.inject.ts","ng://@firestitch/html-editor/app/utils/loader.ts","ng://@firestitch/html-editor/app/services/froala-loader.service.ts","ng://@firestitch/html-editor/app/components/html-editor/html-editor.component.ts","ng://@firestitch/html-editor/app/components/html-renderer/html-renderer.component.ts","ng://@firestitch/html-editor/app/fs-html-editor.module.ts","ng://@firestitch/html-editor/app/classes/plugin.ts","ng://@firestitch/html-editor/app/plugins/mention.plugin.ts","ng://@firestitch/html-editor/app/plugins/checklist.plugin.ts","ng://@firestitch/html-editor/app/plugins/code.plugin.ts","ng://@firestitch/html-editor/app/plugins/screen-record.plugin.ts"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","__decorate","decorators","target","key","desc","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","__param","paramIndex","decorator","__metadata","metadataKey","metadataValue","metadata","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","pop","push","__read","o","m","ar","error","RichButtons","TextButtons","ParagraphButtons","FS_HTML_EDITOR_DEFAULT_CONFIG","InjectionToken","FS_HTML_EDITOR_CONFIG","resourceBase","stylesBase","head","files","resourcePaths","stylesPaths","ResourceLoader","document","getElementsByTagName","Map","froala","align","colors","image","link","lists","paragraph_format","table","url","video","quote","draggable","font_size","setResourceBase","path","setStylesBase","loadResource","resourceName","scriptPath","has","obs$","Observable","obs","script","createElement","src","appendChild","onload","complete","onerror","err","pipe","shareReplay","set","get","loadStyles","stylePath","style","id","rel","href","FsFroalaLoaderService","_defaultConfig","_froalaLoaded","BehaviorSubject","_defaultPluginsLoaded","_loaded$","combineLatest","map","_a","_b","FroalaReady","assetsJSPath","assetsCSSPath","_load","getValue","_FroalaEditor","_this","tap","window","FroalaEditor","_froalaDone","concatMap","_loadPlugins","_defaultPluginsDone","subscribe","imports","defaultPlugins","reduce","acc","pluginName","import$","Optional","type","Inject","args","Injectable","providedIn","FsHtmlEditorComponent","_cdRef","_fr","classFocused","classDisabled","config","initialized","_initialize$","ReplaySubject","_froalaReady$","_destroy$","Subject","onChange","data","onTouched","elRef","nativeElement","_html","_editor","loaded$","ngOnInit","autofocus","disabled","initOnClick","_listenLazyInit","ngAfterViewInit","hasContent","el","querySelector","innerHTML","innerText","initialize","options","_createConfig","_initPlugins","_createOptions","_processImageUpload","blob","processor","FileProcessor","file","FsFile","process","switchMap","upload","_getTextNode","node","nodeType","Node","TEXT_NODE","childNodes","uninitializedClick","event","defaultPrevented","target_1","nodeName","getAttribute","targetTarget_1","setAttribute","setTimeout","removeAttribute","initClick","updateSize","dispatchEvent","Event","validate","control","maxLength","length_1","maxLengthError","keys","focus","cursorPosition","editor","selection","setAtEnd","$el","setAtStart","restore","elSelection","element","scrollIntoView","block","clear","writeValue","disable","setHtml","html","markForCheck","registerOnChange","fn","registerOnTouched","ngOnDestroy","destroy","merge","froalaConfig","_change","plugins","forEach","plugin","PLUGINS","name","buttons","button","DefineIcon","NAME","PATH","svgPath","RegisterCommand","icon","title","tooltip","undo","showOnMobile","refreshAfterCallback","callback","click","refresh","activationKey","placeholderText","placeholder","linkAlwaysBlank","tabSpaces","typingTimer","tooltips","wordPasteModal","imageDefaultWidth","imageDefaultAlign","quickInsertEnabled","paragraphDefaultSelection","videoUpload","paragraphFormat","N","H1","H2","H3","H4","BLOCKQUOTE","paragraphFormatSelection","toolbarButtonsXS","moreText","buttonsVisible","moreParagraph","moreRich","toolbarButtons","froalaLoaded$","filter","ready","getSelection","baseNode","nodeValue","offset","baseOffset","_setupFroala","_contentChanged","editorHTML","events","on","div","querySelectorAll","attributes","name_1","fetch","res","takeUntil","blobs","insert","remove","from","find","textContent","range","createRange","sel","setStart","collapse","removeAllRanges","addRange","ChangeDetectorRef","HostBinding","ViewChild","ElementRef","Input","FsHtmlEditorComponent_1","Component","selector","template","providers","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","NG_VALIDATORS","changeDetection","ChangeDetectionStrategy","OnPush","FsHtmlRendererComponent","sanitized","trustedHtml","bypassSecurityTrustHtml","DomSanitizer","FsHtmlEditorModule","forRoot","ngModule","FsHtmlEditorModule_1","useValue","useFactory","FsHtmlEditorConfigFactory","deps","NgModule","CommonModule","FsSkeletonModule","exports","declarations","Plugin","MentionPlugin","_super","iconPath","_closeAll","_tribute","showMenuForCollection","Tribute","values","debounce","_loadValues","bind","searchOpts","pre","post","skip","containerClass","itemClass","menuItemClass","trigger","allowSpaces","menuItemTemplate","item","original","selectTemplate","selectedTemplate","firstElementChild","classList","add","outerHTML","_tributes","attach","isActive","tribute","menu","hideMenu","keyword","cb","ChecklistPlugin","li","offsetX","items","concat","__spread","contains","CodePlugin","codeEl","_getCodeEl","toString","replace","keyCode","preventDefault","stopPropagation","stopImmediatePropagation","br","base","nextSibling","splice","parentElement","ScreenRecordPlugin","navigator","mediaDevices","getDisplayMedia","stream","chunks","mediaRecorder","MediaRecorder","mimeType","addEventListener","stop","getTracks","track","Blob","maxWidth","size","start","catch","toPromise","_getEl","popups","hideAll","_activeEl","_showPopup","POPUP_TEMPLATES","SVG_KEY","_createPopup","buildList","$popup","setContainer","$","left","offsetLeft","offsetWidth","show","parentNode"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export const RichButtons = [\n 'insertTable',\n 'insertImage',\n 'insertLink',\n 'insertVideo',\n];\n","export const TextButtons = [\n 'paragraphFormat',\n 'code',\n 'bold',\n 'italic',\n 'underline',\n 'strikeThrough',\n 'subscript',\n 'superscript',\n 'fontFamily',\n 'fontSize',\n 'textColor',\n 'backgroundColor',\n 'inlineClass',\n 'inlineStyle',\n 'clearFormatting',\n 'quote',\n];\n","export const ParagraphButtons = [\n 'align',\n 'formatOL',\n 'formatUL',\n 'checklist',\n 'indent',\n 'outdent',\n];\n","import { InjectionToken } from '@angular/core';\n\nexport const FS_HTML_EDITOR_DEFAULT_CONFIG = new InjectionToken<any[]>('fs-html-editor.default-config');\nexport const FS_HTML_EDITOR_CONFIG = new InjectionToken<any[]>('fs-html-editor.config');\n","import { Observable } from 'rxjs';\nimport { shareReplay } from 'rxjs/operators';\n\nfunction resourceLoaderFactory() {\n let resourceBase = '/assets/js/froala/';\n let stylesBase = '/assets/css/';\n\n const head = document.getElementsByTagName('head')[0];\n const files = new Map<string, Observable<unknown>>();\n\n const resourcePaths = {\n froala: 'froala_editor.min.js',\n align: 'plugins/align.min.js',\n colors: 'plugins/colors.min.js',\n image: 'plugins/image.min.js',\n link: 'plugins/link.min.js',\n lists: 'plugins/lists.min.js',\n paragraph_format: 'plugins/paragraph_format.min.js',\n table: 'plugins/table.min.js',\n url: 'plugins/url.min.js',\n video: 'plugins/video.min.js',\n quote: 'plugins/quote.min.js',\n draggable: 'plugins/draggable.min.js',\n font_size: 'plugins/font_size.min.js',\n }\n\n const stylesPaths = {\n froala: 'froala_editor.pkgd.min.css',\n }\n\n const loadResource = function (scriptPath: string): Observable<unknown> {\n if (!files.has(scriptPath)) {\n const obs$ = new Observable((obs) => {\n\n const script = document.createElement('script');\n script.src = scriptPath;\n\n head.appendChild(script);\n\n script.onload = () => {\n obs.next();\n obs.complete();\n };\n\n script.onerror = (err) => {\n obs.error(err);\n }\n })\n .pipe(\n shareReplay(1),\n );\n\n files.set(scriptPath, obs$);\n }\n\n return files.get(scriptPath);\n };\n\n const loadStyles = function (stylePath: string): Observable<unknown> {\n if (!files.has(stylePath)) {\n const obs$ = new Observable((obs) => {\n const style = document.createElement('link');\n style.id = stylePath;\n style.rel = 'stylesheet';\n style.href = `${stylePath}`;\n\n head.appendChild(style);\n\n style.onload = () => {\n obs.next();\n obs.complete();\n };\n\n style.onerror = (err) => {\n obs.error(err);\n }\n });\n\n files.set(stylePath, obs$);\n }\n\n return files.get(stylePath);\n };\n\n return {\n setResourceBase: (path: string) => {\n resourceBase = path;\n },\n setStylesBase: (path: string) => {\n stylesBase = path;\n },\n loadResource: (resourceName: string) => {\n const path = resourcePaths[resourceName] || resourceName;\n\n return loadResource(resourceBase + path);\n },\n loadStyles: (resourceName: string) => {\n const path = stylesPaths[resourceName] || resourceName;\n\n return loadStyles(stylesBase + path);\n }\n }\n}\n\n\nexport const ResourceLoader = resourceLoaderFactory();\n","import { Inject, Injectable, Optional } from '@angular/core';\n\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport { concatMap, map, shareReplay, tap } from 'rxjs/operators';\n\nimport { FS_HTML_EDITOR_CONFIG } from '../injects/config.inject';\nimport { FsHtmlEditorConfig } from '../interfaces/html-editor-config';\n\nimport { ResourceLoader } from '../utils/loader';\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FsFroalaLoaderService {\n\n private _FroalaEditor: unknown;\n\n private _froalaLoaded = new BehaviorSubject(false);\n private _defaultPluginsLoaded = new BehaviorSubject(false);\n\n private _loaded$ = combineLatest([this._froalaLoaded, this._defaultPluginsLoaded])\n .pipe(\n map(([FroalaReady, pluginsRead]) => {\n return pluginsRead && FroalaReady;\n }),\n shareReplay(1),\n );\n\n constructor(\n @Optional() @Inject(FS_HTML_EDITOR_CONFIG) private _defaultConfig: FsHtmlEditorConfig,\n ) {\n if (this._defaultConfig) {\n if (this._defaultConfig.assetsJSPath) {\n ResourceLoader.setResourceBase(this._defaultConfig.assetsJSPath)\n }\n\n if (this._defaultConfig.assetsCSSPath) {\n ResourceLoader.setStylesBase(this._defaultConfig.assetsCSSPath)\n }\n }\n\n this._load();\n }\n\n public get loaded$(): Observable<boolean> {\n return this._loaded$;\n }\n\n public get ready(): boolean {\n return this._froalaLoaded.getValue() && this._defaultPluginsLoaded.getValue();\n }\n\n public get FroalaEditor(): any {\n return this._FroalaEditor;\n }\n\n private _load() {\n combineLatest([\n ResourceLoader.loadResource('froala'),\n ResourceLoader.loadStyles('froala')\n ])\n .pipe(\n tap(() => {\n this._FroalaEditor = (window as any).FroalaEditor;\n this._froalaDone();\n }),\n concatMap(() => {\n return this._loadPlugins();\n }),\n tap(() => {\n this._defaultPluginsDone();\n }),\n )\n .subscribe();\n }\n\n private _loadPlugins(): Observable<unknown> {\n const imports = this._defaultConfig\n .defaultPlugins\n .reduce((acc, pluginName) => {\n const import$ = ResourceLoader.loadResource(pluginName);\n\n acc.push(import$);\n\n return acc;\n }, []);\n\n return combineLatest(imports);\n }\n\n private _froalaDone() {\n this._froalaLoaded.next(true);\n }\n\n private _defaultPluginsDone() {\n this._defaultPluginsLoaded.next(true);\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n forwardRef,\n HostBinding,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator\n} from '@angular/forms';\n\nimport { FileProcessor, FsFile } from '@firestitch/file';\n\nimport { BehaviorSubject, Observable, ReplaySubject, Subject } from 'rxjs';\nimport { filter, switchMap, takeUntil, tap } from 'rxjs/operators';\n\nimport { merge } from 'lodash-es';\n\nimport { PluginButton } from './../../interfaces/plugin-button';\nimport { FsHtmlEditorConfig } from '../../interfaces/html-editor-config';\nimport { RichButtons } from './../../consts/rich-buttons.const';\nimport { TextButtons } from './../../consts/text-buttons.const';\nimport { ParagraphButtons } from './../../consts/paragraph-buttons.const';\n\nimport { FS_HTML_EDITOR_CONFIG } from '../../injects/config.inject';\nimport { Plugin } from './../../classes/plugin';\n\nimport { FsFroalaLoaderService } from '../../services/froala-loader.service';\n\n\n@Component({\n selector: 'fs-html-editor',\n templateUrl: 'html-editor.component.html',\n styleUrls: ['html-editor.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FsHtmlEditorComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => FsHtmlEditorComponent),\n multi: true\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsHtmlEditorComponent implements OnInit, AfterViewInit, ControlValueAccessor, Validator, OnDestroy {\n\n @HostBinding('class.focused') classFocused = false;\n @HostBinding('class.disabled') classDisabled = false;\n\n @ViewChild('elRef') public elRef: ElementRef;\n\n @Input() public config: FsHtmlEditorConfig = {};\n\n public initialized = false;\n\n private _editor: any;\n private _html: string;\n private _initialize$ = new ReplaySubject();\n private _froalaReady$ = new BehaviorSubject(null);\n private _destroy$ = new Subject();\n\n constructor(\n @Optional() @Inject(FS_HTML_EDITOR_CONFIG) private _defaultConfig,\n private _cdRef: ChangeDetectorRef,\n private _fr: FsFroalaLoaderService,\n ) { }\n\n public onChange = (data: any) => {}\n public onTouched = () => {}\n\n public get el(): any {\n return this.elRef.nativeElement;\n }\n\n public get html(): string {\n return this._html;\n }\n\n public get editor(): any {\n return this._editor;\n }\n\n public get froalaLoaded$(): Observable<boolean> {\n return this._fr.loaded$;\n }\n\n public ngOnInit(): void {\n this.config = this.config || {};\n this.config.autofocus = this.config.autofocus !== false && !this.config.disabled;\n this.initialized = !this.config.initOnClick;\n this._listenLazyInit();\n }\n\n public ngAfterViewInit() {\n if (!this.config.initOnClick || !this.hasContent()) {\n this.initialized = true;\n this._initialize$.next();\n }\n }\n\n public hasContent() {\n const el = document.createElement('div');\n\n if (el.querySelector('img')) {\n return true;\n }\n\n el.innerHTML = this._html;\n return !!el.innerText.length;\n }\n\n public initialize(options: any = {}) {\n const config = this._createConfig();\n\n this._initPlugins(config);\n // this.el.innerHTML = this._html || '';\n\n this._editor = new this._fr.FroalaEditor(this.el, this._createOptions(), () => {\n this._froalaReady$.next({ config, options });\n });\n }\n\n private _processImageUpload(blob) {\n const processor = new FileProcessor();\n const file = new FsFile(blob);\n\n return processor.process([file], this.config.image)\n .pipe(\n switchMap(([f]: FsFile[]) => {\n return this.config.image.upload(f.file)\n }),\n );\n }\n\n private _getTextNode(node) {\n if (node) {\n if (node.nodeType === Node.TEXT_NODE) {\n return node;\n }\n if (node.childNodes) {\n return this._getTextNode(node.childNodes[0]);\n }\n }\n }\n\n public uninitializedClick(event: UIEvent): void {\n if (!event.defaultPrevented) {\n const target: any = event.target;\n if (target && target.nodeName === 'A' && target.getAttribute('href')) {\n const targetTarget = target.getAttribute('target');\n target.setAttribute('target', '_blank');\n setTimeout(() => {\n if (targetTarget) {\n target.setAttribute('target', targetTarget);\n } else {\n target.removeAttribute('target');\n }\n });\n } else {\n if (this.config.initClick) {\n this.config.initClick(event);\n }\n this._initialize$.next();\n this.initialized = true;\n }\n }\n }\n\n public updateSize() {\n // Hack: To trigger the toolbar button size modes\n window.dispatchEvent(new Event('resize'));\n }\n\n public validate(control: AbstractControl): ValidationErrors | null {\n\n const err: any = {};\n if (this.config.maxLength && this._html) {\n const maxLength = this.config.maxLength;\n const length = this._html.length;\n if (length > maxLength) {\n err.maxLengthError = `Must be ${maxLength} characters or fewer. You entered ${length} characters.`;\n }\n }\n\n return Object.keys(err).length ? err : null;\n }\n\n public focus(options?: { cursorPosition?: 'start' | 'end' }) {\n options = options ? options : {};\n\n if (options.cursorPosition === 'end') {\n this.editor.selection.setAtEnd(this.editor.$el.get(0));\n } else {\n this.editor.selection.setAtStart(this.editor.$el.get(0));\n }\n\n this.editor.selection.restore();\n\n const elSelection = this.editor.selection.element();\n if (elSelection) {\n elSelection.scrollIntoView({ block: 'center' });\n }\n }\n\n public clear() {\n this.writeValue('');\n }\n\n public disable() {\n this.classDisabled = true;\n }\n\n public setHtml(html) {\n this.writeValue(html);\n }\n\n public writeValue(html: string): void {\n this._html = html || '';\n\n if (this.editor && this.editor.html) {\n try {\n this.editor.html.set(this._html);\n } catch (e) {\n }\n }\n\n this._cdRef.markForCheck();\n }\n\n public registerOnChange(fn: (data: any) => void): void {\n this.onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n public ngOnDestroy() {\n this._initialize$.complete();\n this._destroy$.next();\n this._destroy$.complete();\n this.destroy();\n }\n\n public destroy() {\n if (this.editor) {\n this.editor.destroy();\n }\n this.initialized = false;\n this._cdRef.markForCheck();\n this.el.innerHTML = '';\n }\n\n private _createConfig(): FsHtmlEditorConfig {\n return merge({ froalaConfig: {} }, this._defaultConfig, this.config);\n }\n\n private _change(html): void {\n // this._html = html;\n this.onChange(html);\n }\n\n private _initPlugins(config) {\n\n (config.plugins || []).forEach((plugin: Plugin) => {\n this._fr.FroalaEditor.PLUGINS[plugin.config.name] = function (editor) {\n plugin.editor = editor;\n plugin.initialize();\n return plugin;\n };\n\n (plugin.config.buttons || []).forEach((button: PluginButton) => {\n this._fr.FroalaEditor.DefineIcon(button.name, {\n NAME: button.name,\n PATH: button.svgPath,\n });\n\n this._fr.FroalaEditor.RegisterCommand(button.name, {\n icon: button.name,\n title: button.tooltip,\n undo: button.undo,\n focus: button.focus,\n showOnMobile: button.showOnMobile,\n refreshAfterCallback: button.refreshAfterCallback,\n callback: function () {\n if (button.click) {\n button.click(this);\n }\n },\n refresh: function (button) {\n if (button.refresh) {\n button.refresh(this, button);\n }\n }\n });\n });\n\n });\n }\n\n private _createOptions() {\n const config = this._createConfig();\n\n return merge(\n // For some reason editor store somewhere pointer on default config object and dublicate options each time on init\n // Extra merge level fixed this problem and allow to init config properly without legacy data\n {},\n {\n key: config.activationKey,\n placeholderText: config.placeholder,\n linkAlwaysBlank: true,\n tabSpaces: 2,\n typingTimer: 250,\n tooltips: false,\n wordPasteModal: false,\n imageDefaultWidth: 0,\n imageDefaultAlign: 'left',\n quickInsertEnabled: false,\n paragraphDefaultSelection: 'Format',\n videoUpload: false,\n paragraphFormat: {\n N: 'Normal',\n H1: 'Heading 1',\n H2: 'Heading 2',\n H3: 'Heading 3',\n H4: 'Heading 4',\n BLOCKQUOTE: 'Quote',\n },\n paragraphFormatSelection: true,\n toolbarButtonsXS: {\n moreText: {\n buttons: TextButtons,\n buttonsVisible: 1,\n },\n moreParagraph: {\n buttons: ParagraphButtons,\n buttonsVisible: 2,\n },\n moreRich: {\n buttons: RichButtons,\n buttonsVisible: 0,\n },\n },\n toolbarButtons: {\n moreText: {\n buttons: TextButtons,\n buttonsVisible: 3,\n },\n moreParagraph: {\n buttons: ParagraphButtons,\n buttonsVisible: 5,\n },\n moreRich: {\n buttons: RichButtons,\n buttonsVisible: 3,\n },\n },\n },\n config.froalaConfig,\n );\n }\n\n private _listenLazyInit() {\n this.froalaLoaded$\n .pipe(\n filter((ready) => ready),\n switchMap(() => this._initialize$),\n tap(() => {\n const selection: any = window.getSelection();\n const options: any = {};\n if (selection.baseNode) {\n options.selection = {\n node: selection.baseNode.nodeValue,\n offset: selection.baseOffset,\n };\n }\n this.initialize(options);\n }),\n switchMap(() => this._froalaReady$),\n filter((data) => !!data),\n tap(({ config, options }) => {\n this._setupFroala(config, options);\n })\n )\n .subscribe();\n }\n\n private _contentChanged(): void {\n const editorHTML = this._editor.html.get();\n\n if (this.html !== editorHTML) {\n this._change(editorHTML);\n }\n }\n\n private _setupFroala(config: FsHtmlEditorConfig, options: any): void {\n this._cdRef.markForCheck();\n\n this.setHtml(this._html);\n\n if (config.disabled) {\n this.disable();\n }\n\n if (config.froalaConfig.events) {\n if (config.froalaConfig.events.initialized) {\n config.froalaConfig.events.initialized();\n }\n }\n\n this._editor.events.on('focus', () => {\n this.classFocused = true;\n this._cdRef.markForCheck();\n });\n\n this._editor.events.on('blur', () => {\n this.classFocused = false;\n this._cdRef.markForCheck();\n });\n\n this._editor.events.on('contentChanged', () => {\n this._contentChanged();\n });\n\n this._editor.events.on('paste.afterCleanup', (html) => {\n var div = document.createElement('div');\n div.innerHTML = html;\n div.querySelectorAll('*')\n .forEach((el) => {\n for (var i = 0; i < el.attributes.length; i++) {\n const name = el.attributes[0].name;\n if (name !== 'href') {\n el.removeAttribute(name);\n }\n }\n });\n return div.innerHTML;\n });\n\n this._editor.events.on('keydown', () => {\n this.onTouched();\n });\n\n if (this.config.image && this.config.image.upload) {\n this._editor.events.on('image.beforePasteUpload', (image) => {\n\n fetch(image.getAttribute('src'))\n .then((res) => {\n res.blob()\n .then((blob) => {\n this._processImageUpload(blob)\n .pipe(\n takeUntil(this._destroy$),\n )\n .subscribe((url) => {\n image.setAttribute('src', url);\n image.removeAttribute('data-fr-image-pasted');\n\n this._contentChanged();\n });\n });\n });\n\n return false;\n });\n\n this._editor.events.on('image.beforeUpload', (blobs) => {\n this._processImageUpload(blobs[0])\n .pipe(\n takeUntil(this._destroy$),\n )\n .subscribe((url) => {\n this.editor.image.insert(url, null, null, this.editor.image.get());\n });\n\n return false;\n });\n }\n\n if (this.el.querySelector('.fr-second-toolbar')) {\n this.el.querySelector('.fr-second-toolbar').remove();\n }\n\n const selection = options.selection;\n\n if (selection) {\n const node: any = Array.from(this.el.querySelectorAll('.fr-element *')).find((node: any) => {\n return selection.node === node.textContent;\n });\n\n if (node) {\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(this._getTextNode(node), selection.offset);\n range.collapse(true)\n\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (this.config.autofocus) {\n this.focus();\n }\n } else if (this.config.autofocus) {\n this.focus();\n }\n }\n}\n","import { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ChangeDetectionStrategy, Component, Input, ChangeDetectorRef } from '@angular/core';\n\n\n@Component({\n selector: 'fs-html-renderer',\n templateUrl: 'html-renderer.component.html',\n styleUrls: ['html-renderer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsHtmlRendererComponent {\n\n @Input('html') public set setHtml(html) {\n this.trustedHtml = this.sanitized.bypassSecurityTrustHtml(html);\n this._cdRef.markForCheck();\n }\n\n public trustedHtml: SafeHtml;\n\n public constructor(\n private sanitized: DomSanitizer,\n private _cdRef: ChangeDetectorRef,\n ) { }\n\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { FsSkeletonModule } from '@firestitch/skeleton';\n\nimport { FsHtmlEditorComponent } from './components/html-editor/html-editor.component';\nimport { FsHtmlRendererComponent } from './components/html-renderer/html-renderer.component';\nimport { FsHtmlEditorConfig } from './interfaces/html-editor-config';\nimport { FS_HTML_EDITOR_CONFIG, FS_HTML_EDITOR_DEFAULT_CONFIG } from './injects/config.inject';\nimport { DefaultPlugin } from './enums/default-plugin.enum';\n\n\n@NgModule({\n imports: [\n CommonModule,\n FsSkeletonModule,\n ],\n exports: [\n FsHtmlEditorComponent,\n FsHtmlRendererComponent,\n ],\n declarations: [\n FsHtmlEditorComponent,\n FsHtmlRendererComponent,\n ],\n})\nexport class FsHtmlEditorModule {\n static forRoot(config: FsHtmlEditorConfig = {}): ModuleWithProviders<FsHtmlEditorModule> {\n return {\n ngModule: FsHtmlEditorModule,\n providers: [\n { provide: FS_HTML_EDITOR_DEFAULT_CONFIG, useValue: config },\n {\n provide: FS_HTML_EDITOR_CONFIG,\n useFactory: FsHtmlEditorConfigFactory,\n deps: [FS_HTML_EDITOR_DEFAULT_CONFIG]\n }\n ]\n };\n }\n}\n\nexport function FsHtmlEditorConfigFactory(config: FsHtmlEditorConfig) {\n return {\n defaultPlugins: [\n DefaultPlugin.Align,\n DefaultPlugin.Colors,\n DefaultPlugin.Image,\n DefaultPlugin.Link,\n DefaultPlugin.Lists,\n DefaultPlugin.ParagraphFormat,\n DefaultPlugin.Quote,\n DefaultPlugin.Table,\n DefaultPlugin.Url,\n DefaultPlugin.Video,\n DefaultPlugin.Draggable,\n DefaultPlugin.FontSize,\n ],\n ...config\n };\n}\n","// import { FroalaEditor } from 'froala-editor';\nimport { PluginConfig } from './../interfaces/plugin-config';\n\nexport class Plugin {\n\n public config: PluginConfig;\n public editor: any;\n\n public initialize() {}\n public destroy() {}\n\n}\n","import { debounce } from 'lodash-es';\nimport Tribute, { TributeItem } from 'tributejs';\n\nimport { MentionPluginConfig } from './configs/mention-plugin.config';\n\nimport { Plugin } from '../classes/plugin';\n\n\nexport class MentionPlugin extends Plugin {\n\n private static _tributes = [];\n private _tribute;\n\n public constructor(public config: MentionPluginConfig) {\n super();\n this.config = {\n ...config,\n buttons: [\n {\n name: config.name,\n tooltip: config.tooltip,\n svgPath: config.iconPath,\n click: (editor) => {\n this._closeAll();\n this._tribute.showMenuForCollection(editor.el);\n }\n }\n ]\n };\n\n this._tribute = new Tribute({\n values: debounce(this._loadValues.bind(this), 200),\n searchOpts: {\n pre: '',\n post: '',\n skip: true\n },\n containerClass: `fs-html-editor-mention-container ${this.config.containerClass || ''}`,\n itemClass: `fs-html-editor-mention-menu-item ${this.config.menuItemClass || ''}`,\n trigger: this.config.trigger,\n allowSpaces: true,\n menuItemTemplate: (item: TributeItem<any>) => {\n return this.config.menuItemTemplate(item.original);\n },\n selectTemplate: (item: TributeItem<any>) => {\n const template = this.config.selectedTemplate(item.original);\n\n let p = document.createElement('p');\n p.innerHTML = template;\n\n let node = p.firstElementChild;\n if (!node) {\n node = document.createElement('span');\n node.innerHTML = template;\n }\n\n node.setAttribute('contenteditable', 'false');\n node.classList.add('fr-deletable');\n\n return node.outerHTML;\n },\n });\n\n MentionPlugin._tributes.push(this._tribute);\n }\n\n public initialize() {\n this._tribute.attach(this.editor.el);\n this.editor.events.on('keydown', (e) => {\n if (e.key === 'Enter' && this._tribute.isActive) {\n return false;\n }\n }, true);\n }\n\n public destroy() {}\n\n private _closeAll() {\n MentionPlugin._tributes.forEach((tribute) => {\n if (tribute.menu) {\n tribute.hideMenu();\n }\n });\n }\n\n private _loadValues(keyword, cb) {\n return this.config.fetch(keyword)\n .subscribe((data) => {\n cb(data);\n });\n }\n}\n","import { Plugin } from '../classes/plugin';\n\nimport { PluginConfig } from './../interfaces/plugin-config';\n\n\nexport class ChecklistPlugin extends Plugin {\n\n public constructor(public config: PluginConfig = { name: 'checklist' }) {\n super();\n this.config = {\n ...config,\n name: 'checklist',\n buttons: [\n {\n name: 'checklist',\n svgPath: 'M8.4,10.3l-1.2,1.2l4,4L20,6.7l-1.2-1.2l-7.6,7.6L8.4,10.3z M18.2,18.2H5.8V5.8h8.9V4H5.8C4.8,4,4,4.8,4,5.8v12.4c0,1,0.8,1.8,1.8,1.8h12.4c1,0,1.8-0.8,1.8-1.8v-7.1h-1.8V18.2z',\n click: (editor) => {\n editor.html.insert('<ul class=\"checklist\"><li></li></ul>');\n }\n }\n ]\n };\n }\n\n public initialize() {\n this.editor.events.on('click', (e) => {\n const li = e.target;\n if (li.nodeName === 'LI' && e.offsetX < 0) {\n\n const items = [li, ...li.querySelectorAll('li')];\n\n if (li.classList.contains('checked')) {\n items.forEach((item) => {\n item.classList.remove('checked');\n });\n } else {\n items.forEach((item) => {\n item.classList.add('checked');\n });\n }\n }\n\n }, false);\n }\n\n}\n","import { Plugin } from '../classes/plugin';\n\nimport { PluginConfig } from './../interfaces/plugin-config';\n\n\nexport class CodePlugin extends Plugin {\n\n public constructor(public config: PluginConfig = { name: 'code' }) {\n super();\n this.config = {\n ...config,\n name: 'code',\n buttons: [\n {\n name: 'code',\n svgPath: 'M8.9,7.3L4.2,12l4.7,4.7l1.1-1.1L6.4,12L10,8.4L8.9,7.3z M15.1,7.3L14,8.4l3.6,3.6L14,15.6l1.1,1.1l4.7-4.7L15.1,7.3z',\n click: (editor) => {\n const node = editor.selection.get();\n const codeEl = this._getCodeEl(node.baseNode);\n if (codeEl) {\n codeEl.classList.remove('code');\n } else {\n editor.html.insert('<p class=\"code\">' + editor.selection.get().toString().replace(/\\n{1,}/g,'<br>') + '</p>');\n }\n }\n }\n ]\n };\n }\n\n public initialize() {\n this.editor.events.on('keydown', (e) => {\n if (e.keyCode === 13) {\n const selection = this.editor.selection.get();\n\n if (selection && this._getCodeEl(selection.baseNode)) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n let br = '<br>';\n const base = selection.baseNode;\n if (base.nodeName === '#text' && selection.baseOffset === base.length) {\n\n if (!(base.nextSibling && base.nextSibling.nodeName === 'BR')) {\n br += '<br>';\n }\n } else {\n const el: any = Array.from(base.childNodes).splice(selection.baseOffset - 1, 1).pop();\n if (el && el.nodeName !== 'BR') {\n br += '<br>';\n }\n }\n\n this.editor.html.insert(br);\n return false;\n }\n }\n }, true);\n }\n\n public destroy() {}\n\n private _getCodeEl(el) {\n\n if (el) {\n if (el.classList && el.classList.contains('code')) {\n return el;\n }\n\n if (el.parentElement) {\n return this._getCodeEl(el.parentElement);\n }\n }\n\n return null;\n }\n}\n","import { ScreenRecordPluginConfig } from './configs/screen-record-plugin.config';\nimport { Plugin } from '../classes/plugin';\nimport { ResourceLoader } from '../utils/loader';\n\n\ndeclare var MediaRecorder: any;\n\nexport class ScreenRecordPlugin extends Plugin {\n\n private _activeEl;\n\n public constructor(public config: ScreenRecordPluginConfig = {}) {\n super();\n\n this.config = {\n ...config,\n name: config.name || 'screenRecord',\n buttons: [\n {\n name: 'screenRecord',\n svgPath: `M14.7,7.7v6.1H7.1V7.7H14.7 M16.3,9.6V6.9c0-0.4-0.3-0.8-0.8-0.8H6.4c-0.4,0-0.8,0.3-0.8,0.8v7.6c0,0.4,0.3,0.8,0.8,0.8h9.1c0.4,0,0.8-0.3,0.8-0.8v-2.7l1.7,1.7c0.3,0.3,0.8,0.3,1.1,0c0.1-0.1,0.2-0.3,0.2-0.5V8.4c0-0.4-0.3-0.8-0.8-0.8\n\tc-0.2,0-0.4,0.1-0.5,0.2L16.3,9.6z M21.5,1.6H2.9c-0.7,0-1.3,0.7-1.3,1.6v14.6c0,0.9,0.6,1.6,1.3,1.6h7.6v1.1l-5,1c-0.2,0-0.4,0.3-0.4,0.6c0,0.3,0.2,0.4,0.4,0.4c0,0,0,0,0.1,0l5.3-1h2.6l5.3,1c0,0,0,0,0.1,0c0.2,0,0.4-0.2,0.4-0.4\n c0-0.3-0.1-0.6-0.4-0.6l-5-1v-1.1h7.6c0.7,0,1.3-0.7,1.3-1.6V3.2C22.9,2.3,22.3,1.6,21.5,1.6z M21.1,17.3H3.3V3.7h17.8L21.1,17.3L21.1,17.3z`,\n tooltip: 'Screen Record',\n click: (editor) => {\n\n (<any>navigator).mediaDevices.getDisplayMedia({ video: true })\n .then((stream) => {\n const chunks = [];\n const options = { mimeType: 'video/webm; codecs=vp9' };\n let mediaRecorder = new MediaRecorder(stream, options);\n\n stream.addEventListener('inactive', (e) => {\n mediaRecorder.stop();\n mediaRecorder = null;\n stream.getTracks().forEach((track) => track.stop());\n stream = null;\n\n const blob = new Blob(chunks, { type: 'video/webm' });\n config.upload(blob)\n .subscribe((url) => {\n editor.html.insert(`<span class=\"fr-screen-record fr-deletable fr-draggable\"><video controls style=\"max-width:${config.maxWidth}\"><source src=\"${url}\" type=\"video/webm\"></video></span>`);\n });\n });\n\n mediaRecorder.addEventListener('dataavailable', (event) => {\n if (event.data && event.data.size > 0) {\n chunks.push(event.data);\n }\n });\n\n mediaRecorder.start(10);\n })\n .catch((e) => { });\n }\n }\n ]\n };\n }\n\n public async initialize() {\n await ResourceLoader.loadStyles('froala')\n .toPromise();\n\n const FroalaEditor = (window as any).FroalaEditor;\n\n this.editor.events.on('mouseup', (e) => {\n const el = this._getEl(e.target);\n\n if (el) {\n this.editor.popups.hideAll();\n this._activeEl = el;\n this._showPopup(el);\n }\n });\n\n FroalaEditor.POPUP_TEMPLATES[\"screenRecordPlugin.popup\"] = '[_BUTTONS_]';\n\n FroalaEditor.DefineIcon('popupClose', { NAME: 'trash', SVG_KEY: 'remove' });\n FroalaEditor.RegisterCommand('popupClose', {\n title: 'Remove',\n undo: false,\n focus: false,\n callback: () => {\n if (this._activeEl) {\n this._activeEl.remove();\n }\n }\n });\n }\n\n private _createPopup() {\n\n const template = {\n buttons: `<div class=\"fr-buttons\">${this.editor.button.buildList(['popupClose'])}</div>`,\n };\n\n return this.editor.popups.create('screenRecordPlugin.popup', template);\n }\n\n private _showPopup (el) {\n var $popup = this.editor.popups.get('screenRecordPlugin.popup');\n\n if (!$popup) {\n $popup = this._createPopup();\n }\n\n this.editor.popups.setContainer('screenRecordPlugin.popup', this.editor.$(el));\n\n const left = el.offsetLeft + el.offsetWidth / 2;\n\n this.editor.popups.show('screenRecordPlugin.popup', left, null);\n }\n\n private _getEl(el) {\n if (el && el.classList) {\n if (el.classList.contains('fr-screen-record'))\n return el;\n\n return this._getEl(el.parentNode);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","ng://@firestitch/html-editor/app/consts/rich-buttons.const.ts","ng://@firestitch/html-editor/app/consts/text-buttons.const.ts","ng://@firestitch/html-editor/app/consts/paragraph-buttons.const.ts","ng://@firestitch/html-editor/app/injects/config.inject.ts","ng://@firestitch/html-editor/app/utils/loader.ts","ng://@firestitch/html-editor/app/services/froala-loader.service.ts","ng://@firestitch/html-editor/app/components/html-editor/html-editor.component.ts","ng://@firestitch/html-editor/app/components/html-renderer/html-renderer.component.ts","ng://@firestitch/html-editor/app/fs-html-editor.module.ts","ng://@firestitch/html-editor/app/classes/plugin.ts","ng://@firestitch/html-editor/app/plugins/mention.plugin.ts","ng://@firestitch/html-editor/app/plugins/checklist.plugin.ts","ng://@firestitch/html-editor/app/plugins/code.plugin.ts","ng://@firestitch/html-editor/app/plugins/screen-record.plugin.ts"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","__decorate","decorators","target","key","desc","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","__param","paramIndex","decorator","__metadata","metadataKey","metadataValue","metadata","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","pop","push","__read","o","m","ar","error","RichButtons","TextButtons","ParagraphButtons","FS_HTML_EDITOR_DEFAULT_CONFIG","InjectionToken","FS_HTML_EDITOR_CONFIG","resourceBase","stylesBase","head","files","resourcePaths","stylesPaths","ResourceLoader","document","getElementsByTagName","Map","froala","align","colors","image","link","lists","paragraph_format","table","url","video","quote","draggable","font_size","setResourceBase","path","setStylesBase","loadResource","resourceName","scriptPath","has","obs$","Observable","obs","script","createElement","src","appendChild","onload","complete","onerror","err","pipe","shareReplay","set","get","loadStyles","stylePath","style","id","rel","href","FsFroalaLoaderService","_defaultConfig","_froalaLoaded","BehaviorSubject","_defaultPluginsLoaded","_loaded$","combineLatest","map","_a","_b","FroalaReady","assetsJSPath","assetsCSSPath","_load","getValue","_FroalaEditor","_this","tap","window","FroalaEditor","_froalaDone","concatMap","_loadPlugins","_defaultPluginsDone","subscribe","imports","defaultPlugins","reduce","acc","pluginName","import$","Optional","type","Inject","args","Injectable","providedIn","FsHtmlEditorComponent","_cdRef","_fr","classFocused","classDisabled","config","initialized","_initialize$","ReplaySubject","_froalaReady$","_destroy$","Subject","onChange","data","onTouched","elRef","nativeElement","_html","_editor","loaded$","ngOnInit","autofocus","disabled","initOnClick","_listenLazyInit","ngAfterViewInit","hasContent","el","querySelector","innerHTML","innerText","initialize","options","_createConfig","_initPlugins","_createOptions","_processImageUpload","blob","processor","FileProcessor","file","FsFile","process","switchMap","upload","_getTextNode","node","nodeType","Node","TEXT_NODE","childNodes","uninitializedClick","event","defaultPrevented","target_1","nodeName","getAttribute","targetTarget_1","setAttribute","setTimeout","removeAttribute","initClick","updateSize","dispatchEvent","Event","validate","control","maxLength","length_1","maxLengthError","keys","focus","cursorPosition","editor","selection","setAtEnd","$el","setAtStart","restore","elSelection","element","scrollIntoView","block","clear","writeValue","disable","setHtml","html","markForCheck","registerOnChange","fn","registerOnTouched","ngOnDestroy","destroy","merge","froalaConfig","_change","plugins","forEach","plugin","PLUGINS","name","buttons","button","DefineIcon","NAME","PATH","svgPath","RegisterCommand","icon","title","tooltip","undo","showOnMobile","refreshAfterCallback","callback","click","refresh","activationKey","placeholderText","placeholder","linkAlwaysBlank","tabSpaces","typingTimer","tooltips","wordPasteModal","imageDefaultWidth","imageDefaultAlign","quickInsertEnabled","paragraphDefaultSelection","videoUpload","paragraphFormat","N","H1","H2","H3","H4","BLOCKQUOTE","paragraphFormatSelection","toolbarButtonsXS","moreText","buttonsVisible","moreParagraph","moreRich","toolbarButtons","froalaLoaded$","filter","ready","getSelection","baseNode","nodeValue","offset","baseOffset","_setupFroala","_contentChanged","editorHTML","events","on","fromEventPattern","handler","startWith","distinctUntilChanged","skip","div","querySelectorAll","attributes","name_1","fetch","res","takeUntil","blobs","insert","remove","from","find","textContent","range","createRange","sel","setStart","collapse","removeAllRanges","addRange","ChangeDetectorRef","HostBinding","ViewChild","ElementRef","Input","FsHtmlEditorComponent_1","Component","selector","template","providers","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","NG_VALIDATORS","changeDetection","ChangeDetectionStrategy","OnPush","FsHtmlRendererComponent","sanitized","trustedHtml","bypassSecurityTrustHtml","DomSanitizer","FsHtmlEditorModule","forRoot","ngModule","FsHtmlEditorModule_1","useValue","useFactory","FsHtmlEditorConfigFactory","deps","NgModule","CommonModule","FsSkeletonModule","exports","declarations","Plugin","MentionPlugin","_super","_guid","guid","selected","_currentGuid","detail","item","original","iconPath","_closeAll","_tribute","showMenuForCollection","Tribute","values","debounce","_loadValues","bind","searchOpts","pre","post","containerClass","itemClass","menuItemClass","trigger","allowSpaces","menuItemTemplate","selectTemplate","selectedTemplate","firstElementChild","classList","add","outerHTML","_tributes","attach","isActive","addEventListener","removeEventListener","tribute","menu","hideMenu","keyword","cb","ChecklistPlugin","li","offsetX","items","concat","__spread","contains","CodePlugin","codeEl","_getCodeEl","toString","replace","keyCode","preventDefault","stopPropagation","stopImmediatePropagation","br","base","nextSibling","splice","parentElement","ScreenRecordPlugin","navigator","mediaDevices","getDisplayMedia","stream","chunks","mediaRecorder","MediaRecorder","mimeType","stop","getTracks","track","Blob","maxWidth","size","start","catch","toPromise","_getEl","popups","hideAll","_activeEl","_showPopup","POPUP_TEMPLATES","SVG_KEY","_createPopup","buildList","$popup","setContainer","$","left","offsetLeft","offsetWidth","show","parentNode"],"mappings":";;;;;;;;;;;;;;;AAgBA,IAAIA,EAAgB,SAASC,EAAGC,GAI5B,OAHAF,EAAgBG,OAAOC,gBAClB,CAAEC,UAAW,cAAgBC,OAAS,SAAUL,EAAGC,GAAKD,EAAEI,UAAYH,IACvE,SAAUD,EAAGC,GAAK,IAAK,IAAIK,KAAKL,EAAOC,OAAOK,UAAUC,eAAeC,KAAKR,EAAGK,KAAIN,EAAEM,GAAKL,EAAEK,MAC3EN,EAAGC,IAGrB,SAASS,EAAUV,EAAGC,GACzB,GAAiB,mBAANA,GAA0B,OAANA,EAC3B,MAAM,IAAIU,UAAU,uBAAyBC,OAAOX,GAAK,iCAE7D,SAASY,IAAOC,KAAKC,YAAcf,EADnCD,EAAcC,EAAGC,GAEjBD,EAAEO,UAAkB,OAANN,EAAaC,OAAOc,OAAOf,IAAMY,EAAGN,UAAYN,EAAEM,UAAW,IAAIM,GAG5E,IAAII,EAAW,WAQlB,OAPAA,EAAWf,OAAOgB,QAAU,SAAkBC,GAC1C,IAAK,IAAIC,EAAGC,EAAI,EAAGC,EAAIC,UAAUC,OAAQH,EAAIC,EAAGD,IAE5C,IAAK,IAAIf,KADTc,EAAIG,UAAUF,GACOnB,OAAOK,UAAUC,eAAeC,KAAKW,EAAGd,KAAIa,EAAEb,GAAKc,EAAEd,IAE9E,OAAOa,IAEKM,MAAMX,KAAMS,YAezB,SAASG,EAAWC,EAAYC,EAAQC,EAAKC,GAChD,IAA2H9B,EAAvH+B,EAAIR,UAAUC,OAAQQ,EAAID,EAAI,EAAIH,EAAkB,OAATE,EAAgBA,EAAO5B,OAAO+B,yBAAyBL,EAAQC,GAAOC,EACrH,GAAuB,iBAAZI,SAAoD,mBAArBA,QAAQC,SAAyBH,EAAIE,QAAQC,SAASR,EAAYC,EAAQC,EAAKC,QACpH,IAAK,IAAIT,EAAIM,EAAWH,OAAS,EAAGH,GAAK,EAAGA,KAASrB,EAAI2B,EAAWN,MAAIW,GAAKD,EAAI,EAAI/B,EAAEgC,GAAKD,EAAI,EAAI/B,EAAE4B,EAAQC,EAAKG,GAAKhC,EAAE4B,EAAQC,KAASG,GAChJ,OAAOD,EAAI,GAAKC,GAAK9B,OAAOkC,eAAeR,EAAQC,EAAKG,GAAIA,EAGzD,SAASK,EAAQC,EAAYC,GAChC,OAAO,SAAUX,EAAQC,GAAOU,EAAUX,EAAQC,EAAKS,IAGpD,SAASE,EAAWC,EAAaC,GACpC,GAAuB,iBAAZR,SAAoD,mBAArBA,QAAQS,SAAyB,OAAOT,QAAQS,SAASF,EAAaC,GAG7G,SAASE,EAAUC,EAASC,EAAYC,EAAGC,GAE9C,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IAAMC,EAAKN,EAAUO,KAAKF,IAAW,MAAOG,GAAKL,EAAOK,IACpF,SAASC,EAASJ,GAAS,IAAMC,EAAKN,EAAiB,MAAEK,IAAW,MAAOG,GAAKL,EAAOK,IACvF,SAASF,EAAKI,GAJlB,IAAeL,EAIaK,EAAOC,KAAOT,EAAQQ,EAAOL,QAJ1CA,EAIyDK,EAAOL,MAJhDA,aAAiBN,EAAIM,EAAQ,IAAIN,GAAE,SAAUG,GAAWA,EAAQG,OAITO,KAAKR,EAAWK,GAClGH,GAAMN,EAAYA,EAAUvB,MAAMoB,EAASC,GAAc,KAAKS,WAI/D,SAASM,EAAYhB,EAASiB,GACjC,IAAsGC,EAAGC,EAAG7C,EAAG8C,EAA3GC,EAAI,CAAEC,MAAO,EAAGC,KAAM,WAAa,GAAW,EAAPjD,EAAE,GAAQ,MAAMA,EAAE,GAAI,OAAOA,EAAE,IAAOkD,KAAM,GAAIC,IAAK,IAChG,OAAOL,EAAI,CAAEV,KAAMgB,EAAK,GAAIC,MAASD,EAAK,GAAIE,OAAUF,EAAK,IAAwB,mBAAXG,SAA0BT,EAAES,OAAOC,UAAY,WAAa,OAAO7D,OAAUmD,EACvJ,SAASM,EAAKjD,GAAK,OAAO,SAAUsD,GAAK,OACzC,SAAcC,GACV,GAAId,EAAG,MAAM,IAAIpD,UAAU,mCAC3B,KAAOuD,GAAG,IACN,GAAIH,EAAI,EAAGC,IAAM7C,EAAY,EAAR0D,EAAG,GAASb,EAAU,OAAIa,EAAG,GAAKb,EAAS,SAAO7C,EAAI6C,EAAU,SAAM7C,EAAEV,KAAKuD,GAAI,GAAKA,EAAET,SAAWpC,EAAIA,EAAEV,KAAKuD,EAAGa,EAAG,KAAKlB,KAAM,OAAOxC,EAE3J,OADI6C,EAAI,EAAG7C,IAAG0D,EAAK,CAAS,EAARA,EAAG,GAAQ1D,EAAEkC,QACzBwB,EAAG,IACP,KAAK,EAAG,KAAK,EAAG1D,EAAI0D,EAAI,MACxB,KAAK,EAAc,OAAXX,EAAEC,QAAgB,CAAEd,MAAOwB,EAAG,GAAIlB,MAAM,GAChD,KAAK,EAAGO,EAAEC,QAASH,EAAIa,EAAG,GAAIA,EAAK,CAAC,GAAI,SACxC,KAAK,EAAGA,EAAKX,EAAEI,IAAIQ,MAAOZ,EAAEG,KAAKS,MAAO,SACxC,QACI,KAAM3D,EAAI+C,EAAEG,MAAMlD,EAAIA,EAAEK,OAAS,GAAKL,EAAEA,EAAEK,OAAS,KAAkB,IAAVqD,EAAG,IAAsB,IAAVA,EAAG,IAAW,CAAEX,EAAI,EAAG,SACjG,GAAc,IAAVW,EAAG,MAAc1D,GAAM0D,EAAG,GAAK1D,EAAE,IAAM0D,EAAG,GAAK1D,EAAE,IAAM,CAAE+C,EAAEC,MAAQU,EAAG,GAAI,MAC9E,GAAc,IAAVA,EAAG,IAAYX,EAAEC,MAAQhD,EAAE,GAAI,CAAE+C,EAAEC,MAAQhD,EAAE,GAAIA,EAAI0D,EAAI,MAC7D,GAAI1D,GAAK+C,EAAEC,MAAQhD,EAAE,GAAI,CAAE+C,EAAEC,MAAQhD,EAAE,GAAI+C,EAAEI,IAAIS,KAAKF,GAAK,MACvD1D,EAAE,IAAI+C,EAAEI,IAAIQ,MAChBZ,EAAEG,KAAKS,MAAO,SAEtBD,EAAKf,EAAKrD,KAAKoC,EAASqB,GAC1B,MAAOV,GAAKqB,EAAK,CAAC,EAAGrB,GAAIQ,EAAI,EAAI,QAAWD,EAAI5C,EAAI,EACtD,GAAY,EAAR0D,EAAG,GAAQ,MAAMA,EAAG,GAAI,MAAO,CAAExB,MAAOwB,EAAG,GAAKA,EAAG,QAAK,EAAQlB,MAAM,GArB9BL,CAAK,CAAChC,EAAGsD,MAyBhC1E,OAAOc,OAwB7B,SAASgE,EAAOC,EAAG3D,GACtB,IAAI4D,EAAsB,mBAAXR,QAAyBO,EAAEP,OAAOC,UACjD,IAAKO,EAAG,OAAOD,EACf,IAAmBjD,EAAYwB,EAA3BnC,EAAI6D,EAAEzE,KAAKwE,GAAOE,EAAK,GAC3B,IACI,WAAc,IAAN7D,GAAgBA,KAAM,MAAQU,EAAIX,EAAEkC,QAAQI,MAAMwB,EAAGJ,KAAK/C,EAAEqB,OAExE,MAAO+B,GAAS5B,EAAI,CAAE4B,MAAOA,GACjC,QACQ,IACQpD,IAAMA,EAAE2B,OAASuB,EAAI7D,EAAU,SAAI6D,EAAEzE,KAAKY,GAE1D,QAAkB,GAAImC,EAAG,MAAMA,EAAE4B,OAE7B,OAAOD,EAgEcjF,OAAOc,WCjNnBqE,EAAc,CACzB,cACA,cACA,aACA,eCJWC,EAAc,CACrB,kBACA,OACA,OACA,SACA,YACA,gBACA,YACA,cACA,aACA,WACA,YACA,kBACA,cACA,cACA,kBACA,SChBOC,EAAmB,CAC9B,QACA,WACA,WACA,YACA,SACA,WCJWC,EAAgC,IAAIC,EAAAA,eAAsB,iCAC1DC,EAAwB,IAAID,EAAAA,eAAsB,yBCsGxD,IArGDE,EACAC,EAEEC,EACAC,EAEAC,EAgBAC,EA+EKC,GArGPN,EAAe,qBACfC,EAAa,eAEXC,EAAOK,SAASC,qBAAqB,QAAQ,GAC7CL,EAAQ,IAAIM,IAEZL,EAAgB,CACpBM,OAAQ,uBACRC,MAAO,uBACPC,OAAQ,wBACRC,MAAO,uBACPC,KAAM,sBACNC,MAAO,uBACPC,iBAAkB,kCAClBC,MAAO,uBACPC,IAAK,qBACLC,MAAO,uBACPC,MAAO,uBACPC,UAAW,2BACXC,UAAW,4BAGPjB,EAAc,CAClBK,OAAQ,8BAyDH,CACLa,gBAAiB,SAACC,GAChBxB,EAAewB,GAEjBC,cAAe,SAACD,GACdvB,EAAauB,GAEfE,aAAc,SAACC,GAGb,OAhEiB,SAAUC,GAC7B,IAAKzB,EAAM0B,IAAID,GAAa,CAC1B,IAAME,EAAO,IAAIC,EAAAA,YAAW,SAACC,GAE3B,IAAMC,EAAS1B,SAAS2B,cAAc,UACtCD,EAAOE,IAAMP,EAEb1B,EAAKkC,YAAYH,GAEjBA,EAAOI,OAAS,WACdL,EAAIpE,OACJoE,EAAIM,YAGNL,EAAOM,QAAU,SAACC,GAChBR,EAAIvC,MAAM+C,OAGXC,KACCC,EAAAA,YAAY,IAGhBvC,EAAMwC,IAAIf,EAAYE,GAGxB,OAAO3B,EAAMyC,IAAIhB,GAuCRF,CAAa1B,GAFPI,EAAcuB,IAAiBA,KAI9CkB,WAAY,SAAClB,GAGX,OAzCe,SAAUmB,GAC3B,IAAK3C,EAAM0B,IAAIiB,GAAY,CACzB,IAAMhB,EAAO,IAAIC,EAAAA,YAAW,SAACC,GAC3B,IAAMe,EAAQxC,SAAS2B,cAAc,QACrCa,EAAMC,GAAKF,EACXC,EAAME,IAAM,aACZF,EAAMG,KAAO,GAAGJ,EAEhB5C,EAAKkC,YAAYW,GAEjBA,EAAMV,OAAS,WACbL,EAAIpE,OACJoE,EAAIM,YAGNS,EAAMR,QAAU,SAACC,GACfR,EAAIvC,MAAM+C,OAIdrC,EAAMwC,IAAIG,EAAWhB,GAGvB,OAAO3B,EAAMyC,IAAIE,GAkBRD,CAAW5C,GAFLI,EAAYsB,IAAiBA,oBCpE9C,SAAAwB,EACqDC,GAAAjI,KAAAiI,eAAAA,EAZ7CjI,KAAAkI,cAAgB,IAAIC,EAAAA,iBAAgB,GACpCnI,KAAAoI,sBAAwB,IAAID,EAAAA,iBAAgB,GAE5CnI,KAAAqI,SAAWC,EAAAA,cAAc,CAACtI,KAAKkI,cAAelI,KAAKoI,wBACxDd,KACCiB,EAAAA,KAAI,SAACC,OAAAC,EAAAvE,EAAAsE,EAAA,GAACE,EAAAD,EAAA,GACJ,OADiBA,EAAA,IACKC,KAExBnB,EAAAA,YAAY,IAMVvH,KAAKiI,iBACHjI,KAAKiI,eAAeU,cACtBxD,EAAeiB,gBAAgBpG,KAAKiI,eAAeU,cAGjD3I,KAAKiI,eAAeW,eACtBzD,EAAemB,cAActG,KAAKiI,eAAeW,gBAIrD5I,KAAK6I,eAGPzJ,OAAAkC,eAAW0G,EAAAvI,UAAA,UAAO,KAAlB,WACE,OAAOO,KAAKqI,0CAGdjJ,OAAAkC,eAAW0G,EAAAvI,UAAA,QAAK,KAAhB,WACE,OAAOO,KAAKkI,cAAcY,YAAc9I,KAAKoI,sBAAsBU,4CAGrE1J,OAAAkC,eAAW0G,EAAAvI,UAAA,eAAY,KAAvB,WACE,OAAOO,KAAK+I,+CAGNf,EAAAvI,UAAAoJ,MAAR,WAAA,IAAAG,EAAAhJ,KACEsI,EAAAA,cAAc,CACZnD,EAAeoB,aAAa,UAC5BpB,EAAeuC,WAAW,YAEzBJ,KACC2B,EAAAA,KAAI,WACFD,EAAKD,cAAiBG,OAAeC,aACrCH,EAAKI,iBAEPC,EAAAA,WAAU,WACR,OAAOL,EAAKM,kBAEdL,EAAAA,KAAI,WACFD,EAAKO,0BAGRC,aAGGxB,EAAAvI,UAAA6J,aAAR,WACE,IAAMG,EAAUzJ,KAAKiI,eAClByB,eACAC,QAAO,SAACC,EAAKC,GACZ,IAAMC,EAAU3E,EAAeoB,aAAasD,GAI5C,OAFAD,EAAI3F,KAAK6F,GAEFF,IACN,IAEL,OAAOtB,EAAAA,cAAcmB,IAGfzB,EAAAvI,UAAA2J,YAAR,WACEpJ,KAAKkI,cAAczF,MAAK,IAGlBuF,EAAAvI,UAAA8J,oBAAR,WACEvJ,KAAKoI,sBAAsB3F,MAAK,sEAlE/BsH,EAAAA,UAAQ,CAAAC,KAAIC,EAAAA,OAAMC,KAAA,CAACtF,oHAhBXoD,EAAqBpH,EAAA,CAHjCuJ,EAAAA,WAAW,CACVC,WAAY,SAkBT7I,EAAA,EAAAwI,EAAAA,YAAYxI,EAAA,EAAA0I,EAAAA,OAAOrF,qCAhBXoD,mBCgEX,SAAAqC,EACqDpC,EAC3CqC,EACAC,GAF2CvK,KAAAiI,eAAAA,EAC3CjI,KAAAsK,OAAAA,EACAtK,KAAAuK,IAAAA,EAlBoBvK,KAAAwK,cAAe,EACdxK,KAAAyK,eAAgB,EAI/BzK,KAAA0K,OAA6B,GAEtC1K,KAAA2K,aAAc,EAIb3K,KAAA4K,aAAe,IAAIC,EAAAA,cACnB7K,KAAA8K,cAAgB,IAAI3C,EAAAA,gBAAgB,MACpCnI,KAAA+K,UAAY,IAAIC,EAAAA,QAQjBhL,KAAAiL,SAAW,SAACC,KACZlL,KAAAmL,UAAY,mBA0crB,SAlead,EA0BXjL,OAAAkC,eAAW+I,EAAA5K,UAAA,KAAE,KAAb,WACE,OAAOO,KAAKoL,MAAMC,+CAGpBjM,OAAAkC,eAAW+I,EAAA5K,UAAA,OAAI,KAAf,WACE,OAAOO,KAAKsL,uCAGdlM,OAAAkC,eAAW+I,EAAA5K,UAAA,SAAM,KAAjB,WACE,OAAOO,KAAKuL,yCAGdnM,OAAAkC,eAAW+I,EAAA5K,UAAA,gBAAa,KAAxB,WACE,OAAOO,KAAKuK,IAAIiB,yCAGXnB,EAAA5K,UAAAgM,SAAP,WACEzL,KAAK0K,OAAS1K,KAAK0K,QAAU,GAC7B1K,KAAK0K,OAAOgB,WAAsC,IAA1B1L,KAAK0K,OAAOgB,YAAwB1L,KAAK0K,OAAOiB,SACxE3L,KAAK2K,aAAe3K,KAAK0K,OAAOkB,YAChC5L,KAAK6L,mBAGAxB,EAAA5K,UAAAqM,gBAAP,WACO9L,KAAK0K,OAAOkB,aAAgB5L,KAAK+L,eACpC/L,KAAK2K,aAAc,EACnB3K,KAAK4K,aAAanI,SAIf4H,EAAA5K,UAAAsM,WAAP,WACE,IAAMC,EAAK5G,SAAS2B,cAAc,OAElC,QAAIiF,EAAGC,cAAc,SAIrBD,EAAGE,UAAYlM,KAAKsL,QACXU,EAAGG,UAAUzL,SAGjB2J,EAAA5K,UAAA2M,WAAP,SAAkBC,GAAlB,IAAArD,EAAAhJ,UAAkB,IAAAqM,IAAAA,EAAA,IAChB,IAAM3B,EAAS1K,KAAKsM,gBAEpBtM,KAAKuM,aAAa7B,GAGlB1K,KAAKuL,QAAU,IAAIvL,KAAKuK,IAAIpB,aAAanJ,KAAKgM,GAAIhM,KAAKwM,kBAAkB,WACvExD,EAAK8B,cAAcrI,KAAK,CAAEiI,OAAMA,EAAE2B,QAAOA,QAIrChC,EAAA5K,UAAAgN,oBAAR,SAA4BC,GAA5B,IAAA1D,EAAAhJ,KACQ2M,EAAY,IAAIC,EAAAA,cAChBC,EAAO,IAAIC,EAAAA,OAAOJ,GAExB,OAAOC,EAAUI,QAAQ,CAACF,GAAO7M,KAAK0K,OAAOhF,OAC1C4B,KACC0F,EAAAA,WAAU,SAACxE,OAACvF,EAADiB,EAAAsE,EAAA,GAAC,GACV,OAAOQ,EAAK0B,OAAOhF,MAAMuH,OAAOhK,EAAE4J,WAKlCxC,EAAA5K,UAAAyN,aAAR,SAAqBC,GACnB,GAAIA,EAAM,CACR,GAAIA,EAAKC,WAAaC,KAAKC,UACzB,OAAOH,EAET,GAAIA,EAAKI,WACP,OAAOvN,KAAKkN,aAAaC,EAAKI,WAAW,MAKxClD,EAAA5K,UAAA+N,mBAAP,SAA0BC,GACxB,IAAKA,EAAMC,iBAAkB,CAC3B,IAAMC,EAAcF,EAAM3M,OAC1B,GAAI6M,GAA8B,MAApBA,EAAOC,UAAoBD,EAAOE,aAAa,QAAS,CACpE,IAAMC,EAAeH,EAAOE,aAAa,UACzCF,EAAOI,aAAa,SAAU,UAC9BC,YAAW,WACLF,EACFH,EAAOI,aAAa,SAAUD,GAE9BH,EAAOM,gBAAgB,kBAIvBjO,KAAK0K,OAAOwD,WACdlO,KAAK0K,OAAOwD,UAAUT,GAExBzN,KAAK4K,aAAanI,OAClBzC,KAAK2K,aAAc,IAKlBN,EAAA5K,UAAA0O,WAAP,WAEEjF,OAAOkF,cAAc,IAAIC,MAAM,YAG1BhE,EAAA5K,UAAA6O,SAAP,SAAgBC,GAEd,IAAMlH,EAAW,GACjB,GAAIrH,KAAK0K,OAAO8D,WAAaxO,KAAKsL,MAAO,CACvC,IAAMkD,EAAYxO,KAAK0K,OAAO8D,UACxBC,EAASzO,KAAKsL,MAAM5K,OACtB+N,EAASD,IACXnH,EAAIqH,eAAiB,WAAWF,EAAS,qCAAqCC,EAAM,gBAIxF,OAAOrP,OAAOuP,KAAKtH,GAAK3G,OAAS2G,EAAM,MAGlCgD,EAAA5K,UAAAmP,MAAP,SAAavC,GAGoB,SAF/BA,EAAUA,GAAoB,IAElBwC,eACV7O,KAAK8O,OAAOC,UAAUC,SAAShP,KAAK8O,OAAOG,IAAIxH,IAAI,IAEnDzH,KAAK8O,OAAOC,UAAUG,WAAWlP,KAAK8O,OAAOG,IAAIxH,IAAI,IAGvDzH,KAAK8O,OAAOC,UAAUI,UAEtB,IAAMC,EAAcpP,KAAK8O,OAAOC,UAAUM,UACtCD,GACFA,EAAYE,eAAe,CAAEC,MAAO,YAIjClF,EAAA5K,UAAA+P,MAAP,WACExP,KAAKyP,WAAW,KAGXpF,EAAA5K,UAAAiQ,QAAP,WACE1P,KAAKyK,eAAgB,GAGhBJ,EAAA5K,UAAAkQ,QAAP,SAAeC,GACb5P,KAAKyP,WAAWG,IAGXvF,EAAA5K,UAAAgQ,WAAP,SAAkBG,GAGhB,GAFA5P,KAAKsL,MAAQsE,GAAQ,GAEjB5P,KAAK8O,QAAU9O,KAAK8O,OAAOc,KAC7B,IACE5P,KAAK8O,OAAOc,KAAKpI,IAAIxH,KAAKsL,OAC1B,MAAO5I,IAIX1C,KAAKsK,OAAOuF,gBAGPxF,EAAA5K,UAAAqQ,iBAAP,SAAwBC,GACtB/P,KAAKiL,SAAW8E,GAGX1F,EAAA5K,UAAAuQ,kBAAP,SAAyBD,GACvB/P,KAAKmL,UAAY4E,GAGZ1F,EAAA5K,UAAAwQ,YAAP,WACEjQ,KAAK4K,aAAazD,WAClBnH,KAAK+K,UAAUtI,OACfzC,KAAK+K,UAAU5D,WACfnH,KAAKkQ,WAGA7F,EAAA5K,UAAAyQ,QAAP,WACMlQ,KAAK8O,QACP9O,KAAK8O,OAAOoB,UAEdlQ,KAAK2K,aAAc,EACnB3K,KAAKsK,OAAOuF,eACZ7P,KAAKgM,GAAGE,UAAY,IAGd7B,EAAA5K,UAAA6M,cAAR,WACE,OAAO6D,EAAAA,MAAM,CAAEC,aAAc,IAAMpQ,KAAKiI,eAAgBjI,KAAK0K,SAGvDL,EAAA5K,UAAA4Q,QAAR,SAAgBT,GAEd5P,KAAKiL,SAAS2E,IAGRvF,EAAA5K,UAAA8M,aAAR,SAAqB7B,GAArB,IAAA1B,EAAAhJ,MAEG0K,EAAO4F,SAAW,IAAIC,SAAQ,SAACC,GAC9BxH,EAAKuB,IAAIpB,aAAasH,QAAQD,EAAO9F,OAAOgG,MAAQ,SAAU5B,GAG5D,OAFA0B,EAAO1B,OAASA,EAChB0B,EAAOpE,aACAoE,IAGRA,EAAO9F,OAAOiG,SAAW,IAAIJ,SAAQ,SAACK,GACrC5H,EAAKuB,IAAIpB,aAAa0H,WAAWD,EAAOF,KAAM,CAC5CI,KAAMF,EAAOF,KACbK,KAAMH,EAAOI,UAGfhI,EAAKuB,IAAIpB,aAAa8H,gBAAgBL,EAAOF,KAAM,CACjDQ,KAAMN,EAAOF,KACbS,MAAOP,EAAOQ,QACdC,KAAMT,EAAOS,KACbzC,MAAOgC,EAAOhC,MACd0C,aAAcV,EAAOU,aACrBC,qBAAsBX,EAAOW,qBAC7BC,SAAU,WACJZ,EAAOa,OACTb,EAAOa,MAAMzR,OAGjB0R,QAAS,SAAUd,GACbA,EAAOc,SACTd,EAAOc,QAAQ1R,KAAM4Q,aASzBvG,EAAA5K,UAAA+M,eAAR,WACE,IAAM9B,EAAS1K,KAAKsM,gBAEpB,OAAO6D,EAAAA,MAGL,GACA,CACEpP,IAAK2J,EAAOiH,cACZC,gBAAiBlH,EAAOmH,YACxBC,iBAAiB,EACjBC,UAAW,EACXC,YAAa,IACbC,UAAU,EACVC,gBAAgB,EAChBC,kBAAmB,EACnBC,kBAAmB,OACnBC,oBAAoB,EACpBC,0BAA2B,SAC3BC,aAAa,EACbC,gBAAiB,CACfC,EAAG,SACHC,GAAI,YACJC,GAAI,YACJC,GAAI,YACJC,GAAI,YACJC,WAAY,SAEdC,0BAA0B,EAC1BC,iBAAkB,CAChBC,SAAU,CACRtC,QAASnM,EACT0O,eAAgB,GAElBC,cAAe,CACbxC,QAASlM,EACTyO,eAAgB,GAElBE,SAAU,CACRzC,QAASpM,EACT2O,eAAgB,IAGpBG,eAAgB,CACdJ,SAAU,CACRtC,QAASnM,EACT0O,eAAgB,GAElBC,cAAe,CACbxC,QAASlM,EACTyO,eAAgB,GAElBE,SAAU,CACRzC,QAASpM,EACT2O,eAAgB,KAItBxI,EAAO0F,eAIH/F,EAAA5K,UAAAoM,gBAAR,WAAA,IAAA7C,EAAAhJ,KACEA,KAAKsT,cACFhM,KACCiM,EAAAA,QAAO,SAACC,GAAU,OAAAA,KAClBxG,EAAAA,WAAU,WAAM,OAAAhE,EAAK4B,gBACrB3B,EAAAA,KAAI,WACF,IAAM8F,EAAiB7F,OAAOuK,eACxBpH,EAAe,GACjB0C,EAAU2E,WACZrH,EAAQ0C,UAAY,CAClB5B,KAAM4B,EAAU2E,SAASC,UACzBC,OAAQ7E,EAAU8E,aAGtB7K,EAAKoD,WAAWC,MAElBW,EAAAA,WAAU,WAAM,OAAAhE,EAAK8B,iBACrByI,EAAAA,QAAO,SAACrI,GAAS,QAAEA,KACnBjC,EAAAA,KAAI,SAACT,OAAEkC,EAAAlC,EAAAkC,OAAQ2B,EAAA7D,EAAA6D,QACbrD,EAAK8K,aAAapJ,EAAQ2B,OAG7B7C,aAGGa,EAAA5K,UAAAsU,gBAAR,WACE,IAAMC,EAAahU,KAAKuL,QAAQqE,KAAKnI,MAEjCzH,KAAK4P,OAASoE,GAChBhU,KAAKqQ,QAAQ2D,IAIT3J,EAAA5K,UAAAqU,aAAR,SAAqBpJ,EAA4B2B,GAAjD,IAAArD,EAAAhJ,KACEA,KAAKsK,OAAOuF,eAEZ7P,KAAK2P,QAAQ3P,KAAKsL,OAEdZ,EAAOiB,UACT3L,KAAK0P,UAGHhF,EAAO0F,aAAa6D,QAClBvJ,EAAO0F,aAAa6D,OAAOtJ,aAC7BD,EAAO0F,aAAa6D,OAAOtJ,cAI/B3K,KAAKuL,QAAQ0I,OAAOC,GAAG,SAAS,WAC9BlL,EAAKwB,cAAe,EACpBxB,EAAKsB,OAAOuF,kBAGd7P,KAAKuL,QAAQ0I,OAAOC,GAAG,QAAQ,WAC7BlL,EAAKwB,cAAe,EACpBxB,EAAKsB,OAAOuF,kBAIdsE,EAAAA,kBACE,SAACC,GACCpL,EAAKuC,QAAQ0I,OAAOC,GAAG,iBAAkBE,MAE3C,eAEC9M,KACC+M,EAAAA,UAAUrU,KAAKsL,OACf/C,EAAAA,KAAI,WAAM,OAAAS,EAAK8F,OAAOc,KAAKnI,SAC3B6M,EAAAA,uBACAC,EAAAA,KAAK,IAEN/K,WAAU,WACTR,EAAK+K,qBAUT/T,KAAKuL,QAAQ0I,OAAOC,GAAG,sBAAsB,SAACtE,GAC5C,IAAI4E,EAAMpP,SAAS2B,cAAc,OAWjC,OAVAyN,EAAItI,UAAY0D,EAChB4E,EAAIC,iBAAiB,KAClBlE,SAAQ,SAACvE,GACR,IAAK,IAAIzL,EAAI,EAAGA,EAAIyL,EAAG0I,WAAWhU,OAAQH,IAAK,CAC7C,IAAMoU,EAAO3I,EAAG0I,WAAW,GAAGhE,KACjB,SAATiE,GACF3I,EAAGiC,gBAAgB0G,OAIpBH,EAAItI,aAGblM,KAAKuL,QAAQ0I,OAAOC,GAAG,WAAW,WAChClL,EAAKmC,eAGHnL,KAAK0K,OAAOhF,OAAS1F,KAAK0K,OAAOhF,MAAMuH,SACzCjN,KAAKuL,QAAQ0I,OAAOC,GAAG,2BAA2B,SAACxO,GAmBjD,OAjBAkP,MAAMlP,EAAMmI,aAAa,QACtB/K,MAAK,SAAC+R,GACLA,EAAInI,OACD5J,MAAK,SAAC4J,GACL1D,EAAKyD,oBAAoBC,GACtBpF,KACCwN,EAAAA,UAAU9L,EAAK+B,YAEhBvB,WAAU,SAACzD,GACVL,EAAMqI,aAAa,MAAOhI,GAC1BL,EAAMuI,gBAAgB,wBAEtBjF,EAAK+K,4BAKV,KAGT/T,KAAKuL,QAAQ0I,OAAOC,GAAG,sBAAsB,SAACa,GAS5C,OARA/L,EAAKyD,oBAAoBsI,EAAM,IAC5BzN,KACCwN,EAAAA,UAAU9L,EAAK+B,YAEhBvB,WAAU,SAACzD,GACViD,EAAK8F,OAAOpJ,MAAMsP,OAAOjP,EAAK,KAAM,KAAMiD,EAAK8F,OAAOpJ,MAAM+B,WAGzD,MAIPzH,KAAKgM,GAAGC,cAAc,uBACxBjM,KAAKgM,GAAGC,cAAc,sBAAsBgJ,SAG9C,IAAMlG,EAAY1C,EAAQ0C,UAE1B,GAAIA,EAAW,CACb,IAAM5B,EAAY5N,MAAM2V,KAAKlV,KAAKgM,GAAGyI,iBAAiB,kBAAkBU,MAAK,SAAChI,GAC5E,OAAO4B,EAAU5B,OAASA,EAAKiI,eAGjC,GAAIjI,EAAM,CACR,IAAMkI,EAAQjQ,SAASkQ,cACjBC,EAAMrM,OAAOuK,eAEnB4B,EAAMG,SAASxV,KAAKkN,aAAaC,GAAO4B,EAAU6E,QAClDyB,EAAMI,UAAS,GAEfF,EAAIG,kBACJH,EAAII,SAASN,QACJrV,KAAK0K,OAAOgB,WACrB1L,KAAK4O,aAEE5O,KAAK0K,OAAOgB,WACrB1L,KAAK4O,2EA7cN7E,EAAAA,UAAQ,CAAAC,KAAIC,EAAAA,OAAMC,KAAA,CAACtF,YACJgR,EAAAA,yBACH5N,KAlBepH,EAAA,CAA7BiV,EAAAA,YAAY,6EACkBjV,EAAA,CAA9BiV,EAAAA,YAAY,+EAEOjV,EAAA,CAAnBkV,EAAAA,UAAU,yBAAuBC,EAAAA,yCAEzBnV,EAAA,CAARoV,EAAAA,8DAPU3L,EAAqB4L,EAAArV,EAAA,CAlBjCsV,EAAAA,UAAU,CACTC,SAAU,iBACVC,SAAA,yaAEAC,UAAW,CACT,CACEC,QAASC,EAAAA,kBACTC,YAAaC,EAAAA,YAAW,WAAM,OAAAR,KAC9BS,OAAO,GAET,CACEJ,QAASK,EAAAA,cACTH,YAAaC,EAAAA,YAAW,WAAM,OAAAR,KAC9BS,OAAO,IAGXE,gBAAiBC,EAAAA,wBAAwBC,q1GAoBtCvV,EAAA,EAAAwI,EAAAA,YAAYxI,EAAA,EAAA0I,EAAAA,OAAOrF,kCACJgR,EAAAA,kBACH5N,KApBJqC,mBC1CX,SAAA0M,EACUC,EACA1M,GADAtK,KAAAgX,UAAAA,EACAhX,KAAAsK,OAAAA,EAGZ,OAZiBlL,OAAAkC,eAAWyV,EAAAtX,UAAA,UAAO,KAAlB,SAAmBmQ,GAChC5P,KAAKiX,YAAcjX,KAAKgX,UAAUE,wBAAwBtH,GAC1D5P,KAAKsK,OAAOuF,yFAMOsH,EAAAA,oBACHvB,EAAAA,qBATHhV,EAAA,CAAdoV,EAAAA,MAAM,6FAFIe,EAAuBnW,EAAA,CANnCsV,EAAAA,UAAU,CACTC,SAAU,mBACVC,SAAA,iFAEAQ,gBAAiBC,EAAAA,wBAAwBC,4CAYpBK,EAAAA,aACHvB,EAAAA,qBAXPmB,mBCgBb,SAAAK,WAcA,SAdaA,EACJA,EAAAC,QAAP,SAAe3M,GACb,YADa,IAAAA,IAAAA,EAAA,IACN,CACL4M,SAAUC,EACVlB,UAAW,CACT,CAAEC,QAAS5R,EAA+B8S,SAAU9M,GACpD,CACE4L,QAAS1R,EACT6S,WAAYC,EACZC,KAAM,CAACjT,OATJ0S,EAAkBG,EAAA3W,EAAA,CAd9BgX,EAAAA,SAAS,CACRnO,QAAS,CACPoO,EAAAA,aACAC,EAAAA,kBAEFC,QAAS,CACP1N,EACA0M,GAEFiB,aAAc,CACZ3N,EACA0M,MAGSK,eAgBGM,EAA0BhN,GACxC,OAAAvK,EAAA,CACEuJ,eAAgB,oHAcbgB,oBCvDP,SAAAuN,KAQA,OAHSA,EAAAxY,UAAA2M,WAAP,aACO6L,EAAAxY,UAAAyQ,QAAP,aAEF+H,mBCME,SAAAC,EAA0BxN,GAA1B,IAAA1B,EACEmP,EAAAxY,KAAAK,OAAOA,YADiBgJ,EAAA0B,OAAAA,EAFlB1B,EAAAoP,MAAQC,EAAAA,OAmETrP,EAAAsP,SAAW,SAAC7K,GACdzE,EAAK0B,OAAO4N,UACVJ,EAAcK,eAAiBvP,EAAKoP,OACrCpP,EAAK0B,OAAO4N,SAAS7K,EAAM+K,OAAOC,KAAKC,WAlE3C1P,EAAK0B,OAAMvK,EAAAA,EAAA,GACNuK,GAAM,CACTiG,QAAS,CACP,CACED,KAAMhG,EAAOgG,KACbU,QAAS1G,EAAO0G,QAChBJ,QAAStG,EAAOiO,SAChBlH,MAAO,SAAC3C,GACN9F,EAAK4P,YACL5P,EAAK6P,SAASC,sBAAsBhK,EAAO9C,SAMnDhD,EAAK6P,SAAW,IAAIE,EAAQ,CACxBC,OAAQC,EAAAA,SAASjQ,EAAKkQ,YAAYC,KAAKnQ,GAAO,KAC9CoQ,WAAY,CACVC,IAAK,GACLC,KAAM,GACN/E,MAAM,GAERgF,eAAgB,qCAAoCvQ,EAAK0B,OAAO6O,gBAAkB,IAClFC,UAAW,qCAAoCxQ,EAAK0B,OAAO+O,eAAiB,IAC5EC,QAAS1Q,EAAK0B,OAAOgP,QACrBC,aAAa,EACbC,iBAAkB,SAACnB,GACjB,OAAOzP,EAAK0B,OAAOkP,iBAAiBnB,EAAKC,WAE3CmB,eAAgB,SAACpB,GACf,IAAMrC,EAAWpN,EAAK0B,OAAOoP,iBAAiBrB,EAAKC,UAE/ClZ,EAAI4F,SAAS2B,cAAc,KAC/BvH,EAAE0M,UAAYkK,EAEd,IAAIjJ,EAAO3N,EAAEua,kBASb,OARK5M,KACHA,EAAO/H,SAAS2B,cAAc,SACzBmF,UAAYkK,GAGnBjJ,EAAKY,aAAa,kBAAmB,SACrCZ,EAAK6M,UAAUC,IAAI,gBAEZ9M,EAAK+M,aAIlBhC,EAAciC,UAAUlW,KAAK+E,EAAK6P,YA0CtC,OAnGmCjZ,EAAAsY,EAAAC,GA4D1BD,EAAAzY,UAAA2M,WAAP,WAAA,IAAApD,EAAAhJ,KACEA,KAAK6Y,SAASuB,OAAOpa,KAAK8O,OAAO9C,IACjChM,KAAK8O,OAAOmF,OAAOC,GAAG,WAAW,SAACxR,GAChC,GAAc,UAAVA,EAAE3B,KAAoBiI,EAAK6P,SAASwB,SACtC,OAAO,KAER,GAGHra,KAAK8O,OAAO9C,GAAGsO,iBAAiB,mBAAoBta,KAAKsY,WAWpDJ,EAAAzY,UAAAyQ,QAAP,WACElQ,KAAK8O,OAAO9C,GAAGuO,oBAAoB,mBAAoBva,KAAKsY,WAGtDJ,EAAAzY,UAAAmZ,UAAR,WACEV,EAAciC,UAAU5J,SAAQ,SAACiK,GAC3BA,EAAQC,MACVD,EAAQE,eAKNxC,EAAAzY,UAAAyZ,YAAR,SAAoByB,EAASC,GAE3B,OADA1C,EAAcK,aAAevY,KAAKoY,MAC3BpY,KAAK0K,OAAOkK,MAAM+F,GACdnR,WAAU,SAAC0B,GACV0P,EAAG1P,OA9FFgN,EAAAK,aAAe,KACfL,EAAAiC,UAAY,GAgG7BjC,GAnGmCD,iBCHjC,SAAA4C,EAA0BnQ,QAAA,IAAAA,IAAAA,EAAA,CAAyBgG,KAAM,cAAzD,IAAA1H,EACEmP,EAAAxY,KAAAK,OAAOA,YADiBgJ,EAAA0B,OAAAA,EAExB1B,EAAK0B,OAAMvK,EAAAA,EAAA,GACNuK,GAAM,CACTgG,KAAM,YACNC,QAAS,CACP,CACED,KAAM,YACNM,QAAS,6KACTS,MAAO,SAAC3C,GACNA,EAAOc,KAAKoF,OAAO,+CA4B/B,OAxCqCpV,EAAAib,EAAA1C,GAmB5B0C,EAAApb,UAAA2M,WAAP,WACEpM,KAAK8O,OAAOmF,OAAOC,GAAG,SAAS,SAACxR,GAC9B,IAAMoY,EAAKpY,EAAE5B,OACb,GAAoB,OAAhBga,EAAGlN,UAAqBlL,EAAEqY,QAAU,EAAG,CAEzC,IAAMC,EZwHP,WACH,IAAK,IAAI3W,EAAK,GAAI9D,EAAI,EAAGA,EAAIE,UAAUC,OAAQH,IAC3C8D,EAAKA,EAAG4W,OAAO/W,EAAOzD,UAAUF,KACpC,OAAO8D,EY3HQ6W,CAAA,CAAIJ,GAAOA,EAAGrG,iBAAiB,OAEtCqG,EAAGd,UAAUmB,SAAS,WACxBH,EAAMzK,SAAQ,SAACkI,GACbA,EAAKuB,UAAU/E,OAAO,cAGxB+F,EAAMzK,SAAQ,SAACkI,GACbA,EAAKuB,UAAUC,IAAI,kBAKxB,IAGPY,GAxCqC5C,iBCEnC,SAAAmD,EAA0B1Q,QAAA,IAAAA,IAAAA,EAAA,CAAyBgG,KAAM,SAAzD,IAAA1H,EACEmP,EAAAxY,KAAAK,OAAOA,YADiBgJ,EAAA0B,OAAAA,EAExB1B,EAAK0B,OAAMvK,EAAAA,EAAA,GACNuK,GAAM,CACTgG,KAAM,OACNC,QAAS,CACP,CACED,KAAM,OACNM,QAAS,oHACTS,MAAO,SAAC3C,GACN,IAAM3B,EAAO2B,EAAOC,UAAUtH,MACxB4T,EAASrS,EAAKsS,WAAWnO,EAAKuG,UAChC2H,EACFA,EAAOrB,UAAU/E,OAAO,QAExBnG,EAAOc,KAAKoF,OAAO,mBAAqBlG,EAAOC,UAAUtH,MAAM8T,WAAWC,QAAQ,UAAU,QAAU,eAsDpH,OAvEgC5b,EAAAwb,EAAAjD,GAyBvBiD,EAAA3b,UAAA2M,WAAP,WAAA,IAAApD,EAAAhJ,KACEA,KAAK8O,OAAOmF,OAAOC,GAAG,WAAW,SAACxR,GAChC,GAAkB,KAAdA,EAAE+Y,QAAgB,CACpB,IAAM1M,EAAY/F,EAAK8F,OAAOC,UAAUtH,MAExC,GAAIsH,GAAa/F,EAAKsS,WAAWvM,EAAU2E,UAAW,CACpDhR,EAAEgZ,iBACFhZ,EAAEiZ,kBACFjZ,EAAEkZ,2BACF,IAAIC,EAAK,OACHC,EAAO/M,EAAU2E,SACvB,GAAsB,UAAlBoI,EAAKlO,UAAwBmB,EAAU8E,aAAeiI,EAAKpb,OAEvDob,EAAKC,aAA6C,OAA9BD,EAAKC,YAAYnO,WACzCiO,GAAM,YAEH,CACL,IAAM7P,EAAUzM,MAAM2V,KAAK4G,EAAKvO,YAAYyO,OAAOjN,EAAU8E,WAAa,EAAG,GAAG7P,MAC5EgI,GAAsB,OAAhBA,EAAG4B,WACXiO,GAAM,QAKV,OADA7S,EAAK8F,OAAOc,KAAKoF,OAAO6G,IACjB,OAGV,IAGET,EAAA3b,UAAAyQ,QAAP,aAEQkL,EAAA3b,UAAA6b,WAAR,SAAmBtP,GAEjB,GAAIA,EAAI,CACN,GAAIA,EAAGgO,WAAahO,EAAGgO,UAAUmB,SAAS,QACxC,OAAOnP,EAGT,GAAIA,EAAGiQ,cACL,OAAOjc,KAAKsb,WAAWtP,EAAGiQ,eAI9B,OAAO,MAEXb,GAvEgCnD,iBCM9B,SAAAiE,EAA0BxR,QAAA,IAAAA,IAAAA,EAAA,IAA1B,IAAA1B,EACEmP,EAAAxY,KAAAK,OAAOA,YADiBgJ,EAAA0B,OAAAA,EAGxB1B,EAAK0B,OAAMvK,EAAAA,EAAA,GACNuK,GAAM,CACTgG,KAAMhG,EAAOgG,MAAQ,eACrBC,QAAS,CACP,CACED,KAAM,eACNM,QAAS,ilBAGTI,QAAS,gBACTK,MAAO,SAAC3C,GAEAqN,UAAWC,aAAaC,gBAAgB,CAAErW,OAAO,IACpDlD,MAAK,SAACwZ,GACL,IAAMC,EAAS,GAEXC,EAAgB,IAAIC,cAAcH,EADtB,CAAEI,SAAU,2BAG5BJ,EAAOhC,iBAAiB,YAAY,SAAC5X,GACnC8Z,EAAcG,OACdH,EAAgB,KAChBF,EAAOM,YAAYrM,SAAQ,SAACsM,GAAU,OAAAA,EAAMF,UAC5CL,EAAS,KAET,IAAM5P,EAAO,IAAIoQ,KAAKP,EAAQ,CAAEvS,KAAM,eACtCU,EAAOuC,OAAOP,GACXlD,WAAU,SAACzD,GACZ+I,EAAOc,KAAKoF,OAAO,6FAA6FtK,EAAOqS,SAAQ,kBAAkBhX,EAAG,6CAIxJyW,EAAclC,iBAAiB,iBAAiB,SAAC7M,GAC3CA,EAAMvC,MAAQuC,EAAMvC,KAAK8R,KAAO,GAClCT,EAAOtY,KAAKwJ,EAAMvC,SAItBsR,EAAcS,MAAM,OAErBC,OAAM,SAACxa,cAqEtB,OAnHwC9C,EAAAsc,EAAA/D,GAqDzB+D,EAAAzc,UAAA2M,WAAb,kHACE,MAAA,CAAA,EAAMjH,EAAeuC,WAAW,UAC7ByV,2BADH3U,EAAAlF,OAGM6F,EAAgBD,OAAeC,aAErCnJ,KAAK8O,OAAOmF,OAAOC,GAAG,WAAW,SAACxR,GAChC,IAAMsJ,EAAKhD,EAAKoU,OAAO1a,EAAE5B,QAErBkL,IACFhD,EAAK8F,OAAOuO,OAAOC,UACnBtU,EAAKuU,UAAYvR,EACjBhD,EAAKwU,WAAWxR,OAIpB7C,EAAasU,gBAAgB,4BAA8B,cAE3DtU,EAAa0H,WAAW,aAAc,CAAEC,KAAM,QAAS4M,QAAS,WAChEvU,EAAa8H,gBAAgB,aAAc,CACzCE,MAAO,SACPE,MAAM,EACNzC,OAAO,EACP4C,SAAU,WACJxI,EAAKuU,WACPvU,EAAKuU,UAAUtI,wBAMfiH,EAAAzc,UAAAke,aAAR,WAEE,IAAMvH,EAAW,CACfzF,QAAS,2BAA2B3Q,KAAK8O,OAAO8B,OAAOgN,UAAU,CAAC,eAAc,UAGlF,OAAO5d,KAAK8O,OAAOuO,OAAOnd,OAAO,2BAA4BkW,IAGvD8F,EAAAzc,UAAA+d,WAAR,SAAoBxR,GAClB,IAAI6R,EAAS7d,KAAK8O,OAAOuO,OAAO5V,IAAI,4BAE/BoW,IACHA,EAAS7d,KAAK2d,gBAGhB3d,KAAK8O,OAAOuO,OAAOS,aAAa,2BAA4B9d,KAAK8O,OAAOiP,EAAE/R,IAE1E,IAAMgS,EAAOhS,EAAGiS,WAAajS,EAAGkS,YAAc,EAE9Cle,KAAK8O,OAAOuO,OAAOc,KAAK,2BAA4BH,EAAM,OAGpD9B,EAAAzc,UAAA2d,OAAR,SAAepR,GACb,GAAIA,GAAMA,EAAGgO,UACX,OAAIhO,EAAGgO,UAAUmB,SAAS,oBACjBnP,EAEFhM,KAAKod,OAAOpR,EAAGoS,aAG5BlC,GAnHwCjE","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export const RichButtons = [\n 'insertTable',\n 'insertImage',\n 'insertLink',\n 'insertVideo',\n];\n","export const TextButtons = [\n 'paragraphFormat',\n 'code',\n 'bold',\n 'italic',\n 'underline',\n 'strikeThrough',\n 'subscript',\n 'superscript',\n 'fontFamily',\n 'fontSize',\n 'textColor',\n 'backgroundColor',\n 'inlineClass',\n 'inlineStyle',\n 'clearFormatting',\n 'quote',\n];\n","export const ParagraphButtons = [\n 'align',\n 'formatOL',\n 'formatUL',\n 'checklist',\n 'indent',\n 'outdent',\n];\n","import { InjectionToken } from '@angular/core';\n\nexport const FS_HTML_EDITOR_DEFAULT_CONFIG = new InjectionToken<any[]>('fs-html-editor.default-config');\nexport const FS_HTML_EDITOR_CONFIG = new InjectionToken<any[]>('fs-html-editor.config');\n","import { Observable } from 'rxjs';\nimport { shareReplay } from 'rxjs/operators';\n\nfunction resourceLoaderFactory() {\n let resourceBase = '/assets/js/froala/';\n let stylesBase = '/assets/css/';\n\n const head = document.getElementsByTagName('head')[0];\n const files = new Map<string, Observable<unknown>>();\n\n const resourcePaths = {\n froala: 'froala_editor.min.js',\n align: 'plugins/align.min.js',\n colors: 'plugins/colors.min.js',\n image: 'plugins/image.min.js',\n link: 'plugins/link.min.js',\n lists: 'plugins/lists.min.js',\n paragraph_format: 'plugins/paragraph_format.min.js',\n table: 'plugins/table.min.js',\n url: 'plugins/url.min.js',\n video: 'plugins/video.min.js',\n quote: 'plugins/quote.min.js',\n draggable: 'plugins/draggable.min.js',\n font_size: 'plugins/font_size.min.js',\n }\n\n const stylesPaths = {\n froala: 'froala_editor.pkgd.min.css',\n }\n\n const loadResource = function (scriptPath: string): Observable<unknown> {\n if (!files.has(scriptPath)) {\n const obs$ = new Observable((obs) => {\n\n const script = document.createElement('script');\n script.src = scriptPath;\n\n head.appendChild(script);\n\n script.onload = () => {\n obs.next();\n obs.complete();\n };\n\n script.onerror = (err) => {\n obs.error(err);\n }\n })\n .pipe(\n shareReplay(1),\n );\n\n files.set(scriptPath, obs$);\n }\n\n return files.get(scriptPath);\n };\n\n const loadStyles = function (stylePath: string): Observable<unknown> {\n if (!files.has(stylePath)) {\n const obs$ = new Observable((obs) => {\n const style = document.createElement('link');\n style.id = stylePath;\n style.rel = 'stylesheet';\n style.href = `${stylePath}`;\n\n head.appendChild(style);\n\n style.onload = () => {\n obs.next();\n obs.complete();\n };\n\n style.onerror = (err) => {\n obs.error(err);\n }\n });\n\n files.set(stylePath, obs$);\n }\n\n return files.get(stylePath);\n };\n\n return {\n setResourceBase: (path: string) => {\n resourceBase = path;\n },\n setStylesBase: (path: string) => {\n stylesBase = path;\n },\n loadResource: (resourceName: string) => {\n const path = resourcePaths[resourceName] || resourceName;\n\n return loadResource(resourceBase + path);\n },\n loadStyles: (resourceName: string) => {\n const path = stylesPaths[resourceName] || resourceName;\n\n return loadStyles(stylesBase + path);\n }\n }\n}\n\n\nexport const ResourceLoader = resourceLoaderFactory();\n","import { Inject, Injectable, Optional } from '@angular/core';\n\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport { concatMap, map, shareReplay, tap } from 'rxjs/operators';\n\nimport { FS_HTML_EDITOR_CONFIG } from '../injects/config.inject';\nimport { FsHtmlEditorConfig } from '../interfaces/html-editor-config';\n\nimport { ResourceLoader } from '../utils/loader';\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FsFroalaLoaderService {\n\n private _FroalaEditor: unknown;\n\n private _froalaLoaded = new BehaviorSubject(false);\n private _defaultPluginsLoaded = new BehaviorSubject(false);\n\n private _loaded$ = combineLatest([this._froalaLoaded, this._defaultPluginsLoaded])\n .pipe(\n map(([FroalaReady, pluginsRead]) => {\n return pluginsRead && FroalaReady;\n }),\n shareReplay(1),\n );\n\n constructor(\n @Optional() @Inject(FS_HTML_EDITOR_CONFIG) private _defaultConfig: FsHtmlEditorConfig,\n ) {\n if (this._defaultConfig) {\n if (this._defaultConfig.assetsJSPath) {\n ResourceLoader.setResourceBase(this._defaultConfig.assetsJSPath)\n }\n\n if (this._defaultConfig.assetsCSSPath) {\n ResourceLoader.setStylesBase(this._defaultConfig.assetsCSSPath)\n }\n }\n\n this._load();\n }\n\n public get loaded$(): Observable<boolean> {\n return this._loaded$;\n }\n\n public get ready(): boolean {\n return this._froalaLoaded.getValue() && this._defaultPluginsLoaded.getValue();\n }\n\n public get FroalaEditor(): any {\n return this._FroalaEditor;\n }\n\n private _load() {\n combineLatest([\n ResourceLoader.loadResource('froala'),\n ResourceLoader.loadStyles('froala')\n ])\n .pipe(\n tap(() => {\n this._FroalaEditor = (window as any).FroalaEditor;\n this._froalaDone();\n }),\n concatMap(() => {\n return this._loadPlugins();\n }),\n tap(() => {\n this._defaultPluginsDone();\n }),\n )\n .subscribe();\n }\n\n private _loadPlugins(): Observable<unknown> {\n const imports = this._defaultConfig\n .defaultPlugins\n .reduce((acc, pluginName) => {\n const import$ = ResourceLoader.loadResource(pluginName);\n\n acc.push(import$);\n\n return acc;\n }, []);\n\n return combineLatest(imports);\n }\n\n private _froalaDone() {\n this._froalaLoaded.next(true);\n }\n\n private _defaultPluginsDone() {\n this._defaultPluginsLoaded.next(true);\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n forwardRef,\n HostBinding,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator\n} from '@angular/forms';\n\nimport { FileProcessor, FsFile } from '@firestitch/file';\n\nimport { BehaviorSubject, fromEventPattern, Observable, ReplaySubject, Subject } from 'rxjs';\nimport { distinctUntilChanged, filter, map, skip, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';\n\nimport { merge } from 'lodash-es';\n\nimport { PluginButton } from './../../interfaces/plugin-button';\nimport { FsHtmlEditorConfig } from '../../interfaces/html-editor-config';\nimport { RichButtons } from './../../consts/rich-buttons.const';\nimport { TextButtons } from './../../consts/text-buttons.const';\nimport { ParagraphButtons } from './../../consts/paragraph-buttons.const';\n\nimport { FS_HTML_EDITOR_CONFIG } from '../../injects/config.inject';\nimport { Plugin } from './../../classes/plugin';\n\nimport { FsFroalaLoaderService } from '../../services/froala-loader.service';\n\n\n@Component({\n selector: 'fs-html-editor',\n templateUrl: 'html-editor.component.html',\n styleUrls: ['html-editor.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FsHtmlEditorComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => FsHtmlEditorComponent),\n multi: true\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsHtmlEditorComponent implements OnInit, AfterViewInit, ControlValueAccessor, Validator, OnDestroy {\n\n @HostBinding('class.focused') classFocused = false;\n @HostBinding('class.disabled') classDisabled = false;\n\n @ViewChild('elRef') public elRef: ElementRef;\n\n @Input() public config: FsHtmlEditorConfig = {};\n\n public initialized = false;\n\n private _editor: any;\n private _html: string;\n private _initialize$ = new ReplaySubject();\n private _froalaReady$ = new BehaviorSubject(null);\n private _destroy$ = new Subject();\n\n constructor(\n @Optional() @Inject(FS_HTML_EDITOR_CONFIG) private _defaultConfig,\n private _cdRef: ChangeDetectorRef,\n private _fr: FsFroalaLoaderService,\n ) { }\n\n public onChange = (data: any) => {}\n public onTouched = () => {}\n\n public get el(): any {\n return this.elRef.nativeElement;\n }\n\n public get html(): string {\n return this._html;\n }\n\n public get editor(): any {\n return this._editor;\n }\n\n public get froalaLoaded$(): Observable<boolean> {\n return this._fr.loaded$;\n }\n\n public ngOnInit(): void {\n this.config = this.config || {};\n this.config.autofocus = this.config.autofocus !== false && !this.config.disabled;\n this.initialized = !this.config.initOnClick;\n this._listenLazyInit();\n }\n\n public ngAfterViewInit() {\n if (!this.config.initOnClick || !this.hasContent()) {\n this.initialized = true;\n this._initialize$.next();\n }\n }\n\n public hasContent() {\n const el = document.createElement('div');\n\n if (el.querySelector('img')) {\n return true;\n }\n\n el.innerHTML = this._html;\n return !!el.innerText.length;\n }\n\n public initialize(options: any = {}) {\n const config = this._createConfig();\n\n this._initPlugins(config);\n // this.el.innerHTML = this._html || '';\n\n this._editor = new this._fr.FroalaEditor(this.el, this._createOptions(), () => {\n this._froalaReady$.next({ config, options });\n });\n }\n\n private _processImageUpload(blob) {\n const processor = new FileProcessor();\n const file = new FsFile(blob);\n\n return processor.process([file], this.config.image)\n .pipe(\n switchMap(([f]: FsFile[]) => {\n return this.config.image.upload(f.file)\n }),\n );\n }\n\n private _getTextNode(node) {\n if (node) {\n if (node.nodeType === Node.TEXT_NODE) {\n return node;\n }\n if (node.childNodes) {\n return this._getTextNode(node.childNodes[0]);\n }\n }\n }\n\n public uninitializedClick(event: UIEvent): void {\n if (!event.defaultPrevented) {\n const target: any = event.target;\n if (target && target.nodeName === 'A' && target.getAttribute('href')) {\n const targetTarget = target.getAttribute('target');\n target.setAttribute('target', '_blank');\n setTimeout(() => {\n if (targetTarget) {\n target.setAttribute('target', targetTarget);\n } else {\n target.removeAttribute('target');\n }\n });\n } else {\n if (this.config.initClick) {\n this.config.initClick(event);\n }\n this._initialize$.next();\n this.initialized = true;\n }\n }\n }\n\n public updateSize() {\n // Hack: To trigger the toolbar button size modes\n window.dispatchEvent(new Event('resize'));\n }\n\n public validate(control: AbstractControl): ValidationErrors | null {\n\n const err: any = {};\n if (this.config.maxLength && this._html) {\n const maxLength = this.config.maxLength;\n const length = this._html.length;\n if (length > maxLength) {\n err.maxLengthError = `Must be ${maxLength} characters or fewer. You entered ${length} characters.`;\n }\n }\n\n return Object.keys(err).length ? err : null;\n }\n\n public focus(options?: { cursorPosition?: 'start' | 'end' }) {\n options = options ? options : {};\n\n if (options.cursorPosition === 'end') {\n this.editor.selection.setAtEnd(this.editor.$el.get(0));\n } else {\n this.editor.selection.setAtStart(this.editor.$el.get(0));\n }\n\n this.editor.selection.restore();\n\n const elSelection = this.editor.selection.element();\n if (elSelection) {\n elSelection.scrollIntoView({ block: 'center' });\n }\n }\n\n public clear() {\n this.writeValue('');\n }\n\n public disable() {\n this.classDisabled = true;\n }\n\n public setHtml(html) {\n this.writeValue(html);\n }\n\n public writeValue(html: string): void {\n this._html = html || '';\n\n if (this.editor && this.editor.html) {\n try {\n this.editor.html.set(this._html);\n } catch (e) {\n }\n }\n\n this._cdRef.markForCheck();\n }\n\n public registerOnChange(fn: (data: any) => void): void {\n this.onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n public ngOnDestroy() {\n this._initialize$.complete();\n this._destroy$.next();\n this._destroy$.complete();\n this.destroy();\n }\n\n public destroy() {\n if (this.editor) {\n this.editor.destroy();\n }\n this.initialized = false;\n this._cdRef.markForCheck();\n this.el.innerHTML = '';\n }\n\n private _createConfig(): FsHtmlEditorConfig {\n return merge({ froalaConfig: {} }, this._defaultConfig, this.config);\n }\n\n private _change(html): void {\n // this._html = html;\n this.onChange(html);\n }\n\n private _initPlugins(config) {\n\n (config.plugins || []).forEach((plugin: Plugin) => {\n this._fr.FroalaEditor.PLUGINS[plugin.config.name] = function (editor) {\n plugin.editor = editor;\n plugin.initialize();\n return plugin;\n };\n\n (plugin.config.buttons || []).forEach((button: PluginButton) => {\n this._fr.FroalaEditor.DefineIcon(button.name, {\n NAME: button.name,\n PATH: button.svgPath,\n });\n\n this._fr.FroalaEditor.RegisterCommand(button.name, {\n icon: button.name,\n title: button.tooltip,\n undo: button.undo,\n focus: button.focus,\n showOnMobile: button.showOnMobile,\n refreshAfterCallback: button.refreshAfterCallback,\n callback: function () {\n if (button.click) {\n button.click(this);\n }\n },\n refresh: function (button) {\n if (button.refresh) {\n button.refresh(this, button);\n }\n }\n });\n });\n\n });\n }\n\n private _createOptions() {\n const config = this._createConfig();\n\n return merge(\n // For some reason editor store somewhere pointer on default config object and dublicate options each time on init\n // Extra merge level fixed this problem and allow to init config properly without legacy data\n {},\n {\n key: config.activationKey,\n placeholderText: config.placeholder,\n linkAlwaysBlank: true,\n tabSpaces: 2,\n typingTimer: 250,\n tooltips: false,\n wordPasteModal: false,\n imageDefaultWidth: 0,\n imageDefaultAlign: 'left',\n quickInsertEnabled: false,\n paragraphDefaultSelection: 'Format',\n videoUpload: false,\n paragraphFormat: {\n N: 'Normal',\n H1: 'Heading 1',\n H2: 'Heading 2',\n H3: 'Heading 3',\n H4: 'Heading 4',\n BLOCKQUOTE: 'Quote',\n },\n paragraphFormatSelection: true,\n toolbarButtonsXS: {\n moreText: {\n buttons: TextButtons,\n buttonsVisible: 1,\n },\n moreParagraph: {\n buttons: ParagraphButtons,\n buttonsVisible: 2,\n },\n moreRich: {\n buttons: RichButtons,\n buttonsVisible: 0,\n },\n },\n toolbarButtons: {\n moreText: {\n buttons: TextButtons,\n buttonsVisible: 3,\n },\n moreParagraph: {\n buttons: ParagraphButtons,\n buttonsVisible: 5,\n },\n moreRich: {\n buttons: RichButtons,\n buttonsVisible: 3,\n },\n },\n },\n config.froalaConfig,\n );\n }\n\n private _listenLazyInit() {\n this.froalaLoaded$\n .pipe(\n filter((ready) => ready),\n switchMap(() => this._initialize$),\n tap(() => {\n const selection: any = window.getSelection();\n const options: any = {};\n if (selection.baseNode) {\n options.selection = {\n node: selection.baseNode.nodeValue,\n offset: selection.baseOffset,\n };\n }\n this.initialize(options);\n }),\n switchMap(() => this._froalaReady$),\n filter((data) => !!data),\n tap(({ config, options }) => {\n this._setupFroala(config, options);\n })\n )\n .subscribe();\n }\n\n private _contentChanged(): void {\n const editorHTML = this._editor.html.get();\n\n if (this.html !== editorHTML) {\n this._change(editorHTML);\n }\n }\n\n private _setupFroala(config: FsHtmlEditorConfig, options: any): void {\n this._cdRef.markForCheck();\n\n this.setHtml(this._html);\n\n if (config.disabled) {\n this.disable();\n }\n\n if (config.froalaConfig.events) {\n if (config.froalaConfig.events.initialized) {\n config.froalaConfig.events.initialized();\n }\n }\n\n this._editor.events.on('focus', () => {\n this.classFocused = true;\n this._cdRef.markForCheck();\n });\n\n this._editor.events.on('blur', () => {\n this.classFocused = false;\n this._cdRef.markForCheck();\n });\n\n\n fromEventPattern(\n (handler) => {\n this._editor.events.on('contentChanged', handler);\n },\n () => {}\n )\n .pipe(\n startWith(this._html),\n map(() => this.editor.html.get()),\n distinctUntilChanged(),\n skip(1),\n )\n .subscribe(() => {\n this._contentChanged();\n });\n\n // this._editor.events.on('contentChanged', () => {\n // console.log('test');\n // if (!this._firstChange) {\n // this._contentChanged();\n // }\n // });\n\n this._editor.events.on('paste.afterCleanup', (html) => {\n var div = document.createElement('div');\n div.innerHTML = html;\n div.querySelectorAll('*')\n .forEach((el) => {\n for (var i = 0; i < el.attributes.length; i++) {\n const name = el.attributes[0].name;\n if (name !== 'href') {\n el.removeAttribute(name);\n }\n }\n });\n return div.innerHTML;\n });\n\n this._editor.events.on('keydown', () => {\n this.onTouched();\n });\n\n if (this.config.image && this.config.image.upload) {\n this._editor.events.on('image.beforePasteUpload', (image) => {\n\n fetch(image.getAttribute('src'))\n .then((res) => {\n res.blob()\n .then((blob) => {\n this._processImageUpload(blob)\n .pipe(\n takeUntil(this._destroy$),\n )\n .subscribe((url) => {\n image.setAttribute('src', url);\n image.removeAttribute('data-fr-image-pasted');\n\n this._contentChanged();\n });\n });\n });\n\n return false;\n });\n\n this._editor.events.on('image.beforeUpload', (blobs) => {\n this._processImageUpload(blobs[0])\n .pipe(\n takeUntil(this._destroy$),\n )\n .subscribe((url) => {\n this.editor.image.insert(url, null, null, this.editor.image.get());\n });\n\n return false;\n });\n }\n\n if (this.el.querySelector('.fr-second-toolbar')) {\n this.el.querySelector('.fr-second-toolbar').remove();\n }\n\n const selection = options.selection;\n\n if (selection) {\n const node: any = Array.from(this.el.querySelectorAll('.fr-element *')).find((node: any) => {\n return selection.node === node.textContent;\n });\n\n if (node) {\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(this._getTextNode(node), selection.offset);\n range.collapse(true)\n\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (this.config.autofocus) {\n this.focus();\n }\n } else if (this.config.autofocus) {\n this.focus();\n }\n }\n}\n","import { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ChangeDetectionStrategy, Component, Input, ChangeDetectorRef } from '@angular/core';\n\n\n@Component({\n selector: 'fs-html-renderer',\n templateUrl: 'html-renderer.component.html',\n styleUrls: ['html-renderer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsHtmlRendererComponent {\n\n @Input('html') public set setHtml(html) {\n this.trustedHtml = this.sanitized.bypassSecurityTrustHtml(html);\n this._cdRef.markForCheck();\n }\n\n public trustedHtml: SafeHtml;\n\n public constructor(\n private sanitized: DomSanitizer,\n private _cdRef: ChangeDetectorRef,\n ) { }\n\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { FsSkeletonModule } from '@firestitch/skeleton';\n\nimport { FsHtmlEditorComponent } from './components/html-editor/html-editor.component';\nimport { FsHtmlRendererComponent } from './components/html-renderer/html-renderer.component';\nimport { FsHtmlEditorConfig } from './interfaces/html-editor-config';\nimport { FS_HTML_EDITOR_CONFIG, FS_HTML_EDITOR_DEFAULT_CONFIG } from './injects/config.inject';\nimport { DefaultPlugin } from './enums/default-plugin.enum';\n\n\n@NgModule({\n imports: [\n CommonModule,\n FsSkeletonModule,\n ],\n exports: [\n FsHtmlEditorComponent,\n FsHtmlRendererComponent,\n ],\n declarations: [\n FsHtmlEditorComponent,\n FsHtmlRendererComponent,\n ],\n})\nexport class FsHtmlEditorModule {\n static forRoot(config: FsHtmlEditorConfig = {}): ModuleWithProviders<FsHtmlEditorModule> {\n return {\n ngModule: FsHtmlEditorModule,\n providers: [\n { provide: FS_HTML_EDITOR_DEFAULT_CONFIG, useValue: config },\n {\n provide: FS_HTML_EDITOR_CONFIG,\n useFactory: FsHtmlEditorConfigFactory,\n deps: [FS_HTML_EDITOR_DEFAULT_CONFIG]\n }\n ]\n };\n }\n}\n\nexport function FsHtmlEditorConfigFactory(config: FsHtmlEditorConfig) {\n return {\n defaultPlugins: [\n DefaultPlugin.Align,\n DefaultPlugin.Colors,\n DefaultPlugin.Image,\n DefaultPlugin.Link,\n DefaultPlugin.Lists,\n DefaultPlugin.ParagraphFormat,\n DefaultPlugin.Quote,\n DefaultPlugin.Table,\n DefaultPlugin.Url,\n DefaultPlugin.Video,\n DefaultPlugin.Draggable,\n DefaultPlugin.FontSize,\n ],\n ...config\n };\n}\n","// import { FroalaEditor } from 'froala-editor';\nimport { PluginConfig } from './../interfaces/plugin-config';\n\nexport class Plugin {\n\n public config: PluginConfig;\n public editor: any;\n\n public initialize() {}\n public destroy() {}\n\n}\n","import { debounce } from 'lodash-es';\nimport Tribute, { TributeItem } from 'tributejs';\n\nimport { MentionPluginConfig } from './configs/mention-plugin.config';\n\nimport { Plugin } from '../classes/plugin';\n\nimport { guid } from '@firestitch/common';\n\n\nexport class MentionPlugin extends Plugin {\n\n private static _currentGuid = null;\n private static _tributes = [];\n private _tribute;\n private _guid = guid();\n\n public constructor(public config: MentionPluginConfig) {\n super();\n this.config = {\n ...config,\n buttons: [\n {\n name: config.name,\n tooltip: config.tooltip,\n svgPath: config.iconPath,\n click: (editor) => {\n this._closeAll();\n this._tribute.showMenuForCollection(editor.el);\n }\n }\n ]\n };\n\n this._tribute = new Tribute({\n values: debounce(this._loadValues.bind(this), 200),\n searchOpts: {\n pre: '',\n post: '',\n skip: true\n },\n containerClass: `fs-html-editor-mention-container ${this.config.containerClass || ''}`,\n itemClass: `fs-html-editor-mention-menu-item ${this.config.menuItemClass || ''}`,\n trigger: this.config.trigger,\n allowSpaces: true,\n menuItemTemplate: (item: TributeItem<any>) => {\n return this.config.menuItemTemplate(item.original);\n },\n selectTemplate: (item: TributeItem<any>) => {\n const template = this.config.selectedTemplate(item.original);\n\n let p = document.createElement('p');\n p.innerHTML = template;\n\n let node = p.firstElementChild;\n if (!node) {\n node = document.createElement('span');\n node.innerHTML = template;\n }\n\n node.setAttribute('contenteditable', 'false');\n node.classList.add('fr-deletable');\n\n return node.outerHTML;\n },\n });\n\n MentionPlugin._tributes.push(this._tribute);\n }\n\n public initialize() {\n this._tribute.attach(this.editor.el);\n this.editor.events.on('keydown', (e) => {\n if (e.key === 'Enter' && this._tribute.isActive) {\n return false;\n }\n }, true);\n\n \n this.editor.el.addEventListener(\"tribute-replaced\", this.selected);\n }\n\n public selected = (event) => {\n if(this.config.selected) {\n if(MentionPlugin._currentGuid === this._guid) {\n this.config.selected(event.detail.item.original);\n }\n }\n }\n\n public destroy() {\n this.editor.el.removeEventListener(\"tribute-replaced\", this.selected);\n }\n\n private _closeAll() {\n MentionPlugin._tributes.forEach((tribute) => {\n if (tribute.menu) {\n tribute.hideMenu();\n }\n });\n }\n\n private _loadValues(keyword, cb) {\n MentionPlugin._currentGuid = this._guid;\n return this.config.fetch(keyword)\n .subscribe((data) => {\n cb(data);\n });\n }\n}\n","import { Plugin } from '../classes/plugin';\n\nimport { PluginConfig } from './../interfaces/plugin-config';\n\n\nexport class ChecklistPlugin extends Plugin {\n\n public constructor(public config: PluginConfig = { name: 'checklist' }) {\n super();\n this.config = {\n ...config,\n name: 'checklist',\n buttons: [\n {\n name: 'checklist',\n svgPath: 'M8.4,10.3l-1.2,1.2l4,4L20,6.7l-1.2-1.2l-7.6,7.6L8.4,10.3z M18.2,18.2H5.8V5.8h8.9V4H5.8C4.8,4,4,4.8,4,5.8v12.4c0,1,0.8,1.8,1.8,1.8h12.4c1,0,1.8-0.8,1.8-1.8v-7.1h-1.8V18.2z',\n click: (editor) => {\n editor.html.insert('<ul class=\"checklist\"><li></li></ul>');\n }\n }\n ]\n };\n }\n\n public initialize() {\n this.editor.events.on('click', (e) => {\n const li = e.target;\n if (li.nodeName === 'LI' && e.offsetX < 0) {\n\n const items = [li, ...li.querySelectorAll('li')];\n\n if (li.classList.contains('checked')) {\n items.forEach((item) => {\n item.classList.remove('checked');\n });\n } else {\n items.forEach((item) => {\n item.classList.add('checked');\n });\n }\n }\n\n }, false);\n }\n\n}\n","import { Plugin } from '../classes/plugin';\n\nimport { PluginConfig } from './../interfaces/plugin-config';\n\n\nexport class CodePlugin extends Plugin {\n\n public constructor(public config: PluginConfig = { name: 'code' }) {\n super();\n this.config = {\n ...config,\n name: 'code',\n buttons: [\n {\n name: 'code',\n svgPath: 'M8.9,7.3L4.2,12l4.7,4.7l1.1-1.1L6.4,12L10,8.4L8.9,7.3z M15.1,7.3L14,8.4l3.6,3.6L14,15.6l1.1,1.1l4.7-4.7L15.1,7.3z',\n click: (editor) => {\n const node = editor.selection.get();\n const codeEl = this._getCodeEl(node.baseNode);\n if (codeEl) {\n codeEl.classList.remove('code');\n } else {\n editor.html.insert('<p class=\"code\">' + editor.selection.get().toString().replace(/\\n{1,}/g,'<br>') + '</p>');\n }\n }\n }\n ]\n };\n }\n\n public initialize() {\n this.editor.events.on('keydown', (e) => {\n if (e.keyCode === 13) {\n const selection = this.editor.selection.get();\n\n if (selection && this._getCodeEl(selection.baseNode)) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n let br = '<br>';\n const base = selection.baseNode;\n if (base.nodeName === '#text' && selection.baseOffset === base.length) {\n\n if (!(base.nextSibling && base.nextSibling.nodeName === 'BR')) {\n br += '<br>';\n }\n } else {\n const el: any = Array.from(base.childNodes).splice(selection.baseOffset - 1, 1).pop();\n if (el && el.nodeName !== 'BR') {\n br += '<br>';\n }\n }\n\n this.editor.html.insert(br);\n return false;\n }\n }\n }, true);\n }\n\n public destroy() {}\n\n private _getCodeEl(el) {\n\n if (el) {\n if (el.classList && el.classList.contains('code')) {\n return el;\n }\n\n if (el.parentElement) {\n return this._getCodeEl(el.parentElement);\n }\n }\n\n return null;\n }\n}\n","import { ScreenRecordPluginConfig } from './configs/screen-record-plugin.config';\nimport { Plugin } from '../classes/plugin';\nimport { ResourceLoader } from '../utils/loader';\n\n\ndeclare var MediaRecorder: any;\n\nexport class ScreenRecordPlugin extends Plugin {\n\n private _activeEl;\n\n public constructor(public config: ScreenRecordPluginConfig = {}) {\n super();\n\n this.config = {\n ...config,\n name: config.name || 'screenRecord',\n buttons: [\n {\n name: 'screenRecord',\n svgPath: `M14.7,7.7v6.1H7.1V7.7H14.7 M16.3,9.6V6.9c0-0.4-0.3-0.8-0.8-0.8H6.4c-0.4,0-0.8,0.3-0.8,0.8v7.6c0,0.4,0.3,0.8,0.8,0.8h9.1c0.4,0,0.8-0.3,0.8-0.8v-2.7l1.7,1.7c0.3,0.3,0.8,0.3,1.1,0c0.1-0.1,0.2-0.3,0.2-0.5V8.4c0-0.4-0.3-0.8-0.8-0.8\n\tc-0.2,0-0.4,0.1-0.5,0.2L16.3,9.6z M21.5,1.6H2.9c-0.7,0-1.3,0.7-1.3,1.6v14.6c0,0.9,0.6,1.6,1.3,1.6h7.6v1.1l-5,1c-0.2,0-0.4,0.3-0.4,0.6c0,0.3,0.2,0.4,0.4,0.4c0,0,0,0,0.1,0l5.3-1h2.6l5.3,1c0,0,0,0,0.1,0c0.2,0,0.4-0.2,0.4-0.4\n c0-0.3-0.1-0.6-0.4-0.6l-5-1v-1.1h7.6c0.7,0,1.3-0.7,1.3-1.6V3.2C22.9,2.3,22.3,1.6,21.5,1.6z M21.1,17.3H3.3V3.7h17.8L21.1,17.3L21.1,17.3z`,\n tooltip: 'Screen Record',\n click: (editor) => {\n\n (<any>navigator).mediaDevices.getDisplayMedia({ video: true })\n .then((stream) => {\n const chunks = [];\n const options = { mimeType: 'video/webm; codecs=vp9' };\n let mediaRecorder = new MediaRecorder(stream, options);\n\n stream.addEventListener('inactive', (e) => {\n mediaRecorder.stop();\n mediaRecorder = null;\n stream.getTracks().forEach((track) => track.stop());\n stream = null;\n\n const blob = new Blob(chunks, { type: 'video/webm' });\n config.upload(blob)\n .subscribe((url) => {\n editor.html.insert(`<span class=\"fr-screen-record fr-deletable fr-draggable\"><video controls style=\"max-width:${config.maxWidth}\"><source src=\"${url}\" type=\"video/webm\"></video></span>`);\n });\n });\n\n mediaRecorder.addEventListener('dataavailable', (event) => {\n if (event.data && event.data.size > 0) {\n chunks.push(event.data);\n }\n });\n\n mediaRecorder.start(10);\n })\n .catch((e) => { });\n }\n }\n ]\n };\n }\n\n public async initialize() {\n await ResourceLoader.loadStyles('froala')\n .toPromise();\n\n const FroalaEditor = (window as any).FroalaEditor;\n\n this.editor.events.on('mouseup', (e) => {\n const el = this._getEl(e.target);\n\n if (el) {\n this.editor.popups.hideAll();\n this._activeEl = el;\n this._showPopup(el);\n }\n });\n\n FroalaEditor.POPUP_TEMPLATES[\"screenRecordPlugin.popup\"] = '[_BUTTONS_]';\n\n FroalaEditor.DefineIcon('popupClose', { NAME: 'trash', SVG_KEY: 'remove' });\n FroalaEditor.RegisterCommand('popupClose', {\n title: 'Remove',\n undo: false,\n focus: false,\n callback: () => {\n if (this._activeEl) {\n this._activeEl.remove();\n }\n }\n });\n }\n\n private _createPopup() {\n\n const template = {\n buttons: `<div class=\"fr-buttons\">${this.editor.button.buildList(['popupClose'])}</div>`,\n };\n\n return this.editor.popups.create('screenRecordPlugin.popup', template);\n }\n\n private _showPopup (el) {\n var $popup = this.editor.popups.get('screenRecordPlugin.popup');\n\n if (!$popup) {\n $popup = this._createPopup();\n }\n\n this.editor.popups.setContainer('screenRecordPlugin.popup', this.editor.$(el));\n\n const left = el.offsetLeft + el.offsetWidth / 2;\n\n this.editor.popups.show('screenRecordPlugin.popup', left, null);\n }\n\n private _getEl(el) {\n if (el && el.classList) {\n if (el.classList.contains('fr-screen-record'))\n return el;\n\n return this._getEl(el.parentNode);\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export class Plugin {
|
|
2
|
-
initialize() { }
|
|
3
|
-
destroy() { }
|
|
4
|
-
}
|
|
1
|
+
export class Plugin {
|
|
2
|
+
initialize() { }
|
|
3
|
+
destroy() { }
|
|
4
|
+
}
|
|
5
5
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvaHRtbC1lZGl0b3IvIiwic291cmNlcyI6WyJhcHAvY2xhc3Nlcy9wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLE1BQU07SUFLVixVQUFVLEtBQUksQ0FBQztJQUNmLE9BQU8sS0FBSSxDQUFDO0NBRXBCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHsgRnJvYWxhRWRpdG9yIH0gZnJvbSAnZnJvYWxhLWVkaXRvcic7XG5pbXBvcnQgeyBQbHVnaW5Db25maWcgfSBmcm9tICcuLy4uL2ludGVyZmFjZXMvcGx1Z2luLWNvbmZpZyc7XG5cbmV4cG9ydCBjbGFzcyBQbHVnaW4ge1xuXG4gIHB1YmxpYyBjb25maWc6IFBsdWdpbkNvbmZpZztcbiAgcHVibGljIGVkaXRvcjogYW55O1xuXG4gIHB1YmxpYyBpbml0aWFsaXplKCkge31cbiAgcHVibGljIGRlc3Ryb3koKSB7fVxuXG59XG4iXX0=
|