From 5df772b5ee0b67eb224e40ddecde73e9b9e83647 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Fri, 7 Feb 2025 11:18:38 +0000 Subject: [PATCH] Allow uploading and editing files --- .../filament/forms/components/rich-editor.js | 2 +- packages/forms/dist/components/rich-editor.js | 2 +- .../resources/js/components/rich-editor.js | 2 +- .../views/components/rich-editor.blade.php | 2 + packages/forms/src/Components/RichEditor.php | 2 + .../RichEditor/Actions/AttachFilesAction.php | 89 +++++++++++++++++++ .../RichEditor/Actions/LinkAction.php | 2 +- 7 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 packages/forms/src/Components/RichEditor/Actions/AttachFilesAction.php diff --git a/docs-assets/app/public/js/filament/forms/components/rich-editor.js b/docs-assets/app/public/js/filament/forms/components/rich-editor.js index ed792b4469..517746cf6a 100644 --- a/docs-assets/app/public/js/filament/forms/components/rich-editor.js +++ b/docs-assets/app/public/js/filament/forms/components/rich-editor.js @@ -93,4 +93,4 @@ img.ProseMirror-separator { `,Ap="\uFE0F",Np="\u200D",Rs="\uFFFC",br=null,kr=null;function Ip(n=[]){let e={};ce.groups=e;let t=new ce;br==null&&(br=cc(Mp)),kr==null&&(kr=cc(Cp)),k(t,"'",Us),k(t,"{",On),k(t,"}",An),k(t,"[",Mr),k(t,"]",Cr),k(t,"(",wr),k(t,")",Er),k(t,"<",Tr),k(t,">",Or),k(t,"\uFF08",Ar),k(t,"\uFF09",Nr),k(t,"\u300C",Ir),k(t,"\u300D",Dr),k(t,"\u300E",vr),k(t,"\u300F",Rr),k(t,"\uFF1C",Pr),k(t,"\uFF1E",Lr),k(t,"&",Br),k(t,"*",zr),k(t,"@",ct),k(t,"`",$r),k(t,"^",Hr),k(t,":",ut),k(t,",",Js),k(t,"$",Vr),k(t,".",Le),k(t,"=",jr),k(t,"!",qs),k(t,"-",Me),k(t,"%",Nn),k(t,"|",Wr),k(t,"+",Kr),k(t,"#",Ur),k(t,"?",In),k(t,'"',_s),k(t,"/",Be),k(t,";",Gs),k(t,"~",Dn),k(t,"_",Jr),k(t,"\\",Fr),k(t,"\u30FB",gc);let r=j(t,Ge,Ws,{[Ls]:!0});j(r,Ge,r);let i=j(r,_e,pc,{[Tn]:!0}),s=j(r,wn,mc,{[En]:!0}),o=j(t,_e,Ye,{[Bs]:!0});j(o,Ge,i),j(o,_e,o),j(i,Ge,i),j(i,_e,i);let l=j(t,wn,$s,{[zs]:!0});j(l,_e),j(l,Ge,s),j(l,wn,l),j(s,Ge,s),j(s,_e),j(s,wn,s);let a=k(t,vs,Ks,{[Ns]:!0}),c=k(t,ac,js,{[Ns]:!0}),u=j(t,Ds,js,{[Ns]:!0});k(t,Rs,u),k(c,vs,a),k(c,Rs,u),j(c,Ds,u),k(u,ac),k(u,vs),j(u,Ds,u),k(u,Rs,u);let d=j(t,Is,yc,{[hc]:!0});k(d,"#"),j(d,Is,d),k(d,Ap,d);let f=k(d,Np);k(f,"#"),j(f,Is,d);let h=[[_e,o],[Ge,i]],p=[[_e,null],[wn,l],[Ge,s]];for(let m=0;mm[0]>g[0]?1:-1);for(let m=0;m=0?S[Fs]=!0:_e.test(g)?Ge.test(g)?S[Tn]=!0:S[Bs]=!0:S[Ls]=!0,lc(t,g,g,S)}return lc(t,"localhost",vn,{ascii:!0}),t.jd=new ce(qr),{start:t,tokens:Xt({groups:e},bc)}}function kc(n,e){let t=Dp(e.replace(/[A-Z]/g,l=>l.toLowerCase())),r=t.length,i=[],s=0,o=0;for(;o=0&&(d+=t[o].length,f++),c+=t[o].length,s+=t[o].length,o++;s-=d,o-=f,c-=d,i.push({t:u.t,v:e.slice(s-c,s),s:s-c,e:s})}return i}function Dp(n){let e=[],t=n.length,r=0;for(;r56319||r+1===t||(s=n.charCodeAt(r+1))<56320||s>57343?n[r]:n.slice(r,r+2);e.push(o),r+=o.length}return e}function at(n,e,t,r,i){let s,o=e.length;for(let l=0;l=0;)s++;if(s>0){e.push(t.join(""));for(let o=parseInt(n.substring(r,r+s),10);o>0;o--)t.pop();r+=s}else t.push(n[r]),r++}return e}var Rn={defaultProtocol:"http",events:null,format:uc,formatHref:uc,nl2br:!1,tagName:"a",target:null,rel:null,validate:!0,truncate:1/0,className:null,attributes:null,ignoreTags:[],render:null};function Ys(n,e=null){let t=Xt({},Rn);n&&(t=Xt(t,n instanceof Ys?n.o:n));let r=t.ignoreTags,i=[];for(let s=0;st?r.substring(0,t)+"\u2026":r},toFormattedHref(n){return n.get("formatHref",this.toHref(n.get("defaultProtocol")),this)},startIndex(){return this.tk[0].s},endIndex(){return this.tk[this.tk.length-1].e},toObject(n=Rn.defaultProtocol){return{type:this.t,value:this.toString(),isLink:this.isLink,href:this.toHref(n),start:this.startIndex(),end:this.endIndex()}},toFormattedObject(n){return{type:this.t,value:this.toFormattedString(n),isLink:this.isLink,href:this.toFormattedHref(n),start:this.startIndex(),end:this.endIndex()}},validate(n){return n.get("validate",this.toString(),this)},render(n){let e=this,t=this.toHref(n.get("defaultProtocol")),r=n.get("formatHref",t,this),i=n.get("tagName",t,e),s=this.toFormattedString(n),o={},l=n.get("className",t,e),a=n.get("target",t,e),c=n.get("rel",t,e),u=n.getObj("attributes",t,e),d=n.getObj("events",t,e);return o.href=r,l&&(o.class=l),a&&(o.target=a),c&&(o.rel=c),u&&Xt(o,u),{tagName:i,attributes:o,content:s,eventListeners:d}}};function _r(n,e){class t extends xc{constructor(i,s){super(i,s),this.t=n}}for(let r in e)t.prototype[r]=e[r];return t.t=n,t}var dc=_r("email",{isLink:!0,toHref(){return"mailto:"+this.toString()}}),fc=_r("text"),vp=_r("nl"),xr=_r("url",{isLink:!0,toHref(n=Rn.defaultProtocol){return this.hasProtocol()?this.v:`${n}://${this.v}`},hasProtocol(){let n=this.tk;return n.length>=2&&n[0].t!==vn&&n[1].t===ut}});var Se=n=>new ce(n);function Rp({groups:n}){let e=n.domain.concat([Br,zr,ct,Fr,$r,Hr,Vr,jr,Me,Ws,Nn,Wr,Kr,Ur,Be,qr,Dn,Jr]),t=[ut,Js,Le,qs,Nn,In,_s,Gs,Tr,Or,On,An,Cr,Mr,wr,Er,Ar,Nr,Ir,Dr,vr,Rr,Pr,Lr],r=[Br,Us,zr,Fr,$r,Hr,Vr,jr,Me,On,An,Nn,Wr,Kr,Ur,In,Be,qr,Dn,Jr],i=Se(),s=k(i,Dn);A(s,r,s),A(s,n.domain,s);let o=Se(),l=Se(),a=Se();A(i,n.domain,o),A(i,n.scheme,l),A(i,n.slashscheme,a),A(o,r,s),A(o,n.domain,o);let c=k(o,ct);k(s,ct,c),k(l,ct,c),k(a,ct,c);let u=k(s,Le);A(u,r,s),A(u,n.domain,s);let d=Se();A(c,n.domain,d),A(d,n.domain,d);let f=k(d,Le);A(f,n.domain,d);let h=Se(dc);A(f,n.tld,h),A(f,n.utld,h),k(c,vn,h);let p=k(d,Me);k(p,Me,p),A(p,n.domain,d),A(h,n.domain,d),k(h,Le,f),k(h,Me,p);let m=k(h,ut);A(m,n.numeric,dc);let g=k(o,Me),y=k(o,Le);k(g,Me,g),A(g,n.domain,o),A(y,r,s),A(y,n.domain,o);let S=Se(xr);A(y,n.tld,S),A(y,n.utld,S),A(S,n.domain,o),A(S,r,s),k(S,Le,y),k(S,Me,g),k(S,ct,c);let O=k(S,ut),P=Se(xr);A(O,n.numeric,P);let E=Se(xr),R=Se();A(E,e,E),A(E,t,R),A(R,e,E),A(R,t,R),k(S,Be,E),k(P,Be,E);let q=k(l,ut),Y=k(a,ut),I=k(Y,Be),fe=k(I,Be);A(l,n.domain,o),k(l,Le,y),k(l,Me,g),A(a,n.domain,o),k(a,Le,y),k(a,Me,g),A(q,n.domain,E),k(q,Be,E),k(q,In,E),A(fe,n.domain,E),A(fe,e,E),k(fe,Be,E);let dt=[[On,An],[Mr,Cr],[wr,Er],[Tr,Or],[Ar,Nr],[Ir,Dr],[vr,Rr],[Pr,Lr]];for(let Zt=0;Zt=0&&f++,i++,u++;if(f<0)i-=u,i0&&(s.push(Ps(fc,e,o)),o=[]),i-=f,u-=f;let h=d.t,p=t.slice(i-u,i);s.push(Ps(h,e,p))}}return o.length>0&&s.push(Ps(fc,e,o)),s}function Ps(n,e,t){let r=t[0].s,i=t[t.length-1].e,s=e.slice(r,i);return new n(s,t)}var Lp=typeof console<"u"&&console&&console.warn||(()=>{}),Bp="until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.",B={scanner:null,parser:null,tokenQueue:[],pluginQueue:[],customSchemes:[],initialized:!1};function Sc(){return ce.groups={},B.scanner=null,B.parser=null,B.tokenQueue=[],B.pluginQueue=[],B.customSchemes=[],B.initialized=!1,B}function Qs(n,e=!1){if(B.initialized&&Lp(`linkifyjs: already initialized - will not register custom scheme "${n}" ${Bp}`),!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(n))throw new Error(`linkifyjs: incorrect scheme format. 1. Must only contain digits, lowercase ASCII letters or "-" 2. Cannot start or end with "-" -3. "-" cannot repeat`);B.customSchemes.push([n,e])}function zp(){B.scanner=Ip(B.customSchemes);for(let n=0;n{let i=e.some(c=>c.docChanged)&&!t.doc.eq(r.doc),s=e.some(c=>c.getMeta("preventAutolink"));if(!i||s)return;let{tr:o}=r,l=Ha(t.doc,[...e]);if(ja(l).forEach(({newRange:c})=>{let u=Va(r.doc,c,h=>h.isTextblock),d,f;if(u.length>1?(d=u[0],f=r.doc.textBetween(d.pos,d.pos+d.node.nodeSize,void 0," ")):u.length&&r.doc.textBetween(c.from,c.to," "," ").endsWith(" ")&&(d=u[0],f=r.doc.textBetween(d.pos,c.to,void 0," ")),d&&f){let h=f.split(" ").filter(y=>y!=="");if(h.length<=0)return!1;let p=h[h.length-1],m=d.pos+f.lastIndexOf(p);if(!p)return!1;let g=Gr(p).map(y=>y.toObject(n.defaultProtocol));if(!Fp(g))return!1;g.filter(y=>y.isLink).map(y=>({...y,from:m+y.start+1,to:m+y.end+1})).filter(y=>r.schema.marks.code?!r.doc.rangeHasMark(y.from,y.to,r.schema.marks.code):!0).filter(y=>n.validate(y.value)).filter(y=>n.shouldAutoLink(y.value)).forEach(y=>{pr(y.from,y.to,r.doc).some(S=>S.mark.type===n.type)||o.addMark(y.from,y.to,n.type.create({href:y.href}))})}}),!!o.steps.length)return o}})}function Hp(n){return new F({key:new W("handleClickLink"),props:{handleClick:(e,t,r)=>{var i,s;if(r.button!==0||!e.editable)return!1;let o=r.target,l=[];for(;o.nodeName!=="DIV";)l.push(o),o=o.parentNode;if(!l.find(f=>f.nodeName==="A"))return!1;let a=Ms(e.state,n.type.name),c=r.target,u=(i=c?.href)!==null&&i!==void 0?i:a.href,d=(s=c?.target)!==null&&s!==void 0?s:a.target;return c&&u?(window.open(u,d),!0):!1}}})}function Vp(n){return new F({key:new W("handlePasteLink"),props:{handlePaste:(e,t,r)=>{let{state:i}=e,{selection:s}=i,{empty:o}=s;if(o)return!1;let l="";r.content.forEach(c=>{l+=c.textContent});let a=Xs(l,{defaultProtocol:n.defaultProtocol}).find(c=>c.isLink&&c.value===l);return!l||!a?!1:n.editor.commands.setMark(n.type,{href:a.href})}}})}var jp=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g;function It(n,e){let t=["http","https","ftp","ftps","mailto","tel","callto","sms","cid","xmpp"];return e&&e.forEach(r=>{let i=typeof r=="string"?r:r.scheme;i&&t.push(i)}),!n||n.replace(jp,"").match(new RegExp(`^(?:(?:${t.join("|")}):|[^a-z]|[a-z0-9+.-]+(?:[^a-z+.-:]|$))`,"i"))}var Mc=V.create({name:"link",priority:1e3,keepOnSplit:!1,exitable:!0,onCreate(){this.options.validate&&!this.options.shouldAutoLink&&(this.options.shouldAutoLink=this.options.validate,console.warn("The `validate` option is deprecated. Rename to the `shouldAutoLink` option instead.")),this.options.protocols.forEach(n=>{if(typeof n=="string"){Qs(n);return}Qs(n.scheme,n.optionalSlashes)})},onDestroy(){Sc()},inclusive(){return this.options.autolink},addOptions(){return{openOnClick:!0,linkOnPaste:!0,autolink:!0,protocols:[],defaultProtocol:"http",HTMLAttributes:{target:"_blank",rel:"noopener noreferrer nofollow",class:null},isAllowedUri:(n,e)=>!!It(n,e.protocols),validate:n=>!!n,shouldAutoLink:n=>!!n}},addAttributes(){return{href:{default:null,parseHTML(n){return n.getAttribute("href")}},target:{default:this.options.HTMLAttributes.target},rel:{default:this.options.HTMLAttributes.rel},class:{default:this.options.HTMLAttributes.class}}},parseHTML(){return[{tag:"a[href]",getAttrs:n=>{let e=n.getAttribute("href");return!e||!this.options.isAllowedUri(e,{defaultValidate:t=>!!It(t,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?!1:null}}]},renderHTML({HTMLAttributes:n}){return this.options.isAllowedUri(n.href,{defaultValidate:e=>!!It(e,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?["a",v(this.options.HTMLAttributes,n),0]:["a",v(this.options.HTMLAttributes,{...n,href:""}),0]},addCommands(){return{setLink:n=>({chain:e})=>{let{href:t}=n;return this.options.isAllowedUri(t,{defaultValidate:r=>!!It(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?e().setMark(this.name,n).setMeta("preventAutolink",!0).run():!1},toggleLink:n=>({chain:e})=>{let{href:t}=n;return this.options.isAllowedUri(t,{defaultValidate:r=>!!It(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?e().toggleMark(this.name,n,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run():!1},unsetLink:()=>({chain:n})=>n().unsetMark(this.name,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()}},addPasteRules(){return[ke({find:n=>{let e=[];if(n){let{protocols:t,defaultProtocol:r}=this.options,i=Xs(n).filter(s=>s.isLink&&this.options.isAllowedUri(s.value,{defaultValidate:o=>!!It(o,t),protocols:t,defaultProtocol:r}));i.length&&i.forEach(s=>e.push({text:s.value,data:{href:s.href},index:s.start}))}return e},type:this.type,getAttributes:n=>{var e;return{href:(e=n.data)===null||e===void 0?void 0:e.href}}})]},addProseMirrorPlugins(){let n=[],{protocols:e,defaultProtocol:t}=this.options;return this.options.autolink&&n.push($p({type:this.type,defaultProtocol:this.options.defaultProtocol,validate:r=>this.options.isAllowedUri(r,{defaultValidate:i=>!!It(i,e),protocols:e,defaultProtocol:t}),shouldAutoLink:this.options.shouldAutoLink})),this.options.openOnClick===!0&&n.push(Hp({type:this.type})),this.options.linkOnPaste&&n.push(Vp({editor:this.editor,defaultProtocol:this.options.defaultProtocol,type:this.type})),n}});var Cc=L.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:n}){return["li",v(this.options.HTMLAttributes,n),0]},addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}});var wc=["image/png","image/jpeg","image/gif","image/webp"],Yr=(n,e,t={})=>{n.dom.closest("form")?.dispatchEvent(new CustomEvent(e,{composed:!0,cancelable:!0,detail:t}))},Wp=({editor:n,key:e,statePath:t,uploadingMessage:r,$wire:i})=>{let s=o=>i().callSchemaComponentMethod(e,"saveUploadedFileAttachment",{attachment:o});return new F({key:new W("localFiles"),props:{handleDrop(o,l){if(!l.dataTransfer?.files.length)return!1;let a=Array.from(l.dataTransfer.files).filter(u=>wc.includes(u.type));if(!a.length)return!1;Yr(o,"form-processing-started",{message:r}),l.preventDefault(),l.stopPropagation();let c=o.posAtCoords({left:l.clientX,top:l.clientY});return a.forEach((u,d)=>{n.setEditable(!1),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:e,livewireId:i().id}}));let f=new FileReader;f.readAsDataURL(u),f.onload=()=>{n.chain().insertContentAt(c?.pos??0,{type:"image",attrs:{class:"fi-loading",src:f.result}}).run()};let h=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,p=>(p^crypto.getRandomValues(new Uint8Array(1))[0]&15>>p/4).toString(16));i().upload(`componentFileAttachments.${t}.${h}`,u,()=>{s(h).then(p=>{p&&(n.chain().updateAttributes("image",{class:null,id:h,src:p}).run(),n.setEditable(!0),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:e,livewireId:i().id}})),d===a.length-1&&Yr(o,"form-processing-finished"))})})}),!0},handlePaste(o,l){if(!l.clipboardData?.files.length)return!1;let a=Array.from(l.clipboardData.files).filter(c=>wc.includes(c.type));return a.length?(l.preventDefault(),l.stopPropagation(),Yr(o,"form-processing-started",{message:r}),a.forEach((c,u)=>{n.setEditable(!1),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:e,livewireId:i().id}}));let d=new FileReader;d.readAsDataURL(c),d.onload=()=>{n.chain().insertContentAt(n.state.selection.anchor,{type:"image",attrs:{class:"fi-loading",src:d.result}}).run()};let f=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,h=>(h^crypto.getRandomValues(new Uint8Array(1))[0]&15>>h/4).toString(16));i().upload(`componentFileAttachments.${t}.${f}`,c,()=>{s(f).then(h=>{h&&(n.chain().updateAttributes("image",{class:null,id:f,src:h}).run(),n.setEditable(!0),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:e,livewireId:i().id}})),u===a.length-1&&Yr(o,"form-processing-finished"))})})}),!0):!1}}})},Ec=X.create({name:"localFiles",addOptions(){return{key:null,statePath:null,uploadingMessage:null,$wire:null}},addProseMirrorPlugins(){return[Wp({editor:this.editor,...this.options})]}});var Kp="listItem",Tc="textStyle",Oc=/^(\d+)\.\s$/,Ac=L.create({name:"orderedList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},addAttributes(){return{start:{default:1,parseHTML:n=>n.hasAttribute("start")?parseInt(n.getAttribute("start")||"",10):1},type:{default:void 0,parseHTML:n=>n.getAttribute("type")}}},parseHTML(){return[{tag:"ol"}]},renderHTML({HTMLAttributes:n}){let{start:e,...t}=n;return e===1?["ol",v(this.options.HTMLAttributes,t),0]:["ol",v(this.options.HTMLAttributes,n),0]},addCommands(){return{toggleOrderedList:()=>({commands:n,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(Kp,this.editor.getAttributes(Tc)).run():n.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-7":()=>this.editor.commands.toggleOrderedList()}},addInputRules(){let n=lt({find:Oc,type:this.type,getAttributes:e=>({start:+e[1]}),joinPredicate:(e,t)=>t.childCount+t.attrs.start===+e[1]});return(this.options.keepMarks||this.options.keepAttributes)&&(n=lt({find:Oc,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:e=>({start:+e[1],...this.editor.getAttributes(Tc)}),joinPredicate:(e,t)=>t.childCount+t.attrs.start===+e[1],editor:this.editor})),[n]}});var Nc=L.create({name:"paragraph",priority:1e3,addOptions(){return{HTMLAttributes:{}}},group:"block",content:"inline*",parseHTML(){return[{tag:"p"}]},renderHTML({HTMLAttributes:n}){return["p",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setParagraph:()=>({commands:n})=>n.setNode(this.name)}},addKeyboardShortcuts(){return{"Mod-Alt-0":()=>this.editor.commands.setParagraph()}}});var Up=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))$/,Jp=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))/g,Ic=V.create({name:"strike",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"s"},{tag:"del"},{tag:"strike"},{style:"text-decoration",consuming:!1,getAttrs:n=>n.includes("line-through")?{}:!1}]},renderHTML({HTMLAttributes:n}){return["s",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setStrike:()=>({commands:n})=>n.setMark(this.name),toggleStrike:()=>({commands:n})=>n.toggleMark(this.name),unsetStrike:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-s":()=>this.editor.commands.toggleStrike()}},addInputRules(){return[Re({find:Up,type:this.type})]},addPasteRules(){return[ke({find:Jp,type:this.type})]}});var Dc=V.create({name:"subscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sub"},{style:"vertical-align",getAttrs(n){return n!=="sub"?!1:null}}]},renderHTML({HTMLAttributes:n}){return["sub",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setSubscript:()=>({commands:n})=>n.setMark(this.name),toggleSubscript:()=>({commands:n})=>n.toggleMark(this.name),unsetSubscript:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-,":()=>this.editor.commands.toggleSubscript()}}});var vc=V.create({name:"superscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sup"},{style:"vertical-align",getAttrs(n){return n!=="super"?!1:null}}]},renderHTML({HTMLAttributes:n}){return["sup",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setSuperscript:()=>({commands:n})=>n.setMark(this.name),toggleSuperscript:()=>({commands:n})=>n.toggleMark(this.name),unsetSuperscript:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-.":()=>this.editor.commands.toggleSuperscript()}}});var Rc=L.create({name:"text",group:"inline"});var Pc=V.create({name:"underline",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"u"},{style:"text-decoration",consuming:!1,getAttrs:n=>n.includes("underline")?{}:!1}]},renderHTML({HTMLAttributes:n}){return["u",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setUnderline:()=>({commands:n})=>n.setMark(this.name),toggleUnderline:()=>({commands:n})=>n.toggleMark(this.name),unsetUnderline:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-u":()=>this.editor.commands.toggleUnderline(),"Mod-U":()=>this.editor.commands.toggleUnderline()}}});var Lc=({key:n,statePath:e,uploadingFileMessage:t,$wire:r})=>[Ka,Ua,_a,Ga,Ya,Qa,Xa,rc,ic,oc,Mc.configure({autolink:!0,openOnClick:!1}),Cc,Ec.configure({key:n,statePath:e,uploadingMessage:t,$wire:()=>r}),Ac,Nc,Ic,Dc,vc,Rc,Pc];function qp({key:n,livewireId:e,state:t,statePath:r,uploadingFileMessage:i}){let s;return{state:t,editorSelection:null,isUploadingFile:!1,shouldUpdateState:!0,editorUpdatedAt:Date.now(),init:function(){s=new cr({element:this.$refs.editor,extensions:Lc({key:n,statePath:r,uploadingFileMessage:i,$wire:this.$wire}),content:this.state}),s.on("create",({editor:o})=>{this.editorUpdatedAt=Date.now()}),s.on("update",({editor:o})=>{this.editorUpdatedAt=Date.now(),this.state=o.getJSON(),this.shouldUpdateState=!1}),s.on("selectionUpdate",({editor:o,transaction:l})=>{this.editorUpdatedAt=Date.now(),this.editorSelection=l.selection.toJSON()}),this.$watch("state",()=>{if(!this.shouldUpdateState){this.shouldUpdateState=!0;return}s.commands.setContent(this.state)}),window.addEventListener("run-rich-editor-commands",o=>{o.detail.livewireId===e&&o.detail.key===n&&this.runEditorCommands(o.detail)}),window.addEventListener("rich-editor-uploading-file",o=>{o.detail.livewireId===e&&o.detail.key===n&&(this.isUploadingFile=!0,o.stopPropagation())}),window.addEventListener("rich-editor-uploaded-file",o=>{o.detail.livewireId===e&&o.detail.key===n&&(this.isUploadingFile=!1,o.stopPropagation())}),window.dispatchEvent(new CustomEvent(`schema-component-${e}-${n}-loaded`))},getEditor:function(){return s},setEditorSelection:function(o){o&&(this.editorSelection=o,s.chain().command(({tr:l})=>(l.setSelection(T.fromJSON(s.state.doc,this.editorSelection)),!0)).run())},runEditorCommands:function({commands:o,editorSelection:l}){this.setEditorSelection(l);let a=s.chain();o.forEach(c=>a=a[c.name](...c.arguments??[])),a.run()}}}export{qp as default}; +3. "-" cannot repeat`);B.customSchemes.push([n,e])}function zp(){B.scanner=Ip(B.customSchemes);for(let n=0;n{let i=e.some(c=>c.docChanged)&&!t.doc.eq(r.doc),s=e.some(c=>c.getMeta("preventAutolink"));if(!i||s)return;let{tr:o}=r,l=Ha(t.doc,[...e]);if(ja(l).forEach(({newRange:c})=>{let u=Va(r.doc,c,h=>h.isTextblock),d,f;if(u.length>1?(d=u[0],f=r.doc.textBetween(d.pos,d.pos+d.node.nodeSize,void 0," ")):u.length&&r.doc.textBetween(c.from,c.to," "," ").endsWith(" ")&&(d=u[0],f=r.doc.textBetween(d.pos,c.to,void 0," ")),d&&f){let h=f.split(" ").filter(y=>y!=="");if(h.length<=0)return!1;let p=h[h.length-1],m=d.pos+f.lastIndexOf(p);if(!p)return!1;let g=Gr(p).map(y=>y.toObject(n.defaultProtocol));if(!Fp(g))return!1;g.filter(y=>y.isLink).map(y=>({...y,from:m+y.start+1,to:m+y.end+1})).filter(y=>r.schema.marks.code?!r.doc.rangeHasMark(y.from,y.to,r.schema.marks.code):!0).filter(y=>n.validate(y.value)).filter(y=>n.shouldAutoLink(y.value)).forEach(y=>{pr(y.from,y.to,r.doc).some(S=>S.mark.type===n.type)||o.addMark(y.from,y.to,n.type.create({href:y.href}))})}}),!!o.steps.length)return o}})}function Hp(n){return new F({key:new W("handleClickLink"),props:{handleClick:(e,t,r)=>{var i,s;if(r.button!==0||!e.editable)return!1;let o=r.target,l=[];for(;o.nodeName!=="DIV";)l.push(o),o=o.parentNode;if(!l.find(f=>f.nodeName==="A"))return!1;let a=Ms(e.state,n.type.name),c=r.target,u=(i=c?.href)!==null&&i!==void 0?i:a.href,d=(s=c?.target)!==null&&s!==void 0?s:a.target;return c&&u?(window.open(u,d),!0):!1}}})}function Vp(n){return new F({key:new W("handlePasteLink"),props:{handlePaste:(e,t,r)=>{let{state:i}=e,{selection:s}=i,{empty:o}=s;if(o)return!1;let l="";r.content.forEach(c=>{l+=c.textContent});let a=Xs(l,{defaultProtocol:n.defaultProtocol}).find(c=>c.isLink&&c.value===l);return!l||!a?!1:n.editor.commands.setMark(n.type,{href:a.href})}}})}var jp=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g;function It(n,e){let t=["http","https","ftp","ftps","mailto","tel","callto","sms","cid","xmpp"];return e&&e.forEach(r=>{let i=typeof r=="string"?r:r.scheme;i&&t.push(i)}),!n||n.replace(jp,"").match(new RegExp(`^(?:(?:${t.join("|")}):|[^a-z]|[a-z0-9+.-]+(?:[^a-z+.-:]|$))`,"i"))}var Mc=V.create({name:"link",priority:1e3,keepOnSplit:!1,exitable:!0,onCreate(){this.options.validate&&!this.options.shouldAutoLink&&(this.options.shouldAutoLink=this.options.validate,console.warn("The `validate` option is deprecated. Rename to the `shouldAutoLink` option instead.")),this.options.protocols.forEach(n=>{if(typeof n=="string"){Qs(n);return}Qs(n.scheme,n.optionalSlashes)})},onDestroy(){Sc()},inclusive(){return this.options.autolink},addOptions(){return{openOnClick:!0,linkOnPaste:!0,autolink:!0,protocols:[],defaultProtocol:"http",HTMLAttributes:{target:"_blank",rel:"noopener noreferrer nofollow",class:null},isAllowedUri:(n,e)=>!!It(n,e.protocols),validate:n=>!!n,shouldAutoLink:n=>!!n}},addAttributes(){return{href:{default:null,parseHTML(n){return n.getAttribute("href")}},target:{default:this.options.HTMLAttributes.target},rel:{default:this.options.HTMLAttributes.rel},class:{default:this.options.HTMLAttributes.class}}},parseHTML(){return[{tag:"a[href]",getAttrs:n=>{let e=n.getAttribute("href");return!e||!this.options.isAllowedUri(e,{defaultValidate:t=>!!It(t,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?!1:null}}]},renderHTML({HTMLAttributes:n}){return this.options.isAllowedUri(n.href,{defaultValidate:e=>!!It(e,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?["a",v(this.options.HTMLAttributes,n),0]:["a",v(this.options.HTMLAttributes,{...n,href:""}),0]},addCommands(){return{setLink:n=>({chain:e})=>{let{href:t}=n;return this.options.isAllowedUri(t,{defaultValidate:r=>!!It(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?e().setMark(this.name,n).setMeta("preventAutolink",!0).run():!1},toggleLink:n=>({chain:e})=>{let{href:t}=n;return this.options.isAllowedUri(t,{defaultValidate:r=>!!It(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?e().toggleMark(this.name,n,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run():!1},unsetLink:()=>({chain:n})=>n().unsetMark(this.name,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()}},addPasteRules(){return[ke({find:n=>{let e=[];if(n){let{protocols:t,defaultProtocol:r}=this.options,i=Xs(n).filter(s=>s.isLink&&this.options.isAllowedUri(s.value,{defaultValidate:o=>!!It(o,t),protocols:t,defaultProtocol:r}));i.length&&i.forEach(s=>e.push({text:s.value,data:{href:s.href},index:s.start}))}return e},type:this.type,getAttributes:n=>{var e;return{href:(e=n.data)===null||e===void 0?void 0:e.href}}})]},addProseMirrorPlugins(){let n=[],{protocols:e,defaultProtocol:t}=this.options;return this.options.autolink&&n.push($p({type:this.type,defaultProtocol:this.options.defaultProtocol,validate:r=>this.options.isAllowedUri(r,{defaultValidate:i=>!!It(i,e),protocols:e,defaultProtocol:t}),shouldAutoLink:this.options.shouldAutoLink})),this.options.openOnClick===!0&&n.push(Hp({type:this.type})),this.options.linkOnPaste&&n.push(Vp({editor:this.editor,defaultProtocol:this.options.defaultProtocol,type:this.type})),n}});var Cc=L.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:n}){return["li",v(this.options.HTMLAttributes,n),0]},addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}});var wc=["image/png","image/jpeg","image/gif","image/webp"],Yr=(n,e,t={})=>{n.dom.closest("form")?.dispatchEvent(new CustomEvent(e,{composed:!0,cancelable:!0,detail:t}))},Wp=({editor:n,key:e,statePath:t,uploadingMessage:r,$wire:i})=>{let s=o=>i().callSchemaComponentMethod(e,"saveUploadedFileAttachment",{attachment:o});return new F({key:new W("localFiles"),props:{handleDrop(o,l){if(!l.dataTransfer?.files.length)return!1;let a=Array.from(l.dataTransfer.files).filter(u=>wc.includes(u.type));if(!a.length)return!1;Yr(o,"form-processing-started",{message:r}),l.preventDefault(),l.stopPropagation();let c=o.posAtCoords({left:l.clientX,top:l.clientY});return a.forEach((u,d)=>{n.setEditable(!1),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:e,livewireId:i().id}}));let f=new FileReader;f.readAsDataURL(u),f.onload=()=>{n.chain().insertContentAt(c?.pos??0,{type:"image",attrs:{class:"fi-loading",src:f.result}}).run()};let h=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,p=>(p^crypto.getRandomValues(new Uint8Array(1))[0]&15>>p/4).toString(16));i().upload(`componentFileAttachments.${t}.${h}`,u,()=>{s(h).then(p=>{p&&(n.chain().updateAttributes("image",{class:null,id:h,src:p}).run(),n.setEditable(!0),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:e,livewireId:i().id}})),d===a.length-1&&Yr(o,"form-processing-finished"))})})}),!0},handlePaste(o,l){if(!l.clipboardData?.files.length)return!1;let a=Array.from(l.clipboardData.files).filter(c=>wc.includes(c.type));return a.length?(l.preventDefault(),l.stopPropagation(),Yr(o,"form-processing-started",{message:r}),a.forEach((c,u)=>{n.setEditable(!1),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:e,livewireId:i().id}}));let d=new FileReader;d.readAsDataURL(c),d.onload=()=>{n.chain().insertContentAt(n.state.selection.anchor,{type:"image",attrs:{class:"fi-loading",src:d.result}}).run()};let f=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,h=>(h^crypto.getRandomValues(new Uint8Array(1))[0]&15>>h/4).toString(16));i().upload(`componentFileAttachments.${t}.${f}`,c,()=>{s(f).then(h=>{h&&(n.chain().updateAttributes("image",{class:null,id:f,src:h}).run(),n.setEditable(!0),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:e,livewireId:i().id}})),u===a.length-1&&Yr(o,"form-processing-finished"))})})}),!0):!1}}})},Ec=X.create({name:"localFiles",addOptions(){return{key:null,statePath:null,uploadingMessage:null,$wire:null}},addProseMirrorPlugins(){return[Wp({editor:this.editor,...this.options})]}});var Kp="listItem",Tc="textStyle",Oc=/^(\d+)\.\s$/,Ac=L.create({name:"orderedList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},addAttributes(){return{start:{default:1,parseHTML:n=>n.hasAttribute("start")?parseInt(n.getAttribute("start")||"",10):1},type:{default:void 0,parseHTML:n=>n.getAttribute("type")}}},parseHTML(){return[{tag:"ol"}]},renderHTML({HTMLAttributes:n}){let{start:e,...t}=n;return e===1?["ol",v(this.options.HTMLAttributes,t),0]:["ol",v(this.options.HTMLAttributes,n),0]},addCommands(){return{toggleOrderedList:()=>({commands:n,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(Kp,this.editor.getAttributes(Tc)).run():n.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-7":()=>this.editor.commands.toggleOrderedList()}},addInputRules(){let n=lt({find:Oc,type:this.type,getAttributes:e=>({start:+e[1]}),joinPredicate:(e,t)=>t.childCount+t.attrs.start===+e[1]});return(this.options.keepMarks||this.options.keepAttributes)&&(n=lt({find:Oc,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:e=>({start:+e[1],...this.editor.getAttributes(Tc)}),joinPredicate:(e,t)=>t.childCount+t.attrs.start===+e[1],editor:this.editor})),[n]}});var Nc=L.create({name:"paragraph",priority:1e3,addOptions(){return{HTMLAttributes:{}}},group:"block",content:"inline*",parseHTML(){return[{tag:"p"}]},renderHTML({HTMLAttributes:n}){return["p",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setParagraph:()=>({commands:n})=>n.setNode(this.name)}},addKeyboardShortcuts(){return{"Mod-Alt-0":()=>this.editor.commands.setParagraph()}}});var Up=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))$/,Jp=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))/g,Ic=V.create({name:"strike",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"s"},{tag:"del"},{tag:"strike"},{style:"text-decoration",consuming:!1,getAttrs:n=>n.includes("line-through")?{}:!1}]},renderHTML({HTMLAttributes:n}){return["s",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setStrike:()=>({commands:n})=>n.setMark(this.name),toggleStrike:()=>({commands:n})=>n.toggleMark(this.name),unsetStrike:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-s":()=>this.editor.commands.toggleStrike()}},addInputRules(){return[Re({find:Up,type:this.type})]},addPasteRules(){return[ke({find:Jp,type:this.type})]}});var Dc=V.create({name:"subscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sub"},{style:"vertical-align",getAttrs(n){return n!=="sub"?!1:null}}]},renderHTML({HTMLAttributes:n}){return["sub",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setSubscript:()=>({commands:n})=>n.setMark(this.name),toggleSubscript:()=>({commands:n})=>n.toggleMark(this.name),unsetSubscript:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-,":()=>this.editor.commands.toggleSubscript()}}});var vc=V.create({name:"superscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sup"},{style:"vertical-align",getAttrs(n){return n!=="super"?!1:null}}]},renderHTML({HTMLAttributes:n}){return["sup",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setSuperscript:()=>({commands:n})=>n.setMark(this.name),toggleSuperscript:()=>({commands:n})=>n.toggleMark(this.name),unsetSuperscript:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-.":()=>this.editor.commands.toggleSuperscript()}}});var Rc=L.create({name:"text",group:"inline"});var Pc=V.create({name:"underline",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"u"},{style:"text-decoration",consuming:!1,getAttrs:n=>n.includes("underline")?{}:!1}]},renderHTML({HTMLAttributes:n}){return["u",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setUnderline:()=>({commands:n})=>n.setMark(this.name),toggleUnderline:()=>({commands:n})=>n.toggleMark(this.name),unsetUnderline:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-u":()=>this.editor.commands.toggleUnderline(),"Mod-U":()=>this.editor.commands.toggleUnderline()}}});var Lc=({key:n,statePath:e,uploadingFileMessage:t,$wire:r})=>[Ka,Ua,_a,Ga,Ya,Qa,Xa,rc,ic,oc,Mc.configure({autolink:!0,openOnClick:!1}),Cc,Ec.configure({key:n,statePath:e,uploadingMessage:t,$wire:()=>r}),Ac,Nc,Ic,Dc,vc,Rc,Pc];function qp({key:n,livewireId:e,state:t,statePath:r,uploadingFileMessage:i}){let s;return{state:t,editorSelection:{type:"text",anchor:1,head:1},isUploadingFile:!1,shouldUpdateState:!0,editorUpdatedAt:Date.now(),init:function(){s=new cr({element:this.$refs.editor,extensions:Lc({key:n,statePath:r,uploadingFileMessage:i,$wire:this.$wire}),content:this.state}),s.on("create",({editor:o})=>{this.editorUpdatedAt=Date.now()}),s.on("update",({editor:o})=>{this.editorUpdatedAt=Date.now(),this.state=o.getJSON(),this.shouldUpdateState=!1}),s.on("selectionUpdate",({editor:o,transaction:l})=>{this.editorUpdatedAt=Date.now(),this.editorSelection=l.selection.toJSON()}),this.$watch("state",()=>{if(!this.shouldUpdateState){this.shouldUpdateState=!0;return}s.commands.setContent(this.state)}),window.addEventListener("run-rich-editor-commands",o=>{o.detail.livewireId===e&&o.detail.key===n&&this.runEditorCommands(o.detail)}),window.addEventListener("rich-editor-uploading-file",o=>{o.detail.livewireId===e&&o.detail.key===n&&(this.isUploadingFile=!0,o.stopPropagation())}),window.addEventListener("rich-editor-uploaded-file",o=>{o.detail.livewireId===e&&o.detail.key===n&&(this.isUploadingFile=!1,o.stopPropagation())}),window.dispatchEvent(new CustomEvent(`schema-component-${e}-${n}-loaded`))},getEditor:function(){return s},setEditorSelection:function(o){o&&(this.editorSelection=o,s.chain().command(({tr:l})=>(l.setSelection(T.fromJSON(s.state.doc,this.editorSelection)),!0)).run())},runEditorCommands:function({commands:o,editorSelection:l}){this.setEditorSelection(l);let a=s.chain();o.forEach(c=>a=a[c.name](...c.arguments??[])),a.run()}}}export{qp as default}; diff --git a/packages/forms/dist/components/rich-editor.js b/packages/forms/dist/components/rich-editor.js index ed792b4469..517746cf6a 100644 --- a/packages/forms/dist/components/rich-editor.js +++ b/packages/forms/dist/components/rich-editor.js @@ -93,4 +93,4 @@ img.ProseMirror-separator { `,Ap="\uFE0F",Np="\u200D",Rs="\uFFFC",br=null,kr=null;function Ip(n=[]){let e={};ce.groups=e;let t=new ce;br==null&&(br=cc(Mp)),kr==null&&(kr=cc(Cp)),k(t,"'",Us),k(t,"{",On),k(t,"}",An),k(t,"[",Mr),k(t,"]",Cr),k(t,"(",wr),k(t,")",Er),k(t,"<",Tr),k(t,">",Or),k(t,"\uFF08",Ar),k(t,"\uFF09",Nr),k(t,"\u300C",Ir),k(t,"\u300D",Dr),k(t,"\u300E",vr),k(t,"\u300F",Rr),k(t,"\uFF1C",Pr),k(t,"\uFF1E",Lr),k(t,"&",Br),k(t,"*",zr),k(t,"@",ct),k(t,"`",$r),k(t,"^",Hr),k(t,":",ut),k(t,",",Js),k(t,"$",Vr),k(t,".",Le),k(t,"=",jr),k(t,"!",qs),k(t,"-",Me),k(t,"%",Nn),k(t,"|",Wr),k(t,"+",Kr),k(t,"#",Ur),k(t,"?",In),k(t,'"',_s),k(t,"/",Be),k(t,";",Gs),k(t,"~",Dn),k(t,"_",Jr),k(t,"\\",Fr),k(t,"\u30FB",gc);let r=j(t,Ge,Ws,{[Ls]:!0});j(r,Ge,r);let i=j(r,_e,pc,{[Tn]:!0}),s=j(r,wn,mc,{[En]:!0}),o=j(t,_e,Ye,{[Bs]:!0});j(o,Ge,i),j(o,_e,o),j(i,Ge,i),j(i,_e,i);let l=j(t,wn,$s,{[zs]:!0});j(l,_e),j(l,Ge,s),j(l,wn,l),j(s,Ge,s),j(s,_e),j(s,wn,s);let a=k(t,vs,Ks,{[Ns]:!0}),c=k(t,ac,js,{[Ns]:!0}),u=j(t,Ds,js,{[Ns]:!0});k(t,Rs,u),k(c,vs,a),k(c,Rs,u),j(c,Ds,u),k(u,ac),k(u,vs),j(u,Ds,u),k(u,Rs,u);let d=j(t,Is,yc,{[hc]:!0});k(d,"#"),j(d,Is,d),k(d,Ap,d);let f=k(d,Np);k(f,"#"),j(f,Is,d);let h=[[_e,o],[Ge,i]],p=[[_e,null],[wn,l],[Ge,s]];for(let m=0;mm[0]>g[0]?1:-1);for(let m=0;m=0?S[Fs]=!0:_e.test(g)?Ge.test(g)?S[Tn]=!0:S[Bs]=!0:S[Ls]=!0,lc(t,g,g,S)}return lc(t,"localhost",vn,{ascii:!0}),t.jd=new ce(qr),{start:t,tokens:Xt({groups:e},bc)}}function kc(n,e){let t=Dp(e.replace(/[A-Z]/g,l=>l.toLowerCase())),r=t.length,i=[],s=0,o=0;for(;o=0&&(d+=t[o].length,f++),c+=t[o].length,s+=t[o].length,o++;s-=d,o-=f,c-=d,i.push({t:u.t,v:e.slice(s-c,s),s:s-c,e:s})}return i}function Dp(n){let e=[],t=n.length,r=0;for(;r56319||r+1===t||(s=n.charCodeAt(r+1))<56320||s>57343?n[r]:n.slice(r,r+2);e.push(o),r+=o.length}return e}function at(n,e,t,r,i){let s,o=e.length;for(let l=0;l=0;)s++;if(s>0){e.push(t.join(""));for(let o=parseInt(n.substring(r,r+s),10);o>0;o--)t.pop();r+=s}else t.push(n[r]),r++}return e}var Rn={defaultProtocol:"http",events:null,format:uc,formatHref:uc,nl2br:!1,tagName:"a",target:null,rel:null,validate:!0,truncate:1/0,className:null,attributes:null,ignoreTags:[],render:null};function Ys(n,e=null){let t=Xt({},Rn);n&&(t=Xt(t,n instanceof Ys?n.o:n));let r=t.ignoreTags,i=[];for(let s=0;st?r.substring(0,t)+"\u2026":r},toFormattedHref(n){return n.get("formatHref",this.toHref(n.get("defaultProtocol")),this)},startIndex(){return this.tk[0].s},endIndex(){return this.tk[this.tk.length-1].e},toObject(n=Rn.defaultProtocol){return{type:this.t,value:this.toString(),isLink:this.isLink,href:this.toHref(n),start:this.startIndex(),end:this.endIndex()}},toFormattedObject(n){return{type:this.t,value:this.toFormattedString(n),isLink:this.isLink,href:this.toFormattedHref(n),start:this.startIndex(),end:this.endIndex()}},validate(n){return n.get("validate",this.toString(),this)},render(n){let e=this,t=this.toHref(n.get("defaultProtocol")),r=n.get("formatHref",t,this),i=n.get("tagName",t,e),s=this.toFormattedString(n),o={},l=n.get("className",t,e),a=n.get("target",t,e),c=n.get("rel",t,e),u=n.getObj("attributes",t,e),d=n.getObj("events",t,e);return o.href=r,l&&(o.class=l),a&&(o.target=a),c&&(o.rel=c),u&&Xt(o,u),{tagName:i,attributes:o,content:s,eventListeners:d}}};function _r(n,e){class t extends xc{constructor(i,s){super(i,s),this.t=n}}for(let r in e)t.prototype[r]=e[r];return t.t=n,t}var dc=_r("email",{isLink:!0,toHref(){return"mailto:"+this.toString()}}),fc=_r("text"),vp=_r("nl"),xr=_r("url",{isLink:!0,toHref(n=Rn.defaultProtocol){return this.hasProtocol()?this.v:`${n}://${this.v}`},hasProtocol(){let n=this.tk;return n.length>=2&&n[0].t!==vn&&n[1].t===ut}});var Se=n=>new ce(n);function Rp({groups:n}){let e=n.domain.concat([Br,zr,ct,Fr,$r,Hr,Vr,jr,Me,Ws,Nn,Wr,Kr,Ur,Be,qr,Dn,Jr]),t=[ut,Js,Le,qs,Nn,In,_s,Gs,Tr,Or,On,An,Cr,Mr,wr,Er,Ar,Nr,Ir,Dr,vr,Rr,Pr,Lr],r=[Br,Us,zr,Fr,$r,Hr,Vr,jr,Me,On,An,Nn,Wr,Kr,Ur,In,Be,qr,Dn,Jr],i=Se(),s=k(i,Dn);A(s,r,s),A(s,n.domain,s);let o=Se(),l=Se(),a=Se();A(i,n.domain,o),A(i,n.scheme,l),A(i,n.slashscheme,a),A(o,r,s),A(o,n.domain,o);let c=k(o,ct);k(s,ct,c),k(l,ct,c),k(a,ct,c);let u=k(s,Le);A(u,r,s),A(u,n.domain,s);let d=Se();A(c,n.domain,d),A(d,n.domain,d);let f=k(d,Le);A(f,n.domain,d);let h=Se(dc);A(f,n.tld,h),A(f,n.utld,h),k(c,vn,h);let p=k(d,Me);k(p,Me,p),A(p,n.domain,d),A(h,n.domain,d),k(h,Le,f),k(h,Me,p);let m=k(h,ut);A(m,n.numeric,dc);let g=k(o,Me),y=k(o,Le);k(g,Me,g),A(g,n.domain,o),A(y,r,s),A(y,n.domain,o);let S=Se(xr);A(y,n.tld,S),A(y,n.utld,S),A(S,n.domain,o),A(S,r,s),k(S,Le,y),k(S,Me,g),k(S,ct,c);let O=k(S,ut),P=Se(xr);A(O,n.numeric,P);let E=Se(xr),R=Se();A(E,e,E),A(E,t,R),A(R,e,E),A(R,t,R),k(S,Be,E),k(P,Be,E);let q=k(l,ut),Y=k(a,ut),I=k(Y,Be),fe=k(I,Be);A(l,n.domain,o),k(l,Le,y),k(l,Me,g),A(a,n.domain,o),k(a,Le,y),k(a,Me,g),A(q,n.domain,E),k(q,Be,E),k(q,In,E),A(fe,n.domain,E),A(fe,e,E),k(fe,Be,E);let dt=[[On,An],[Mr,Cr],[wr,Er],[Tr,Or],[Ar,Nr],[Ir,Dr],[vr,Rr],[Pr,Lr]];for(let Zt=0;Zt=0&&f++,i++,u++;if(f<0)i-=u,i0&&(s.push(Ps(fc,e,o)),o=[]),i-=f,u-=f;let h=d.t,p=t.slice(i-u,i);s.push(Ps(h,e,p))}}return o.length>0&&s.push(Ps(fc,e,o)),s}function Ps(n,e,t){let r=t[0].s,i=t[t.length-1].e,s=e.slice(r,i);return new n(s,t)}var Lp=typeof console<"u"&&console&&console.warn||(()=>{}),Bp="until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.",B={scanner:null,parser:null,tokenQueue:[],pluginQueue:[],customSchemes:[],initialized:!1};function Sc(){return ce.groups={},B.scanner=null,B.parser=null,B.tokenQueue=[],B.pluginQueue=[],B.customSchemes=[],B.initialized=!1,B}function Qs(n,e=!1){if(B.initialized&&Lp(`linkifyjs: already initialized - will not register custom scheme "${n}" ${Bp}`),!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(n))throw new Error(`linkifyjs: incorrect scheme format. 1. Must only contain digits, lowercase ASCII letters or "-" 2. Cannot start or end with "-" -3. "-" cannot repeat`);B.customSchemes.push([n,e])}function zp(){B.scanner=Ip(B.customSchemes);for(let n=0;n{let i=e.some(c=>c.docChanged)&&!t.doc.eq(r.doc),s=e.some(c=>c.getMeta("preventAutolink"));if(!i||s)return;let{tr:o}=r,l=Ha(t.doc,[...e]);if(ja(l).forEach(({newRange:c})=>{let u=Va(r.doc,c,h=>h.isTextblock),d,f;if(u.length>1?(d=u[0],f=r.doc.textBetween(d.pos,d.pos+d.node.nodeSize,void 0," ")):u.length&&r.doc.textBetween(c.from,c.to," "," ").endsWith(" ")&&(d=u[0],f=r.doc.textBetween(d.pos,c.to,void 0," ")),d&&f){let h=f.split(" ").filter(y=>y!=="");if(h.length<=0)return!1;let p=h[h.length-1],m=d.pos+f.lastIndexOf(p);if(!p)return!1;let g=Gr(p).map(y=>y.toObject(n.defaultProtocol));if(!Fp(g))return!1;g.filter(y=>y.isLink).map(y=>({...y,from:m+y.start+1,to:m+y.end+1})).filter(y=>r.schema.marks.code?!r.doc.rangeHasMark(y.from,y.to,r.schema.marks.code):!0).filter(y=>n.validate(y.value)).filter(y=>n.shouldAutoLink(y.value)).forEach(y=>{pr(y.from,y.to,r.doc).some(S=>S.mark.type===n.type)||o.addMark(y.from,y.to,n.type.create({href:y.href}))})}}),!!o.steps.length)return o}})}function Hp(n){return new F({key:new W("handleClickLink"),props:{handleClick:(e,t,r)=>{var i,s;if(r.button!==0||!e.editable)return!1;let o=r.target,l=[];for(;o.nodeName!=="DIV";)l.push(o),o=o.parentNode;if(!l.find(f=>f.nodeName==="A"))return!1;let a=Ms(e.state,n.type.name),c=r.target,u=(i=c?.href)!==null&&i!==void 0?i:a.href,d=(s=c?.target)!==null&&s!==void 0?s:a.target;return c&&u?(window.open(u,d),!0):!1}}})}function Vp(n){return new F({key:new W("handlePasteLink"),props:{handlePaste:(e,t,r)=>{let{state:i}=e,{selection:s}=i,{empty:o}=s;if(o)return!1;let l="";r.content.forEach(c=>{l+=c.textContent});let a=Xs(l,{defaultProtocol:n.defaultProtocol}).find(c=>c.isLink&&c.value===l);return!l||!a?!1:n.editor.commands.setMark(n.type,{href:a.href})}}})}var jp=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g;function It(n,e){let t=["http","https","ftp","ftps","mailto","tel","callto","sms","cid","xmpp"];return e&&e.forEach(r=>{let i=typeof r=="string"?r:r.scheme;i&&t.push(i)}),!n||n.replace(jp,"").match(new RegExp(`^(?:(?:${t.join("|")}):|[^a-z]|[a-z0-9+.-]+(?:[^a-z+.-:]|$))`,"i"))}var Mc=V.create({name:"link",priority:1e3,keepOnSplit:!1,exitable:!0,onCreate(){this.options.validate&&!this.options.shouldAutoLink&&(this.options.shouldAutoLink=this.options.validate,console.warn("The `validate` option is deprecated. Rename to the `shouldAutoLink` option instead.")),this.options.protocols.forEach(n=>{if(typeof n=="string"){Qs(n);return}Qs(n.scheme,n.optionalSlashes)})},onDestroy(){Sc()},inclusive(){return this.options.autolink},addOptions(){return{openOnClick:!0,linkOnPaste:!0,autolink:!0,protocols:[],defaultProtocol:"http",HTMLAttributes:{target:"_blank",rel:"noopener noreferrer nofollow",class:null},isAllowedUri:(n,e)=>!!It(n,e.protocols),validate:n=>!!n,shouldAutoLink:n=>!!n}},addAttributes(){return{href:{default:null,parseHTML(n){return n.getAttribute("href")}},target:{default:this.options.HTMLAttributes.target},rel:{default:this.options.HTMLAttributes.rel},class:{default:this.options.HTMLAttributes.class}}},parseHTML(){return[{tag:"a[href]",getAttrs:n=>{let e=n.getAttribute("href");return!e||!this.options.isAllowedUri(e,{defaultValidate:t=>!!It(t,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?!1:null}}]},renderHTML({HTMLAttributes:n}){return this.options.isAllowedUri(n.href,{defaultValidate:e=>!!It(e,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?["a",v(this.options.HTMLAttributes,n),0]:["a",v(this.options.HTMLAttributes,{...n,href:""}),0]},addCommands(){return{setLink:n=>({chain:e})=>{let{href:t}=n;return this.options.isAllowedUri(t,{defaultValidate:r=>!!It(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?e().setMark(this.name,n).setMeta("preventAutolink",!0).run():!1},toggleLink:n=>({chain:e})=>{let{href:t}=n;return this.options.isAllowedUri(t,{defaultValidate:r=>!!It(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?e().toggleMark(this.name,n,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run():!1},unsetLink:()=>({chain:n})=>n().unsetMark(this.name,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()}},addPasteRules(){return[ke({find:n=>{let e=[];if(n){let{protocols:t,defaultProtocol:r}=this.options,i=Xs(n).filter(s=>s.isLink&&this.options.isAllowedUri(s.value,{defaultValidate:o=>!!It(o,t),protocols:t,defaultProtocol:r}));i.length&&i.forEach(s=>e.push({text:s.value,data:{href:s.href},index:s.start}))}return e},type:this.type,getAttributes:n=>{var e;return{href:(e=n.data)===null||e===void 0?void 0:e.href}}})]},addProseMirrorPlugins(){let n=[],{protocols:e,defaultProtocol:t}=this.options;return this.options.autolink&&n.push($p({type:this.type,defaultProtocol:this.options.defaultProtocol,validate:r=>this.options.isAllowedUri(r,{defaultValidate:i=>!!It(i,e),protocols:e,defaultProtocol:t}),shouldAutoLink:this.options.shouldAutoLink})),this.options.openOnClick===!0&&n.push(Hp({type:this.type})),this.options.linkOnPaste&&n.push(Vp({editor:this.editor,defaultProtocol:this.options.defaultProtocol,type:this.type})),n}});var Cc=L.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:n}){return["li",v(this.options.HTMLAttributes,n),0]},addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}});var wc=["image/png","image/jpeg","image/gif","image/webp"],Yr=(n,e,t={})=>{n.dom.closest("form")?.dispatchEvent(new CustomEvent(e,{composed:!0,cancelable:!0,detail:t}))},Wp=({editor:n,key:e,statePath:t,uploadingMessage:r,$wire:i})=>{let s=o=>i().callSchemaComponentMethod(e,"saveUploadedFileAttachment",{attachment:o});return new F({key:new W("localFiles"),props:{handleDrop(o,l){if(!l.dataTransfer?.files.length)return!1;let a=Array.from(l.dataTransfer.files).filter(u=>wc.includes(u.type));if(!a.length)return!1;Yr(o,"form-processing-started",{message:r}),l.preventDefault(),l.stopPropagation();let c=o.posAtCoords({left:l.clientX,top:l.clientY});return a.forEach((u,d)=>{n.setEditable(!1),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:e,livewireId:i().id}}));let f=new FileReader;f.readAsDataURL(u),f.onload=()=>{n.chain().insertContentAt(c?.pos??0,{type:"image",attrs:{class:"fi-loading",src:f.result}}).run()};let h=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,p=>(p^crypto.getRandomValues(new Uint8Array(1))[0]&15>>p/4).toString(16));i().upload(`componentFileAttachments.${t}.${h}`,u,()=>{s(h).then(p=>{p&&(n.chain().updateAttributes("image",{class:null,id:h,src:p}).run(),n.setEditable(!0),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:e,livewireId:i().id}})),d===a.length-1&&Yr(o,"form-processing-finished"))})})}),!0},handlePaste(o,l){if(!l.clipboardData?.files.length)return!1;let a=Array.from(l.clipboardData.files).filter(c=>wc.includes(c.type));return a.length?(l.preventDefault(),l.stopPropagation(),Yr(o,"form-processing-started",{message:r}),a.forEach((c,u)=>{n.setEditable(!1),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:e,livewireId:i().id}}));let d=new FileReader;d.readAsDataURL(c),d.onload=()=>{n.chain().insertContentAt(n.state.selection.anchor,{type:"image",attrs:{class:"fi-loading",src:d.result}}).run()};let f=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,h=>(h^crypto.getRandomValues(new Uint8Array(1))[0]&15>>h/4).toString(16));i().upload(`componentFileAttachments.${t}.${f}`,c,()=>{s(f).then(h=>{h&&(n.chain().updateAttributes("image",{class:null,id:f,src:h}).run(),n.setEditable(!0),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:e,livewireId:i().id}})),u===a.length-1&&Yr(o,"form-processing-finished"))})})}),!0):!1}}})},Ec=X.create({name:"localFiles",addOptions(){return{key:null,statePath:null,uploadingMessage:null,$wire:null}},addProseMirrorPlugins(){return[Wp({editor:this.editor,...this.options})]}});var Kp="listItem",Tc="textStyle",Oc=/^(\d+)\.\s$/,Ac=L.create({name:"orderedList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},addAttributes(){return{start:{default:1,parseHTML:n=>n.hasAttribute("start")?parseInt(n.getAttribute("start")||"",10):1},type:{default:void 0,parseHTML:n=>n.getAttribute("type")}}},parseHTML(){return[{tag:"ol"}]},renderHTML({HTMLAttributes:n}){let{start:e,...t}=n;return e===1?["ol",v(this.options.HTMLAttributes,t),0]:["ol",v(this.options.HTMLAttributes,n),0]},addCommands(){return{toggleOrderedList:()=>({commands:n,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(Kp,this.editor.getAttributes(Tc)).run():n.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-7":()=>this.editor.commands.toggleOrderedList()}},addInputRules(){let n=lt({find:Oc,type:this.type,getAttributes:e=>({start:+e[1]}),joinPredicate:(e,t)=>t.childCount+t.attrs.start===+e[1]});return(this.options.keepMarks||this.options.keepAttributes)&&(n=lt({find:Oc,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:e=>({start:+e[1],...this.editor.getAttributes(Tc)}),joinPredicate:(e,t)=>t.childCount+t.attrs.start===+e[1],editor:this.editor})),[n]}});var Nc=L.create({name:"paragraph",priority:1e3,addOptions(){return{HTMLAttributes:{}}},group:"block",content:"inline*",parseHTML(){return[{tag:"p"}]},renderHTML({HTMLAttributes:n}){return["p",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setParagraph:()=>({commands:n})=>n.setNode(this.name)}},addKeyboardShortcuts(){return{"Mod-Alt-0":()=>this.editor.commands.setParagraph()}}});var Up=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))$/,Jp=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))/g,Ic=V.create({name:"strike",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"s"},{tag:"del"},{tag:"strike"},{style:"text-decoration",consuming:!1,getAttrs:n=>n.includes("line-through")?{}:!1}]},renderHTML({HTMLAttributes:n}){return["s",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setStrike:()=>({commands:n})=>n.setMark(this.name),toggleStrike:()=>({commands:n})=>n.toggleMark(this.name),unsetStrike:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-s":()=>this.editor.commands.toggleStrike()}},addInputRules(){return[Re({find:Up,type:this.type})]},addPasteRules(){return[ke({find:Jp,type:this.type})]}});var Dc=V.create({name:"subscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sub"},{style:"vertical-align",getAttrs(n){return n!=="sub"?!1:null}}]},renderHTML({HTMLAttributes:n}){return["sub",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setSubscript:()=>({commands:n})=>n.setMark(this.name),toggleSubscript:()=>({commands:n})=>n.toggleMark(this.name),unsetSubscript:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-,":()=>this.editor.commands.toggleSubscript()}}});var vc=V.create({name:"superscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sup"},{style:"vertical-align",getAttrs(n){return n!=="super"?!1:null}}]},renderHTML({HTMLAttributes:n}){return["sup",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setSuperscript:()=>({commands:n})=>n.setMark(this.name),toggleSuperscript:()=>({commands:n})=>n.toggleMark(this.name),unsetSuperscript:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-.":()=>this.editor.commands.toggleSuperscript()}}});var Rc=L.create({name:"text",group:"inline"});var Pc=V.create({name:"underline",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"u"},{style:"text-decoration",consuming:!1,getAttrs:n=>n.includes("underline")?{}:!1}]},renderHTML({HTMLAttributes:n}){return["u",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setUnderline:()=>({commands:n})=>n.setMark(this.name),toggleUnderline:()=>({commands:n})=>n.toggleMark(this.name),unsetUnderline:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-u":()=>this.editor.commands.toggleUnderline(),"Mod-U":()=>this.editor.commands.toggleUnderline()}}});var Lc=({key:n,statePath:e,uploadingFileMessage:t,$wire:r})=>[Ka,Ua,_a,Ga,Ya,Qa,Xa,rc,ic,oc,Mc.configure({autolink:!0,openOnClick:!1}),Cc,Ec.configure({key:n,statePath:e,uploadingMessage:t,$wire:()=>r}),Ac,Nc,Ic,Dc,vc,Rc,Pc];function qp({key:n,livewireId:e,state:t,statePath:r,uploadingFileMessage:i}){let s;return{state:t,editorSelection:null,isUploadingFile:!1,shouldUpdateState:!0,editorUpdatedAt:Date.now(),init:function(){s=new cr({element:this.$refs.editor,extensions:Lc({key:n,statePath:r,uploadingFileMessage:i,$wire:this.$wire}),content:this.state}),s.on("create",({editor:o})=>{this.editorUpdatedAt=Date.now()}),s.on("update",({editor:o})=>{this.editorUpdatedAt=Date.now(),this.state=o.getJSON(),this.shouldUpdateState=!1}),s.on("selectionUpdate",({editor:o,transaction:l})=>{this.editorUpdatedAt=Date.now(),this.editorSelection=l.selection.toJSON()}),this.$watch("state",()=>{if(!this.shouldUpdateState){this.shouldUpdateState=!0;return}s.commands.setContent(this.state)}),window.addEventListener("run-rich-editor-commands",o=>{o.detail.livewireId===e&&o.detail.key===n&&this.runEditorCommands(o.detail)}),window.addEventListener("rich-editor-uploading-file",o=>{o.detail.livewireId===e&&o.detail.key===n&&(this.isUploadingFile=!0,o.stopPropagation())}),window.addEventListener("rich-editor-uploaded-file",o=>{o.detail.livewireId===e&&o.detail.key===n&&(this.isUploadingFile=!1,o.stopPropagation())}),window.dispatchEvent(new CustomEvent(`schema-component-${e}-${n}-loaded`))},getEditor:function(){return s},setEditorSelection:function(o){o&&(this.editorSelection=o,s.chain().command(({tr:l})=>(l.setSelection(T.fromJSON(s.state.doc,this.editorSelection)),!0)).run())},runEditorCommands:function({commands:o,editorSelection:l}){this.setEditorSelection(l);let a=s.chain();o.forEach(c=>a=a[c.name](...c.arguments??[])),a.run()}}}export{qp as default}; +3. "-" cannot repeat`);B.customSchemes.push([n,e])}function zp(){B.scanner=Ip(B.customSchemes);for(let n=0;n{let i=e.some(c=>c.docChanged)&&!t.doc.eq(r.doc),s=e.some(c=>c.getMeta("preventAutolink"));if(!i||s)return;let{tr:o}=r,l=Ha(t.doc,[...e]);if(ja(l).forEach(({newRange:c})=>{let u=Va(r.doc,c,h=>h.isTextblock),d,f;if(u.length>1?(d=u[0],f=r.doc.textBetween(d.pos,d.pos+d.node.nodeSize,void 0," ")):u.length&&r.doc.textBetween(c.from,c.to," "," ").endsWith(" ")&&(d=u[0],f=r.doc.textBetween(d.pos,c.to,void 0," ")),d&&f){let h=f.split(" ").filter(y=>y!=="");if(h.length<=0)return!1;let p=h[h.length-1],m=d.pos+f.lastIndexOf(p);if(!p)return!1;let g=Gr(p).map(y=>y.toObject(n.defaultProtocol));if(!Fp(g))return!1;g.filter(y=>y.isLink).map(y=>({...y,from:m+y.start+1,to:m+y.end+1})).filter(y=>r.schema.marks.code?!r.doc.rangeHasMark(y.from,y.to,r.schema.marks.code):!0).filter(y=>n.validate(y.value)).filter(y=>n.shouldAutoLink(y.value)).forEach(y=>{pr(y.from,y.to,r.doc).some(S=>S.mark.type===n.type)||o.addMark(y.from,y.to,n.type.create({href:y.href}))})}}),!!o.steps.length)return o}})}function Hp(n){return new F({key:new W("handleClickLink"),props:{handleClick:(e,t,r)=>{var i,s;if(r.button!==0||!e.editable)return!1;let o=r.target,l=[];for(;o.nodeName!=="DIV";)l.push(o),o=o.parentNode;if(!l.find(f=>f.nodeName==="A"))return!1;let a=Ms(e.state,n.type.name),c=r.target,u=(i=c?.href)!==null&&i!==void 0?i:a.href,d=(s=c?.target)!==null&&s!==void 0?s:a.target;return c&&u?(window.open(u,d),!0):!1}}})}function Vp(n){return new F({key:new W("handlePasteLink"),props:{handlePaste:(e,t,r)=>{let{state:i}=e,{selection:s}=i,{empty:o}=s;if(o)return!1;let l="";r.content.forEach(c=>{l+=c.textContent});let a=Xs(l,{defaultProtocol:n.defaultProtocol}).find(c=>c.isLink&&c.value===l);return!l||!a?!1:n.editor.commands.setMark(n.type,{href:a.href})}}})}var jp=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g;function It(n,e){let t=["http","https","ftp","ftps","mailto","tel","callto","sms","cid","xmpp"];return e&&e.forEach(r=>{let i=typeof r=="string"?r:r.scheme;i&&t.push(i)}),!n||n.replace(jp,"").match(new RegExp(`^(?:(?:${t.join("|")}):|[^a-z]|[a-z0-9+.-]+(?:[^a-z+.-:]|$))`,"i"))}var Mc=V.create({name:"link",priority:1e3,keepOnSplit:!1,exitable:!0,onCreate(){this.options.validate&&!this.options.shouldAutoLink&&(this.options.shouldAutoLink=this.options.validate,console.warn("The `validate` option is deprecated. Rename to the `shouldAutoLink` option instead.")),this.options.protocols.forEach(n=>{if(typeof n=="string"){Qs(n);return}Qs(n.scheme,n.optionalSlashes)})},onDestroy(){Sc()},inclusive(){return this.options.autolink},addOptions(){return{openOnClick:!0,linkOnPaste:!0,autolink:!0,protocols:[],defaultProtocol:"http",HTMLAttributes:{target:"_blank",rel:"noopener noreferrer nofollow",class:null},isAllowedUri:(n,e)=>!!It(n,e.protocols),validate:n=>!!n,shouldAutoLink:n=>!!n}},addAttributes(){return{href:{default:null,parseHTML(n){return n.getAttribute("href")}},target:{default:this.options.HTMLAttributes.target},rel:{default:this.options.HTMLAttributes.rel},class:{default:this.options.HTMLAttributes.class}}},parseHTML(){return[{tag:"a[href]",getAttrs:n=>{let e=n.getAttribute("href");return!e||!this.options.isAllowedUri(e,{defaultValidate:t=>!!It(t,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?!1:null}}]},renderHTML({HTMLAttributes:n}){return this.options.isAllowedUri(n.href,{defaultValidate:e=>!!It(e,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?["a",v(this.options.HTMLAttributes,n),0]:["a",v(this.options.HTMLAttributes,{...n,href:""}),0]},addCommands(){return{setLink:n=>({chain:e})=>{let{href:t}=n;return this.options.isAllowedUri(t,{defaultValidate:r=>!!It(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?e().setMark(this.name,n).setMeta("preventAutolink",!0).run():!1},toggleLink:n=>({chain:e})=>{let{href:t}=n;return this.options.isAllowedUri(t,{defaultValidate:r=>!!It(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?e().toggleMark(this.name,n,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run():!1},unsetLink:()=>({chain:n})=>n().unsetMark(this.name,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()}},addPasteRules(){return[ke({find:n=>{let e=[];if(n){let{protocols:t,defaultProtocol:r}=this.options,i=Xs(n).filter(s=>s.isLink&&this.options.isAllowedUri(s.value,{defaultValidate:o=>!!It(o,t),protocols:t,defaultProtocol:r}));i.length&&i.forEach(s=>e.push({text:s.value,data:{href:s.href},index:s.start}))}return e},type:this.type,getAttributes:n=>{var e;return{href:(e=n.data)===null||e===void 0?void 0:e.href}}})]},addProseMirrorPlugins(){let n=[],{protocols:e,defaultProtocol:t}=this.options;return this.options.autolink&&n.push($p({type:this.type,defaultProtocol:this.options.defaultProtocol,validate:r=>this.options.isAllowedUri(r,{defaultValidate:i=>!!It(i,e),protocols:e,defaultProtocol:t}),shouldAutoLink:this.options.shouldAutoLink})),this.options.openOnClick===!0&&n.push(Hp({type:this.type})),this.options.linkOnPaste&&n.push(Vp({editor:this.editor,defaultProtocol:this.options.defaultProtocol,type:this.type})),n}});var Cc=L.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:n}){return["li",v(this.options.HTMLAttributes,n),0]},addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}});var wc=["image/png","image/jpeg","image/gif","image/webp"],Yr=(n,e,t={})=>{n.dom.closest("form")?.dispatchEvent(new CustomEvent(e,{composed:!0,cancelable:!0,detail:t}))},Wp=({editor:n,key:e,statePath:t,uploadingMessage:r,$wire:i})=>{let s=o=>i().callSchemaComponentMethod(e,"saveUploadedFileAttachment",{attachment:o});return new F({key:new W("localFiles"),props:{handleDrop(o,l){if(!l.dataTransfer?.files.length)return!1;let a=Array.from(l.dataTransfer.files).filter(u=>wc.includes(u.type));if(!a.length)return!1;Yr(o,"form-processing-started",{message:r}),l.preventDefault(),l.stopPropagation();let c=o.posAtCoords({left:l.clientX,top:l.clientY});return a.forEach((u,d)=>{n.setEditable(!1),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:e,livewireId:i().id}}));let f=new FileReader;f.readAsDataURL(u),f.onload=()=>{n.chain().insertContentAt(c?.pos??0,{type:"image",attrs:{class:"fi-loading",src:f.result}}).run()};let h=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,p=>(p^crypto.getRandomValues(new Uint8Array(1))[0]&15>>p/4).toString(16));i().upload(`componentFileAttachments.${t}.${h}`,u,()=>{s(h).then(p=>{p&&(n.chain().updateAttributes("image",{class:null,id:h,src:p}).run(),n.setEditable(!0),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:e,livewireId:i().id}})),d===a.length-1&&Yr(o,"form-processing-finished"))})})}),!0},handlePaste(o,l){if(!l.clipboardData?.files.length)return!1;let a=Array.from(l.clipboardData.files).filter(c=>wc.includes(c.type));return a.length?(l.preventDefault(),l.stopPropagation(),Yr(o,"form-processing-started",{message:r}),a.forEach((c,u)=>{n.setEditable(!1),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:e,livewireId:i().id}}));let d=new FileReader;d.readAsDataURL(c),d.onload=()=>{n.chain().insertContentAt(n.state.selection.anchor,{type:"image",attrs:{class:"fi-loading",src:d.result}}).run()};let f=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,h=>(h^crypto.getRandomValues(new Uint8Array(1))[0]&15>>h/4).toString(16));i().upload(`componentFileAttachments.${t}.${f}`,c,()=>{s(f).then(h=>{h&&(n.chain().updateAttributes("image",{class:null,id:f,src:h}).run(),n.setEditable(!0),o.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:e,livewireId:i().id}})),u===a.length-1&&Yr(o,"form-processing-finished"))})})}),!0):!1}}})},Ec=X.create({name:"localFiles",addOptions(){return{key:null,statePath:null,uploadingMessage:null,$wire:null}},addProseMirrorPlugins(){return[Wp({editor:this.editor,...this.options})]}});var Kp="listItem",Tc="textStyle",Oc=/^(\d+)\.\s$/,Ac=L.create({name:"orderedList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},addAttributes(){return{start:{default:1,parseHTML:n=>n.hasAttribute("start")?parseInt(n.getAttribute("start")||"",10):1},type:{default:void 0,parseHTML:n=>n.getAttribute("type")}}},parseHTML(){return[{tag:"ol"}]},renderHTML({HTMLAttributes:n}){let{start:e,...t}=n;return e===1?["ol",v(this.options.HTMLAttributes,t),0]:["ol",v(this.options.HTMLAttributes,n),0]},addCommands(){return{toggleOrderedList:()=>({commands:n,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(Kp,this.editor.getAttributes(Tc)).run():n.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-7":()=>this.editor.commands.toggleOrderedList()}},addInputRules(){let n=lt({find:Oc,type:this.type,getAttributes:e=>({start:+e[1]}),joinPredicate:(e,t)=>t.childCount+t.attrs.start===+e[1]});return(this.options.keepMarks||this.options.keepAttributes)&&(n=lt({find:Oc,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:e=>({start:+e[1],...this.editor.getAttributes(Tc)}),joinPredicate:(e,t)=>t.childCount+t.attrs.start===+e[1],editor:this.editor})),[n]}});var Nc=L.create({name:"paragraph",priority:1e3,addOptions(){return{HTMLAttributes:{}}},group:"block",content:"inline*",parseHTML(){return[{tag:"p"}]},renderHTML({HTMLAttributes:n}){return["p",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setParagraph:()=>({commands:n})=>n.setNode(this.name)}},addKeyboardShortcuts(){return{"Mod-Alt-0":()=>this.editor.commands.setParagraph()}}});var Up=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))$/,Jp=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))/g,Ic=V.create({name:"strike",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"s"},{tag:"del"},{tag:"strike"},{style:"text-decoration",consuming:!1,getAttrs:n=>n.includes("line-through")?{}:!1}]},renderHTML({HTMLAttributes:n}){return["s",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setStrike:()=>({commands:n})=>n.setMark(this.name),toggleStrike:()=>({commands:n})=>n.toggleMark(this.name),unsetStrike:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-s":()=>this.editor.commands.toggleStrike()}},addInputRules(){return[Re({find:Up,type:this.type})]},addPasteRules(){return[ke({find:Jp,type:this.type})]}});var Dc=V.create({name:"subscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sub"},{style:"vertical-align",getAttrs(n){return n!=="sub"?!1:null}}]},renderHTML({HTMLAttributes:n}){return["sub",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setSubscript:()=>({commands:n})=>n.setMark(this.name),toggleSubscript:()=>({commands:n})=>n.toggleMark(this.name),unsetSubscript:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-,":()=>this.editor.commands.toggleSubscript()}}});var vc=V.create({name:"superscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sup"},{style:"vertical-align",getAttrs(n){return n!=="super"?!1:null}}]},renderHTML({HTMLAttributes:n}){return["sup",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setSuperscript:()=>({commands:n})=>n.setMark(this.name),toggleSuperscript:()=>({commands:n})=>n.toggleMark(this.name),unsetSuperscript:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-.":()=>this.editor.commands.toggleSuperscript()}}});var Rc=L.create({name:"text",group:"inline"});var Pc=V.create({name:"underline",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"u"},{style:"text-decoration",consuming:!1,getAttrs:n=>n.includes("underline")?{}:!1}]},renderHTML({HTMLAttributes:n}){return["u",v(this.options.HTMLAttributes,n),0]},addCommands(){return{setUnderline:()=>({commands:n})=>n.setMark(this.name),toggleUnderline:()=>({commands:n})=>n.toggleMark(this.name),unsetUnderline:()=>({commands:n})=>n.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-u":()=>this.editor.commands.toggleUnderline(),"Mod-U":()=>this.editor.commands.toggleUnderline()}}});var Lc=({key:n,statePath:e,uploadingFileMessage:t,$wire:r})=>[Ka,Ua,_a,Ga,Ya,Qa,Xa,rc,ic,oc,Mc.configure({autolink:!0,openOnClick:!1}),Cc,Ec.configure({key:n,statePath:e,uploadingMessage:t,$wire:()=>r}),Ac,Nc,Ic,Dc,vc,Rc,Pc];function qp({key:n,livewireId:e,state:t,statePath:r,uploadingFileMessage:i}){let s;return{state:t,editorSelection:{type:"text",anchor:1,head:1},isUploadingFile:!1,shouldUpdateState:!0,editorUpdatedAt:Date.now(),init:function(){s=new cr({element:this.$refs.editor,extensions:Lc({key:n,statePath:r,uploadingFileMessage:i,$wire:this.$wire}),content:this.state}),s.on("create",({editor:o})=>{this.editorUpdatedAt=Date.now()}),s.on("update",({editor:o})=>{this.editorUpdatedAt=Date.now(),this.state=o.getJSON(),this.shouldUpdateState=!1}),s.on("selectionUpdate",({editor:o,transaction:l})=>{this.editorUpdatedAt=Date.now(),this.editorSelection=l.selection.toJSON()}),this.$watch("state",()=>{if(!this.shouldUpdateState){this.shouldUpdateState=!0;return}s.commands.setContent(this.state)}),window.addEventListener("run-rich-editor-commands",o=>{o.detail.livewireId===e&&o.detail.key===n&&this.runEditorCommands(o.detail)}),window.addEventListener("rich-editor-uploading-file",o=>{o.detail.livewireId===e&&o.detail.key===n&&(this.isUploadingFile=!0,o.stopPropagation())}),window.addEventListener("rich-editor-uploaded-file",o=>{o.detail.livewireId===e&&o.detail.key===n&&(this.isUploadingFile=!1,o.stopPropagation())}),window.dispatchEvent(new CustomEvent(`schema-component-${e}-${n}-loaded`))},getEditor:function(){return s},setEditorSelection:function(o){o&&(this.editorSelection=o,s.chain().command(({tr:l})=>(l.setSelection(T.fromJSON(s.state.doc,this.editorSelection)),!0)).run())},runEditorCommands:function({commands:o,editorSelection:l}){this.setEditorSelection(l);let a=s.chain();o.forEach(c=>a=a[c.name](...c.arguments??[])),a.run()}}}export{qp as default}; diff --git a/packages/forms/resources/js/components/rich-editor.js b/packages/forms/resources/js/components/rich-editor.js index 5da6de3616..b298f54c46 100644 --- a/packages/forms/resources/js/components/rich-editor.js +++ b/packages/forms/resources/js/components/rich-editor.js @@ -8,7 +8,7 @@ export default function richEditorFormComponent({ key, livewireId, state, stateP return { state, - editorSelection: null, + editorSelection: { type: 'text', anchor: 1, head: 1 }, isUploadingFile: false, diff --git a/packages/forms/resources/views/components/rich-editor.blade.php b/packages/forms/resources/views/components/rich-editor.blade.php index 741c5466f1..22bcce2367 100644 --- a/packages/forms/resources/views/components/rich-editor.blade.php +++ b/packages/forms/resources/views/components/rich-editor.blade.php @@ -276,6 +276,8 @@ class="h-5 w-5" @if ($hasToolbarButton('attachFiles')) diff --git a/packages/forms/src/Components/RichEditor.php b/packages/forms/src/Components/RichEditor.php index 7719551ddb..ab298ac090 100644 --- a/packages/forms/src/Components/RichEditor.php +++ b/packages/forms/src/Components/RichEditor.php @@ -3,6 +3,7 @@ namespace Filament\Forms\Components; use Closure; +use Filament\Forms\Components\RichEditor\Actions\AttachFilesAction; use Filament\Forms\Components\RichEditor\Actions\LinkAction; use Filament\Forms\Components\RichEditor\EditorCommand; use Filament\Forms\Components\StateCasts\RichEditorStateCast; @@ -52,6 +53,7 @@ protected function setUp(): void parent::setUp(); $this->registerActions([ + AttachFilesAction::make(), LinkAction::make(), ]); } diff --git a/packages/forms/src/Components/RichEditor/Actions/AttachFilesAction.php b/packages/forms/src/Components/RichEditor/Actions/AttachFilesAction.php new file mode 100644 index 0000000000..4ca348a658 --- /dev/null +++ b/packages/forms/src/Components/RichEditor/Actions/AttachFilesAction.php @@ -0,0 +1,89 @@ +alpineClickHandler(fn (RichEditor $component): string => '$wire.mountAction(\'attachFiles\', { alt: getEditor().getAttributes(\'image\')?.alt, id: getEditor().getAttributes(\'image\')?.id, src: getEditor().getAttributes(\'image\')?.src, editorSelection }, ' . Js::from(['schemaComponent' => $component->getKey()]) . ')') + ->modalHeading('Upload file') + ->modalWidth(Width::Large) + ->fillForm(fn (array $arguments): array => [ + 'alt' => $arguments['alt'] ?? null, + ]) + ->form(fn (array $arguments): array => [ + FileUpload::make('file') + ->label(filled($arguments['src'] ?? null) ? 'Replace file' : 'File') + ->acceptedFileTypes(['image/png', 'image/jpeg', 'image/gif', 'image/webp']) + ->storeFiles(false) + ->required(blank($arguments['src'] ?? null)) + ->hiddenLabel(blank($arguments['src'] ?? null)), + TextInput::make('alt') + ->label(filled($arguments['src'] ?? null) ? 'Change alt text' : 'Alt text'), + ]) + ->action(function (array $arguments, array $data, RichEditor $component, Component $livewire) { + if ($data['file'] ?? null) { + $id = (string) Str::orderedUuid(); + + data_set($livewire, "componentFileAttachments.{$component->getStatePath()}.{$id}", $data['file']); + $src = $component->saveUploadedFileAttachment($id); + } + + if (filled($arguments['src'] ?? null)) { + $id ??= $arguments['id'] ?? null; + $src ??= $arguments['src']; + + $component->runCommands( + [ + new EditorCommand(name: 'updateAttributes', arguments: [ + 'image', + [ + 'alt' => $data['alt'] ?? null, + 'id' => $id, + 'src' => $src, + ], + ]), + ], + editorSelection: $arguments['editorSelection'], + ); + + return; + } + + if (blank($id ?? null)) { + return; + } + + if (blank($src ?? null)) { + return; + } + + $component->runCommands( + [ + new EditorCommand(name: 'insertContent', arguments: [[ + 'type' => 'image', + 'attrs' => [ + 'alt' => $data['alt'] ?? null, + 'id' => $id, + 'src' => $src, + ], + ]]), + ], + editorSelection: $arguments['editorSelection'], + ); + }); + } +} diff --git a/packages/forms/src/Components/RichEditor/Actions/LinkAction.php b/packages/forms/src/Components/RichEditor/Actions/LinkAction.php index 1b35246f32..6293cd925a 100644 --- a/packages/forms/src/Components/RichEditor/Actions/LinkAction.php +++ b/packages/forms/src/Components/RichEditor/Actions/LinkAction.php @@ -15,7 +15,7 @@ class LinkAction public static function make(): Action { return Action::make('link') - ->alpineClickHandler(fn (RichEditor $component): string => '$wire.mountAction(\'link\', { url: getEditor().getAttributes(\'link\').href, shouldOpenInNewTab: getEditor().getAttributes(\'link\').target === \'_blank\', editorSelection }, ' . Js::from(['schemaComponent' => $component->getKey()]) . ')') + ->alpineClickHandler(fn (RichEditor $component): string => '$wire.mountAction(\'link\', { url: getEditor().getAttributes(\'link\')?.href, shouldOpenInNewTab: getEditor().getAttributes(\'link\')?.target === \'_blank\', editorSelection }, ' . Js::from(['schemaComponent' => $component->getKey()]) . ')') ->modalHeading('Link') ->modalWidth(Width::Large) ->fillForm(fn (array $arguments): array => [