UNPKG

@progress/kendo-react-editor

Version:

React Editor enables users to create rich text content through a WYSIWYG interface. KendoReact Editor package

9 lines (8 loc) 8.58 kB
/** * @license *------------------------------------------------------------------------------------------- * Copyright © 2026 Progress Software Corporation. All rights reserved. * Licensed under commercial license. See LICENSE.md in the package root for more information *------------------------------------------------------------------------------------------- */ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const B=require("react"),i=require("prop-types"),w=require("@progress/kendo-react-buttons"),E=require("@progress/kendo-react-common"),n=require("@progress/kendo-editor-common"),_=require("./config/defaultStyles.js"),I=require("./config/toolsSettings.js"),x=require("./dialogs/index.js"),S=require("./utils/index.js"),D=require("./utils/props-key.js"),F=require("./utils/controlled-value.js"),M=require("./package-metadata.js"),O=require("./messages/index.js"),q=require("@progress/kendo-react-intl");function L(v){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(v){for(const e in v)if(e!=="default"){const t=Object.getOwnPropertyDescriptor(v,e);Object.defineProperty(a,e,t.get?t:{enumerable:!0,get:()=>v[e]})}}return a.default=v,Object.freeze(a)}const h=L(B),{link:N,bold:W,italic:j,underline:z}=I.EditorToolsSettings,P=class P extends h.Component{constructor(a){super(a),this.state={view:void 0,linkDialog:!1},this._element=null,this._contentElement=null,this.iframe=null,this.trOnChange=null,this.htmlOnChange=null,this.showLicenseWatermark=!1,this.focus=()=>{this.view&&this.view.focus()},this.renderDialog=(e,t,s)=>this.state[s]&&h.createElement(e,{view:this.view,settings:t,dir:this.props.dir,onClose:()=>this.setState({[s]:!1})}),this.renderTool=(e,t,s=!1)=>{const d=h.createElement(e,{view:this.view,dir:this.props.dir,key:t,className:s?"k-toolbar-button":void 0});return d.type===w.ToolbarSeparator?h.createElement(e,{key:t}):d},this.updateTools=(e,t)=>{this.setState({view:e})},this.filterTransaction=(e,t)=>{const s={target:this,transaction:e,state:t};return(this.props.onExecute&&this.props.onExecute.call(void 0,s))!==!1},this.onPasteHtml=e=>{if(this.props.onPasteHtml&&this.pasteEvent){const t={target:this,pastedHtml:e,nativeEvent:this.pasteEvent},s=this.props.onPasteHtml.call(void 0,t);if(this.pasteEvent=void 0,typeof s=="string")return s}return e},this.dispatchTransaction=e=>{const t=e.docChanged;if(this.props.onChange&&t){this.trOnChange=e;const s=e.doc,d=e.doc.type.schema,m={target:this,value:s,html:"",transaction:e,schema:d};Object.defineProperty(m,"html",{get:()=>(this.htmlOnChange=S.EditorUtils.getHtml({doc:s,schema:d}),this.htmlOnChange)}),this.props.onChange.call(void 0,m)}this.view&&(this.props.value===void 0||!t)&&this.view.updateState(this.view.state.apply(e))},this.onFocus=(e,t)=>{if(this.props.onFocus){const s={target:this,nativeEvent:t};this.props.onFocus.call(void 0,s)}return!1},this.onBlur=(e,t)=>{if(this.props.onBlur){const s={target:this,nativeEvent:t};this.props.onBlur.call(void 0,s)}return!1},this.onPaste=(e,t)=>(this.props.onPasteHtml&&(this.pasteEvent=t),!1),this.onIFrameInit=e=>{if(this.props.onIFrameInit){const t={target:this,iframe:e};this.props.onIFrameInit.call(void 0,t)}return!1},this.showLicenseWatermark=!E.validatePackage(M.packageMetadata,{component:"Editor"}),this.licenseMessage=E.getLicenseMessage(M.packageMetadata)}get value(){return this.trOnChange!==null?this.trOnChange.doc:this.props.value!==void 0?this.props.value:this.view?this.view.state.doc:this.props.defaultContent||""}get element(){return this._element}get contentElement(){return this._contentElement}get view(){return this._view}componentDidMount(){this.initialize()}componentDidUpdate(a){const{value:e}=this.props,t=this.view;e===void 0||!t||(F.updateEditorValue(t,e,a.value,this.trOnChange,this.htmlOnChange),this.trOnChange=null,this.htmlOnChange=null)}componentWillUnmount(){var e;this.view&&this.view.destroy(),this._view=void 0;const a=(e=this.iframe)==null?void 0:e.contentWindow;if(a){this._contentElement&&this._contentElement.parentNode&&this._contentElement.parentNode.removeChild(this._contentElement);const t=a.document.head;for(;t&&t.firstChild;)t.removeChild(t.firstChild)}}render(){const{tools:a=[],defaultEditMode:e="iframe",preserveWhitespace:t="full",style:s,className:d}=this.props,m=q.provideLocalizationService(this);if(this.view){const o=D.editorPropsKey.getState(this.view.state);o.preserveWhitespace=t}let p=this.props.contentStyle;p===void 0&&(s||{}).height===void 0&&(p={height:"300px"});const f=(o,u)=>o.displayName||o.name||`tool-${u}`,C=(o,u)=>o.map((r,l)=>f(r,l)).join("-")||`group-${u}`,g=a.map((o,u)=>Array.isArray(o)?h.createElement(w.ButtonGroup,{key:C(o,u),className:"k-toolbar-button-group"},o.map((r,l)=>this.renderTool(r,f(r,l)))):this.renderTool(o,f(o,u),!0));return h.createElement("div",{ref:o=>{this._element=o},className:E.classNames("k-editor",d,{"k-editor-resizable":this.props.resizable}),dir:this.props.dir,style:s},g.length>0&&h.createElement(w.Toolbar,{className:"k-editor-toolbar",keyboardNavigation:this.props.keyboardNavigation},g),e==="iframe"?h.createElement("div",{className:"k-editor-content"},h.createElement("iframe",{ref:o=>{this.iframe=o},frameBorder:"0",title:m.toLanguageString(O.keys.iframeTitle,O.messages[O.keys.iframeTitle]),style:p,className:"k-iframe"})):h.createElement("div",{style:p,className:"k-editor-content"},h.createElement("div",{ref:o=>{this._contentElement=o},suppressContentEditableWarning:!0,role:"textbox","aria-labelledby":this.props.ariaLabelledBy,"aria-describedby":this.props.ariaDescribedBy,"aria-label":this.props.ariaLabel})),this.renderDialog(x.EditorDialogs.InsertLinkDialog,N,"linkDialog"),this.showLicenseWatermark&&h.createElement(E.WatermarkOverlay,{message:this.licenseMessage}))}initialize(){const a=this.iframe&&this.iframe.contentWindow;if(a){const r=a.document,l=r.createElement("meta");l.setAttribute("charset","utf-8"),r.head.appendChild(l),this._contentElement=r.createElement("div"),r.body.appendChild(this._contentElement),this._contentElement.classList.add("k-content"),this.iframe&&this.props.onIFrameInit?this.onIFrameInit(this.iframe):[_.defaultStyle,_.tablesStyles,this.props.dir==="rtl"?_.rtlStyles:void 0].forEach(c=>{if(c){const y=r.createElement("style");y.appendChild(r.createTextNode(c)),r.head.appendChild(y)}})}const e=this._contentElement;if(!e)return;const{preserveWhitespace:t="full"}=this.props,s=[new n.Plugin({view:(()=>({update:this.updateTools})),key:new n.PluginKey("toolbar-tools-update-plugin")}),new n.Plugin({filterTransaction:this.filterTransaction,key:new n.PluginKey("onExecute-event-plugin")}),new n.Plugin({key:D.editorPropsKey,state:{init:()=>({preserveWhitespace:t}),apply:(r,l)=>l}}),n.spacesFix(),n.caretColor(),n.history(),n.dropCursor(),n.gapCursor(),n.tableEditing(),n.cspFix()],d={...S.EditorUtils.getShortcuts({types:{listItem:"list_item",hardBreak:"hard_break"},toolsSettings:{bold:W,italic:j,underline:z}}),"Mod-k":()=>{const{linkDialog:r}=this.state,l=this.view;if(l){const c=l.state,y=c.selection.empty,b=n.getMark(c,c.schema.marks[N.mark]);!r&&!(y&&!b)&&this.setState({linkDialog:!0})}return!r},"Alt-F10":()=>{var l;const r=(l=this.element)==null?void 0:l.querySelector(".k-toolbar");if(r){const c=r.querySelector(w.toolbarButtons.join(","));if(c)return c.focus(),!0}return!1}},{defaultContent:m="",value:p,onMount:f}=this.props,C=p&&typeof p!="string"?p:S.EditorUtils.createDocument(new n.Schema({nodes:n.nodes,marks:n.marks}),p||m,{preserveWhitespace:t}),g={state:n.EditorState.create({plugins:[...s,n.keymap(d),n.keymap(n.baseKeymap)],doc:C}),transformPastedHTML:this.onPasteHtml,dispatchTransaction:this.dispatchTransaction,handleDOMEvents:{focus:this.onFocus,blur:this.onBlur,paste:this.onPaste},handleDrop:(r,l,c,y)=>{let b=!1;return c.content.nodesBetween(0,c.content.size,T=>{b=b||T.type.name==="table_caption_external"}),b}},o={plugins:s,shortcuts:d,target:this,viewProps:g,dom:e},u=this._view=f&&f.call(void 0,o)||new n.EditorView({mount:e},g);this.setState({view:u})}};P.propTypes={defaultContent:i.string,value:i.oneOfType([i.object,i.string]),defaultEditMode:i.oneOf(["iframe","div"]),contentStyle:i.object,dir:i.string,className:i.string,ariaDescribedBy:i.string,ariaLabelledBy:i.string,ariaLabel:i.string,style:i.object,tools:i.arrayOf(i.any),keyboardNavigation:i.bool,resizable:i.bool,preserveWhitespace:i.oneOf([!0,!1,"full"]),onMount:i.func,onFocus:i.func,onBlur:i.func,onChange:i.func,onPasteHtml:i.func,onExecute:i.func,onIFrameInit:i.func};let k=P;q.registerForLocalization(k);exports.Editor=k;