diff options
-rw-r--r-- | dist/comments-comments-app.js | 4 | ||||
-rw-r--r-- | dist/comments-comments-app.js.map | 2 | ||||
-rw-r--r-- | dist/files-main.js | 4 | ||||
-rw-r--r-- | dist/files-main.js.map | 2 | ||||
-rw-r--r-- | dist/files_trashbin-main.js | 4 | ||||
-rw-r--r-- | dist/files_trashbin-main.js.map | 2 | ||||
-rw-r--r-- | webpack.common.js | 18 |
7 files changed, 26 insertions, 10 deletions
diff --git a/dist/comments-comments-app.js b/dist/comments-comments-app.js index 22c0af1d909..437a2e34908 100644 --- a/dist/comments-comments-app.js +++ b/dist/comments-comments-app.js @@ -1,3 +1,3 @@ /*! For license information please see comments-comments-app.js.LICENSE.txt */ -(()=>{var e,s={43075:(e,s,n)=>{"use strict";var o=n(17499),a=n(31352),i=n(79753),r=n(45994),m=n(79954),c=n(4820),l=n(61361),d=n(20144),u=n(93455),p=n.n(u),h=n(10861),A=n.n(h),g=n(36272),C=n(92141),f=n(94603),j=n(80351),v=n.n(j),y=n(45400),_=n.n(y),x=n(12945),b=n.n(x),w=n(875),k=n.n(w),D=n(75925),N=n.n(D),I=n(12323),O=n.n(I),T=n(13408),M=n.n(T),E=n(39429);const B={name:"Moment",props:{timestamp:{type:Number,required:!0},format:{type:String,default:"LLL"}},computed:{title(){return v().unix(this.timestamp).format(this.format)},formatted(){return v().unix(this.timestamp).fromNow()}}};var S=n(51900);const z=(0,S.Z)(B,(function(){var t=this;return(0,t._self._c)("span",{staticClass:"live-relative-timestamp",attrs:{"data-timestamp":1e3*t.timestamp,title:t.title}},[t._v(t._s(t.formatted))])}),[],!1,null,null,null).exports,R=function(){return(0,i.generateRemoteUrl)("dav/comments")};function q(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;const s=new DOMParser;let n=t;for(let t=0;t<e;t++)n=s.parseFromString(n,"text/html").documentElement.textContent;return n}var L,Z=n(14596);const P=(0,Z.eI)(R(),{headers:{"X-Requested-With":"XMLHttpRequest",requesttoken:null!==(L=(0,r.IH)())&&void 0!==L?L:""}});var $=n(64024),U=n(25108);const G={props:{id:{type:Number,default:null},message:{type:String,default:""},ressourceId:{type:[String,Number],required:!0}},data:()=>({deleted:!1,editing:!1,loading:!1}),methods:{onEdit(){this.editing=!0},onEditCancel(){this.editing=!1,this.updateLocalMessage(this.message)},async onEditComment(e){this.loading=!0;try{await async function(t,e,s,n){const o=["",t,e,s].join("/");return await P.customRequest(o,Object.assign({method:"PROPPATCH",data:'<?xml version="1.0"?>\n\t\t\t<d:propertyupdate\n\t\t\t\txmlns:d="DAV:"\n\t\t\t\txmlns:oc="http://owncloud.org/ns">\n\t\t\t<d:set>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<oc:message>'.concat(n,"</oc:message>\n\t\t\t\t</d:prop>\n\t\t\t</d:set>\n\t\t\t</d:propertyupdate>")}))}(this.commentsType,this.ressourceId,this.id,e),this.logger.debug("Comment edited",{commentsType:this.commentsType,ressourceId:this.ressourceId,id:this.id,message:e}),this.$emit("update:message",e),this.editing=!1}catch(e){(0,$.x2)(t("comments","An error occurred while trying to edit the comment")),U.error(e)}finally{this.loading=!1}},onDeleteWithUndo(){this.deleted=!0;const e=setTimeout(this.onDelete,$.et);(0,$.yl)(t("comments","Comment deleted"),(()=>{clearTimeout(e),this.deleted=!1}))},async onDelete(){try{await async function(t,e,s){const n=["",t,e,s].join("/");await P.deleteFile(n)}(this.commentsType,this.ressourceId,this.id),this.logger.debug("Comment deleted",{commentsType:this.commentsType,ressourceId:this.ressourceId,id:this.id}),this.$emit("delete",this.id)}catch(e){(0,$.x2)(t("comments","An error occurred while trying to delete the comment")),U.error(e),this.deleted=!1}},async onNewComment(e){this.loading=!0;try{const t=await async function(t,e,s){const n=["",t,e].join("/"),o=await c.default.post(R()+n,{actorDisplayName:(0,r.ts)().displayName,actorId:(0,r.ts)().uid,actorType:"users",creationDateTime:(new Date).toUTCString(),message:s,objectType:"files",verb:"comment"}),a=n+"/"+parseInt(o.headers["content-location"].split("/").pop()),i=await P.stat(a,{details:!0}),m=i.data.props;return m.actorDisplayName=q(m.actorDisplayName,2),m.message=q(m.message,2),i.data}(this.commentsType,this.ressourceId,e);this.logger.debug("New comment posted",{commentsType:this.commentsType,ressourceId:this.ressourceId,newComment:t}),this.$emit("new",t),this.$emit("update:message",""),this.localMessage=""}catch(e){(0,$.x2)(t("comments","An error occurred while trying to create the comment")),U.error(e)}finally{this.loading=!1}}}},F={name:"Comment",components:{NcActionButton:_(),NcActions:b(),NcActionSeparator:k(),ArrowRight:E.default,NcAvatar:N(),NcButton:A(),Moment:z,NcRichContenteditable:O()},mixins:[M(),G],inheritAttrs:!1,props:{actorDisplayName:{type:String,required:!0},actorId:{type:String,required:!0},creationDateTime:{type:String,default:null},editor:{type:Boolean,default:!1},autoComplete:{type:Function,required:!0},tag:{type:String,default:"div"}},data:()=>({expanded:!1,localMessage:""}),computed:{isOwnComment(){return(0,r.ts)().uid===this.actorId},renderedContent(){return this.isEmptyMessage?"":this.renderContent(this.localMessage)},isEmptyMessage(){return!this.localMessage||""===this.localMessage.trim()},timestamp(){return parseInt(v()(this.creationDateTime).format("x"),10)/1e3}},watch:{message(t){this.updateLocalMessage(t)}},beforeMount(){this.updateLocalMessage(this.message)},methods:{updateLocalMessage(t){this.localMessage=t.toString()},onSubmit(){if(""!==this.localMessage.trim())return this.editor?(this.onNewComment(this.localMessage.trim()),void this.$nextTick((()=>{this.$refs.editor.$el.focus()}))):void this.onEditComment(this.localMessage.trim())},onExpand(){this.expanded=!0}}};var Y=n(93379),H=n.n(Y),W=n(7795),V=n.n(W),Q=n(90569),K=n.n(Q),X=n(3565),J=n.n(X),tt=n(19216),et=n.n(tt),st=n(44589),nt=n.n(st),ot=n(82306),at={};at.styleTagTransform=nt(),at.setAttributes=J(),at.insert=K().bind(null,"head"),at.domAPI=V(),at.insertStyleElement=et(),H()(ot.Z,at),ot.Z&&ot.Z.locals&&ot.Z.locals;const it=(0,S.Z)(F,(function(){var t=this,e=t._self._c;return e(t.tag,{directives:[{name:"show",rawName:"v-show",value:!t.deleted,expression:"!deleted"}],tag:"component",staticClass:"comment",class:{"comment--loading":t.loading}},[e("div",{staticClass:"comment__side"},[e("NcAvatar",{staticClass:"comment__avatar",attrs:{"display-name":t.actorDisplayName,user:t.actorId,size:32}})],1),t._v(" "),e("div",{staticClass:"comment__body"},[e("div",{staticClass:"comment__header"},[e("span",{staticClass:"comment__author"},[t._v(t._s(t.actorDisplayName))]),t._v(" "),t.isOwnComment&&t.id&&!t.loading?e("NcActions",{staticClass:"comment__actions"},[t.editing?e("NcActionButton",{attrs:{icon:"icon-close"},on:{click:t.onEditCancel}},[t._v("\n\t\t\t\t\t"+t._s(t.t("comments","Cancel edit"))+"\n\t\t\t\t")]):[e("NcActionButton",{attrs:{"close-after-click":!0,icon:"icon-rename"},on:{click:t.onEdit}},[t._v("\n\t\t\t\t\t\t"+t._s(t.t("comments","Edit comment"))+"\n\t\t\t\t\t")]),t._v(" "),e("NcActionSeparator"),t._v(" "),e("NcActionButton",{attrs:{"close-after-click":!0,icon:"icon-delete"},on:{click:t.onDeleteWithUndo}},[t._v("\n\t\t\t\t\t\t"+t._s(t.t("comments","Delete comment"))+"\n\t\t\t\t\t")])]],2):t._e(),t._v(" "),t.id&&t.loading?e("div",{staticClass:"comment_loading icon-loading-small"}):t.creationDateTime?e("Moment",{staticClass:"comment__timestamp",attrs:{timestamp:t.timestamp}}):t._e()],1),t._v(" "),t.editor||t.editing?e("div",{staticClass:"comment__editor"},[e("NcRichContenteditable",{ref:"editor",attrs:{"auto-complete":t.autoComplete,contenteditable:!t.loading,value:t.localMessage,"user-data":t.userData},on:{"update:value":t.updateLocalMessage,submit:t.onSubmit}}),t._v(" "),e("NcButton",{staticClass:"comment__submit",attrs:{type:"tertiary-no-background","native-type":"submit","aria-label":t.t("comments","Post comment"),disabled:t.isEmptyMessage},on:{click:t.onSubmit},scopedSlots:t._u([{key:"icon",fn:function(){return[t.loading?e("span",{staticClass:"icon-loading-small"}):e("ArrowRight",{attrs:{size:20}})]},proxy:!0}],null,!1,2357784758)})],1):e("div",{staticClass:"comment__message",class:{"comment__message--expanded":t.expanded},domProps:{innerHTML:t._s(t.renderedContent)},on:{click:t.onExpand}})])])}),[],!1,null,"13a1afc1",null).exports;var rt=n(8338),mt=n(56714);const ct=async function(t,e){let{commentsType:s,ressourceId:n}=t;const o=["",s,n].join("/"),a=await P.customRequest(o,Object.assign({method:"REPORT",data:'<?xml version="1.0"?>\n\t\t\t<oc:filter-comments\n\t\t\t\txmlns:d="DAV:"\n\t\t\t\txmlns:oc="http://owncloud.org/ns"\n\t\t\t\txmlns:nc="http://nextcloud.org/ns"\n\t\t\t\txmlns:ocs="http://open-collaboration-services.org/ns">\n\t\t\t\t<oc:limit>'.concat(20,"</oc:limit>\n\t\t\t\t<oc:offset>").concat(e.offset||0,"</oc:offset>\n\t\t\t</oc:filter-comments>")},e)),i=await a.text(),r=await(0,Z.sw)(i),m=lt(r,!0);return(0,rt.np)(a,m,!0)},lt=function(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const{multistatus:{response:s}}=t;return s.map((t=>{const{propstat:{prop:s}}=t;return(0,mt.eg)(s,s.id.toString(),e)}))};var dt=n(25108);d.default.use(l.default);const ut={name:"Comments",components:{Comment:it,NcEmptyContent:p(),NcButton:A(),RefreshIcon:g.Z,MessageReplyTextIcon:C.Z,AlertCircleOutlineIcon:f.default},data:()=>({error:"",loading:!1,done:!1,ressourceId:null,offset:0,comments:[],cancelRequest:()=>{},editorData:{actorDisplayName:(0,r.ts)().displayName,actorId:(0,r.ts)().uid,key:"editor"},Comment:it,userData:{}}),computed:{hasComments(){return this.comments.length>0},isFirstLoading(){return this.loading&&0===this.offset}},methods:{async update(t){this.ressourceId=t,this.resetState(),this.getComments()},onScrollBottomReached(){this.error||this.done||this.loading||this.getComments()},genMentionsData(t){return Object.values(t).flat().forEach((t=>{this.userData[t.mentionId]={icon:"icon-user",id:t.mentionId,label:t.mentionDisplayName,source:"users",primary:(0,r.ts)().uid===t.mentionId}})),this.userData},async getComments(){this.cancelRequest("cancel");try{this.loading=!0,this.error="";const{request:t,abort:e}=function(t){const e=new AbortController,s=e.signal;return{request:async function(e,n){return await t(e,Object.assign({signal:s},n))},abort:()=>e.abort()}}(ct);this.cancelRequest=e;const{data:s}=await t({commentsType:this.commentsType,ressourceId:this.ressourceId},{offset:this.offset})||{data:[]};this.logger.debug("Processed ".concat(s.length," comments"),{comments:s}),s.length<20&&(this.done=!0),this.comments.push(...s),this.offset+=20}catch(e){if("cancel"===e.message)return;this.error=t("comments","Unable to load the comments list"),dt.error("Error loading the comments list",e)}finally{this.loading=!1}},async autoComplete(t,e){return(await c.default.get((0,i.generateOcsUrl)("core/autocomplete/get"),{params:{search:t,itemType:"files",itemId:this.ressourceId,sorter:"commenters|share-recipients",limit:(0,m.j)("comments","maxAutoCompleteResults")}})).data.ocs.data.forEach((t=>{this.userData[t.id]=t})),e(Object.values(this.userData))},onNewComment(t){this.comments.unshift(t)},onDelete(t){const e=this.comments.findIndex((e=>e.props.id===t));e>-1?this.comments.splice(e,1):dt.error("Could not find the deleted comment in the list",t)},resetState(){this.error="",this.loading=!1,this.done=!1,this.offset=0,this.comments=[]}}};var pt=n(35594),ht={};ht.styleTagTransform=nt(),ht.setAttributes=J(),ht.insert=K().bind(null,"head"),ht.domAPI=V(),ht.insertStyleElement=et(),H()(pt.Z,ht),pt.Z&&pt.Z.locals&&pt.Z.locals;const At=(0,S.Z)(ut,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"comments",class:{"icon-loading":t.isFirstLoading}},[e("Comment",t._b({staticClass:"comments__writer",attrs:{"auto-complete":t.autoComplete,"user-data":t.userData,editor:!0,"ressource-id":t.ressourceId},on:{new:t.onNewComment}},"Comment",t.editorData,!1)),t._v(" "),t.isFirstLoading?t._e():[!t.hasComments&&t.done?e("NcEmptyContent",{staticClass:"comments__empty",attrs:{title:t.t("comments","No comments yet, start the conversation!")},scopedSlots:t._u([{key:"icon",fn:function(){return[e("MessageReplyTextIcon")]},proxy:!0}],null,!1,1033639148)}):e("ul",t._l(t.comments,(function(s){return e("Comment",t._b({key:s.props.id,staticClass:"comments__list",attrs:{tag:"li","auto-complete":t.autoComplete,message:s.props.message,"ressource-id":t.ressourceId,"user-data":t.genMentionsData(s.props.mentions)},on:{"update:message":function(e){return t.$set(s.props,"message",e)},delete:t.onDelete}},"Comment",s.props,!1))})),1),t._v(" "),t.loading&&!t.isFirstLoading?e("div",{staticClass:"comments__info icon-loading"}):t.hasComments&&t.done?e("div",{staticClass:"comments__info"},[t._v("\n\t\t\t"+t._s(t.t("comments","No more messages"))+"\n\t\t")]):t.error?[e("NcEmptyContent",{staticClass:"comments__error",attrs:{title:t.error},scopedSlots:t._u([{key:"icon",fn:function(){return[e("AlertCircleOutlineIcon")]},proxy:!0}],null,!1,66050004)}),t._v(" "),e("NcButton",{staticClass:"comments__retry",on:{click:t.getComments},scopedSlots:t._u([{key:"icon",fn:function(){return[e("RefreshIcon")]},proxy:!0}],null,!1,3924573781)},[t._v("\n\t\t\t\t"+t._s(t.t("comments","Retry"))+"\n\t\t\t")])]:t._e()]],2)}),[],!1,null,"9e9ed272",null).exports,gt=(0,o.IY)().setApp("comments").detectUser().build();d.default.mixin({data:()=>({logger:gt}),methods:{t:a.Iu,n:a.uN}});var Ct=n(25108);window.OCA&&!window.OCA.Comments&&Object.assign(window.OCA,{Comments:{}}),Object.assign(window.OCA.Comments,{View:class{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"files",e=arguments.length>1?arguments[1]:void 0;return d.default.mixin({data:()=>({commentsType:t})}),new(d.default.extend(At))(e)}}}),Ct.debug("OCA.Comments.View initialized")},82306:(t,e,s)=>{"use strict";s.d(e,{Z:()=>r});var n=s(87537),o=s.n(n),a=s(23645),i=s.n(a)()(o());i.push([t.id,".comment[data-v-13a1afc1]{display:flex;gap:16px;position:relative;padding:5px 10px}.comment__side[data-v-13a1afc1]{display:flex;align-items:flex-start;padding-top:16px}.comment__body[data-v-13a1afc1]{display:flex;flex-grow:1;flex-direction:column}.comment__header[data-v-13a1afc1]{display:flex;align-items:center;min-height:44px}.comment__actions[data-v-13a1afc1]{margin-left:10px !important}.comment__author[data-v-13a1afc1]{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--color-text-maxcontrast)}.comment_loading[data-v-13a1afc1],.comment__timestamp[data-v-13a1afc1]{margin-left:auto;text-align:right;white-space:nowrap;color:var(--color-text-maxcontrast)}.comment__submit[data-v-13a1afc1]{position:absolute !important;right:0;bottom:0;margin:1px}.comment__message[data-v-13a1afc1]{white-space:pre-wrap;word-break:break-word;max-height:70px;overflow:hidden;margin-top:-6px}.comment__message--expanded[data-v-13a1afc1]{max-height:none;overflow:visible}.rich-contenteditable__input[data-v-13a1afc1]{min-height:44px;margin:0;padding:10px}","",{version:3,sources:["webpack://./apps/comments/src/components/Comment.vue"],names:[],mappings:"AAKA,0BACC,YAAA,CACA,QAAA,CACA,iBAAA,CACA,gBAAA,CAEA,gCACC,YAAA,CACA,sBAAA,CACA,gBAAA,CAGD,gCACC,YAAA,CACA,WAAA,CACA,qBAAA,CAGD,kCACC,YAAA,CACA,kBAAA,CACA,eAAA,CAGD,mCACC,2BAAA,CAGD,kCACC,eAAA,CACA,kBAAA,CACA,sBAAA,CACA,mCAAA,CAGD,uEAEC,gBAAA,CACA,gBAAA,CACA,kBAAA,CACA,mCAAA,CAGD,kCACC,4BAAA,CACA,OAAA,CACA,QAAA,CAEA,UAAA,CAGD,mCACC,oBAAA,CACA,qBAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CACA,6CACC,eAAA,CACA,gBAAA,CAKH,8CACC,eAAA,CACA,QAAA,CACA,YArEiB",sourcesContent:['\n@use "sass:math";\n\n$comment-padding: 10px;\n\n.comment {\n\tdisplay: flex;\n\tgap: 16px;\n\tposition: relative;\n\tpadding: 5px $comment-padding;\n\n\t&__side {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tpadding-top: 16px;\n\t}\n\n\t&__body {\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t\tflex-direction: column;\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmin-height: 44px;\n\t}\n\n\t&__actions {\n\t\tmargin-left: $comment-padding !important;\n\t}\n\n\t&__author {\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&_loading,\n\t&__timestamp {\n\t\tmargin-left: auto;\n\t\ttext-align: right;\n\t\twhite-space: nowrap;\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&__submit {\n\t\tposition: absolute !important;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\t// Align with input border\n\t\tmargin: 1px;\n\t}\n\n\t&__message {\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tmax-height: 70px;\n\t\toverflow: hidden;\n\t\tmargin-top: -6px;\n\t\t&--expanded {\n\t\t\tmax-height: none;\n\t\t\toverflow: visible;\n\t\t}\n\t}\n}\n\n.rich-contenteditable__input {\n\tmin-height: 44px;\n\tmargin: 0;\n\tpadding: $comment-padding;\n}\n\n'],sourceRoot:""}]);const r=i},35594:(t,e,s)=>{"use strict";s.d(e,{Z:()=>r});var n=s(87537),o=s.n(n),a=s(23645),i=s.n(a)()(o());i.push([t.id,".comments__empty[data-v-9e9ed272],.comments__error[data-v-9e9ed272]{margin-top:0 !important}.comments__retry[data-v-9e9ed272]{margin:0 auto}.comments__info[data-v-9e9ed272]{height:60px;color:var(--color-text-maxcontrast);text-align:center;line-height:60px}","",{version:3,sources:["webpack://./apps/comments/src/views/Comments.vue"],names:[],mappings:"AAGC,oEAEC,uBAAA,CAGD,kCACC,aAAA,CAGD,iCACC,WAAA,CACA,mCAAA,CACA,iBAAA,CACA,gBAAA",sourcesContent:["\n.comments {\n\t// Do not add emptycontent top margin\n\t&__empty,\n\t&__error {\n\t\tmargin-top: 0 !important;\n\t}\n\n\t&__retry {\n\t\tmargin: 0 auto;\n\t}\n\n\t&__info {\n\t\theight: 60px;\n\t\tcolor: var(--color-text-maxcontrast);\n\t\ttext-align: center;\n\t\tline-height: 60px;\n\t}\n}\n"],sourceRoot:""}]);const r=i},46700:(t,e,s)=>{var n={"./af":42786,"./af.js":42786,"./ar":30867,"./ar-dz":14130,"./ar-dz.js":14130,"./ar-kw":96135,"./ar-kw.js":96135,"./ar-ly":56440,"./ar-ly.js":56440,"./ar-ma":47702,"./ar-ma.js":47702,"./ar-sa":16040,"./ar-sa.js":16040,"./ar-tn":37100,"./ar-tn.js":37100,"./ar.js":30867,"./az":31083,"./az.js":31083,"./be":9808,"./be.js":9808,"./bg":68338,"./bg.js":68338,"./bm":67438,"./bm.js":67438,"./bn":8905,"./bn-bd":76225,"./bn-bd.js":76225,"./bn.js":8905,"./bo":11560,"./bo.js":11560,"./br":1278,"./br.js":1278,"./bs":80622,"./bs.js":80622,"./ca":2468,"./ca.js":2468,"./cs":5822,"./cs.js":5822,"./cv":50877,"./cv.js":50877,"./cy":47373,"./cy.js":47373,"./da":24780,"./da.js":24780,"./de":59740,"./de-at":60217,"./de-at.js":60217,"./de-ch":60894,"./de-ch.js":60894,"./de.js":59740,"./dv":5300,"./dv.js":5300,"./el":50837,"./el.js":50837,"./en-au":78348,"./en-au.js":78348,"./en-ca":77925,"./en-ca.js":77925,"./en-gb":22243,"./en-gb.js":22243,"./en-ie":46436,"./en-ie.js":46436,"./en-il":47207,"./en-il.js":47207,"./en-in":44175,"./en-in.js":44175,"./en-nz":76319,"./en-nz.js":76319,"./en-sg":31662,"./en-sg.js":31662,"./eo":92915,"./eo.js":92915,"./es":55655,"./es-do":55251,"./es-do.js":55251,"./es-mx":96112,"./es-mx.js":96112,"./es-us":71146,"./es-us.js":71146,"./es.js":55655,"./et":5603,"./et.js":5603,"./eu":77763,"./eu.js":77763,"./fa":76959,"./fa.js":76959,"./fi":11897,"./fi.js":11897,"./fil":42549,"./fil.js":42549,"./fo":94694,"./fo.js":94694,"./fr":94470,"./fr-ca":63049,"./fr-ca.js":63049,"./fr-ch":52330,"./fr-ch.js":52330,"./fr.js":94470,"./fy":5044,"./fy.js":5044,"./ga":29295,"./ga.js":29295,"./gd":2101,"./gd.js":2101,"./gl":38794,"./gl.js":38794,"./gom-deva":27884,"./gom-deva.js":27884,"./gom-latn":23168,"./gom-latn.js":23168,"./gu":95349,"./gu.js":95349,"./he":24206,"./he.js":24206,"./hi":30094,"./hi.js":30094,"./hr":30316,"./hr.js":30316,"./hu":22138,"./hu.js":22138,"./hy-am":11423,"./hy-am.js":11423,"./id":29218,"./id.js":29218,"./is":90135,"./is.js":90135,"./it":90626,"./it-ch":10150,"./it-ch.js":10150,"./it.js":90626,"./ja":39183,"./ja.js":39183,"./jv":24286,"./jv.js":24286,"./ka":12105,"./ka.js":12105,"./kk":47772,"./kk.js":47772,"./km":18758,"./km.js":18758,"./kn":79282,"./kn.js":79282,"./ko":33730,"./ko.js":33730,"./ku":1408,"./ku.js":1408,"./ky":33291,"./ky.js":33291,"./lb":36841,"./lb.js":36841,"./lo":55466,"./lo.js":55466,"./lt":57010,"./lt.js":57010,"./lv":37595,"./lv.js":37595,"./me":39861,"./me.js":39861,"./mi":35493,"./mi.js":35493,"./mk":95966,"./mk.js":95966,"./ml":87341,"./ml.js":87341,"./mn":5115,"./mn.js":5115,"./mr":10370,"./mr.js":10370,"./ms":9847,"./ms-my":41237,"./ms-my.js":41237,"./ms.js":9847,"./mt":72126,"./mt.js":72126,"./my":56165,"./my.js":56165,"./nb":64924,"./nb.js":64924,"./ne":16744,"./ne.js":16744,"./nl":93901,"./nl-be":59814,"./nl-be.js":59814,"./nl.js":93901,"./nn":83877,"./nn.js":83877,"./oc-lnc":92135,"./oc-lnc.js":92135,"./pa-in":15858,"./pa-in.js":15858,"./pl":64495,"./pl.js":64495,"./pt":89520,"./pt-br":57971,"./pt-br.js":57971,"./pt.js":89520,"./ro":96459,"./ro.js":96459,"./ru":21793,"./ru.js":21793,"./sd":40950,"./sd.js":40950,"./se":10490,"./se.js":10490,"./si":90124,"./si.js":90124,"./sk":64249,"./sk.js":64249,"./sl":14985,"./sl.js":14985,"./sq":51104,"./sq.js":51104,"./sr":49131,"./sr-cyrl":79915,"./sr-cyrl.js":79915,"./sr.js":49131,"./ss":85893,"./ss.js":85893,"./sv":98760,"./sv.js":98760,"./sw":91172,"./sw.js":91172,"./ta":27333,"./ta.js":27333,"./te":23110,"./te.js":23110,"./tet":52095,"./tet.js":52095,"./tg":27321,"./tg.js":27321,"./th":9041,"./th.js":9041,"./tk":19005,"./tk.js":19005,"./tl-ph":75768,"./tl-ph.js":75768,"./tlh":89444,"./tlh.js":89444,"./tr":72397,"./tr.js":72397,"./tzl":28254,"./tzl.js":28254,"./tzm":51106,"./tzm-latn":30699,"./tzm-latn.js":30699,"./tzm.js":51106,"./ug-cn":9288,"./ug-cn.js":9288,"./uk":67691,"./uk.js":67691,"./ur":13795,"./ur.js":13795,"./uz":6791,"./uz-latn":60588,"./uz-latn.js":60588,"./uz.js":6791,"./vi":65666,"./vi.js":65666,"./x-pseudo":14378,"./x-pseudo.js":14378,"./yo":75805,"./yo.js":75805,"./zh-cn":83839,"./zh-cn.js":83839,"./zh-hk":55726,"./zh-hk.js":55726,"./zh-mo":99807,"./zh-mo.js":99807,"./zh-tw":74152,"./zh-tw.js":74152};function o(t){var e=a(t);return s(e)}function a(t){if(!s.o(n,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return n[t]}o.keys=function(){return Object.keys(n)},o.resolve=a,t.exports=o,o.id=46700}},n={};function o(t){var e=n[t];if(void 0!==e)return e.exports;var a=n[t]={id:t,loaded:!1,exports:{}};return s[t].call(a.exports,a,a.exports,o),a.loaded=!0,a.exports}o.m=s,e=[],o.O=(t,s,n,a)=>{if(!s){var i=1/0;for(l=0;l<e.length;l++){s=e[l][0],n=e[l][1],a=e[l][2];for(var r=!0,m=0;m<s.length;m++)(!1&a||i>=a)&&Object.keys(o.O).every((t=>o.O[t](s[m])))?s.splice(m--,1):(r=!1,a<i&&(i=a));if(r){e.splice(l--,1);var c=n();void 0!==c&&(t=c)}}return t}a=a||0;for(var l=e.length;l>0&&e[l-1][2]>a;l--)e[l]=e[l-1];e[l]=[s,n,a]},o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var s in e)o.o(e,s)&&!o.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:e[s]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),o.j=6335,(()=>{o.b=document.baseURI||self.location.href;var t={6335:0};o.O.j=e=>0===t[e];var e=(e,s)=>{var n,a,i=s[0],r=s[1],m=s[2],c=0;if(i.some((e=>0!==t[e]))){for(n in r)o.o(r,n)&&(o.m[n]=r[n]);if(m)var l=m(o)}for(e&&e(s);c<i.length;c++)a=i[c],o.o(t,a)&&t[a]&&t[a][0](),t[a]=0;return o.O(l)},s=self.webpackChunknextcloud=self.webpackChunknextcloud||[];s.forEach(e.bind(null,0)),s.push=e.bind(null,s.push.bind(s))})(),o.nc=void 0;var a=o.O(void 0,[7874],(()=>o(43075)));a=o.O(a)})(); -//# sourceMappingURL=comments-comments-app.js.map?v=78e61024d65cea11029b
\ No newline at end of file +(()=>{var e,s={57673:(e,s,n)=>{"use strict";var o=n(17499),a=n(31352),i=n(79753),r=n(45994),m=n(79954),c=n(4820),l=n(61361),d=n(20144),u=n(93455),p=n.n(u),h=n(10861),A=n.n(h),g=n(36272),C=n(92141),f=n(94603),j=n(80351),v=n.n(j),y=n(45400),_=n.n(y),x=n(12945),b=n.n(x),w=n(875),k=n.n(w),D=n(75925),N=n.n(D),I=n(12323),O=n.n(I),T=n(13408),M=n.n(T),E=n(39429);const B={name:"Moment",props:{timestamp:{type:Number,required:!0},format:{type:String,default:"LLL"}},computed:{title(){return v().unix(this.timestamp).format(this.format)},formatted(){return v().unix(this.timestamp).fromNow()}}};var S=n(51900);const z=(0,S.Z)(B,(function(){var t=this;return(0,t._self._c)("span",{staticClass:"live-relative-timestamp",attrs:{"data-timestamp":1e3*t.timestamp,title:t.title}},[t._v(t._s(t.formatted))])}),[],!1,null,null,null).exports,R=function(){return(0,i.generateRemoteUrl)("dav/comments")};function q(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;const s=new DOMParser;let n=t;for(let t=0;t<e;t++)n=s.parseFromString(n,"text/html").documentElement.textContent;return n}var L,Z=n(14596);const P=(0,Z.eI)(R(),{headers:{"X-Requested-With":"XMLHttpRequest",requesttoken:null!==(L=(0,r.IH)())&&void 0!==L?L:""}});var $=n(64024),U=n(25108);const G={props:{id:{type:Number,default:null},message:{type:String,default:""},ressourceId:{type:[String,Number],required:!0}},data:()=>({deleted:!1,editing:!1,loading:!1}),methods:{onEdit(){this.editing=!0},onEditCancel(){this.editing=!1,this.updateLocalMessage(this.message)},async onEditComment(e){this.loading=!0;try{await async function(t,e,s,n){const o=["",t,e,s].join("/");return await P.customRequest(o,Object.assign({method:"PROPPATCH",data:'<?xml version="1.0"?>\n\t\t\t<d:propertyupdate\n\t\t\t\txmlns:d="DAV:"\n\t\t\t\txmlns:oc="http://owncloud.org/ns">\n\t\t\t<d:set>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<oc:message>'.concat(n,"</oc:message>\n\t\t\t\t</d:prop>\n\t\t\t</d:set>\n\t\t\t</d:propertyupdate>")}))}(this.commentsType,this.ressourceId,this.id,e),this.logger.debug("Comment edited",{commentsType:this.commentsType,ressourceId:this.ressourceId,id:this.id,message:e}),this.$emit("update:message",e),this.editing=!1}catch(e){(0,$.x2)(t("comments","An error occurred while trying to edit the comment")),U.error(e)}finally{this.loading=!1}},onDeleteWithUndo(){this.deleted=!0;const e=setTimeout(this.onDelete,$.et);(0,$.yl)(t("comments","Comment deleted"),(()=>{clearTimeout(e),this.deleted=!1}))},async onDelete(){try{await async function(t,e,s){const n=["",t,e,s].join("/");await P.deleteFile(n)}(this.commentsType,this.ressourceId,this.id),this.logger.debug("Comment deleted",{commentsType:this.commentsType,ressourceId:this.ressourceId,id:this.id}),this.$emit("delete",this.id)}catch(e){(0,$.x2)(t("comments","An error occurred while trying to delete the comment")),U.error(e),this.deleted=!1}},async onNewComment(e){this.loading=!0;try{const t=await async function(t,e,s){const n=["",t,e].join("/"),o=await c.default.post(R()+n,{actorDisplayName:(0,r.ts)().displayName,actorId:(0,r.ts)().uid,actorType:"users",creationDateTime:(new Date).toUTCString(),message:s,objectType:"files",verb:"comment"}),a=n+"/"+parseInt(o.headers["content-location"].split("/").pop()),i=await P.stat(a,{details:!0}),m=i.data.props;return m.actorDisplayName=q(m.actorDisplayName,2),m.message=q(m.message,2),i.data}(this.commentsType,this.ressourceId,e);this.logger.debug("New comment posted",{commentsType:this.commentsType,ressourceId:this.ressourceId,newComment:t}),this.$emit("new",t),this.$emit("update:message",""),this.localMessage=""}catch(e){(0,$.x2)(t("comments","An error occurred while trying to create the comment")),U.error(e)}finally{this.loading=!1}}}},F={name:"Comment",components:{NcActionButton:_(),NcActions:b(),NcActionSeparator:k(),ArrowRight:E.default,NcAvatar:N(),NcButton:A(),Moment:z,NcRichContenteditable:O()},mixins:[M(),G],inheritAttrs:!1,props:{actorDisplayName:{type:String,required:!0},actorId:{type:String,required:!0},creationDateTime:{type:String,default:null},editor:{type:Boolean,default:!1},autoComplete:{type:Function,required:!0},tag:{type:String,default:"div"}},data:()=>({expanded:!1,localMessage:""}),computed:{isOwnComment(){return(0,r.ts)().uid===this.actorId},renderedContent(){return this.isEmptyMessage?"":this.renderContent(this.localMessage)},isEmptyMessage(){return!this.localMessage||""===this.localMessage.trim()},timestamp(){return parseInt(v()(this.creationDateTime).format("x"),10)/1e3}},watch:{message(t){this.updateLocalMessage(t)}},beforeMount(){this.updateLocalMessage(this.message)},methods:{updateLocalMessage(t){this.localMessage=t.toString()},onSubmit(){if(""!==this.localMessage.trim())return this.editor?(this.onNewComment(this.localMessage.trim()),void this.$nextTick((()=>{this.$refs.editor.$el.focus()}))):void this.onEditComment(this.localMessage.trim())},onExpand(){this.expanded=!0}}};var Y=n(93379),H=n.n(Y),W=n(7795),V=n.n(W),Q=n(90569),K=n.n(Q),X=n(3565),J=n.n(X),tt=n(19216),et=n.n(tt),st=n(44589),nt=n.n(st),ot=n(82306),at={};at.styleTagTransform=nt(),at.setAttributes=J(),at.insert=K().bind(null,"head"),at.domAPI=V(),at.insertStyleElement=et(),H()(ot.Z,at),ot.Z&&ot.Z.locals&&ot.Z.locals;const it=(0,S.Z)(F,(function(){var t=this,e=t._self._c;return e(t.tag,{directives:[{name:"show",rawName:"v-show",value:!t.deleted,expression:"!deleted"}],tag:"component",staticClass:"comment",class:{"comment--loading":t.loading}},[e("div",{staticClass:"comment__side"},[e("NcAvatar",{staticClass:"comment__avatar",attrs:{"display-name":t.actorDisplayName,user:t.actorId,size:32}})],1),t._v(" "),e("div",{staticClass:"comment__body"},[e("div",{staticClass:"comment__header"},[e("span",{staticClass:"comment__author"},[t._v(t._s(t.actorDisplayName))]),t._v(" "),t.isOwnComment&&t.id&&!t.loading?e("NcActions",{staticClass:"comment__actions"},[t.editing?e("NcActionButton",{attrs:{icon:"icon-close"},on:{click:t.onEditCancel}},[t._v("\n\t\t\t\t\t"+t._s(t.t("comments","Cancel edit"))+"\n\t\t\t\t")]):[e("NcActionButton",{attrs:{"close-after-click":!0,icon:"icon-rename"},on:{click:t.onEdit}},[t._v("\n\t\t\t\t\t\t"+t._s(t.t("comments","Edit comment"))+"\n\t\t\t\t\t")]),t._v(" "),e("NcActionSeparator"),t._v(" "),e("NcActionButton",{attrs:{"close-after-click":!0,icon:"icon-delete"},on:{click:t.onDeleteWithUndo}},[t._v("\n\t\t\t\t\t\t"+t._s(t.t("comments","Delete comment"))+"\n\t\t\t\t\t")])]],2):t._e(),t._v(" "),t.id&&t.loading?e("div",{staticClass:"comment_loading icon-loading-small"}):t.creationDateTime?e("Moment",{staticClass:"comment__timestamp",attrs:{timestamp:t.timestamp}}):t._e()],1),t._v(" "),t.editor||t.editing?e("div",{staticClass:"comment__editor"},[e("NcRichContenteditable",{ref:"editor",attrs:{"auto-complete":t.autoComplete,contenteditable:!t.loading,value:t.localMessage,"user-data":t.userData},on:{"update:value":t.updateLocalMessage,submit:t.onSubmit}}),t._v(" "),e("NcButton",{staticClass:"comment__submit",attrs:{type:"tertiary-no-background","native-type":"submit","aria-label":t.t("comments","Post comment"),disabled:t.isEmptyMessage},on:{click:t.onSubmit},scopedSlots:t._u([{key:"icon",fn:function(){return[t.loading?e("span",{staticClass:"icon-loading-small"}):e("ArrowRight",{attrs:{size:20}})]},proxy:!0}],null,!1,2357784758)})],1):e("div",{staticClass:"comment__message",class:{"comment__message--expanded":t.expanded},domProps:{innerHTML:t._s(t.renderedContent)},on:{click:t.onExpand}})])])}),[],!1,null,"13a1afc1",null).exports;var rt=n(8338),mt=n(56714);const ct=async function(t,e){let{commentsType:s,ressourceId:n}=t;const o=["",s,n].join("/"),a=await P.customRequest(o,Object.assign({method:"REPORT",data:'<?xml version="1.0"?>\n\t\t\t<oc:filter-comments\n\t\t\t\txmlns:d="DAV:"\n\t\t\t\txmlns:oc="http://owncloud.org/ns"\n\t\t\t\txmlns:nc="http://nextcloud.org/ns"\n\t\t\t\txmlns:ocs="http://open-collaboration-services.org/ns">\n\t\t\t\t<oc:limit>'.concat(20,"</oc:limit>\n\t\t\t\t<oc:offset>").concat(e.offset||0,"</oc:offset>\n\t\t\t</oc:filter-comments>")},e)),i=await a.text(),r=await(0,Z.sw)(i),m=lt(r,!0);return(0,rt.np)(a,m,!0)},lt=function(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const{multistatus:{response:s}}=t;return s.map((t=>{const{propstat:{prop:s}}=t;return(0,mt.eg)(s,s.id.toString(),e)}))};var dt=n(25108);d.default.use(l.default);const ut={name:"Comments",components:{Comment:it,NcEmptyContent:p(),NcButton:A(),RefreshIcon:g.Z,MessageReplyTextIcon:C.Z,AlertCircleOutlineIcon:f.default},data:()=>({error:"",loading:!1,done:!1,ressourceId:null,offset:0,comments:[],cancelRequest:()=>{},editorData:{actorDisplayName:(0,r.ts)().displayName,actorId:(0,r.ts)().uid,key:"editor"},Comment:it,userData:{}}),computed:{hasComments(){return this.comments.length>0},isFirstLoading(){return this.loading&&0===this.offset}},methods:{async update(t){this.ressourceId=t,this.resetState(),this.getComments()},onScrollBottomReached(){this.error||this.done||this.loading||this.getComments()},genMentionsData(t){return Object.values(t).flat().forEach((t=>{this.userData[t.mentionId]={icon:"icon-user",id:t.mentionId,label:t.mentionDisplayName,source:"users",primary:(0,r.ts)().uid===t.mentionId}})),this.userData},async getComments(){this.cancelRequest("cancel");try{this.loading=!0,this.error="";const{request:t,abort:e}=function(t){const e=new AbortController,s=e.signal;return{request:async function(e,n){return await t(e,Object.assign({signal:s},n))},abort:()=>e.abort()}}(ct);this.cancelRequest=e;const{data:s}=await t({commentsType:this.commentsType,ressourceId:this.ressourceId},{offset:this.offset})||{data:[]};this.logger.debug("Processed ".concat(s.length," comments"),{comments:s}),s.length<20&&(this.done=!0),this.comments.push(...s),this.offset+=20}catch(e){if("cancel"===e.message)return;this.error=t("comments","Unable to load the comments list"),dt.error("Error loading the comments list",e)}finally{this.loading=!1}},async autoComplete(t,e){return(await c.default.get((0,i.generateOcsUrl)("core/autocomplete/get"),{params:{search:t,itemType:"files",itemId:this.ressourceId,sorter:"commenters|share-recipients",limit:(0,m.j)("comments","maxAutoCompleteResults")}})).data.ocs.data.forEach((t=>{this.userData[t.id]=t})),e(Object.values(this.userData))},onNewComment(t){this.comments.unshift(t)},onDelete(t){const e=this.comments.findIndex((e=>e.props.id===t));e>-1?this.comments.splice(e,1):dt.error("Could not find the deleted comment in the list",t)},resetState(){this.error="",this.loading=!1,this.done=!1,this.offset=0,this.comments=[]}}};var pt=n(35594),ht={};ht.styleTagTransform=nt(),ht.setAttributes=J(),ht.insert=K().bind(null,"head"),ht.domAPI=V(),ht.insertStyleElement=et(),H()(pt.Z,ht),pt.Z&&pt.Z.locals&&pt.Z.locals;const At=(0,S.Z)(ut,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"comments",class:{"icon-loading":t.isFirstLoading}},[e("Comment",t._b({staticClass:"comments__writer",attrs:{"auto-complete":t.autoComplete,"user-data":t.userData,editor:!0,"ressource-id":t.ressourceId},on:{new:t.onNewComment}},"Comment",t.editorData,!1)),t._v(" "),t.isFirstLoading?t._e():[!t.hasComments&&t.done?e("NcEmptyContent",{staticClass:"comments__empty",attrs:{title:t.t("comments","No comments yet, start the conversation!")},scopedSlots:t._u([{key:"icon",fn:function(){return[e("MessageReplyTextIcon")]},proxy:!0}],null,!1,1033639148)}):e("ul",t._l(t.comments,(function(s){return e("Comment",t._b({key:s.props.id,staticClass:"comments__list",attrs:{tag:"li","auto-complete":t.autoComplete,message:s.props.message,"ressource-id":t.ressourceId,"user-data":t.genMentionsData(s.props.mentions)},on:{"update:message":function(e){return t.$set(s.props,"message",e)},delete:t.onDelete}},"Comment",s.props,!1))})),1),t._v(" "),t.loading&&!t.isFirstLoading?e("div",{staticClass:"comments__info icon-loading"}):t.hasComments&&t.done?e("div",{staticClass:"comments__info"},[t._v("\n\t\t\t"+t._s(t.t("comments","No more messages"))+"\n\t\t")]):t.error?[e("NcEmptyContent",{staticClass:"comments__error",attrs:{title:t.error},scopedSlots:t._u([{key:"icon",fn:function(){return[e("AlertCircleOutlineIcon")]},proxy:!0}],null,!1,66050004)}),t._v(" "),e("NcButton",{staticClass:"comments__retry",on:{click:t.getComments},scopedSlots:t._u([{key:"icon",fn:function(){return[e("RefreshIcon")]},proxy:!0}],null,!1,3924573781)},[t._v("\n\t\t\t\t"+t._s(t.t("comments","Retry"))+"\n\t\t\t")])]:t._e()]],2)}),[],!1,null,"9e9ed272",null).exports,gt=(0,o.IY)().setApp("comments").detectUser().build();d.default.mixin({data:()=>({logger:gt}),methods:{t:a.Iu,n:a.uN}});var Ct=n(25108);window.OCA&&!window.OCA.Comments&&Object.assign(window.OCA,{Comments:{}}),Object.assign(window.OCA.Comments,{View:class{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"files",e=arguments.length>1?arguments[1]:void 0;return d.default.mixin({data:()=>({commentsType:t})}),new(d.default.extend(At))(e)}}}),Ct.debug("OCA.Comments.View initialized")},82306:(t,e,s)=>{"use strict";s.d(e,{Z:()=>r});var n=s(87537),o=s.n(n),a=s(23645),i=s.n(a)()(o());i.push([t.id,".comment[data-v-13a1afc1]{display:flex;gap:16px;position:relative;padding:5px 10px}.comment__side[data-v-13a1afc1]{display:flex;align-items:flex-start;padding-top:16px}.comment__body[data-v-13a1afc1]{display:flex;flex-grow:1;flex-direction:column}.comment__header[data-v-13a1afc1]{display:flex;align-items:center;min-height:44px}.comment__actions[data-v-13a1afc1]{margin-left:10px !important}.comment__author[data-v-13a1afc1]{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--color-text-maxcontrast)}.comment_loading[data-v-13a1afc1],.comment__timestamp[data-v-13a1afc1]{margin-left:auto;text-align:right;white-space:nowrap;color:var(--color-text-maxcontrast)}.comment__submit[data-v-13a1afc1]{position:absolute !important;right:0;bottom:0;margin:1px}.comment__message[data-v-13a1afc1]{white-space:pre-wrap;word-break:break-word;max-height:70px;overflow:hidden;margin-top:-6px}.comment__message--expanded[data-v-13a1afc1]{max-height:none;overflow:visible}.rich-contenteditable__input[data-v-13a1afc1]{min-height:44px;margin:0;padding:10px}","",{version:3,sources:["webpack://./apps/comments/src/components/Comment.vue"],names:[],mappings:"AAKA,0BACC,YAAA,CACA,QAAA,CACA,iBAAA,CACA,gBAAA,CAEA,gCACC,YAAA,CACA,sBAAA,CACA,gBAAA,CAGD,gCACC,YAAA,CACA,WAAA,CACA,qBAAA,CAGD,kCACC,YAAA,CACA,kBAAA,CACA,eAAA,CAGD,mCACC,2BAAA,CAGD,kCACC,eAAA,CACA,kBAAA,CACA,sBAAA,CACA,mCAAA,CAGD,uEAEC,gBAAA,CACA,gBAAA,CACA,kBAAA,CACA,mCAAA,CAGD,kCACC,4BAAA,CACA,OAAA,CACA,QAAA,CAEA,UAAA,CAGD,mCACC,oBAAA,CACA,qBAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CACA,6CACC,eAAA,CACA,gBAAA,CAKH,8CACC,eAAA,CACA,QAAA,CACA,YArEiB",sourcesContent:['\n@use "sass:math";\n\n$comment-padding: 10px;\n\n.comment {\n\tdisplay: flex;\n\tgap: 16px;\n\tposition: relative;\n\tpadding: 5px $comment-padding;\n\n\t&__side {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tpadding-top: 16px;\n\t}\n\n\t&__body {\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t\tflex-direction: column;\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmin-height: 44px;\n\t}\n\n\t&__actions {\n\t\tmargin-left: $comment-padding !important;\n\t}\n\n\t&__author {\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&_loading,\n\t&__timestamp {\n\t\tmargin-left: auto;\n\t\ttext-align: right;\n\t\twhite-space: nowrap;\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&__submit {\n\t\tposition: absolute !important;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\t// Align with input border\n\t\tmargin: 1px;\n\t}\n\n\t&__message {\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tmax-height: 70px;\n\t\toverflow: hidden;\n\t\tmargin-top: -6px;\n\t\t&--expanded {\n\t\t\tmax-height: none;\n\t\t\toverflow: visible;\n\t\t}\n\t}\n}\n\n.rich-contenteditable__input {\n\tmin-height: 44px;\n\tmargin: 0;\n\tpadding: $comment-padding;\n}\n\n'],sourceRoot:""}]);const r=i},35594:(t,e,s)=>{"use strict";s.d(e,{Z:()=>r});var n=s(87537),o=s.n(n),a=s(23645),i=s.n(a)()(o());i.push([t.id,".comments__empty[data-v-9e9ed272],.comments__error[data-v-9e9ed272]{margin-top:0 !important}.comments__retry[data-v-9e9ed272]{margin:0 auto}.comments__info[data-v-9e9ed272]{height:60px;color:var(--color-text-maxcontrast);text-align:center;line-height:60px}","",{version:3,sources:["webpack://./apps/comments/src/views/Comments.vue"],names:[],mappings:"AAGC,oEAEC,uBAAA,CAGD,kCACC,aAAA,CAGD,iCACC,WAAA,CACA,mCAAA,CACA,iBAAA,CACA,gBAAA",sourcesContent:["\n.comments {\n\t// Do not add emptycontent top margin\n\t&__empty,\n\t&__error {\n\t\tmargin-top: 0 !important;\n\t}\n\n\t&__retry {\n\t\tmargin: 0 auto;\n\t}\n\n\t&__info {\n\t\theight: 60px;\n\t\tcolor: var(--color-text-maxcontrast);\n\t\ttext-align: center;\n\t\tline-height: 60px;\n\t}\n}\n"],sourceRoot:""}]);const r=i},46700:(t,e,s)=>{var n={"./af":42786,"./af.js":42786,"./ar":30867,"./ar-dz":14130,"./ar-dz.js":14130,"./ar-kw":96135,"./ar-kw.js":96135,"./ar-ly":56440,"./ar-ly.js":56440,"./ar-ma":47702,"./ar-ma.js":47702,"./ar-sa":16040,"./ar-sa.js":16040,"./ar-tn":37100,"./ar-tn.js":37100,"./ar.js":30867,"./az":31083,"./az.js":31083,"./be":9808,"./be.js":9808,"./bg":68338,"./bg.js":68338,"./bm":67438,"./bm.js":67438,"./bn":8905,"./bn-bd":76225,"./bn-bd.js":76225,"./bn.js":8905,"./bo":11560,"./bo.js":11560,"./br":1278,"./br.js":1278,"./bs":80622,"./bs.js":80622,"./ca":2468,"./ca.js":2468,"./cs":5822,"./cs.js":5822,"./cv":50877,"./cv.js":50877,"./cy":47373,"./cy.js":47373,"./da":24780,"./da.js":24780,"./de":59740,"./de-at":60217,"./de-at.js":60217,"./de-ch":60894,"./de-ch.js":60894,"./de.js":59740,"./dv":5300,"./dv.js":5300,"./el":50837,"./el.js":50837,"./en-au":78348,"./en-au.js":78348,"./en-ca":77925,"./en-ca.js":77925,"./en-gb":22243,"./en-gb.js":22243,"./en-ie":46436,"./en-ie.js":46436,"./en-il":47207,"./en-il.js":47207,"./en-in":44175,"./en-in.js":44175,"./en-nz":76319,"./en-nz.js":76319,"./en-sg":31662,"./en-sg.js":31662,"./eo":92915,"./eo.js":92915,"./es":55655,"./es-do":55251,"./es-do.js":55251,"./es-mx":96112,"./es-mx.js":96112,"./es-us":71146,"./es-us.js":71146,"./es.js":55655,"./et":5603,"./et.js":5603,"./eu":77763,"./eu.js":77763,"./fa":76959,"./fa.js":76959,"./fi":11897,"./fi.js":11897,"./fil":42549,"./fil.js":42549,"./fo":94694,"./fo.js":94694,"./fr":94470,"./fr-ca":63049,"./fr-ca.js":63049,"./fr-ch":52330,"./fr-ch.js":52330,"./fr.js":94470,"./fy":5044,"./fy.js":5044,"./ga":29295,"./ga.js":29295,"./gd":2101,"./gd.js":2101,"./gl":38794,"./gl.js":38794,"./gom-deva":27884,"./gom-deva.js":27884,"./gom-latn":23168,"./gom-latn.js":23168,"./gu":95349,"./gu.js":95349,"./he":24206,"./he.js":24206,"./hi":30094,"./hi.js":30094,"./hr":30316,"./hr.js":30316,"./hu":22138,"./hu.js":22138,"./hy-am":11423,"./hy-am.js":11423,"./id":29218,"./id.js":29218,"./is":90135,"./is.js":90135,"./it":90626,"./it-ch":10150,"./it-ch.js":10150,"./it.js":90626,"./ja":39183,"./ja.js":39183,"./jv":24286,"./jv.js":24286,"./ka":12105,"./ka.js":12105,"./kk":47772,"./kk.js":47772,"./km":18758,"./km.js":18758,"./kn":79282,"./kn.js":79282,"./ko":33730,"./ko.js":33730,"./ku":1408,"./ku.js":1408,"./ky":33291,"./ky.js":33291,"./lb":36841,"./lb.js":36841,"./lo":55466,"./lo.js":55466,"./lt":57010,"./lt.js":57010,"./lv":37595,"./lv.js":37595,"./me":39861,"./me.js":39861,"./mi":35493,"./mi.js":35493,"./mk":95966,"./mk.js":95966,"./ml":87341,"./ml.js":87341,"./mn":5115,"./mn.js":5115,"./mr":10370,"./mr.js":10370,"./ms":9847,"./ms-my":41237,"./ms-my.js":41237,"./ms.js":9847,"./mt":72126,"./mt.js":72126,"./my":56165,"./my.js":56165,"./nb":64924,"./nb.js":64924,"./ne":16744,"./ne.js":16744,"./nl":93901,"./nl-be":59814,"./nl-be.js":59814,"./nl.js":93901,"./nn":83877,"./nn.js":83877,"./oc-lnc":92135,"./oc-lnc.js":92135,"./pa-in":15858,"./pa-in.js":15858,"./pl":64495,"./pl.js":64495,"./pt":89520,"./pt-br":57971,"./pt-br.js":57971,"./pt.js":89520,"./ro":96459,"./ro.js":96459,"./ru":21793,"./ru.js":21793,"./sd":40950,"./sd.js":40950,"./se":10490,"./se.js":10490,"./si":90124,"./si.js":90124,"./sk":64249,"./sk.js":64249,"./sl":14985,"./sl.js":14985,"./sq":51104,"./sq.js":51104,"./sr":49131,"./sr-cyrl":79915,"./sr-cyrl.js":79915,"./sr.js":49131,"./ss":85893,"./ss.js":85893,"./sv":98760,"./sv.js":98760,"./sw":91172,"./sw.js":91172,"./ta":27333,"./ta.js":27333,"./te":23110,"./te.js":23110,"./tet":52095,"./tet.js":52095,"./tg":27321,"./tg.js":27321,"./th":9041,"./th.js":9041,"./tk":19005,"./tk.js":19005,"./tl-ph":75768,"./tl-ph.js":75768,"./tlh":89444,"./tlh.js":89444,"./tr":72397,"./tr.js":72397,"./tzl":28254,"./tzl.js":28254,"./tzm":51106,"./tzm-latn":30699,"./tzm-latn.js":30699,"./tzm.js":51106,"./ug-cn":9288,"./ug-cn.js":9288,"./uk":67691,"./uk.js":67691,"./ur":13795,"./ur.js":13795,"./uz":6791,"./uz-latn":60588,"./uz-latn.js":60588,"./uz.js":6791,"./vi":65666,"./vi.js":65666,"./x-pseudo":14378,"./x-pseudo.js":14378,"./yo":75805,"./yo.js":75805,"./zh-cn":83839,"./zh-cn.js":83839,"./zh-hk":55726,"./zh-hk.js":55726,"./zh-mo":99807,"./zh-mo.js":99807,"./zh-tw":74152,"./zh-tw.js":74152};function o(t){var e=a(t);return s(e)}function a(t){if(!s.o(n,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return n[t]}o.keys=function(){return Object.keys(n)},o.resolve=a,t.exports=o,o.id=46700}},n={};function o(t){var e=n[t];if(void 0!==e)return e.exports;var a=n[t]={id:t,loaded:!1,exports:{}};return s[t].call(a.exports,a,a.exports,o),a.loaded=!0,a.exports}o.m=s,e=[],o.O=(t,s,n,a)=>{if(!s){var i=1/0;for(l=0;l<e.length;l++){s=e[l][0],n=e[l][1],a=e[l][2];for(var r=!0,m=0;m<s.length;m++)(!1&a||i>=a)&&Object.keys(o.O).every((t=>o.O[t](s[m])))?s.splice(m--,1):(r=!1,a<i&&(i=a));if(r){e.splice(l--,1);var c=n();void 0!==c&&(t=c)}}return t}a=a||0;for(var l=e.length;l>0&&e[l-1][2]>a;l--)e[l]=e[l-1];e[l]=[s,n,a]},o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var s in e)o.o(e,s)&&!o.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:e[s]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),o.j=6335,(()=>{o.b=document.baseURI||self.location.href;var t={6335:0};o.O.j=e=>0===t[e];var e=(e,s)=>{var n,a,i=s[0],r=s[1],m=s[2],c=0;if(i.some((e=>0!==t[e]))){for(n in r)o.o(r,n)&&(o.m[n]=r[n]);if(m)var l=m(o)}for(e&&e(s);c<i.length;c++)a=i[c],o.o(t,a)&&t[a]&&t[a][0](),t[a]=0;return o.O(l)},s=self.webpackChunknextcloud=self.webpackChunknextcloud||[];s.forEach(e.bind(null,0)),s.push=e.bind(null,s.push.bind(s))})(),o.nc=void 0;var a=o.O(void 0,[7874],(()=>o(57673)));a=o.O(a)})(); +//# sourceMappingURL=comments-comments-app.js.map?v=f5937e82045de62f017c
\ No newline at end of file diff --git a/dist/comments-comments-app.js.map b/dist/comments-comments-app.js.map index c5e46d75e76..db138725cea 100644 --- a/dist/comments-comments-app.js.map +++ b/dist/comments-comments-app.js.map @@ -1 +1 @@ -{"version":3,"file":"comments-comments-app.js?v=78e61024d65cea11029b","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/comments/src/components/Moment.vue","webpack:///nextcloud/apps/comments/src/components/Moment.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/comments/src/components/Moment.vue?9b20","webpack://nextcloud/./apps/comments/src/components/Moment.vue?135d","webpack:///nextcloud/apps/comments/src/utils/davUtils.js","webpack:///nextcloud/apps/comments/src/utils/decodeHtmlEntities.js","webpack:///nextcloud/apps/comments/src/services/DavClient.js","webpack:///nextcloud/apps/comments/src/mixins/CommentMixin.js","webpack:///nextcloud/apps/comments/src/services/EditComment.js","webpack:///nextcloud/apps/comments/src/services/DeleteComment.js","webpack:///nextcloud/apps/comments/src/services/NewComment.js","webpack:///nextcloud/apps/comments/src/components/Comment.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/comments/src/components/Comment.vue","webpack://nextcloud/./apps/comments/src/components/Comment.vue?9d61","webpack://nextcloud/./apps/comments/src/components/Comment.vue?7f26","webpack://nextcloud/./apps/comments/src/components/Comment.vue?d1f7","webpack:///nextcloud/apps/comments/src/services/GetComments.ts","webpack:///nextcloud/apps/comments/src/views/Comments.vue","webpack:///nextcloud/apps/comments/src/views/Comments.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/comments/src/utils/cancelableRequest.js","webpack://nextcloud/./apps/comments/src/views/Comments.vue?75d6","webpack://nextcloud/./apps/comments/src/views/Comments.vue?f45b","webpack://nextcloud/./apps/comments/src/views/Comments.vue?0e41","webpack:///nextcloud/apps/comments/src/services/CommentsInstance.js","webpack:///nextcloud/apps/comments/src/comments-app.js","webpack:///nextcloud/apps/comments/src/components/Comment.vue?vue&type=style&index=0&id=13a1afc1&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/comments/src/views/Comments.vue?vue&type=style&index=0&id=9e9ed272&prod&lang=scss&scoped=true&","webpack:///nextcloud/node_modules/moment/locale|sync|/^\\.\\/.*$","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","<!-- TODO: Move to vue components -->\n\n<template>\n\t<span class=\"live-relative-timestamp\" :data-timestamp=\"timestamp * 1000\" :title=\"title\">{{ formatted }}</span>\n</template>\n\n<script>\nimport moment from '@nextcloud/moment'\n\nexport default {\n\tname: 'Moment',\n\tprops: {\n\t\ttimestamp: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tformat: {\n\t\t\ttype: String,\n\t\t\tdefault: 'LLL',\n\t\t},\n\t},\n\tcomputed: {\n\t\ttitle() {\n\t\t\treturn moment.unix(this.timestamp).format(this.format)\n\t\t},\n\t\tformatted() {\n\t\t\treturn moment.unix(this.timestamp).fromNow()\n\t\t},\n\t},\n}\n</script>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Moment.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Moment.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Moment.vue?vue&type=template&id=57999be6&\"\nimport script from \"./Moment.vue?vue&type=script&lang=js&\"\nexport * from \"./Moment.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',{staticClass:\"live-relative-timestamp\",attrs:{\"data-timestamp\":_vm.timestamp * 1000,\"title\":_vm.title}},[_vm._v(_vm._s(_vm.formatted))])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { generateRemoteUrl } from '@nextcloud/router'\n\nconst getRootPath = function() {\n\treturn generateRemoteUrl('dav/comments')\n}\n\nexport { getRootPath }\n","/**\n * @copyright Copyright (c) 2021 Christopher Ng <chrng8@gmail.com>\n *\n * @author Christopher Ng <chrng8@gmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n/**\n * @param {any} value -\n * @param {any} passes -\n */\nexport function decodeHtmlEntities(value, passes = 1) {\n\tconst parser = new DOMParser()\n\tlet decoded = value\n\tfor (let i = 0; i < passes; i++) {\n\t\tdecoded = parser.parseFromString(decoded, 'text/html').documentElement.textContent\n\t}\n\treturn decoded\n}\n","/**\n * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { createClient } from 'webdav'\nimport { getRootPath } from '../utils/davUtils.js'\nimport { getRequestToken } from '@nextcloud/auth'\n\n// init webdav client\nconst client = createClient(getRootPath(), {\n\theaders: {\n\t\t// Add this so the server knows it is an request from the browser\n\t\t'X-Requested-With': 'XMLHttpRequest',\n\t\t// Inject user auth\n\t\trequesttoken: getRequestToken() ?? '',\n\t},\n})\n\nexport default client\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport NewComment from '../services/NewComment.js'\nimport DeleteComment from '../services/DeleteComment.js'\nimport EditComment from '../services/EditComment.js'\nimport { showError, showUndo, TOAST_UNDO_TIMEOUT } from '@nextcloud/dialogs'\n\nexport default {\n\tprops: {\n\t\tid: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tressourceId: {\n\t\t\ttype: [String, Number],\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tdeleted: false,\n\t\t\tediting: false,\n\t\t\tloading: false,\n\t\t}\n\t},\n\n\tmethods: {\n\t\t// EDITION\n\t\tonEdit() {\n\t\t\tthis.editing = true\n\t\t},\n\t\tonEditCancel() {\n\t\t\tthis.editing = false\n\t\t\t// Restore original value\n\t\t\tthis.updateLocalMessage(this.message)\n\t\t},\n\t\tasync onEditComment(message) {\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tawait EditComment(this.commentsType, this.ressourceId, this.id, message)\n\t\t\t\tthis.logger.debug('Comment edited', { commentsType: this.commentsType, ressourceId: this.ressourceId, id: this.id, message })\n\t\t\t\tthis.$emit('update:message', message)\n\t\t\t\tthis.editing = false\n\t\t\t} catch (error) {\n\t\t\t\tshowError(t('comments', 'An error occurred while trying to edit the comment'))\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t// DELETION\n\t\tonDeleteWithUndo() {\n\t\t\tthis.deleted = true\n\t\t\tconst timeOutDelete = setTimeout(this.onDelete, TOAST_UNDO_TIMEOUT)\n\t\t\tshowUndo(t('comments', 'Comment deleted'), () => {\n\t\t\t\tclearTimeout(timeOutDelete)\n\t\t\t\tthis.deleted = false\n\t\t\t})\n\t\t},\n\t\tasync onDelete() {\n\t\t\ttry {\n\t\t\t\tawait DeleteComment(this.commentsType, this.ressourceId, this.id)\n\t\t\t\tthis.logger.debug('Comment deleted', { commentsType: this.commentsType, ressourceId: this.ressourceId, id: this.id })\n\t\t\t\tthis.$emit('delete', this.id)\n\t\t\t} catch (error) {\n\t\t\t\tshowError(t('comments', 'An error occurred while trying to delete the comment'))\n\t\t\t\tconsole.error(error)\n\t\t\t\tthis.deleted = false\n\t\t\t}\n\t\t},\n\n\t\t// CREATION\n\t\tasync onNewComment(message) {\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tconst newComment = await NewComment(this.commentsType, this.ressourceId, message)\n\t\t\t\tthis.logger.debug('New comment posted', { commentsType: this.commentsType, ressourceId: this.ressourceId, newComment })\n\t\t\t\tthis.$emit('new', newComment)\n\n\t\t\t\t// Clear old content\n\t\t\t\tthis.$emit('update:message', '')\n\t\t\t\tthis.localMessage = ''\n\t\t\t} catch (error) {\n\t\t\t\tshowError(t('comments', 'An error occurred while trying to create the comment'))\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport client from './DavClient.js'\n\n/**\n * Edit an existing comment\n *\n * @param {string} commentsType the ressource type\n * @param {number} ressourceId the ressource ID\n * @param {number} commentId the comment iD\n * @param {string} message the message content\n */\nexport default async function(commentsType, ressourceId, commentId, message) {\n\tconst commentPath = ['', commentsType, ressourceId, commentId].join('/')\n\n\treturn await client.customRequest(commentPath, Object.assign({\n\t\tmethod: 'PROPPATCH',\n\t\tdata: `<?xml version=\"1.0\"?>\n\t\t\t<d:propertyupdate\n\t\t\t\txmlns:d=\"DAV:\"\n\t\t\t\txmlns:oc=\"http://owncloud.org/ns\">\n\t\t\t<d:set>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<oc:message>${message}</oc:message>\n\t\t\t\t</d:prop>\n\t\t\t</d:set>\n\t\t\t</d:propertyupdate>`,\n\t}))\n}\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport client from './DavClient.js'\n\n/**\n * Delete a comment\n *\n * @param {string} commentsType the ressource type\n * @param {number} ressourceId the ressource ID\n * @param {number} commentId the comment iD\n */\nexport default async function(commentsType, ressourceId, commentId) {\n\tconst commentPath = ['', commentsType, ressourceId, commentId].join('/')\n\n\t// Fetch newly created comment data\n\tawait client.deleteFile(commentPath)\n}\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { getRootPath } from '../utils/davUtils.js'\nimport { decodeHtmlEntities } from '../utils/decodeHtmlEntities.js'\nimport axios from '@nextcloud/axios'\nimport client from './DavClient.js'\n\n/**\n * Retrieve the comments list\n *\n * @param {string} commentsType the ressource type\n * @param {number} ressourceId the ressource ID\n * @param {string} message the message\n * @return {object} the new comment\n */\nexport default async function(commentsType, ressourceId, message) {\n\tconst ressourcePath = ['', commentsType, ressourceId].join('/')\n\n\tconst response = await axios.post(getRootPath() + ressourcePath, {\n\t\tactorDisplayName: getCurrentUser().displayName,\n\t\tactorId: getCurrentUser().uid,\n\t\tactorType: 'users',\n\t\tcreationDateTime: (new Date()).toUTCString(),\n\t\tmessage,\n\t\tobjectType: 'files',\n\t\tverb: 'comment',\n\t})\n\n\t// Retrieve comment id from ressource location\n\tconst commentId = parseInt(response.headers['content-location'].split('/').pop())\n\tconst commentPath = ressourcePath + '/' + commentId\n\n\t// Fetch newly created comment data\n\tconst comment = await client.stat(commentPath, {\n\t\tdetails: true,\n\t})\n\n\tconst props = comment.data.props\n\t// Decode twice to handle potentially double-encoded entities\n\t// FIXME Remove this once https://github.com/nextcloud/server/issues/29306\n\t// is resolved\n\tprops.actorDisplayName = decodeHtmlEntities(props.actorDisplayName, 2)\n\tprops.message = decodeHtmlEntities(props.message, 2)\n\n\treturn comment.data\n}\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comment.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comment.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<component :is=\"tag\"\n\t\tv-show=\"!deleted\"\n\t\t:class=\"{'comment--loading': loading}\"\n\t\tclass=\"comment\">\n\t\t<!-- Comment header toolbar -->\n\t\t<div class=\"comment__side\">\n\t\t\t<!-- Author -->\n\t\t\t<NcAvatar class=\"comment__avatar\"\n\t\t\t\t:display-name=\"actorDisplayName\"\n\t\t\t\t:user=\"actorId\"\n\t\t\t\t:size=\"32\" />\n\t\t</div>\n\t\t<div class=\"comment__body\">\n\t\t\t<div class=\"comment__header\">\n\t\t\t\t<span class=\"comment__author\">{{ actorDisplayName }}</span>\n\n\t\t\t\t<!-- Comment actions,\n\t\t\t\t\tshow if we have a message id and current user is author -->\n\t\t\t\t<NcActions v-if=\"isOwnComment && id && !loading\" class=\"comment__actions\">\n\t\t\t\t\t<template v-if=\"!editing\">\n\t\t\t\t\t\t<NcActionButton :close-after-click=\"true\"\n\t\t\t\t\t\t\ticon=\"icon-rename\"\n\t\t\t\t\t\t\t@click=\"onEdit\">\n\t\t\t\t\t\t\t{{ t('comments', 'Edit comment') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<NcActionSeparator />\n\t\t\t\t\t\t<NcActionButton :close-after-click=\"true\"\n\t\t\t\t\t\t\ticon=\"icon-delete\"\n\t\t\t\t\t\t\t@click=\"onDeleteWithUndo\">\n\t\t\t\t\t\t\t{{ t('comments', 'Delete comment') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<NcActionButton v-else\n\t\t\t\t\t\ticon=\"icon-close\"\n\t\t\t\t\t\t@click=\"onEditCancel\">\n\t\t\t\t\t\t{{ t('comments', 'Cancel edit') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</NcActions>\n\n\t\t\t\t<!-- Show loading if we're editing or deleting, not on new ones -->\n\t\t\t\t<div v-if=\"id && loading\" class=\"comment_loading icon-loading-small\" />\n\n\t\t\t\t<!-- Relative time to the comment creation -->\n\t\t\t\t<Moment v-else-if=\"creationDateTime\" class=\"comment__timestamp\" :timestamp=\"timestamp\" />\n\t\t\t</div>\n\n\t\t\t<!-- Message editor -->\n\t\t\t<div v-if=\"editor || editing\" class=\"comment__editor \">\n\t\t\t\t<NcRichContenteditable ref=\"editor\"\n\t\t\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t\t\t:contenteditable=\"!loading\"\n\t\t\t\t\t:value=\"localMessage\"\n\t\t\t\t\t:user-data=\"userData\"\n\t\t\t\t\t@update:value=\"updateLocalMessage\"\n\t\t\t\t\t@submit=\"onSubmit\" />\n\t\t\t\t<NcButton class=\"comment__submit\"\n\t\t\t\t\ttype=\"tertiary-no-background\"\n\t\t\t\t\tnative-type=\"submit\"\n\t\t\t\t\t:aria-label=\"t('comments', 'Post comment')\"\n\t\t\t\t\t:disabled=\"isEmptyMessage\"\n\t\t\t\t\t@click=\"onSubmit\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<span v-if=\"loading\" class=\"icon-loading-small\" />\n\t\t\t\t\t\t<ArrowRight v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\n\t\t\t<!-- Message content -->\n\t\t\t<!-- The html is escaped and sanitized before rendering -->\n\t\t\t<!-- eslint-disable-next-line vue/no-v-html-->\n\t\t\t<div v-else\n\t\t\t\t:class=\"{'comment__message--expanded': expanded}\"\n\t\t\t\tclass=\"comment__message\"\n\t\t\t\t@click=\"onExpand\"\n\t\t\t\tv-html=\"renderedContent\" />\n\t\t</div>\n\t</component>\n</template>\n\n<script>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport moment from '@nextcloud/moment'\n\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\nimport NcActionSeparator from '@nextcloud/vue/dist/Components/NcActionSeparator.js'\nimport NcAvatar from '@nextcloud/vue/dist/Components/NcAvatar.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport NcRichContenteditable from '@nextcloud/vue/dist/Components/NcRichContenteditable.js'\nimport RichEditorMixin from '@nextcloud/vue/dist/Mixins/richEditor.js'\nimport ArrowRight from 'vue-material-design-icons/ArrowRight.vue'\n\nimport Moment from './Moment.vue'\nimport CommentMixin from '../mixins/CommentMixin.js'\n\nexport default {\n\tname: 'Comment',\n\n\tcomponents: {\n\t\tNcActionButton,\n\t\tNcActions,\n\t\tNcActionSeparator,\n\t\tArrowRight,\n\t\tNcAvatar,\n\t\tNcButton,\n\t\tMoment,\n\t\tNcRichContenteditable,\n\t},\n\tmixins: [RichEditorMixin, CommentMixin],\n\n\tinheritAttrs: false,\n\n\tprops: {\n\t\tactorDisplayName: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tactorId: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tcreationDateTime: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Force the editor display\n\t\t */\n\t\teditor: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Provide the autocompletion data\n\t\t */\n\t\tautoComplete: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\n\t\ttag: {\n\t\t\ttype: String,\n\t\t\tdefault: 'div',\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\texpanded: false,\n\t\t\t// Only change data locally and update the original\n\t\t\t// parent data when the request is sent and resolved\n\t\t\tlocalMessage: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\n\t\t/**\n\t\t * Is the current user the author of this comment\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisOwnComment() {\n\t\t\treturn getCurrentUser().uid === this.actorId\n\t\t},\n\n\t\t/**\n\t\t * Rendered content as html string\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\trenderedContent() {\n\t\t\tif (this.isEmptyMessage) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn this.renderContent(this.localMessage)\n\t\t},\n\n\t\tisEmptyMessage() {\n\t\t\treturn !this.localMessage || this.localMessage.trim() === ''\n\t\t},\n\n\t\ttimestamp() {\n\t\t\t// seconds, not milliseconds\n\t\t\treturn parseInt(moment(this.creationDateTime).format('x'), 10) / 1000\n\t\t},\n\t},\n\n\twatch: {\n\t\t// If the data change, update the local value\n\t\tmessage(message) {\n\t\t\tthis.updateLocalMessage(message)\n\t\t},\n\t},\n\n\tbeforeMount() {\n\t\t// Init localMessage\n\t\tthis.updateLocalMessage(this.message)\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Update local Message on outer change\n\t\t *\n\t\t * @param {string} message the message to set\n\t\t */\n\t\tupdateLocalMessage(message) {\n\t\t\tthis.localMessage = message.toString()\n\t\t},\n\n\t\t/**\n\t\t * Dispatch message between edit and create\n\t\t */\n\t\tonSubmit() {\n\t\t\t// Do not submit if message is empty\n\t\t\tif (this.localMessage.trim() === '') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (this.editor) {\n\t\t\t\tthis.onNewComment(this.localMessage.trim())\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t// Focus the editor again\n\t\t\t\t\tthis.$refs.editor.$el.focus()\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.onEditComment(this.localMessage.trim())\n\t\t},\n\n\t\tonExpand() {\n\t\t\tthis.expanded = true\n\t\t},\n\t},\n\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"sass:math\";\n\n$comment-padding: 10px;\n\n.comment {\n\tdisplay: flex;\n\tgap: 16px;\n\tposition: relative;\n\tpadding: 5px $comment-padding;\n\n\t&__side {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tpadding-top: 16px;\n\t}\n\n\t&__body {\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t\tflex-direction: column;\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmin-height: 44px;\n\t}\n\n\t&__actions {\n\t\tmargin-left: $comment-padding !important;\n\t}\n\n\t&__author {\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&_loading,\n\t&__timestamp {\n\t\tmargin-left: auto;\n\t\ttext-align: right;\n\t\twhite-space: nowrap;\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&__submit {\n\t\tposition: absolute !important;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\t// Align with input border\n\t\tmargin: 1px;\n\t}\n\n\t&__message {\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tmax-height: 70px;\n\t\toverflow: hidden;\n\t\tmargin-top: -6px;\n\t\t&--expanded {\n\t\t\tmax-height: none;\n\t\t\toverflow: visible;\n\t\t}\n\t}\n}\n\n.rich-contenteditable__input {\n\tmin-height: 44px;\n\tmargin: 0;\n\tpadding: $comment-padding;\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comment.vue?vue&type=style&index=0&id=13a1afc1&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comment.vue?vue&type=style&index=0&id=13a1afc1&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Comment.vue?vue&type=template&id=13a1afc1&scoped=true&\"\nimport script from \"./Comment.vue?vue&type=script&lang=js&\"\nexport * from \"./Comment.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Comment.vue?vue&type=style&index=0&id=13a1afc1&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"13a1afc1\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c(_vm.tag,{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.deleted),expression:\"!deleted\"}],tag:\"component\",staticClass:\"comment\",class:{'comment--loading': _vm.loading}},[_c('div',{staticClass:\"comment__side\"},[_c('NcAvatar',{staticClass:\"comment__avatar\",attrs:{\"display-name\":_vm.actorDisplayName,\"user\":_vm.actorId,\"size\":32}})],1),_vm._v(\" \"),_c('div',{staticClass:\"comment__body\"},[_c('div',{staticClass:\"comment__header\"},[_c('span',{staticClass:\"comment__author\"},[_vm._v(_vm._s(_vm.actorDisplayName))]),_vm._v(\" \"),(_vm.isOwnComment && _vm.id && !_vm.loading)?_c('NcActions',{staticClass:\"comment__actions\"},[(!_vm.editing)?[_c('NcActionButton',{attrs:{\"close-after-click\":true,\"icon\":\"icon-rename\"},on:{\"click\":_vm.onEdit}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('comments', 'Edit comment'))+\"\\n\\t\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('NcActionSeparator'),_vm._v(\" \"),_c('NcActionButton',{attrs:{\"close-after-click\":true,\"icon\":\"icon-delete\"},on:{\"click\":_vm.onDeleteWithUndo}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('comments', 'Delete comment'))+\"\\n\\t\\t\\t\\t\\t\")])]:_c('NcActionButton',{attrs:{\"icon\":\"icon-close\"},on:{\"click\":_vm.onEditCancel}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('comments', 'Cancel edit'))+\"\\n\\t\\t\\t\\t\")])],2):_vm._e(),_vm._v(\" \"),(_vm.id && _vm.loading)?_c('div',{staticClass:\"comment_loading icon-loading-small\"}):(_vm.creationDateTime)?_c('Moment',{staticClass:\"comment__timestamp\",attrs:{\"timestamp\":_vm.timestamp}}):_vm._e()],1),_vm._v(\" \"),(_vm.editor || _vm.editing)?_c('div',{staticClass:\"comment__editor\"},[_c('NcRichContenteditable',{ref:\"editor\",attrs:{\"auto-complete\":_vm.autoComplete,\"contenteditable\":!_vm.loading,\"value\":_vm.localMessage,\"user-data\":_vm.userData},on:{\"update:value\":_vm.updateLocalMessage,\"submit\":_vm.onSubmit}}),_vm._v(\" \"),_c('NcButton',{staticClass:\"comment__submit\",attrs:{\"type\":\"tertiary-no-background\",\"native-type\":\"submit\",\"aria-label\":_vm.t('comments', 'Post comment'),\"disabled\":_vm.isEmptyMessage},on:{\"click\":_vm.onSubmit},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(_vm.loading)?_c('span',{staticClass:\"icon-loading-small\"}):_c('ArrowRight',{attrs:{\"size\":20}})]},proxy:true}],null,false,2357784758)})],1):_c('div',{staticClass:\"comment__message\",class:{'comment__message--expanded': _vm.expanded},domProps:{\"innerHTML\":_vm._s(_vm.renderedContent)},on:{\"click\":_vm.onExpand}})])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { parseXML, type DAVResult, type FileStat } from 'webdav'\n\n// https://github.com/perry-mitchell/webdav-client/issues/339\nimport { processResponsePayload } from '../../../../node_modules/webdav/dist/node/response.js'\nimport { prepareFileFromProps } from '../../../../node_modules/webdav/dist/node/tools/dav.js'\nimport client from './DavClient.js'\n\nexport const DEFAULT_LIMIT = 20\n\n/**\n * Retrieve the comments list\n *\n * @param {object} data destructuring object\n * @param {string} data.commentsType the ressource type\n * @param {number} data.ressourceId the ressource ID\n * @param {object} [options] optional options for axios\n * @param {number} [options.offset] the pagination offset\n * @return {object[]} the comments list\n */\nexport const getComments = async function({ commentsType, ressourceId }, options: { offset: number }) {\n\tconst ressourcePath = ['', commentsType, ressourceId].join('/')\n\n\tconst response = await client.customRequest(ressourcePath, Object.assign({\n\t\tmethod: 'REPORT',\n\t\tdata: `<?xml version=\"1.0\"?>\n\t\t\t<oc:filter-comments\n\t\t\t\txmlns:d=\"DAV:\"\n\t\t\t\txmlns:oc=\"http://owncloud.org/ns\"\n\t\t\t\txmlns:nc=\"http://nextcloud.org/ns\"\n\t\t\t\txmlns:ocs=\"http://open-collaboration-services.org/ns\">\n\t\t\t\t<oc:limit>${DEFAULT_LIMIT}</oc:limit>\n\t\t\t\t<oc:offset>${options.offset || 0}</oc:offset>\n\t\t\t</oc:filter-comments>`,\n\t}, options))\n\n\tconst responseData = await response.text()\n\tconst result = await parseXML(responseData)\n\tconst stat = getDirectoryFiles(result, true)\n\treturn processResponsePayload(response, stat, true)\n}\n\n// https://github.com/perry-mitchell/webdav-client/blob/8d9694613c978ce7404e26a401c39a41f125f87f/source/operations/directoryContents.ts\nconst getDirectoryFiles = function(\n\tresult: DAVResult,\n\tisDetailed = false,\n): Array<FileStat> {\n\t// Extract the response items (directory contents)\n\tconst {\n\t\tmultistatus: { response: responseItems },\n\t} = result\n\n\t// Map all items to a consistent output structure (results)\n\treturn responseItems.map(item => {\n\t\t// Each item should contain a stat object\n\t\tconst {\n\t\t\tpropstat: { prop: props },\n\t\t} = item\n\n\t\treturn prepareFileFromProps(props, props.id.toString(), isDetailed)\n\t})\n}\n","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n - @author Richard Steinmetz <richard@steinmetz.cloud>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"comments\" :class=\"{ 'icon-loading': isFirstLoading }\">\n\t\t<!-- Editor -->\n\t\t<Comment v-bind=\"editorData\"\n\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t:user-data=\"userData\"\n\t\t\t:editor=\"true\"\n\t\t\t:ressource-id=\"ressourceId\"\n\t\t\tclass=\"comments__writer\"\n\t\t\t@new=\"onNewComment\" />\n\n\t\t<template v-if=\"!isFirstLoading\">\n\t\t\t<NcEmptyContent v-if=\"!hasComments && done\"\n\t\t\t\tclass=\"comments__empty\"\n\t\t\t\t:title=\"t('comments', 'No comments yet, start the conversation!')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<MessageReplyTextIcon />\n\t\t\t\t</template>\n\t\t\t</NcEmptyContent>\n\t\t\t<ul v-else>\n\t\t\t\t<!-- Comments -->\n\t\t\t\t<Comment v-for=\"comment in comments\"\n\t\t\t\t\t:key=\"comment.props.id\"\n\t\t\t\t\ttag=\"li\"\n\t\t\t\t\tv-bind=\"comment.props\"\n\t\t\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t\t\t:message.sync=\"comment.props.message\"\n\t\t\t\t\t:ressource-id=\"ressourceId\"\n\t\t\t\t\t:user-data=\"genMentionsData(comment.props.mentions)\"\n\t\t\t\t\tclass=\"comments__list\"\n\t\t\t\t\t@delete=\"onDelete\" />\n\t\t\t</ul>\n\n\t\t\t<!-- Loading more message -->\n\t\t\t<div v-if=\"loading && !isFirstLoading\" class=\"comments__info icon-loading\" />\n\n\t\t\t<div v-else-if=\"hasComments && done\" class=\"comments__info\">\n\t\t\t\t{{ t('comments', 'No more messages') }}\n\t\t\t</div>\n\n\t\t\t<!-- Error message -->\n\t\t\t<template v-else-if=\"error\">\n\t\t\t\t<NcEmptyContent class=\"comments__error\" :title=\"error\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<AlertCircleOutlineIcon />\n\t\t\t\t\t</template>\n\t\t\t\t</NcEmptyContent>\n\t\t\t\t<NcButton class=\"comments__retry\" @click=\"getComments\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<RefreshIcon />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('comments', 'Retry') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { loadState } from '@nextcloud/initial-state'\nimport axios from '@nextcloud/axios'\nimport VTooltip from 'v-tooltip'\nimport Vue from 'vue'\n\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport RefreshIcon from 'vue-material-design-icons/Refresh.vue'\nimport MessageReplyTextIcon from 'vue-material-design-icons/MessageReplyText.vue'\nimport AlertCircleOutlineIcon from 'vue-material-design-icons/AlertCircleOutline.vue'\n\nimport Comment from '../components/Comment.vue'\nimport { getComments, DEFAULT_LIMIT } from '../services/GetComments.ts'\nimport cancelableRequest from '../utils/cancelableRequest.js'\n\nVue.use(VTooltip)\n\nexport default {\n\tname: 'Comments',\n\n\tcomponents: {\n\t\t// Avatar,\n\t\tComment,\n\t\tNcEmptyContent,\n\t\tNcButton,\n\t\tRefreshIcon,\n\t\tMessageReplyTextIcon,\n\t\tAlertCircleOutlineIcon,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\terror: '',\n\t\t\tloading: false,\n\t\t\tdone: false,\n\n\t\t\tressourceId: null,\n\t\t\toffset: 0,\n\t\t\tcomments: [],\n\n\t\t\tcancelRequest: () => {},\n\n\t\t\teditorData: {\n\t\t\t\tactorDisplayName: getCurrentUser().displayName,\n\t\t\t\tactorId: getCurrentUser().uid,\n\t\t\t\tkey: 'editor',\n\t\t\t},\n\n\t\t\tComment,\n\t\t\tuserData: {},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\thasComments() {\n\t\t\treturn this.comments.length > 0\n\t\t},\n\t\tisFirstLoading() {\n\t\t\treturn this.loading && this.offset === 0\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Update current ressourceId and fetch new data\n\t\t *\n\t\t * @param {number} ressourceId the current ressourceId (fileId...)\n\t\t */\n\t\tasync update(ressourceId) {\n\t\t\tthis.ressourceId = ressourceId\n\t\t\tthis.resetState()\n\t\t\tthis.getComments()\n\t\t},\n\n\t\t/**\n\t\t * Ran when the bottom of the tab is reached\n\t\t */\n\t\tonScrollBottomReached() {\n\t\t\t/**\n\t\t\t * Do not fetch more if we:\n\t\t\t * - are showing an error\n\t\t\t * - already fetched everything\n\t\t\t * - are currently loading\n\t\t\t */\n\t\t\tif (this.error || this.done || this.loading) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.getComments()\n\t\t},\n\n\t\t/**\n\t\t * Make sure we have all mentions as Array of objects\n\t\t *\n\t\t * @param {Array} mentions the mentions list\n\t\t * @return {Object<string, object>}\n\t\t */\n\t\tgenMentionsData(mentions) {\n\t\t\tObject.values(mentions)\n\t\t\t\t.flat()\n\t\t\t\t.forEach(mention => {\n\t\t\t\t\tthis.userData[mention.mentionId] = {\n\t\t\t\t\t\t// TODO: support groups\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: mention.mentionId,\n\t\t\t\t\t\tlabel: mention.mentionDisplayName,\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tprimary: getCurrentUser().uid === mention.mentionId,\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\treturn this.userData\n\t\t},\n\n\t\t/**\n\t\t * Get the existing shares infos\n\t\t */\n\t\tasync getComments() {\n\t\t\t// Cancel any ongoing request\n\t\t\tthis.cancelRequest('cancel')\n\n\t\t\ttry {\n\t\t\t\tthis.loading = true\n\t\t\t\tthis.error = ''\n\n\t\t\t\t// Init cancellable request\n\t\t\t\tconst { request, abort } = cancelableRequest(getComments)\n\t\t\t\tthis.cancelRequest = abort\n\n\t\t\t\t// Fetch comments\n\t\t\t\tconst { data: comments } = await request({\n\t\t\t\t\tcommentsType: this.commentsType,\n\t\t\t\t\tressourceId: this.ressourceId,\n\t\t\t\t}, { offset: this.offset }) || { data: [] }\n\n\t\t\t\tthis.logger.debug(`Processed ${comments.length} comments`, { comments })\n\n\t\t\t\t// We received less than the requested amount,\n\t\t\t\t// we're done fetching comments\n\t\t\t\tif (comments.length < DEFAULT_LIMIT) {\n\t\t\t\t\tthis.done = true\n\t\t\t\t}\n\n\t\t\t\t// Insert results\n\t\t\t\tthis.comments.push(...comments)\n\n\t\t\t\t// Increase offset for next fetch\n\t\t\t\tthis.offset += DEFAULT_LIMIT\n\t\t\t} catch (error) {\n\t\t\t\tif (error.message === 'cancel') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tthis.error = t('comments', 'Unable to load the comments list')\n\t\t\t\tconsole.error('Error loading the comments list', error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Autocomplete @mentions\n\t\t *\n\t\t * @param {string} search the query\n\t\t * @param {Function} callback the callback to process the results with\n\t\t */\n\t\tasync autoComplete(search, callback) {\n\t\t\tconst results = await axios.get(generateOcsUrl('core/autocomplete/get'), {\n\t\t\t\tparams: {\n\t\t\t\t\tsearch,\n\t\t\t\t\titemType: 'files',\n\t\t\t\t\titemId: this.ressourceId,\n\t\t\t\t\tsorter: 'commenters|share-recipients',\n\t\t\t\t\tlimit: loadState('comments', 'maxAutoCompleteResults'),\n\t\t\t\t},\n\t\t\t})\n\t\t\t// Save user data so it can be used by the editor to replace mentions\n\t\t\tresults.data.ocs.data.forEach(user => { this.userData[user.id] = user })\n\t\t\treturn callback(Object.values(this.userData))\n\t\t},\n\n\t\t/**\n\t\t * Add newly created comment to the list\n\t\t *\n\t\t * @param {object} comment the new comment\n\t\t */\n\t\tonNewComment(comment) {\n\t\t\tthis.comments.unshift(comment)\n\t\t},\n\n\t\t/**\n\t\t * Remove deleted comment from the list\n\t\t *\n\t\t * @param {number} id the deleted comment\n\t\t */\n\t\tonDelete(id) {\n\t\t\tconst index = this.comments.findIndex(comment => comment.props.id === id)\n\t\t\tif (index > -1) {\n\t\t\t\tthis.comments.splice(index, 1)\n\t\t\t} else {\n\t\t\t\tconsole.error('Could not find the deleted comment in the list', id)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Reset the current view to its default state\n\t\t */\n\t\tresetState() {\n\t\t\tthis.error = ''\n\t\t\tthis.loading = false\n\t\t\tthis.done = false\n\t\t\tthis.offset = 0\n\t\t\tthis.comments = []\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.comments {\n\t// Do not add emptycontent top margin\n\t&__empty,\n\t&__error {\n\t\tmargin-top: 0 !important;\n\t}\n\n\t&__retry {\n\t\tmargin: 0 auto;\n\t}\n\n\t&__info {\n\t\theight: 60px;\n\t\tcolor: var(--color-text-maxcontrast);\n\t\ttext-align: center;\n\t\tline-height: 60px;\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comments.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comments.vue?vue&type=script&lang=js&\"","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n/**\n * Creates a cancelable axios 'request object'.\n *\n * @param {Function} request the axios promise request\n * @return {object}\n */\nconst cancelableRequest = function(request) {\n\tconst controller = new AbortController()\n\tconst signal = controller.signal\n\n\t/**\n\t * Execute the request\n\t *\n\t * @param {string} url the url to send the request to\n\t * @param {object} [options] optional config for the request\n\t */\n\tconst fetch = async function(url, options) {\n\t\tconst response = await request(\n\t\t\turl,\n\t\t\tObject.assign({ signal }, options)\n\t\t)\n\t\treturn response\n\t}\n\n\treturn {\n\t\trequest: fetch,\n\t\tabort: () => controller.abort(),\n\t}\n}\n\nexport default cancelableRequest\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comments.vue?vue&type=style&index=0&id=9e9ed272&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comments.vue?vue&type=style&index=0&id=9e9ed272&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Comments.vue?vue&type=template&id=9e9ed272&scoped=true&\"\nimport script from \"./Comments.vue?vue&type=script&lang=js&\"\nexport * from \"./Comments.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Comments.vue?vue&type=style&index=0&id=9e9ed272&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"9e9ed272\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"comments\",class:{ 'icon-loading': _vm.isFirstLoading }},[_c('Comment',_vm._b({staticClass:\"comments__writer\",attrs:{\"auto-complete\":_vm.autoComplete,\"user-data\":_vm.userData,\"editor\":true,\"ressource-id\":_vm.ressourceId},on:{\"new\":_vm.onNewComment}},'Comment',_vm.editorData,false)),_vm._v(\" \"),(!_vm.isFirstLoading)?[(!_vm.hasComments && _vm.done)?_c('NcEmptyContent',{staticClass:\"comments__empty\",attrs:{\"title\":_vm.t('comments', 'No comments yet, start the conversation!')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('MessageReplyTextIcon')]},proxy:true}],null,false,1033639148)}):_c('ul',_vm._l((_vm.comments),function(comment){return _c('Comment',_vm._b({key:comment.props.id,staticClass:\"comments__list\",attrs:{\"tag\":\"li\",\"auto-complete\":_vm.autoComplete,\"message\":comment.props.message,\"ressource-id\":_vm.ressourceId,\"user-data\":_vm.genMentionsData(comment.props.mentions)},on:{\"update:message\":function($event){return _vm.$set(comment.props, \"message\", $event)},\"delete\":_vm.onDelete}},'Comment',comment.props,false))}),1),_vm._v(\" \"),(_vm.loading && !_vm.isFirstLoading)?_c('div',{staticClass:\"comments__info icon-loading\"}):(_vm.hasComments && _vm.done)?_c('div',{staticClass:\"comments__info\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('comments', 'No more messages'))+\"\\n\\t\\t\")]):(_vm.error)?[_c('NcEmptyContent',{staticClass:\"comments__error\",attrs:{\"title\":_vm.error},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('AlertCircleOutlineIcon')]},proxy:true}],null,false,66050004)}),_vm._v(\" \"),_c('NcButton',{staticClass:\"comments__retry\",on:{\"click\":_vm.getComments},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('RefreshIcon')]},proxy:true}],null,false,3924573781)},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('comments', 'Retry'))+\"\\n\\t\\t\\t\")])]:_vm._e()]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n'\nimport CommentsApp from '../views/Comments.vue'\nimport Vue from 'vue'\n\nconst logger = getLoggerBuilder()\n\t.setApp('comments')\n\t.detectUser()\n\t.build()\n\n// Add translates functions\nVue.mixin({\n\tdata() {\n\t\treturn {\n\t\t\tlogger,\n\t\t}\n\t},\n\tmethods: {\n\t\tt,\n\t\tn,\n\t},\n})\n\nexport default class CommentInstance {\n\n\t/**\n\t * Initialize a new Comments instance for the desired type\n\t *\n\t * @param {string} commentsType the comments endpoint type\n\t * @param {object} options the vue options (propsData, parent, el...)\n\t */\n\tconstructor(commentsType = 'files', options) {\n\t\t// Add comments type as a global mixin\n\t\tVue.mixin({\n\t\t\tdata() {\n\t\t\t\treturn {\n\t\t\t\t\tcommentsType,\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\n\t\t// Init Comments component\n\t\tconst View = Vue.extend(CommentsApp)\n\t\treturn new View(options)\n\t}\n\n}\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport CommentsInstance from './services/CommentsInstance.js'\n\n// Init Comments\nif (window.OCA && !window.OCA.Comments) {\n\tObject.assign(window.OCA, { Comments: {} })\n}\n\n// Init Comments App view\nObject.assign(window.OCA.Comments, { View: CommentsInstance })\nconsole.debug('OCA.Comments.View initialized')\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".comment[data-v-13a1afc1]{display:flex;gap:16px;position:relative;padding:5px 10px}.comment__side[data-v-13a1afc1]{display:flex;align-items:flex-start;padding-top:16px}.comment__body[data-v-13a1afc1]{display:flex;flex-grow:1;flex-direction:column}.comment__header[data-v-13a1afc1]{display:flex;align-items:center;min-height:44px}.comment__actions[data-v-13a1afc1]{margin-left:10px !important}.comment__author[data-v-13a1afc1]{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--color-text-maxcontrast)}.comment_loading[data-v-13a1afc1],.comment__timestamp[data-v-13a1afc1]{margin-left:auto;text-align:right;white-space:nowrap;color:var(--color-text-maxcontrast)}.comment__submit[data-v-13a1afc1]{position:absolute !important;right:0;bottom:0;margin:1px}.comment__message[data-v-13a1afc1]{white-space:pre-wrap;word-break:break-word;max-height:70px;overflow:hidden;margin-top:-6px}.comment__message--expanded[data-v-13a1afc1]{max-height:none;overflow:visible}.rich-contenteditable__input[data-v-13a1afc1]{min-height:44px;margin:0;padding:10px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/comments/src/components/Comment.vue\"],\"names\":[],\"mappings\":\"AAKA,0BACC,YAAA,CACA,QAAA,CACA,iBAAA,CACA,gBAAA,CAEA,gCACC,YAAA,CACA,sBAAA,CACA,gBAAA,CAGD,gCACC,YAAA,CACA,WAAA,CACA,qBAAA,CAGD,kCACC,YAAA,CACA,kBAAA,CACA,eAAA,CAGD,mCACC,2BAAA,CAGD,kCACC,eAAA,CACA,kBAAA,CACA,sBAAA,CACA,mCAAA,CAGD,uEAEC,gBAAA,CACA,gBAAA,CACA,kBAAA,CACA,mCAAA,CAGD,kCACC,4BAAA,CACA,OAAA,CACA,QAAA,CAEA,UAAA,CAGD,mCACC,oBAAA,CACA,qBAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CACA,6CACC,eAAA,CACA,gBAAA,CAKH,8CACC,eAAA,CACA,QAAA,CACA,YArEiB\",\"sourcesContent\":[\"\\n@use \\\"sass:math\\\";\\n\\n$comment-padding: 10px;\\n\\n.comment {\\n\\tdisplay: flex;\\n\\tgap: 16px;\\n\\tposition: relative;\\n\\tpadding: 5px $comment-padding;\\n\\n\\t&__side {\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: flex-start;\\n\\t\\tpadding-top: 16px;\\n\\t}\\n\\n\\t&__body {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-grow: 1;\\n\\t\\tflex-direction: column;\\n\\t}\\n\\n\\t&__header {\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t\\tmin-height: 44px;\\n\\t}\\n\\n\\t&__actions {\\n\\t\\tmargin-left: $comment-padding !important;\\n\\t}\\n\\n\\t&__author {\\n\\t\\toverflow: hidden;\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t}\\n\\n\\t&_loading,\\n\\t&__timestamp {\\n\\t\\tmargin-left: auto;\\n\\t\\ttext-align: right;\\n\\t\\twhite-space: nowrap;\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t}\\n\\n\\t&__submit {\\n\\t\\tposition: absolute !important;\\n\\t\\tright: 0;\\n\\t\\tbottom: 0;\\n\\t\\t// Align with input border\\n\\t\\tmargin: 1px;\\n\\t}\\n\\n\\t&__message {\\n\\t\\twhite-space: pre-wrap;\\n\\t\\tword-break: break-word;\\n\\t\\tmax-height: 70px;\\n\\t\\toverflow: hidden;\\n\\t\\tmargin-top: -6px;\\n\\t\\t&--expanded {\\n\\t\\t\\tmax-height: none;\\n\\t\\t\\toverflow: visible;\\n\\t\\t}\\n\\t}\\n}\\n\\n.rich-contenteditable__input {\\n\\tmin-height: 44px;\\n\\tmargin: 0;\\n\\tpadding: $comment-padding;\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".comments__empty[data-v-9e9ed272],.comments__error[data-v-9e9ed272]{margin-top:0 !important}.comments__retry[data-v-9e9ed272]{margin:0 auto}.comments__info[data-v-9e9ed272]{height:60px;color:var(--color-text-maxcontrast);text-align:center;line-height:60px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/comments/src/views/Comments.vue\"],\"names\":[],\"mappings\":\"AAGC,oEAEC,uBAAA,CAGD,kCACC,aAAA,CAGD,iCACC,WAAA,CACA,mCAAA,CACA,iBAAA,CACA,gBAAA\",\"sourcesContent\":[\"\\n.comments {\\n\\t// Do not add emptycontent top margin\\n\\t&__empty,\\n\\t&__error {\\n\\t\\tmargin-top: 0 !important;\\n\\t}\\n\\n\\t&__retry {\\n\\t\\tmargin: 0 auto;\\n\\t}\\n\\n\\t&__info {\\n\\t\\theight: 60px;\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t\\ttext-align: center;\\n\\t\\tline-height: 60px;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 6335;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t6335: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], () => (__webpack_require__(43075)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","name","props","timestamp","type","required","format","default","computed","title","formatted","_vm","this","_c","_self","staticClass","attrs","_v","_s","getRootPath","generateRemoteUrl","decodeHtmlEntities","value","passes","parser","DOMParser","decoded","i","parseFromString","documentElement","textContent","createClient","headers","requesttoken","getRequestToken","id","Number","message","String","ressourceId","data","deleted","editing","loading","methods","onEdit","onEditCancel","updateLocalMessage","async","commentsType","commentId","commentPath","join","client","Object","assign","method","EditComment","logger","debug","$emit","error","showError","t","console","onDeleteWithUndo","timeOutDelete","setTimeout","onDelete","TOAST_UNDO_TIMEOUT","showUndo","clearTimeout","DeleteComment","newComment","ressourcePath","response","axios","actorDisplayName","getCurrentUser","displayName","actorId","uid","actorType","creationDateTime","Date","toUTCString","objectType","verb","parseInt","split","pop","comment","details","NewComment","localMessage","components","NcActionButton","NcActions","NcActionSeparator","ArrowRight","NcAvatar","NcButton","Moment","NcRichContenteditable","mixins","inheritAttrs","editor","autoComplete","tag","expanded","isOwnComment","renderedContent","isEmptyMessage","watch","beforeMount","onSubmit","onExpand","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","directives","rawName","expression","class","on","_e","ref","userData","scopedSlots","_u","key","fn","proxy","domProps","getComments","offset","responseData","text","result","parseXML","stat","getDirectoryFiles","processResponsePayload","isDetailed","multistatus","responseItems","map","item","propstat","prop","prepareFileFromProps","toString","Vue","Comment","NcEmptyContent","RefreshIcon","MessageReplyTextIcon","AlertCircleOutlineIcon","done","comments","cancelRequest","editorData","hasComments","isFirstLoading","onScrollBottomReached","genMentionsData","flat","forEach","icon","label","source","primary","request","abort","controller","AbortController","signal","url","params","search","itemType","itemId","sorter","limit","results","onNewComment","resetState","_b","_l","mentions","$event","$set","getLoggerBuilder","setApp","detectUser","build","n","window","OCA","Comments","View","constructor","CommentsApp","___CSS_LOADER_EXPORT___","push","module","webpackContext","req","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","resolve","exports","__webpack_module_cache__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","call","m","O","chunkIds","priority","notFulfilled","Infinity","length","fulfilled","j","every","splice","r","getter","__esModule","d","a","definition","defineProperty","enumerable","get","g","globalThis","Function","obj","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"comments-comments-app.js?v=f5937e82045de62f017c","mappings":";UAAIA,2VCSJ,MCTmL,EDSnL,CACAC,KAAAA,SACAC,MAAAA,CACAC,UAAAA,CACAC,KAAAA,OACAC,UAAAA,GAEAC,OAAAA,CACAF,KAAAA,OACAG,QAAAA,QAGAC,SAAAA,CACAC,QACA,mDACA,EACAC,YACA,yCACA,mBETA,SAXgB,OACd,GCRW,WAAkB,IAAIC,EAAIC,KAAqB,OAAOC,EAApBF,EAAIG,MAAMD,IAAa,OAAO,CAACE,YAAY,0BAA0BC,MAAM,CAAC,iBAAiC,IAAhBL,EAAIR,UAAiB,MAAQQ,EAAIF,QAAQ,CAACE,EAAIM,GAAGN,EAAIO,GAAGP,EAAID,aACxM,GACsB,IDSpB,EACA,KACA,KACA,MAI8B,QEM1BS,EAAc,WACnB,OAAOC,EAAAA,EAAAA,mBAAkB,eAC1B,ECAO,SAASC,EAAmBC,GAAmB,IAAZC,EAAS,UAAH,6CAAG,EAClD,MAAMC,EAAS,IAAIC,UACnB,IAAIC,EAAUJ,EACd,IAAK,IAAIK,EAAI,EAAGA,EAAIJ,EAAQI,IAC3BD,EAAUF,EAAOI,gBAAgBF,EAAS,aAAaG,gBAAgBC,YAExE,OAAOJ,CACR,kBCNA,MASA,GATeK,EAAAA,EAAAA,IAAaZ,IAAe,CAC1Ca,QAAS,CAER,mBAAoB,iBAEpBC,aAA+B,QAAnB,GAAEC,EAAAA,EAAAA,aAAiB,QAAI,gCCLrC,SACChC,MAAO,CACNiC,GAAI,CACH/B,KAAMgC,OACN7B,QAAS,MAEV8B,QAAS,CACRjC,KAAMkC,OACN/B,QAAS,IAEVgC,YAAa,CACZnC,KAAM,CAACkC,OAAQF,QACf/B,UAAU,IAIZmC,KAAI,KACI,CACNC,SAAS,EACTC,SAAS,EACTC,SAAS,IAIXC,QAAS,CAERC,SACCjC,KAAK8B,SAAU,CAChB,EACAI,eACClC,KAAK8B,SAAU,EAEf9B,KAAKmC,mBAAmBnC,KAAKyB,QAC9B,EACAW,oBAAoBX,GACnBzB,KAAK+B,SAAU,EACf,UC/BYK,eAAeC,EAAcV,EAAaW,EAAWb,GACnE,MAAMc,EAAc,CAAC,GAAIF,EAAcV,EAAaW,GAAWE,KAAK,KAEpE,aAAaC,EAAAA,cAAqBF,EAAaG,OAAOC,OAAO,CAC5DC,OAAQ,YACRhB,KAAM,8KAAF,OAMaH,EAAO,iFAK1B,CDgBUoB,CAAY7C,KAAKqC,aAAcrC,KAAK2B,YAAa3B,KAAKuB,GAAIE,GAChEzB,KAAK8C,OAAOC,MAAM,iBAAkB,CAAEV,aAAcrC,KAAKqC,aAAcV,YAAa3B,KAAK2B,YAAaJ,GAAIvB,KAAKuB,GAAIE,YACnHzB,KAAKgD,MAAM,iBAAkBvB,GAC7BzB,KAAK8B,SAAU,CAChB,CAAE,MAAOmB,IACRC,EAAAA,EAAAA,IAAUC,EAAE,WAAY,uDACxBC,EAAQH,MAAMA,EACf,CAAE,QACDjD,KAAK+B,SAAU,CAChB,CACD,EAGAsB,mBACCrD,KAAK6B,SAAU,EACf,MAAMyB,EAAgBC,WAAWvD,KAAKwD,SAAUC,EAAAA,KAChDC,EAAAA,EAAAA,IAASP,EAAE,WAAY,oBAAoB,KAC1CQ,aAAaL,GACbtD,KAAK6B,SAAU,CAAK,GAEtB,EACAO,iBACC,UEvDYA,eAAeC,EAAcV,EAAaW,GACxD,MAAMC,EAAc,CAAC,GAAIF,EAAcV,EAAaW,GAAWE,KAAK,WAG9DC,EAAAA,WAAkBF,EACzB,CFmDUqB,CAAc5D,KAAKqC,aAAcrC,KAAK2B,YAAa3B,KAAKuB,IAC9DvB,KAAK8C,OAAOC,MAAM,kBAAmB,CAAEV,aAAcrC,KAAKqC,aAAcV,YAAa3B,KAAK2B,YAAaJ,GAAIvB,KAAKuB,KAChHvB,KAAKgD,MAAM,SAAUhD,KAAKuB,GAC3B,CAAE,MAAO0B,IACRC,EAAAA,EAAAA,IAAUC,EAAE,WAAY,yDACxBC,EAAQH,MAAMA,GACdjD,KAAK6B,SAAU,CAChB,CACD,EAGAO,mBAAmBX,GAClBzB,KAAK+B,SAAU,EACf,IACC,MAAM8B,QGjEKzB,eAAeC,EAAcV,EAAaF,GACxD,MAAMqC,EAAgB,CAAC,GAAIzB,EAAcV,GAAaa,KAAK,KAErDuB,QAAiBC,EAAAA,QAAAA,KAAWzD,IAAgBuD,EAAe,CAChEG,kBAAkBC,EAAAA,EAAAA,MAAiBC,YACnCC,SAASF,EAAAA,EAAAA,MAAiBG,IAC1BC,UAAW,QACXC,kBAAmB,IAAIC,MAAQC,cAC/BhD,UACAiD,WAAY,QACZC,KAAM,YAKDpC,EAAcuB,EAAgB,IADlBc,SAASb,EAAS3C,QAAQ,oBAAoByD,MAAM,KAAKC,OAIrEC,QAAgBtC,EAAAA,KAAYF,EAAa,CAC9CyC,SAAS,IAGJ1F,EAAQyF,EAAQnD,KAAKtC,MAO3B,OAHAA,EAAM2E,iBAAmBxD,EAAmBnB,EAAM2E,iBAAkB,GACpE3E,EAAMmC,QAAUhB,EAAmBnB,EAAMmC,QAAS,GAE3CsD,EAAQnD,IAChB,CHmC6BqD,CAAWjF,KAAKqC,aAAcrC,KAAK2B,YAAaF,GACzEzB,KAAK8C,OAAOC,MAAM,qBAAsB,CAAEV,aAAcrC,KAAKqC,aAAcV,YAAa3B,KAAK2B,YAAakC,eAC1G7D,KAAKgD,MAAM,MAAOa,GAGlB7D,KAAKgD,MAAM,iBAAkB,IAC7BhD,KAAKkF,aAAe,EACrB,CAAE,MAAOjC,IACRC,EAAAA,EAAAA,IAAUC,EAAE,WAAY,yDACxBC,EAAQH,MAAMA,EACf,CAAE,QACDjD,KAAK+B,SAAU,CAChB,CACD,IIlHkL,ECuHpL,CACA1C,KAAAA,UAEA8F,WAAAA,CACAC,eAAAA,IACAC,UAAAA,IACAC,kBAAAA,IACAC,WAAAA,EAAAA,QACAC,SAAAA,IACAC,SAAAA,IACAC,OAAAA,EACAC,sBAAAA,KAEAC,OAAAA,CAAAA,IAAAA,GAEAC,cAAAA,EAEAvG,MAAAA,CACA2E,iBAAAA,CACAzE,KAAAA,OACAC,UAAAA,GAEA2E,QAAAA,CACA5E,KAAAA,OACAC,UAAAA,GAEA8E,iBAAAA,CACA/E,KAAAA,OACAG,QAAAA,MAMAmG,OAAAA,CACAtG,KAAAA,QACAG,SAAAA,GAMAoG,aAAAA,CACAvG,KAAAA,SACAC,UAAAA,GAGAuG,IAAAA,CACAxG,KAAAA,OACAG,QAAAA,QAIAiC,KAAAA,KACA,CACAqE,UAAAA,EAGAf,aAAAA,KAIAtF,SAAAA,CAOAsG,eACA,mCACA,EAOAC,kBACA,2BACA,GAEA,qCACA,EAEAC,iBACA,uDACA,EAEA7G,YAEA,8DACA,GAGA8G,MAAAA,CAEA5E,QAAAA,GACA,0BACA,GAGA6E,cAEA,qCACA,EAEAtE,QAAAA,CAMAG,mBAAAA,GACA,8BACA,EAKAoE,WAEA,iCAIA,oBACA,iDACA,qBAEA,uCAIA,4CACA,EAEAC,WACA,gBACA,gJCvPIC,GAAU,CAAC,EAEfA,GAAQC,kBAAoB,KAC5BD,GAAQE,cAAgB,IAElBF,GAAQG,OAAS,SAAc,KAAM,QAE3CH,GAAQI,OAAS,IACjBJ,GAAQK,mBAAqB,KAEhB,IAAI,KAASL,IAKJ,MAAW,aAAiB,YCPlD,UAXgB,OACd,GCTW,WAAkB,IAAI1G,EAAIC,KAAKC,EAAGF,EAAIG,MAAMD,GAAG,OAAOA,EAAGF,EAAIiG,IAAI,CAACe,WAAW,CAAC,CAAC1H,KAAK,OAAO2H,QAAQ,SAAStG,OAAQX,EAAI8B,QAASoF,WAAW,aAAajB,IAAI,YAAY7F,YAAY,UAAU+G,MAAM,CAAC,mBAAoBnH,EAAIgC,UAAU,CAAC9B,EAAG,MAAM,CAACE,YAAY,iBAAiB,CAACF,EAAG,WAAW,CAACE,YAAY,kBAAkBC,MAAM,CAAC,eAAeL,EAAIkE,iBAAiB,KAAOlE,EAAIqE,QAAQ,KAAO,OAAO,GAAGrE,EAAIM,GAAG,KAAKJ,EAAG,MAAM,CAACE,YAAY,iBAAiB,CAACF,EAAG,MAAM,CAACE,YAAY,mBAAmB,CAACF,EAAG,OAAO,CAACE,YAAY,mBAAmB,CAACJ,EAAIM,GAAGN,EAAIO,GAAGP,EAAIkE,qBAAqBlE,EAAIM,GAAG,KAAMN,EAAImG,cAAgBnG,EAAIwB,KAAOxB,EAAIgC,QAAS9B,EAAG,YAAY,CAACE,YAAY,oBAAoB,CAAGJ,EAAI+B,QAAyb7B,EAAG,iBAAiB,CAACG,MAAM,CAAC,KAAO,cAAc+G,GAAG,CAAC,MAAQpH,EAAImC,eAAe,CAACnC,EAAIM,GAAG,eAAeN,EAAIO,GAAGP,EAAIoD,EAAE,WAAY,gBAAgB,gBAAhkB,CAAClD,EAAG,iBAAiB,CAACG,MAAM,CAAC,qBAAoB,EAAK,KAAO,eAAe+G,GAAG,CAAC,MAAQpH,EAAIkC,SAAS,CAAClC,EAAIM,GAAG,iBAAiBN,EAAIO,GAAGP,EAAIoD,EAAE,WAAY,iBAAiB,kBAAkBpD,EAAIM,GAAG,KAAKJ,EAAG,qBAAqBF,EAAIM,GAAG,KAAKJ,EAAG,iBAAiB,CAACG,MAAM,CAAC,qBAAoB,EAAK,KAAO,eAAe+G,GAAG,CAAC,MAAQpH,EAAIsD,mBAAmB,CAACtD,EAAIM,GAAG,iBAAiBN,EAAIO,GAAGP,EAAIoD,EAAE,WAAY,mBAAmB,oBAAoL,GAAGpD,EAAIqH,KAAKrH,EAAIM,GAAG,KAAMN,EAAIwB,IAAMxB,EAAIgC,QAAS9B,EAAG,MAAM,CAACE,YAAY,uCAAwCJ,EAAIwE,iBAAkBtE,EAAG,SAAS,CAACE,YAAY,qBAAqBC,MAAM,CAAC,UAAYL,EAAIR,aAAaQ,EAAIqH,MAAM,GAAGrH,EAAIM,GAAG,KAAMN,EAAI+F,QAAU/F,EAAI+B,QAAS7B,EAAG,MAAM,CAACE,YAAY,mBAAmB,CAACF,EAAG,wBAAwB,CAACoH,IAAI,SAASjH,MAAM,CAAC,gBAAgBL,EAAIgG,aAAa,iBAAmBhG,EAAIgC,QAAQ,MAAQhC,EAAImF,aAAa,YAAYnF,EAAIuH,UAAUH,GAAG,CAAC,eAAepH,EAAIoC,mBAAmB,OAASpC,EAAIwG,YAAYxG,EAAIM,GAAG,KAAKJ,EAAG,WAAW,CAACE,YAAY,kBAAkBC,MAAM,CAAC,KAAO,yBAAyB,cAAc,SAAS,aAAaL,EAAIoD,EAAE,WAAY,gBAAgB,SAAWpD,EAAIqG,gBAAgBe,GAAG,CAAC,MAAQpH,EAAIwG,UAAUgB,YAAYxH,EAAIyH,GAAG,CAAC,CAACC,IAAI,OAAOC,GAAG,WAAW,MAAO,CAAE3H,EAAIgC,QAAS9B,EAAG,OAAO,CAACE,YAAY,uBAAuBF,EAAG,aAAa,CAACG,MAAM,CAAC,KAAO,MAAM,EAAEuH,OAAM,IAAO,MAAK,EAAM,eAAe,GAAG1H,EAAG,MAAM,CAACE,YAAY,mBAAmB+G,MAAM,CAAC,6BAA8BnH,EAAIkG,UAAU2B,SAAS,CAAC,UAAY7H,EAAIO,GAAGP,EAAIoG,kBAAkBgB,GAAG,CAAC,MAAQpH,EAAIyG,eACh3E,GACsB,IDUpB,EACA,KACA,WACA,MAI8B,mCEOzB,MAWMqB,GAAczF,eAAgB,EAA+BqE,GAAS,IAAxC,aAAEpE,EAAY,YAAEV,GAAa,EACpE,MAAMmC,EAAgB,CAAC,GAAIzB,EAAcV,GAAaa,KAAK,KACrDuB,QAAiBtB,EAAAA,cAAqBqB,EAAepB,OAAOC,OAAO,CACrEC,OAAQ,SACRhB,KAAM,sPAAF,OAfiB,GAqBA,2CACZ6E,EAAQqB,QAAU,EAAC,8CAE7BrB,IACGsB,QAAqBhE,EAASiE,OAC9BC,QAAeC,EAAAA,EAAAA,IAASH,GACxBI,EAAOC,GAAkBH,GAAQ,GACvC,OAAOI,EAAAA,GAAAA,IAAuBtE,EAAUoE,GAAM,EAClD,EAEMC,GAAoB,SAAUH,GAA4B,IAApBK,EAAa,UAAH,8CAElD,MAAQC,aAAexE,SAAUyE,IAAqBP,EAEtD,OAAOO,EAAcC,KAAIC,IAErB,MAAQC,UAAYC,KAAMtJ,IAAaoJ,EACvC,OAAOG,EAAAA,GAAAA,IAAqBvJ,EAAOA,EAAMiC,GAAGuH,WAAYR,EAAW,GAE3E,kBCiCAS,EAAAA,QAAAA,IAAQA,EAAAA,SAER,MCrGqL,GDqGrL,CACA1J,KAAAA,WAEA8F,WAAAA,CAEA6D,QAAAA,GACAC,eAAAA,IACAxD,SAAAA,IACAyD,YAAAA,EAAAA,EACAC,qBAAAA,EAAAA,EACAC,uBAAAA,EAAAA,SAGAxH,KAAAA,KACA,CACAqB,MAAAA,GACAlB,SAAAA,EACAsH,MAAAA,EAEA1H,YAAAA,KACAmG,OAAAA,EACAwB,SAAAA,GAEAC,cAAAA,OAEAC,WAAAA,CACAvF,kBAAAA,EAAAA,EAAAA,MAAAA,YACAG,SAAAA,EAAAA,EAAAA,MAAAA,IACAqD,IAAAA,UAGAuB,QAAAA,GACA1B,SAAAA,CAAAA,IAIA1H,SAAAA,CACA6J,cACA,6BACA,EACAC,iBACA,oCACA,GAGA1H,QAAAA,CAMA,gBACA,mBACA,kBACA,kBACA,EAKA2H,wBAOA,qCAGA,kBACA,EAQAC,gBAAAA,GAaA,OAZAlH,OAAAA,OAAAA,GACAmH,OACAC,SAAAA,IACA,4BAEAC,KAAAA,YACAxI,GAAAA,EAAAA,UACAyI,MAAAA,EAAAA,mBACAC,OAAAA,QACAC,SAAAA,EAAAA,EAAAA,MAAAA,MAAAA,EAAAA,UACA,IAEA,aACA,EAKA,oBAEA,6BAEA,IACA,gBACA,cAGA,cAAAC,EAAAA,MAAAC,GEpL0B,SAASD,GAClC,MAAME,EAAa,IAAIC,gBACjBC,EAASF,EAAWE,OAgB1B,MAAO,CACNJ,QATa/H,eAAeoI,EAAK/D,GAKjC,aAJuB0D,EACtBK,EACA9H,OAAOC,OAAO,CAAE4H,UAAU9D,GAG5B,EAIC2D,MAAO,IAAMC,EAAWD,QAE1B,CF8JA,KACA,qBAGA,MAAAxI,KAAAA,SAAA,GACAS,aAAAA,KAAAA,aACAV,YAAAA,KAAAA,aACA,CAAAmG,OAAAA,KAAAA,UAAA,CAAAlG,KAAAA,IAEA,6DAAA0H,aAIA,SDnM6B,KCoM7B,cAIA,yBAGA,aD3M6B,EC4M7B,UACA,wBACA,OAEA,4DACAlG,GAAAA,MAAAA,kCAAAA,EACA,SACA,eACA,CACA,EAQA,wBAYA,aAXA,6DACAqH,OAAAA,CACAC,SACAC,SAAAA,QACAC,OAAAA,KAAAA,YACAC,OAAAA,8BACAC,OAAAA,EAAAA,EAAAA,GAAAA,WAAAA,8BAIAC,KAAAA,IAAAA,KAAAA,SAAAA,IAAA,yBACA,+BACA,EAOAC,aAAAA,GACA,wBACA,EAOAxH,SAAAA,GACA,qDACA,KACA,0BAEAJ,GAAAA,MAAAA,iDAAAA,EAEA,EAKA6H,aACA,cACA,gBACA,aACA,cACA,gBACA,oBG3RI,GAAU,CAAC,EAEf,GAAQvE,kBAAoB,KAC5B,GAAQC,cAAgB,IAElB,GAAQC,OAAS,SAAc,KAAM,QAE3C,GAAQC,OAAS,IACjB,GAAQC,mBAAqB,KAEhB,IAAI,KAAS,IAKJ,MAAW,aAAiB,YCPlD,UAXgB,OACd,ICTW,WAAkB,IAAI/G,EAAIC,KAAKC,EAAGF,EAAIG,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACE,YAAY,WAAW+G,MAAM,CAAE,eAAgBnH,EAAI2J,iBAAkB,CAACzJ,EAAG,UAAUF,EAAImL,GAAG,CAAC/K,YAAY,mBAAmBC,MAAM,CAAC,gBAAgBL,EAAIgG,aAAa,YAAYhG,EAAIuH,SAAS,QAAS,EAAK,eAAevH,EAAI4B,aAAawF,GAAG,CAAC,IAAMpH,EAAIiL,eAAe,UAAUjL,EAAIyJ,YAAW,IAAQzJ,EAAIM,GAAG,KAAON,EAAI2J,eAA48C3J,EAAIqH,KAAh8C,EAAGrH,EAAI0J,aAAe1J,EAAIsJ,KAAMpJ,EAAG,iBAAiB,CAACE,YAAY,kBAAkBC,MAAM,CAAC,MAAQL,EAAIoD,EAAE,WAAY,6CAA6CoE,YAAYxH,EAAIyH,GAAG,CAAC,CAACC,IAAI,OAAOC,GAAG,WAAW,MAAO,CAACzH,EAAG,wBAAwB,EAAE0H,OAAM,IAAO,MAAK,EAAM,cAAc1H,EAAG,KAAKF,EAAIoL,GAAIpL,EAAIuJ,UAAU,SAASvE,GAAS,OAAO9E,EAAG,UAAUF,EAAImL,GAAG,CAACzD,IAAI1C,EAAQzF,MAAMiC,GAAGpB,YAAY,iBAAiBC,MAAM,CAAC,IAAM,KAAK,gBAAgBL,EAAIgG,aAAa,QAAUhB,EAAQzF,MAAMmC,QAAQ,eAAe1B,EAAI4B,YAAY,YAAY5B,EAAI6J,gBAAgB7E,EAAQzF,MAAM8L,WAAWjE,GAAG,CAAC,iBAAiB,SAASkE,GAAQ,OAAOtL,EAAIuL,KAAKvG,EAAQzF,MAAO,UAAW+L,EAAO,EAAE,OAAStL,EAAIyD,WAAW,UAAUuB,EAAQzF,OAAM,GAAO,IAAG,GAAGS,EAAIM,GAAG,KAAMN,EAAIgC,UAAYhC,EAAI2J,eAAgBzJ,EAAG,MAAM,CAACE,YAAY,gCAAiCJ,EAAI0J,aAAe1J,EAAIsJ,KAAMpJ,EAAG,MAAM,CAACE,YAAY,kBAAkB,CAACJ,EAAIM,GAAG,WAAWN,EAAIO,GAAGP,EAAIoD,EAAE,WAAY,qBAAqB,YAAapD,EAAIkD,MAAO,CAAChD,EAAG,iBAAiB,CAACE,YAAY,kBAAkBC,MAAM,CAAC,MAAQL,EAAIkD,OAAOsE,YAAYxH,EAAIyH,GAAG,CAAC,CAACC,IAAI,OAAOC,GAAG,WAAW,MAAO,CAACzH,EAAG,0BAA0B,EAAE0H,OAAM,IAAO,MAAK,EAAM,YAAY5H,EAAIM,GAAG,KAAKJ,EAAG,WAAW,CAACE,YAAY,kBAAkBgH,GAAG,CAAC,MAAQpH,EAAI8H,aAAaN,YAAYxH,EAAIyH,GAAG,CAAC,CAACC,IAAI,OAAOC,GAAG,WAAW,MAAO,CAACzH,EAAG,eAAe,EAAE0H,OAAM,IAAO,MAAK,EAAM,aAAa,CAAC5H,EAAIM,GAAG,aAAaN,EAAIO,GAAGP,EAAIoD,EAAE,WAAY,UAAU,eAAepD,EAAIqH,OAAgB,EAC51D,GACsB,IDUpB,EACA,KACA,WACA,MAI8B,QEQ1BtE,IAASyI,EAAAA,EAAAA,MACbC,OAAO,YACPC,aACAC,QAGF3C,EAAAA,QAAAA,MAAU,CACTnH,KAAI,KACI,CACNkB,YAGFd,QAAS,CACRmB,EAAC,KACDwI,EAACA,EAAAA,sBChBCC,OAAOC,MAAQD,OAAOC,IAAIC,UAC7BpJ,OAAOC,OAAOiJ,OAAOC,IAAK,CAAEC,SAAU,CAAC,IAIxCpJ,OAAOC,OAAOiJ,OAAOC,IAAIC,SAAU,CAAEC,KDetB,MAQdC,cAA6C,IAAjC3J,EAAe,UAAH,6CAAG,QAASoE,EAAO,uCAY1C,OAVAsC,EAAAA,QAAAA,MAAU,CACTnH,KAAI,KACI,CACNS,mBAOI,IADM0G,EAAAA,QAAAA,OAAWkD,IACjB,CAASxF,EACjB,KCnCDrD,GAAQL,MAAM,mHC5BVmJ,QAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACC,EAAO7K,GAAI,siCAAuiC,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,wDAAwD,MAAQ,GAAG,SAAW,gcAAgc,eAAiB,CAAC,svCAAwvC,WAAa,MAEh5F,4FCJI2K,QAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACC,EAAO7K,GAAI,mQAAoQ,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,oDAAoD,MAAQ,GAAG,SAAW,oFAAoF,eAAiB,CAAC,2SAA2S,WAAa,MAEhzB,2BCPA,IAAIkH,EAAM,CACT,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,MACX,aAAc,MACd,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,QAAS,MACT,WAAY,MACZ,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,gBAAiB,MACjB,aAAc,MACd,gBAAiB,MACjB,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,MACX,aAAc,MACd,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,WAAY,MACZ,cAAe,MACf,UAAW,MACX,aAAc,MACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,YAAa,MACb,eAAgB,MAChB,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,QAAS,MACT,WAAY,MACZ,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,QAAS,MACT,WAAY,MACZ,OAAQ,MACR,UAAW,MACX,QAAS,MACT,WAAY,MACZ,QAAS,MACT,aAAc,MACd,gBAAiB,MACjB,WAAY,MACZ,UAAW,KACX,aAAc,KACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,YAAa,MACb,eAAgB,MAChB,UAAW,KACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,gBAAiB,MACjB,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,OAIf,SAAS4D,EAAeC,GACvB,IAAI/K,EAAKgL,EAAsBD,GAC/B,OAAOE,EAAoBjL,EAC5B,CACA,SAASgL,EAAsBD,GAC9B,IAAIE,EAAoBC,EAAEhE,EAAK6D,GAAM,CACpC,IAAII,EAAI,IAAIC,MAAM,uBAAyBL,EAAM,KAEjD,MADAI,EAAEE,KAAO,mBACHF,CACP,CACA,OAAOjE,EAAI6D,EACZ,CACAD,EAAeQ,KAAO,WACrB,OAAOnK,OAAOmK,KAAKpE,EACpB,EACA4D,EAAeS,QAAUP,EACzBH,EAAOW,QAAUV,EACjBA,EAAe9K,GAAK,QClShByL,EAA2B,CAAC,EAGhC,SAASR,EAAoBS,GAE5B,IAAIC,EAAeF,EAAyBC,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaH,QAGrB,IAAIX,EAASY,EAAyBC,GAAY,CACjD1L,GAAI0L,EACJG,QAAQ,EACRL,QAAS,CAAC,GAUX,OANAM,EAAoBJ,GAAUK,KAAKlB,EAAOW,QAASX,EAAQA,EAAOW,QAASP,GAG3EJ,EAAOgB,QAAS,EAGThB,EAAOW,OACf,CAGAP,EAAoBe,EAAIF,E7B5BpBjO,EAAW,GACfoN,EAAoBgB,EAAI,CAACvF,EAAQwF,EAAU/F,EAAIgG,KAC9C,IAAGD,EAAH,CAMA,IAAIE,EAAeC,IACnB,IAAS7M,EAAI,EAAGA,EAAI3B,EAASyO,OAAQ9M,IAAK,CACrC0M,EAAWrO,EAAS2B,GAAG,GACvB2G,EAAKtI,EAAS2B,GAAG,GACjB2M,EAAWtO,EAAS2B,GAAG,GAE3B,IAJA,IAGI+M,GAAY,EACPC,EAAI,EAAGA,EAAIN,EAASI,OAAQE,MACpB,EAAXL,GAAsBC,GAAgBD,IAAahL,OAAOmK,KAAKL,EAAoBgB,GAAGQ,OAAOvG,GAAS+E,EAAoBgB,EAAE/F,GAAKgG,EAASM,MAC9IN,EAASQ,OAAOF,IAAK,IAErBD,GAAY,EACTJ,EAAWC,IAAcA,EAAeD,IAG7C,GAAGI,EAAW,CACb1O,EAAS6O,OAAOlN,IAAK,GACrB,IAAImN,EAAIxG,SACEyF,IAANe,IAAiBjG,EAASiG,EAC/B,CACD,CACA,OAAOjG,CArBP,CAJCyF,EAAWA,GAAY,EACvB,IAAI,IAAI3M,EAAI3B,EAASyO,OAAQ9M,EAAI,GAAK3B,EAAS2B,EAAI,GAAG,GAAK2M,EAAU3M,IAAK3B,EAAS2B,GAAK3B,EAAS2B,EAAI,GACrG3B,EAAS2B,GAAK,CAAC0M,EAAU/F,EAAIgG,EAuBjB,E8B3BdlB,EAAoBb,EAAKS,IACxB,IAAI+B,EAAS/B,GAAUA,EAAOgC,WAC7B,IAAOhC,EAAiB,QACxB,IAAM,EAEP,OADAI,EAAoB6B,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLd3B,EAAoB6B,EAAI,CAACtB,EAASwB,KACjC,IAAI,IAAI9G,KAAO8G,EACX/B,EAAoBC,EAAE8B,EAAY9G,KAAS+E,EAAoBC,EAAEM,EAAStF,IAC5E/E,OAAO8L,eAAezB,EAAStF,EAAK,CAAEgH,YAAY,EAAMC,IAAKH,EAAW9G,IAE1E,ECND+E,EAAoBmC,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAO5O,MAAQ,IAAI6O,SAAS,cAAb,EAChB,CAAE,MAAOnC,GACR,GAAsB,iBAAXd,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBY,EAAoBC,EAAI,CAACqC,EAAKlG,IAAUlG,OAAOqM,UAAUC,eAAe1B,KAAKwB,EAAKlG,GCClF4D,EAAoB0B,EAAKnB,IACH,oBAAXkC,QAA0BA,OAAOC,aAC1CxM,OAAO8L,eAAezB,EAASkC,OAAOC,YAAa,CAAExO,MAAO,WAE7DgC,OAAO8L,eAAezB,EAAS,aAAc,CAAErM,OAAO,GAAO,ECL9D8L,EAAoB2C,IAAO/C,IAC1BA,EAAOgD,MAAQ,GACVhD,EAAOiD,WAAUjD,EAAOiD,SAAW,IACjCjD,GCHRI,EAAoBuB,EAAI,WCAxBvB,EAAoB8C,EAAIC,SAASC,SAAWC,KAAKC,SAASC,KAK1D,IAAIC,EAAkB,CACrB,KAAM,GAaPpD,EAAoBgB,EAAEO,EAAK8B,GAA0C,IAA7BD,EAAgBC,GAGxD,IAAIC,EAAuB,CAACC,EAA4BnO,KACvD,IAKIqL,EAAU4C,EALVpC,EAAW7L,EAAK,GAChBoO,EAAcpO,EAAK,GACnBqO,EAAUrO,EAAK,GAGIb,EAAI,EAC3B,GAAG0M,EAASyC,MAAM3O,GAAgC,IAAxBqO,EAAgBrO,KAAa,CACtD,IAAI0L,KAAY+C,EACZxD,EAAoBC,EAAEuD,EAAa/C,KACrCT,EAAoBe,EAAEN,GAAY+C,EAAY/C,IAGhD,GAAGgD,EAAS,IAAIhI,EAASgI,EAAQzD,EAClC,CAEA,IADGuD,GAA4BA,EAA2BnO,GACrDb,EAAI0M,EAASI,OAAQ9M,IACzB8O,EAAUpC,EAAS1M,GAChByL,EAAoBC,EAAEmD,EAAiBC,IAAYD,EAAgBC,IACrED,EAAgBC,GAAS,KAE1BD,EAAgBC,GAAW,EAE5B,OAAOrD,EAAoBgB,EAAEvF,EAAO,EAGjCkI,EAAqBV,KAA4B,sBAAIA,KAA4B,uBAAK,GAC1FU,EAAmBrG,QAAQgG,EAAqBM,KAAK,KAAM,IAC3DD,EAAmBhE,KAAO2D,EAAqBM,KAAK,KAAMD,EAAmBhE,KAAKiE,KAAKD,QClDvF3D,EAAoB6D,QAAKlD,ECGzB,IAAImD,EAAsB9D,EAAoBgB,OAAEL,EAAW,CAAC,OAAO,IAAOX,EAAoB,SAC9F8D,EAAsB9D,EAAoBgB,EAAE8C","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/comments/src/components/Moment.vue","webpack:///nextcloud/apps/comments/src/components/Moment.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/comments/src/components/Moment.vue?9b20","webpack://nextcloud/./apps/comments/src/components/Moment.vue?135d","webpack:///nextcloud/apps/comments/src/utils/davUtils.js","webpack:///nextcloud/apps/comments/src/utils/decodeHtmlEntities.js","webpack:///nextcloud/apps/comments/src/services/DavClient.js","webpack:///nextcloud/apps/comments/src/mixins/CommentMixin.js","webpack:///nextcloud/apps/comments/src/services/EditComment.js","webpack:///nextcloud/apps/comments/src/services/DeleteComment.js","webpack:///nextcloud/apps/comments/src/services/NewComment.js","webpack:///nextcloud/apps/comments/src/components/Comment.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/comments/src/components/Comment.vue","webpack://nextcloud/./apps/comments/src/components/Comment.vue?9d61","webpack://nextcloud/./apps/comments/src/components/Comment.vue?7f26","webpack://nextcloud/./apps/comments/src/components/Comment.vue?d1f7","webpack:///nextcloud/apps/comments/src/services/GetComments.ts","webpack:///nextcloud/apps/comments/src/views/Comments.vue","webpack:///nextcloud/apps/comments/src/views/Comments.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/comments/src/utils/cancelableRequest.js","webpack://nextcloud/./apps/comments/src/views/Comments.vue?75d6","webpack://nextcloud/./apps/comments/src/views/Comments.vue?f45b","webpack://nextcloud/./apps/comments/src/views/Comments.vue?0e41","webpack:///nextcloud/apps/comments/src/services/CommentsInstance.js","webpack:///nextcloud/apps/comments/src/comments-app.js","webpack:///nextcloud/apps/comments/src/components/Comment.vue?vue&type=style&index=0&id=13a1afc1&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/comments/src/views/Comments.vue?vue&type=style&index=0&id=9e9ed272&prod&lang=scss&scoped=true&","webpack:///nextcloud/node_modules/moment/locale|sync|/^\\.\\/.*$","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","<!-- TODO: Move to vue components -->\n\n<template>\n\t<span class=\"live-relative-timestamp\" :data-timestamp=\"timestamp * 1000\" :title=\"title\">{{ formatted }}</span>\n</template>\n\n<script>\nimport moment from '@nextcloud/moment'\n\nexport default {\n\tname: 'Moment',\n\tprops: {\n\t\ttimestamp: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tformat: {\n\t\t\ttype: String,\n\t\t\tdefault: 'LLL',\n\t\t},\n\t},\n\tcomputed: {\n\t\ttitle() {\n\t\t\treturn moment.unix(this.timestamp).format(this.format)\n\t\t},\n\t\tformatted() {\n\t\t\treturn moment.unix(this.timestamp).fromNow()\n\t\t},\n\t},\n}\n</script>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Moment.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Moment.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Moment.vue?vue&type=template&id=57999be6&\"\nimport script from \"./Moment.vue?vue&type=script&lang=js&\"\nexport * from \"./Moment.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',{staticClass:\"live-relative-timestamp\",attrs:{\"data-timestamp\":_vm.timestamp * 1000,\"title\":_vm.title}},[_vm._v(_vm._s(_vm.formatted))])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { generateRemoteUrl } from '@nextcloud/router'\n\nconst getRootPath = function() {\n\treturn generateRemoteUrl('dav/comments')\n}\n\nexport { getRootPath }\n","/**\n * @copyright Copyright (c) 2021 Christopher Ng <chrng8@gmail.com>\n *\n * @author Christopher Ng <chrng8@gmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n/**\n * @param {any} value -\n * @param {any} passes -\n */\nexport function decodeHtmlEntities(value, passes = 1) {\n\tconst parser = new DOMParser()\n\tlet decoded = value\n\tfor (let i = 0; i < passes; i++) {\n\t\tdecoded = parser.parseFromString(decoded, 'text/html').documentElement.textContent\n\t}\n\treturn decoded\n}\n","/**\n * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { createClient } from 'webdav'\nimport { getRootPath } from '../utils/davUtils.js'\nimport { getRequestToken } from '@nextcloud/auth'\n\n// init webdav client\nconst client = createClient(getRootPath(), {\n\theaders: {\n\t\t// Add this so the server knows it is an request from the browser\n\t\t'X-Requested-With': 'XMLHttpRequest',\n\t\t// Inject user auth\n\t\trequesttoken: getRequestToken() ?? '',\n\t},\n})\n\nexport default client\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport NewComment from '../services/NewComment.js'\nimport DeleteComment from '../services/DeleteComment.js'\nimport EditComment from '../services/EditComment.js'\nimport { showError, showUndo, TOAST_UNDO_TIMEOUT } from '@nextcloud/dialogs'\n\nexport default {\n\tprops: {\n\t\tid: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tressourceId: {\n\t\t\ttype: [String, Number],\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tdeleted: false,\n\t\t\tediting: false,\n\t\t\tloading: false,\n\t\t}\n\t},\n\n\tmethods: {\n\t\t// EDITION\n\t\tonEdit() {\n\t\t\tthis.editing = true\n\t\t},\n\t\tonEditCancel() {\n\t\t\tthis.editing = false\n\t\t\t// Restore original value\n\t\t\tthis.updateLocalMessage(this.message)\n\t\t},\n\t\tasync onEditComment(message) {\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tawait EditComment(this.commentsType, this.ressourceId, this.id, message)\n\t\t\t\tthis.logger.debug('Comment edited', { commentsType: this.commentsType, ressourceId: this.ressourceId, id: this.id, message })\n\t\t\t\tthis.$emit('update:message', message)\n\t\t\t\tthis.editing = false\n\t\t\t} catch (error) {\n\t\t\t\tshowError(t('comments', 'An error occurred while trying to edit the comment'))\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t// DELETION\n\t\tonDeleteWithUndo() {\n\t\t\tthis.deleted = true\n\t\t\tconst timeOutDelete = setTimeout(this.onDelete, TOAST_UNDO_TIMEOUT)\n\t\t\tshowUndo(t('comments', 'Comment deleted'), () => {\n\t\t\t\tclearTimeout(timeOutDelete)\n\t\t\t\tthis.deleted = false\n\t\t\t})\n\t\t},\n\t\tasync onDelete() {\n\t\t\ttry {\n\t\t\t\tawait DeleteComment(this.commentsType, this.ressourceId, this.id)\n\t\t\t\tthis.logger.debug('Comment deleted', { commentsType: this.commentsType, ressourceId: this.ressourceId, id: this.id })\n\t\t\t\tthis.$emit('delete', this.id)\n\t\t\t} catch (error) {\n\t\t\t\tshowError(t('comments', 'An error occurred while trying to delete the comment'))\n\t\t\t\tconsole.error(error)\n\t\t\t\tthis.deleted = false\n\t\t\t}\n\t\t},\n\n\t\t// CREATION\n\t\tasync onNewComment(message) {\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tconst newComment = await NewComment(this.commentsType, this.ressourceId, message)\n\t\t\t\tthis.logger.debug('New comment posted', { commentsType: this.commentsType, ressourceId: this.ressourceId, newComment })\n\t\t\t\tthis.$emit('new', newComment)\n\n\t\t\t\t// Clear old content\n\t\t\t\tthis.$emit('update:message', '')\n\t\t\t\tthis.localMessage = ''\n\t\t\t} catch (error) {\n\t\t\t\tshowError(t('comments', 'An error occurred while trying to create the comment'))\n\t\t\t\tconsole.error(error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport client from './DavClient.js'\n\n/**\n * Edit an existing comment\n *\n * @param {string} commentsType the ressource type\n * @param {number} ressourceId the ressource ID\n * @param {number} commentId the comment iD\n * @param {string} message the message content\n */\nexport default async function(commentsType, ressourceId, commentId, message) {\n\tconst commentPath = ['', commentsType, ressourceId, commentId].join('/')\n\n\treturn await client.customRequest(commentPath, Object.assign({\n\t\tmethod: 'PROPPATCH',\n\t\tdata: `<?xml version=\"1.0\"?>\n\t\t\t<d:propertyupdate\n\t\t\t\txmlns:d=\"DAV:\"\n\t\t\t\txmlns:oc=\"http://owncloud.org/ns\">\n\t\t\t<d:set>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<oc:message>${message}</oc:message>\n\t\t\t\t</d:prop>\n\t\t\t</d:set>\n\t\t\t</d:propertyupdate>`,\n\t}))\n}\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport client from './DavClient.js'\n\n/**\n * Delete a comment\n *\n * @param {string} commentsType the ressource type\n * @param {number} ressourceId the ressource ID\n * @param {number} commentId the comment iD\n */\nexport default async function(commentsType, ressourceId, commentId) {\n\tconst commentPath = ['', commentsType, ressourceId, commentId].join('/')\n\n\t// Fetch newly created comment data\n\tawait client.deleteFile(commentPath)\n}\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { getRootPath } from '../utils/davUtils.js'\nimport { decodeHtmlEntities } from '../utils/decodeHtmlEntities.js'\nimport axios from '@nextcloud/axios'\nimport client from './DavClient.js'\n\n/**\n * Retrieve the comments list\n *\n * @param {string} commentsType the ressource type\n * @param {number} ressourceId the ressource ID\n * @param {string} message the message\n * @return {object} the new comment\n */\nexport default async function(commentsType, ressourceId, message) {\n\tconst ressourcePath = ['', commentsType, ressourceId].join('/')\n\n\tconst response = await axios.post(getRootPath() + ressourcePath, {\n\t\tactorDisplayName: getCurrentUser().displayName,\n\t\tactorId: getCurrentUser().uid,\n\t\tactorType: 'users',\n\t\tcreationDateTime: (new Date()).toUTCString(),\n\t\tmessage,\n\t\tobjectType: 'files',\n\t\tverb: 'comment',\n\t})\n\n\t// Retrieve comment id from ressource location\n\tconst commentId = parseInt(response.headers['content-location'].split('/').pop())\n\tconst commentPath = ressourcePath + '/' + commentId\n\n\t// Fetch newly created comment data\n\tconst comment = await client.stat(commentPath, {\n\t\tdetails: true,\n\t})\n\n\tconst props = comment.data.props\n\t// Decode twice to handle potentially double-encoded entities\n\t// FIXME Remove this once https://github.com/nextcloud/server/issues/29306\n\t// is resolved\n\tprops.actorDisplayName = decodeHtmlEntities(props.actorDisplayName, 2)\n\tprops.message = decodeHtmlEntities(props.message, 2)\n\n\treturn comment.data\n}\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comment.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comment.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<component :is=\"tag\"\n\t\tv-show=\"!deleted\"\n\t\t:class=\"{'comment--loading': loading}\"\n\t\tclass=\"comment\">\n\t\t<!-- Comment header toolbar -->\n\t\t<div class=\"comment__side\">\n\t\t\t<!-- Author -->\n\t\t\t<NcAvatar class=\"comment__avatar\"\n\t\t\t\t:display-name=\"actorDisplayName\"\n\t\t\t\t:user=\"actorId\"\n\t\t\t\t:size=\"32\" />\n\t\t</div>\n\t\t<div class=\"comment__body\">\n\t\t\t<div class=\"comment__header\">\n\t\t\t\t<span class=\"comment__author\">{{ actorDisplayName }}</span>\n\n\t\t\t\t<!-- Comment actions,\n\t\t\t\t\tshow if we have a message id and current user is author -->\n\t\t\t\t<NcActions v-if=\"isOwnComment && id && !loading\" class=\"comment__actions\">\n\t\t\t\t\t<template v-if=\"!editing\">\n\t\t\t\t\t\t<NcActionButton :close-after-click=\"true\"\n\t\t\t\t\t\t\ticon=\"icon-rename\"\n\t\t\t\t\t\t\t@click=\"onEdit\">\n\t\t\t\t\t\t\t{{ t('comments', 'Edit comment') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<NcActionSeparator />\n\t\t\t\t\t\t<NcActionButton :close-after-click=\"true\"\n\t\t\t\t\t\t\ticon=\"icon-delete\"\n\t\t\t\t\t\t\t@click=\"onDeleteWithUndo\">\n\t\t\t\t\t\t\t{{ t('comments', 'Delete comment') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<NcActionButton v-else\n\t\t\t\t\t\ticon=\"icon-close\"\n\t\t\t\t\t\t@click=\"onEditCancel\">\n\t\t\t\t\t\t{{ t('comments', 'Cancel edit') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</NcActions>\n\n\t\t\t\t<!-- Show loading if we're editing or deleting, not on new ones -->\n\t\t\t\t<div v-if=\"id && loading\" class=\"comment_loading icon-loading-small\" />\n\n\t\t\t\t<!-- Relative time to the comment creation -->\n\t\t\t\t<Moment v-else-if=\"creationDateTime\" class=\"comment__timestamp\" :timestamp=\"timestamp\" />\n\t\t\t</div>\n\n\t\t\t<!-- Message editor -->\n\t\t\t<div v-if=\"editor || editing\" class=\"comment__editor \">\n\t\t\t\t<NcRichContenteditable ref=\"editor\"\n\t\t\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t\t\t:contenteditable=\"!loading\"\n\t\t\t\t\t:value=\"localMessage\"\n\t\t\t\t\t:user-data=\"userData\"\n\t\t\t\t\t@update:value=\"updateLocalMessage\"\n\t\t\t\t\t@submit=\"onSubmit\" />\n\t\t\t\t<NcButton class=\"comment__submit\"\n\t\t\t\t\ttype=\"tertiary-no-background\"\n\t\t\t\t\tnative-type=\"submit\"\n\t\t\t\t\t:aria-label=\"t('comments', 'Post comment')\"\n\t\t\t\t\t:disabled=\"isEmptyMessage\"\n\t\t\t\t\t@click=\"onSubmit\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<span v-if=\"loading\" class=\"icon-loading-small\" />\n\t\t\t\t\t\t<ArrowRight v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\n\t\t\t<!-- Message content -->\n\t\t\t<!-- The html is escaped and sanitized before rendering -->\n\t\t\t<!-- eslint-disable-next-line vue/no-v-html-->\n\t\t\t<div v-else\n\t\t\t\t:class=\"{'comment__message--expanded': expanded}\"\n\t\t\t\tclass=\"comment__message\"\n\t\t\t\t@click=\"onExpand\"\n\t\t\t\tv-html=\"renderedContent\" />\n\t\t</div>\n\t</component>\n</template>\n\n<script>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport moment from '@nextcloud/moment'\n\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\nimport NcActionSeparator from '@nextcloud/vue/dist/Components/NcActionSeparator.js'\nimport NcAvatar from '@nextcloud/vue/dist/Components/NcAvatar.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport NcRichContenteditable from '@nextcloud/vue/dist/Components/NcRichContenteditable.js'\nimport RichEditorMixin from '@nextcloud/vue/dist/Mixins/richEditor.js'\nimport ArrowRight from 'vue-material-design-icons/ArrowRight.vue'\n\nimport Moment from './Moment.vue'\nimport CommentMixin from '../mixins/CommentMixin.js'\n\nexport default {\n\tname: 'Comment',\n\n\tcomponents: {\n\t\tNcActionButton,\n\t\tNcActions,\n\t\tNcActionSeparator,\n\t\tArrowRight,\n\t\tNcAvatar,\n\t\tNcButton,\n\t\tMoment,\n\t\tNcRichContenteditable,\n\t},\n\tmixins: [RichEditorMixin, CommentMixin],\n\n\tinheritAttrs: false,\n\n\tprops: {\n\t\tactorDisplayName: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tactorId: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tcreationDateTime: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Force the editor display\n\t\t */\n\t\teditor: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Provide the autocompletion data\n\t\t */\n\t\tautoComplete: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\n\t\ttag: {\n\t\t\ttype: String,\n\t\t\tdefault: 'div',\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\texpanded: false,\n\t\t\t// Only change data locally and update the original\n\t\t\t// parent data when the request is sent and resolved\n\t\t\tlocalMessage: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\n\t\t/**\n\t\t * Is the current user the author of this comment\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisOwnComment() {\n\t\t\treturn getCurrentUser().uid === this.actorId\n\t\t},\n\n\t\t/**\n\t\t * Rendered content as html string\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\trenderedContent() {\n\t\t\tif (this.isEmptyMessage) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn this.renderContent(this.localMessage)\n\t\t},\n\n\t\tisEmptyMessage() {\n\t\t\treturn !this.localMessage || this.localMessage.trim() === ''\n\t\t},\n\n\t\ttimestamp() {\n\t\t\t// seconds, not milliseconds\n\t\t\treturn parseInt(moment(this.creationDateTime).format('x'), 10) / 1000\n\t\t},\n\t},\n\n\twatch: {\n\t\t// If the data change, update the local value\n\t\tmessage(message) {\n\t\t\tthis.updateLocalMessage(message)\n\t\t},\n\t},\n\n\tbeforeMount() {\n\t\t// Init localMessage\n\t\tthis.updateLocalMessage(this.message)\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Update local Message on outer change\n\t\t *\n\t\t * @param {string} message the message to set\n\t\t */\n\t\tupdateLocalMessage(message) {\n\t\t\tthis.localMessage = message.toString()\n\t\t},\n\n\t\t/**\n\t\t * Dispatch message between edit and create\n\t\t */\n\t\tonSubmit() {\n\t\t\t// Do not submit if message is empty\n\t\t\tif (this.localMessage.trim() === '') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (this.editor) {\n\t\t\t\tthis.onNewComment(this.localMessage.trim())\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t// Focus the editor again\n\t\t\t\t\tthis.$refs.editor.$el.focus()\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.onEditComment(this.localMessage.trim())\n\t\t},\n\n\t\tonExpand() {\n\t\t\tthis.expanded = true\n\t\t},\n\t},\n\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"sass:math\";\n\n$comment-padding: 10px;\n\n.comment {\n\tdisplay: flex;\n\tgap: 16px;\n\tposition: relative;\n\tpadding: 5px $comment-padding;\n\n\t&__side {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tpadding-top: 16px;\n\t}\n\n\t&__body {\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t\tflex-direction: column;\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmin-height: 44px;\n\t}\n\n\t&__actions {\n\t\tmargin-left: $comment-padding !important;\n\t}\n\n\t&__author {\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&_loading,\n\t&__timestamp {\n\t\tmargin-left: auto;\n\t\ttext-align: right;\n\t\twhite-space: nowrap;\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&__submit {\n\t\tposition: absolute !important;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\t// Align with input border\n\t\tmargin: 1px;\n\t}\n\n\t&__message {\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tmax-height: 70px;\n\t\toverflow: hidden;\n\t\tmargin-top: -6px;\n\t\t&--expanded {\n\t\t\tmax-height: none;\n\t\t\toverflow: visible;\n\t\t}\n\t}\n}\n\n.rich-contenteditable__input {\n\tmin-height: 44px;\n\tmargin: 0;\n\tpadding: $comment-padding;\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comment.vue?vue&type=style&index=0&id=13a1afc1&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comment.vue?vue&type=style&index=0&id=13a1afc1&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Comment.vue?vue&type=template&id=13a1afc1&scoped=true&\"\nimport script from \"./Comment.vue?vue&type=script&lang=js&\"\nexport * from \"./Comment.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Comment.vue?vue&type=style&index=0&id=13a1afc1&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"13a1afc1\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c(_vm.tag,{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.deleted),expression:\"!deleted\"}],tag:\"component\",staticClass:\"comment\",class:{'comment--loading': _vm.loading}},[_c('div',{staticClass:\"comment__side\"},[_c('NcAvatar',{staticClass:\"comment__avatar\",attrs:{\"display-name\":_vm.actorDisplayName,\"user\":_vm.actorId,\"size\":32}})],1),_vm._v(\" \"),_c('div',{staticClass:\"comment__body\"},[_c('div',{staticClass:\"comment__header\"},[_c('span',{staticClass:\"comment__author\"},[_vm._v(_vm._s(_vm.actorDisplayName))]),_vm._v(\" \"),(_vm.isOwnComment && _vm.id && !_vm.loading)?_c('NcActions',{staticClass:\"comment__actions\"},[(!_vm.editing)?[_c('NcActionButton',{attrs:{\"close-after-click\":true,\"icon\":\"icon-rename\"},on:{\"click\":_vm.onEdit}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('comments', 'Edit comment'))+\"\\n\\t\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('NcActionSeparator'),_vm._v(\" \"),_c('NcActionButton',{attrs:{\"close-after-click\":true,\"icon\":\"icon-delete\"},on:{\"click\":_vm.onDeleteWithUndo}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('comments', 'Delete comment'))+\"\\n\\t\\t\\t\\t\\t\")])]:_c('NcActionButton',{attrs:{\"icon\":\"icon-close\"},on:{\"click\":_vm.onEditCancel}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('comments', 'Cancel edit'))+\"\\n\\t\\t\\t\\t\")])],2):_vm._e(),_vm._v(\" \"),(_vm.id && _vm.loading)?_c('div',{staticClass:\"comment_loading icon-loading-small\"}):(_vm.creationDateTime)?_c('Moment',{staticClass:\"comment__timestamp\",attrs:{\"timestamp\":_vm.timestamp}}):_vm._e()],1),_vm._v(\" \"),(_vm.editor || _vm.editing)?_c('div',{staticClass:\"comment__editor\"},[_c('NcRichContenteditable',{ref:\"editor\",attrs:{\"auto-complete\":_vm.autoComplete,\"contenteditable\":!_vm.loading,\"value\":_vm.localMessage,\"user-data\":_vm.userData},on:{\"update:value\":_vm.updateLocalMessage,\"submit\":_vm.onSubmit}}),_vm._v(\" \"),_c('NcButton',{staticClass:\"comment__submit\",attrs:{\"type\":\"tertiary-no-background\",\"native-type\":\"submit\",\"aria-label\":_vm.t('comments', 'Post comment'),\"disabled\":_vm.isEmptyMessage},on:{\"click\":_vm.onSubmit},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(_vm.loading)?_c('span',{staticClass:\"icon-loading-small\"}):_c('ArrowRight',{attrs:{\"size\":20}})]},proxy:true}],null,false,2357784758)})],1):_c('div',{staticClass:\"comment__message\",class:{'comment__message--expanded': _vm.expanded},domProps:{\"innerHTML\":_vm._s(_vm.renderedContent)},on:{\"click\":_vm.onExpand}})])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { parseXML } from 'webdav';\n// https://github.com/perry-mitchell/webdav-client/issues/339\nimport { processResponsePayload } from '../../../../node_modules/webdav/dist/node/response.js';\nimport { prepareFileFromProps } from '../../../../node_modules/webdav/dist/node/tools/dav.js';\nimport client from './DavClient.js';\nexport const DEFAULT_LIMIT = 20;\n/**\n * Retrieve the comments list\n *\n * @param {object} data destructuring object\n * @param {string} data.commentsType the ressource type\n * @param {number} data.ressourceId the ressource ID\n * @param {object} [options] optional options for axios\n * @param {number} [options.offset] the pagination offset\n * @return {object[]} the comments list\n */\nexport const getComments = async function ({ commentsType, ressourceId }, options) {\n const ressourcePath = ['', commentsType, ressourceId].join('/');\n const response = await client.customRequest(ressourcePath, Object.assign({\n method: 'REPORT',\n data: `<?xml version=\"1.0\"?>\n\t\t\t<oc:filter-comments\n\t\t\t\txmlns:d=\"DAV:\"\n\t\t\t\txmlns:oc=\"http://owncloud.org/ns\"\n\t\t\t\txmlns:nc=\"http://nextcloud.org/ns\"\n\t\t\t\txmlns:ocs=\"http://open-collaboration-services.org/ns\">\n\t\t\t\t<oc:limit>${DEFAULT_LIMIT}</oc:limit>\n\t\t\t\t<oc:offset>${options.offset || 0}</oc:offset>\n\t\t\t</oc:filter-comments>`,\n }, options));\n const responseData = await response.text();\n const result = await parseXML(responseData);\n const stat = getDirectoryFiles(result, true);\n return processResponsePayload(response, stat, true);\n};\n// https://github.com/perry-mitchell/webdav-client/blob/8d9694613c978ce7404e26a401c39a41f125f87f/source/operations/directoryContents.ts\nconst getDirectoryFiles = function (result, isDetailed = false) {\n // Extract the response items (directory contents)\n const { multistatus: { response: responseItems }, } = result;\n // Map all items to a consistent output structure (results)\n return responseItems.map(item => {\n // Each item should contain a stat object\n const { propstat: { prop: props }, } = item;\n return prepareFileFromProps(props, props.id.toString(), isDetailed);\n });\n};\n","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n - @author Richard Steinmetz <richard@steinmetz.cloud>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"comments\" :class=\"{ 'icon-loading': isFirstLoading }\">\n\t\t<!-- Editor -->\n\t\t<Comment v-bind=\"editorData\"\n\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t:user-data=\"userData\"\n\t\t\t:editor=\"true\"\n\t\t\t:ressource-id=\"ressourceId\"\n\t\t\tclass=\"comments__writer\"\n\t\t\t@new=\"onNewComment\" />\n\n\t\t<template v-if=\"!isFirstLoading\">\n\t\t\t<NcEmptyContent v-if=\"!hasComments && done\"\n\t\t\t\tclass=\"comments__empty\"\n\t\t\t\t:title=\"t('comments', 'No comments yet, start the conversation!')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<MessageReplyTextIcon />\n\t\t\t\t</template>\n\t\t\t</NcEmptyContent>\n\t\t\t<ul v-else>\n\t\t\t\t<!-- Comments -->\n\t\t\t\t<Comment v-for=\"comment in comments\"\n\t\t\t\t\t:key=\"comment.props.id\"\n\t\t\t\t\ttag=\"li\"\n\t\t\t\t\tv-bind=\"comment.props\"\n\t\t\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t\t\t:message.sync=\"comment.props.message\"\n\t\t\t\t\t:ressource-id=\"ressourceId\"\n\t\t\t\t\t:user-data=\"genMentionsData(comment.props.mentions)\"\n\t\t\t\t\tclass=\"comments__list\"\n\t\t\t\t\t@delete=\"onDelete\" />\n\t\t\t</ul>\n\n\t\t\t<!-- Loading more message -->\n\t\t\t<div v-if=\"loading && !isFirstLoading\" class=\"comments__info icon-loading\" />\n\n\t\t\t<div v-else-if=\"hasComments && done\" class=\"comments__info\">\n\t\t\t\t{{ t('comments', 'No more messages') }}\n\t\t\t</div>\n\n\t\t\t<!-- Error message -->\n\t\t\t<template v-else-if=\"error\">\n\t\t\t\t<NcEmptyContent class=\"comments__error\" :title=\"error\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<AlertCircleOutlineIcon />\n\t\t\t\t\t</template>\n\t\t\t\t</NcEmptyContent>\n\t\t\t\t<NcButton class=\"comments__retry\" @click=\"getComments\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<RefreshIcon />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('comments', 'Retry') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { loadState } from '@nextcloud/initial-state'\nimport axios from '@nextcloud/axios'\nimport VTooltip from 'v-tooltip'\nimport Vue from 'vue'\n\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport RefreshIcon from 'vue-material-design-icons/Refresh.vue'\nimport MessageReplyTextIcon from 'vue-material-design-icons/MessageReplyText.vue'\nimport AlertCircleOutlineIcon from 'vue-material-design-icons/AlertCircleOutline.vue'\n\nimport Comment from '../components/Comment.vue'\nimport { getComments, DEFAULT_LIMIT } from '../services/GetComments.ts'\nimport cancelableRequest from '../utils/cancelableRequest.js'\n\nVue.use(VTooltip)\n\nexport default {\n\tname: 'Comments',\n\n\tcomponents: {\n\t\t// Avatar,\n\t\tComment,\n\t\tNcEmptyContent,\n\t\tNcButton,\n\t\tRefreshIcon,\n\t\tMessageReplyTextIcon,\n\t\tAlertCircleOutlineIcon,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\terror: '',\n\t\t\tloading: false,\n\t\t\tdone: false,\n\n\t\t\tressourceId: null,\n\t\t\toffset: 0,\n\t\t\tcomments: [],\n\n\t\t\tcancelRequest: () => {},\n\n\t\t\teditorData: {\n\t\t\t\tactorDisplayName: getCurrentUser().displayName,\n\t\t\t\tactorId: getCurrentUser().uid,\n\t\t\t\tkey: 'editor',\n\t\t\t},\n\n\t\t\tComment,\n\t\t\tuserData: {},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\thasComments() {\n\t\t\treturn this.comments.length > 0\n\t\t},\n\t\tisFirstLoading() {\n\t\t\treturn this.loading && this.offset === 0\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Update current ressourceId and fetch new data\n\t\t *\n\t\t * @param {number} ressourceId the current ressourceId (fileId...)\n\t\t */\n\t\tasync update(ressourceId) {\n\t\t\tthis.ressourceId = ressourceId\n\t\t\tthis.resetState()\n\t\t\tthis.getComments()\n\t\t},\n\n\t\t/**\n\t\t * Ran when the bottom of the tab is reached\n\t\t */\n\t\tonScrollBottomReached() {\n\t\t\t/**\n\t\t\t * Do not fetch more if we:\n\t\t\t * - are showing an error\n\t\t\t * - already fetched everything\n\t\t\t * - are currently loading\n\t\t\t */\n\t\t\tif (this.error || this.done || this.loading) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.getComments()\n\t\t},\n\n\t\t/**\n\t\t * Make sure we have all mentions as Array of objects\n\t\t *\n\t\t * @param {Array} mentions the mentions list\n\t\t * @return {Object<string, object>}\n\t\t */\n\t\tgenMentionsData(mentions) {\n\t\t\tObject.values(mentions)\n\t\t\t\t.flat()\n\t\t\t\t.forEach(mention => {\n\t\t\t\t\tthis.userData[mention.mentionId] = {\n\t\t\t\t\t\t// TODO: support groups\n\t\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\t\tid: mention.mentionId,\n\t\t\t\t\t\tlabel: mention.mentionDisplayName,\n\t\t\t\t\t\tsource: 'users',\n\t\t\t\t\t\tprimary: getCurrentUser().uid === mention.mentionId,\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\treturn this.userData\n\t\t},\n\n\t\t/**\n\t\t * Get the existing shares infos\n\t\t */\n\t\tasync getComments() {\n\t\t\t// Cancel any ongoing request\n\t\t\tthis.cancelRequest('cancel')\n\n\t\t\ttry {\n\t\t\t\tthis.loading = true\n\t\t\t\tthis.error = ''\n\n\t\t\t\t// Init cancellable request\n\t\t\t\tconst { request, abort } = cancelableRequest(getComments)\n\t\t\t\tthis.cancelRequest = abort\n\n\t\t\t\t// Fetch comments\n\t\t\t\tconst { data: comments } = await request({\n\t\t\t\t\tcommentsType: this.commentsType,\n\t\t\t\t\tressourceId: this.ressourceId,\n\t\t\t\t}, { offset: this.offset }) || { data: [] }\n\n\t\t\t\tthis.logger.debug(`Processed ${comments.length} comments`, { comments })\n\n\t\t\t\t// We received less than the requested amount,\n\t\t\t\t// we're done fetching comments\n\t\t\t\tif (comments.length < DEFAULT_LIMIT) {\n\t\t\t\t\tthis.done = true\n\t\t\t\t}\n\n\t\t\t\t// Insert results\n\t\t\t\tthis.comments.push(...comments)\n\n\t\t\t\t// Increase offset for next fetch\n\t\t\t\tthis.offset += DEFAULT_LIMIT\n\t\t\t} catch (error) {\n\t\t\t\tif (error.message === 'cancel') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tthis.error = t('comments', 'Unable to load the comments list')\n\t\t\t\tconsole.error('Error loading the comments list', error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Autocomplete @mentions\n\t\t *\n\t\t * @param {string} search the query\n\t\t * @param {Function} callback the callback to process the results with\n\t\t */\n\t\tasync autoComplete(search, callback) {\n\t\t\tconst results = await axios.get(generateOcsUrl('core/autocomplete/get'), {\n\t\t\t\tparams: {\n\t\t\t\t\tsearch,\n\t\t\t\t\titemType: 'files',\n\t\t\t\t\titemId: this.ressourceId,\n\t\t\t\t\tsorter: 'commenters|share-recipients',\n\t\t\t\t\tlimit: loadState('comments', 'maxAutoCompleteResults'),\n\t\t\t\t},\n\t\t\t})\n\t\t\t// Save user data so it can be used by the editor to replace mentions\n\t\t\tresults.data.ocs.data.forEach(user => { this.userData[user.id] = user })\n\t\t\treturn callback(Object.values(this.userData))\n\t\t},\n\n\t\t/**\n\t\t * Add newly created comment to the list\n\t\t *\n\t\t * @param {object} comment the new comment\n\t\t */\n\t\tonNewComment(comment) {\n\t\t\tthis.comments.unshift(comment)\n\t\t},\n\n\t\t/**\n\t\t * Remove deleted comment from the list\n\t\t *\n\t\t * @param {number} id the deleted comment\n\t\t */\n\t\tonDelete(id) {\n\t\t\tconst index = this.comments.findIndex(comment => comment.props.id === id)\n\t\t\tif (index > -1) {\n\t\t\t\tthis.comments.splice(index, 1)\n\t\t\t} else {\n\t\t\t\tconsole.error('Could not find the deleted comment in the list', id)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Reset the current view to its default state\n\t\t */\n\t\tresetState() {\n\t\t\tthis.error = ''\n\t\t\tthis.loading = false\n\t\t\tthis.done = false\n\t\t\tthis.offset = 0\n\t\t\tthis.comments = []\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.comments {\n\t// Do not add emptycontent top margin\n\t&__empty,\n\t&__error {\n\t\tmargin-top: 0 !important;\n\t}\n\n\t&__retry {\n\t\tmargin: 0 auto;\n\t}\n\n\t&__info {\n\t\theight: 60px;\n\t\tcolor: var(--color-text-maxcontrast);\n\t\ttext-align: center;\n\t\tline-height: 60px;\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comments.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comments.vue?vue&type=script&lang=js&\"","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n/**\n * Creates a cancelable axios 'request object'.\n *\n * @param {Function} request the axios promise request\n * @return {object}\n */\nconst cancelableRequest = function(request) {\n\tconst controller = new AbortController()\n\tconst signal = controller.signal\n\n\t/**\n\t * Execute the request\n\t *\n\t * @param {string} url the url to send the request to\n\t * @param {object} [options] optional config for the request\n\t */\n\tconst fetch = async function(url, options) {\n\t\tconst response = await request(\n\t\t\turl,\n\t\t\tObject.assign({ signal }, options)\n\t\t)\n\t\treturn response\n\t}\n\n\treturn {\n\t\trequest: fetch,\n\t\tabort: () => controller.abort(),\n\t}\n}\n\nexport default cancelableRequest\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comments.vue?vue&type=style&index=0&id=9e9ed272&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Comments.vue?vue&type=style&index=0&id=9e9ed272&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Comments.vue?vue&type=template&id=9e9ed272&scoped=true&\"\nimport script from \"./Comments.vue?vue&type=script&lang=js&\"\nexport * from \"./Comments.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Comments.vue?vue&type=style&index=0&id=9e9ed272&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"9e9ed272\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"comments\",class:{ 'icon-loading': _vm.isFirstLoading }},[_c('Comment',_vm._b({staticClass:\"comments__writer\",attrs:{\"auto-complete\":_vm.autoComplete,\"user-data\":_vm.userData,\"editor\":true,\"ressource-id\":_vm.ressourceId},on:{\"new\":_vm.onNewComment}},'Comment',_vm.editorData,false)),_vm._v(\" \"),(!_vm.isFirstLoading)?[(!_vm.hasComments && _vm.done)?_c('NcEmptyContent',{staticClass:\"comments__empty\",attrs:{\"title\":_vm.t('comments', 'No comments yet, start the conversation!')},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('MessageReplyTextIcon')]},proxy:true}],null,false,1033639148)}):_c('ul',_vm._l((_vm.comments),function(comment){return _c('Comment',_vm._b({key:comment.props.id,staticClass:\"comments__list\",attrs:{\"tag\":\"li\",\"auto-complete\":_vm.autoComplete,\"message\":comment.props.message,\"ressource-id\":_vm.ressourceId,\"user-data\":_vm.genMentionsData(comment.props.mentions)},on:{\"update:message\":function($event){return _vm.$set(comment.props, \"message\", $event)},\"delete\":_vm.onDelete}},'Comment',comment.props,false))}),1),_vm._v(\" \"),(_vm.loading && !_vm.isFirstLoading)?_c('div',{staticClass:\"comments__info icon-loading\"}):(_vm.hasComments && _vm.done)?_c('div',{staticClass:\"comments__info\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('comments', 'No more messages'))+\"\\n\\t\\t\")]):(_vm.error)?[_c('NcEmptyContent',{staticClass:\"comments__error\",attrs:{\"title\":_vm.error},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('AlertCircleOutlineIcon')]},proxy:true}],null,false,66050004)}),_vm._v(\" \"),_c('NcButton',{staticClass:\"comments__retry\",on:{\"click\":_vm.getComments},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('RefreshIcon')]},proxy:true}],null,false,3924573781)},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('comments', 'Retry'))+\"\\n\\t\\t\\t\")])]:_vm._e()]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n'\nimport CommentsApp from '../views/Comments.vue'\nimport Vue from 'vue'\n\nconst logger = getLoggerBuilder()\n\t.setApp('comments')\n\t.detectUser()\n\t.build()\n\n// Add translates functions\nVue.mixin({\n\tdata() {\n\t\treturn {\n\t\t\tlogger,\n\t\t}\n\t},\n\tmethods: {\n\t\tt,\n\t\tn,\n\t},\n})\n\nexport default class CommentInstance {\n\n\t/**\n\t * Initialize a new Comments instance for the desired type\n\t *\n\t * @param {string} commentsType the comments endpoint type\n\t * @param {object} options the vue options (propsData, parent, el...)\n\t */\n\tconstructor(commentsType = 'files', options) {\n\t\t// Add comments type as a global mixin\n\t\tVue.mixin({\n\t\t\tdata() {\n\t\t\t\treturn {\n\t\t\t\t\tcommentsType,\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\n\t\t// Init Comments component\n\t\tconst View = Vue.extend(CommentsApp)\n\t\treturn new View(options)\n\t}\n\n}\n","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport CommentsInstance from './services/CommentsInstance.js'\n\n// Init Comments\nif (window.OCA && !window.OCA.Comments) {\n\tObject.assign(window.OCA, { Comments: {} })\n}\n\n// Init Comments App view\nObject.assign(window.OCA.Comments, { View: CommentsInstance })\nconsole.debug('OCA.Comments.View initialized')\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".comment[data-v-13a1afc1]{display:flex;gap:16px;position:relative;padding:5px 10px}.comment__side[data-v-13a1afc1]{display:flex;align-items:flex-start;padding-top:16px}.comment__body[data-v-13a1afc1]{display:flex;flex-grow:1;flex-direction:column}.comment__header[data-v-13a1afc1]{display:flex;align-items:center;min-height:44px}.comment__actions[data-v-13a1afc1]{margin-left:10px !important}.comment__author[data-v-13a1afc1]{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--color-text-maxcontrast)}.comment_loading[data-v-13a1afc1],.comment__timestamp[data-v-13a1afc1]{margin-left:auto;text-align:right;white-space:nowrap;color:var(--color-text-maxcontrast)}.comment__submit[data-v-13a1afc1]{position:absolute !important;right:0;bottom:0;margin:1px}.comment__message[data-v-13a1afc1]{white-space:pre-wrap;word-break:break-word;max-height:70px;overflow:hidden;margin-top:-6px}.comment__message--expanded[data-v-13a1afc1]{max-height:none;overflow:visible}.rich-contenteditable__input[data-v-13a1afc1]{min-height:44px;margin:0;padding:10px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/comments/src/components/Comment.vue\"],\"names\":[],\"mappings\":\"AAKA,0BACC,YAAA,CACA,QAAA,CACA,iBAAA,CACA,gBAAA,CAEA,gCACC,YAAA,CACA,sBAAA,CACA,gBAAA,CAGD,gCACC,YAAA,CACA,WAAA,CACA,qBAAA,CAGD,kCACC,YAAA,CACA,kBAAA,CACA,eAAA,CAGD,mCACC,2BAAA,CAGD,kCACC,eAAA,CACA,kBAAA,CACA,sBAAA,CACA,mCAAA,CAGD,uEAEC,gBAAA,CACA,gBAAA,CACA,kBAAA,CACA,mCAAA,CAGD,kCACC,4BAAA,CACA,OAAA,CACA,QAAA,CAEA,UAAA,CAGD,mCACC,oBAAA,CACA,qBAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CACA,6CACC,eAAA,CACA,gBAAA,CAKH,8CACC,eAAA,CACA,QAAA,CACA,YArEiB\",\"sourcesContent\":[\"\\n@use \\\"sass:math\\\";\\n\\n$comment-padding: 10px;\\n\\n.comment {\\n\\tdisplay: flex;\\n\\tgap: 16px;\\n\\tposition: relative;\\n\\tpadding: 5px $comment-padding;\\n\\n\\t&__side {\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: flex-start;\\n\\t\\tpadding-top: 16px;\\n\\t}\\n\\n\\t&__body {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-grow: 1;\\n\\t\\tflex-direction: column;\\n\\t}\\n\\n\\t&__header {\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t\\tmin-height: 44px;\\n\\t}\\n\\n\\t&__actions {\\n\\t\\tmargin-left: $comment-padding !important;\\n\\t}\\n\\n\\t&__author {\\n\\t\\toverflow: hidden;\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t}\\n\\n\\t&_loading,\\n\\t&__timestamp {\\n\\t\\tmargin-left: auto;\\n\\t\\ttext-align: right;\\n\\t\\twhite-space: nowrap;\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t}\\n\\n\\t&__submit {\\n\\t\\tposition: absolute !important;\\n\\t\\tright: 0;\\n\\t\\tbottom: 0;\\n\\t\\t// Align with input border\\n\\t\\tmargin: 1px;\\n\\t}\\n\\n\\t&__message {\\n\\t\\twhite-space: pre-wrap;\\n\\t\\tword-break: break-word;\\n\\t\\tmax-height: 70px;\\n\\t\\toverflow: hidden;\\n\\t\\tmargin-top: -6px;\\n\\t\\t&--expanded {\\n\\t\\t\\tmax-height: none;\\n\\t\\t\\toverflow: visible;\\n\\t\\t}\\n\\t}\\n}\\n\\n.rich-contenteditable__input {\\n\\tmin-height: 44px;\\n\\tmargin: 0;\\n\\tpadding: $comment-padding;\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".comments__empty[data-v-9e9ed272],.comments__error[data-v-9e9ed272]{margin-top:0 !important}.comments__retry[data-v-9e9ed272]{margin:0 auto}.comments__info[data-v-9e9ed272]{height:60px;color:var(--color-text-maxcontrast);text-align:center;line-height:60px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/comments/src/views/Comments.vue\"],\"names\":[],\"mappings\":\"AAGC,oEAEC,uBAAA,CAGD,kCACC,aAAA,CAGD,iCACC,WAAA,CACA,mCAAA,CACA,iBAAA,CACA,gBAAA\",\"sourcesContent\":[\"\\n.comments {\\n\\t// Do not add emptycontent top margin\\n\\t&__empty,\\n\\t&__error {\\n\\t\\tmargin-top: 0 !important;\\n\\t}\\n\\n\\t&__retry {\\n\\t\\tmargin: 0 auto;\\n\\t}\\n\\n\\t&__info {\\n\\t\\theight: 60px;\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t\\ttext-align: center;\\n\\t\\tline-height: 60px;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 6335;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t6335: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], () => (__webpack_require__(57673)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","name","props","timestamp","type","required","format","default","computed","title","formatted","_vm","this","_c","_self","staticClass","attrs","_v","_s","getRootPath","generateRemoteUrl","decodeHtmlEntities","value","passes","parser","DOMParser","decoded","i","parseFromString","documentElement","textContent","createClient","headers","requesttoken","getRequestToken","id","Number","message","String","ressourceId","data","deleted","editing","loading","methods","onEdit","onEditCancel","updateLocalMessage","async","commentsType","commentId","commentPath","join","client","Object","assign","method","EditComment","logger","debug","$emit","error","showError","t","console","onDeleteWithUndo","timeOutDelete","setTimeout","onDelete","TOAST_UNDO_TIMEOUT","showUndo","clearTimeout","DeleteComment","newComment","ressourcePath","response","axios","actorDisplayName","getCurrentUser","displayName","actorId","uid","actorType","creationDateTime","Date","toUTCString","objectType","verb","parseInt","split","pop","comment","details","NewComment","localMessage","components","NcActionButton","NcActions","NcActionSeparator","ArrowRight","NcAvatar","NcButton","Moment","NcRichContenteditable","mixins","inheritAttrs","editor","autoComplete","tag","expanded","isOwnComment","renderedContent","isEmptyMessage","watch","beforeMount","onSubmit","onExpand","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","directives","rawName","expression","class","on","_e","ref","userData","scopedSlots","_u","key","fn","proxy","domProps","getComments","offset","responseData","text","result","parseXML","stat","getDirectoryFiles","processResponsePayload","isDetailed","multistatus","responseItems","map","item","propstat","prop","prepareFileFromProps","toString","Vue","Comment","NcEmptyContent","RefreshIcon","MessageReplyTextIcon","AlertCircleOutlineIcon","done","comments","cancelRequest","editorData","hasComments","isFirstLoading","onScrollBottomReached","genMentionsData","flat","forEach","icon","label","source","primary","request","abort","controller","AbortController","signal","url","params","search","itemType","itemId","sorter","limit","results","onNewComment","resetState","_b","_l","mentions","$event","$set","getLoggerBuilder","setApp","detectUser","build","n","window","OCA","Comments","View","constructor","CommentsApp","___CSS_LOADER_EXPORT___","push","module","webpackContext","req","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","resolve","exports","__webpack_module_cache__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","call","m","O","chunkIds","priority","notFulfilled","Infinity","length","fulfilled","j","every","splice","r","getter","__esModule","d","a","definition","defineProperty","enumerable","get","g","globalThis","Function","obj","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file diff --git a/dist/files-main.js b/dist/files-main.js index da16315fcb5..a9f57f777b8 100644 --- a/dist/files-main.js +++ b/dist/files-main.js @@ -1,3 +1,3 @@ /*! For license information please see files-main.js.LICENSE.txt */ -(()=>{"use strict";var e,n={18482:(e,n,i)=>{var o=i(17499),s=i(79954),r=i(31352),a=i(79753),l=i(45994);const c=function(){var t,e,n,i;const o=(null===(t=OCA)||void 0===t||null===(e=t.Files)||void 0===e||null===(n=e.App)||void 0===n||null===(i=n.currentFileList)||void 0===i?void 0:i.dirInfo)||{path:"/",name:""};return"".concat(o.path,"/").concat(o.name).replace(/\/\//gi,"/")};var d=i(4820),u=i(20144),p=i(62520),h=i(64024),f=i(93455),A=i.n(f),v=i(70110),m=i.n(v);const g=256,w={name:"TemplatePreview",inheritAttrs:!1,props:{basename:{type:String,required:!0},checked:{type:Boolean,default:!1},fileid:{type:[String,Number],required:!0},filename:{type:String,required:!0},previewUrl:{type:String,default:null},hasPreview:{type:Boolean,default:!0},mime:{type:String,required:!0},ratio:{type:Number,default:null}},data:()=>({failedPreview:!1}),computed:{nameWithoutExt(){return this.basename.indexOf(".")>-1?this.basename.split(".").slice(0,-1).join("."):this.basename},id(){return"template-picker-".concat(this.fileid)},realPreviewUrl(){return this.failedPreview&&this.mimeIcon?this.mimeIcon:this.previewUrl?this.previewUrl:(0,l.ts)()?(0,a.generateUrl)("/core/preview?fileId=".concat(this.fileid,"&x=").concat(g,"&y=").concat(g,"&a=1")):(0,a.generateUrl)("/apps/files_sharing/publicpreview/".concat(document.getElementById("sharingToken")&&document.getElementById("sharingToken").value,"?fileId=").concat(this.fileid,"&file=").concat(function(t){const e=(t.startsWith("/")?t:"/".concat(t)).split("/");let n="";return e.forEach((t=>{""!==t&&(n+="/"+encodeURIComponent(t))})),n}(this.filename),"&x=").concat(g,"&y=").concat(g,"&a=1"))},mimeIcon(){return OC.MimeType.getIconUrl(this.mime)}},methods:{onCheck(){this.$emit("check",this.fileid)},onFailure(){this.failedPreview=!0}}};var C=i(93379),b=i.n(C),y=i(7795),_=i.n(y),x=i(90569),S=i.n(x),k=i(3565),N=i.n(k),I=i(19216),E=i.n(I),F=i(44589),B=i.n(F),P=i(3491),z={};z.styleTagTransform=B(),z.setAttributes=N(),z.insert=S().bind(null,"head"),z.domAPI=_(),z.insertStyleElement=E(),b()(P.Z,z),P.Z&&P.Z.locals&&P.Z.locals;var T=i(51900);const L=(0,T.Z)(w,(function(){var t=this,e=t._self._c;return e("li",{staticClass:"template-picker__item"},[e("input",{staticClass:"radio",attrs:{id:t.id,type:"radio",name:"template-picker"},domProps:{checked:t.checked},on:{change:t.onCheck}}),t._v(" "),e("label",{staticClass:"template-picker__label",attrs:{for:t.id}},[e("div",{staticClass:"template-picker__preview",class:t.failedPreview?"template-picker__preview--failed":""},[e("img",{staticClass:"template-picker__image",attrs:{src:t.realPreviewUrl,alt:"",draggable:"false"},on:{error:t.onFailure}})]),t._v(" "),e("span",{staticClass:"template-picker__title"},[t._v("\n\t\t\t"+t._s(t.nameWithoutExt)+"\n\t\t")])])])}),[],!1,null,"6c072a31",null).exports;var U=i(25108);const V={name:"TemplatePicker",components:{NcEmptyContent:A(),NcModal:m(),TemplatePreview:L},props:{logger:{type:Object,required:!0}},data:()=>({checked:-1,loading:!1,name:null,opened:!1,provider:null}),computed:{nameWithoutExt(){return this.name.indexOf(".")>-1?this.name.split(".").slice(0,-1).join("."):this.name},emptyTemplate(){var e,n;return{basename:t("files","Blank"),fileid:-1,filename:this.t("files","Blank"),hasPreview:!1,mime:(null===(e=this.provider)||void 0===e?void 0:e.mimetypes[0])||(null===(n=this.provider)||void 0===n?void 0:n.mimetypes)}},selectedTemplate(){return this.provider.templates.find((t=>t.fileid===this.checked))},style(){return{"--margin":"8px","--width":"160px","--border":"2px","--fullwidth":"180px","--height":this.provider.ratio?Math.round(160/this.provider.ratio)+"px":null}}},methods:{async open(t,e){this.checked=this.emptyTemplate.fileid,this.name=t,this.provider=e;const n=(await async function(){return(await d.default.get((0,a.generateOcsUrl)("apps/files/api/v1/templates"))).data.ocs.data}()).find((t=>t.app===e.app&&t.label===e.label));if(null===n)throw new Error("Failed to match provider in results");this.provider=n,0!==n.templates.length?this.opened=!0:this.onSubmit()},close(){this.checked=this.emptyTemplate.fileid,this.loading=!1,this.name=null,this.opened=!1,this.provider=null},onCheck(t){this.checked=t},async onSubmit(){var t,e,n;this.loading=!0;const i=c(),o=null===(t=OCA)||void 0===t||null===(e=t.Files)||void 0===e||null===(n=e.App)||void 0===n?void 0:n.currentFileList;var s,r;this.nameWithoutExt===this.name&&(this.logger.debug("Fixed invalid filename",{name:this.name,extension:null===(s=this.provider)||void 0===s?void 0:s.extension}),this.name=this.name+(null===(r=this.provider)||void 0===r?void 0:r.extension));try{var l,u;const t=await async function(t,e,n){return(await d.default.post((0,a.generateOcsUrl)("apps/files/api/v1/templates/create"),{filePath:t,templatePath:e,templateType:n})).data.ocs.data}((0,p.normalize)("".concat(i,"/").concat(this.name)),null===(l=this.selectedTemplate)||void 0===l?void 0:l.filename,null===(u=this.selectedTemplate)||void 0===u?void 0:u.templateType);this.logger.debug("Created new file",t);const e=await(null==o?void 0:o.addAndFetchFileInfo(this.name).then(((t,e)=>e))),n=new OCA.Files.FileInfoModel(e,{filesClient:null==o?void 0:o.filesClient}),s=OCA.Files.fileActions.getDefaultFileAction(t.mime,"file",OC.PERMISSION_ALL);s&&s.action(t.basename,{$file:null==o?void 0:o.findFileEl(this.name),dir:i,fileList:o,fileActions:null==o?void 0:o.fileActions,fileInfoModel:n}),this.close()}catch(t){this.logger.error("Error while creating the new file from template"),U.error(t),(0,h.x2)(this.t("files","Unable to create new file from template"))}finally{this.loading=!1}}}};var D=i(5103),O={};O.styleTagTransform=B(),O.setAttributes=N(),O.insert=S().bind(null,"head"),O.domAPI=_(),O.insertStyleElement=E(),b()(D.Z,O),D.Z&&D.Z.locals&&D.Z.locals;const Z=(0,T.Z)(V,(function(){var t=this,e=t._self._c;return t.opened?e("NcModal",{staticClass:"templates-picker",attrs:{"clear-view-delay":-1,size:"normal"},on:{close:t.close}},[e("form",{staticClass:"templates-picker__form",style:t.style,on:{submit:function(e){return e.preventDefault(),e.stopPropagation(),t.onSubmit.apply(null,arguments)}}},[e("h2",[t._v(t._s(t.t("files","Pick a template for {name}",{name:t.nameWithoutExt})))]),t._v(" "),e("ul",{staticClass:"templates-picker__list"},[e("TemplatePreview",t._b({attrs:{checked:t.checked===t.emptyTemplate.fileid},on:{check:t.onCheck}},"TemplatePreview",t.emptyTemplate,!1)),t._v(" "),t._l(t.provider.templates,(function(n){return e("TemplatePreview",t._b({key:n.fileid,attrs:{checked:t.checked===n.fileid,ratio:t.provider.ratio},on:{check:t.onCheck}},"TemplatePreview",n,!1))}))],2),t._v(" "),e("div",{staticClass:"templates-picker__buttons"},[e("button",{on:{click:t.close}},[t._v("\n\t\t\t\t"+t._s(t.t("files","Cancel"))+"\n\t\t\t")]),t._v(" "),e("input",{staticClass:"primary",attrs:{type:"submit","aria-label":t.t("files","Create a new file with the selected template")},domProps:{value:t.t("files","Create")}})])]),t._v(" "),t.loading?e("NcEmptyContent",{staticClass:"templates-picker__loading",attrs:{icon:"icon-loading"}},[t._v("\n\t\t"+t._s(t.t("files","Creating file"))+"\n\t")]):t._e()],1):t._e()}),[],!1,null,"715b4161",null).exports,R=(0,o.IY)().setApp("files").detectUser().build();u.default.mixin({methods:{t:r.Iu,n:r.uN}});const q=document.createElement("div");q.id="template-picker",document.body.appendChild(q);let j=(0,s.j)("files","templates",[]),M=(0,s.j)("files","templates_path",!1);R.debug("Templates providers",j),R.debug("Templates folder",{templatesPath:M});const $=new(u.default.extend(Z))({name:"TemplatePicker",propsData:{logger:R}});$.$mount("#template-picker"),window.addEventListener("DOMContentLoaded",(function(){if(!M){R.debug("Templates folder not initialized");const t={attach(t){t.addMenuEntry({id:"template-init",displayName:(0,r.Iu)("files","Set up templates folder"),templateName:(0,r.Iu)("files","Templates"),iconClass:"icon-template-add",fileType:"file",actionHandler(e){W(e),t.removeMenuEntry("template-init")}})}};OC.Plugins.register("OCA.Files.NewFileMenu",t)}})),j.forEach(((t,e)=>{const n={attach(n){const i=n.fileList;"files"!==i.id&&"files.public"!==i.id||n.addMenuEntry({id:"template-new-".concat(t.app,"-").concat(e),displayName:t.label,templateName:t.label+t.extension,iconClass:t.iconClass||"icon-file",fileType:"file",actionHandler(e){$.open(e,t)}})}};OC.Plugins.register("OCA.Files.NewFileMenu",n)}));const W=async function(t){const e=(c()+"/".concat(t)).replace("//","/");try{R.debug("Initializing the templates directory",{templatePath:e});const t=await d.default.post((0,a.generateOcsUrl)("apps/files/api/v1/templates/path"),{templatePath:e,copySystemTemplates:!0});OCA.Files.App.currentFileList.changeDirectory(e,!0,!0),j=t.data.ocs.data.templates,M=t.data.ocs.data.template_path}catch(t){R.error("Unable to initialize the templates directory"),(0,h.x2)((0,r.Iu)("files","Unable to initialize the templates directory"))}};var G=i(78595);!function(){const t={attach(t){(0,G.Ld)("nextcloud:unified-search.search",(e=>{let{query:n}=e;t.setFilter(n)})),(0,G.Ld)("nextcloud:unified-search.reset",(()=>{this.query=null,t.setFilter("")}))}};window.OC.Plugins.register("OCA.Files.FileList",t)}();var H=i(91770),K=i(78510);const Q=(0,o.IY)().setApp("files").detectUser().build();const Y=function(){return window._nc_fileactions||[]};var J;J=new class{constructor(t){var e,n,i;e=this,i=void 0,(n=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var i=n.call(t,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:String(e)}(n="_action"))in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i,this.validateAction(t),this._action=t}get id(){return this._action.id}get displayName(){return this._action.displayName}get iconSvgInline(){return this._action.iconSvgInline}get enabled(){return this._action.enabled}get exec(){return this._action.exec}get execBatch(){return this._action.execBatch}get order(){return this._action.order}get default(){return this._action.default}get inline(){return this._action.inline}get renderInline(){return this._action.renderInline}validateAction(t){if(!t.id||"string"!=typeof t.id)throw new Error("Invalid id");if(!t.displayName||"function"!=typeof t.displayName)throw new Error("Invalid displayName function");if(!t.iconSvgInline||"function"!=typeof t.iconSvgInline)throw new Error("Invalid iconSvgInline function");if(!t.exec||"function"!=typeof t.exec)throw new Error("Invalid exec function");if("enabled"in t&&"function"!=typeof t.enabled)throw new Error("Invalid enabled function");if("execBatch"in t&&"function"!=typeof t.execBatch)throw new Error("Invalid execBatch function");if("order"in t&&"number"!=typeof t.order)throw new Error("Invalid order");if("default"in t&&"boolean"!=typeof t.default)throw new Error("Invalid default");if("inline"in t&&"function"!=typeof t.inline)throw new Error("Invalid inline function");if("renderInline"in t&&"function"!=typeof t.renderInline)throw new Error("Invalid renderInline function")}}({id:"delete",displayName:(t,e)=>"trashbin"===e.id?(0,r.Iu)("files_trashbin","Delete permanently"):(0,r.Iu)("files","Delete"),iconSvgInline:()=>K,enabled:t=>t.length>0&&t.map((t=>t.permissions)).every((t=>0!=(t&H.y3.DELETE))),async exec(t){try{return await d.default.delete(t.source),(0,G.j8)("files:node:deleted",t),!0}catch(e){return Q.error("Error while deleting a file",{error:e,source:t.source,node:t}),!1}},async execBatch(t,e){return Promise.all(t.map((t=>this.exec(t,e))))},order:100}),void 0===window._nc_fileactions&&(window._nc_fileactions=[],Q.debug("FileActions initialized")),window._nc_fileactions.find((t=>t.id===J.id))?Q.error("FileAction ".concat(J.id," already registered"),{action:J}):window._nc_fileactions.push(J);const X=function(t){let{id:e,name:n,order:i,icon:o,parent:s,classes:r="",expanded:a,params:l}=t;OCP.Files.Navigation.register({id:e,name:n,order:i,params:l,parent:s,expanded:!0===a,iconClass:o?"icon-".concat(o):"nav-icon-"+e,legacy:!0,sticky:r.includes("pinned")})};var tt=i(59305),et=i(41487),nt=i.n(et);function it(t,e,n){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var i=n.call(t,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}const ot=class{constructor(){it(this,"_views",[]),it(this,"_currentView",null),Q.debug("Navigation service initialized")}register(t){try{rt(t),st(t,this._views)}catch(e){throw e instanceof Error&&Q.error(e.message,{view:t}),e}t.legacy&&Q.warn("Legacy view detected, please migrate to Vue"),t.iconClass&&(t.legacy=!0),this._views.push(t)}get views(){return this._views}setActive(t){this._currentView=t}get active(){return this._currentView}},st=function(t,e){if(e.find((e=>e.id===t.id)))throw new Error("Navigation id ".concat(t.id," is already registered"));return!0},rt=function(t){if(!t.id||"string"!=typeof t.id)throw new Error("Navigation id is required and must be a string");if(!t.name||"string"!=typeof t.name)throw new Error("Navigation name is required and must be a string");if(!t.legacy){if(!t.getContents||"function"!=typeof t.getContents)throw new Error("Navigation getContents is required and must be a function");if(!t.icon||"string"!=typeof t.icon||!nt()(t.icon))throw new Error("Navigation icon is required and must be a valid svg string")}if(!("order"in t)||"number"!=typeof t.order)throw new Error("Navigation order is required and must be a number");if(t.columns&&t.columns.forEach(at),t.emptyView&&"function"!=typeof t.emptyView)throw new Error("Navigation emptyView must be a function");if(t.parent&&"string"!=typeof t.parent)throw new Error("Navigation parent must be a string");if("sticky"in t&&"boolean"!=typeof t.sticky)throw new Error("Navigation sticky must be a boolean");if("expanded"in t&&"boolean"!=typeof t.expanded)throw new Error("Navigation expanded must be a boolean");if(t.defaultSortKey&&"string"!=typeof t.defaultSortKey)throw new Error("Navigation defaultSortKey must be a string");return!0},at=function(t){if(!t.id||"string"!=typeof t.id)throw new Error("A column id is required");if(!t.title||"string"!=typeof t.title)throw new Error("A column title is required");if(!t.render||"function"!=typeof t.render)throw new Error("A render function is required");if(t.sort&&"function"!=typeof t.sort)throw new Error("Column sortFunction must be a function");if(t.summary&&"function"!=typeof t.summary)throw new Error("Column summary must be a function");return!0};var lt=i(57638),ct=i(55209),dt=i.n(ct),ut=i(14032),pt=i.n(ut),ht=i(91211),ft=i.n(ht);const At=(0,s.j)("files","viewConfigs",{}),vt=function(){const t=(0,tt.Q_)("viewconfig",{state:()=>({viewConfig:At}),getters:{getConfig:t=>e=>t.viewConfig[e]||{}},actions:{onUpdate(t,e,n){this.viewConfig[t]||u.default.set(this.viewConfig,t,{}),u.default.set(this.viewConfig[t],e,n)},async update(t,e,n){d.default.put((0,a.generateUrl)("/apps/files/api/v1/views/".concat(t,"/").concat(e)),{value:n}),(0,G.j8)("files:viewconfig:updated",{view:t,key:e,value:n})},setSortingBy(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"basename",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"files";this.update(e,"sorting_mode",t),this.update(e,"sorting_direction","asc")},toggleSortingDirection(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"files";const e="asc"===(this.getConfig(t)||{sorting_direction:"asc"}).sorting_direction?"desc":"asc";this.update(t,"sorting_direction",e)}}}),e=t(...arguments);return e._initialized||((0,G.Ld)("files:viewconfig:updated",(function(t){let{view:n,key:i,value:o}=t;e.onUpdate(n,i,o)})),e._initialized=!0),e};var mt=i(28615),gt=i(74184),wt=i(48959),Ct=i.n(wt);const bt={name:"NavigationQuota",components:{ChartPie:gt.Z,NcAppNavigationItem:pt(),NcProgressBar:Ct()},data:()=>({loadingStorageStats:!1,storageStats:(0,s.j)("files","storageStats",null)}),computed:{storageStatsTitle(){var t,e,n;const i=(0,H.sS)(null===(t=this.storageStats)||void 0===t?void 0:t.used),o=(0,H.sS)(null===(e=this.storageStats)||void 0===e?void 0:e.quota);return(null===(n=this.storageStats)||void 0===n?void 0:n.quota)<0?this.t("files","{usedQuotaByte} used",{usedQuotaByte:i}):this.t("files","{used} of {quota} used",{used:i,quota:o})},storageStatsTooltip(){return this.storageStats.relative?this.t("files","{relative}% used",this.storageStats):""}},beforeMount(){setInterval(this.throttleUpdateStorageStats,6e4),(0,G.Ld)("files:node:created",this.throttleUpdateStorageStats),(0,G.Ld)("files:node:deleted",this.throttleUpdateStorageStats),(0,G.Ld)("files:node:moved",this.throttleUpdateStorageStats),(0,G.Ld)("files:node:updated",this.throttleUpdateStorageStats)},methods:{debounceUpdateStorageStats:(0,mt.D)(200,(function(t){this.updateStorageStats(t)})),throttleUpdateStorageStats:(0,mt.P)(1e3,(function(t){this.updateStorageStats(t)})),async updateStorageStats(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if(!this.loadingStorageStats){this.loadingStorageStats=!0;try{var n;const t=await d.default.get((0,a.generateUrl)("/apps/files/api/v1/stats"));if(null==t||null===(n=t.data)||void 0===n||!n.data)throw new Error("Invalid storage stats");this.storageStats=t.data.data}catch(n){Q.error("Could not refresh storage stats",{error:n}),e&&(0,h.x2)(t("files","Could not refresh storage stats"))}finally{this.loadingStorageStats=!1}}},t:r.Iu}};var yt=i(93582),_t={};_t.styleTagTransform=B(),_t.setAttributes=N(),_t.insert=S().bind(null,"head"),_t.domAPI=_(),_t.insertStyleElement=E(),b()(yt.Z,_t),yt.Z&&yt.Z.locals&&yt.Z.locals;const xt=(0,T.Z)(bt,(function(){var t=this,e=t._self._c;return t.storageStats?e("NcAppNavigationItem",{staticClass:"app-navigation-entry__settings-quota",class:{"app-navigation-entry__settings-quota--not-unlimited":t.storageStats.quota>=0},attrs:{"aria-label":t.t("files","Storage informations"),loading:t.loadingStorageStats,name:t.storageStatsTitle,title:t.storageStatsTooltip,"data-cy-files-navigation-settings-quota":""},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.debounceUpdateStorageStats.apply(null,arguments)}}},[e("ChartPie",{attrs:{slot:"icon",size:20},slot:"icon"}),t._v(" "),t.storageStats.quota>=0?e("NcProgressBar",{attrs:{slot:"extra",error:t.storageStats.relative>80,value:Math.min(t.storageStats.relative,100)},slot:"extra"}):t._e()],1):t._e()}),[],!1,null,"918797b2",null).exports;var St=i(68988),kt=i.n(St),Nt=i(16809),It=i.n(Nt),Et=i(20571),Ft=i.n(Et),Bt=i(70386),Pt=i(36029),zt=i.n(Pt);const Tt={name:"Setting",props:{el:{type:Function,required:!0}},mounted(){this.$el.appendChild(this.el())}},Lt=(0,T.Z)(Tt,(function(){return(0,this._self._c)("div")}),[],!1,null,null,null).exports,Ut=(0,s.j)("files","config",{show_hidden:!1,crop_image_previews:!0}),Vt=function(){const t=(0,tt.Q_)("userconfig",{state:()=>({userConfig:Ut}),actions:{onUpdate(t,e){u.default.set(this.userConfig,t,e)},async update(t,e){await d.default.put((0,a.generateUrl)("/apps/files/api/v1/config/"+t),{value:e}),(0,G.j8)("files:config:updated",{key:t,value:e})}}})(...arguments);return t._initialized||((0,G.Ld)("files:config:updated",(function(e){let{key:n,value:i}=e;t.onUpdate(n,i)})),t._initialized=!0),t},Dt={name:"Settings",components:{Clipboard:Bt.Z,NcAppSettingsDialog:kt(),NcAppSettingsSection:It(),NcCheckboxRadioSwitch:Ft(),NcInputField:zt(),Setting:Lt},props:{open:{type:Boolean,default:!1}},setup:()=>({userConfigStore:Vt()}),data(){var t,e,n,i;return{settings:(null===(t=window.OCA)||void 0===t||null===(e=t.Files)||void 0===e||null===(n=e.Settings)||void 0===n?void 0:n.settings)||[],webdavUrl:(0,a.generateRemoteUrl)("dav/files/"+encodeURIComponent(null===(i=(0,l.ts)())||void 0===i?void 0:i.uid)),webdavDocs:"https://docs.nextcloud.com/server/stable/go.php?to=user-webdav",appPasswordUrl:(0,a.generateUrl)("/settings/user/security#generate-app-token-section"),webdavUrlCopied:!1}},computed:{userConfig(){return this.userConfigStore.userConfig}},beforeMount(){this.settings.forEach((t=>t.open()))},beforeDestroy(){this.settings.forEach((t=>t.close()))},methods:{onClose(){this.$emit("close")},setConfig(t,e){this.userConfigStore.update(t,e)},async copyCloudId(){document.querySelector("input#webdav-url-input").select(),navigator.clipboard?(await navigator.clipboard.writeText(this.webdavUrl),this.webdavUrlCopied=!0,(0,h.s$)(t("files","WebDAV URL copied to clipboard")),setTimeout((()=>{this.webdavUrlCopied=!1}),5e3)):(0,h.x2)(t("files","Clipboard is not available"))},t:r.Iu}},Ot=Dt;var Zt=i(35662),Rt={};Rt.styleTagTransform=B(),Rt.setAttributes=N(),Rt.insert=S().bind(null,"head"),Rt.domAPI=_(),Rt.insertStyleElement=E(),b()(Zt.Z,Rt),Zt.Z&&Zt.Z.locals&&Zt.Z.locals;const qt=(0,T.Z)(Ot,(function(){var t=this,e=t._self._c;return e("NcAppSettingsDialog",{attrs:{open:t.open,"show-navigation":!0,title:t.t("files","Files settings")},on:{"update:open":t.onClose}},[e("NcAppSettingsSection",{attrs:{id:"settings",title:t.t("files","Files settings")}},[e("NcCheckboxRadioSwitch",{attrs:{checked:t.userConfig.show_hidden},on:{"update:checked":function(e){return t.setConfig("show_hidden",e)}}},[t._v("\n\t\t\t"+t._s(t.t("files","Show hidden files"))+"\n\t\t")]),t._v(" "),e("NcCheckboxRadioSwitch",{attrs:{checked:t.userConfig.crop_image_previews},on:{"update:checked":function(e){return t.setConfig("crop_image_previews",e)}}},[t._v("\n\t\t\t"+t._s(t.t("files","Crop image previews"))+"\n\t\t")])],1),t._v(" "),0!==t.settings.length?e("NcAppSettingsSection",{attrs:{id:"more-settings",title:t.t("files","Additional settings")}},[t._l(t.settings,(function(t){return[e("Setting",{key:t.name,attrs:{el:t.el}})]}))],2):t._e(),t._v(" "),e("NcAppSettingsSection",{attrs:{id:"webdav",title:t.t("files","WebDAV")}},[e("NcInputField",{attrs:{id:"webdav-url-input","show-trailing-button":!0,success:t.webdavUrlCopied,"trailing-button-label":t.t("files","Copy to clipboard"),value:t.webdavUrl,readonly:"readonly",type:"url"},on:{focus:function(t){return t.target.select()},"trailing-button-click":t.copyCloudId},scopedSlots:t._u([{key:"trailing-button-icon",fn:function(){return[e("Clipboard",{attrs:{size:20}})]},proxy:!0}])}),t._v(" "),e("em",[e("a",{staticClass:"setting-link",attrs:{href:t.webdavDocs,target:"_blank",rel:"noreferrer noopener"}},[t._v("\n\t\t\t\t"+t._s(t.t("files","Use this address to access your Files via WebDAV"))+" ↗\n\t\t\t")])]),t._v(" "),e("br"),t._v(" "),e("em",[e("a",{staticClass:"setting-link",attrs:{href:t.appPasswordUrl}},[t._v("\n\t\t\t\t"+t._s(t.t("files","If you have enabled 2FA, you must create and use a new app password by clicking here."))+" ↗\n\t\t\t")])])],1)],1)}),[],!1,null,"76ca5d1f",null).exports,jt={name:"Navigation",components:{Cog:lt.default,NavigationQuota:xt,NcAppNavigation:dt(),NcAppNavigationItem:pt(),NcIconSvgWrapper:ft(),SettingsModal:qt},props:{Navigation:{type:ot,required:!0}},setup:()=>({viewConfigStore:vt()}),data:()=>({settingsOpened:!1}),computed:{currentViewId(){var t,e;return(null===(t=this.$route)||void 0===t||null===(e=t.params)||void 0===e?void 0:e.view)||"files"},currentView(){return this.views.find((t=>t.id===this.currentViewId))},views(){return this.Navigation.views},parentViews(){return this.views.filter((t=>!t.parent)).sort(((t,e)=>t.order-e.order))},childViews(){return this.views.filter((t=>!!t.parent)).reduce(((t,e)=>(t[e.parent]=[...t[e.parent]||[],e],t[e.parent].sort(((t,e)=>t.order-e.order)),t)),{})}},watch:{currentView(t,e){(null==t?void 0:t.id)!==(null==e?void 0:e.id)&&(this.Navigation.setActive(t),Q.debug("Navigation changed",{id:t.id,view:t}),this.showView(t,e))}},beforeMount(){this.currentView&&(Q.debug("Navigation mounted. Showing requested view",{view:this.currentView}),this.showView(this.currentView)),(0,G.Ld)("files:legacy-navigation:changed",this.onLegacyNavigationChanged),(0,G.Ld)("files:legacy-view:initialized",(()=>{Q.debug("Legacy view initialized",{...this.currentView}),this.showView(this.currentView)}))},methods:{showView(t,e){var n,i,o,s,r;if(null===(n=window)||void 0===n||null===(i=n.OCA)||void 0===i||null===(o=i.Files)||void 0===o||null===(s=o.Sidebar)||void 0===s||null===(r=s.close)||void 0===r||r.call(s),null!=t&&t.legacy){const e=document.querySelector("#app-content #app-content-"+this.currentView.id+".viewcontainer");document.querySelectorAll("#app-content .viewcontainer").forEach((t=>{t.classList.add("hidden")})),e.classList.remove("hidden");const{dir:n="/"}=OC.Util.History.parseUrlQuery(),i={itemId:t.id,dir:n};Q.debug("Triggering legacy navigation event",i),window.jQuery(e).trigger(new window.jQuery.Event("show",i)),window.jQuery(e).trigger(new window.jQuery.Event("urlChanged",i))}this.Navigation.setActive(t),function(t){const e=document.getElementById("page-heading-level-1");e&&(e.textContent=t)}(t.name),(0,G.j8)("files:navigation:changed",t)},onLegacyNavigationChanged(){let{id:t}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{id:"files"};const e=this.Navigation.views.find((e=>e.id===t));e&&e.legacy&&e.id!==this.currentView.id&&(this.$router.replace({...this.$route,params:{view:e.id}}),this.Navigation.setActive(e),this.showView(e))},onToggleExpand(t){const e=this.isExpanded(t);t.expanded=!e,this.viewConfigStore.update(t.id,"expanded",!e)},isExpanded(t){var e;return"boolean"==typeof(null===(e=this.viewConfigStore.getConfig(t.id))||void 0===e?void 0:e.expanded)?!0===this.viewConfigStore.getConfig(t.id).expanded:!0===t.expanded},generateToNavigation(t){if(t.params){const{dir:e,fileid:n}=t.params;return{name:"filelist",params:t.params,query:{dir:e,fileid:n}}}return{name:"filelist",params:{view:t.id}}},openSettings(){this.settingsOpened=!0},onSettingsClose(){this.settingsOpened=!1},t:r.Iu}},Mt=jt;var $t=i(41675),Wt={};Wt.styleTagTransform=B(),Wt.setAttributes=N(),Wt.insert=S().bind(null,"head"),Wt.domAPI=_(),Wt.insertStyleElement=E(),b()($t.Z,Wt),$t.Z&&$t.Z.locals&&$t.Z.locals;const Gt=(0,T.Z)(Mt,(function(){var t=this,e=t._self._c;return e("NcAppNavigation",{attrs:{"data-cy-files-navigation":""},scopedSlots:t._u([{key:"list",fn:function(){return t._l(t.parentViews,(function(n){return e("NcAppNavigationItem",{key:n.id,attrs:{"allow-collapse":!0,"data-cy-files-navigation-item":n.id,icon:n.iconClass,open:t.isExpanded(n),pinned:n.sticky,title:n.name,to:t.generateToNavigation(n)},on:{"update:open":function(e){return t.onToggleExpand(n)}}},[n.icon?e("NcIconSvgWrapper",{attrs:{slot:"icon",svg:n.icon},slot:"icon"}):t._e(),t._v(" "),t._l(t.childViews[n.id],(function(i){return e("NcAppNavigationItem",{key:i.id,attrs:{"data-cy-files-navigation-item":i.id,exact:!0,icon:i.iconClass,title:i.name,to:t.generateToNavigation(i)}},[n.icon?e("NcIconSvgWrapper",{attrs:{slot:"icon",svg:n.icon},slot:"icon"}):t._e()],1)}))],2)}))},proxy:!0},{key:"footer",fn:function(){return[e("ul",{staticClass:"app-navigation-entry__settings"},[e("NavigationQuota"),t._v(" "),e("NcAppNavigationItem",{attrs:{"aria-label":t.t("files","Open the files app settings"),title:t.t("files","Files settings"),"data-cy-files-navigation-settings-button":""},on:{click:function(e){return e.preventDefault(),e.stopPropagation(),t.openSettings.apply(null,arguments)}}},[e("Cog",{attrs:{slot:"icon",size:20},slot:"icon"})],1)],1)]},proxy:!0}])},[t._v(" "),t._v(" "),e("SettingsModal",{attrs:{open:t.settingsOpened,"data-cy-files-navigation-settings":""},on:{close:t.onSettingsClose}})],1)}),[],!1,null,"508e08a4",null).exports;var Ht=i(23664),Kt=i(69680),Qt=i.n(Kt),Yt=i(10861),Jt=i.n(Yt),Xt=i(64192),te=i.n(Xt),ee=i(33581);const ne=function(){const t=(0,tt.Q_)("files",{state:()=>({files:{},roots:{}}),getters:{getNode:t=>e=>t.files[e],getNodes:t=>e=>e.map((e=>t.files[e])).filter(Boolean),getRoot:t=>e=>t.roots[e]},actions:{updateNodes(t){const e=t.reduce(((t,e)=>e.attributes.fileid?(t[e.attributes.fileid]=e,t):(Q.warn("Trying to update/set a node without fileid",e),t)),{});u.default.set(this,"files",{...this.files,...e})},deleteNodes(t){t.forEach((t=>{t.fileid&&u.default.delete(this.files,t.fileid)}))},setRoot(t){let{service:e,root:n}=t;u.default.set(this.roots,e,n)},onDeletedNode(t){this.deleteNodes([t])}}})(...arguments);return t._initialized||((0,G.Ld)("files:node:deleted",t.onDeletedNode),t._initialized=!0),t},ie=function(){const t=(0,tt.Q_)("paths",{state:()=>({}),getters:{getPath:t=>(e,n)=>{if(t[e])return t[e][n]}},actions:{addPath(t){this[t.service]||u.default.set(this,t.service,{}),u.default.set(this[t.service],t.path,t.fileid)}}})(...arguments);return t._initialized||(t._initialized=!0),t},oe=(0,tt.Q_)("selection",{state:()=>({selected:[],lastSelection:[],lastSelectedIndex:null}),actions:{set(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];u.default.set(this,"selected",t)},setLastIndex(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;u.default.set(this,"lastSelection",t?this.selected:[]),u.default.set(this,"lastSelectedIndex",t)},reset(){u.default.set(this,"selected",[]),u.default.set(this,"lastSelection",[]),u.default.set(this,"lastSelectedIndex",null)}}});var se=i(15764),re=i(64412),ae=i.n(re),le=i(44706),ce=i.n(le);const de=u.default.extend({name:"BreadCrumbs",components:{Home:se.Z,NcBreadcrumbs:ce(),NcBreadcrumb:ae()},props:{path:{type:String,default:"/"}},setup:()=>({filesStore:ne(),pathsStore:ie()}),computed:{currentView(){return this.$navigation.active},dirs(){var t;return["/",...this.path.split("/").filter(Boolean).map((t="/",e=>t+="".concat(e,"/"))).map((t=>t.replace(/^(.+)\/$/,"$1")))]},sections(){return this.dirs.map((t=>{const e={...this.$route,query:{dir:t}};return{dir:t,exact:!0,name:this.getDirDisplayName(t),to:e}}))}},methods:{getNodeFromId(t){return this.filesStore.getNode(t)},getFileIdFromPath(t){var e;return this.pathsStore.getPath(null===(e=this.currentView)||void 0===e?void 0:e.id,t)},getDirDisplayName(e){var n;if("/"===e)return t("files","Home");const i=this.getFileIdFromPath(e),o=this.getNodeFromId(i);return(null==o||null===(n=o.attributes)||void 0===n?void 0:n.displayName)||(0,p.basename)(e)},onClick(t){var e;(null==t||null===(e=t.query)||void 0===e?void 0:e.dir)===this.$route.query.dir&&this.$emit("reload")},ariaLabel(e){var n,i;return(null==e||null===(n=e.to)||void 0===n||null===(i=n.query)||void 0===i?void 0:i.dir)===this.$route.query.dir?t("files","Reload current directory"):t("files",'Go to the "{dir}" directory',e)}}});var ue=i(39959),pe={};pe.styleTagTransform=B(),pe.setAttributes=N(),pe.insert=S().bind(null,"head"),pe.domAPI=_(),pe.insertStyleElement=E(),b()(ue.Z,pe),ue.Z&&ue.Z.locals&&ue.Z.locals;const he=(0,T.Z)(de,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("NcBreadcrumbs",{attrs:{"data-cy-files-content-breadcrumbs":""}},t._l(t.sections,(function(n,i){return e("NcBreadcrumb",t._b({key:n.dir,attrs:{"aria-label":t.ariaLabel(n),title:t.ariaLabel(n)},nativeOn:{click:function(e){return t.onClick(n.to)}},scopedSlots:t._u([0===i?{key:"icon",fn:function(){return[e("Home",{attrs:{size:20}})]},proxy:!0}:null],null,!0)},"NcBreadcrumb",n,!1))})),1)}),[],!1,null,"68b3b20b",null).exports;var fe=i(35212),Ae=i(20296),ve=i(74139),me=i(3443),ge=i.n(me),we=i(79855),Ce=i(34829),be=i(45400),ye=i.n(be),_e=i(12945),xe=i.n(_e);const Se=(0,tt.Q_)("actionsmenu",{state:()=>({opened:null})}),ke={name:"CustomElementRender",props:{source:{type:Object,required:!0},currentView:{type:Object,required:!0},render:{type:Function,required:!0}},computed:{element(){return this.render(this.source,this.currentView)}},watch:{element(){this.$el.replaceWith(this.element),this.$el=this.element}},mounted(){this.$el.replaceWith(this.element),this.$el=this.element}},Ne=(0,T.Z)(ke,(function(){return(0,this._self._c)("span")}),[],!1,null,null,null).exports;var Ie=i(27856);const Ee={name:"CustomSvgIconRender",props:{svg:{type:String,required:!0}},watch:{svg(){this.$el.innerHTML=(0,Ie.sanitize)(this.svg)}},mounted(){this.$el.innerHTML=(0,Ie.sanitize)(this.svg)}};var Fe=i(61959),Be={};Be.styleTagTransform=B(),Be.setAttributes=N(),Be.insert=S().bind(null,"head"),Be.domAPI=_(),Be.insertStyleElement=E(),b()(Fe.Z,Be),Fe.Z&&Fe.Z.locals&&Fe.Z.locals;const Pe=(0,T.Z)(Ee,(function(){return(0,this._self._c)("span",{staticClass:"custom-svg-icon"})}),[],!1,null,"93e9b2f4",null).exports,ze=Y(),Te=u.default.extend({name:"FileEntry",components:{CustomElementRender:Ne,CustomSvgIconRender:Pe,FileIcon:we.Z,FolderIcon:Ce.default,Fragment:ve.H,NcActionButton:ye(),NcActions:xe(),NcCheckboxRadioSwitch:Ft(),NcLoadingIcon:te()},props:{active:{type:Boolean,default:!1},isSizeAvailable:{type:Boolean,default:!1},source:{type:Object,required:!0},index:{type:Number,required:!0},nodes:{type:Array,required:!0},filesListWidth:{type:Number,default:0}},setup(){const t=Se(),e=ne(),n=function(){const t=(0,tt.Q_)("keyboard",{state:()=>({altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1}),actions:{onEvent(t){t||(t=window.event),u.default.set(this,"altKey",!!t.altKey),u.default.set(this,"ctrlKey",!!t.ctrlKey),u.default.set(this,"metaKey",!!t.metaKey),u.default.set(this,"shiftKey",!!t.shiftKey)}}})(...arguments);return t._initialized||(window.addEventListener("keydown",t.onEvent),window.addEventListener("keyup",t.onEvent),window.addEventListener("mousemove",t.onEvent),t._initialized=!0),t}();return{actionsMenuStore:t,filesStore:e,keyboardStore:n,selectionStore:oe(),userConfigStore:Vt()}},data:()=>({backgroundFailed:!1,backgroundImage:"",loading:""}),computed:{userConfig(){return this.userConfigStore.userConfig},currentView(){return this.$navigation.active},columns(){var t;return this.filesListWidth<512?[]:(null===(t=this.currentView)||void 0===t?void 0:t.columns)||[]},dir(){var t,e;return((null===(t=this.$route)||void 0===t||null===(e=t.query)||void 0===e?void 0:e.dir)||"/").replace(/^(.+)\/$/,"$1")},fileid(){var t,e,n;return null===(t=this.source)||void 0===t||null===(e=t.fileid)||void 0===e||null===(n=e.toString)||void 0===n?void 0:n.call(e)},displayName(){return this.source.attributes.displayName||this.source.basename},size(){const t=parseInt(this.source.size,10)||0;return"number"!=typeof t||t<0?this.t("files","Pending"):(0,H.sS)(t,!0)},sizeOpacity(){const t=parseInt(this.source.size,10)||0;return!t||t<0?1:.7+(1-.7)*Math.pow(this.source.size/10485760,2)},linkTo(){if("folder"===this.source.type){const t={...this.$route,query:{dir:(0,p.join)(this.dir,this.source.basename)}};return{is:"router-link",title:this.t("files","Open folder {name}",{name:this.displayName}),to:t}}return{href:this.source.source,title:this.t("files","Download file {name}",{name:this.displayName})}},selectedFiles(){return this.selectionStore.selected},isSelected(){var t,e,n;return this.selectedFiles.includes(null===(t=this.source)||void 0===t||null===(e=t.fileid)||void 0===e||null===(n=e.toString)||void 0===n?void 0:n.call(e))},cropPreviews(){return this.userConfig.crop_image_previews},previewUrl(){try{const t=new URL(window.location.origin+this.source.attributes.previewUrl);return t.searchParams.set("x","32"),t.searchParams.set("y","32"),t.searchParams.set("a",!0===this.cropPreviews?"1":"0"),t.href}catch(t){return null}},mimeIconUrl(){var t,e,n;const i=this.source.mime||"application/octet-stream",o=null===(t=window.OC)||void 0===t||null===(e=t.MimeType)||void 0===e||null===(n=e.getIconUrl)||void 0===n?void 0:n.call(e,i);return o?"url(".concat(o,")"):""},enabledActions(){return ze.filter((t=>!t.enabled||t.enabled([this.source],this.currentView))).sort(((t,e)=>(t.order||0)-(e.order||0)))},enabledInlineActions(){return this.filesListWidth<768?[]:this.enabledActions.filter((t=>{var e;return null==t||null===(e=t.inline)||void 0===e?void 0:e.call(t,this.source,this.currentView)}))},enabledMenuActions(){return this.filesListWidth<768?this.enabledActions:[...this.enabledInlineActions,...this.enabledActions.filter((t=>!t.inline))]},uniqueId(){return this.hashCode(this.source.source)},openedMenu:{get(){return this.actionsMenuStore.opened===this.uniqueId},set(t){this.actionsMenuStore.opened=t?this.uniqueId:null}}},watch:{active(t,e){if(!1===t&&!0===e)return this.resetState(),void(this.$el.parentNode.style.display="none");this.$el.parentNode.style.display=""},previewUrl(){this.clearImg(),this.debounceIfNotCached()}},mounted(){var t,e;this.debounceGetPreview=(0,Ae.debounce)((function(){this.fetchAndApplyPreview()}),150,!1),this.debounceIfNotCached(),null===(t=this.$el.parentNode)||void 0===t||null===(e=t.addEventListener)||void 0===e||e.call(t,"contextmenu",this.onRightClick)},beforeDestroy(){this.resetState()},methods:{async debounceIfNotCached(){var t;if(this.previewUrl)return await(t=this.previewUrl,caches.open("previews").then((function(e){return e.match(t).then((function(t){return!!t}))})))?(this.backgroundImage="url(".concat(this.previewUrl,")"),void(this.backgroundFailed=!1)):void this.debounceGetPreview()},fetchAndApplyPreview(){this.previewUrl&&(this.previewPromise&&this.clearImg(),this.previewPromise=new(ge())(((t,e,n)=>{const i=new Image;i.fetchpriority=this.active?"high":"auto",i.onload=()=>{this.backgroundImage="url(".concat(this.previewUrl,")"),this.backgroundFailed=!1,t(i)},i.onerror=()=>{this.backgroundFailed=!0,e(i)},i.src=this.previewUrl,n((()=>{i.onerror=null,i.onload=null,i.src=""}))})))},resetState(){this.loading="",this.clearImg(),this.openedMenu=!1},clearImg(){this.backgroundImage="",this.backgroundFailed=!1,this.previewPromise&&(this.previewPromise.cancel(),this.previewPromise=null)},hashCode(t){let e=0;for(let n=0,i=t.length;n<i;n++)e=(e<<5)-e+t.charCodeAt(n),e|=0;return e},async onActionClick(t){const e=t.displayName([this.source],this.currentView);try{if(this.loading=t.id,u.default.set(this.source,"_loading",!0),await t.exec(this.source,this.currentView))return void(0,h.s$)(this.t("files",'"{displayName}" action executed successfully',{displayName:e}));(0,h.x2)(this.t("files",'"{displayName}" action failed',{displayName:e}))}catch(n){Q.error("Error while executing action",{action:t,e:n}),(0,h.x2)(this.t("files",'"{displayName}" action failed',{displayName:e}))}finally{this.loading="",u.default.set(this.source,"_loading",!1)}},onSelectionChange(t){var e;const n=this.index,i=this.selectionStore.lastSelectedIndex;if(null!==(e=this.keyboardStore)&&void 0!==e&&e.shiftKey&&null!==i){const t=this.selectedFiles.includes(this.fileid),e=Math.min(n,i),o=Math.max(i,n),s=this.selectionStore.lastSelection,r=this.nodes.map((t=>{var e,n;return null===(e=t.fileid)||void 0===e||null===(n=e.toString)||void 0===n?void 0:n.call(e)})).slice(e,o+1),a=[...s,...r].filter((e=>!t||e!==this.fileid));return Q.debug("Shift key pressed, selecting all files in between",{start:e,end:o,filesToSelect:r,isAlreadySelected:t}),void this.selectionStore.set(a)}Q.debug("Updating selection",{selection:t}),this.selectionStore.set(t),this.selectionStore.setLastIndex(n)},onRightClick(t){if(this.openedMenu)return;const e=this.selectedFiles.length>1;this.actionsMenuStore.opened=this.isSelected&&e?"global":this.uniqueId,t.preventDefault(),t.stopPropagation()},t:r.Iu,formatFileSize:H.sS}}),Le=Te;var Ue=i(75934),Ve={};Ve.styleTagTransform=B(),Ve.setAttributes=N(),Ve.insert=S().bind(null,"head"),Ve.domAPI=_(),Ve.insertStyleElement=E(),b()(Ue.Z,Ve),Ue.Z&&Ue.Z.locals&&Ue.Z.locals;var De=i(96669),Oe={};Oe.styleTagTransform=B(),Oe.setAttributes=N(),Oe.insert=S().bind(null,"head"),Oe.domAPI=_(),Oe.insertStyleElement=E(),b()(De.Z,Oe),De.Z&&De.Z.locals&&De.Z.locals;var Ze=(0,T.Z)(Le,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("Fragment",[e("td",{staticClass:"files-list__row-checkbox"},[t.active?e("NcCheckboxRadioSwitch",{attrs:{"aria-label":t.t("files","Select the row for {displayName}",{displayName:t.displayName}),checked:t.selectedFiles,value:t.fileid,name:"selectedFiles"},on:{"update:checked":t.onSelectionChange}}):t._e()],1),t._v(" "),e("td",{staticClass:"files-list__row-name"},[e("a",t._b({ref:"name"},"a",t.linkTo,!1),[e("span",{staticClass:"files-list__row-icon"},["folder"===t.source.type?e("FolderIcon"):t.previewUrl&&!t.backgroundFailed?e("span",{ref:"previewImg",staticClass:"files-list__row-icon-preview",style:{backgroundImage:t.backgroundImage}}):t.mimeIconUrl?e("span",{staticClass:"files-list__row-icon-preview files-list__row-icon-preview--mime",style:{backgroundImage:t.mimeIconUrl}}):e("FileIcon")],1),t._v(" "),e("span",{staticClass:"files-list__row-name-text"},[t._v(t._s(t.displayName))])])]),t._v(" "),e("td",{staticClass:"files-list__row-actions",class:"files-list__row-actions-".concat(t.uniqueId)},[t.active?e("NcActions",{ref:"actionsMenu",attrs:{disabled:t.source._loading,"force-title":!0,inline:t.enabledInlineActions.length,open:t.openedMenu},on:{"update:open":function(e){t.openedMenu=e}}},t._l(t.enabledMenuActions,(function(n){return e("NcActionButton",{key:n.id,class:"files-list__row-action-"+n.id,on:{click:function(e){return t.onActionClick(n)}},scopedSlots:t._u([{key:"icon",fn:function(){return[t.loading===n.id?e("NcLoadingIcon",{attrs:{size:18}}):e("CustomSvgIconRender",{attrs:{svg:n.iconSvgInline([t.source],t.currentView)}})]},proxy:!0}],null,!0)},[t._v("\n\t\t\t\t"+t._s(n.displayName([t.source],t.currentView))+"\n\t\t\t")])})),1):t._e()],1),t._v(" "),t.isSizeAvailable?e("td",{staticClass:"files-list__row-size",style:{opacity:t.sizeOpacity}},[e("span",[t._v(t._s(t.size))])]):t._e(),t._v(" "),t._l(t.columns,(function(n){var i;return e("td",{key:n.id,staticClass:"files-list__row-column-custom",class:"files-list__row-".concat(null===(i=t.currentView)||void 0===i?void 0:i.id,"-").concat(n.id)},[t.active?e("CustomElementRender",{attrs:{"current-view":t.currentView,render:n.render,source:t.source}}):t._e()],1)}))],2)}),[],!1,null,"47057834",null);const Re=Ze.exports,qe=u.default.extend({name:"FilesListFooter",components:{},props:{isSizeAvailable:{type:Boolean,default:!1},nodes:{type:Array,required:!0},summary:{type:String,default:""},filesListWidth:{type:Number,default:0}},setup(){const t=ie();return{filesStore:ne(),pathsStore:t}},computed:{currentView(){return this.$navigation.active},dir(){var t,e;return((null===(t=this.$route)||void 0===t||null===(e=t.query)||void 0===e?void 0:e.dir)||"/").replace(/^(.+)\/$/,"$1")},currentFolder(){var t;if(null===(t=this.currentView)||void 0===t||!t.id)return;if("/"===this.dir)return this.filesStore.getRoot(this.currentView.id);const e=this.pathsStore.getPath(this.currentView.id,this.dir);return this.filesStore.getNode(e)},columns(){var t;return this.filesListWidth<512?[]:(null===(t=this.currentView)||void 0===t?void 0:t.columns)||[]},totalSize(){var t;return null!==(t=this.currentFolder)&&void 0!==t&&t.size?(0,H.sS)(this.currentFolder.size,!0):(0,H.sS)(this.nodes.reduce(((t,e)=>t+e.size||0),0),!0)}},methods:{classForColumn(t){return{"files-list__row-column-custom":!0,["files-list__row-".concat(this.currentView.id,"-").concat(t.id)]:!0}},t:r.Iu}});var je=i(97105),Me={};Me.styleTagTransform=B(),Me.setAttributes=N(),Me.insert=S().bind(null,"head"),Me.domAPI=_(),Me.insertStyleElement=E(),b()(je.Z,Me),je.Z&&je.Z.locals&&je.Z.locals;const $e=(0,T.Z)(qe,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("tr",[e("th",{staticClass:"files-list__row-checkbox"},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("files","Total rows summary")))])]),t._v(" "),e("td",{staticClass:"files-list__row-name"},[e("span",{staticClass:"files-list__row-icon"}),t._v(" "),e("span",[t._v(t._s(t.summary))])]),t._v(" "),e("td",{staticClass:"files-list__row-actions"}),t._v(" "),t.isSizeAvailable?e("td",{staticClass:"files-list__column files-list__row-size"},[e("span",[t._v(t._s(t.totalSize))])]):t._e(),t._v(" "),t._l(t.columns,(function(n){var i;return e("th",{key:n.id,class:t.classForColumn(n)},[e("span",[t._v(t._s(null===(i=n.summary)||void 0===i?void 0:i.call(n,t.nodes,t.currentView)))])])}))],2)}),[],!1,null,"e6a083be",null).exports,We=u.default.extend({data:()=>({filesListWidth:null}),created(){const t=document.querySelector("#app-content-vue");this.$resizeObserver=new ResizeObserver((e=>{e.length>0&&e[0].target===t&&(this.filesListWidth=e[0].contentRect.width)})),this.$resizeObserver.observe(t)},beforeDestroy(){this.$resizeObserver.disconnect()}}),Ge=Y(),He=u.default.extend({name:"FilesListHeaderActions",components:{CustomSvgIconRender:Pe,NcActions:xe(),NcActionButton:ye(),NcLoadingIcon:te()},mixins:[We],props:{currentView:{type:Object,required:!0},selectedNodes:{type:Array,default:()=>[]}},setup:()=>({actionsMenuStore:Se(),filesStore:ne(),selectionStore:oe()}),data:()=>({loading:null}),computed:{enabledActions(){return Ge.filter((t=>t.execBatch)).filter((t=>!t.enabled||t.enabled(this.nodes,this.currentView))).sort(((t,e)=>(t.order||0)-(e.order||0)))},nodes(){return this.selectedNodes.map((t=>this.getNode(t))).filter((t=>t))},areSomeNodesLoading(){return this.nodes.some((t=>t._loading))},openedMenu:{get(){return"global"===this.actionsMenuStore.opened},set(t){this.actionsMenuStore.opened=t?"global":null}},inlineActions(){return this.filesListWidth<512?0:this.filesListWidth<768?1:this.filesListWidth<1024?2:3}},methods:{getNode(t){return this.filesStore.getNode(t)},async onActionClick(t){const e=t.displayName(this.nodes,this.currentView),n=this.selectedNodes;try{this.loading=t.id,this.nodes.forEach((t=>{u.default.set(t,"_loading",!0)}));const i=await t.execBatch(this.nodes,this.currentView);if(i.some((t=>!0!==t))){const t=n.filter(((t,e)=>!0!==i[e]));return this.selectionStore.set(t),void(0,h.x2)(this.t("files",'"{displayName}" failed on some elements ',{displayName:e}))}(0,h.s$)(this.t("files",'"{displayName}" batch action executed successfully',{displayName:e})),this.selectionStore.reset()}catch(n){Q.error("Error while executing action",{action:t,e:n}),(0,h.x2)(this.t("files",'"{displayName}" action failed',{displayName:e}))}finally{this.loading=null,this.nodes.forEach((t=>{u.default.set(t,"_loading",!1)}))}},t:r.Iu}}),Ke=He;var Qe=i(19505),Ye={};Ye.styleTagTransform=B(),Ye.setAttributes=N(),Ye.insert=S().bind(null,"head"),Ye.domAPI=_(),Ye.insertStyleElement=E(),b()(Qe.Z,Ye),Qe.Z&&Qe.Z.locals&&Qe.Z.locals;var Je=(0,T.Z)(Ke,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("th",{staticClass:"files-list__column files-list__row-actions-batch",attrs:{colspan:"2"}},[e("NcActions",{ref:"actionsMenu",attrs:{disabled:!!t.loading||t.areSomeNodesLoading,"force-title":!0,inline:t.inlineActions,"menu-title":t.inlineActions<=1?t.t("files","Actions"):null,open:t.openedMenu},on:{"update:open":function(e){t.openedMenu=e}}},t._l(t.enabledActions,(function(n){return e("NcActionButton",{key:n.id,class:"files-list__row-actions-batch-"+n.id,on:{click:function(e){return t.onActionClick(n)}},scopedSlots:t._u([{key:"icon",fn:function(){return[t.loading===n.id?e("NcLoadingIcon",{attrs:{size:18}}):e("CustomSvgIconRender",{attrs:{svg:n.iconSvgInline(t.nodes,t.currentView)}})]},proxy:!0}],null,!0)},[t._v("\n\t\t\t"+t._s(n.displayName(t.nodes,t.currentView))+"\n\t\t")])})),1)],1)}),[],!1,null,"9d92da06",null);const Xe=Je.exports;var tn=i(20404),en=i(23873);const nn=u.default.extend({computed:{...(0,tt.rn)(vt,["getConfig","setSortingBy","toggleSortingDirection"]),currentView(){return this.$navigation.active},sortingMode(){var t,e;return(null===(t=this.getConfig(this.currentView.id))||void 0===t?void 0:t.sorting_mode)||(null===(e=this.currentView)||void 0===e?void 0:e.defaultSortKey)||"basename"},isAscSorting(){var t;return"asc"===(null===(t=this.getConfig(this.currentView.id))||void 0===t?void 0:t.sorting_direction)}},methods:{toggleSortBy(t){this.sortingMode!==t?this.setSortingBy(t,this.currentView.id):this.toggleSortingDirection(this.currentView.id)}}}),on=u.default.extend({name:"FilesListHeaderButton",components:{MenuDown:tn.Z,MenuUp:en.Z,NcButton:Jt()},mixins:[nn],props:{name:{type:String,required:!0},mode:{type:String,required:!0}},methods:{sortAriaLabel(t){const e=this.isAscSorting?this.t("files","ascending"):this.t("files","descending");return this.t("files","Sort list by {column} ({direction})",{column:t,direction:e})},t:r.Iu}});var sn=i(29252),rn={};rn.styleTagTransform=B(),rn.setAttributes=N(),rn.insert=S().bind(null,"head"),rn.domAPI=_(),rn.insertStyleElement=E(),b()(sn.Z,rn),sn.Z&&sn.Z.locals&&sn.Z.locals;const an=(0,T.Z)(on,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("NcButton",{staticClass:"files-list__column-sort-button",class:{"files-list__column-sort-button--active":t.sortingMode===t.mode},attrs:{"aria-label":t.sortAriaLabel(t.name),type:"tertiary"},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.toggleSortBy(t.mode)}}},[t.sortingMode!==t.mode||t.isAscSorting?e("MenuUp",{attrs:{slot:"icon"},slot:"icon"}):e("MenuDown",{attrs:{slot:"icon"},slot:"icon"}),t._v("\n\t"+t._s(t.name)+"\n")],1)}),[],!1,null,null,null).exports,ln=u.default.extend({name:"FilesListHeader",components:{FilesListHeaderButton:an,NcCheckboxRadioSwitch:Ft(),FilesListHeaderActions:Xe},mixins:[nn],props:{isSizeAvailable:{type:Boolean,default:!1},nodes:{type:Array,required:!0},filesListWidth:{type:Number,default:0}},setup:()=>({filesStore:ne(),selectionStore:oe()}),computed:{currentView(){return this.$navigation.active},columns(){var t;return this.filesListWidth<512?[]:(null===(t=this.currentView)||void 0===t?void 0:t.columns)||[]},dir(){var t,e;return((null===(t=this.$route)||void 0===t||null===(e=t.query)||void 0===e?void 0:e.dir)||"/").replace(/^(.+)\/$/,"$1")},selectAllBind(){const t=this.isNoneSelected||this.isSomeSelected?this.t("files","Select all"):this.t("files","Unselect all");return{"aria-label":t,checked:this.isAllSelected,indeterminate:this.isSomeSelected,title:t}},selectedNodes(){return this.selectionStore.selected},isAllSelected(){return this.selectedNodes.length===this.nodes.length},isNoneSelected(){return 0===this.selectedNodes.length},isSomeSelected(){return!this.isAllSelected&&!this.isNoneSelected}},methods:{classForColumn(t){return{"files-list__column":!0,"files-list__column--sortable":!!t.sort,"files-list__row-column-custom":!0,["files-list__row-".concat(this.currentView.id,"-").concat(t.id)]:!0}},onToggleAll(t){if(t){const t=this.nodes.map((t=>t.attributes.fileid.toString()));Q.debug("Added all nodes to selection",{selection:t}),this.selectionStore.setLastIndex(null),this.selectionStore.set(t)}else Q.debug("Cleared selection"),this.selectionStore.reset()},t:r.Iu}});var cn=i(8607),dn={};dn.styleTagTransform=B(),dn.setAttributes=N(),dn.insert=S().bind(null,"head"),dn.domAPI=_(),dn.insertStyleElement=E(),b()(cn.Z,dn),cn.Z&&cn.Z.locals&&cn.Z.locals;const un=(0,T.Z)(ln,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("tr",[e("th",{staticClass:"files-list__column files-list__row-checkbox"},[e("NcCheckboxRadioSwitch",t._b({on:{"update:checked":t.onToggleAll}},"NcCheckboxRadioSwitch",t.selectAllBind,!1))],1),t._v(" "),t.isNoneSelected?[e("th",{staticClass:"files-list__column files-list__row-name files-list__column--sortable",on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.toggleSortBy("basename")}}},[e("span",{staticClass:"files-list__row-icon"}),t._v(" "),e("FilesListHeaderButton",{attrs:{name:t.t("files","Name"),mode:"basename"}})],1),t._v(" "),e("th",{staticClass:"files-list__row-actions"}),t._v(" "),t.isSizeAvailable?e("th",{staticClass:"files-list__column files-list__row-size",class:{"files-list__column--sortable":t.isSizeAvailable}},[e("FilesListHeaderButton",{attrs:{name:t.t("files","Size"),mode:"size"}})],1):t._e(),t._v(" "),t._l(t.columns,(function(n){return e("th",{key:n.id,class:t.classForColumn(n)},[n.sort?e("FilesListHeaderButton",{attrs:{name:n.title,mode:n.id}}):e("span",[t._v("\n\t\t\t\t"+t._s(n.title)+"\n\t\t\t")])],1)}))]:e("FilesListHeaderActions",{attrs:{"current-view":t.currentView,"selected-nodes":t.selectedNodes}})],2)}),[],!1,null,"53698ce8",null).exports,pn=u.default.extend({name:"FilesListVirtual",components:{RecycleScroller:fe.EK,FileEntry:Re,FilesListHeader:un,FilesListFooter:$e},mixins:[We],props:{currentView:{type:Object,required:!0},nodes:{type:Array,required:!0}},data:()=>({FileEntry:Re}),computed:{files(){return this.nodes.filter((t=>"file"===t.type))},summaryFile(){const t=this.files.length;return(0,r.uN)("files","{count} file","{count} files",t,{count:t})},summaryFolder(){const t=this.nodes.length-this.files.length;return(0,r.uN)("files","{count} folder","{count} folders",t,{count:t})},summary(){return(0,r.Iu)("files","{summaryFile} and {summaryFolder}",this)},isSizeAvailable(){return!(this.filesListWidth<768)&&this.nodes.some((t=>void 0!==t.attributes.size))}},mounted(){const t=this.$el.querySelectorAll(".vue-recycle-scroller__slot");t[0].setAttribute("role","thead"),t[1].setAttribute("role","tfoot")},methods:{getFileId:t=>t.attributes.fileid,t:r.Iu}});var hn=i(525),fn={};fn.styleTagTransform=B(),fn.setAttributes=N(),fn.insert=S().bind(null,"head"),fn.domAPI=_(),fn.insertStyleElement=E(),b()(hn.Z,fn),hn.Z&&hn.Z.locals&&hn.Z.locals;const An=(0,T.Z)(pn,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("RecycleScroller",{ref:"recycleScroller",staticClass:"files-list",attrs:{"key-field":"source",items:t.nodes,"item-size":55,"table-mode":!0,"item-class":"files-list__row","item-tag":"tr","list-class":"files-list__body","list-tag":"tbody",role:"table"},scopedSlots:t._u([{key:"default",fn:function(n){let{item:i,active:o,index:s}=n;return[e("FileEntry",{attrs:{active:o,index:s,"is-size-available":t.isSizeAvailable,"files-list-width":t.filesListWidth,nodes:t.nodes,source:i}})]}},{key:"before",fn:function(){return[e("caption",{staticClass:"hidden-visually"},[t._v("\n\t\t\t"+t._s(t.currentView.caption||"")+"\n\t\t\t"+t._s(t.t("files","This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list."))+"\n\t\t")]),t._v(" "),e("FilesListHeader",{attrs:{"files-list-width":t.filesListWidth,"is-size-available":t.isSizeAvailable,nodes:t.nodes}})]},proxy:!0},{key:"after",fn:function(){return[e("FilesListFooter",{attrs:{"files-list-width":t.filesListWidth,"is-size-available":t.isSizeAvailable,nodes:t.nodes,summary:t.summary}})]},proxy:!0}])})}),[],!1,null,"07b86e54",null).exports,vn=u.default.extend({name:"FilesList",components:{BreadCrumbs:he,FilesListVirtual:An,NcAppContent:Qt(),NcButton:Jt(),NcEmptyContent:A(),NcLoadingIcon:te(),TrashCan:ee.Z},mixins:[nn],setup(){const t=ie();return{filesStore:ne(),pathsStore:t,selectionStore:oe(),viewConfigStore:vt()}},data:()=>({loading:!0,promise:null}),computed:{currentView(){return this.$navigation.active||this.$navigation.views.find((t=>"files"===t.id))},dir(){var t,e;return((null===(t=this.$route)||void 0===t||null===(e=t.query)||void 0===e?void 0:e.dir)||"/").replace(/^(.+)\/$/,"$1")},currentFolder(){var t;if(null===(t=this.currentView)||void 0===t||!t.id)return;if("/"===this.dir)return this.filesStore.getRoot(this.currentView.id);const e=this.pathsStore.getPath(this.currentView.id,this.dir);return this.filesStore.getNode(e)},dirContents(){var t;if(!this.currentView)return[];const e=this.currentView.columns.find((t=>t.id===this.sortingMode));if(null!=e&&e.sort&&"function"==typeof e.sort){var n;const t=[...((null===(n=this.currentFolder)||void 0===n?void 0:n._children)||[]).map(this.getNode).filter((t=>t))].sort(e.sort);return this.isAscSorting?t:t.reverse()}return(0,Ht.X)([...((null===(t=this.currentFolder)||void 0===t?void 0:t._children)||[]).map(this.getNode).filter((t=>t))],[..."basename"===this.sortingMode?[t=>"folder"!==t.type]:[],t=>t[this.sortingMode],t=>t.basename],this.isAscSorting?["asc","asc","asc"]:["desc","desc","desc"])},isEmptyDir(){return 0===this.dirContents.length},isRefreshing(){return void 0!==this.currentFolder&&!this.isEmptyDir&&this.loading},toPreviousDir(){const t=this.dir.split("/").slice(0,-1).join("/")||"/";return{...this.$route,query:{dir:t}}}},watch:{currentView(t,e){(null==t?void 0:t.id)!==(null==e?void 0:e.id)&&(Q.debug("View changed",{newView:t,oldView:e}),this.selectionStore.reset(),this.fetchContent())},dir(t,e){var n,i;Q.debug("Directory changed",{newDir:t,oldDir:e}),this.selectionStore.reset(),this.fetchContent(),null!==(n=this.$refs)&&void 0!==n&&null!==(i=n.filesListVirtual)&&void 0!==i&&i.$el&&(this.$refs.filesListVirtual.$el.scrollTop=0)}},methods:{async fetchContent(){var t,e;if(null!==(t=this.currentView)&&void 0!==t&&t.legacy)return;this.loading=!0;const n=this.dir,i=this.currentView;"function"==typeof(null===(e=this.promise)||void 0===e?void 0:e.cancel)&&(this.promise.cancel(),Q.debug("Cancelled previous ongoing fetch")),this.promise=i.getContents(n);try{const{folder:t,contents:e}=await this.promise;Q.debug("Fetched contents",{dir:n,folder:t,contents:e}),this.filesStore.updateNodes(e),t._children=e.map((t=>t.attributes.fileid)),"/"===n?this.filesStore.setRoot({service:i.id,root:t}):t.attributes.fileid?(this.filesStore.updateNodes([t]),this.pathsStore.addPath({service:i.id,fileid:t.attributes.fileid,path:n})):Q.error("Invalid root folder returned",{dir:n,folder:t,currentView:i}),e.filter((t=>"folder"===t.type)).forEach((t=>{this.pathsStore.addPath({service:i.id,fileid:t.attributes.fileid,path:(0,p.join)(n,t.basename)})}))}catch(t){Q.error("Error while fetching content",{error:t})}finally{this.loading=!1}},getNode(t){return this.filesStore.getNode(t)},t:r.Iu}});var mn=i(43010),gn={};gn.styleTagTransform=B(),gn.setAttributes=N(),gn.insert=S().bind(null,"head"),gn.domAPI=_(),gn.insertStyleElement=E(),b()(mn.Z,gn),mn.Z&&mn.Z.locals&&mn.Z.locals;const wn=(0,T.Z)(vn,(function(){var t,e,n=this,i=n._self._c;return n._self._setupProxy,i("NcAppContent",{directives:[{name:"show",rawName:"v-show",value:!(null!==(t=n.currentView)&&void 0!==t&&t.legacy),expression:"!currentView?.legacy"}],class:{"app-content--hidden":null===(e=n.currentView)||void 0===e?void 0:e.legacy},attrs:{"data-cy-files-content":""}},[i("div",{staticClass:"files-list__header"},[i("BreadCrumbs",{attrs:{path:n.dir},on:{reload:n.fetchContent}}),n._v(" "),n.isRefreshing?i("NcLoadingIcon",{staticClass:"files-list__refresh-icon"}):n._e()],1),n._v(" "),n.loading&&!n.isRefreshing?i("NcLoadingIcon",{staticClass:"files-list__loading-icon",attrs:{size:38,title:n.t("files","Loading current folder")}}):!n.loading&&n.isEmptyDir?i("NcEmptyContent",{attrs:{title:n.t("files","No files in here"),description:n.t("files","No files or folders have been deleted yet"),"data-cy-files-content-empty":""},scopedSlots:n._u([{key:"action",fn:function(){return["/"!==n.dir?i("NcButton",{attrs:{"aria-label":"t('files', 'Go to the previous folder')",type:"primary",to:n.toPreviousDir}},[n._v("\n\t\t\t\t"+n._s(n.t("files","Go back"))+"\n\t\t\t")]):n._e()]},proxy:!0},{key:"icon",fn:function(){return[i("TrashCan")]},proxy:!0}])}):i("FilesListVirtual",{ref:"filesListVirtual",attrs:{"current-view":n.currentView,nodes:n.dirContents}})],1)}),[],!1,null,"77548daf",null).exports;var Cn=i(25108);function bn(t,e,n){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var i=n.call(t,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var yn=i(78345),_n=i(17563);u.default.use(yn.ZP);const xn=new yn.ZP({mode:"history",base:(0,a.generateUrl)("/apps/files",""),linkActiveClass:"active",routes:[{path:"/",alias:"/files"},{path:"/:view/:fileid?",name:"filelist",props:!0}],stringifyQuery(t){const e=(0,_n.stringify)(t).replace(/%2F/gim,"/");return e?"?"+e:""}});var Sn,kn;window.OCA.Files=null!==(Sn=window.OCA.Files)&&void 0!==Sn?Sn:{},window.OCP.Files=null!==(kn=window.OCP.Files)&&void 0!==kn?kn:{},u.default.use(tt.og);const Nn=(0,tt.WB)(),In=new ot;Object.assign(window.OCP.Files,{Navigation:In}),u.default.prototype.$navigation=In;const En=new class{constructor(){var t,e,n;t=this,n=void 0,(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var i=n.call(t,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:String(e)}(e="_settings"))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,this._settings=[],Cn.debug("OCA.Files.Settings initialized")}register(t){return this._settings.filter((e=>e.name===t.name)).length>0?(Cn.error("A setting with the same name is already registered"),!1):(this._settings.push(t),!0)}get settings(){return this._settings}};Object.assign(window.OCA.Files,{Settings:En}),Object.assign(window.OCA.Files.Settings,{Setting:class{constructor(t,e){let{el:n,open:i,close:o}=e;bn(this,"_close",void 0),bn(this,"_el",void 0),bn(this,"_name",void 0),bn(this,"_open",void 0),this._name=t,this._el=n,this._open=i,this._close=o,"function"!=typeof this._open&&(this._open=()=>{}),"function"!=typeof this._close&&(this._close=()=>{})}get name(){return this._name}get el(){return this._el}get open(){return this._open}get close(){return this._close}}}),new(u.default.extend(Gt))({name:"FilesNavigationRoot",propsData:{Navigation:In},router:xn,pinia:Nn}).$mount("#app-navigation-files"),new(u.default.extend(wn))({name:"FilesListRoot",router:xn,pinia:Nn}).$mount("#app-content-vue"),function(){const t=Object.values((0,s.j)("files","navigation",{}));t.length>0&&(Q.debug("Legacy files views detected. Processing...",t),t.forEach((t=>{X(t),t.sublist&&t.sublist.forEach((e=>X({...e,parent:t.id})))})))}(),"serviceWorker"in navigator?window.addEventListener("load",(async()=>{try{const t=(0,a.generateUrl)("/apps/files/preview-service-worker.js",{},{noRewrite:!0}),e=await navigator.serviceWorker.register(t,{scope:"/"});Q.debug("SW registered: ",{registration:e})}catch(t){Q.error("SW registration failed: ",{error:t})}})):Q.debug("Service Worker is not enabled on this browser.")},39959:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".breadcrumb[data-v-68b3b20b]{flex:1 1 100% !important;width:100%}.breadcrumb[data-v-68b3b20b] a{cursor:pointer !important}","",{version:3,sources:["webpack://./apps/files/src/components/BreadCrumbs.vue"],names:[],mappings:"AACA,6BAEC,wBAAA,CACA,UAAA,CAEA,+BACC,yBAAA",sourcesContent:["\n.breadcrumb {\n\t// Take as much space as possible\n\tflex: 1 1 100% !important;\n\twidth: 100%;\n\n\t::v-deep a {\n\t\tcursor: pointer !important;\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},61959:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".custom-svg-icon[data-v-93e9b2f4]{display:flex;align-items:center;align-self:center;justify-content:center;justify-self:center;width:44px;height:44px;opacity:1}.custom-svg-icon[data-v-93e9b2f4] svg{height:22px;width:22px;fill:currentColor}","",{version:3,sources:["webpack://./apps/files/src/components/CustomSvgIconRender.vue"],names:[],mappings:"AACA,kCACC,YAAA,CACA,kBAAA,CACA,iBAAA,CACA,sBAAA,CACA,mBAAA,CACA,UAAA,CACA,WAAA,CACA,SAAA,CAEA,sCAGC,WAAA,CACA,UAAA,CACA,iBAAA",sourcesContent:["\n.custom-svg-icon {\n\tdisplay: flex;\n\talign-items: center;\n\talign-self: center;\n\tjustify-content: center;\n\tjustify-self: center;\n\twidth: 44px;\n\theight: 44px;\n\topacity: 1;\n\n\t::v-deep svg {\n\t\t// mdi icons have a size of 24px\n\t\t// 22px results in roughly 16px inner size\n\t\theight: 22px;\n\t\twidth: 22px;\n\t\tfill: currentColor;\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},75934:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,"tr[data-v-47057834]:hover,tr[data-v-47057834]:focus,tr[data-v-47057834]:active{background-color:var(--color-background-dark)}.files-list__row-icon-preview[data-v-47057834]:not([style*=background]){background:var(--color-loading-dark)}","",{version:3,sources:["webpack://./apps/files/src/components/FileEntry.vue"],names:[],mappings:"AAGC,+EAGC,6CAAA,CAKF,wEACI,oCAAA",sourcesContent:["\n/* Hover effect on tbody lines only */\ntr {\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\tbackground-color: var(--color-background-dark);\n\t}\n}\n\n/* Preview not loaded animation effect */\n.files-list__row-icon-preview:not([style*='background']) {\n background: var(--color-loading-dark);\n\t// animation: preview-gradient-fade 1.2s ease-in-out infinite;\n}\n"],sourceRoot:""}]);const a=r},97105:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,"tr[data-v-e6a083be]{padding-bottom:300px;border-top:1px solid var(--color-border);background-color:rgba(0,0,0,0) !important;border-bottom:none !important}td[data-v-e6a083be]{user-select:none;color:var(--color-text-maxcontrast) !important}","",{version:3,sources:["webpack://./apps/files/src/components/FilesListFooter.vue"],names:[],mappings:"AAEA,oBACC,oBAAA,CACA,wCAAA,CAEA,yCAAA,CACA,6BAAA,CAGD,oBACC,gBAAA,CAEA,8CAAA",sourcesContent:["\n// Scoped row\ntr {\n\tpadding-bottom: 300px;\n\tborder-top: 1px solid var(--color-border);\n\t// Prevent hover effect on the whole row\n\tbackground-color: transparent !important;\n\tborder-bottom: none !important;\n}\n\ntd {\n\tuser-select: none;\n\t// Make sure the cell colors don't apply to column headers\n\tcolor: var(--color-text-maxcontrast) !important;\n}\n\n"],sourceRoot:""}]);const a=r},8607:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".files-list__column[data-v-53698ce8]{user-select:none;color:var(--color-text-maxcontrast) !important}.files-list__column--sortable[data-v-53698ce8]{cursor:pointer}","",{version:3,sources:["webpack://./apps/files/src/components/FilesListHeader.vue"],names:[],mappings:"AACA,qCACC,gBAAA,CAEA,8CAAA,CAEA,+CACC,cAAA",sourcesContent:["\n.files-list__column {\n\tuser-select: none;\n\t// Make sure the cell colors don't apply to column headers\n\tcolor: var(--color-text-maxcontrast) !important;\n\n\t&--sortable {\n\t\tcursor: pointer;\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},19505:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".files-list__row-actions-batch[data-v-9d92da06]{flex:1 1 100% !important}.files-list__row-actions-batch[data-v-9d92da06] .button-vue__wrapper{width:100%}.files-list__row-actions-batch[data-v-9d92da06] .button-vue__wrapper span.button-vue__text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}","",{version:3,sources:["webpack://./apps/files/src/components/FilesListHeaderActions.vue"],names:[],mappings:"AACA,gDACC,wBAAA,CAGA,qEACC,UAAA,CACA,2FACC,eAAA,CACA,sBAAA,CACA,kBAAA",sourcesContent:["\n.files-list__row-actions-batch {\n\tflex: 1 1 100% !important;\n\n\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\n\t::v-deep .button-vue__wrapper {\n\t\twidth: 100%;\n\t\tspan.button-vue__text {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=r},29252:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".files-list__column-sort-button{margin:0 calc(var(--cell-margin)*-1);padding:0 4px 0 16px !important}.files-list__column-sort-button .button-vue__wrapper{flex-direction:row-reverse;width:100%}.files-list__column-sort-button .button-vue__icon{transition-timing-function:linear;transition-duration:.1s;transition-property:opacity;opacity:0}.files-list__column-sort-button .button-vue__text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.files-list__column-sort-button--active .button-vue__icon,.files-list__column-sort-button:hover .button-vue__icon,.files-list__column-sort-button:focus .button-vue__icon,.files-list__column-sort-button:active .button-vue__icon{opacity:1 !important}","",{version:3,sources:["webpack://./apps/files/src/components/FilesListHeaderButton.vue"],names:[],mappings:"AACA,gCAEC,oCAAA,CAEA,+BAAA,CAGA,qDACC,0BAAA,CAGA,UAAA,CAGD,kDACC,iCAAA,CACA,uBAAA,CACA,2BAAA,CACA,SAAA,CAID,kDACC,eAAA,CACA,kBAAA,CACA,sBAAA,CAOA,mOACC,oBAAA",sourcesContent:["\n.files-list__column-sort-button {\n\t// Compensate for cells margin\n\tmargin: 0 calc(var(--cell-margin) * -1);\n\t// Reverse padding\n\tpadding: 0 4px 0 16px !important;\n\n\t// Icon after text\n\t.button-vue__wrapper {\n\t\tflex-direction: row-reverse;\n\t\t// Take max inner width for text overflow ellipsis\n\t\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\n\t\twidth: 100%;\n\t}\n\n\t.button-vue__icon {\n\t\ttransition-timing-function: linear;\n\t\ttransition-duration: .1s;\n\t\ttransition-property: opacity;\n\t\topacity: 0;\n\t}\n\n\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\n\t.button-vue__text {\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t&--active,\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\t.button-vue__icon {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=r},525:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".files-list[data-v-07b86e54]{--row-height: 55px;--cell-margin: 14px;--checkbox-padding: calc((var(--row-height) - var(--checkbox-size)) / 2);--checkbox-size: 24px;--clickable-area: 44px;--icon-preview-size: 32px;display:block;overflow:auto;height:100%}.files-list[data-v-07b86e54] tbody,.files-list[data-v-07b86e54] .vue-recycle-scroller__slot{display:flex;flex-direction:column;width:100%;position:relative}.files-list[data-v-07b86e54] .vue-recycle-scroller__slot[role=thead]{position:sticky;z-index:10;top:0;height:var(--row-height);background-color:var(--color-main-background)}.files-list[data-v-07b86e54] tr{position:absolute;display:flex;align-items:center;width:100%;border-bottom:1px solid var(--color-border)}.files-list[data-v-07b86e54] td,.files-list[data-v-07b86e54] th{display:flex;align-items:center;flex:0 0 auto;justify-content:left;width:var(--row-height);height:var(--row-height);margin:0;padding:0;color:var(--color-text-maxcontrast);border:none}.files-list[data-v-07b86e54] td span,.files-list[data-v-07b86e54] th span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.files-list[data-v-07b86e54] .files-list__row-checkbox{justify-content:center}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch{display:flex;justify-content:center;--icon-size: var(--checkbox-size)}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch label.checkbox-radio-switch__label{width:var(--clickable-area);height:var(--clickable-area);margin:0;padding:calc((var(--clickable-area) - var(--checkbox-size))/2)}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch .checkbox-radio-switch__icon{margin:0 !important}.files-list[data-v-07b86e54] .files-list__row-icon{display:flex;align-items:center;justify-content:center;width:var(--icon-preview-size);height:100%;margin-right:var(--checkbox-padding);color:var(--color-primary-element);flex:0 0 var(--icon-preview-size)}.files-list[data-v-07b86e54] .files-list__row-icon>span{justify-content:flex-start}.files-list[data-v-07b86e54] .files-list__row-icon svg{width:var(--icon-preview-size);height:var(--icon-preview-size)}.files-list[data-v-07b86e54] .files-list__row-icon-preview{overflow:hidden;width:var(--icon-preview-size);height:var(--icon-preview-size);border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center;background-size:contain}.files-list[data-v-07b86e54] .files-list__row-name{overflow:hidden;flex:1 1 auto}.files-list[data-v-07b86e54] .files-list__row-name a{display:flex;align-items:center;width:100%;height:100%}.files-list[data-v-07b86e54] .files-list__row-name a:focus .files-list__row-name-text,.files-list[data-v-07b86e54] .files-list__row-name a:focus-visible .files-list__row-name-text{outline:2px solid var(--color-main-text) !important;border-radius:20px}.files-list[data-v-07b86e54] .files-list__row-name .files-list__row-name-text{padding:5px 10px;margin-left:-10px}.files-list[data-v-07b86e54] .files-list__row-actions{width:auto}.files-list[data-v-07b86e54] .files-list__row-actions~td,.files-list[data-v-07b86e54] .files-list__row-actions~th{margin:0 var(--cell-margin)}.files-list[data-v-07b86e54] .files-list__row-actions button .button-vue__text{font-weight:normal}.files-list[data-v-07b86e54] .files-list__row-actions button:not(:hover,:focus,:active) .button-vue__wrapper{color:var(--color-text-maxcontrast)}.files-list[data-v-07b86e54] .files-list__row-size{justify-content:flex-end;width:calc(var(--row-height)*1.5);color:var(--color-main-text)}.files-list[data-v-07b86e54] .files-list__row-size .files-list__column-sort-button{padding:0 16px 0 4px !important}.files-list[data-v-07b86e54] .files-list__row-size .files-list__column-sort-button .button-vue__wrapper{flex-direction:row}.files-list[data-v-07b86e54] .files-list__row-column-custom{width:calc(var(--row-height)*2)}","",{version:3,sources:["webpack://./apps/files/src/components/FilesListVirtual.vue"],names:[],mappings:"AACA,6BACC,kBAAA,CACA,mBAAA,CAEA,wEAAA,CACA,qBAAA,CACA,sBAAA,CACA,yBAAA,CAEA,aAAA,CACA,aAAA,CACA,WAAA,CAIC,4FACC,YAAA,CACA,qBAAA,CACA,UAAA,CAEA,iBAAA,CAID,qEAEC,eAAA,CACA,UAAA,CACA,KAAA,CACA,wBAAA,CACA,6CAAA,CAGD,gCACC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,UAAA,CACA,2CAAA,CAGD,gEACC,YAAA,CACA,kBAAA,CACA,aAAA,CACA,oBAAA,CACA,uBAAA,CACA,wBAAA,CACA,QAAA,CACA,SAAA,CACA,mCAAA,CACA,WAAA,CAKA,0EACC,eAAA,CACA,kBAAA,CACA,sBAAA,CAIF,uDACC,sBAAA,CACA,8EACC,YAAA,CACA,sBAAA,CAEA,iCAAA,CAEA,iHACC,2BAAA,CACA,4BAAA,CACA,QAAA,CACA,8DAAA,CAGD,2GACC,mBAAA,CAKH,mDACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,8BAAA,CACA,WAAA,CAEA,oCAAA,CACA,kCAAA,CAEA,iCAAA,CAEA,wDACC,0BAAA,CAGD,uDACC,8BAAA,CACA,+BAAA,CAGD,2DACC,eAAA,CACA,8BAAA,CACA,+BAAA,CACA,kCAAA,CACA,2BAAA,CAEA,0BAAA,CACA,uBAAA,CAIF,mDAEC,eAAA,CAEA,aAAA,CAEA,qDACC,YAAA,CACA,kBAAA,CAEA,UAAA,CACA,WAAA,CAGA,oLAEC,mDAAA,CACA,kBAAA,CAIF,8EAEC,gBAAA,CACA,iBAAA,CAIF,sDACC,UAAA,CAGA,kHAEC,2BAAA,CAIA,+EAEC,kBAAA,CAED,6GAEC,mCAAA,CAKH,mDAEC,wBAAA,CACA,iCAAA,CAEA,4BAAA,CAGA,mFACC,+BAAA,CACA,wGACC,kBAAA,CAKH,4DACC,+BAAA",sourcesContent:["\n.files-list {\n\t--row-height: 55px;\n\t--cell-margin: 14px;\n\n\t--checkbox-padding: calc((var(--row-height) - var(--checkbox-size)) / 2);\n\t--checkbox-size: 24px;\n\t--clickable-area: 44px;\n\t--icon-preview-size: 32px;\n\n\tdisplay: block;\n\toverflow: auto;\n\theight: 100%;\n\n\t&::v-deep {\n\t\t// Table head, body and footer\n\t\ttbody, .vue-recycle-scroller__slot {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\twidth: 100%;\n\t\t\t// Necessary for virtual scrolling absolute\n\t\t\tposition: relative;\n\t\t}\n\n\t\t// Table header\n\t\t.vue-recycle-scroller__slot[role='thead'] {\n\t\t\t// Pinned on top when scrolling\n\t\t\tposition: sticky;\n\t\t\tz-index: 10;\n\t\t\ttop: 0;\n\t\t\theight: var(--row-height);\n\t\t\tbackground-color: var(--color-main-background);\n\t\t}\n\n\t\ttr {\n\t\t\tposition: absolute;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\twidth: 100%;\n\t\t\tborder-bottom: 1px solid var(--color-border);\n\t\t}\n\n\t\ttd, th {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tflex: 0 0 auto;\n\t\t\tjustify-content: left;\n\t\t\twidth: var(--row-height);\n\t\t\theight: var(--row-height);\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t\tborder: none;\n\n\t\t\t// Columns should try to add any text\n\t\t\t// node wrapped in a span. That should help\n\t\t\t// with the ellipsis on overflow.\n\t\t\tspan {\n\t\t\t\toverflow: hidden;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-checkbox {\n\t\t\tjustify-content: center;\n\t\t\t.checkbox-radio-switch {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: center;\n\n\t\t\t\t--icon-size: var(--checkbox-size);\n\n\t\t\t\tlabel.checkbox-radio-switch__label {\n\t\t\t\t\twidth: var(--clickable-area);\n\t\t\t\t\theight: var(--clickable-area);\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\tpadding: calc((var(--clickable-area) - var(--checkbox-size)) / 2);\n\t\t\t\t}\n\n\t\t\t\t.checkbox-radio-switch__icon {\n\t\t\t\t\tmargin: 0 !important;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-icon {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\twidth: var(--icon-preview-size);\n\t\t\theight: 100%;\n\t\t\t// Show same padding as the checkbox right padding for visual balance\n\t\t\tmargin-right: var(--checkbox-padding);\n\t\t\tcolor: var(--color-primary-element);\n\t\t\t// No shrinking or growing allowed\n\t\t\tflex: 0 0 var(--icon-preview-size);\n\n\t\t\t& > span {\n\t\t\t\tjustify-content: flex-start;\n\t\t\t}\n\n\t\t\tsvg {\n\t\t\t\twidth: var(--icon-preview-size);\n\t\t\t\theight: var(--icon-preview-size);\n\t\t\t}\n\n\t\t\t&-preview {\n\t\t\t\toverflow: hidden;\n\t\t\t\twidth: var(--icon-preview-size);\n\t\t\t\theight: var(--icon-preview-size);\n\t\t\t\tborder-radius: var(--border-radius);\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\t// Center and contain the preview\n\t\t\t\tbackground-position: center;\n\t\t\t\tbackground-size: contain;\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-name {\n\t\t\t// Prevent link from overflowing\n\t\t\toverflow: hidden;\n\t\t\t// Take as much space as possible\n\t\t\tflex: 1 1 auto;\n\n\t\t\ta {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\t// Fill cell height and width\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\n\t\t\t\t// Keyboard indicator a11y\n\t\t\t\t&:focus .files-list__row-name-text,\n\t\t\t\t&:focus-visible .files-list__row-name-text {\n\t\t\t\t\toutline: 2px solid var(--color-main-text) !important;\n\t\t\t\t\tborder-radius: 20px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.files-list__row-name-text {\n\t\t\t\t// Make some space for the outline\n\t\t\t\tpadding: 5px 10px;\n\t\t\t\tmargin-left: -10px;\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-actions {\n\t\t\twidth: auto;\n\n\t\t\t// Add margin to all cells after the actions\n\t\t\t& ~ td,\n\t\t\t& ~ th {\n\t\t\t\tmargin: 0 var(--cell-margin);\n\t\t\t}\n\n\t\t\tbutton {\n\t\t\t\t.button-vue__text {\n\t\t\t\t\t// Remove bold from default button styling\n\t\t\t\t\tfont-weight: normal;\n\t\t\t\t}\n\t\t\t\t&:not(:hover, :focus, :active) .button-vue__wrapper {\n\t\t\t\t\t// Also apply color-text-maxcontrast to non-active button\n\t\t\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-size {\n\t\t\t// Right align text\n\t\t\tjustify-content: flex-end;\n\t\t\twidth: calc(var(--row-height) * 1.5);\n\t\t\t// opacity varies with the size\n\t\t\tcolor: var(--color-main-text);\n\n\t\t\t// Icon is before text since size is right aligned\n\t\t\t.files-list__column-sort-button {\n\t\t\t\tpadding: 0 16px 0 4px !important;\n\t\t\t\t.button-vue__wrapper {\n\t\t\t\t\tflex-direction: row;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-column-custom {\n\t\t\twidth: calc(var(--row-height) * 2);\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=r},93582:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".app-navigation-entry__settings-quota--not-unlimited[data-v-918797b2] .app-navigation-entry__title{margin-top:-4px}.app-navigation-entry__settings-quota progress[data-v-918797b2]{position:absolute;bottom:10px;margin-left:44px;width:calc(100% - 44px - 22px)}","",{version:3,sources:["webpack://./apps/files/src/components/NavigationQuota.vue"],names:[],mappings:"AAIC,mGACC,eAAA,CAGD,gEACC,iBAAA,CACA,WAAA,CACA,gBAAA,CACA,8BAAA",sourcesContent:["\n// User storage stats display\n.app-navigation-entry__settings-quota {\n\t// Align title with progress and icon\n\t&--not-unlimited::v-deep .app-navigation-entry__title {\n\t\tmargin-top: -4px;\n\t}\n\n\tprogress {\n\t\tposition: absolute;\n\t\tbottom: 10px;\n\t\tmargin-left: 44px;\n\t\twidth: calc(100% - 44px - 22px);\n\t}\n}\n"],sourceRoot:""}]);const a=r},3491:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".template-picker__item[data-v-6c072a31]{display:flex}.template-picker__label[data-v-6c072a31]{display:flex;align-items:center;flex:1 1;flex-direction:column}.template-picker__label[data-v-6c072a31],.template-picker__label *[data-v-6c072a31]{cursor:pointer;user-select:none}.template-picker__label[data-v-6c072a31]::before{display:none !important}.template-picker__preview[data-v-6c072a31]{display:block;overflow:hidden;flex:1 1;width:var(--width);min-height:var(--height);max-height:var(--height);padding:0;border:var(--border) solid var(--color-border);border-radius:var(--border-radius-large)}input:checked+label>.template-picker__preview[data-v-6c072a31]{border-color:var(--color-primary)}.template-picker__preview--failed[data-v-6c072a31]{display:flex}.template-picker__image[data-v-6c072a31]{max-width:100%;background-color:var(--color-main-background);object-fit:cover}.template-picker__preview--failed .template-picker__image[data-v-6c072a31]{width:calc(var(--margin)*8);margin:auto;background-color:rgba(0,0,0,0) !important;object-fit:initial}.template-picker__title[data-v-6c072a31]{overflow:hidden;max-width:calc(var(--width) + 4px);padding:var(--margin);white-space:nowrap;text-overflow:ellipsis}","",{version:3,sources:["webpack://./apps/files/src/components/TemplatePreview.vue"],names:[],mappings:"AAGC,wCACC,YAAA,CAGD,yCACC,YAAA,CAEA,kBAAA,CACA,QAAA,CACA,qBAAA,CAEA,oFACC,cAAA,CACA,gBAAA,CAGD,iDACC,uBAAA,CAIF,2CACC,aAAA,CACA,eAAA,CAEA,QAAA,CACA,kBAAA,CACA,wBAAA,CACA,wBAAA,CACA,SAAA,CACA,8CAAA,CACA,wCAAA,CAEA,+DACC,iCAAA,CAGD,mDAEC,YAAA,CAIF,yCACC,cAAA,CACA,6CAAA,CAEA,gBAAA,CAID,2EACC,2BAAA,CAEA,WAAA,CACA,yCAAA,CAEA,kBAAA,CAGD,yCACC,eAAA,CAEA,kCAAA,CACA,qBAAA,CACA,kBAAA,CACA,sBAAA",sourcesContent:["\n\n.template-picker {\n\t&__item {\n\t\tdisplay: flex;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\t// Align in the middle of the grid\n\t\talign-items: center;\n\t\tflex: 1 1;\n\t\tflex-direction: column;\n\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&::before {\n\t\t\tdisplay: none !important;\n\t\t}\n\t}\n\n\t&__preview {\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\t// Stretch so all entries are the same width\n\t\tflex: 1 1;\n\t\twidth: var(--width);\n\t\tmin-height: var(--height);\n\t\tmax-height: var(--height);\n\t\tpadding: 0;\n\t\tborder: var(--border) solid var(--color-border);\n\t\tborder-radius: var(--border-radius-large);\n\n\t\tinput:checked + label > & {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\n\t\t&--failed {\n\t\t\t// Make sure to properly center fallback icon\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n\n\t&__image {\n\t\tmax-width: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tobject-fit: cover;\n\t}\n\n\t// Failed preview, fallback to mime icon\n\t&__preview--failed &__image {\n\t\twidth: calc(var(--margin) * 8);\n\t\t// Center mime icon\n\t\tmargin: auto;\n\t\tbackground-color: transparent !important;\n\n\t\tobject-fit: initial;\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\t// also count preview border\n\t\tmax-width: calc(var(--width) + 2*2px);\n\t\tpadding: var(--margin);\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},43010:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".app-content[data-v-77548daf]{display:flex;overflow:hidden;flex-direction:column;max-height:100%}.app-content[data-v-77548daf]:not(.app-content--hidden)+#app-content{display:none}.files-list__header[data-v-77548daf]{display:flex;align-content:center;flex:0 0;margin:4px 4px 4px 50px}.files-list__header>*[data-v-77548daf]{flex:0 0}.files-list__refresh-icon[data-v-77548daf]{flex:0 0 44px;width:44px;height:44px}.files-list__loading-icon[data-v-77548daf]{margin:auto}","",{version:3,sources:["webpack://./apps/files/src/views/FilesList.vue"],names:[],mappings:"AACA,8BAEC,YAAA,CACA,eAAA,CACA,qBAAA,CACA,eAAA,CAIA,qEACC,YAAA,CAQD,qCACC,YAAA,CACA,oBAAA,CAEA,QAAA,CAEA,uBAAA,CACA,uCAGC,QAAA,CAGF,2CACC,aAAA,CACA,UAAA,CACA,WAAA,CAED,2CACC,WAAA",sourcesContent:["\n.app-content {\n\t// Virtual list needs to be full height and is scrollable\n\tdisplay: flex;\n\toverflow: hidden;\n\tflex-direction: column;\n\tmax-height: 100%;\n\n\t// TODO: remove after all legacy views are migrated\n\t// Hides the legacy app-content if shown view is not legacy\n\t&:not(&--hidden)::v-deep + #app-content {\n\t\tdisplay: none;\n\t}\n}\n\n$margin: 4px;\n$navigationToggleSize: 50px;\n\n.files-list {\n\t&__header {\n\t\tdisplay: flex;\n\t\talign-content: center;\n\t\t// Do not grow or shrink (vertically)\n\t\tflex: 0 0;\n\t\t// Align with the navigation toggle icon\n\t\tmargin: $margin $margin $margin $navigationToggleSize;\n\t\t> * {\n\t\t\t// Do not grow or shrink (horizontally)\n\t\t\t// Only the breadcrumbs shrinks\n\t\t\tflex: 0 0;\n\t\t}\n\t}\n\t&__refresh-icon {\n\t\tflex: 0 0 44px;\n\t\twidth: 44px;\n\t\theight: 44px;\n\t}\n\t&__loading-icon {\n\t\tmargin: auto;\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},41675:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".app-navigation[data-v-508e08a4] .app-navigation-entry-icon{background-repeat:no-repeat;background-position:center}.app-navigation>ul.app-navigation__list[data-v-508e08a4]{padding-bottom:var(--default-grid-baseline, 4px)}.app-navigation-entry__settings[data-v-508e08a4]{height:auto !important;overflow:hidden !important;padding-top:0 !important;flex:0 0 auto}","",{version:3,sources:["webpack://./apps/files/src/views/Navigation.vue"],names:[],mappings:"AAEA,4DACC,2BAAA,CACA,0BAAA,CAGD,yDAEC,gDAAA,CAGD,iDACC,sBAAA,CACA,0BAAA,CACA,wBAAA,CAEA,aAAA",sourcesContent:["\n// TODO: remove when https://github.com/nextcloud/nextcloud-vue/pull/3539 is in\n.app-navigation::v-deep .app-navigation-entry-icon {\n\tbackground-repeat: no-repeat;\n\tbackground-position: center;\n}\n\n.app-navigation > ul.app-navigation__list {\n\t// Use flex gap value for more elegant spacing\n\tpadding-bottom: var(--default-grid-baseline, 4px);\n}\n\n.app-navigation-entry__settings {\n\theight: auto !important;\n\toverflow: hidden !important;\n\tpadding-top: 0 !important;\n\t// Prevent shrinking or growing\n\tflex: 0 0 auto;\n}\n"],sourceRoot:""}]);const a=r},35662:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".setting-link[data-v-76ca5d1f]:hover{text-decoration:underline}","",{version:3,sources:["webpack://./apps/files/src/views/Settings.vue"],names:[],mappings:"AACA,qCACC,yBAAA",sourcesContent:["\n.setting-link:hover {\n\ttext-decoration: underline;\n}\n"],sourceRoot:""}]);const a=r},5103:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".templates-picker__form[data-v-715b4161]{padding:calc(var(--margin)*2);padding-bottom:0}.templates-picker__form h2[data-v-715b4161]{text-align:center;font-weight:bold;margin:var(--margin) 0 calc(var(--margin)*2)}.templates-picker__list[data-v-715b4161]{display:grid;grid-gap:calc(var(--margin)*2);grid-auto-columns:1fr;max-width:calc(var(--fullwidth)*6);grid-template-columns:repeat(auto-fit, var(--fullwidth));grid-auto-rows:1fr;justify-content:center}.templates-picker__buttons[data-v-715b4161]{display:flex;justify-content:space-between;padding:calc(var(--margin)*2) var(--margin);position:sticky;bottom:0;background-image:linear-gradient(0, var(--gradient-main-background))}.templates-picker__buttons button[data-v-715b4161],.templates-picker__buttons input[type=submit][data-v-715b4161]{height:44px}.templates-picker[data-v-715b4161] .modal-container{position:relative}.templates-picker__loading[data-v-715b4161]{position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;margin:0;background-color:var(--color-main-background-translucent)}","",{version:3,sources:["webpack://./apps/files/src/views/TemplatePicker.vue"],names:[],mappings:"AAEC,yCACC,6BAAA,CAEA,gBAAA,CAEA,4CACC,iBAAA,CACA,gBAAA,CACA,4CAAA,CAIF,yCACC,YAAA,CACA,8BAAA,CACA,qBAAA,CAEA,kCAAA,CACA,wDAAA,CAEA,kBAAA,CAEA,sBAAA,CAGD,4CACC,YAAA,CACA,6BAAA,CACA,2CAAA,CACA,eAAA,CACA,QAAA,CACA,oEAAA,CAEA,kHACC,WAAA,CAKF,oDACC,iBAAA,CAGD,4CACC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,sBAAA,CACA,UAAA,CACA,WAAA,CACA,QAAA,CACA,yDAAA",sourcesContent:["\n.templates-picker {\n\t&__form {\n\t\tpadding: calc(var(--margin) * 2);\n\t\t// Will be handled by the buttons\n\t\tpadding-bottom: 0;\n\n\t\th2 {\n\t\t\ttext-align: center;\n\t\t\tfont-weight: bold;\n\t\t\tmargin: var(--margin) 0 calc(var(--margin) * 2);\n\t\t}\n\t}\n\n\t&__list {\n\t\tdisplay: grid;\n\t\tgrid-gap: calc(var(--margin) * 2);\n\t\tgrid-auto-columns: 1fr;\n\t\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\n\t\tmax-width: calc(var(--fullwidth) * 6);\n\t\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\n\t\t// Make sure all rows are the same height\n\t\tgrid-auto-rows: 1fr;\n\t\t// Center the columns set\n\t\tjustify-content: center;\n\t}\n\n\t&__buttons {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tpadding: calc(var(--margin) * 2) var(--margin);\n\t\tposition: sticky;\n\t\tbottom: 0;\n\t\tbackground-image: linear-gradient(0, var(--gradient-main-background));\n\n\t\tbutton, input[type='submit'] {\n\t\t\theight: 44px;\n\t\t}\n\t}\n\n\t// Make sure we're relative for the loading emptycontent on top\n\t::v-deep .modal-container {\n\t\tposition: relative;\n\t}\n\n\t&__loading {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin: 0;\n\t\tbackground-color: var(--color-main-background-translucent);\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},96669:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,"\n/* @keyframes preview-gradient-fade {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n 100% {\n opacity: 1;\n }\n} */\n","",{version:3,sources:["webpack://./apps/files/src/components/FileEntry.vue"],names:[],mappings:";AAmjBA;;;;;;;;;;GAUA",sourcesContent:["\x3c!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n --\x3e\n\n<template>\n\t<Fragment>\n\t\t<td class=\"files-list__row-checkbox\">\n\t\t\t<NcCheckboxRadioSwitch v-if=\"active\"\n\t\t\t\t:aria-label=\"t('files', 'Select the row for {displayName}', { displayName })\"\n\t\t\t\t:checked=\"selectedFiles\"\n\t\t\t\t:value=\"fileid\"\n\t\t\t\tname=\"selectedFiles\"\n\t\t\t\t@update:checked=\"onSelectionChange\" />\n\t\t</td>\n\n\t\t\x3c!-- Link to file --\x3e\n\t\t<td class=\"files-list__row-name\">\n\t\t\t<a ref=\"name\" v-bind=\"linkTo\">\n\t\t\t\t\x3c!-- Icon or preview --\x3e\n\t\t\t\t<span class=\"files-list__row-icon\">\n\t\t\t\t\t<FolderIcon v-if=\"source.type === 'folder'\" />\n\n\t\t\t\t\t\x3c!-- Decorative image, should not be aria documented --\x3e\n\t\t\t\t\t<span v-else-if=\"previewUrl && !backgroundFailed\"\n\t\t\t\t\t\tref=\"previewImg\"\n\t\t\t\t\t\tclass=\"files-list__row-icon-preview\"\n\t\t\t\t\t\t:style=\"{ backgroundImage }\" />\n\n\t\t\t\t\t<span v-else-if=\"mimeIconUrl\"\n\t\t\t\t\t\tclass=\"files-list__row-icon-preview files-list__row-icon-preview--mime\"\n\t\t\t\t\t\t:style=\"{ backgroundImage: mimeIconUrl }\" />\n\n\t\t\t\t\t<FileIcon v-else />\n\t\t\t\t</span>\n\n\t\t\t\t\x3c!-- File name --\x3e\n\t\t\t\t<span class=\"files-list__row-name-text\">{{ displayName }}</span>\n\t\t\t</a>\n\t\t</td>\n\n\t\t\x3c!-- Actions --\x3e\n\t\t<td :class=\"`files-list__row-actions-${uniqueId}`\" class=\"files-list__row-actions\">\n\t\t\t\x3c!-- Inline actions --\x3e\n\t\t\t\x3c!-- TODO: implement CustomElementRender --\x3e\n\n\t\t\t\x3c!-- Menu actions --\x3e\n\t\t\t<NcActions v-if=\"active\"\n\t\t\t\tref=\"actionsMenu\"\n\t\t\t\t:disabled=\"source._loading\"\n\t\t\t\t:force-title=\"true\"\n\t\t\t\t:inline=\"enabledInlineActions.length\"\n\t\t\t\t:open.sync=\"openedMenu\">\n\t\t\t\t<NcActionButton v-for=\"action in enabledMenuActions\"\n\t\t\t\t\t:key=\"action.id\"\n\t\t\t\t\t:class=\"'files-list__row-action-' + action.id\"\n\t\t\t\t\t@click=\"onActionClick(action)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"loading === action.id\" :size=\"18\" />\n\t\t\t\t\t\t<CustomSvgIconRender v-else :svg=\"action.iconSvgInline([source], currentView)\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ action.displayName([source], currentView) }}\n\t\t\t\t</NcActionButton>\n\t\t\t</NcActions>\n\t\t</td>\n\n\t\t\x3c!-- Size --\x3e\n\t\t<td v-if=\"isSizeAvailable\"\n\t\t\t:style=\"{ opacity: sizeOpacity }\"\n\t\t\tclass=\"files-list__row-size\">\n\t\t\t<span>{{ size }}</span>\n\t\t</td>\n\n\t\t\x3c!-- View columns --\x3e\n\t\t<td v-for=\"column in columns\"\n\t\t\t:key=\"column.id\"\n\t\t\t:class=\"`files-list__row-${currentView?.id}-${column.id}`\"\n\t\t\tclass=\"files-list__row-column-custom\">\n\t\t\t<CustomElementRender v-if=\"active\"\n\t\t\t\t:current-view=\"currentView\"\n\t\t\t\t:render=\"column.render\"\n\t\t\t\t:source=\"source\" />\n\t\t</td>\n\t</Fragment>\n</template>\n\n<script lang='ts'>\nimport { debounce } from 'debounce'\nimport { formatFileSize } from '@nextcloud/files'\nimport { Fragment } from 'vue-frag'\nimport { join } from 'path'\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { translate } from '@nextcloud/l10n'\nimport CancelablePromise from 'cancelable-promise'\nimport FileIcon from 'vue-material-design-icons/File.vue'\nimport FolderIcon from 'vue-material-design-icons/Folder.vue'\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\nimport Vue from 'vue'\n\nimport { getFileActions } from '../services/FileAction.ts'\nimport { isCachedPreview } from '../services/PreviewService.ts'\nimport { useActionsMenuStore } from '../store/actionsmenu.ts'\nimport { useFilesStore } from '../store/files.ts'\nimport { useKeyboardStore } from '../store/keyboard.ts'\nimport { useSelectionStore } from '../store/selection.ts'\nimport { useUserConfigStore } from '../store/userconfig.ts'\nimport CustomElementRender from './CustomElementRender.vue'\nimport CustomSvgIconRender from './CustomSvgIconRender.vue'\nimport logger from '../logger.js'\n\n// The registered actions list\nconst actions = getFileActions()\n\nexport default Vue.extend({\n\tname: 'FileEntry',\n\n\tcomponents: {\n\t\tCustomElementRender,\n\t\tCustomSvgIconRender,\n\t\tFileIcon,\n\t\tFolderIcon,\n\t\tFragment,\n\t\tNcActionButton,\n\t\tNcActions,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcLoadingIcon,\n\t},\n\n\tprops: {\n\t\tactive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisSizeAvailable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tsource: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tindex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tnodes: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tfilesListWidth: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst actionsMenuStore = useActionsMenuStore()\n\t\tconst filesStore = useFilesStore()\n\t\tconst keyboardStore = useKeyboardStore()\n\t\tconst selectionStore = useSelectionStore()\n\t\tconst userConfigStore = useUserConfigStore()\n\t\treturn {\n\t\t\tactionsMenuStore,\n\t\t\tfilesStore,\n\t\t\tkeyboardStore,\n\t\t\tselectionStore,\n\t\t\tuserConfigStore,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tbackgroundFailed: false,\n\t\t\tbackgroundImage: '',\n\t\t\tloading: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tuserConfig() {\n\t\t\treturn this.userConfigStore.userConfig\n\t\t},\n\n\t\tcurrentView() {\n\t\t\treturn this.$navigation.active\n\t\t},\n\n\t\tcolumns() {\n\t\t\t// Hide columns if the list is too small\n\t\t\tif (this.filesListWidth < 512) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.currentView?.columns || []\n\t\t},\n\n\t\tdir() {\n\t\t\t// Remove any trailing slash but leave root slash\n\t\t\treturn (this.$route?.query?.dir || '/').replace(/^(.+)\\/$/, '$1')\n\t\t},\n\n\t\tfileid() {\n\t\t\treturn this.source?.fileid?.toString?.()\n\t\t},\n\t\tdisplayName() {\n\t\t\treturn this.source.attributes.displayName\n\t\t\t\t|| this.source.basename\n\t\t},\n\t\tsize() {\n\t\t\tconst size = parseInt(this.source.size, 10) || 0\n\t\t\tif (typeof size !== 'number' || size < 0) {\n\t\t\t\treturn this.t('files', 'Pending')\n\t\t\t}\n\t\t\treturn formatFileSize(size, true)\n\t\t},\n\n\t\tsizeOpacity() {\n\t\t\tconst size = parseInt(this.source.size, 10) || 0\n\t\t\tif (!size || size < 0) {\n\t\t\t\treturn 1\n\t\t\t}\n\n\t\t\t// Whatever theme is active, the contrast will pass WCAG AA\n\t\t\t// with color main text over main background and an opacity of 0.7\n\t\t\tconst minOpacity = 0.7\n\t\t\tconst maxOpacitySize = 10 * 1024 * 1024\n\t\t\treturn minOpacity + (1 - minOpacity) * Math.pow((this.source.size / maxOpacitySize), 2)\n\t\t},\n\n\t\tlinkTo() {\n\t\t\tif (this.source.type === 'folder') {\n\t\t\t\tconst to = { ...this.$route, query: { dir: join(this.dir, this.source.basename) } }\n\t\t\t\treturn {\n\t\t\t\t\tis: 'router-link',\n\t\t\t\t\ttitle: this.t('files', 'Open folder {name}', { name: this.displayName }),\n\t\t\t\t\tto,\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\thref: this.source.source,\n\t\t\t\t// TODO: Use first action title ?\n\t\t\t\ttitle: this.t('files', 'Download file {name}', { name: this.displayName }),\n\t\t\t}\n\t\t},\n\n\t\tselectedFiles() {\n\t\t\treturn this.selectionStore.selected\n\t\t},\n\t\tisSelected() {\n\t\t\treturn this.selectedFiles.includes(this.source?.fileid?.toString?.())\n\t\t},\n\n\t\tcropPreviews() {\n\t\t\treturn this.userConfig.crop_image_previews\n\t\t},\n\n\t\tpreviewUrl() {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(window.location.origin + this.source.attributes.previewUrl)\n\t\t\t\t// Request tiny previews\n\t\t\t\turl.searchParams.set('x', '32')\n\t\t\t\turl.searchParams.set('y', '32')\n\t\t\t\t// Handle cropping\n\t\t\t\turl.searchParams.set('a', this.cropPreviews === true ? '1' : '0')\n\t\t\t\treturn url.href\n\t\t\t} catch (e) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\tmimeIconUrl() {\n\t\t\tconst mimeType = this.source.mime || 'application/octet-stream'\n\t\t\tconst mimeIconUrl = window.OC?.MimeType?.getIconUrl?.(mimeType)\n\t\t\tif (mimeIconUrl) {\n\t\t\t\treturn `url(${mimeIconUrl})`\n\t\t\t}\n\t\t\treturn ''\n\t\t},\n\n\t\tenabledActions() {\n\t\t\treturn actions\n\t\t\t\t.filter(action => !action.enabled || action.enabled([this.source], this.currentView))\n\t\t\t\t.sort((a, b) => (a.order || 0) - (b.order || 0))\n\t\t},\n\n\t\tenabledInlineActions() {\n\t\t\tif (this.filesListWidth < 768) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.enabledActions.filter(action => action?.inline?.(this.source, this.currentView))\n\t\t},\n\n\t\tenabledMenuActions() {\n\t\t\tif (this.filesListWidth < 768) {\n\t\t\t\treturn this.enabledActions\n\t\t\t}\n\n\t\t\treturn [\n\t\t\t\t...this.enabledInlineActions,\n\t\t\t\t...this.enabledActions.filter(action => !action.inline),\n\t\t\t]\n\t\t},\n\n\t\tuniqueId() {\n\t\t\treturn this.hashCode(this.source.source)\n\t\t},\n\n\t\topenedMenu: {\n\t\t\tget() {\n\t\t\t\treturn this.actionsMenuStore.opened === this.uniqueId\n\t\t\t},\n\t\t\tset(opened) {\n\t\t\t\tthis.actionsMenuStore.opened = opened ? this.uniqueId : null\n\t\t\t},\n\t\t},\n\t},\n\n\twatch: {\n\t\tactive(active, before) {\n\t\t\tif (active === false && before === true) {\n\t\t\t\tthis.resetState()\n\n\t\t\t\t// When the row is not active anymore\n\t\t\t\t// remove the display from the row to prevent\n\t\t\t\t// keyboard interaction with it.\n\t\t\t\tthis.$el.parentNode.style.display = 'none'\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Restore default tabindex\n\t\t\tthis.$el.parentNode.style.display = ''\n\t\t},\n\n\t\t/**\n\t\t * When the source changes, reset the preview\n\t\t * and fetch the new one.\n\t\t */\n\t\tpreviewUrl() {\n\t\t\tthis.clearImg()\n\t\t\tthis.debounceIfNotCached()\n\t\t},\n\t},\n\n\t/**\n\t * The row is mounted once and reused as we scroll.\n\t */\n\tmounted() {\n\t\t// ⚠ Init the debounce function on mount and\n\t\t// not when the module is imported to\n\t\t// avoid sharing between recycled components\n\t\tthis.debounceGetPreview = debounce(function() {\n\t\t\tthis.fetchAndApplyPreview()\n\t\t}, 150, false)\n\n\t\t// Fetch the preview on init\n\t\tthis.debounceIfNotCached()\n\n\t\t// Right click watcher on tr\n\t\tthis.$el.parentNode?.addEventListener?.('contextmenu', this.onRightClick)\n\t},\n\n\tbeforeDestroy() {\n\t\tthis.resetState()\n\t},\n\n\tmethods: {\n\t\tasync debounceIfNotCached() {\n\t\t\tif (!this.previewUrl) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Check if we already have this preview cached\n\t\t\tconst isCached = await isCachedPreview(this.previewUrl)\n\t\t\tif (isCached) {\n\t\t\t\tthis.backgroundImage = `url(${this.previewUrl})`\n\t\t\t\tthis.backgroundFailed = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// We don't have this preview cached or it expired, requesting it\n\t\t\tthis.debounceGetPreview()\n\t\t},\n\n\t\tfetchAndApplyPreview() {\n\t\t\t// Ignore if no preview\n\t\t\tif (!this.previewUrl) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// If any image is being processed, reset it\n\t\t\tif (this.previewPromise) {\n\t\t\t\tthis.clearImg()\n\t\t\t}\n\n\t\t\t// Store the promise to be able to cancel it\n\t\t\tthis.previewPromise = new CancelablePromise((resolve, reject, onCancel) => {\n\t\t\t\tconst img = new Image()\n\t\t\t\t// If active, load the preview with higher priority\n\t\t\t\timg.fetchpriority = this.active ? 'high' : 'auto'\n\t\t\t\timg.onload = () => {\n\t\t\t\t\tthis.backgroundImage = `url(${this.previewUrl})`\n\t\t\t\t\tthis.backgroundFailed = false\n\t\t\t\t\tresolve(img)\n\t\t\t\t}\n\t\t\t\timg.onerror = () => {\n\t\t\t\t\tthis.backgroundFailed = true\n\t\t\t\t\treject(img)\n\t\t\t\t}\n\t\t\t\timg.src = this.previewUrl\n\n\t\t\t\t// Image loading has been canceled\n\t\t\t\tonCancel(() => {\n\t\t\t\t\timg.onerror = null\n\t\t\t\t\timg.onload = null\n\t\t\t\t\timg.src = ''\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\n\t\tresetState() {\n\t\t\t// Reset loading state\n\t\t\tthis.loading = ''\n\n\t\t\t// Reset the preview\n\t\t\tthis.clearImg()\n\n\t\t\t// Close menu\n\t\t\tthis.openedMenu = false\n\t\t},\n\n\t\tclearImg() {\n\t\t\tthis.backgroundImage = ''\n\t\t\tthis.backgroundFailed = false\n\n\t\t\tif (this.previewPromise) {\n\t\t\t\tthis.previewPromise.cancel()\n\t\t\t\tthis.previewPromise = null\n\t\t\t}\n\t\t},\n\n\t\thashCode(str) {\n\t\t\tlet hash = 0\n\t\t\tfor (let i = 0, len = str.length; i < len; i++) {\n\t\t\t\tconst chr = str.charCodeAt(i)\n\t\t\t\thash = (hash << 5) - hash + chr\n\t\t\t\thash |= 0 // Convert to 32bit integer\n\t\t\t}\n\t\t\treturn hash\n\t\t},\n\n\t\tasync onActionClick(action) {\n\t\t\tconst displayName = action.displayName([this.source], this.currentView)\n\t\t\ttry {\n\t\t\t\t// Set the loading marker\n\t\t\t\tthis.loading = action.id\n\t\t\t\tVue.set(this.source, '_loading', true)\n\n\t\t\t\tconst success = await action.exec(this.source, this.currentView)\n\t\t\t\tif (success) {\n\t\t\t\t\tshowSuccess(this.t('files', '\"{displayName}\" action executed successfully', { displayName }))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tshowError(this.t('files', '\"{displayName}\" action failed', { displayName }))\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error('Error while executing action', { action, e })\n\t\t\t\tshowError(this.t('files', '\"{displayName}\" action failed', { displayName }))\n\t\t\t} finally {\n\t\t\t\t// Reset the loading marker\n\t\t\t\tthis.loading = ''\n\t\t\t\tVue.set(this.source, '_loading', false)\n\t\t\t}\n\t\t},\n\n\t\tonSelectionChange(selection) {\n\t\t\tconst newSelectedIndex = this.index\n\t\t\tconst lastSelectedIndex = this.selectionStore.lastSelectedIndex\n\n\t\t\t// Get the last selected and select all files in between\n\t\t\tif (this.keyboardStore?.shiftKey && lastSelectedIndex !== null) {\n\t\t\t\tconst isAlreadySelected = this.selectedFiles.includes(this.fileid)\n\n\t\t\t\tconst start = Math.min(newSelectedIndex, lastSelectedIndex)\n\t\t\t\tconst end = Math.max(lastSelectedIndex, newSelectedIndex)\n\n\t\t\t\tconst lastSelection = this.selectionStore.lastSelection\n\t\t\t\tconst filesToSelect = this.nodes\n\t\t\t\t\t.map(file => file.fileid?.toString?.())\n\t\t\t\t\t.slice(start, end + 1)\n\n\t\t\t\t// If already selected, update the new selection _without_ the current file\n\t\t\t\tconst selection = [...lastSelection, ...filesToSelect]\n\t\t\t\t\t.filter(fileId => !isAlreadySelected || fileId !== this.fileid)\n\n\t\t\t\tlogger.debug('Shift key pressed, selecting all files in between', { start, end, filesToSelect, isAlreadySelected })\n\t\t\t\t// Keep previous lastSelectedIndex to be use for further shift selections\n\t\t\t\tthis.selectionStore.set(selection)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlogger.debug('Updating selection', { selection })\n\t\t\tthis.selectionStore.set(selection)\n\t\t\tthis.selectionStore.setLastIndex(newSelectedIndex)\n\t\t},\n\n\t\t// Open the actions menu on right click\n\t\tonRightClick(event) {\n\t\t\t// If already opened, fallback to default browser\n\t\t\tif (this.openedMenu) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// If the clicked row is in the selection, open global menu\n\t\t\tconst isMoreThanOneSelected = this.selectedFiles.length > 1\n\t\t\tthis.actionsMenuStore.opened = this.isSelected && isMoreThanOneSelected ? 'global' : this.uniqueId\n\n\t\t\t// Prevent any browser defaults\n\t\t\tevent.preventDefault()\n\t\t\tevent.stopPropagation()\n\t\t},\n\n\t\tt: translate,\n\t\tformatFileSize,\n\t},\n})\n<\/script>\n\n<style scoped lang='scss'>\n/* Hover effect on tbody lines only */\ntr {\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\tbackground-color: var(--color-background-dark);\n\t}\n}\n\n/* Preview not loaded animation effect */\n.files-list__row-icon-preview:not([style*='background']) {\n background: var(--color-loading-dark);\n\t// animation: preview-gradient-fade 1.2s ease-in-out infinite;\n}\n</style>\n\n<style>\n/* @keyframes preview-gradient-fade {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n 100% {\n opacity: 1;\n }\n} */\n</style>\n"],sourceRoot:""}]);const a=r}},i={};function o(t){var e=i[t];if(void 0!==e)return e.exports;var s=i[t]={id:t,loaded:!1,exports:{}};return n[t].call(s.exports,s,s.exports,o),s.loaded=!0,s.exports}o.m=n,e=[],o.O=(t,n,i,s)=>{if(!n){var r=1/0;for(d=0;d<e.length;d++){n=e[d][0],i=e[d][1],s=e[d][2];for(var a=!0,l=0;l<n.length;l++)(!1&s||r>=s)&&Object.keys(o.O).every((t=>o.O[t](n[l])))?n.splice(l--,1):(a=!1,s<r&&(r=s));if(a){e.splice(d--,1);var c=i();void 0!==c&&(t=c)}}return t}s=s||0;for(var d=e.length;d>0&&e[d-1][2]>s;d--)e[d]=e[d-1];e[d]=[n,i,s]},o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),o.j=2181,(()=>{o.b=document.baseURI||self.location.href;var t={2181:0};o.O.j=e=>0===t[e];var e=(e,n)=>{var i,s,r=n[0],a=n[1],l=n[2],c=0;if(r.some((e=>0!==t[e]))){for(i in a)o.o(a,i)&&(o.m[i]=a[i]);if(l)var d=l(o)}for(e&&e(n);c<r.length;c++)s=r[c],o.o(t,s)&&t[s]&&t[s][0](),t[s]=0;return o.O(d)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))})(),o.nc=void 0;var s=o.O(void 0,[7874],(()=>o(18482)));s=o.O(s)})(); -//# sourceMappingURL=files-main.js.map?v=076cc8adafbfb8f84978
\ No newline at end of file +(()=>{"use strict";var e,n={7867:(e,n,i)=>{var o=i(17499),s=i(79954),r=i(31352),a=i(79753),l=i(45994);const c=function(){var t,e,n,i;const o=(null===(t=OCA)||void 0===t||null===(e=t.Files)||void 0===e||null===(n=e.App)||void 0===n||null===(i=n.currentFileList)||void 0===i?void 0:i.dirInfo)||{path:"/",name:""};return"".concat(o.path,"/").concat(o.name).replace(/\/\//gi,"/")};var d=i(4820),u=i(20144),p=i(62520),h=i(64024),f=i(93455),A=i.n(f),v=i(70110),m=i.n(v);const g=256,w={name:"TemplatePreview",inheritAttrs:!1,props:{basename:{type:String,required:!0},checked:{type:Boolean,default:!1},fileid:{type:[String,Number],required:!0},filename:{type:String,required:!0},previewUrl:{type:String,default:null},hasPreview:{type:Boolean,default:!0},mime:{type:String,required:!0},ratio:{type:Number,default:null}},data:()=>({failedPreview:!1}),computed:{nameWithoutExt(){return this.basename.indexOf(".")>-1?this.basename.split(".").slice(0,-1).join("."):this.basename},id(){return"template-picker-".concat(this.fileid)},realPreviewUrl(){return this.failedPreview&&this.mimeIcon?this.mimeIcon:this.previewUrl?this.previewUrl:(0,l.ts)()?(0,a.generateUrl)("/core/preview?fileId=".concat(this.fileid,"&x=").concat(g,"&y=").concat(g,"&a=1")):(0,a.generateUrl)("/apps/files_sharing/publicpreview/".concat(document.getElementById("sharingToken")&&document.getElementById("sharingToken").value,"?fileId=").concat(this.fileid,"&file=").concat(function(t){const e=(t.startsWith("/")?t:"/".concat(t)).split("/");let n="";return e.forEach((t=>{""!==t&&(n+="/"+encodeURIComponent(t))})),n}(this.filename),"&x=").concat(g,"&y=").concat(g,"&a=1"))},mimeIcon(){return OC.MimeType.getIconUrl(this.mime)}},methods:{onCheck(){this.$emit("check",this.fileid)},onFailure(){this.failedPreview=!0}}};var C=i(93379),b=i.n(C),y=i(7795),_=i.n(y),x=i(90569),S=i.n(x),k=i(3565),N=i.n(k),I=i(19216),E=i.n(I),F=i(44589),B=i.n(F),P=i(3491),z={};z.styleTagTransform=B(),z.setAttributes=N(),z.insert=S().bind(null,"head"),z.domAPI=_(),z.insertStyleElement=E(),b()(P.Z,z),P.Z&&P.Z.locals&&P.Z.locals;var T=i(51900);const L=(0,T.Z)(w,(function(){var t=this,e=t._self._c;return e("li",{staticClass:"template-picker__item"},[e("input",{staticClass:"radio",attrs:{id:t.id,type:"radio",name:"template-picker"},domProps:{checked:t.checked},on:{change:t.onCheck}}),t._v(" "),e("label",{staticClass:"template-picker__label",attrs:{for:t.id}},[e("div",{staticClass:"template-picker__preview",class:t.failedPreview?"template-picker__preview--failed":""},[e("img",{staticClass:"template-picker__image",attrs:{src:t.realPreviewUrl,alt:"",draggable:"false"},on:{error:t.onFailure}})]),t._v(" "),e("span",{staticClass:"template-picker__title"},[t._v("\n\t\t\t"+t._s(t.nameWithoutExt)+"\n\t\t")])])])}),[],!1,null,"6c072a31",null).exports;var U=i(25108);const V={name:"TemplatePicker",components:{NcEmptyContent:A(),NcModal:m(),TemplatePreview:L},props:{logger:{type:Object,required:!0}},data:()=>({checked:-1,loading:!1,name:null,opened:!1,provider:null}),computed:{nameWithoutExt(){return this.name.indexOf(".")>-1?this.name.split(".").slice(0,-1).join("."):this.name},emptyTemplate(){var e,n;return{basename:t("files","Blank"),fileid:-1,filename:this.t("files","Blank"),hasPreview:!1,mime:(null===(e=this.provider)||void 0===e?void 0:e.mimetypes[0])||(null===(n=this.provider)||void 0===n?void 0:n.mimetypes)}},selectedTemplate(){return this.provider.templates.find((t=>t.fileid===this.checked))},style(){return{"--margin":"8px","--width":"160px","--border":"2px","--fullwidth":"180px","--height":this.provider.ratio?Math.round(160/this.provider.ratio)+"px":null}}},methods:{async open(t,e){this.checked=this.emptyTemplate.fileid,this.name=t,this.provider=e;const n=(await async function(){return(await d.default.get((0,a.generateOcsUrl)("apps/files/api/v1/templates"))).data.ocs.data}()).find((t=>t.app===e.app&&t.label===e.label));if(null===n)throw new Error("Failed to match provider in results");this.provider=n,0!==n.templates.length?this.opened=!0:this.onSubmit()},close(){this.checked=this.emptyTemplate.fileid,this.loading=!1,this.name=null,this.opened=!1,this.provider=null},onCheck(t){this.checked=t},async onSubmit(){var t,e,n;this.loading=!0;const i=c(),o=null===(t=OCA)||void 0===t||null===(e=t.Files)||void 0===e||null===(n=e.App)||void 0===n?void 0:n.currentFileList;var s,r;this.nameWithoutExt===this.name&&(this.logger.debug("Fixed invalid filename",{name:this.name,extension:null===(s=this.provider)||void 0===s?void 0:s.extension}),this.name=this.name+(null===(r=this.provider)||void 0===r?void 0:r.extension));try{var l,u;const t=await async function(t,e,n){return(await d.default.post((0,a.generateOcsUrl)("apps/files/api/v1/templates/create"),{filePath:t,templatePath:e,templateType:n})).data.ocs.data}((0,p.normalize)("".concat(i,"/").concat(this.name)),null===(l=this.selectedTemplate)||void 0===l?void 0:l.filename,null===(u=this.selectedTemplate)||void 0===u?void 0:u.templateType);this.logger.debug("Created new file",t);const e=await(null==o?void 0:o.addAndFetchFileInfo(this.name).then(((t,e)=>e))),n=new OCA.Files.FileInfoModel(e,{filesClient:null==o?void 0:o.filesClient}),s=OCA.Files.fileActions.getDefaultFileAction(t.mime,"file",OC.PERMISSION_ALL);s&&s.action(t.basename,{$file:null==o?void 0:o.findFileEl(this.name),dir:i,fileList:o,fileActions:null==o?void 0:o.fileActions,fileInfoModel:n}),this.close()}catch(t){this.logger.error("Error while creating the new file from template"),U.error(t),(0,h.x2)(this.t("files","Unable to create new file from template"))}finally{this.loading=!1}}}};var D=i(5103),O={};O.styleTagTransform=B(),O.setAttributes=N(),O.insert=S().bind(null,"head"),O.domAPI=_(),O.insertStyleElement=E(),b()(D.Z,O),D.Z&&D.Z.locals&&D.Z.locals;const Z=(0,T.Z)(V,(function(){var t=this,e=t._self._c;return t.opened?e("NcModal",{staticClass:"templates-picker",attrs:{"clear-view-delay":-1,size:"normal"},on:{close:t.close}},[e("form",{staticClass:"templates-picker__form",style:t.style,on:{submit:function(e){return e.preventDefault(),e.stopPropagation(),t.onSubmit.apply(null,arguments)}}},[e("h2",[t._v(t._s(t.t("files","Pick a template for {name}",{name:t.nameWithoutExt})))]),t._v(" "),e("ul",{staticClass:"templates-picker__list"},[e("TemplatePreview",t._b({attrs:{checked:t.checked===t.emptyTemplate.fileid},on:{check:t.onCheck}},"TemplatePreview",t.emptyTemplate,!1)),t._v(" "),t._l(t.provider.templates,(function(n){return e("TemplatePreview",t._b({key:n.fileid,attrs:{checked:t.checked===n.fileid,ratio:t.provider.ratio},on:{check:t.onCheck}},"TemplatePreview",n,!1))}))],2),t._v(" "),e("div",{staticClass:"templates-picker__buttons"},[e("button",{on:{click:t.close}},[t._v("\n\t\t\t\t"+t._s(t.t("files","Cancel"))+"\n\t\t\t")]),t._v(" "),e("input",{staticClass:"primary",attrs:{type:"submit","aria-label":t.t("files","Create a new file with the selected template")},domProps:{value:t.t("files","Create")}})])]),t._v(" "),t.loading?e("NcEmptyContent",{staticClass:"templates-picker__loading",attrs:{icon:"icon-loading"}},[t._v("\n\t\t"+t._s(t.t("files","Creating file"))+"\n\t")]):t._e()],1):t._e()}),[],!1,null,"715b4161",null).exports,R=(0,o.IY)().setApp("files").detectUser().build();u.default.mixin({methods:{t:r.Iu,n:r.uN}});const q=document.createElement("div");q.id="template-picker",document.body.appendChild(q);let j=(0,s.j)("files","templates",[]),M=(0,s.j)("files","templates_path",!1);R.debug("Templates providers",j),R.debug("Templates folder",{templatesPath:M});const $=new(u.default.extend(Z))({name:"TemplatePicker",propsData:{logger:R}});$.$mount("#template-picker"),window.addEventListener("DOMContentLoaded",(function(){if(!M){R.debug("Templates folder not initialized");const t={attach(t){t.addMenuEntry({id:"template-init",displayName:(0,r.Iu)("files","Set up templates folder"),templateName:(0,r.Iu)("files","Templates"),iconClass:"icon-template-add",fileType:"file",actionHandler(e){W(e),t.removeMenuEntry("template-init")}})}};OC.Plugins.register("OCA.Files.NewFileMenu",t)}})),j.forEach(((t,e)=>{const n={attach(n){const i=n.fileList;"files"!==i.id&&"files.public"!==i.id||n.addMenuEntry({id:"template-new-".concat(t.app,"-").concat(e),displayName:t.label,templateName:t.label+t.extension,iconClass:t.iconClass||"icon-file",fileType:"file",actionHandler(e){$.open(e,t)}})}};OC.Plugins.register("OCA.Files.NewFileMenu",n)}));const W=async function(t){const e=(c()+"/".concat(t)).replace("//","/");try{R.debug("Initializing the templates directory",{templatePath:e});const t=await d.default.post((0,a.generateOcsUrl)("apps/files/api/v1/templates/path"),{templatePath:e,copySystemTemplates:!0});OCA.Files.App.currentFileList.changeDirectory(e,!0,!0),j=t.data.ocs.data.templates,M=t.data.ocs.data.template_path}catch(t){R.error("Unable to initialize the templates directory"),(0,h.x2)((0,r.Iu)("files","Unable to initialize the templates directory"))}};var G=i(78595);!function(){const t={attach(t){(0,G.Ld)("nextcloud:unified-search.search",(e=>{let{query:n}=e;t.setFilter(n)})),(0,G.Ld)("nextcloud:unified-search.reset",(()=>{this.query=null,t.setFilter("")}))}};window.OC.Plugins.register("OCA.Files.FileList",t)}();var H=i(91770),K=i(78510);const Q=(0,o.IY)().setApp("files").detectUser().build();const Y=function(){return window._nc_fileactions||[]};var J;J=new class{constructor(t){var e,n,i;e=this,i=void 0,(n=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var i=n.call(t,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:String(e)}(n="_action"))in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i,this.validateAction(t),this._action=t}get id(){return this._action.id}get displayName(){return this._action.displayName}get iconSvgInline(){return this._action.iconSvgInline}get enabled(){return this._action.enabled}get exec(){return this._action.exec}get execBatch(){return this._action.execBatch}get order(){return this._action.order}get default(){return this._action.default}get inline(){return this._action.inline}get renderInline(){return this._action.renderInline}validateAction(t){if(!t.id||"string"!=typeof t.id)throw new Error("Invalid id");if(!t.displayName||"function"!=typeof t.displayName)throw new Error("Invalid displayName function");if(!t.iconSvgInline||"function"!=typeof t.iconSvgInline)throw new Error("Invalid iconSvgInline function");if(!t.exec||"function"!=typeof t.exec)throw new Error("Invalid exec function");if("enabled"in t&&"function"!=typeof t.enabled)throw new Error("Invalid enabled function");if("execBatch"in t&&"function"!=typeof t.execBatch)throw new Error("Invalid execBatch function");if("order"in t&&"number"!=typeof t.order)throw new Error("Invalid order");if("default"in t&&"boolean"!=typeof t.default)throw new Error("Invalid default");if("inline"in t&&"function"!=typeof t.inline)throw new Error("Invalid inline function");if("renderInline"in t&&"function"!=typeof t.renderInline)throw new Error("Invalid renderInline function")}}({id:"delete",displayName:(t,e)=>"trashbin"===e.id?(0,r.Iu)("files_trashbin","Delete permanently"):(0,r.Iu)("files","Delete"),iconSvgInline:()=>K,enabled:t=>t.length>0&&t.map((t=>t.permissions)).every((t=>0!=(t&H.y3.DELETE))),async exec(t){try{return await d.default.delete(t.source),(0,G.j8)("files:node:deleted",t),!0}catch(e){return Q.error("Error while deleting a file",{error:e,source:t.source,node:t}),!1}},async execBatch(t,e){return Promise.all(t.map((t=>this.exec(t,e))))},order:100}),void 0===window._nc_fileactions&&(window._nc_fileactions=[],Q.debug("FileActions initialized")),window._nc_fileactions.find((t=>t.id===J.id))?Q.error("FileAction ".concat(J.id," already registered"),{action:J}):window._nc_fileactions.push(J);const X=function(t){let{id:e,name:n,order:i,icon:o,parent:s,classes:r="",expanded:a,params:l}=t;OCP.Files.Navigation.register({id:e,name:n,order:i,params:l,parent:s,expanded:!0===a,iconClass:o?"icon-".concat(o):"nav-icon-"+e,legacy:!0,sticky:r.includes("pinned")})};var tt=i(59305),et=i(41487),nt=i.n(et);function it(t,e,n){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var i=n.call(t,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}const ot=class{constructor(){it(this,"_views",[]),it(this,"_currentView",null),Q.debug("Navigation service initialized")}register(t){try{rt(t),st(t,this._views)}catch(e){throw e instanceof Error&&Q.error(e.message,{view:t}),e}t.legacy&&Q.warn("Legacy view detected, please migrate to Vue"),t.iconClass&&(t.legacy=!0),this._views.push(t)}get views(){return this._views}setActive(t){this._currentView=t}get active(){return this._currentView}},st=function(t,e){if(e.find((e=>e.id===t.id)))throw new Error("Navigation id ".concat(t.id," is already registered"));return!0},rt=function(t){if(!t.id||"string"!=typeof t.id)throw new Error("Navigation id is required and must be a string");if(!t.name||"string"!=typeof t.name)throw new Error("Navigation name is required and must be a string");if(!t.legacy){if(!t.getContents||"function"!=typeof t.getContents)throw new Error("Navigation getContents is required and must be a function");if(!t.icon||"string"!=typeof t.icon||!nt()(t.icon))throw new Error("Navigation icon is required and must be a valid svg string")}if(!("order"in t)||"number"!=typeof t.order)throw new Error("Navigation order is required and must be a number");if(t.columns&&t.columns.forEach(at),t.emptyView&&"function"!=typeof t.emptyView)throw new Error("Navigation emptyView must be a function");if(t.parent&&"string"!=typeof t.parent)throw new Error("Navigation parent must be a string");if("sticky"in t&&"boolean"!=typeof t.sticky)throw new Error("Navigation sticky must be a boolean");if("expanded"in t&&"boolean"!=typeof t.expanded)throw new Error("Navigation expanded must be a boolean");if(t.defaultSortKey&&"string"!=typeof t.defaultSortKey)throw new Error("Navigation defaultSortKey must be a string");return!0},at=function(t){if(!t.id||"string"!=typeof t.id)throw new Error("A column id is required");if(!t.title||"string"!=typeof t.title)throw new Error("A column title is required");if(!t.render||"function"!=typeof t.render)throw new Error("A render function is required");if(t.sort&&"function"!=typeof t.sort)throw new Error("Column sortFunction must be a function");if(t.summary&&"function"!=typeof t.summary)throw new Error("Column summary must be a function");return!0};var lt=i(57638),ct=i(55209),dt=i.n(ct),ut=i(14032),pt=i.n(ut),ht=i(91211),ft=i.n(ht);const At=(0,s.j)("files","viewConfigs",{}),vt=function(){const t=(0,tt.Q_)("viewconfig",{state:()=>({viewConfig:At}),getters:{getConfig:t=>e=>t.viewConfig[e]||{}},actions:{onUpdate(t,e,n){this.viewConfig[t]||u.default.set(this.viewConfig,t,{}),u.default.set(this.viewConfig[t],e,n)},async update(t,e,n){d.default.put((0,a.generateUrl)("/apps/files/api/v1/views/".concat(t,"/").concat(e)),{value:n}),(0,G.j8)("files:viewconfig:updated",{view:t,key:e,value:n})},setSortingBy(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"basename",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"files";this.update(e,"sorting_mode",t),this.update(e,"sorting_direction","asc")},toggleSortingDirection(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"files";const e="asc"===(this.getConfig(t)||{sorting_direction:"asc"}).sorting_direction?"desc":"asc";this.update(t,"sorting_direction",e)}}}),e=t(...arguments);return e._initialized||((0,G.Ld)("files:viewconfig:updated",(function(t){let{view:n,key:i,value:o}=t;e.onUpdate(n,i,o)})),e._initialized=!0),e};var mt=i(28615),gt=i(74184),wt=i(48959),Ct=i.n(wt);const bt={name:"NavigationQuota",components:{ChartPie:gt.Z,NcAppNavigationItem:pt(),NcProgressBar:Ct()},data:()=>({loadingStorageStats:!1,storageStats:(0,s.j)("files","storageStats",null)}),computed:{storageStatsTitle(){var t,e,n;const i=(0,H.sS)(null===(t=this.storageStats)||void 0===t?void 0:t.used),o=(0,H.sS)(null===(e=this.storageStats)||void 0===e?void 0:e.quota);return(null===(n=this.storageStats)||void 0===n?void 0:n.quota)<0?this.t("files","{usedQuotaByte} used",{usedQuotaByte:i}):this.t("files","{used} of {quota} used",{used:i,quota:o})},storageStatsTooltip(){return this.storageStats.relative?this.t("files","{relative}% used",this.storageStats):""}},beforeMount(){setInterval(this.throttleUpdateStorageStats,6e4),(0,G.Ld)("files:node:created",this.throttleUpdateStorageStats),(0,G.Ld)("files:node:deleted",this.throttleUpdateStorageStats),(0,G.Ld)("files:node:moved",this.throttleUpdateStorageStats),(0,G.Ld)("files:node:updated",this.throttleUpdateStorageStats)},methods:{debounceUpdateStorageStats:(0,mt.D)(200,(function(t){this.updateStorageStats(t)})),throttleUpdateStorageStats:(0,mt.P)(1e3,(function(t){this.updateStorageStats(t)})),async updateStorageStats(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if(!this.loadingStorageStats){this.loadingStorageStats=!0;try{var n;const t=await d.default.get((0,a.generateUrl)("/apps/files/api/v1/stats"));if(null==t||null===(n=t.data)||void 0===n||!n.data)throw new Error("Invalid storage stats");this.storageStats=t.data.data}catch(n){Q.error("Could not refresh storage stats",{error:n}),e&&(0,h.x2)(t("files","Could not refresh storage stats"))}finally{this.loadingStorageStats=!1}}},t:r.Iu}};var yt=i(93582),_t={};_t.styleTagTransform=B(),_t.setAttributes=N(),_t.insert=S().bind(null,"head"),_t.domAPI=_(),_t.insertStyleElement=E(),b()(yt.Z,_t),yt.Z&&yt.Z.locals&&yt.Z.locals;const xt=(0,T.Z)(bt,(function(){var t=this,e=t._self._c;return t.storageStats?e("NcAppNavigationItem",{staticClass:"app-navigation-entry__settings-quota",class:{"app-navigation-entry__settings-quota--not-unlimited":t.storageStats.quota>=0},attrs:{"aria-label":t.t("files","Storage informations"),loading:t.loadingStorageStats,name:t.storageStatsTitle,title:t.storageStatsTooltip,"data-cy-files-navigation-settings-quota":""},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.debounceUpdateStorageStats.apply(null,arguments)}}},[e("ChartPie",{attrs:{slot:"icon",size:20},slot:"icon"}),t._v(" "),t.storageStats.quota>=0?e("NcProgressBar",{attrs:{slot:"extra",error:t.storageStats.relative>80,value:Math.min(t.storageStats.relative,100)},slot:"extra"}):t._e()],1):t._e()}),[],!1,null,"918797b2",null).exports;var St=i(68988),kt=i.n(St),Nt=i(16809),It=i.n(Nt),Et=i(20571),Ft=i.n(Et),Bt=i(70386),Pt=i(36029),zt=i.n(Pt);const Tt={name:"Setting",props:{el:{type:Function,required:!0}},mounted(){this.$el.appendChild(this.el())}},Lt=(0,T.Z)(Tt,(function(){return(0,this._self._c)("div")}),[],!1,null,null,null).exports,Ut=(0,s.j)("files","config",{show_hidden:!1,crop_image_previews:!0}),Vt=function(){const t=(0,tt.Q_)("userconfig",{state:()=>({userConfig:Ut}),actions:{onUpdate(t,e){u.default.set(this.userConfig,t,e)},async update(t,e){await d.default.put((0,a.generateUrl)("/apps/files/api/v1/config/"+t),{value:e}),(0,G.j8)("files:config:updated",{key:t,value:e})}}})(...arguments);return t._initialized||((0,G.Ld)("files:config:updated",(function(e){let{key:n,value:i}=e;t.onUpdate(n,i)})),t._initialized=!0),t},Dt={name:"Settings",components:{Clipboard:Bt.Z,NcAppSettingsDialog:kt(),NcAppSettingsSection:It(),NcCheckboxRadioSwitch:Ft(),NcInputField:zt(),Setting:Lt},props:{open:{type:Boolean,default:!1}},setup:()=>({userConfigStore:Vt()}),data(){var t,e,n,i;return{settings:(null===(t=window.OCA)||void 0===t||null===(e=t.Files)||void 0===e||null===(n=e.Settings)||void 0===n?void 0:n.settings)||[],webdavUrl:(0,a.generateRemoteUrl)("dav/files/"+encodeURIComponent(null===(i=(0,l.ts)())||void 0===i?void 0:i.uid)),webdavDocs:"https://docs.nextcloud.com/server/stable/go.php?to=user-webdav",appPasswordUrl:(0,a.generateUrl)("/settings/user/security#generate-app-token-section"),webdavUrlCopied:!1}},computed:{userConfig(){return this.userConfigStore.userConfig}},beforeMount(){this.settings.forEach((t=>t.open()))},beforeDestroy(){this.settings.forEach((t=>t.close()))},methods:{onClose(){this.$emit("close")},setConfig(t,e){this.userConfigStore.update(t,e)},async copyCloudId(){document.querySelector("input#webdav-url-input").select(),navigator.clipboard?(await navigator.clipboard.writeText(this.webdavUrl),this.webdavUrlCopied=!0,(0,h.s$)(t("files","WebDAV URL copied to clipboard")),setTimeout((()=>{this.webdavUrlCopied=!1}),5e3)):(0,h.x2)(t("files","Clipboard is not available"))},t:r.Iu}},Ot=Dt;var Zt=i(35662),Rt={};Rt.styleTagTransform=B(),Rt.setAttributes=N(),Rt.insert=S().bind(null,"head"),Rt.domAPI=_(),Rt.insertStyleElement=E(),b()(Zt.Z,Rt),Zt.Z&&Zt.Z.locals&&Zt.Z.locals;const qt=(0,T.Z)(Ot,(function(){var t=this,e=t._self._c;return e("NcAppSettingsDialog",{attrs:{open:t.open,"show-navigation":!0,title:t.t("files","Files settings")},on:{"update:open":t.onClose}},[e("NcAppSettingsSection",{attrs:{id:"settings",title:t.t("files","Files settings")}},[e("NcCheckboxRadioSwitch",{attrs:{checked:t.userConfig.show_hidden},on:{"update:checked":function(e){return t.setConfig("show_hidden",e)}}},[t._v("\n\t\t\t"+t._s(t.t("files","Show hidden files"))+"\n\t\t")]),t._v(" "),e("NcCheckboxRadioSwitch",{attrs:{checked:t.userConfig.crop_image_previews},on:{"update:checked":function(e){return t.setConfig("crop_image_previews",e)}}},[t._v("\n\t\t\t"+t._s(t.t("files","Crop image previews"))+"\n\t\t")])],1),t._v(" "),0!==t.settings.length?e("NcAppSettingsSection",{attrs:{id:"more-settings",title:t.t("files","Additional settings")}},[t._l(t.settings,(function(t){return[e("Setting",{key:t.name,attrs:{el:t.el}})]}))],2):t._e(),t._v(" "),e("NcAppSettingsSection",{attrs:{id:"webdav",title:t.t("files","WebDAV")}},[e("NcInputField",{attrs:{id:"webdav-url-input","show-trailing-button":!0,success:t.webdavUrlCopied,"trailing-button-label":t.t("files","Copy to clipboard"),value:t.webdavUrl,readonly:"readonly",type:"url"},on:{focus:function(t){return t.target.select()},"trailing-button-click":t.copyCloudId},scopedSlots:t._u([{key:"trailing-button-icon",fn:function(){return[e("Clipboard",{attrs:{size:20}})]},proxy:!0}])}),t._v(" "),e("em",[e("a",{staticClass:"setting-link",attrs:{href:t.webdavDocs,target:"_blank",rel:"noreferrer noopener"}},[t._v("\n\t\t\t\t"+t._s(t.t("files","Use this address to access your Files via WebDAV"))+" ↗\n\t\t\t")])]),t._v(" "),e("br"),t._v(" "),e("em",[e("a",{staticClass:"setting-link",attrs:{href:t.appPasswordUrl}},[t._v("\n\t\t\t\t"+t._s(t.t("files","If you have enabled 2FA, you must create and use a new app password by clicking here."))+" ↗\n\t\t\t")])])],1)],1)}),[],!1,null,"76ca5d1f",null).exports,jt={name:"Navigation",components:{Cog:lt.default,NavigationQuota:xt,NcAppNavigation:dt(),NcAppNavigationItem:pt(),NcIconSvgWrapper:ft(),SettingsModal:qt},props:{Navigation:{type:ot,required:!0}},setup:()=>({viewConfigStore:vt()}),data:()=>({settingsOpened:!1}),computed:{currentViewId(){var t,e;return(null===(t=this.$route)||void 0===t||null===(e=t.params)||void 0===e?void 0:e.view)||"files"},currentView(){return this.views.find((t=>t.id===this.currentViewId))},views(){return this.Navigation.views},parentViews(){return this.views.filter((t=>!t.parent)).sort(((t,e)=>t.order-e.order))},childViews(){return this.views.filter((t=>!!t.parent)).reduce(((t,e)=>(t[e.parent]=[...t[e.parent]||[],e],t[e.parent].sort(((t,e)=>t.order-e.order)),t)),{})}},watch:{currentView(t,e){(null==t?void 0:t.id)!==(null==e?void 0:e.id)&&(this.Navigation.setActive(t),Q.debug("Navigation changed",{id:t.id,view:t}),this.showView(t,e))}},beforeMount(){this.currentView&&(Q.debug("Navigation mounted. Showing requested view",{view:this.currentView}),this.showView(this.currentView)),(0,G.Ld)("files:legacy-navigation:changed",this.onLegacyNavigationChanged),(0,G.Ld)("files:legacy-view:initialized",(()=>{Q.debug("Legacy view initialized",{...this.currentView}),this.showView(this.currentView)}))},methods:{showView(t,e){var n,i,o,s,r;if(null===(n=window)||void 0===n||null===(i=n.OCA)||void 0===i||null===(o=i.Files)||void 0===o||null===(s=o.Sidebar)||void 0===s||null===(r=s.close)||void 0===r||r.call(s),null!=t&&t.legacy){const e=document.querySelector("#app-content #app-content-"+this.currentView.id+".viewcontainer");document.querySelectorAll("#app-content .viewcontainer").forEach((t=>{t.classList.add("hidden")})),e.classList.remove("hidden");const{dir:n="/"}=OC.Util.History.parseUrlQuery(),i={itemId:t.id,dir:n};Q.debug("Triggering legacy navigation event",i),window.jQuery(e).trigger(new window.jQuery.Event("show",i)),window.jQuery(e).trigger(new window.jQuery.Event("urlChanged",i))}this.Navigation.setActive(t),function(t){const e=document.getElementById("page-heading-level-1");e&&(e.textContent=t)}(t.name),(0,G.j8)("files:navigation:changed",t)},onLegacyNavigationChanged(){let{id:t}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{id:"files"};const e=this.Navigation.views.find((e=>e.id===t));e&&e.legacy&&e.id!==this.currentView.id&&(this.$router.replace({...this.$route,params:{view:e.id}}),this.Navigation.setActive(e),this.showView(e))},onToggleExpand(t){const e=this.isExpanded(t);t.expanded=!e,this.viewConfigStore.update(t.id,"expanded",!e)},isExpanded(t){var e;return"boolean"==typeof(null===(e=this.viewConfigStore.getConfig(t.id))||void 0===e?void 0:e.expanded)?!0===this.viewConfigStore.getConfig(t.id).expanded:!0===t.expanded},generateToNavigation(t){if(t.params){const{dir:e,fileid:n}=t.params;return{name:"filelist",params:t.params,query:{dir:e,fileid:n}}}return{name:"filelist",params:{view:t.id}}},openSettings(){this.settingsOpened=!0},onSettingsClose(){this.settingsOpened=!1},t:r.Iu}},Mt=jt;var $t=i(41675),Wt={};Wt.styleTagTransform=B(),Wt.setAttributes=N(),Wt.insert=S().bind(null,"head"),Wt.domAPI=_(),Wt.insertStyleElement=E(),b()($t.Z,Wt),$t.Z&&$t.Z.locals&&$t.Z.locals;const Gt=(0,T.Z)(Mt,(function(){var t=this,e=t._self._c;return e("NcAppNavigation",{attrs:{"data-cy-files-navigation":""},scopedSlots:t._u([{key:"list",fn:function(){return t._l(t.parentViews,(function(n){return e("NcAppNavigationItem",{key:n.id,attrs:{"allow-collapse":!0,"data-cy-files-navigation-item":n.id,icon:n.iconClass,open:t.isExpanded(n),pinned:n.sticky,title:n.name,to:t.generateToNavigation(n)},on:{"update:open":function(e){return t.onToggleExpand(n)}}},[n.icon?e("NcIconSvgWrapper",{attrs:{slot:"icon",svg:n.icon},slot:"icon"}):t._e(),t._v(" "),t._l(t.childViews[n.id],(function(i){return e("NcAppNavigationItem",{key:i.id,attrs:{"data-cy-files-navigation-item":i.id,exact:!0,icon:i.iconClass,title:i.name,to:t.generateToNavigation(i)}},[n.icon?e("NcIconSvgWrapper",{attrs:{slot:"icon",svg:n.icon},slot:"icon"}):t._e()],1)}))],2)}))},proxy:!0},{key:"footer",fn:function(){return[e("ul",{staticClass:"app-navigation-entry__settings"},[e("NavigationQuota"),t._v(" "),e("NcAppNavigationItem",{attrs:{"aria-label":t.t("files","Open the files app settings"),title:t.t("files","Files settings"),"data-cy-files-navigation-settings-button":""},on:{click:function(e){return e.preventDefault(),e.stopPropagation(),t.openSettings.apply(null,arguments)}}},[e("Cog",{attrs:{slot:"icon",size:20},slot:"icon"})],1)],1)]},proxy:!0}])},[t._v(" "),t._v(" "),e("SettingsModal",{attrs:{open:t.settingsOpened,"data-cy-files-navigation-settings":""},on:{close:t.onSettingsClose}})],1)}),[],!1,null,"508e08a4",null).exports;var Ht=i(23664),Kt=i(69680),Qt=i.n(Kt),Yt=i(10861),Jt=i.n(Yt),Xt=i(64192),te=i.n(Xt),ee=i(33581);const ne=function(){const t=(0,tt.Q_)("files",{state:()=>({files:{},roots:{}}),getters:{getNode:t=>e=>t.files[e],getNodes:t=>e=>e.map((e=>t.files[e])).filter(Boolean),getRoot:t=>e=>t.roots[e]},actions:{updateNodes(t){const e=t.reduce(((t,e)=>e.attributes.fileid?(t[e.attributes.fileid]=e,t):(Q.warn("Trying to update/set a node without fileid",e),t)),{});u.default.set(this,"files",{...this.files,...e})},deleteNodes(t){t.forEach((t=>{t.fileid&&u.default.delete(this.files,t.fileid)}))},setRoot(t){let{service:e,root:n}=t;u.default.set(this.roots,e,n)},onDeletedNode(t){this.deleteNodes([t])}}})(...arguments);return t._initialized||((0,G.Ld)("files:node:deleted",t.onDeletedNode),t._initialized=!0),t},ie=function(){const t=(0,tt.Q_)("paths",{state:()=>({}),getters:{getPath:t=>(e,n)=>{if(t[e])return t[e][n]}},actions:{addPath(t){this[t.service]||u.default.set(this,t.service,{}),u.default.set(this[t.service],t.path,t.fileid)}}})(...arguments);return t._initialized||(t._initialized=!0),t},oe=(0,tt.Q_)("selection",{state:()=>({selected:[],lastSelection:[],lastSelectedIndex:null}),actions:{set(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];u.default.set(this,"selected",t)},setLastIndex(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;u.default.set(this,"lastSelection",t?this.selected:[]),u.default.set(this,"lastSelectedIndex",t)},reset(){u.default.set(this,"selected",[]),u.default.set(this,"lastSelection",[]),u.default.set(this,"lastSelectedIndex",null)}}});var se=i(15764),re=i(64412),ae=i.n(re),le=i(44706),ce=i.n(le);const de=u.default.extend({name:"BreadCrumbs",components:{Home:se.Z,NcBreadcrumbs:ce(),NcBreadcrumb:ae()},props:{path:{type:String,default:"/"}},setup:()=>({filesStore:ne(),pathsStore:ie()}),computed:{currentView(){return this.$navigation.active},dirs(){var t;return["/",...this.path.split("/").filter(Boolean).map((t="/",e=>t+="".concat(e,"/"))).map((t=>t.replace(/^(.+)\/$/,"$1")))]},sections(){return this.dirs.map((t=>{const e={...this.$route,query:{dir:t}};return{dir:t,exact:!0,name:this.getDirDisplayName(t),to:e}}))}},methods:{getNodeFromId(t){return this.filesStore.getNode(t)},getFileIdFromPath(t){var e;return this.pathsStore.getPath(null===(e=this.currentView)||void 0===e?void 0:e.id,t)},getDirDisplayName(e){var n;if("/"===e)return t("files","Home");const i=this.getFileIdFromPath(e),o=this.getNodeFromId(i);return(null==o||null===(n=o.attributes)||void 0===n?void 0:n.displayName)||(0,p.basename)(e)},onClick(t){var e;(null==t||null===(e=t.query)||void 0===e?void 0:e.dir)===this.$route.query.dir&&this.$emit("reload")},ariaLabel(e){var n,i;return(null==e||null===(n=e.to)||void 0===n||null===(i=n.query)||void 0===i?void 0:i.dir)===this.$route.query.dir?t("files","Reload current directory"):t("files",'Go to the "{dir}" directory',e)}}});var ue=i(39959),pe={};pe.styleTagTransform=B(),pe.setAttributes=N(),pe.insert=S().bind(null,"head"),pe.domAPI=_(),pe.insertStyleElement=E(),b()(ue.Z,pe),ue.Z&&ue.Z.locals&&ue.Z.locals;const he=(0,T.Z)(de,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("NcBreadcrumbs",{attrs:{"data-cy-files-content-breadcrumbs":""}},t._l(t.sections,(function(n,i){return e("NcBreadcrumb",t._b({key:n.dir,attrs:{"aria-label":t.ariaLabel(n),title:t.ariaLabel(n)},nativeOn:{click:function(e){return t.onClick(n.to)}},scopedSlots:t._u([0===i?{key:"icon",fn:function(){return[e("Home",{attrs:{size:20}})]},proxy:!0}:null],null,!0)},"NcBreadcrumb",n,!1))})),1)}),[],!1,null,"68b3b20b",null).exports;var fe=i(35212),Ae=i(20296),ve=i(74139),me=i(3443),ge=i.n(me),we=i(79855),Ce=i(34829),be=i(45400),ye=i.n(be),_e=i(12945),xe=i.n(_e);const Se=(0,tt.Q_)("actionsmenu",{state:()=>({opened:null})}),ke={name:"CustomElementRender",props:{source:{type:Object,required:!0},currentView:{type:Object,required:!0},render:{type:Function,required:!0}},computed:{element(){return this.render(this.source,this.currentView)}},watch:{element(){this.$el.replaceWith(this.element),this.$el=this.element}},mounted(){this.$el.replaceWith(this.element),this.$el=this.element}},Ne=(0,T.Z)(ke,(function(){return(0,this._self._c)("span")}),[],!1,null,null,null).exports;var Ie=i(27856);const Ee={name:"CustomSvgIconRender",props:{svg:{type:String,required:!0}},watch:{svg(){this.$el.innerHTML=(0,Ie.sanitize)(this.svg)}},mounted(){this.$el.innerHTML=(0,Ie.sanitize)(this.svg)}};var Fe=i(61959),Be={};Be.styleTagTransform=B(),Be.setAttributes=N(),Be.insert=S().bind(null,"head"),Be.domAPI=_(),Be.insertStyleElement=E(),b()(Fe.Z,Be),Fe.Z&&Fe.Z.locals&&Fe.Z.locals;const Pe=(0,T.Z)(Ee,(function(){return(0,this._self._c)("span",{staticClass:"custom-svg-icon"})}),[],!1,null,"93e9b2f4",null).exports,ze=Y(),Te=u.default.extend({name:"FileEntry",components:{CustomElementRender:Ne,CustomSvgIconRender:Pe,FileIcon:we.Z,FolderIcon:Ce.default,Fragment:ve.H,NcActionButton:ye(),NcActions:xe(),NcCheckboxRadioSwitch:Ft(),NcLoadingIcon:te()},props:{active:{type:Boolean,default:!1},isSizeAvailable:{type:Boolean,default:!1},source:{type:Object,required:!0},index:{type:Number,required:!0},nodes:{type:Array,required:!0},filesListWidth:{type:Number,default:0}},setup(){const t=Se(),e=ne(),n=function(){const t=(0,tt.Q_)("keyboard",{state:()=>({altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1}),actions:{onEvent(t){t||(t=window.event),u.default.set(this,"altKey",!!t.altKey),u.default.set(this,"ctrlKey",!!t.ctrlKey),u.default.set(this,"metaKey",!!t.metaKey),u.default.set(this,"shiftKey",!!t.shiftKey)}}})(...arguments);return t._initialized||(window.addEventListener("keydown",t.onEvent),window.addEventListener("keyup",t.onEvent),window.addEventListener("mousemove",t.onEvent),t._initialized=!0),t}();return{actionsMenuStore:t,filesStore:e,keyboardStore:n,selectionStore:oe(),userConfigStore:Vt()}},data:()=>({backgroundFailed:!1,backgroundImage:"",loading:""}),computed:{userConfig(){return this.userConfigStore.userConfig},currentView(){return this.$navigation.active},columns(){var t;return this.filesListWidth<512?[]:(null===(t=this.currentView)||void 0===t?void 0:t.columns)||[]},dir(){var t,e;return((null===(t=this.$route)||void 0===t||null===(e=t.query)||void 0===e?void 0:e.dir)||"/").replace(/^(.+)\/$/,"$1")},fileid(){var t,e,n;return null===(t=this.source)||void 0===t||null===(e=t.fileid)||void 0===e||null===(n=e.toString)||void 0===n?void 0:n.call(e)},displayName(){return this.source.attributes.displayName||this.source.basename},size(){const t=parseInt(this.source.size,10)||0;return"number"!=typeof t||t<0?this.t("files","Pending"):(0,H.sS)(t,!0)},sizeOpacity(){const t=parseInt(this.source.size,10)||0;return!t||t<0?1:.7+(1-.7)*Math.pow(this.source.size/10485760,2)},linkTo(){if("folder"===this.source.type){const t={...this.$route,query:{dir:(0,p.join)(this.dir,this.source.basename)}};return{is:"router-link",title:this.t("files","Open folder {name}",{name:this.displayName}),to:t}}return{href:this.source.source,title:this.t("files","Download file {name}",{name:this.displayName})}},selectedFiles(){return this.selectionStore.selected},isSelected(){var t,e,n;return this.selectedFiles.includes(null===(t=this.source)||void 0===t||null===(e=t.fileid)||void 0===e||null===(n=e.toString)||void 0===n?void 0:n.call(e))},cropPreviews(){return this.userConfig.crop_image_previews},previewUrl(){try{const t=new URL(window.location.origin+this.source.attributes.previewUrl);return t.searchParams.set("x","32"),t.searchParams.set("y","32"),t.searchParams.set("a",!0===this.cropPreviews?"1":"0"),t.href}catch(t){return null}},mimeIconUrl(){var t,e,n;const i=this.source.mime||"application/octet-stream",o=null===(t=window.OC)||void 0===t||null===(e=t.MimeType)||void 0===e||null===(n=e.getIconUrl)||void 0===n?void 0:n.call(e,i);return o?"url(".concat(o,")"):""},enabledActions(){return ze.filter((t=>!t.enabled||t.enabled([this.source],this.currentView))).sort(((t,e)=>(t.order||0)-(e.order||0)))},enabledInlineActions(){return this.filesListWidth<768?[]:this.enabledActions.filter((t=>{var e;return null==t||null===(e=t.inline)||void 0===e?void 0:e.call(t,this.source,this.currentView)}))},enabledMenuActions(){return this.filesListWidth<768?this.enabledActions:[...this.enabledInlineActions,...this.enabledActions.filter((t=>!t.inline))]},uniqueId(){return this.hashCode(this.source.source)},openedMenu:{get(){return this.actionsMenuStore.opened===this.uniqueId},set(t){this.actionsMenuStore.opened=t?this.uniqueId:null}}},watch:{active(t,e){if(!1===t&&!0===e)return this.resetState(),void(this.$el.parentNode.style.display="none");this.$el.parentNode.style.display=""},previewUrl(){this.clearImg(),this.debounceIfNotCached()}},mounted(){var t,e;this.debounceGetPreview=(0,Ae.debounce)((function(){this.fetchAndApplyPreview()}),150,!1),this.debounceIfNotCached(),null===(t=this.$el.parentNode)||void 0===t||null===(e=t.addEventListener)||void 0===e||e.call(t,"contextmenu",this.onRightClick)},beforeDestroy(){this.resetState()},methods:{async debounceIfNotCached(){var t;if(this.previewUrl)return await(t=this.previewUrl,caches.open("previews").then((function(e){return e.match(t).then((function(t){return!!t}))})))?(this.backgroundImage="url(".concat(this.previewUrl,")"),void(this.backgroundFailed=!1)):void this.debounceGetPreview()},fetchAndApplyPreview(){this.previewUrl&&(this.previewPromise&&this.clearImg(),this.previewPromise=new(ge())(((t,e,n)=>{const i=new Image;i.fetchpriority=this.active?"high":"auto",i.onload=()=>{this.backgroundImage="url(".concat(this.previewUrl,")"),this.backgroundFailed=!1,t(i)},i.onerror=()=>{this.backgroundFailed=!0,e(i)},i.src=this.previewUrl,n((()=>{i.onerror=null,i.onload=null,i.src=""}))})))},resetState(){this.loading="",this.clearImg(),this.openedMenu=!1},clearImg(){this.backgroundImage="",this.backgroundFailed=!1,this.previewPromise&&(this.previewPromise.cancel(),this.previewPromise=null)},hashCode(t){let e=0;for(let n=0,i=t.length;n<i;n++)e=(e<<5)-e+t.charCodeAt(n),e|=0;return e},async onActionClick(t){const e=t.displayName([this.source],this.currentView);try{if(this.loading=t.id,u.default.set(this.source,"_loading",!0),await t.exec(this.source,this.currentView))return void(0,h.s$)(this.t("files",'"{displayName}" action executed successfully',{displayName:e}));(0,h.x2)(this.t("files",'"{displayName}" action failed',{displayName:e}))}catch(n){Q.error("Error while executing action",{action:t,e:n}),(0,h.x2)(this.t("files",'"{displayName}" action failed',{displayName:e}))}finally{this.loading="",u.default.set(this.source,"_loading",!1)}},onSelectionChange(t){var e;const n=this.index,i=this.selectionStore.lastSelectedIndex;if(null!==(e=this.keyboardStore)&&void 0!==e&&e.shiftKey&&null!==i){const t=this.selectedFiles.includes(this.fileid),e=Math.min(n,i),o=Math.max(i,n),s=this.selectionStore.lastSelection,r=this.nodes.map((t=>{var e,n;return null===(e=t.fileid)||void 0===e||null===(n=e.toString)||void 0===n?void 0:n.call(e)})).slice(e,o+1),a=[...s,...r].filter((e=>!t||e!==this.fileid));return Q.debug("Shift key pressed, selecting all files in between",{start:e,end:o,filesToSelect:r,isAlreadySelected:t}),void this.selectionStore.set(a)}Q.debug("Updating selection",{selection:t}),this.selectionStore.set(t),this.selectionStore.setLastIndex(n)},onRightClick(t){if(this.openedMenu)return;const e=this.selectedFiles.length>1;this.actionsMenuStore.opened=this.isSelected&&e?"global":this.uniqueId,t.preventDefault(),t.stopPropagation()},t:r.Iu,formatFileSize:H.sS}}),Le=Te;var Ue=i(75934),Ve={};Ve.styleTagTransform=B(),Ve.setAttributes=N(),Ve.insert=S().bind(null,"head"),Ve.domAPI=_(),Ve.insertStyleElement=E(),b()(Ue.Z,Ve),Ue.Z&&Ue.Z.locals&&Ue.Z.locals;var De=i(96669),Oe={};Oe.styleTagTransform=B(),Oe.setAttributes=N(),Oe.insert=S().bind(null,"head"),Oe.domAPI=_(),Oe.insertStyleElement=E(),b()(De.Z,Oe),De.Z&&De.Z.locals&&De.Z.locals;var Ze=(0,T.Z)(Le,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("Fragment",[e("td",{staticClass:"files-list__row-checkbox"},[t.active?e("NcCheckboxRadioSwitch",{attrs:{"aria-label":t.t("files","Select the row for {displayName}",{displayName:t.displayName}),checked:t.selectedFiles,value:t.fileid,name:"selectedFiles"},on:{"update:checked":t.onSelectionChange}}):t._e()],1),t._v(" "),e("td",{staticClass:"files-list__row-name"},[e("a",t._b({ref:"name"},"a",t.linkTo,!1),[e("span",{staticClass:"files-list__row-icon"},["folder"===t.source.type?e("FolderIcon"):t.previewUrl&&!t.backgroundFailed?e("span",{ref:"previewImg",staticClass:"files-list__row-icon-preview",style:{backgroundImage:t.backgroundImage}}):t.mimeIconUrl?e("span",{staticClass:"files-list__row-icon-preview files-list__row-icon-preview--mime",style:{backgroundImage:t.mimeIconUrl}}):e("FileIcon")],1),t._v(" "),e("span",{staticClass:"files-list__row-name-text"},[t._v(t._s(t.displayName))])])]),t._v(" "),e("td",{staticClass:"files-list__row-actions",class:"files-list__row-actions-".concat(t.uniqueId)},[t.active?e("NcActions",{ref:"actionsMenu",attrs:{disabled:t.source._loading,"force-title":!0,inline:t.enabledInlineActions.length,open:t.openedMenu},on:{"update:open":function(e){t.openedMenu=e}}},t._l(t.enabledMenuActions,(function(n){return e("NcActionButton",{key:n.id,class:"files-list__row-action-"+n.id,on:{click:function(e){return t.onActionClick(n)}},scopedSlots:t._u([{key:"icon",fn:function(){return[t.loading===n.id?e("NcLoadingIcon",{attrs:{size:18}}):e("CustomSvgIconRender",{attrs:{svg:n.iconSvgInline([t.source],t.currentView)}})]},proxy:!0}],null,!0)},[t._v("\n\t\t\t\t"+t._s(n.displayName([t.source],t.currentView))+"\n\t\t\t")])})),1):t._e()],1),t._v(" "),t.isSizeAvailable?e("td",{staticClass:"files-list__row-size",style:{opacity:t.sizeOpacity}},[e("span",[t._v(t._s(t.size))])]):t._e(),t._v(" "),t._l(t.columns,(function(n){var i;return e("td",{key:n.id,staticClass:"files-list__row-column-custom",class:"files-list__row-".concat(null===(i=t.currentView)||void 0===i?void 0:i.id,"-").concat(n.id)},[t.active?e("CustomElementRender",{attrs:{"current-view":t.currentView,render:n.render,source:t.source}}):t._e()],1)}))],2)}),[],!1,null,"47057834",null);const Re=Ze.exports,qe=u.default.extend({name:"FilesListFooter",components:{},props:{isSizeAvailable:{type:Boolean,default:!1},nodes:{type:Array,required:!0},summary:{type:String,default:""},filesListWidth:{type:Number,default:0}},setup(){const t=ie();return{filesStore:ne(),pathsStore:t}},computed:{currentView(){return this.$navigation.active},dir(){var t,e;return((null===(t=this.$route)||void 0===t||null===(e=t.query)||void 0===e?void 0:e.dir)||"/").replace(/^(.+)\/$/,"$1")},currentFolder(){var t;if(null===(t=this.currentView)||void 0===t||!t.id)return;if("/"===this.dir)return this.filesStore.getRoot(this.currentView.id);const e=this.pathsStore.getPath(this.currentView.id,this.dir);return this.filesStore.getNode(e)},columns(){var t;return this.filesListWidth<512?[]:(null===(t=this.currentView)||void 0===t?void 0:t.columns)||[]},totalSize(){var t;return null!==(t=this.currentFolder)&&void 0!==t&&t.size?(0,H.sS)(this.currentFolder.size,!0):(0,H.sS)(this.nodes.reduce(((t,e)=>t+e.size||0),0),!0)}},methods:{classForColumn(t){return{"files-list__row-column-custom":!0,["files-list__row-".concat(this.currentView.id,"-").concat(t.id)]:!0}},t:r.Iu}});var je=i(97105),Me={};Me.styleTagTransform=B(),Me.setAttributes=N(),Me.insert=S().bind(null,"head"),Me.domAPI=_(),Me.insertStyleElement=E(),b()(je.Z,Me),je.Z&&je.Z.locals&&je.Z.locals;const $e=(0,T.Z)(qe,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("tr",[e("th",{staticClass:"files-list__row-checkbox"},[e("span",{staticClass:"hidden-visually"},[t._v(t._s(t.t("files","Total rows summary")))])]),t._v(" "),e("td",{staticClass:"files-list__row-name"},[e("span",{staticClass:"files-list__row-icon"}),t._v(" "),e("span",[t._v(t._s(t.summary))])]),t._v(" "),e("td",{staticClass:"files-list__row-actions"}),t._v(" "),t.isSizeAvailable?e("td",{staticClass:"files-list__column files-list__row-size"},[e("span",[t._v(t._s(t.totalSize))])]):t._e(),t._v(" "),t._l(t.columns,(function(n){var i;return e("th",{key:n.id,class:t.classForColumn(n)},[e("span",[t._v(t._s(null===(i=n.summary)||void 0===i?void 0:i.call(n,t.nodes,t.currentView)))])])}))],2)}),[],!1,null,"e6a083be",null).exports,We=u.default.extend({data:()=>({filesListWidth:null}),created(){const t=document.querySelector("#app-content-vue");this.$resizeObserver=new ResizeObserver((e=>{e.length>0&&e[0].target===t&&(this.filesListWidth=e[0].contentRect.width)})),this.$resizeObserver.observe(t)},beforeDestroy(){this.$resizeObserver.disconnect()}}),Ge=Y(),He=u.default.extend({name:"FilesListHeaderActions",components:{CustomSvgIconRender:Pe,NcActions:xe(),NcActionButton:ye(),NcLoadingIcon:te()},mixins:[We],props:{currentView:{type:Object,required:!0},selectedNodes:{type:Array,default:()=>[]}},setup:()=>({actionsMenuStore:Se(),filesStore:ne(),selectionStore:oe()}),data:()=>({loading:null}),computed:{enabledActions(){return Ge.filter((t=>t.execBatch)).filter((t=>!t.enabled||t.enabled(this.nodes,this.currentView))).sort(((t,e)=>(t.order||0)-(e.order||0)))},nodes(){return this.selectedNodes.map((t=>this.getNode(t))).filter((t=>t))},areSomeNodesLoading(){return this.nodes.some((t=>t._loading))},openedMenu:{get(){return"global"===this.actionsMenuStore.opened},set(t){this.actionsMenuStore.opened=t?"global":null}},inlineActions(){return this.filesListWidth<512?0:this.filesListWidth<768?1:this.filesListWidth<1024?2:3}},methods:{getNode(t){return this.filesStore.getNode(t)},async onActionClick(t){const e=t.displayName(this.nodes,this.currentView),n=this.selectedNodes;try{this.loading=t.id,this.nodes.forEach((t=>{u.default.set(t,"_loading",!0)}));const i=await t.execBatch(this.nodes,this.currentView);if(i.some((t=>!0!==t))){const t=n.filter(((t,e)=>!0!==i[e]));return this.selectionStore.set(t),void(0,h.x2)(this.t("files",'"{displayName}" failed on some elements ',{displayName:e}))}(0,h.s$)(this.t("files",'"{displayName}" batch action executed successfully',{displayName:e})),this.selectionStore.reset()}catch(n){Q.error("Error while executing action",{action:t,e:n}),(0,h.x2)(this.t("files",'"{displayName}" action failed',{displayName:e}))}finally{this.loading=null,this.nodes.forEach((t=>{u.default.set(t,"_loading",!1)}))}},t:r.Iu}}),Ke=He;var Qe=i(19505),Ye={};Ye.styleTagTransform=B(),Ye.setAttributes=N(),Ye.insert=S().bind(null,"head"),Ye.domAPI=_(),Ye.insertStyleElement=E(),b()(Qe.Z,Ye),Qe.Z&&Qe.Z.locals&&Qe.Z.locals;var Je=(0,T.Z)(Ke,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("th",{staticClass:"files-list__column files-list__row-actions-batch",attrs:{colspan:"2"}},[e("NcActions",{ref:"actionsMenu",attrs:{disabled:!!t.loading||t.areSomeNodesLoading,"force-title":!0,inline:t.inlineActions,"menu-title":t.inlineActions<=1?t.t("files","Actions"):null,open:t.openedMenu},on:{"update:open":function(e){t.openedMenu=e}}},t._l(t.enabledActions,(function(n){return e("NcActionButton",{key:n.id,class:"files-list__row-actions-batch-"+n.id,on:{click:function(e){return t.onActionClick(n)}},scopedSlots:t._u([{key:"icon",fn:function(){return[t.loading===n.id?e("NcLoadingIcon",{attrs:{size:18}}):e("CustomSvgIconRender",{attrs:{svg:n.iconSvgInline(t.nodes,t.currentView)}})]},proxy:!0}],null,!0)},[t._v("\n\t\t\t"+t._s(n.displayName(t.nodes,t.currentView))+"\n\t\t")])})),1)],1)}),[],!1,null,"9d92da06",null);const Xe=Je.exports;var tn=i(20404),en=i(23873);const nn=u.default.extend({computed:{...(0,tt.rn)(vt,["getConfig","setSortingBy","toggleSortingDirection"]),currentView(){return this.$navigation.active},sortingMode(){var t,e;return(null===(t=this.getConfig(this.currentView.id))||void 0===t?void 0:t.sorting_mode)||(null===(e=this.currentView)||void 0===e?void 0:e.defaultSortKey)||"basename"},isAscSorting(){var t;return"asc"===(null===(t=this.getConfig(this.currentView.id))||void 0===t?void 0:t.sorting_direction)}},methods:{toggleSortBy(t){this.sortingMode!==t?this.setSortingBy(t,this.currentView.id):this.toggleSortingDirection(this.currentView.id)}}}),on=u.default.extend({name:"FilesListHeaderButton",components:{MenuDown:tn.Z,MenuUp:en.Z,NcButton:Jt()},mixins:[nn],props:{name:{type:String,required:!0},mode:{type:String,required:!0}},methods:{sortAriaLabel(t){const e=this.isAscSorting?this.t("files","ascending"):this.t("files","descending");return this.t("files","Sort list by {column} ({direction})",{column:t,direction:e})},t:r.Iu}});var sn=i(29252),rn={};rn.styleTagTransform=B(),rn.setAttributes=N(),rn.insert=S().bind(null,"head"),rn.domAPI=_(),rn.insertStyleElement=E(),b()(sn.Z,rn),sn.Z&&sn.Z.locals&&sn.Z.locals;const an=(0,T.Z)(on,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("NcButton",{staticClass:"files-list__column-sort-button",class:{"files-list__column-sort-button--active":t.sortingMode===t.mode},attrs:{"aria-label":t.sortAriaLabel(t.name),type:"tertiary"},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.toggleSortBy(t.mode)}}},[t.sortingMode!==t.mode||t.isAscSorting?e("MenuUp",{attrs:{slot:"icon"},slot:"icon"}):e("MenuDown",{attrs:{slot:"icon"},slot:"icon"}),t._v("\n\t"+t._s(t.name)+"\n")],1)}),[],!1,null,null,null).exports,ln=u.default.extend({name:"FilesListHeader",components:{FilesListHeaderButton:an,NcCheckboxRadioSwitch:Ft(),FilesListHeaderActions:Xe},mixins:[nn],props:{isSizeAvailable:{type:Boolean,default:!1},nodes:{type:Array,required:!0},filesListWidth:{type:Number,default:0}},setup:()=>({filesStore:ne(),selectionStore:oe()}),computed:{currentView(){return this.$navigation.active},columns(){var t;return this.filesListWidth<512?[]:(null===(t=this.currentView)||void 0===t?void 0:t.columns)||[]},dir(){var t,e;return((null===(t=this.$route)||void 0===t||null===(e=t.query)||void 0===e?void 0:e.dir)||"/").replace(/^(.+)\/$/,"$1")},selectAllBind(){const t=this.isNoneSelected||this.isSomeSelected?this.t("files","Select all"):this.t("files","Unselect all");return{"aria-label":t,checked:this.isAllSelected,indeterminate:this.isSomeSelected,title:t}},selectedNodes(){return this.selectionStore.selected},isAllSelected(){return this.selectedNodes.length===this.nodes.length},isNoneSelected(){return 0===this.selectedNodes.length},isSomeSelected(){return!this.isAllSelected&&!this.isNoneSelected}},methods:{classForColumn(t){return{"files-list__column":!0,"files-list__column--sortable":!!t.sort,"files-list__row-column-custom":!0,["files-list__row-".concat(this.currentView.id,"-").concat(t.id)]:!0}},onToggleAll(t){if(t){const t=this.nodes.map((t=>t.attributes.fileid.toString()));Q.debug("Added all nodes to selection",{selection:t}),this.selectionStore.setLastIndex(null),this.selectionStore.set(t)}else Q.debug("Cleared selection"),this.selectionStore.reset()},t:r.Iu}});var cn=i(8607),dn={};dn.styleTagTransform=B(),dn.setAttributes=N(),dn.insert=S().bind(null,"head"),dn.domAPI=_(),dn.insertStyleElement=E(),b()(cn.Z,dn),cn.Z&&cn.Z.locals&&cn.Z.locals;const un=(0,T.Z)(ln,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("tr",[e("th",{staticClass:"files-list__column files-list__row-checkbox"},[e("NcCheckboxRadioSwitch",t._b({on:{"update:checked":t.onToggleAll}},"NcCheckboxRadioSwitch",t.selectAllBind,!1))],1),t._v(" "),t.isNoneSelected?[e("th",{staticClass:"files-list__column files-list__row-name files-list__column--sortable",on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.toggleSortBy("basename")}}},[e("span",{staticClass:"files-list__row-icon"}),t._v(" "),e("FilesListHeaderButton",{attrs:{name:t.t("files","Name"),mode:"basename"}})],1),t._v(" "),e("th",{staticClass:"files-list__row-actions"}),t._v(" "),t.isSizeAvailable?e("th",{staticClass:"files-list__column files-list__row-size",class:{"files-list__column--sortable":t.isSizeAvailable}},[e("FilesListHeaderButton",{attrs:{name:t.t("files","Size"),mode:"size"}})],1):t._e(),t._v(" "),t._l(t.columns,(function(n){return e("th",{key:n.id,class:t.classForColumn(n)},[n.sort?e("FilesListHeaderButton",{attrs:{name:n.title,mode:n.id}}):e("span",[t._v("\n\t\t\t\t"+t._s(n.title)+"\n\t\t\t")])],1)}))]:e("FilesListHeaderActions",{attrs:{"current-view":t.currentView,"selected-nodes":t.selectedNodes}})],2)}),[],!1,null,"53698ce8",null).exports,pn=u.default.extend({name:"FilesListVirtual",components:{RecycleScroller:fe.EK,FileEntry:Re,FilesListHeader:un,FilesListFooter:$e},mixins:[We],props:{currentView:{type:Object,required:!0},nodes:{type:Array,required:!0}},data:()=>({FileEntry:Re}),computed:{files(){return this.nodes.filter((t=>"file"===t.type))},summaryFile(){const t=this.files.length;return(0,r.uN)("files","{count} file","{count} files",t,{count:t})},summaryFolder(){const t=this.nodes.length-this.files.length;return(0,r.uN)("files","{count} folder","{count} folders",t,{count:t})},summary(){return(0,r.Iu)("files","{summaryFile} and {summaryFolder}",this)},isSizeAvailable(){return!(this.filesListWidth<768)&&this.nodes.some((t=>void 0!==t.attributes.size))}},mounted(){const t=this.$el.querySelectorAll(".vue-recycle-scroller__slot");t[0].setAttribute("role","thead"),t[1].setAttribute("role","tfoot")},methods:{getFileId:t=>t.attributes.fileid,t:r.Iu}});var hn=i(525),fn={};fn.styleTagTransform=B(),fn.setAttributes=N(),fn.insert=S().bind(null,"head"),fn.domAPI=_(),fn.insertStyleElement=E(),b()(hn.Z,fn),hn.Z&&hn.Z.locals&&hn.Z.locals;const An=(0,T.Z)(pn,(function(){var t=this,e=t._self._c;return t._self._setupProxy,e("RecycleScroller",{ref:"recycleScroller",staticClass:"files-list",attrs:{"key-field":"source",items:t.nodes,"item-size":55,"table-mode":!0,"item-class":"files-list__row","item-tag":"tr","list-class":"files-list__body","list-tag":"tbody",role:"table"},scopedSlots:t._u([{key:"default",fn:function(n){let{item:i,active:o,index:s}=n;return[e("FileEntry",{attrs:{active:o,index:s,"is-size-available":t.isSizeAvailable,"files-list-width":t.filesListWidth,nodes:t.nodes,source:i}})]}},{key:"before",fn:function(){return[e("caption",{staticClass:"hidden-visually"},[t._v("\n\t\t\t"+t._s(t.currentView.caption||"")+"\n\t\t\t"+t._s(t.t("files","This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list."))+"\n\t\t")]),t._v(" "),e("FilesListHeader",{attrs:{"files-list-width":t.filesListWidth,"is-size-available":t.isSizeAvailable,nodes:t.nodes}})]},proxy:!0},{key:"after",fn:function(){return[e("FilesListFooter",{attrs:{"files-list-width":t.filesListWidth,"is-size-available":t.isSizeAvailable,nodes:t.nodes,summary:t.summary}})]},proxy:!0}])})}),[],!1,null,"07b86e54",null).exports,vn=u.default.extend({name:"FilesList",components:{BreadCrumbs:he,FilesListVirtual:An,NcAppContent:Qt(),NcButton:Jt(),NcEmptyContent:A(),NcLoadingIcon:te(),TrashCan:ee.Z},mixins:[nn],setup(){const t=ie();return{filesStore:ne(),pathsStore:t,selectionStore:oe(),viewConfigStore:vt()}},data:()=>({loading:!0,promise:null}),computed:{currentView(){return this.$navigation.active||this.$navigation.views.find((t=>"files"===t.id))},dir(){var t,e;return((null===(t=this.$route)||void 0===t||null===(e=t.query)||void 0===e?void 0:e.dir)||"/").replace(/^(.+)\/$/,"$1")},currentFolder(){var t;if(null===(t=this.currentView)||void 0===t||!t.id)return;if("/"===this.dir)return this.filesStore.getRoot(this.currentView.id);const e=this.pathsStore.getPath(this.currentView.id,this.dir);return this.filesStore.getNode(e)},dirContents(){var t;if(!this.currentView)return[];const e=this.currentView.columns.find((t=>t.id===this.sortingMode));if(null!=e&&e.sort&&"function"==typeof e.sort){var n;const t=[...((null===(n=this.currentFolder)||void 0===n?void 0:n._children)||[]).map(this.getNode).filter((t=>t))].sort(e.sort);return this.isAscSorting?t:t.reverse()}return(0,Ht.X)([...((null===(t=this.currentFolder)||void 0===t?void 0:t._children)||[]).map(this.getNode).filter((t=>t))],[..."basename"===this.sortingMode?[t=>"folder"!==t.type]:[],t=>t[this.sortingMode],t=>t.basename],this.isAscSorting?["asc","asc","asc"]:["desc","desc","desc"])},isEmptyDir(){return 0===this.dirContents.length},isRefreshing(){return void 0!==this.currentFolder&&!this.isEmptyDir&&this.loading},toPreviousDir(){const t=this.dir.split("/").slice(0,-1).join("/")||"/";return{...this.$route,query:{dir:t}}}},watch:{currentView(t,e){(null==t?void 0:t.id)!==(null==e?void 0:e.id)&&(Q.debug("View changed",{newView:t,oldView:e}),this.selectionStore.reset(),this.fetchContent())},dir(t,e){var n,i;Q.debug("Directory changed",{newDir:t,oldDir:e}),this.selectionStore.reset(),this.fetchContent(),null!==(n=this.$refs)&&void 0!==n&&null!==(i=n.filesListVirtual)&&void 0!==i&&i.$el&&(this.$refs.filesListVirtual.$el.scrollTop=0)}},methods:{async fetchContent(){var t,e;if(null!==(t=this.currentView)&&void 0!==t&&t.legacy)return;this.loading=!0;const n=this.dir,i=this.currentView;"function"==typeof(null===(e=this.promise)||void 0===e?void 0:e.cancel)&&(this.promise.cancel(),Q.debug("Cancelled previous ongoing fetch")),this.promise=i.getContents(n);try{const{folder:t,contents:e}=await this.promise;Q.debug("Fetched contents",{dir:n,folder:t,contents:e}),this.filesStore.updateNodes(e),t._children=e.map((t=>t.attributes.fileid)),"/"===n?this.filesStore.setRoot({service:i.id,root:t}):t.attributes.fileid?(this.filesStore.updateNodes([t]),this.pathsStore.addPath({service:i.id,fileid:t.attributes.fileid,path:n})):Q.error("Invalid root folder returned",{dir:n,folder:t,currentView:i}),e.filter((t=>"folder"===t.type)).forEach((t=>{this.pathsStore.addPath({service:i.id,fileid:t.attributes.fileid,path:(0,p.join)(n,t.basename)})}))}catch(t){Q.error("Error while fetching content",{error:t})}finally{this.loading=!1}},getNode(t){return this.filesStore.getNode(t)},t:r.Iu}});var mn=i(43010),gn={};gn.styleTagTransform=B(),gn.setAttributes=N(),gn.insert=S().bind(null,"head"),gn.domAPI=_(),gn.insertStyleElement=E(),b()(mn.Z,gn),mn.Z&&mn.Z.locals&&mn.Z.locals;const wn=(0,T.Z)(vn,(function(){var t,e,n=this,i=n._self._c;return n._self._setupProxy,i("NcAppContent",{directives:[{name:"show",rawName:"v-show",value:!(null!==(t=n.currentView)&&void 0!==t&&t.legacy),expression:"!currentView?.legacy"}],class:{"app-content--hidden":null===(e=n.currentView)||void 0===e?void 0:e.legacy},attrs:{"data-cy-files-content":""}},[i("div",{staticClass:"files-list__header"},[i("BreadCrumbs",{attrs:{path:n.dir},on:{reload:n.fetchContent}}),n._v(" "),n.isRefreshing?i("NcLoadingIcon",{staticClass:"files-list__refresh-icon"}):n._e()],1),n._v(" "),n.loading&&!n.isRefreshing?i("NcLoadingIcon",{staticClass:"files-list__loading-icon",attrs:{size:38,title:n.t("files","Loading current folder")}}):!n.loading&&n.isEmptyDir?i("NcEmptyContent",{attrs:{title:n.t("files","No files in here"),description:n.t("files","No files or folders have been deleted yet"),"data-cy-files-content-empty":""},scopedSlots:n._u([{key:"action",fn:function(){return["/"!==n.dir?i("NcButton",{attrs:{"aria-label":"t('files', 'Go to the previous folder')",type:"primary",to:n.toPreviousDir}},[n._v("\n\t\t\t\t"+n._s(n.t("files","Go back"))+"\n\t\t\t")]):n._e()]},proxy:!0},{key:"icon",fn:function(){return[i("TrashCan")]},proxy:!0}])}):i("FilesListVirtual",{ref:"filesListVirtual",attrs:{"current-view":n.currentView,nodes:n.dirContents}})],1)}),[],!1,null,"77548daf",null).exports;var Cn=i(25108);function bn(t,e,n){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var i=n.call(t,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var yn=i(78345),_n=i(17563);u.default.use(yn.ZP);const xn=new yn.ZP({mode:"history",base:(0,a.generateUrl)("/apps/files",""),linkActiveClass:"active",routes:[{path:"/",alias:"/files"},{path:"/:view/:fileid?",name:"filelist",props:!0}],stringifyQuery(t){const e=(0,_n.stringify)(t).replace(/%2F/gim,"/");return e?"?"+e:""}});var Sn,kn;window.OCA.Files=null!==(Sn=window.OCA.Files)&&void 0!==Sn?Sn:{},window.OCP.Files=null!==(kn=window.OCP.Files)&&void 0!==kn?kn:{},u.default.use(tt.og);const Nn=(0,tt.WB)(),In=new ot;Object.assign(window.OCP.Files,{Navigation:In}),u.default.prototype.$navigation=In;const En=new class{constructor(){var t,e,n;t=this,n=void 0,(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var i=n.call(t,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:String(e)}(e="_settings"))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,this._settings=[],Cn.debug("OCA.Files.Settings initialized")}register(t){return this._settings.filter((e=>e.name===t.name)).length>0?(Cn.error("A setting with the same name is already registered"),!1):(this._settings.push(t),!0)}get settings(){return this._settings}};Object.assign(window.OCA.Files,{Settings:En}),Object.assign(window.OCA.Files.Settings,{Setting:class{constructor(t,e){let{el:n,open:i,close:o}=e;bn(this,"_close",void 0),bn(this,"_el",void 0),bn(this,"_name",void 0),bn(this,"_open",void 0),this._name=t,this._el=n,this._open=i,this._close=o,"function"!=typeof this._open&&(this._open=()=>{}),"function"!=typeof this._close&&(this._close=()=>{})}get name(){return this._name}get el(){return this._el}get open(){return this._open}get close(){return this._close}}}),new(u.default.extend(Gt))({name:"FilesNavigationRoot",propsData:{Navigation:In},router:xn,pinia:Nn}).$mount("#app-navigation-files"),new(u.default.extend(wn))({name:"FilesListRoot",router:xn,pinia:Nn}).$mount("#app-content-vue"),function(){const t=Object.values((0,s.j)("files","navigation",{}));t.length>0&&(Q.debug("Legacy files views detected. Processing...",t),t.forEach((t=>{X(t),t.sublist&&t.sublist.forEach((e=>X({...e,parent:t.id})))})))}(),"serviceWorker"in navigator?window.addEventListener("load",(async()=>{try{const t=(0,a.generateUrl)("/apps/files/preview-service-worker.js",{},{noRewrite:!0}),e=await navigator.serviceWorker.register(t,{scope:"/"});Q.debug("SW registered: ",{registration:e})}catch(t){Q.error("SW registration failed: ",{error:t})}})):Q.debug("Service Worker is not enabled on this browser.")},39959:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".breadcrumb[data-v-68b3b20b]{flex:1 1 100% !important;width:100%}.breadcrumb[data-v-68b3b20b] a{cursor:pointer !important}","",{version:3,sources:["webpack://./apps/files/src/components/BreadCrumbs.vue"],names:[],mappings:"AACA,6BAEC,wBAAA,CACA,UAAA,CAEA,+BACC,yBAAA",sourcesContent:["\n.breadcrumb {\n\t// Take as much space as possible\n\tflex: 1 1 100% !important;\n\twidth: 100%;\n\n\t::v-deep a {\n\t\tcursor: pointer !important;\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},61959:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".custom-svg-icon[data-v-93e9b2f4]{display:flex;align-items:center;align-self:center;justify-content:center;justify-self:center;width:44px;height:44px;opacity:1}.custom-svg-icon[data-v-93e9b2f4] svg{height:22px;width:22px;fill:currentColor}","",{version:3,sources:["webpack://./apps/files/src/components/CustomSvgIconRender.vue"],names:[],mappings:"AACA,kCACC,YAAA,CACA,kBAAA,CACA,iBAAA,CACA,sBAAA,CACA,mBAAA,CACA,UAAA,CACA,WAAA,CACA,SAAA,CAEA,sCAGC,WAAA,CACA,UAAA,CACA,iBAAA",sourcesContent:["\n.custom-svg-icon {\n\tdisplay: flex;\n\talign-items: center;\n\talign-self: center;\n\tjustify-content: center;\n\tjustify-self: center;\n\twidth: 44px;\n\theight: 44px;\n\topacity: 1;\n\n\t::v-deep svg {\n\t\t// mdi icons have a size of 24px\n\t\t// 22px results in roughly 16px inner size\n\t\theight: 22px;\n\t\twidth: 22px;\n\t\tfill: currentColor;\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},75934:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,"tr[data-v-47057834]:hover,tr[data-v-47057834]:focus,tr[data-v-47057834]:active{background-color:var(--color-background-dark)}.files-list__row-icon-preview[data-v-47057834]:not([style*=background]){background:var(--color-loading-dark)}","",{version:3,sources:["webpack://./apps/files/src/components/FileEntry.vue"],names:[],mappings:"AAGC,+EAGC,6CAAA,CAKF,wEACI,oCAAA",sourcesContent:["\n/* Hover effect on tbody lines only */\ntr {\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\tbackground-color: var(--color-background-dark);\n\t}\n}\n\n/* Preview not loaded animation effect */\n.files-list__row-icon-preview:not([style*='background']) {\n background: var(--color-loading-dark);\n\t// animation: preview-gradient-fade 1.2s ease-in-out infinite;\n}\n"],sourceRoot:""}]);const a=r},97105:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,"tr[data-v-e6a083be]{padding-bottom:300px;border-top:1px solid var(--color-border);background-color:rgba(0,0,0,0) !important;border-bottom:none !important}td[data-v-e6a083be]{user-select:none;color:var(--color-text-maxcontrast) !important}","",{version:3,sources:["webpack://./apps/files/src/components/FilesListFooter.vue"],names:[],mappings:"AAEA,oBACC,oBAAA,CACA,wCAAA,CAEA,yCAAA,CACA,6BAAA,CAGD,oBACC,gBAAA,CAEA,8CAAA",sourcesContent:["\n// Scoped row\ntr {\n\tpadding-bottom: 300px;\n\tborder-top: 1px solid var(--color-border);\n\t// Prevent hover effect on the whole row\n\tbackground-color: transparent !important;\n\tborder-bottom: none !important;\n}\n\ntd {\n\tuser-select: none;\n\t// Make sure the cell colors don't apply to column headers\n\tcolor: var(--color-text-maxcontrast) !important;\n}\n\n"],sourceRoot:""}]);const a=r},8607:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".files-list__column[data-v-53698ce8]{user-select:none;color:var(--color-text-maxcontrast) !important}.files-list__column--sortable[data-v-53698ce8]{cursor:pointer}","",{version:3,sources:["webpack://./apps/files/src/components/FilesListHeader.vue"],names:[],mappings:"AACA,qCACC,gBAAA,CAEA,8CAAA,CAEA,+CACC,cAAA",sourcesContent:["\n.files-list__column {\n\tuser-select: none;\n\t// Make sure the cell colors don't apply to column headers\n\tcolor: var(--color-text-maxcontrast) !important;\n\n\t&--sortable {\n\t\tcursor: pointer;\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},19505:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".files-list__row-actions-batch[data-v-9d92da06]{flex:1 1 100% !important}.files-list__row-actions-batch[data-v-9d92da06] .button-vue__wrapper{width:100%}.files-list__row-actions-batch[data-v-9d92da06] .button-vue__wrapper span.button-vue__text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}","",{version:3,sources:["webpack://./apps/files/src/components/FilesListHeaderActions.vue"],names:[],mappings:"AACA,gDACC,wBAAA,CAGA,qEACC,UAAA,CACA,2FACC,eAAA,CACA,sBAAA,CACA,kBAAA",sourcesContent:["\n.files-list__row-actions-batch {\n\tflex: 1 1 100% !important;\n\n\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\n\t::v-deep .button-vue__wrapper {\n\t\twidth: 100%;\n\t\tspan.button-vue__text {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=r},29252:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".files-list__column-sort-button{margin:0 calc(var(--cell-margin)*-1);padding:0 4px 0 16px !important}.files-list__column-sort-button .button-vue__wrapper{flex-direction:row-reverse;width:100%}.files-list__column-sort-button .button-vue__icon{transition-timing-function:linear;transition-duration:.1s;transition-property:opacity;opacity:0}.files-list__column-sort-button .button-vue__text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.files-list__column-sort-button--active .button-vue__icon,.files-list__column-sort-button:hover .button-vue__icon,.files-list__column-sort-button:focus .button-vue__icon,.files-list__column-sort-button:active .button-vue__icon{opacity:1 !important}","",{version:3,sources:["webpack://./apps/files/src/components/FilesListHeaderButton.vue"],names:[],mappings:"AACA,gCAEC,oCAAA,CAEA,+BAAA,CAGA,qDACC,0BAAA,CAGA,UAAA,CAGD,kDACC,iCAAA,CACA,uBAAA,CACA,2BAAA,CACA,SAAA,CAID,kDACC,eAAA,CACA,kBAAA,CACA,sBAAA,CAOA,mOACC,oBAAA",sourcesContent:["\n.files-list__column-sort-button {\n\t// Compensate for cells margin\n\tmargin: 0 calc(var(--cell-margin) * -1);\n\t// Reverse padding\n\tpadding: 0 4px 0 16px !important;\n\n\t// Icon after text\n\t.button-vue__wrapper {\n\t\tflex-direction: row-reverse;\n\t\t// Take max inner width for text overflow ellipsis\n\t\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\n\t\twidth: 100%;\n\t}\n\n\t.button-vue__icon {\n\t\ttransition-timing-function: linear;\n\t\ttransition-duration: .1s;\n\t\ttransition-property: opacity;\n\t\topacity: 0;\n\t}\n\n\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\n\t.button-vue__text {\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t&--active,\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\t.button-vue__icon {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=r},525:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".files-list[data-v-07b86e54]{--row-height: 55px;--cell-margin: 14px;--checkbox-padding: calc((var(--row-height) - var(--checkbox-size)) / 2);--checkbox-size: 24px;--clickable-area: 44px;--icon-preview-size: 32px;display:block;overflow:auto;height:100%}.files-list[data-v-07b86e54] tbody,.files-list[data-v-07b86e54] .vue-recycle-scroller__slot{display:flex;flex-direction:column;width:100%;position:relative}.files-list[data-v-07b86e54] .vue-recycle-scroller__slot[role=thead]{position:sticky;z-index:10;top:0;height:var(--row-height);background-color:var(--color-main-background)}.files-list[data-v-07b86e54] tr{position:absolute;display:flex;align-items:center;width:100%;border-bottom:1px solid var(--color-border)}.files-list[data-v-07b86e54] td,.files-list[data-v-07b86e54] th{display:flex;align-items:center;flex:0 0 auto;justify-content:left;width:var(--row-height);height:var(--row-height);margin:0;padding:0;color:var(--color-text-maxcontrast);border:none}.files-list[data-v-07b86e54] td span,.files-list[data-v-07b86e54] th span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.files-list[data-v-07b86e54] .files-list__row-checkbox{justify-content:center}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch{display:flex;justify-content:center;--icon-size: var(--checkbox-size)}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch label.checkbox-radio-switch__label{width:var(--clickable-area);height:var(--clickable-area);margin:0;padding:calc((var(--clickable-area) - var(--checkbox-size))/2)}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch .checkbox-radio-switch__icon{margin:0 !important}.files-list[data-v-07b86e54] .files-list__row-icon{display:flex;align-items:center;justify-content:center;width:var(--icon-preview-size);height:100%;margin-right:var(--checkbox-padding);color:var(--color-primary-element);flex:0 0 var(--icon-preview-size)}.files-list[data-v-07b86e54] .files-list__row-icon>span{justify-content:flex-start}.files-list[data-v-07b86e54] .files-list__row-icon svg{width:var(--icon-preview-size);height:var(--icon-preview-size)}.files-list[data-v-07b86e54] .files-list__row-icon-preview{overflow:hidden;width:var(--icon-preview-size);height:var(--icon-preview-size);border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center;background-size:contain}.files-list[data-v-07b86e54] .files-list__row-name{overflow:hidden;flex:1 1 auto}.files-list[data-v-07b86e54] .files-list__row-name a{display:flex;align-items:center;width:100%;height:100%}.files-list[data-v-07b86e54] .files-list__row-name a:focus .files-list__row-name-text,.files-list[data-v-07b86e54] .files-list__row-name a:focus-visible .files-list__row-name-text{outline:2px solid var(--color-main-text) !important;border-radius:20px}.files-list[data-v-07b86e54] .files-list__row-name .files-list__row-name-text{padding:5px 10px;margin-left:-10px}.files-list[data-v-07b86e54] .files-list__row-actions{width:auto}.files-list[data-v-07b86e54] .files-list__row-actions~td,.files-list[data-v-07b86e54] .files-list__row-actions~th{margin:0 var(--cell-margin)}.files-list[data-v-07b86e54] .files-list__row-actions button .button-vue__text{font-weight:normal}.files-list[data-v-07b86e54] .files-list__row-actions button:not(:hover,:focus,:active) .button-vue__wrapper{color:var(--color-text-maxcontrast)}.files-list[data-v-07b86e54] .files-list__row-size{justify-content:flex-end;width:calc(var(--row-height)*1.5);color:var(--color-main-text)}.files-list[data-v-07b86e54] .files-list__row-size .files-list__column-sort-button{padding:0 16px 0 4px !important}.files-list[data-v-07b86e54] .files-list__row-size .files-list__column-sort-button .button-vue__wrapper{flex-direction:row}.files-list[data-v-07b86e54] .files-list__row-column-custom{width:calc(var(--row-height)*2)}","",{version:3,sources:["webpack://./apps/files/src/components/FilesListVirtual.vue"],names:[],mappings:"AACA,6BACC,kBAAA,CACA,mBAAA,CAEA,wEAAA,CACA,qBAAA,CACA,sBAAA,CACA,yBAAA,CAEA,aAAA,CACA,aAAA,CACA,WAAA,CAIC,4FACC,YAAA,CACA,qBAAA,CACA,UAAA,CAEA,iBAAA,CAID,qEAEC,eAAA,CACA,UAAA,CACA,KAAA,CACA,wBAAA,CACA,6CAAA,CAGD,gCACC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,UAAA,CACA,2CAAA,CAGD,gEACC,YAAA,CACA,kBAAA,CACA,aAAA,CACA,oBAAA,CACA,uBAAA,CACA,wBAAA,CACA,QAAA,CACA,SAAA,CACA,mCAAA,CACA,WAAA,CAKA,0EACC,eAAA,CACA,kBAAA,CACA,sBAAA,CAIF,uDACC,sBAAA,CACA,8EACC,YAAA,CACA,sBAAA,CAEA,iCAAA,CAEA,iHACC,2BAAA,CACA,4BAAA,CACA,QAAA,CACA,8DAAA,CAGD,2GACC,mBAAA,CAKH,mDACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,8BAAA,CACA,WAAA,CAEA,oCAAA,CACA,kCAAA,CAEA,iCAAA,CAEA,wDACC,0BAAA,CAGD,uDACC,8BAAA,CACA,+BAAA,CAGD,2DACC,eAAA,CACA,8BAAA,CACA,+BAAA,CACA,kCAAA,CACA,2BAAA,CAEA,0BAAA,CACA,uBAAA,CAIF,mDAEC,eAAA,CAEA,aAAA,CAEA,qDACC,YAAA,CACA,kBAAA,CAEA,UAAA,CACA,WAAA,CAGA,oLAEC,mDAAA,CACA,kBAAA,CAIF,8EAEC,gBAAA,CACA,iBAAA,CAIF,sDACC,UAAA,CAGA,kHAEC,2BAAA,CAIA,+EAEC,kBAAA,CAED,6GAEC,mCAAA,CAKH,mDAEC,wBAAA,CACA,iCAAA,CAEA,4BAAA,CAGA,mFACC,+BAAA,CACA,wGACC,kBAAA,CAKH,4DACC,+BAAA",sourcesContent:["\n.files-list {\n\t--row-height: 55px;\n\t--cell-margin: 14px;\n\n\t--checkbox-padding: calc((var(--row-height) - var(--checkbox-size)) / 2);\n\t--checkbox-size: 24px;\n\t--clickable-area: 44px;\n\t--icon-preview-size: 32px;\n\n\tdisplay: block;\n\toverflow: auto;\n\theight: 100%;\n\n\t&::v-deep {\n\t\t// Table head, body and footer\n\t\ttbody, .vue-recycle-scroller__slot {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\twidth: 100%;\n\t\t\t// Necessary for virtual scrolling absolute\n\t\t\tposition: relative;\n\t\t}\n\n\t\t// Table header\n\t\t.vue-recycle-scroller__slot[role='thead'] {\n\t\t\t// Pinned on top when scrolling\n\t\t\tposition: sticky;\n\t\t\tz-index: 10;\n\t\t\ttop: 0;\n\t\t\theight: var(--row-height);\n\t\t\tbackground-color: var(--color-main-background);\n\t\t}\n\n\t\ttr {\n\t\t\tposition: absolute;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\twidth: 100%;\n\t\t\tborder-bottom: 1px solid var(--color-border);\n\t\t}\n\n\t\ttd, th {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tflex: 0 0 auto;\n\t\t\tjustify-content: left;\n\t\t\twidth: var(--row-height);\n\t\t\theight: var(--row-height);\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t\tborder: none;\n\n\t\t\t// Columns should try to add any text\n\t\t\t// node wrapped in a span. That should help\n\t\t\t// with the ellipsis on overflow.\n\t\t\tspan {\n\t\t\t\toverflow: hidden;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-checkbox {\n\t\t\tjustify-content: center;\n\t\t\t.checkbox-radio-switch {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: center;\n\n\t\t\t\t--icon-size: var(--checkbox-size);\n\n\t\t\t\tlabel.checkbox-radio-switch__label {\n\t\t\t\t\twidth: var(--clickable-area);\n\t\t\t\t\theight: var(--clickable-area);\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\tpadding: calc((var(--clickable-area) - var(--checkbox-size)) / 2);\n\t\t\t\t}\n\n\t\t\t\t.checkbox-radio-switch__icon {\n\t\t\t\t\tmargin: 0 !important;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-icon {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\twidth: var(--icon-preview-size);\n\t\t\theight: 100%;\n\t\t\t// Show same padding as the checkbox right padding for visual balance\n\t\t\tmargin-right: var(--checkbox-padding);\n\t\t\tcolor: var(--color-primary-element);\n\t\t\t// No shrinking or growing allowed\n\t\t\tflex: 0 0 var(--icon-preview-size);\n\n\t\t\t& > span {\n\t\t\t\tjustify-content: flex-start;\n\t\t\t}\n\n\t\t\tsvg {\n\t\t\t\twidth: var(--icon-preview-size);\n\t\t\t\theight: var(--icon-preview-size);\n\t\t\t}\n\n\t\t\t&-preview {\n\t\t\t\toverflow: hidden;\n\t\t\t\twidth: var(--icon-preview-size);\n\t\t\t\theight: var(--icon-preview-size);\n\t\t\t\tborder-radius: var(--border-radius);\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\t// Center and contain the preview\n\t\t\t\tbackground-position: center;\n\t\t\t\tbackground-size: contain;\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-name {\n\t\t\t// Prevent link from overflowing\n\t\t\toverflow: hidden;\n\t\t\t// Take as much space as possible\n\t\t\tflex: 1 1 auto;\n\n\t\t\ta {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\t// Fill cell height and width\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\n\t\t\t\t// Keyboard indicator a11y\n\t\t\t\t&:focus .files-list__row-name-text,\n\t\t\t\t&:focus-visible .files-list__row-name-text {\n\t\t\t\t\toutline: 2px solid var(--color-main-text) !important;\n\t\t\t\t\tborder-radius: 20px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.files-list__row-name-text {\n\t\t\t\t// Make some space for the outline\n\t\t\t\tpadding: 5px 10px;\n\t\t\t\tmargin-left: -10px;\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-actions {\n\t\t\twidth: auto;\n\n\t\t\t// Add margin to all cells after the actions\n\t\t\t& ~ td,\n\t\t\t& ~ th {\n\t\t\t\tmargin: 0 var(--cell-margin);\n\t\t\t}\n\n\t\t\tbutton {\n\t\t\t\t.button-vue__text {\n\t\t\t\t\t// Remove bold from default button styling\n\t\t\t\t\tfont-weight: normal;\n\t\t\t\t}\n\t\t\t\t&:not(:hover, :focus, :active) .button-vue__wrapper {\n\t\t\t\t\t// Also apply color-text-maxcontrast to non-active button\n\t\t\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-size {\n\t\t\t// Right align text\n\t\t\tjustify-content: flex-end;\n\t\t\twidth: calc(var(--row-height) * 1.5);\n\t\t\t// opacity varies with the size\n\t\t\tcolor: var(--color-main-text);\n\n\t\t\t// Icon is before text since size is right aligned\n\t\t\t.files-list__column-sort-button {\n\t\t\t\tpadding: 0 16px 0 4px !important;\n\t\t\t\t.button-vue__wrapper {\n\t\t\t\t\tflex-direction: row;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-column-custom {\n\t\t\twidth: calc(var(--row-height) * 2);\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=r},93582:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".app-navigation-entry__settings-quota--not-unlimited[data-v-918797b2] .app-navigation-entry__title{margin-top:-4px}.app-navigation-entry__settings-quota progress[data-v-918797b2]{position:absolute;bottom:10px;margin-left:44px;width:calc(100% - 44px - 22px)}","",{version:3,sources:["webpack://./apps/files/src/components/NavigationQuota.vue"],names:[],mappings:"AAIC,mGACC,eAAA,CAGD,gEACC,iBAAA,CACA,WAAA,CACA,gBAAA,CACA,8BAAA",sourcesContent:["\n// User storage stats display\n.app-navigation-entry__settings-quota {\n\t// Align title with progress and icon\n\t&--not-unlimited::v-deep .app-navigation-entry__title {\n\t\tmargin-top: -4px;\n\t}\n\n\tprogress {\n\t\tposition: absolute;\n\t\tbottom: 10px;\n\t\tmargin-left: 44px;\n\t\twidth: calc(100% - 44px - 22px);\n\t}\n}\n"],sourceRoot:""}]);const a=r},3491:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".template-picker__item[data-v-6c072a31]{display:flex}.template-picker__label[data-v-6c072a31]{display:flex;align-items:center;flex:1 1;flex-direction:column}.template-picker__label[data-v-6c072a31],.template-picker__label *[data-v-6c072a31]{cursor:pointer;user-select:none}.template-picker__label[data-v-6c072a31]::before{display:none !important}.template-picker__preview[data-v-6c072a31]{display:block;overflow:hidden;flex:1 1;width:var(--width);min-height:var(--height);max-height:var(--height);padding:0;border:var(--border) solid var(--color-border);border-radius:var(--border-radius-large)}input:checked+label>.template-picker__preview[data-v-6c072a31]{border-color:var(--color-primary)}.template-picker__preview--failed[data-v-6c072a31]{display:flex}.template-picker__image[data-v-6c072a31]{max-width:100%;background-color:var(--color-main-background);object-fit:cover}.template-picker__preview--failed .template-picker__image[data-v-6c072a31]{width:calc(var(--margin)*8);margin:auto;background-color:rgba(0,0,0,0) !important;object-fit:initial}.template-picker__title[data-v-6c072a31]{overflow:hidden;max-width:calc(var(--width) + 4px);padding:var(--margin);white-space:nowrap;text-overflow:ellipsis}","",{version:3,sources:["webpack://./apps/files/src/components/TemplatePreview.vue"],names:[],mappings:"AAGC,wCACC,YAAA,CAGD,yCACC,YAAA,CAEA,kBAAA,CACA,QAAA,CACA,qBAAA,CAEA,oFACC,cAAA,CACA,gBAAA,CAGD,iDACC,uBAAA,CAIF,2CACC,aAAA,CACA,eAAA,CAEA,QAAA,CACA,kBAAA,CACA,wBAAA,CACA,wBAAA,CACA,SAAA,CACA,8CAAA,CACA,wCAAA,CAEA,+DACC,iCAAA,CAGD,mDAEC,YAAA,CAIF,yCACC,cAAA,CACA,6CAAA,CAEA,gBAAA,CAID,2EACC,2BAAA,CAEA,WAAA,CACA,yCAAA,CAEA,kBAAA,CAGD,yCACC,eAAA,CAEA,kCAAA,CACA,qBAAA,CACA,kBAAA,CACA,sBAAA",sourcesContent:["\n\n.template-picker {\n\t&__item {\n\t\tdisplay: flex;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\t// Align in the middle of the grid\n\t\talign-items: center;\n\t\tflex: 1 1;\n\t\tflex-direction: column;\n\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&::before {\n\t\t\tdisplay: none !important;\n\t\t}\n\t}\n\n\t&__preview {\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\t// Stretch so all entries are the same width\n\t\tflex: 1 1;\n\t\twidth: var(--width);\n\t\tmin-height: var(--height);\n\t\tmax-height: var(--height);\n\t\tpadding: 0;\n\t\tborder: var(--border) solid var(--color-border);\n\t\tborder-radius: var(--border-radius-large);\n\n\t\tinput:checked + label > & {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\n\t\t&--failed {\n\t\t\t// Make sure to properly center fallback icon\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n\n\t&__image {\n\t\tmax-width: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tobject-fit: cover;\n\t}\n\n\t// Failed preview, fallback to mime icon\n\t&__preview--failed &__image {\n\t\twidth: calc(var(--margin) * 8);\n\t\t// Center mime icon\n\t\tmargin: auto;\n\t\tbackground-color: transparent !important;\n\n\t\tobject-fit: initial;\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\t// also count preview border\n\t\tmax-width: calc(var(--width) + 2*2px);\n\t\tpadding: var(--margin);\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},43010:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".app-content[data-v-77548daf]{display:flex;overflow:hidden;flex-direction:column;max-height:100%}.app-content[data-v-77548daf]:not(.app-content--hidden)+#app-content{display:none}.files-list__header[data-v-77548daf]{display:flex;align-content:center;flex:0 0;margin:4px 4px 4px 50px}.files-list__header>*[data-v-77548daf]{flex:0 0}.files-list__refresh-icon[data-v-77548daf]{flex:0 0 44px;width:44px;height:44px}.files-list__loading-icon[data-v-77548daf]{margin:auto}","",{version:3,sources:["webpack://./apps/files/src/views/FilesList.vue"],names:[],mappings:"AACA,8BAEC,YAAA,CACA,eAAA,CACA,qBAAA,CACA,eAAA,CAIA,qEACC,YAAA,CAQD,qCACC,YAAA,CACA,oBAAA,CAEA,QAAA,CAEA,uBAAA,CACA,uCAGC,QAAA,CAGF,2CACC,aAAA,CACA,UAAA,CACA,WAAA,CAED,2CACC,WAAA",sourcesContent:["\n.app-content {\n\t// Virtual list needs to be full height and is scrollable\n\tdisplay: flex;\n\toverflow: hidden;\n\tflex-direction: column;\n\tmax-height: 100%;\n\n\t// TODO: remove after all legacy views are migrated\n\t// Hides the legacy app-content if shown view is not legacy\n\t&:not(&--hidden)::v-deep + #app-content {\n\t\tdisplay: none;\n\t}\n}\n\n$margin: 4px;\n$navigationToggleSize: 50px;\n\n.files-list {\n\t&__header {\n\t\tdisplay: flex;\n\t\talign-content: center;\n\t\t// Do not grow or shrink (vertically)\n\t\tflex: 0 0;\n\t\t// Align with the navigation toggle icon\n\t\tmargin: $margin $margin $margin $navigationToggleSize;\n\t\t> * {\n\t\t\t// Do not grow or shrink (horizontally)\n\t\t\t// Only the breadcrumbs shrinks\n\t\t\tflex: 0 0;\n\t\t}\n\t}\n\t&__refresh-icon {\n\t\tflex: 0 0 44px;\n\t\twidth: 44px;\n\t\theight: 44px;\n\t}\n\t&__loading-icon {\n\t\tmargin: auto;\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},41675:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".app-navigation[data-v-508e08a4] .app-navigation-entry-icon{background-repeat:no-repeat;background-position:center}.app-navigation>ul.app-navigation__list[data-v-508e08a4]{padding-bottom:var(--default-grid-baseline, 4px)}.app-navigation-entry__settings[data-v-508e08a4]{height:auto !important;overflow:hidden !important;padding-top:0 !important;flex:0 0 auto}","",{version:3,sources:["webpack://./apps/files/src/views/Navigation.vue"],names:[],mappings:"AAEA,4DACC,2BAAA,CACA,0BAAA,CAGD,yDAEC,gDAAA,CAGD,iDACC,sBAAA,CACA,0BAAA,CACA,wBAAA,CAEA,aAAA",sourcesContent:["\n// TODO: remove when https://github.com/nextcloud/nextcloud-vue/pull/3539 is in\n.app-navigation::v-deep .app-navigation-entry-icon {\n\tbackground-repeat: no-repeat;\n\tbackground-position: center;\n}\n\n.app-navigation > ul.app-navigation__list {\n\t// Use flex gap value for more elegant spacing\n\tpadding-bottom: var(--default-grid-baseline, 4px);\n}\n\n.app-navigation-entry__settings {\n\theight: auto !important;\n\toverflow: hidden !important;\n\tpadding-top: 0 !important;\n\t// Prevent shrinking or growing\n\tflex: 0 0 auto;\n}\n"],sourceRoot:""}]);const a=r},35662:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".setting-link[data-v-76ca5d1f]:hover{text-decoration:underline}","",{version:3,sources:["webpack://./apps/files/src/views/Settings.vue"],names:[],mappings:"AACA,qCACC,yBAAA",sourcesContent:["\n.setting-link:hover {\n\ttext-decoration: underline;\n}\n"],sourceRoot:""}]);const a=r},5103:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,".templates-picker__form[data-v-715b4161]{padding:calc(var(--margin)*2);padding-bottom:0}.templates-picker__form h2[data-v-715b4161]{text-align:center;font-weight:bold;margin:var(--margin) 0 calc(var(--margin)*2)}.templates-picker__list[data-v-715b4161]{display:grid;grid-gap:calc(var(--margin)*2);grid-auto-columns:1fr;max-width:calc(var(--fullwidth)*6);grid-template-columns:repeat(auto-fit, var(--fullwidth));grid-auto-rows:1fr;justify-content:center}.templates-picker__buttons[data-v-715b4161]{display:flex;justify-content:space-between;padding:calc(var(--margin)*2) var(--margin);position:sticky;bottom:0;background-image:linear-gradient(0, var(--gradient-main-background))}.templates-picker__buttons button[data-v-715b4161],.templates-picker__buttons input[type=submit][data-v-715b4161]{height:44px}.templates-picker[data-v-715b4161] .modal-container{position:relative}.templates-picker__loading[data-v-715b4161]{position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;margin:0;background-color:var(--color-main-background-translucent)}","",{version:3,sources:["webpack://./apps/files/src/views/TemplatePicker.vue"],names:[],mappings:"AAEC,yCACC,6BAAA,CAEA,gBAAA,CAEA,4CACC,iBAAA,CACA,gBAAA,CACA,4CAAA,CAIF,yCACC,YAAA,CACA,8BAAA,CACA,qBAAA,CAEA,kCAAA,CACA,wDAAA,CAEA,kBAAA,CAEA,sBAAA,CAGD,4CACC,YAAA,CACA,6BAAA,CACA,2CAAA,CACA,eAAA,CACA,QAAA,CACA,oEAAA,CAEA,kHACC,WAAA,CAKF,oDACC,iBAAA,CAGD,4CACC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,sBAAA,CACA,UAAA,CACA,WAAA,CACA,QAAA,CACA,yDAAA",sourcesContent:["\n.templates-picker {\n\t&__form {\n\t\tpadding: calc(var(--margin) * 2);\n\t\t// Will be handled by the buttons\n\t\tpadding-bottom: 0;\n\n\t\th2 {\n\t\t\ttext-align: center;\n\t\t\tfont-weight: bold;\n\t\t\tmargin: var(--margin) 0 calc(var(--margin) * 2);\n\t\t}\n\t}\n\n\t&__list {\n\t\tdisplay: grid;\n\t\tgrid-gap: calc(var(--margin) * 2);\n\t\tgrid-auto-columns: 1fr;\n\t\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\n\t\tmax-width: calc(var(--fullwidth) * 6);\n\t\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\n\t\t// Make sure all rows are the same height\n\t\tgrid-auto-rows: 1fr;\n\t\t// Center the columns set\n\t\tjustify-content: center;\n\t}\n\n\t&__buttons {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tpadding: calc(var(--margin) * 2) var(--margin);\n\t\tposition: sticky;\n\t\tbottom: 0;\n\t\tbackground-image: linear-gradient(0, var(--gradient-main-background));\n\n\t\tbutton, input[type='submit'] {\n\t\t\theight: 44px;\n\t\t}\n\t}\n\n\t// Make sure we're relative for the loading emptycontent on top\n\t::v-deep .modal-container {\n\t\tposition: relative;\n\t}\n\n\t&__loading {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin: 0;\n\t\tbackground-color: var(--color-main-background-translucent);\n\t}\n}\n\n"],sourceRoot:""}]);const a=r},96669:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(87537),o=n.n(i),s=n(23645),r=n.n(s)()(o());r.push([t.id,"\n/* @keyframes preview-gradient-fade {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n 100% {\n opacity: 1;\n }\n} */\n","",{version:3,sources:["webpack://./apps/files/src/components/FileEntry.vue"],names:[],mappings:";AAmjBA;;;;;;;;;;GAUA",sourcesContent:["\x3c!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n --\x3e\n\n<template>\n\t<Fragment>\n\t\t<td class=\"files-list__row-checkbox\">\n\t\t\t<NcCheckboxRadioSwitch v-if=\"active\"\n\t\t\t\t:aria-label=\"t('files', 'Select the row for {displayName}', { displayName })\"\n\t\t\t\t:checked=\"selectedFiles\"\n\t\t\t\t:value=\"fileid\"\n\t\t\t\tname=\"selectedFiles\"\n\t\t\t\t@update:checked=\"onSelectionChange\" />\n\t\t</td>\n\n\t\t\x3c!-- Link to file --\x3e\n\t\t<td class=\"files-list__row-name\">\n\t\t\t<a ref=\"name\" v-bind=\"linkTo\">\n\t\t\t\t\x3c!-- Icon or preview --\x3e\n\t\t\t\t<span class=\"files-list__row-icon\">\n\t\t\t\t\t<FolderIcon v-if=\"source.type === 'folder'\" />\n\n\t\t\t\t\t\x3c!-- Decorative image, should not be aria documented --\x3e\n\t\t\t\t\t<span v-else-if=\"previewUrl && !backgroundFailed\"\n\t\t\t\t\t\tref=\"previewImg\"\n\t\t\t\t\t\tclass=\"files-list__row-icon-preview\"\n\t\t\t\t\t\t:style=\"{ backgroundImage }\" />\n\n\t\t\t\t\t<span v-else-if=\"mimeIconUrl\"\n\t\t\t\t\t\tclass=\"files-list__row-icon-preview files-list__row-icon-preview--mime\"\n\t\t\t\t\t\t:style=\"{ backgroundImage: mimeIconUrl }\" />\n\n\t\t\t\t\t<FileIcon v-else />\n\t\t\t\t</span>\n\n\t\t\t\t\x3c!-- File name --\x3e\n\t\t\t\t<span class=\"files-list__row-name-text\">{{ displayName }}</span>\n\t\t\t</a>\n\t\t</td>\n\n\t\t\x3c!-- Actions --\x3e\n\t\t<td :class=\"`files-list__row-actions-${uniqueId}`\" class=\"files-list__row-actions\">\n\t\t\t\x3c!-- Inline actions --\x3e\n\t\t\t\x3c!-- TODO: implement CustomElementRender --\x3e\n\n\t\t\t\x3c!-- Menu actions --\x3e\n\t\t\t<NcActions v-if=\"active\"\n\t\t\t\tref=\"actionsMenu\"\n\t\t\t\t:disabled=\"source._loading\"\n\t\t\t\t:force-title=\"true\"\n\t\t\t\t:inline=\"enabledInlineActions.length\"\n\t\t\t\t:open.sync=\"openedMenu\">\n\t\t\t\t<NcActionButton v-for=\"action in enabledMenuActions\"\n\t\t\t\t\t:key=\"action.id\"\n\t\t\t\t\t:class=\"'files-list__row-action-' + action.id\"\n\t\t\t\t\t@click=\"onActionClick(action)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"loading === action.id\" :size=\"18\" />\n\t\t\t\t\t\t<CustomSvgIconRender v-else :svg=\"action.iconSvgInline([source], currentView)\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ action.displayName([source], currentView) }}\n\t\t\t\t</NcActionButton>\n\t\t\t</NcActions>\n\t\t</td>\n\n\t\t\x3c!-- Size --\x3e\n\t\t<td v-if=\"isSizeAvailable\"\n\t\t\t:style=\"{ opacity: sizeOpacity }\"\n\t\t\tclass=\"files-list__row-size\">\n\t\t\t<span>{{ size }}</span>\n\t\t</td>\n\n\t\t\x3c!-- View columns --\x3e\n\t\t<td v-for=\"column in columns\"\n\t\t\t:key=\"column.id\"\n\t\t\t:class=\"`files-list__row-${currentView?.id}-${column.id}`\"\n\t\t\tclass=\"files-list__row-column-custom\">\n\t\t\t<CustomElementRender v-if=\"active\"\n\t\t\t\t:current-view=\"currentView\"\n\t\t\t\t:render=\"column.render\"\n\t\t\t\t:source=\"source\" />\n\t\t</td>\n\t</Fragment>\n</template>\n\n<script lang='ts'>\nimport { debounce } from 'debounce'\nimport { formatFileSize } from '@nextcloud/files'\nimport { Fragment } from 'vue-frag'\nimport { join } from 'path'\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { translate } from '@nextcloud/l10n'\nimport CancelablePromise from 'cancelable-promise'\nimport FileIcon from 'vue-material-design-icons/File.vue'\nimport FolderIcon from 'vue-material-design-icons/Folder.vue'\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\nimport Vue from 'vue'\n\nimport { getFileActions } from '../services/FileAction.ts'\nimport { isCachedPreview } from '../services/PreviewService.ts'\nimport { useActionsMenuStore } from '../store/actionsmenu.ts'\nimport { useFilesStore } from '../store/files.ts'\nimport { useKeyboardStore } from '../store/keyboard.ts'\nimport { useSelectionStore } from '../store/selection.ts'\nimport { useUserConfigStore } from '../store/userconfig.ts'\nimport CustomElementRender from './CustomElementRender.vue'\nimport CustomSvgIconRender from './CustomSvgIconRender.vue'\nimport logger from '../logger.js'\n\n// The registered actions list\nconst actions = getFileActions()\n\nexport default Vue.extend({\n\tname: 'FileEntry',\n\n\tcomponents: {\n\t\tCustomElementRender,\n\t\tCustomSvgIconRender,\n\t\tFileIcon,\n\t\tFolderIcon,\n\t\tFragment,\n\t\tNcActionButton,\n\t\tNcActions,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcLoadingIcon,\n\t},\n\n\tprops: {\n\t\tactive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisSizeAvailable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tsource: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tindex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tnodes: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tfilesListWidth: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst actionsMenuStore = useActionsMenuStore()\n\t\tconst filesStore = useFilesStore()\n\t\tconst keyboardStore = useKeyboardStore()\n\t\tconst selectionStore = useSelectionStore()\n\t\tconst userConfigStore = useUserConfigStore()\n\t\treturn {\n\t\t\tactionsMenuStore,\n\t\t\tfilesStore,\n\t\t\tkeyboardStore,\n\t\t\tselectionStore,\n\t\t\tuserConfigStore,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tbackgroundFailed: false,\n\t\t\tbackgroundImage: '',\n\t\t\tloading: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tuserConfig() {\n\t\t\treturn this.userConfigStore.userConfig\n\t\t},\n\n\t\tcurrentView() {\n\t\t\treturn this.$navigation.active\n\t\t},\n\n\t\tcolumns() {\n\t\t\t// Hide columns if the list is too small\n\t\t\tif (this.filesListWidth < 512) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.currentView?.columns || []\n\t\t},\n\n\t\tdir() {\n\t\t\t// Remove any trailing slash but leave root slash\n\t\t\treturn (this.$route?.query?.dir || '/').replace(/^(.+)\\/$/, '$1')\n\t\t},\n\n\t\tfileid() {\n\t\t\treturn this.source?.fileid?.toString?.()\n\t\t},\n\t\tdisplayName() {\n\t\t\treturn this.source.attributes.displayName\n\t\t\t\t|| this.source.basename\n\t\t},\n\t\tsize() {\n\t\t\tconst size = parseInt(this.source.size, 10) || 0\n\t\t\tif (typeof size !== 'number' || size < 0) {\n\t\t\t\treturn this.t('files', 'Pending')\n\t\t\t}\n\t\t\treturn formatFileSize(size, true)\n\t\t},\n\n\t\tsizeOpacity() {\n\t\t\tconst size = parseInt(this.source.size, 10) || 0\n\t\t\tif (!size || size < 0) {\n\t\t\t\treturn 1\n\t\t\t}\n\n\t\t\t// Whatever theme is active, the contrast will pass WCAG AA\n\t\t\t// with color main text over main background and an opacity of 0.7\n\t\t\tconst minOpacity = 0.7\n\t\t\tconst maxOpacitySize = 10 * 1024 * 1024\n\t\t\treturn minOpacity + (1 - minOpacity) * Math.pow((this.source.size / maxOpacitySize), 2)\n\t\t},\n\n\t\tlinkTo() {\n\t\t\tif (this.source.type === 'folder') {\n\t\t\t\tconst to = { ...this.$route, query: { dir: join(this.dir, this.source.basename) } }\n\t\t\t\treturn {\n\t\t\t\t\tis: 'router-link',\n\t\t\t\t\ttitle: this.t('files', 'Open folder {name}', { name: this.displayName }),\n\t\t\t\t\tto,\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\thref: this.source.source,\n\t\t\t\t// TODO: Use first action title ?\n\t\t\t\ttitle: this.t('files', 'Download file {name}', { name: this.displayName }),\n\t\t\t}\n\t\t},\n\n\t\tselectedFiles() {\n\t\t\treturn this.selectionStore.selected\n\t\t},\n\t\tisSelected() {\n\t\t\treturn this.selectedFiles.includes(this.source?.fileid?.toString?.())\n\t\t},\n\n\t\tcropPreviews() {\n\t\t\treturn this.userConfig.crop_image_previews\n\t\t},\n\n\t\tpreviewUrl() {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(window.location.origin + this.source.attributes.previewUrl)\n\t\t\t\t// Request tiny previews\n\t\t\t\turl.searchParams.set('x', '32')\n\t\t\t\turl.searchParams.set('y', '32')\n\t\t\t\t// Handle cropping\n\t\t\t\turl.searchParams.set('a', this.cropPreviews === true ? '1' : '0')\n\t\t\t\treturn url.href\n\t\t\t} catch (e) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\tmimeIconUrl() {\n\t\t\tconst mimeType = this.source.mime || 'application/octet-stream'\n\t\t\tconst mimeIconUrl = window.OC?.MimeType?.getIconUrl?.(mimeType)\n\t\t\tif (mimeIconUrl) {\n\t\t\t\treturn `url(${mimeIconUrl})`\n\t\t\t}\n\t\t\treturn ''\n\t\t},\n\n\t\tenabledActions() {\n\t\t\treturn actions\n\t\t\t\t.filter(action => !action.enabled || action.enabled([this.source], this.currentView))\n\t\t\t\t.sort((a, b) => (a.order || 0) - (b.order || 0))\n\t\t},\n\n\t\tenabledInlineActions() {\n\t\t\tif (this.filesListWidth < 768) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.enabledActions.filter(action => action?.inline?.(this.source, this.currentView))\n\t\t},\n\n\t\tenabledMenuActions() {\n\t\t\tif (this.filesListWidth < 768) {\n\t\t\t\treturn this.enabledActions\n\t\t\t}\n\n\t\t\treturn [\n\t\t\t\t...this.enabledInlineActions,\n\t\t\t\t...this.enabledActions.filter(action => !action.inline),\n\t\t\t]\n\t\t},\n\n\t\tuniqueId() {\n\t\t\treturn this.hashCode(this.source.source)\n\t\t},\n\n\t\topenedMenu: {\n\t\t\tget() {\n\t\t\t\treturn this.actionsMenuStore.opened === this.uniqueId\n\t\t\t},\n\t\t\tset(opened) {\n\t\t\t\tthis.actionsMenuStore.opened = opened ? this.uniqueId : null\n\t\t\t},\n\t\t},\n\t},\n\n\twatch: {\n\t\tactive(active, before) {\n\t\t\tif (active === false && before === true) {\n\t\t\t\tthis.resetState()\n\n\t\t\t\t// When the row is not active anymore\n\t\t\t\t// remove the display from the row to prevent\n\t\t\t\t// keyboard interaction with it.\n\t\t\t\tthis.$el.parentNode.style.display = 'none'\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Restore default tabindex\n\t\t\tthis.$el.parentNode.style.display = ''\n\t\t},\n\n\t\t/**\n\t\t * When the source changes, reset the preview\n\t\t * and fetch the new one.\n\t\t */\n\t\tpreviewUrl() {\n\t\t\tthis.clearImg()\n\t\t\tthis.debounceIfNotCached()\n\t\t},\n\t},\n\n\t/**\n\t * The row is mounted once and reused as we scroll.\n\t */\n\tmounted() {\n\t\t// ⚠ Init the debounce function on mount and\n\t\t// not when the module is imported to\n\t\t// avoid sharing between recycled components\n\t\tthis.debounceGetPreview = debounce(function() {\n\t\t\tthis.fetchAndApplyPreview()\n\t\t}, 150, false)\n\n\t\t// Fetch the preview on init\n\t\tthis.debounceIfNotCached()\n\n\t\t// Right click watcher on tr\n\t\tthis.$el.parentNode?.addEventListener?.('contextmenu', this.onRightClick)\n\t},\n\n\tbeforeDestroy() {\n\t\tthis.resetState()\n\t},\n\n\tmethods: {\n\t\tasync debounceIfNotCached() {\n\t\t\tif (!this.previewUrl) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Check if we already have this preview cached\n\t\t\tconst isCached = await isCachedPreview(this.previewUrl)\n\t\t\tif (isCached) {\n\t\t\t\tthis.backgroundImage = `url(${this.previewUrl})`\n\t\t\t\tthis.backgroundFailed = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// We don't have this preview cached or it expired, requesting it\n\t\t\tthis.debounceGetPreview()\n\t\t},\n\n\t\tfetchAndApplyPreview() {\n\t\t\t// Ignore if no preview\n\t\t\tif (!this.previewUrl) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// If any image is being processed, reset it\n\t\t\tif (this.previewPromise) {\n\t\t\t\tthis.clearImg()\n\t\t\t}\n\n\t\t\t// Store the promise to be able to cancel it\n\t\t\tthis.previewPromise = new CancelablePromise((resolve, reject, onCancel) => {\n\t\t\t\tconst img = new Image()\n\t\t\t\t// If active, load the preview with higher priority\n\t\t\t\timg.fetchpriority = this.active ? 'high' : 'auto'\n\t\t\t\timg.onload = () => {\n\t\t\t\t\tthis.backgroundImage = `url(${this.previewUrl})`\n\t\t\t\t\tthis.backgroundFailed = false\n\t\t\t\t\tresolve(img)\n\t\t\t\t}\n\t\t\t\timg.onerror = () => {\n\t\t\t\t\tthis.backgroundFailed = true\n\t\t\t\t\treject(img)\n\t\t\t\t}\n\t\t\t\timg.src = this.previewUrl\n\n\t\t\t\t// Image loading has been canceled\n\t\t\t\tonCancel(() => {\n\t\t\t\t\timg.onerror = null\n\t\t\t\t\timg.onload = null\n\t\t\t\t\timg.src = ''\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\n\t\tresetState() {\n\t\t\t// Reset loading state\n\t\t\tthis.loading = ''\n\n\t\t\t// Reset the preview\n\t\t\tthis.clearImg()\n\n\t\t\t// Close menu\n\t\t\tthis.openedMenu = false\n\t\t},\n\n\t\tclearImg() {\n\t\t\tthis.backgroundImage = ''\n\t\t\tthis.backgroundFailed = false\n\n\t\t\tif (this.previewPromise) {\n\t\t\t\tthis.previewPromise.cancel()\n\t\t\t\tthis.previewPromise = null\n\t\t\t}\n\t\t},\n\n\t\thashCode(str) {\n\t\t\tlet hash = 0\n\t\t\tfor (let i = 0, len = str.length; i < len; i++) {\n\t\t\t\tconst chr = str.charCodeAt(i)\n\t\t\t\thash = (hash << 5) - hash + chr\n\t\t\t\thash |= 0 // Convert to 32bit integer\n\t\t\t}\n\t\t\treturn hash\n\t\t},\n\n\t\tasync onActionClick(action) {\n\t\t\tconst displayName = action.displayName([this.source], this.currentView)\n\t\t\ttry {\n\t\t\t\t// Set the loading marker\n\t\t\t\tthis.loading = action.id\n\t\t\t\tVue.set(this.source, '_loading', true)\n\n\t\t\t\tconst success = await action.exec(this.source, this.currentView)\n\t\t\t\tif (success) {\n\t\t\t\t\tshowSuccess(this.t('files', '\"{displayName}\" action executed successfully', { displayName }))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tshowError(this.t('files', '\"{displayName}\" action failed', { displayName }))\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error('Error while executing action', { action, e })\n\t\t\t\tshowError(this.t('files', '\"{displayName}\" action failed', { displayName }))\n\t\t\t} finally {\n\t\t\t\t// Reset the loading marker\n\t\t\t\tthis.loading = ''\n\t\t\t\tVue.set(this.source, '_loading', false)\n\t\t\t}\n\t\t},\n\n\t\tonSelectionChange(selection) {\n\t\t\tconst newSelectedIndex = this.index\n\t\t\tconst lastSelectedIndex = this.selectionStore.lastSelectedIndex\n\n\t\t\t// Get the last selected and select all files in between\n\t\t\tif (this.keyboardStore?.shiftKey && lastSelectedIndex !== null) {\n\t\t\t\tconst isAlreadySelected = this.selectedFiles.includes(this.fileid)\n\n\t\t\t\tconst start = Math.min(newSelectedIndex, lastSelectedIndex)\n\t\t\t\tconst end = Math.max(lastSelectedIndex, newSelectedIndex)\n\n\t\t\t\tconst lastSelection = this.selectionStore.lastSelection\n\t\t\t\tconst filesToSelect = this.nodes\n\t\t\t\t\t.map(file => file.fileid?.toString?.())\n\t\t\t\t\t.slice(start, end + 1)\n\n\t\t\t\t// If already selected, update the new selection _without_ the current file\n\t\t\t\tconst selection = [...lastSelection, ...filesToSelect]\n\t\t\t\t\t.filter(fileId => !isAlreadySelected || fileId !== this.fileid)\n\n\t\t\t\tlogger.debug('Shift key pressed, selecting all files in between', { start, end, filesToSelect, isAlreadySelected })\n\t\t\t\t// Keep previous lastSelectedIndex to be use for further shift selections\n\t\t\t\tthis.selectionStore.set(selection)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlogger.debug('Updating selection', { selection })\n\t\t\tthis.selectionStore.set(selection)\n\t\t\tthis.selectionStore.setLastIndex(newSelectedIndex)\n\t\t},\n\n\t\t// Open the actions menu on right click\n\t\tonRightClick(event) {\n\t\t\t// If already opened, fallback to default browser\n\t\t\tif (this.openedMenu) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// If the clicked row is in the selection, open global menu\n\t\t\tconst isMoreThanOneSelected = this.selectedFiles.length > 1\n\t\t\tthis.actionsMenuStore.opened = this.isSelected && isMoreThanOneSelected ? 'global' : this.uniqueId\n\n\t\t\t// Prevent any browser defaults\n\t\t\tevent.preventDefault()\n\t\t\tevent.stopPropagation()\n\t\t},\n\n\t\tt: translate,\n\t\tformatFileSize,\n\t},\n})\n<\/script>\n\n<style scoped lang='scss'>\n/* Hover effect on tbody lines only */\ntr {\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\tbackground-color: var(--color-background-dark);\n\t}\n}\n\n/* Preview not loaded animation effect */\n.files-list__row-icon-preview:not([style*='background']) {\n background: var(--color-loading-dark);\n\t// animation: preview-gradient-fade 1.2s ease-in-out infinite;\n}\n</style>\n\n<style>\n/* @keyframes preview-gradient-fade {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n 100% {\n opacity: 1;\n }\n} */\n</style>\n"],sourceRoot:""}]);const a=r}},i={};function o(t){var e=i[t];if(void 0!==e)return e.exports;var s=i[t]={id:t,loaded:!1,exports:{}};return n[t].call(s.exports,s,s.exports,o),s.loaded=!0,s.exports}o.m=n,e=[],o.O=(t,n,i,s)=>{if(!n){var r=1/0;for(d=0;d<e.length;d++){n=e[d][0],i=e[d][1],s=e[d][2];for(var a=!0,l=0;l<n.length;l++)(!1&s||r>=s)&&Object.keys(o.O).every((t=>o.O[t](n[l])))?n.splice(l--,1):(a=!1,s<r&&(r=s));if(a){e.splice(d--,1);var c=i();void 0!==c&&(t=c)}}return t}s=s||0;for(var d=e.length;d>0&&e[d-1][2]>s;d--)e[d]=e[d-1];e[d]=[n,i,s]},o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),o.j=2181,(()=>{o.b=document.baseURI||self.location.href;var t={2181:0};o.O.j=e=>0===t[e];var e=(e,n)=>{var i,s,r=n[0],a=n[1],l=n[2],c=0;if(r.some((e=>0!==t[e]))){for(i in a)o.o(a,i)&&(o.m[i]=a[i]);if(l)var d=l(o)}for(e&&e(n);c<r.length;c++)s=r[c],o.o(t,s)&&t[s]&&t[s][0](),t[s]=0;return o.O(d)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))})(),o.nc=void 0;var s=o.O(void 0,[7874],(()=>o(7867)));s=o.O(s)})(); +//# sourceMappingURL=files-main.js.map?v=57ff0f356ac390eab2f8
\ No newline at end of file diff --git a/dist/files-main.js.map b/dist/files-main.js.map index 2503b094e2c..44eaf28ad9b 100644 --- a/dist/files-main.js.map +++ b/dist/files-main.js.map @@ -1 +1 @@ -{"version":3,"file":"files-main.js?v=076cc8adafbfb8f84978","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/files/src/utils/davUtils.js","webpack:///nextcloud/apps/files/src/utils/fileUtils.js","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?8258","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?81db","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?c414","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/files/src/services/Templates.js","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?6cbe","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?afd8","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?1f7b","webpack:///nextcloud/apps/files/src/templates.js","webpack:///nextcloud/apps/files/src/legacy/filelistSearch.js","webpack:///nextcloud/apps/files/src/logger.js","webpack:///nextcloud/apps/files/src/services/FileAction.ts","webpack:///nextcloud/apps/files/src/actions/deleteAction.ts","webpack:///nextcloud/apps/files/src/legacy/navigationMapper.js","webpack:///nextcloud/apps/files/src/services/Navigation.ts","webpack://nextcloud/./apps/files/src/views/Navigation.vue?8122","webpack:///nextcloud/core/src/OCP/accessibility.js","webpack:///nextcloud/apps/files/src/store/viewConfig.ts","webpack://nextcloud/./apps/files/src/components/NavigationQuota.vue?08cb","webpack:///nextcloud/apps/files/src/components/NavigationQuota.vue","webpack:///nextcloud/apps/files/src/components/NavigationQuota.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/NavigationQuota.vue?ff39","webpack://nextcloud/./apps/files/src/components/NavigationQuota.vue?2966","webpack://nextcloud/./apps/files/src/views/Settings.vue?84f7","webpack:///nextcloud/apps/files/src/components/Setting.vue","webpack:///nextcloud/apps/files/src/components/Setting.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/Setting.vue?98ea","webpack://nextcloud/./apps/files/src/components/Setting.vue?8d57","webpack:///nextcloud/apps/files/src/store/userconfig.ts","webpack:///nextcloud/apps/files/src/views/Settings.vue","webpack:///nextcloud/apps/files/src/views/Settings.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/views/Settings.vue?7e31","webpack://nextcloud/./apps/files/src/views/Settings.vue?b81b","webpack:///nextcloud/apps/files/src/views/Navigation.vue","webpack:///nextcloud/apps/files/src/views/Navigation.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/views/Navigation.vue?2794","webpack://nextcloud/./apps/files/src/views/Navigation.vue?74b9","webpack://nextcloud/./apps/files/src/views/FilesList.vue?efeb","webpack:///nextcloud/apps/files/src/store/files.ts","webpack:///nextcloud/apps/files/src/store/paths.ts","webpack:///nextcloud/apps/files/src/store/selection.ts","webpack://nextcloud/./apps/files/src/components/BreadCrumbs.vue?e906","webpack:///nextcloud/apps/files/src/components/BreadCrumbs.vue","webpack:///nextcloud/apps/files/src/components/BreadCrumbs.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/BreadCrumbs.vue?e59f","webpack://nextcloud/./apps/files/src/components/BreadCrumbs.vue?d357","webpack://nextcloud/./apps/files/src/components/FilesListVirtual.vue?9d6c","webpack:///nextcloud/apps/files/src/services/PreviewService.ts","webpack:///nextcloud/apps/files/src/store/actionsmenu.ts","webpack:///nextcloud/apps/files/src/components/CustomElementRender.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/files/src/components/CustomElementRender.vue","webpack://nextcloud/./apps/files/src/components/CustomElementRender.vue?5f5c","webpack://nextcloud/./apps/files/src/components/CustomElementRender.vue?4ee7","webpack://nextcloud/./apps/files/src/components/CustomSvgIconRender.vue?2c34","webpack:///nextcloud/apps/files/src/components/CustomSvgIconRender.vue","webpack:///nextcloud/apps/files/src/components/CustomSvgIconRender.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/CustomSvgIconRender.vue?6bea","webpack://nextcloud/./apps/files/src/components/CustomSvgIconRender.vue?5641","webpack:///nextcloud/apps/files/src/components/FileEntry.vue","webpack:///nextcloud/apps/files/src/store/keyboard.ts","webpack:///nextcloud/apps/files/src/components/FileEntry.vue?vue&type=script&lang=ts&","webpack://nextcloud/./apps/files/src/components/FileEntry.vue?8a78","webpack://nextcloud/./apps/files/src/components/FileEntry.vue?5d50","webpack://nextcloud/./apps/files/src/components/FileEntry.vue?da7c","webpack://nextcloud/./apps/files/src/components/FileEntry.vue?77f7","webpack:///nextcloud/apps/files/src/components/FilesListFooter.vue?vue&type=script&lang=ts&","webpack:///nextcloud/apps/files/src/components/FilesListFooter.vue","webpack://nextcloud/./apps/files/src/components/FilesListFooter.vue?14b9","webpack://nextcloud/./apps/files/src/components/FilesListFooter.vue?80db","webpack://nextcloud/./apps/files/src/components/FilesListFooter.vue?a2f0","webpack:///nextcloud/apps/files/src/mixins/filesListWidth.ts","webpack:///nextcloud/apps/files/src/components/FilesListHeaderActions.vue","webpack:///nextcloud/apps/files/src/components/FilesListHeaderActions.vue?vue&type=script&lang=ts&","webpack://nextcloud/./apps/files/src/components/FilesListHeaderActions.vue?c5d9","webpack://nextcloud/./apps/files/src/components/FilesListHeaderActions.vue?9823","webpack://nextcloud/./apps/files/src/components/FilesListHeaderActions.vue?1b40","webpack://nextcloud/./apps/files/src/components/FilesListHeaderButton.vue?fb45","webpack:///nextcloud/apps/files/src/mixins/filesSorting.ts","webpack:///nextcloud/apps/files/src/components/FilesListHeaderButton.vue?vue&type=script&lang=ts&","webpack:///nextcloud/apps/files/src/components/FilesListHeaderButton.vue","webpack://nextcloud/./apps/files/src/components/FilesListHeaderButton.vue?d900","webpack://nextcloud/./apps/files/src/components/FilesListHeaderButton.vue?5686","webpack:///nextcloud/apps/files/src/components/FilesListHeader.vue?vue&type=script&lang=ts&","webpack:///nextcloud/apps/files/src/components/FilesListHeader.vue","webpack://nextcloud/./apps/files/src/components/FilesListHeader.vue?7248","webpack://nextcloud/./apps/files/src/components/FilesListHeader.vue?349b","webpack://nextcloud/./apps/files/src/components/FilesListHeader.vue?635d","webpack:///nextcloud/apps/files/src/components/FilesListVirtual.vue?vue&type=script&lang=ts&","webpack:///nextcloud/apps/files/src/components/FilesListVirtual.vue","webpack://nextcloud/./apps/files/src/components/FilesListVirtual.vue?d01d","webpack://nextcloud/./apps/files/src/components/FilesListVirtual.vue?3555","webpack:///nextcloud/apps/files/src/views/FilesList.vue?vue&type=script&lang=ts&","webpack:///nextcloud/apps/files/src/views/FilesList.vue","webpack://nextcloud/./apps/files/src/views/FilesList.vue?e4c4","webpack://nextcloud/./apps/files/src/views/FilesList.vue?1e5b","webpack:///nextcloud/apps/files/src/router/router.js","webpack:///nextcloud/apps/files/src/main.js","webpack:///nextcloud/apps/files/src/services/Settings.js","webpack:///nextcloud/apps/files/src/models/Setting.js","webpack:///nextcloud/apps/files/src/services/ServiceWorker.js","webpack:///nextcloud/apps/files/src/components/BreadCrumbs.vue?vue&type=style&index=0&id=68b3b20b&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/components/CustomSvgIconRender.vue?vue&type=style&index=0&id=93e9b2f4&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/components/FileEntry.vue?vue&type=style&index=0&id=47057834&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/components/FilesListFooter.vue?vue&type=style&index=0&id=e6a083be&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/components/FilesListHeader.vue?vue&type=style&index=0&id=53698ce8&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/components/FilesListHeaderActions.vue?vue&type=style&index=0&id=9d92da06&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/components/FilesListHeaderButton.vue?vue&type=style&index=0&id=e85a09d2&prod&lang=scss&","webpack:///nextcloud/apps/files/src/components/FilesListVirtual.vue?vue&type=style&index=0&id=07b86e54&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/components/NavigationQuota.vue?vue&type=style&index=0&id=918797b2&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue?vue&type=style&index=0&id=6c072a31&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/views/FilesList.vue?vue&type=style&index=0&id=77548daf&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/views/Navigation.vue?vue&type=style&index=0&id=508e08a4&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/views/Settings.vue?vue&type=style&index=0&id=76ca5d1f&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue?vue&type=style&index=0&id=715b4161&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/components/FileEntry.vue?vue&type=style&index=1&id=47057834&prod&lang=css&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { generateRemoteUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\n\nexport const getRootPath = function() {\n\tif (getCurrentUser()) {\n\t\treturn generateRemoteUrl(`dav/files/${getCurrentUser().uid}`)\n\t} else {\n\t\treturn generateRemoteUrl('webdav').replace('/remote.php', '/public.php')\n\t}\n}\n\nexport const isPublic = function() {\n\treturn !getCurrentUser()\n}\n\nexport const getToken = function() {\n\treturn document.getElementById('sharingToken') && document.getElementById('sharingToken').value\n}\n\n/**\n * Return the current directory, fallback to root\n *\n * @return {string}\n */\nexport const getCurrentDirectory = function() {\n\tconst currentDirInfo = OCA?.Files?.App?.currentFileList?.dirInfo\n\t\t|| { path: '/', name: '' }\n\n\t// Make sure we don't have double slashes\n\treturn `${currentDirInfo.path}/${currentDirInfo.name}`.replace(/\\/\\//gi, '/')\n}\n","/**\n * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nconst encodeFilePath = function(path) {\n\tconst pathSections = (path.startsWith('/') ? path : `/${path}`).split('/')\n\tlet relativePath = ''\n\tpathSections.forEach((section) => {\n\t\tif (section !== '') {\n\t\t\trelativePath += '/' + encodeURIComponent(section)\n\t\t}\n\t})\n\treturn relativePath\n}\n\n/**\n * Extract dir and name from file path\n *\n * @param {string} path the full path\n * @return {string[]} [dirPath, fileName]\n */\nconst extractFilePaths = function(path) {\n\tconst pathSections = path.split('/')\n\tconst fileName = pathSections[pathSections.length - 1]\n\tconst dirPath = pathSections.slice(0, pathSections.length - 1).join('/')\n\treturn [dirPath, fileName]\n}\n\nexport { encodeFilePath, extractFilePaths }\n","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<li class=\"template-picker__item\">\n\t\t<input :id=\"id\"\n\t\t\t:checked=\"checked\"\n\t\t\ttype=\"radio\"\n\t\t\tclass=\"radio\"\n\t\t\tname=\"template-picker\"\n\t\t\t@change=\"onCheck\">\n\n\t\t<label :for=\"id\" class=\"template-picker__label\">\n\t\t\t<div class=\"template-picker__preview\"\n\t\t\t\t:class=\"failedPreview ? 'template-picker__preview--failed' : ''\">\n\t\t\t\t<img class=\"template-picker__image\"\n\t\t\t\t\t:src=\"realPreviewUrl\"\n\t\t\t\t\talt=\"\"\n\t\t\t\t\tdraggable=\"false\"\n\t\t\t\t\t@error=\"onFailure\">\n\t\t\t</div>\n\n\t\t\t<span class=\"template-picker__title\">\n\t\t\t\t{{ nameWithoutExt }}\n\t\t\t</span>\n\t\t</label>\n\t</li>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\nimport { encodeFilePath } from '../utils/fileUtils.js'\nimport { getToken, isPublic } from '../utils/davUtils.js'\n\n// preview width generation\nconst previewWidth = 256\n\nexport default {\n\tname: 'TemplatePreview',\n\tinheritAttrs: false,\n\n\tprops: {\n\t\tbasename: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tchecked: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tfileid: {\n\t\t\ttype: [String, Number],\n\t\t\trequired: true,\n\t\t},\n\t\tfilename: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tpreviewUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\thasPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tmime: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tratio: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tfailedPreview: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Strip away extension from name\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tnameWithoutExt() {\n\t\t\treturn this.basename.indexOf('.') > -1 ? this.basename.split('.').slice(0, -1).join('.') : this.basename\n\t\t},\n\n\t\tid() {\n\t\t\treturn `template-picker-${this.fileid}`\n\t\t},\n\n\t\trealPreviewUrl() {\n\t\t\t// If original preview failed, fallback to mime icon\n\t\t\tif (this.failedPreview && this.mimeIcon) {\n\t\t\t\treturn this.mimeIcon\n\t\t\t}\n\n\t\t\tif (this.previewUrl) {\n\t\t\t\treturn this.previewUrl\n\t\t\t}\n\t\t\t// TODO: find a nicer standard way of doing this?\n\t\t\tif (isPublic()) {\n\t\t\t\treturn generateUrl(`/apps/files_sharing/publicpreview/${getToken()}?fileId=${this.fileid}&file=${encodeFilePath(this.filename)}&x=${previewWidth}&y=${previewWidth}&a=1`)\n\t\t\t}\n\t\t\treturn generateUrl(`/core/preview?fileId=${this.fileid}&x=${previewWidth}&y=${previewWidth}&a=1`)\n\t\t},\n\n\t\tmimeIcon() {\n\t\t\treturn OC.MimeType.getIconUrl(this.mime)\n\t\t},\n\t},\n\n\tmethods: {\n\t\tonCheck() {\n\t\t\tthis.$emit('check', this.fileid)\n\t\t},\n\t\tonFailure() {\n\t\t\tthis.failedPreview = true\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\n.template-picker {\n\t&__item {\n\t\tdisplay: flex;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\t// Align in the middle of the grid\n\t\talign-items: center;\n\t\tflex: 1 1;\n\t\tflex-direction: column;\n\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&::before {\n\t\t\tdisplay: none !important;\n\t\t}\n\t}\n\n\t&__preview {\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\t// Stretch so all entries are the same width\n\t\tflex: 1 1;\n\t\twidth: var(--width);\n\t\tmin-height: var(--height);\n\t\tmax-height: var(--height);\n\t\tpadding: 0;\n\t\tborder: var(--border) solid var(--color-border);\n\t\tborder-radius: var(--border-radius-large);\n\n\t\tinput:checked + label > & {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\n\t\t&--failed {\n\t\t\t// Make sure to properly center fallback icon\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n\n\t&__image {\n\t\tmax-width: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tobject-fit: cover;\n\t}\n\n\t// Failed preview, fallback to mime icon\n\t&__preview--failed &__image {\n\t\twidth: calc(var(--margin) * 8);\n\t\t// Center mime icon\n\t\tmargin: auto;\n\t\tbackground-color: transparent !important;\n\n\t\tobject-fit: initial;\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\t// also count preview border\n\t\tmax-width: calc(var(--width) + 2*2px);\n\t\tpadding: var(--margin);\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePreview.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePreview.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePreview.vue?vue&type=style&index=0&id=6c072a31&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePreview.vue?vue&type=style&index=0&id=6c072a31&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./TemplatePreview.vue?vue&type=template&id=6c072a31&scoped=true&\"\nimport script from \"./TemplatePreview.vue?vue&type=script&lang=js&\"\nexport * from \"./TemplatePreview.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemplatePreview.vue?vue&type=style&index=0&id=6c072a31&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6c072a31\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('li',{staticClass:\"template-picker__item\"},[_c('input',{staticClass:\"radio\",attrs:{\"id\":_vm.id,\"type\":\"radio\",\"name\":\"template-picker\"},domProps:{\"checked\":_vm.checked},on:{\"change\":_vm.onCheck}}),_vm._v(\" \"),_c('label',{staticClass:\"template-picker__label\",attrs:{\"for\":_vm.id}},[_c('div',{staticClass:\"template-picker__preview\",class:_vm.failedPreview ? 'template-picker__preview--failed' : ''},[_c('img',{staticClass:\"template-picker__image\",attrs:{\"src\":_vm.realPreviewUrl,\"alt\":\"\",\"draggable\":\"false\"},on:{\"error\":_vm.onFailure}})]),_vm._v(\" \"),_c('span',{staticClass:\"template-picker__title\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.nameWithoutExt)+\"\\n\\t\\t\")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<NcModal v-if=\"opened\"\n\t\t:clear-view-delay=\"-1\"\n\t\tclass=\"templates-picker\"\n\t\tsize=\"normal\"\n\t\t@close=\"close\">\n\t\t<form class=\"templates-picker__form\"\n\t\t\t:style=\"style\"\n\t\t\t@submit.prevent.stop=\"onSubmit\">\n\t\t\t<h2>{{ t('files', 'Pick a template for {name}', { name: nameWithoutExt }) }}</h2>\n\n\t\t\t<!-- Templates list -->\n\t\t\t<ul class=\"templates-picker__list\">\n\t\t\t\t<TemplatePreview v-bind=\"emptyTemplate\"\n\t\t\t\t\t:checked=\"checked === emptyTemplate.fileid\"\n\t\t\t\t\t@check=\"onCheck\" />\n\n\t\t\t\t<TemplatePreview v-for=\"template in provider.templates\"\n\t\t\t\t\t:key=\"template.fileid\"\n\t\t\t\t\tv-bind=\"template\"\n\t\t\t\t\t:checked=\"checked === template.fileid\"\n\t\t\t\t\t:ratio=\"provider.ratio\"\n\t\t\t\t\t@check=\"onCheck\" />\n\t\t\t</ul>\n\n\t\t\t<!-- Cancel and submit -->\n\t\t\t<div class=\"templates-picker__buttons\">\n\t\t\t\t<button @click=\"close\">\n\t\t\t\t\t{{ t('files', 'Cancel') }}\n\t\t\t\t</button>\n\t\t\t\t<input type=\"submit\"\n\t\t\t\t\tclass=\"primary\"\n\t\t\t\t\t:value=\"t('files', 'Create')\"\n\t\t\t\t\t:aria-label=\"t('files', 'Create a new file with the selected template')\">\n\t\t\t</div>\n\t\t</form>\n\n\t\t<NcEmptyContent v-if=\"loading\" class=\"templates-picker__loading\" icon=\"icon-loading\">\n\t\t\t{{ t('files', 'Creating file') }}\n\t\t</NcEmptyContent>\n\t</NcModal>\n</template>\n\n<script>\nimport { normalize } from 'path'\nimport { showError } from '@nextcloud/dialogs'\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\nimport NcModal from '@nextcloud/vue/dist/Components/NcModal.js'\n\nimport { getCurrentDirectory } from '../utils/davUtils.js'\nimport { createFromTemplate, getTemplates } from '../services/Templates.js'\nimport TemplatePreview from '../components/TemplatePreview.vue'\n\nconst border = 2\nconst margin = 8\nconst width = margin * 20\n\nexport default {\n\tname: 'TemplatePicker',\n\n\tcomponents: {\n\t\tNcEmptyContent,\n\t\tNcModal,\n\t\tTemplatePreview,\n\t},\n\n\tprops: {\n\t\tlogger: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\t// Check empty template by default\n\t\t\tchecked: -1,\n\t\t\tloading: false,\n\t\t\tname: null,\n\t\t\topened: false,\n\t\t\tprovider: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Strip away extension from name\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tnameWithoutExt() {\n\t\t\treturn this.name.indexOf('.') > -1\n\t\t\t\t? this.name.split('.').slice(0, -1).join('.')\n\t\t\t\t: this.name\n\t\t},\n\n\t\temptyTemplate() {\n\t\t\treturn {\n\t\t\t\tbasename: t('files', 'Blank'),\n\t\t\t\tfileid: -1,\n\t\t\t\tfilename: this.t('files', 'Blank'),\n\t\t\t\thasPreview: false,\n\t\t\t\tmime: this.provider?.mimetypes[0] || this.provider?.mimetypes,\n\t\t\t}\n\t\t},\n\n\t\tselectedTemplate() {\n\t\t\treturn this.provider.templates.find(template => template.fileid === this.checked)\n\t\t},\n\n\t\t/**\n\t\t * Style css vars bin,d\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tstyle() {\n\t\t\treturn {\n\t\t\t\t'--margin': margin + 'px',\n\t\t\t\t'--width': width + 'px',\n\t\t\t\t'--border': border + 'px',\n\t\t\t\t'--fullwidth': width + 2 * margin + 2 * border + 'px',\n\t\t\t\t'--height': this.provider.ratio ? Math.round(width / this.provider.ratio) + 'px' : null,\n\t\t\t}\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Open the picker\n\t\t *\n\t\t * @param {string} name the file name to create\n\t\t * @param {object} provider the template provider picked\n\t\t */\n\t\tasync open(name, provider) {\n\n\t\t\tthis.checked = this.emptyTemplate.fileid\n\t\t\tthis.name = name\n\t\t\tthis.provider = provider\n\n\t\t\tconst templates = await getTemplates()\n\t\t\tconst fetchedProvider = templates.find((fetchedProvider) => fetchedProvider.app === provider.app && fetchedProvider.label === provider.label)\n\t\t\tif (fetchedProvider === null) {\n\t\t\t\tthrow new Error('Failed to match provider in results')\n\t\t\t}\n\t\t\tthis.provider = fetchedProvider\n\n\t\t\t// If there is no templates available, just create an empty file\n\t\t\tif (fetchedProvider.templates.length === 0) {\n\t\t\t\tthis.onSubmit()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Else, open the picker\n\t\t\tthis.opened = true\n\t\t},\n\n\t\t/**\n\t\t * Close the picker and reset variables\n\t\t */\n\t\tclose() {\n\t\t\tthis.checked = this.emptyTemplate.fileid\n\t\t\tthis.loading = false\n\t\t\tthis.name = null\n\t\t\tthis.opened = false\n\t\t\tthis.provider = null\n\t\t},\n\n\t\t/**\n\t\t * Manages the radio template picker change\n\t\t *\n\t\t * @param {number} fileid the selected template file id\n\t\t */\n\t\tonCheck(fileid) {\n\t\t\tthis.checked = fileid\n\t\t},\n\n\t\tasync onSubmit() {\n\t\t\tthis.loading = true\n\t\t\tconst currentDirectory = getCurrentDirectory()\n\t\t\tconst fileList = OCA?.Files?.App?.currentFileList\n\n\t\t\t// If the file doesn't have an extension, add the default one\n\t\t\tif (this.nameWithoutExt === this.name) {\n\t\t\t\tthis.logger.debug('Fixed invalid filename', { name: this.name, extension: this.provider?.extension })\n\t\t\t\tthis.name = this.name + this.provider?.extension\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst fileInfo = await createFromTemplate(\n\t\t\t\t\tnormalize(`${currentDirectory}/${this.name}`),\n\t\t\t\t\tthis.selectedTemplate?.filename,\n\t\t\t\t\tthis.selectedTemplate?.templateType,\n\t\t\t\t)\n\t\t\t\tthis.logger.debug('Created new file', fileInfo)\n\n\t\t\t\t// Fetch FileInfo and model\n\t\t\t\tconst data = await fileList?.addAndFetchFileInfo(this.name).then((status, data) => data)\n\t\t\t\tconst model = new OCA.Files.FileInfoModel(data, {\n\t\t\t\t\tfilesClient: fileList?.filesClient,\n\t\t\t\t})\n\n\t\t\t\t// Run default action\n\t\t\t\tconst fileAction = OCA.Files.fileActions.getDefaultFileAction(fileInfo.mime, 'file', OC.PERMISSION_ALL)\n\t\t\t\tif (fileAction) {\n\t\t\t\t\tfileAction.action(fileInfo.basename, {\n\t\t\t\t\t\t$file: fileList?.findFileEl(this.name),\n\t\t\t\t\t\tdir: currentDirectory,\n\t\t\t\t\t\tfileList,\n\t\t\t\t\t\tfileActions: fileList?.fileActions,\n\t\t\t\t\t\tfileInfoModel: model,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tthis.close()\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error('Error while creating the new file from template')\n\t\t\t\tconsole.error(error)\n\t\t\t\tshowError(this.t('files', 'Unable to create new file from template'))\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.templates-picker {\n\t&__form {\n\t\tpadding: calc(var(--margin) * 2);\n\t\t// Will be handled by the buttons\n\t\tpadding-bottom: 0;\n\n\t\th2 {\n\t\t\ttext-align: center;\n\t\t\tfont-weight: bold;\n\t\t\tmargin: var(--margin) 0 calc(var(--margin) * 2);\n\t\t}\n\t}\n\n\t&__list {\n\t\tdisplay: grid;\n\t\tgrid-gap: calc(var(--margin) * 2);\n\t\tgrid-auto-columns: 1fr;\n\t\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\n\t\tmax-width: calc(var(--fullwidth) * 6);\n\t\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\n\t\t// Make sure all rows are the same height\n\t\tgrid-auto-rows: 1fr;\n\t\t// Center the columns set\n\t\tjustify-content: center;\n\t}\n\n\t&__buttons {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tpadding: calc(var(--margin) * 2) var(--margin);\n\t\tposition: sticky;\n\t\tbottom: 0;\n\t\tbackground-image: linear-gradient(0, var(--gradient-main-background));\n\n\t\tbutton, input[type='submit'] {\n\t\t\theight: 44px;\n\t\t}\n\t}\n\n\t// Make sure we're relative for the loading emptycontent on top\n\t::v-deep .modal-container {\n\t\tposition: relative;\n\t}\n\n\t&__loading {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin: 0;\n\t\tbackground-color: var(--color-main-background-translucent);\n\t}\n}\n\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePicker.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePicker.vue?vue&type=script&lang=js&\"","/**\n * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { generateOcsUrl } from '@nextcloud/router'\nimport axios from '@nextcloud/axios'\n\nexport const getTemplates = async function() {\n\tconst response = await axios.get(generateOcsUrl('apps/files/api/v1/templates'))\n\treturn response.data.ocs.data\n}\n\n/**\n * Create a new file from a specified template\n *\n * @param {string} filePath The new file destination path\n * @param {string} templatePath The template source path\n * @param {string} templateType The template type e.g 'user'\n */\nexport const createFromTemplate = async function(filePath, templatePath, templateType) {\n\tconst response = await axios.post(generateOcsUrl('apps/files/api/v1/templates/create'), {\n\t\tfilePath,\n\t\ttemplatePath,\n\t\ttemplateType,\n\t})\n\treturn response.data.ocs.data\n}\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePicker.vue?vue&type=style&index=0&id=715b4161&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePicker.vue?vue&type=style&index=0&id=715b4161&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./TemplatePicker.vue?vue&type=template&id=715b4161&scoped=true&\"\nimport script from \"./TemplatePicker.vue?vue&type=script&lang=js&\"\nexport * from \"./TemplatePicker.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemplatePicker.vue?vue&type=style&index=0&id=715b4161&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"715b4161\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.opened)?_c('NcModal',{staticClass:\"templates-picker\",attrs:{\"clear-view-delay\":-1,\"size\":\"normal\"},on:{\"close\":_vm.close}},[_c('form',{staticClass:\"templates-picker__form\",style:(_vm.style),on:{\"submit\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.onSubmit.apply(null, arguments)}}},[_c('h2',[_vm._v(_vm._s(_vm.t('files', 'Pick a template for {name}', { name: _vm.nameWithoutExt })))]),_vm._v(\" \"),_c('ul',{staticClass:\"templates-picker__list\"},[_c('TemplatePreview',_vm._b({attrs:{\"checked\":_vm.checked === _vm.emptyTemplate.fileid},on:{\"check\":_vm.onCheck}},'TemplatePreview',_vm.emptyTemplate,false)),_vm._v(\" \"),_vm._l((_vm.provider.templates),function(template){return _c('TemplatePreview',_vm._b({key:template.fileid,attrs:{\"checked\":_vm.checked === template.fileid,\"ratio\":_vm.provider.ratio},on:{\"check\":_vm.onCheck}},'TemplatePreview',template,false))})],2),_vm._v(\" \"),_c('div',{staticClass:\"templates-picker__buttons\"},[_c('button',{on:{\"click\":_vm.close}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('files', 'Cancel'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('input',{staticClass:\"primary\",attrs:{\"type\":\"submit\",\"aria-label\":_vm.t('files', 'Create a new file with the selected template')},domProps:{\"value\":_vm.t('files', 'Create')}})])]),_vm._v(\" \"),(_vm.loading)?_c('NcEmptyContent',{staticClass:\"templates-picker__loading\",attrs:{\"icon\":\"icon-loading\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('files', 'Creating file'))+\"\\n\\t\")]):_vm._e()],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\nimport { loadState } from '@nextcloud/initial-state'\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { getCurrentDirectory } from './utils/davUtils.js'\nimport axios from '@nextcloud/axios'\nimport Vue from 'vue'\n\nimport TemplatePickerView from './views/TemplatePicker.vue'\nimport { showError } from '@nextcloud/dialogs'\n\n// Set up logger\nconst logger = getLoggerBuilder()\n\t.setApp('files')\n\t.detectUser()\n\t.build()\n\n// Add translates functions\nVue.mixin({\n\tmethods: {\n\t\tt,\n\t\tn,\n\t},\n})\n\n// Create document root\nconst TemplatePickerRoot = document.createElement('div')\nTemplatePickerRoot.id = 'template-picker'\ndocument.body.appendChild(TemplatePickerRoot)\n\n// Retrieve and init templates\nlet templates = loadState('files', 'templates', [])\nlet templatesPath = loadState('files', 'templates_path', false)\nlogger.debug('Templates providers', templates)\nlogger.debug('Templates folder', { templatesPath })\n\n// Init vue app\nconst View = Vue.extend(TemplatePickerView)\nconst TemplatePicker = new View({\n\tname: 'TemplatePicker',\n\tpropsData: {\n\t\tlogger,\n\t},\n})\nTemplatePicker.$mount('#template-picker')\n\n// Init template engine after load to make sure it's the last injected entry\nwindow.addEventListener('DOMContentLoaded', function() {\n\tif (!templatesPath) {\n\t\tlogger.debug('Templates folder not initialized')\n\t\tconst initTemplatesPlugin = {\n\t\t\tattach(menu) {\n\t\t\t\t// register the new menu entry\n\t\t\t\tmenu.addMenuEntry({\n\t\t\t\t\tid: 'template-init',\n\t\t\t\t\tdisplayName: t('files', 'Set up templates folder'),\n\t\t\t\t\ttemplateName: t('files', 'Templates'),\n\t\t\t\t\ticonClass: 'icon-template-add',\n\t\t\t\t\tfileType: 'file',\n\t\t\t\t\tactionHandler(name) {\n\t\t\t\t\t\tinitTemplatesFolder(name)\n\t\t\t\t\t\tmenu.removeMenuEntry('template-init')\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t\tOC.Plugins.register('OCA.Files.NewFileMenu', initTemplatesPlugin)\n\t}\n})\n\n// Init template files menu\ntemplates.forEach((provider, index) => {\n\tconst newTemplatePlugin = {\n\t\tattach(menu) {\n\t\t\tconst fileList = menu.fileList\n\n\t\t\t// only attach to main file list, public view is not supported yet\n\t\t\tif (fileList.id !== 'files' && fileList.id !== 'files.public') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// register the new menu entry\n\t\t\tmenu.addMenuEntry({\n\t\t\t\tid: `template-new-${provider.app}-${index}`,\n\t\t\t\tdisplayName: provider.label,\n\t\t\t\ttemplateName: provider.label + provider.extension,\n\t\t\t\ticonClass: provider.iconClass || 'icon-file',\n\t\t\t\tfileType: 'file',\n\t\t\t\tactionHandler(name) {\n\t\t\t\t\tTemplatePicker.open(name, provider)\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\t}\n\tOC.Plugins.register('OCA.Files.NewFileMenu', newTemplatePlugin)\n})\n\n/**\n * Init the template directory\n *\n * @param {string} name the templates folder name\n */\nconst initTemplatesFolder = async function(name) {\n\tconst templatePath = (getCurrentDirectory() + `/${name}`).replace('//', '/')\n\ttry {\n\t\tlogger.debug('Initializing the templates directory', { templatePath })\n\t\tconst response = await axios.post(generateOcsUrl('apps/files/api/v1/templates/path'), {\n\t\t\ttemplatePath,\n\t\t\tcopySystemTemplates: true,\n\t\t})\n\n\t\t// Go to template directory\n\t\tOCA.Files.App.currentFileList.changeDirectory(templatePath, true, true)\n\n\t\ttemplates = response.data.ocs.data.templates\n\t\ttemplatesPath = response.data.ocs.data.template_path\n\t} catch (error) {\n\t\tlogger.error('Unable to initialize the templates directory')\n\t\tshowError(t('files', 'Unable to initialize the templates directory'))\n\t}\n}\n","/*\n * @copyright Copyright (c) 2021 Julius Härtl <jus@bitgrid.net>\n *\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { subscribe } from '@nextcloud/event-bus'\n\n(function() {\n\n\tconst FilesPlugin = {\n\t\tattach(fileList) {\n\t\t\tsubscribe('nextcloud:unified-search.search', ({ query }) => {\n\t\t\t\tfileList.setFilter(query)\n\t\t\t})\n\t\t\tsubscribe('nextcloud:unified-search.reset', () => {\n\t\t\t\tthis.query = null\n\t\t\t\tfileList.setFilter('')\n\t\t\t})\n\n\t\t},\n\t}\n\n\twindow.OC.Plugins.register('OCA.Files.FileList', FilesPlugin)\n\n})()\n","/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('files')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { Node } from '@nextcloud/files'\nimport logger from '../logger'\n\ndeclare global {\n\tinterface Window {\n\t\tOC: any;\n\t\t_nc_fileactions: FileAction[] | undefined;\n\t}\n}\n\n/**\n * TODO: remove and move to @nextcloud/files\n * @see https://github.com/nextcloud/nextcloud-files/pull/608\n */\ninterface FileActionData {\n\t/** Unique ID */\n\tid: string\n\t/** Translatable string displayed in the menu */\n\tdisplayName: (files: Node[], view) => string\n\t/** Svg as inline string. <svg><path fill=\"...\" /></svg> */\n\ticonSvgInline: (files: Node[], view) => string\n\t/** Condition wether this action is shown or not */\n\tenabled?: (files: Node[], view) => boolean\n\t/**\n\t * Function executed on single file action\n\t * @returns true if the action was executed, false otherwise\n\t * @throws Error if the action failed\n\t */\n\texec: (file: Node, view) => Promise<boolean>,\n\t/**\n\t * Function executed on multiple files action\n\t * @returns true if the action was executed, false otherwise\n\t * @throws Error if the action failed\n\t */\n\texecBatch?: (files: Node[], view) => Promise<boolean[]>\n\t/** This action order in the list */\n\torder?: number,\n\t/** Make this action the default */\n\tdefault?: boolean,\n\t/**\n\t * If true, the renderInline function will be called\n\t */\n\tinline?: (file: Node, view) => boolean,\n\t/**\n\t * If defined, the returned html element will be\n\t * appended before the actions menu.\n\t */\n\trenderInline?: (file: Node, view) => HTMLElement,\n}\n\nexport class FileAction {\n\n\tprivate _action: FileActionData\n\n\tconstructor(action: FileActionData) {\n\t\tthis.validateAction(action)\n\t\tthis._action = action\n\t}\n\n\tget id() {\n\t\treturn this._action.id\n\t}\n\n\tget displayName() {\n\t\treturn this._action.displayName\n\t}\n\n\tget iconSvgInline() {\n\t\treturn this._action.iconSvgInline\n\t}\n\n\tget enabled() {\n\t\treturn this._action.enabled\n\t}\n\n\tget exec() {\n\t\treturn this._action.exec\n\t}\n\n\tget execBatch() {\n\t\treturn this._action.execBatch\n\t}\n\n\tget order() {\n\t\treturn this._action.order\n\t}\n\n\tget default() {\n\t\treturn this._action.default\n\t}\n\n\tget inline() {\n\t\treturn this._action.inline\n\t}\n\n\tget renderInline() {\n\t\treturn this._action.renderInline\n\t}\n\n\tprivate validateAction(action: FileActionData) {\n\t\tif (!action.id || typeof action.id !== 'string') {\n\t\t\tthrow new Error('Invalid id')\n\t\t}\n\n\t\tif (!action.displayName || typeof action.displayName !== 'function') {\n\t\t\tthrow new Error('Invalid displayName function')\n\t\t}\n\n\t\tif (!action.iconSvgInline || typeof action.iconSvgInline !== 'function') {\n\t\t\tthrow new Error('Invalid iconSvgInline function')\n\t\t}\n\n\t\tif (!action.exec || typeof action.exec !== 'function') {\n\t\t\tthrow new Error('Invalid exec function')\n\t\t}\n\n\t\t// Optional properties --------------------------------------------\n\t\tif ('enabled' in action && typeof action.enabled !== 'function') {\n\t\t\tthrow new Error('Invalid enabled function')\n\t\t}\n\n\t\tif ('execBatch' in action && typeof action.execBatch !== 'function') {\n\t\t\tthrow new Error('Invalid execBatch function')\n\t\t}\n\n\t\tif ('order' in action && typeof action.order !== 'number') {\n\t\t\tthrow new Error('Invalid order')\n\t\t}\n\n\t\tif ('default' in action && typeof action.default !== 'boolean') {\n\t\t\tthrow new Error('Invalid default')\n\t\t}\n\n\t\tif ('inline' in action && typeof action.inline !== 'function') {\n\t\t\tthrow new Error('Invalid inline function')\n\t\t}\n\n\t\tif ('renderInline' in action && typeof action.renderInline !== 'function') {\n\t\t\tthrow new Error('Invalid renderInline function')\n\t\t}\n\t}\n\n}\n\nexport const registerFileAction = function(action: FileAction): void {\n\tif (typeof window._nc_fileactions === 'undefined') {\n\t\twindow._nc_fileactions = []\n\t\tlogger.debug('FileActions initialized')\n\t}\n\n\t// Check duplicates\n\tif (window._nc_fileactions.find(search => search.id === action.id)) {\n\t\tlogger.error(`FileAction ${action.id} already registered`, { action })\n\t\treturn\n\t}\n\n\twindow._nc_fileactions.push(action)\n}\n\nexport const getFileActions = function(): FileAction[] {\n\treturn window._nc_fileactions || []\n}\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { emit } from '@nextcloud/event-bus'\nimport { Permission, Node } from '@nextcloud/files'\nimport { translate as t } from '@nextcloud/l10n'\nimport axios from '@nextcloud/axios'\nimport TrashCan from '@mdi/svg/svg/trash-can.svg?raw'\n\nimport { registerFileAction, FileAction } from '../services/FileAction.ts'\nimport logger from '../logger.js'\n\nregisterFileAction(new FileAction({\n\tid: 'delete',\n\tdisplayName(nodes: Node[], view) {\n\t\treturn view.id === 'trashbin'\n\t\t\t? t('files_trashbin', 'Delete permanently')\n\t\t\t: t('files', 'Delete')\n\t},\n\ticonSvgInline: () => TrashCan,\n\n\tenabled(nodes: Node[]) {\n\t\treturn nodes.length > 0 && nodes\n\t\t\t.map(node => node.permissions)\n\t\t\t.every(permission => (permission & Permission.DELETE) !== 0)\n\t},\n\n\tasync exec(node: Node) {\n\t\ttry {\n\t\t\tawait axios.delete(node.source)\n\n\t\t\t// Let's delete even if it's moved to the trashbin\n\t\t\t// since it has been removed from the current view\n\t\t\t// and changing the view will trigger a reload anyway.\n\t\t\temit('files:node:deleted', node)\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tlogger.error('Error while deleting a file', { error, source: node.source, node })\n\t\t\treturn false\n\t\t}\n\t},\n\tasync execBatch(nodes: Node[], view) {\n\t\treturn Promise.all(nodes.map(node => this.exec(node, view)))\n\t},\n\n\torder: 100,\n}))\n","/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { loadState } from '@nextcloud/initial-state'\nimport logger from '../logger.js'\n\n/**\n * Fetch and register the legacy files views\n */\nexport default function() {\n\tconst legacyViews = Object.values(loadState('files', 'navigation', {}))\n\n\tif (legacyViews.length > 0) {\n\t\tlogger.debug('Legacy files views detected. Processing...', legacyViews)\n\t\tlegacyViews.forEach(view => {\n\t\t\tregisterLegacyView(view)\n\t\t\tif (view.sublist) {\n\t\t\t\tview.sublist.forEach(subview => registerLegacyView({ ...subview, parent: view.id }))\n\t\t\t}\n\t\t})\n\t}\n}\n\nconst registerLegacyView = function({ id, name, order, icon, parent, classes = '', expanded, params }) {\n\tOCP.Files.Navigation.register({\n\t\tid,\n\t\tname,\n\t\torder,\n\t\tparams,\n\t\tparent,\n\t\texpanded: expanded === true,\n\t\ticonClass: icon ? `icon-${icon}` : 'nav-icon-' + id,\n\t\tlegacy: true,\n\t\tsticky: classes.includes('pinned'),\n\t})\n}\n","/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport type { Folder, Node } from '@nextcloud/files'\nimport isSvg from 'is-svg'\n\nimport logger from '../logger.js'\n\nexport type ContentsWithRoot = {\n\tfolder: Folder,\n\tcontents: Node[]\n}\n\nexport interface Column {\n\t/** Unique column ID */\n\tid: string\n\t/** Translated column title */\n\ttitle: string\n\t/** The content of the cell. The element will be appended within */\n\trender: (node: Node, view: Navigation) => HTMLElement\n\t/** Function used to sort Nodes between them */\n\tsort?: (nodeA: Node, nodeB: Node) => number\n\t/** Custom summary of the column to display at the end of the list.\n\t Will not be displayed if nothing is provided */\n\tsummary?: (node: Node[], view: Navigation) => string\n}\n\nexport interface Navigation {\n\t/** Unique view ID */\n\tid: string\n\t/** Translated view name */\n\tname: string\n\t/**\n\t * Method return the content of the provided path\n\t * This ideally should be a cancellable promise.\n\t * promise.cancel(reason) will be called when the directory\n\t * change and the promise is not resolved yet.\n\t * You _must_ also return the current directory\n\t * information alongside with its content.\n\t */\n\tgetContents: (path: string) => Promise<ContentsWithRoot>\n\t/** The view icon as an inline svg */\n\ticon: string\n\t/** The view order */\n\torder: number\n\t/** This view column(s). Name and actions are\n\tby default always included */\n\tcolumns?: Column[]\n\t/** The empty view element to render your empty content into */\n\temptyView?: (div: HTMLDivElement) => void\n\t/** The parent unique ID */\n\tparent?: string\n\t/** This view is sticky (sent at the bottom) */\n\tsticky?: boolean\n\t/** This view has children and is expanded or not,\n\t * will be overridden by user config.\n\t */\n\texpanded?: boolean\n\n\t/**\n\t * Will be used as default if the user\n\t * haven't customized their sorting column\n\t * */\n\tdefaultSortKey?: string\n\n\t/**\n\t * This view is sticky a legacy view.\n\t * Here until all the views are migrated to Vue.\n\t * @deprecated It will be removed in a near future\n\t */\n\tlegacy?: boolean\n\t/**\n\t * An icon class. \n\t * @deprecated It will be removed in a near future\n\t */\n\ticonClass?: string\n}\n\nexport default class {\n\n\tprivate _views: Navigation[] = []\n\tprivate _currentView: Navigation | null = null\n\n\tconstructor() {\n\t\tlogger.debug('Navigation service initialized')\n\t}\n\n\tregister(view: Navigation) {\n\t\ttry {\n\t\t\tisValidNavigation(view)\n\t\t\tisUniqueNavigation(view, this._views)\n\t\t} catch (e) {\n\t\t\tif (e instanceof Error) {\n\t\t\t\tlogger.error(e.message, { view })\n\t\t\t}\n\t\t\tthrow e\n\t\t}\n\n\t\tif (view.legacy) {\n\t\t\tlogger.warn('Legacy view detected, please migrate to Vue')\n\t\t}\n\n\t\tif (view.iconClass) {\n\t\t\tview.legacy = true\n\t\t}\n\n\t\tthis._views.push(view)\n\t}\n\n\tget views(): Navigation[] {\n\t\treturn this._views\n\t}\n\n\tsetActive(view: Navigation | null) {\n\t\tthis._currentView = view\n\t}\n\n\tget active(): Navigation | null {\n\t\treturn this._currentView\n\t}\n\n}\n\n/**\n * Make sure the given view is unique\n * and not already registered.\n */\nconst isUniqueNavigation = function(view: Navigation, views: Navigation[]): boolean {\n\tif (views.find(search => search.id === view.id)) {\n\t\tthrow new Error(`Navigation id ${view.id} is already registered`)\n\t}\n\treturn true\n}\n\n/**\n * Typescript cannot validate an interface.\n * Please keep in sync with the Navigation interface requirements.\n */\nconst isValidNavigation = function(view: Navigation): boolean {\n\tif (!view.id || typeof view.id !== 'string') {\n\t\tthrow new Error('Navigation id is required and must be a string')\n\t}\n\n\tif (!view.name || typeof view.name !== 'string') {\n\t\tthrow new Error('Navigation name is required and must be a string')\n\t}\n\n\t/**\n\t * Legacy handle their content and icon differently\n\t * TODO: remove when support for legacy views is removed\n\t */\n\tif (!view.legacy) {\n\t\tif (!view.getContents || typeof view.getContents !== 'function') {\n\t\t\tthrow new Error('Navigation getContents is required and must be a function')\n\t\t}\n\n\t\tif (!view.icon || typeof view.icon !== 'string' || !isSvg(view.icon)) {\n\t\t\tthrow new Error('Navigation icon is required and must be a valid svg string')\n\t\t}\n\t}\n\n\tif (!('order' in view) || typeof view.order !== 'number') {\n\t\tthrow new Error('Navigation order is required and must be a number')\n\t}\n\n\t// Optional properties\n\tif (view.columns) {\n\t\tview.columns.forEach(isValidColumn)\n\t}\n\n\tif (view.emptyView && typeof view.emptyView !== 'function') {\n\t\tthrow new Error('Navigation emptyView must be a function')\n\t}\n\n\tif (view.parent && typeof view.parent !== 'string') {\n\t\tthrow new Error('Navigation parent must be a string')\n\t}\n\n\tif ('sticky' in view && typeof view.sticky !== 'boolean') {\n\t\tthrow new Error('Navigation sticky must be a boolean')\n\t}\n\n\tif ('expanded' in view && typeof view.expanded !== 'boolean') {\n\t\tthrow new Error('Navigation expanded must be a boolean')\n\t}\n\n\tif (view.defaultSortKey && typeof view.defaultSortKey !== 'string') {\n\t\tthrow new Error('Navigation defaultSortKey must be a string')\n\t}\n\n\treturn true\n}\n\n/**\n * Typescript cannot validate an interface.\n * Please keep in sync with the Column interface requirements.\n */\nconst isValidColumn = function(column: Column): boolean {\n\tif (!column.id || typeof column.id !== 'string') {\n\t\tthrow new Error('A column id is required')\n\t}\n\n\tif (!column.title || typeof column.title !== 'string') {\n\t\tthrow new Error('A column title is required')\n\t}\n\n\tif (!column.render || typeof column.render !== 'function') {\n\t\tthrow new Error('A render function is required')\n\t}\n\n\t// Optional properties\n\tif (column.sort && typeof column.sort !== 'function') {\n\t\tthrow new Error('Column sortFunction must be a function')\n\t}\n\n\tif (column.summary && typeof column.summary !== 'function') {\n\t\tthrow new Error('Column summary must be a function')\n\t}\n\n\treturn true\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('NcAppNavigation',{attrs:{\"data-cy-files-navigation\":\"\"},scopedSlots:_vm._u([{key:\"list\",fn:function(){return _vm._l((_vm.parentViews),function(view){return _c('NcAppNavigationItem',{key:view.id,attrs:{\"allow-collapse\":true,\"data-cy-files-navigation-item\":view.id,\"icon\":view.iconClass,\"open\":_vm.isExpanded(view),\"pinned\":view.sticky,\"title\":view.name,\"to\":_vm.generateToNavigation(view)},on:{\"update:open\":function($event){return _vm.onToggleExpand(view)}}},[(view.icon)?_c('NcIconSvgWrapper',{attrs:{\"slot\":\"icon\",\"svg\":view.icon},slot:\"icon\"}):_vm._e(),_vm._v(\" \"),_vm._l((_vm.childViews[view.id]),function(child){return _c('NcAppNavigationItem',{key:child.id,attrs:{\"data-cy-files-navigation-item\":child.id,\"exact\":true,\"icon\":child.iconClass,\"title\":child.name,\"to\":_vm.generateToNavigation(child)}},[(view.icon)?_c('NcIconSvgWrapper',{attrs:{\"slot\":\"icon\",\"svg\":view.icon},slot:\"icon\"}):_vm._e()],1)})],2)})},proxy:true},{key:\"footer\",fn:function(){return [_c('ul',{staticClass:\"app-navigation-entry__settings\"},[_c('NavigationQuota'),_vm._v(\" \"),_c('NcAppNavigationItem',{attrs:{\"aria-label\":_vm.t('files', 'Open the files app settings'),\"title\":_vm.t('files', 'Files settings'),\"data-cy-files-navigation-settings-button\":\"\"},on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.openSettings.apply(null, arguments)}}},[_c('Cog',{attrs:{\"slot\":\"icon\",\"size\":20},slot:\"icon\"})],1)],1)]},proxy:true}])},[_vm._v(\" \"),_vm._v(\" \"),_c('SettingsModal',{attrs:{\"open\":_vm.settingsOpened,\"data-cy-files-navigation-settings\":\"\"},on:{\"close\":_vm.onSettingsClose}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2022 Joas Schilling <coding@schilljs.com>\n *\n * @author Joas Schilling <coding@schilljs.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { loadState } from '@nextcloud/initial-state'\n\n/**\n * Set the page heading\n *\n * @param {string} heading page title from the history api\n * @since 27.0.0\n */\nexport function setPageHeading(heading) {\n\tconst headingEl = document.getElementById('page-heading-level-1')\n\tif (headingEl) {\n\t\theadingEl.textContent = heading\n\t}\n}\nexport default {\n\t/**\n\t * @return {boolean} Whether the user opted-out of shortcuts so that they should not be registered\n\t */\n\tdisableKeyboardShortcuts() {\n\t\treturn loadState('theming', 'shortcutsDisabled', false)\n\t},\n\tsetPageHeading,\n}\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { defineStore } from 'pinia'\nimport { emit, subscribe } from '@nextcloud/event-bus'\nimport { generateUrl } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport axios from '@nextcloud/axios'\nimport Vue from 'vue'\n\nimport type { ViewConfigs, ViewConfigStore, ViewId } from '../types'\nimport type { ViewConfig } from '../types'\n\nconst viewConfig = loadState('files', 'viewConfigs', {}) as ViewConfigs\n\nexport const useViewConfigStore = function() {\n\tconst store = defineStore('viewconfig', {\n\t\tstate: () => ({\n\t\t\tviewConfig,\n\t\t} as ViewConfigStore),\n\n\t\tgetters: {\n\t\t\tgetConfig: (state) => (view: ViewId): ViewConfig => state.viewConfig[view] || {},\n\t\t},\n\n\t\tactions: {\n\t\t\t/**\n\t\t\t * Update the view config local store\n\t\t\t */\n\t\t\tonUpdate(view: ViewId, key: string, value: string | number | boolean) {\n\t\t\t\tif (!this.viewConfig[view]) {\n\t\t\t\t\tVue.set(this.viewConfig, view, {})\n\t\t\t\t}\n\t\t\t\tVue.set(this.viewConfig[view], key, value)\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Update the view config local store AND on server side\n\t\t\t */\n\t\t\tasync update(view: ViewId, key: string, value: string | number | boolean) {\n\t\t\t\taxios.put(generateUrl(`/apps/files/api/v1/views/${view}/${key}`), {\n\t\t\t\t\tvalue,\n\t\t\t\t})\n\n\t\t\t\temit('files:viewconfig:updated', { view, key, value })\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Set the sorting key AND sort by ASC\n\t\t\t * The key param must be a valid key of a File object\n\t\t\t * If not found, will be searched within the File attributes\n\t\t\t */\n\t\t\tsetSortingBy(key: string = 'basename', view: string = 'files') {\t\n\t\t\t\t// Save new config\n\t\t\t\tthis.update(view, 'sorting_mode', key)\n\t\t\t\tthis.update(view, 'sorting_direction', 'asc')\n\t\t\t},\n\t\n\t\t\t/**\n\t\t\t * Toggle the sorting direction\n\t\t\t */\n\t\t\ttoggleSortingDirection(view: string = 'files') {\n\t\t\t\tconst config = this.getConfig(view) || { 'sorting_direction': 'asc' }\n\t\t\t\tconst newDirection = config.sorting_direction === 'asc' ? 'desc' : 'asc'\n\t\n\t\t\t\t// Save new config\n\t\t\t\tthis.update(view, 'sorting_direction', newDirection)\n\t\t\t}\n\t\t}\n\t})\n\n\tconst viewConfigStore = store(...arguments)\n\n\t// Make sure we only register the listeners once\n\tif (!viewConfigStore._initialized) {\n\t\tsubscribe('files:viewconfig:updated', function({ view, key, value }: { view: ViewId, key: string, value: boolean }) {\n\t\t\tviewConfigStore.onUpdate(view, key, value)\n\t\t})\n\t\tviewConfigStore._initialized = true\n\t}\n\n\treturn viewConfigStore\n}\n\n","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.storageStats)?_c('NcAppNavigationItem',{staticClass:\"app-navigation-entry__settings-quota\",class:{ 'app-navigation-entry__settings-quota--not-unlimited': _vm.storageStats.quota >= 0},attrs:{\"aria-label\":_vm.t('files', 'Storage informations'),\"loading\":_vm.loadingStorageStats,\"name\":_vm.storageStatsTitle,\"title\":_vm.storageStatsTooltip,\"data-cy-files-navigation-settings-quota\":\"\"},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.debounceUpdateStorageStats.apply(null, arguments)}}},[_c('ChartPie',{attrs:{\"slot\":\"icon\",\"size\":20},slot:\"icon\"}),_vm._v(\" \"),(_vm.storageStats.quota >= 0)?_c('NcProgressBar',{attrs:{\"slot\":\"extra\",\"error\":_vm.storageStats.relative > 80,\"value\":Math.min(_vm.storageStats.relative, 100)},slot:\"extra\"}):_vm._e()],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<NcAppNavigationItem v-if=\"storageStats\"\n\t\t:aria-label=\"t('files', 'Storage informations')\"\n\t\t:class=\"{ 'app-navigation-entry__settings-quota--not-unlimited': storageStats.quota >= 0}\"\n\t\t:loading=\"loadingStorageStats\"\n\t\t:name=\"storageStatsTitle\"\n\t\t:title=\"storageStatsTooltip\"\n\t\tclass=\"app-navigation-entry__settings-quota\"\n\t\tdata-cy-files-navigation-settings-quota\n\t\t@click.stop.prevent=\"debounceUpdateStorageStats\">\n\t\t<ChartPie slot=\"icon\" :size=\"20\" />\n\n\t\t<!-- Progress bar -->\n\t\t<NcProgressBar v-if=\"storageStats.quota >= 0\"\n\t\t\tslot=\"extra\"\n\t\t\t:error=\"storageStats.relative > 80\"\n\t\t\t:value=\"Math.min(storageStats.relative, 100)\" />\n\t</NcAppNavigationItem>\n</template>\n\n<script>\nimport { formatFileSize } from '@nextcloud/files'\nimport { generateUrl } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport { showError } from '@nextcloud/dialogs'\nimport { debounce, throttle } from 'throttle-debounce'\nimport { translate } from '@nextcloud/l10n'\nimport axios from '@nextcloud/axios'\nimport ChartPie from 'vue-material-design-icons/ChartPie.vue'\nimport NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem.js'\nimport NcProgressBar from '@nextcloud/vue/dist/Components/NcProgressBar.js'\n\nimport logger from '../logger.js'\nimport { subscribe } from '@nextcloud/event-bus'\n\nexport default {\n\tname: 'NavigationQuota',\n\n\tcomponents: {\n\t\tChartPie,\n\t\tNcAppNavigationItem,\n\t\tNcProgressBar,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloadingStorageStats: false,\n\t\t\tstorageStats: loadState('files', 'storageStats', null),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tstorageStatsTitle() {\n\t\t\tconst usedQuotaByte = formatFileSize(this.storageStats?.used)\n\t\t\tconst quotaByte = formatFileSize(this.storageStats?.quota)\n\n\t\t\t// If no quota set\n\t\t\tif (this.storageStats?.quota < 0) {\n\t\t\t\treturn this.t('files', '{usedQuotaByte} used', { usedQuotaByte })\n\t\t\t}\n\n\t\t\treturn this.t('files', '{used} of {quota} used', {\n\t\t\t\tused: usedQuotaByte,\n\t\t\t\tquota: quotaByte,\n\t\t\t})\n\t\t},\n\t\tstorageStatsTooltip() {\n\t\t\tif (!this.storageStats.relative) {\n\t\t\t\treturn ''\n\t\t\t}\n\n\t\t\treturn this.t('files', '{relative}% used', this.storageStats)\n\t\t},\n\t},\n\n\tbeforeMount() {\n\t\t/**\n\t\t * Update storage stats every minute\n\t\t * TODO: remove when all views are migrated to Vue\n\t\t */\n\t\tsetInterval(this.throttleUpdateStorageStats, 60 * 1000)\n\n\t\tsubscribe('files:node:created', this.throttleUpdateStorageStats)\n\t\tsubscribe('files:node:deleted', this.throttleUpdateStorageStats)\n\t\tsubscribe('files:node:moved', this.throttleUpdateStorageStats)\n\t\tsubscribe('files:node:updated', this.throttleUpdateStorageStats)\n\t},\n\n\tmethods: {\n\t\t// From user input\n\t\tdebounceUpdateStorageStats: debounce(200, function(event) {\n\t\t\tthis.updateStorageStats(event)\n\t\t}),\n\t\t// From interval or event bus\n\t\tthrottleUpdateStorageStats: throttle(1000, function(event) {\n\t\t\tthis.updateStorageStats(event)\n\t\t}),\n\n\t\t/**\n\t\t * Update the storage stats\n\t\t * Throttled at max 1 refresh per minute\n\t\t *\n\t\t * @param {Event} [event = null] if user interaction\n\t\t */\n\t\tasync updateStorageStats(event = null) {\n\t\t\tif (this.loadingStorageStats) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.loadingStorageStats = true\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateUrl('/apps/files/api/v1/stats'))\n\t\t\t\tif (!response?.data?.data) {\n\t\t\t\t\tthrow new Error('Invalid storage stats')\n\t\t\t\t}\n\t\t\t\tthis.storageStats = response.data.data\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Could not refresh storage stats', { error })\n\t\t\t\t// Only show to the user if it was manually triggered\n\t\t\t\tif (event) {\n\t\t\t\t\tshowError(t('files', 'Could not refresh storage stats'))\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tthis.loadingStorageStats = false\n\t\t\t}\n\t\t},\n\n\t\tt: translate,\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n// User storage stats display\n.app-navigation-entry__settings-quota {\n\t// Align title with progress and icon\n\t&--not-unlimited::v-deep .app-navigation-entry__title {\n\t\tmargin-top: -4px;\n\t}\n\n\tprogress {\n\t\tposition: absolute;\n\t\tbottom: 10px;\n\t\tmargin-left: 44px;\n\t\twidth: calc(100% - 44px - 22px);\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationQuota.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationQuota.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationQuota.vue?vue&type=style&index=0&id=918797b2&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationQuota.vue?vue&type=style&index=0&id=918797b2&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./NavigationQuota.vue?vue&type=template&id=918797b2&scoped=true&\"\nimport script from \"./NavigationQuota.vue?vue&type=script&lang=js&\"\nexport * from \"./NavigationQuota.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NavigationQuota.vue?vue&type=style&index=0&id=918797b2&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"918797b2\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('NcAppSettingsDialog',{attrs:{\"open\":_vm.open,\"show-navigation\":true,\"title\":_vm.t('files', 'Files settings')},on:{\"update:open\":_vm.onClose}},[_c('NcAppSettingsSection',{attrs:{\"id\":\"settings\",\"title\":_vm.t('files', 'Files settings')}},[_c('NcCheckboxRadioSwitch',{attrs:{\"checked\":_vm.userConfig.show_hidden},on:{\"update:checked\":function($event){return _vm.setConfig('show_hidden', $event)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files', 'Show hidden files'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('NcCheckboxRadioSwitch',{attrs:{\"checked\":_vm.userConfig.crop_image_previews},on:{\"update:checked\":function($event){return _vm.setConfig('crop_image_previews', $event)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files', 'Crop image previews'))+\"\\n\\t\\t\")])],1),_vm._v(\" \"),(_vm.settings.length !== 0)?_c('NcAppSettingsSection',{attrs:{\"id\":\"more-settings\",\"title\":_vm.t('files', 'Additional settings')}},[_vm._l((_vm.settings),function(setting){return [_c('Setting',{key:setting.name,attrs:{\"el\":setting.el}})]})],2):_vm._e(),_vm._v(\" \"),_c('NcAppSettingsSection',{attrs:{\"id\":\"webdav\",\"title\":_vm.t('files', 'WebDAV')}},[_c('NcInputField',{attrs:{\"id\":\"webdav-url-input\",\"show-trailing-button\":true,\"success\":_vm.webdavUrlCopied,\"trailing-button-label\":_vm.t('files', 'Copy to clipboard'),\"value\":_vm.webdavUrl,\"readonly\":\"readonly\",\"type\":\"url\"},on:{\"focus\":function($event){return $event.target.select()},\"trailing-button-click\":_vm.copyCloudId},scopedSlots:_vm._u([{key:\"trailing-button-icon\",fn:function(){return [_c('Clipboard',{attrs:{\"size\":20}})]},proxy:true}])}),_vm._v(\" \"),_c('em',[_c('a',{staticClass:\"setting-link\",attrs:{\"href\":_vm.webdavDocs,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('files', 'Use this address to access your Files via WebDAV'))+\" ↗\\n\\t\\t\\t\")])]),_vm._v(\" \"),_c('br'),_vm._v(\" \"),_c('em',[_c('a',{staticClass:\"setting-link\",attrs:{\"href\":_vm.appPasswordUrl}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('files', 'If you have enabled 2FA, you must create and use a new app password by clicking here.'))+\" ↗\\n\\t\\t\\t\")])])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2020 Gary Kim <gary@garykim.dev>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div />\n</template>\n<script>\nexport default {\n\tname: 'Setting',\n\tprops: {\n\t\tel: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$el.appendChild(this.el())\n\t},\n}\n</script>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Setting.vue?vue&type=template&id=61d69eae&\"\nimport script from \"./Setting.vue?vue&type=script&lang=js&\"\nexport * from \"./Setting.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div')\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { loadState } from '@nextcloud/initial-state'\nimport { generateUrl } from '@nextcloud/router'\nimport { defineStore } from 'pinia'\nimport Vue from 'vue'\nimport axios from '@nextcloud/axios'\nimport type { UserConfig, UserConfigStore } from '../types.ts'\nimport { emit, subscribe } from '@nextcloud/event-bus'\n\nconst userConfig = loadState('files', 'config', {\n\tshow_hidden: false,\n\tcrop_image_previews: true,\n}) as UserConfig\n\nexport const useUserConfigStore = function() {\n\tconst store = defineStore('userconfig', {\n\t\tstate: () => ({\n\t\t\tuserConfig,\n\t\t} as UserConfigStore),\n\n\t\tactions: {\n\t\t\t/**\n\t\t\t * Update the user config local store\n\t\t\t */\n\t\t\tonUpdate(key: string, value: boolean) {\n\t\t\t\tVue.set(this.userConfig, key, value)\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Update the user config local store AND on server side\n\t\t\t */\n\t\t\tasync update(key: string, value: boolean) {\n\t\t\t\tawait axios.put(generateUrl('/apps/files/api/v1/config/' + key), {\n\t\t\t\t\tvalue,\n\t\t\t\t})\n\n\t\t\t\temit('files:config:updated', { key, value })\n\t\t\t}\n\t\t}\n\t})\n\n\tconst userConfigStore = store(...arguments)\n\n\t// Make sure we only register the listeners once\n\tif (!userConfigStore._initialized) {\n\t\tsubscribe('files:config:updated', function({ key, value }: { key: string, value: boolean }) {\n\t\t\tuserConfigStore.onUpdate(key, value)\n\t\t})\n\t\tuserConfigStore._initialized = true\n\t}\n\n\treturn userConfigStore\n}\n\n","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<NcAppSettingsDialog :open=\"open\"\n\t\t:show-navigation=\"true\"\n\t\t:title=\"t('files', 'Files settings')\"\n\t\t@update:open=\"onClose\">\n\t\t<!-- Settings API-->\n\t\t<NcAppSettingsSection id=\"settings\" :title=\"t('files', 'Files settings')\">\n\t\t\t<NcCheckboxRadioSwitch :checked=\"userConfig.show_hidden\"\n\t\t\t\t@update:checked=\"setConfig('show_hidden', $event)\">\n\t\t\t\t{{ t('files', 'Show hidden files') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t<NcCheckboxRadioSwitch :checked=\"userConfig.crop_image_previews\"\n\t\t\t\t@update:checked=\"setConfig('crop_image_previews', $event)\">\n\t\t\t\t{{ t('files', 'Crop image previews') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t</NcAppSettingsSection>\n\n\t\t<!-- Settings API-->\n\t\t<NcAppSettingsSection v-if=\"settings.length !== 0\"\n\t\t\tid=\"more-settings\"\n\t\t\t:title=\"t('files', 'Additional settings')\">\n\t\t\t<template v-for=\"setting in settings\">\n\t\t\t\t<Setting :key=\"setting.name\" :el=\"setting.el\" />\n\t\t\t</template>\n\t\t</NcAppSettingsSection>\n\n\t\t<!-- Webdav URL-->\n\t\t<NcAppSettingsSection id=\"webdav\" :title=\"t('files', 'WebDAV')\">\n\t\t\t<NcInputField id=\"webdav-url-input\"\n\t\t\t\t:show-trailing-button=\"true\"\n\t\t\t\t:success=\"webdavUrlCopied\"\n\t\t\t\t:trailing-button-label=\"t('files', 'Copy to clipboard')\"\n\t\t\t\t:value=\"webdavUrl\"\n\t\t\t\treadonly=\"readonly\"\n\t\t\t\ttype=\"url\"\n\t\t\t\t@focus=\"$event.target.select()\"\n\t\t\t\t@trailing-button-click=\"copyCloudId\">\n\t\t\t\t<template #trailing-button-icon>\n\t\t\t\t\t<Clipboard :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcInputField>\n\t\t\t<em>\n\t\t\t\t<a class=\"setting-link\"\n\t\t\t\t\t:href=\"webdavDocs\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noreferrer noopener\">\n\t\t\t\t\t{{ t('files', 'Use this address to access your Files via WebDAV') }} ↗\n\t\t\t\t</a>\n\t\t\t</em>\n\t\t\t<br>\n\t\t\t<em>\n\t\t\t\t<a class=\"setting-link\" :href=\"appPasswordUrl\">\n\t\t\t\t\t{{ t('files', 'If you have enabled 2FA, you must create and use a new app password by clicking here.') }} ↗\n\t\t\t\t</a>\n\t\t\t</em>\n\t\t</NcAppSettingsSection>\n\t</NcAppSettingsDialog>\n</template>\n\n<script>\nimport NcAppSettingsDialog from '@nextcloud/vue/dist/Components/NcAppSettingsDialog.js'\nimport NcAppSettingsSection from '@nextcloud/vue/dist/Components/NcAppSettingsSection.js'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport Clipboard from 'vue-material-design-icons/Clipboard.vue'\nimport NcInputField from '@nextcloud/vue/dist/Components/NcInputField.js'\nimport Setting from '../components/Setting.vue'\n\nimport { generateRemoteUrl, generateUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { translate } from '@nextcloud/l10n'\nimport { useUserConfigStore } from '../store/userconfig.ts'\n\nexport default {\n\tname: 'Settings',\n\tcomponents: {\n\t\tClipboard,\n\t\tNcAppSettingsDialog,\n\t\tNcAppSettingsSection,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcInputField,\n\t\tSetting,\n\t},\n\n\tprops: {\n\t\topen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst userConfigStore = useUserConfigStore()\n\t\treturn {\n\t\t\tuserConfigStore,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\t// Settings API\n\t\t\tsettings: window.OCA?.Files?.Settings?.settings || [],\n\n\t\t\t// Webdav infos\n\t\t\twebdavUrl: generateRemoteUrl('dav/files/' + encodeURIComponent(getCurrentUser()?.uid)),\n\t\t\twebdavDocs: 'https://docs.nextcloud.com/server/stable/go.php?to=user-webdav',\n\t\t\tappPasswordUrl: generateUrl('/settings/user/security#generate-app-token-section'),\n\t\t\twebdavUrlCopied: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tuserConfig() {\n\t\t\treturn this.userConfigStore.userConfig\n\t\t},\n\t},\n\n\tbeforeMount() {\n\t\t// Update the settings API entries state\n\t\tthis.settings.forEach(setting => setting.open())\n\t},\n\n\tbeforeDestroy() {\n\t\t// Update the settings API entries state\n\t\tthis.settings.forEach(setting => setting.close())\n\t},\n\n\tmethods: {\n\t\tonClose() {\n\t\t\tthis.$emit('close')\n\t\t},\n\n\t\tsetConfig(key, value) {\n\t\t\tthis.userConfigStore.update(key, value)\n\t\t},\n\n\t\tasync copyCloudId() {\n\t\t\tdocument.querySelector('input#webdav-url-input').select()\n\n\t\t\tif (!navigator.clipboard) {\n\t\t\t\t// Clipboard API not available\n\t\t\t\tshowError(t('files', 'Clipboard is not available'))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tawait navigator.clipboard.writeText(this.webdavUrl)\n\t\t\tthis.webdavUrlCopied = true\n\t\t\tshowSuccess(t('files', 'WebDAV URL copied to clipboard'))\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.webdavUrlCopied = false\n\t\t\t}, 5000)\n\t\t},\n\n\t\tt: translate,\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.setting-link:hover {\n\ttext-decoration: underline;\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=style&index=0&id=76ca5d1f&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=style&index=0&id=76ca5d1f&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Settings.vue?vue&type=template&id=76ca5d1f&scoped=true&\"\nimport script from \"./Settings.vue?vue&type=script&lang=js&\"\nexport * from \"./Settings.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Settings.vue?vue&type=style&index=0&id=76ca5d1f&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"76ca5d1f\",\n null\n \n)\n\nexport default component.exports","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<NcAppNavigation data-cy-files-navigation>\n\t\t<template #list>\n\t\t\t<NcAppNavigationItem v-for=\"view in parentViews\"\n\t\t\t\t:key=\"view.id\"\n\t\t\t\t:allow-collapse=\"true\"\n\t\t\t\t:data-cy-files-navigation-item=\"view.id\"\n\t\t\t\t:icon=\"view.iconClass\"\n\t\t\t\t:open=\"isExpanded(view)\"\n\t\t\t\t:pinned=\"view.sticky\"\n\t\t\t\t:title=\"view.name\"\n\t\t\t\t:to=\"generateToNavigation(view)\"\n\t\t\t\t@update:open=\"onToggleExpand(view)\">\n\t\t\t\t<!-- Sanitized icon as svg if provided -->\n\t\t\t\t<NcIconSvgWrapper v-if=\"view.icon\" slot=\"icon\" :svg=\"view.icon\" />\n\n\t\t\t\t<!-- Child views if any -->\n\t\t\t\t<NcAppNavigationItem v-for=\"child in childViews[view.id]\"\n\t\t\t\t\t:key=\"child.id\"\n\t\t\t\t\t:data-cy-files-navigation-item=\"child.id\"\n\t\t\t\t\t:exact=\"true\"\n\t\t\t\t\t:icon=\"child.iconClass\"\n\t\t\t\t\t:title=\"child.name\"\n\t\t\t\t\t:to=\"generateToNavigation(child)\">\n\t\t\t\t\t<!-- Sanitized icon as svg if provided -->\n\t\t\t\t\t<NcIconSvgWrapper v-if=\"view.icon\" slot=\"icon\" :svg=\"view.icon\" />\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t</NcAppNavigationItem>\n\t\t</template>\n\n\t\t<!-- Non-scrollable navigation bottom elements -->\n\t\t<template #footer>\n\t\t\t<ul class=\"app-navigation-entry__settings\">\n\t\t\t\t<!-- User storage usage statistics -->\n\t\t\t\t<NavigationQuota />\n\n\t\t\t\t<!-- Files settings modal toggle-->\n\t\t\t\t<NcAppNavigationItem :aria-label=\"t('files', 'Open the files app settings')\"\n\t\t\t\t\t:title=\"t('files', 'Files settings')\"\n\t\t\t\t\tdata-cy-files-navigation-settings-button\n\t\t\t\t\t@click.prevent.stop=\"openSettings\">\n\t\t\t\t\t<Cog slot=\"icon\" :size=\"20\" />\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t</ul>\n\t\t</template>\n\n\t\t<!-- Settings modal-->\n\t\t<SettingsModal :open=\"settingsOpened\"\n\t\t\tdata-cy-files-navigation-settings\n\t\t\t@close=\"onSettingsClose\" />\n\t</NcAppNavigation>\n</template>\n\n<script>\nimport { emit, subscribe } from '@nextcloud/event-bus'\nimport { translate } from '@nextcloud/l10n'\nimport Cog from 'vue-material-design-icons/Cog.vue'\nimport NcAppNavigation from '@nextcloud/vue/dist/Components/NcAppNavigation.js'\nimport NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem.js'\nimport NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'\n\nimport { setPageHeading } from '../../../../core/src/OCP/accessibility.js'\nimport { useViewConfigStore } from '../store/viewConfig.ts'\nimport logger from '../logger.js'\nimport Navigation from '../services/Navigation.ts'\nimport NavigationQuota from '../components/NavigationQuota.vue'\nimport SettingsModal from './Settings.vue'\n\nexport default {\n\tname: 'Navigation',\n\n\tcomponents: {\n\t\tCog,\n\t\tNavigationQuota,\n\t\tNcAppNavigation,\n\t\tNcAppNavigationItem,\n\t\tNcIconSvgWrapper,\n\t\tSettingsModal,\n\t},\n\n\tprops: {\n\t\t// eslint-disable-next-line vue/prop-name-casing\n\t\tNavigation: {\n\t\t\ttype: Navigation,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst viewConfigStore = useViewConfigStore()\n\t\treturn {\n\t\t\tviewConfigStore,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tsettingsOpened: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tcurrentViewId() {\n\t\t\treturn this.$route?.params?.view || 'files'\n\t\t},\n\n\t\t/** @return {Navigation} */\n\t\tcurrentView() {\n\t\t\treturn this.views.find(view => view.id === this.currentViewId)\n\t\t},\n\n\t\t/** @return {Navigation[]} */\n\t\tviews() {\n\t\t\treturn this.Navigation.views\n\t\t},\n\n\t\t/** @return {Navigation[]} */\n\t\tparentViews() {\n\t\t\treturn this.views\n\t\t\t\t// filter child views\n\t\t\t\t.filter(view => !view.parent)\n\t\t\t\t// sort views by order\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\treturn a.order - b.order\n\t\t\t\t})\n\t\t},\n\n\t\t/** @return {Navigation[]} */\n\t\tchildViews() {\n\t\t\treturn this.views\n\t\t\t\t// filter parent views\n\t\t\t\t.filter(view => !!view.parent)\n\t\t\t\t// create a map of parents and their children\n\t\t\t\t.reduce((list, view) => {\n\t\t\t\t\tlist[view.parent] = [...(list[view.parent] || []), view]\n\t\t\t\t\t// Sort children by order\n\t\t\t\t\tlist[view.parent].sort((a, b) => {\n\t\t\t\t\t\treturn a.order - b.order\n\t\t\t\t\t})\n\t\t\t\t\treturn list\n\t\t\t\t}, {})\n\t\t},\n\t},\n\n\twatch: {\n\t\tcurrentView(view, oldView) {\n\t\t\t// If undefined, it means we're initializing the view\n\t\t\t// This is handled by the legacy-view:initialized event\n\t\t\t// TODO: remove when legacy views are dropped\n\t\t\tif (view?.id === oldView?.id) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.Navigation.setActive(view)\n\t\t\tlogger.debug('Navigation changed', { id: view.id, view })\n\n\t\t\t// debugger\n\t\t\tthis.showView(view, oldView)\n\t\t},\n\t},\n\n\tbeforeMount() {\n\t\tif (this.currentView) {\n\t\t\tlogger.debug('Navigation mounted. Showing requested view', { view: this.currentView })\n\t\t\tthis.showView(this.currentView)\n\t\t}\n\n\t\tsubscribe('files:legacy-navigation:changed', this.onLegacyNavigationChanged)\n\n\t\t// TODO: remove this once the legacy navigation is gone\n\t\tsubscribe('files:legacy-view:initialized', () => {\n\t\t\tlogger.debug('Legacy view initialized', { ...this.currentView })\n\t\t\tthis.showView(this.currentView)\n\t\t})\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * @param {Navigation} view the new active view\n\t\t * @param {Navigation} oldView the old active view\n\t\t */\n\t\tshowView(view, oldView) {\n\t\t\t// Closing any opened sidebar\n\t\t\twindow?.OCA?.Files?.Sidebar?.close?.()\n\n\t\t\tif (view?.legacy) {\n\t\t\t\tconst newAppContent = document.querySelector('#app-content #app-content-' + this.currentView.id + '.viewcontainer')\n\t\t\t\tdocument.querySelectorAll('#app-content .viewcontainer').forEach(el => {\n\t\t\t\t\tel.classList.add('hidden')\n\t\t\t\t})\n\t\t\t\tnewAppContent.classList.remove('hidden')\n\n\t\t\t\t// Triggering legacy navigation events\n\t\t\t\tconst { dir = '/' } = OC.Util.History.parseUrlQuery()\n\t\t\t\tconst params = { itemId: view.id, dir }\n\n\t\t\t\tlogger.debug('Triggering legacy navigation event', params)\n\t\t\t\twindow.jQuery(newAppContent).trigger(new window.jQuery.Event('show', params))\n\t\t\t\twindow.jQuery(newAppContent).trigger(new window.jQuery.Event('urlChanged', params))\n\t\t\t}\n\n\t\t\tthis.Navigation.setActive(view)\n\t\t\tsetPageHeading(view.name)\n\t\t\temit('files:navigation:changed', view)\n\t\t},\n\n\t\t/**\n\t\t * Coming from the legacy files app.\n\t\t * TODO: remove when all views are migrated.\n\t\t *\n\t\t * @param {Navigation} view the new active view\n\t\t */\n\t\tonLegacyNavigationChanged({ id } = { id: 'files' }) {\n\t\t\tconst view = this.Navigation.views.find(view => view.id === id)\n\t\t\tif (view && view.legacy && view.id !== this.currentView.id) {\n\t\t\t\t// Force update the current route as the request comes\n\t\t\t\t// from the legacy files app router\n\t\t\t\tthis.$router.replace({ ...this.$route, params: { view: view.id } })\n\t\t\t\tthis.Navigation.setActive(view)\n\t\t\t\tthis.showView(view)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Expand/collapse a a view with children and permanently\n\t\t * save this setting in the server.\n\t\t *\n\t\t * @param {Navigation} view the view to toggle\n\t\t */\n\t\tonToggleExpand(view) {\n\t\t\t// Invert state\n\t\t\tconst isExpanded = this.isExpanded(view)\n\t\t\t// Update the view expanded state, might not be necessary\n\t\t\tview.expanded = !isExpanded\n\t\t\tthis.viewConfigStore.update(view.id, 'expanded', !isExpanded)\n\t\t},\n\n\t\t/**\n\t\t * Check if a view is expanded by user config\n\t\t * or fallback to the default value.\n\t\t *\n\t\t * @param {Navigation} view the view to check\n\t\t */\n\t\tisExpanded(view) {\n\t\t\treturn typeof this.viewConfigStore.getConfig(view.id)?.expanded === 'boolean'\n\t\t\t\t? this.viewConfigStore.getConfig(view.id).expanded === true\n\t\t\t\t: view.expanded === true\n\t\t},\n\n\t\t/**\n\t\t * Generate the route to a view\n\t\t *\n\t\t * @param {Navigation} view the view to toggle\n\t\t */\n\t\tgenerateToNavigation(view) {\n\t\t\tif (view.params) {\n\t\t\t\tconst { dir, fileid } = view.params\n\t\t\t\treturn { name: 'filelist', params: view.params, query: { dir, fileid } }\n\t\t\t}\n\t\t\treturn { name: 'filelist', params: { view: view.id } }\n\t\t},\n\n\t\t/**\n\t\t * Open the settings modal\n\t\t */\n\t\topenSettings() {\n\t\t\tthis.settingsOpened = true\n\t\t},\n\n\t\t/**\n\t\t * Close the settings modal\n\t\t */\n\t\tonSettingsClose() {\n\t\t\tthis.settingsOpened = false\n\t\t},\n\n\t\tt: translate,\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n// TODO: remove when https://github.com/nextcloud/nextcloud-vue/pull/3539 is in\n.app-navigation::v-deep .app-navigation-entry-icon {\n\tbackground-repeat: no-repeat;\n\tbackground-position: center;\n}\n\n.app-navigation > ul.app-navigation__list {\n\t// Use flex gap value for more elegant spacing\n\tpadding-bottom: var(--default-grid-baseline, 4px);\n}\n\n.app-navigation-entry__settings {\n\theight: auto !important;\n\toverflow: hidden !important;\n\tpadding-top: 0 !important;\n\t// Prevent shrinking or growing\n\tflex: 0 0 auto;\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=style&index=0&id=508e08a4&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=style&index=0&id=508e08a4&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Navigation.vue?vue&type=template&id=508e08a4&scoped=true&\"\nimport script from \"./Navigation.vue?vue&type=script&lang=js&\"\nexport * from \"./Navigation.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Navigation.vue?vue&type=style&index=0&id=508e08a4&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"508e08a4\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('NcAppContent',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.currentView?.legacy),expression:\"!currentView?.legacy\"}],class:{'app-content--hidden': _vm.currentView?.legacy},attrs:{\"data-cy-files-content\":\"\"}},[_c('div',{staticClass:\"files-list__header\"},[_c('BreadCrumbs',{attrs:{\"path\":_vm.dir},on:{\"reload\":_vm.fetchContent}}),_vm._v(\" \"),(_vm.isRefreshing)?_c('NcLoadingIcon',{staticClass:\"files-list__refresh-icon\"}):_vm._e()],1),_vm._v(\" \"),(_vm.loading && !_vm.isRefreshing)?_c('NcLoadingIcon',{staticClass:\"files-list__loading-icon\",attrs:{\"size\":38,\"title\":_vm.t('files', 'Loading current folder')}}):(!_vm.loading && _vm.isEmptyDir)?_c('NcEmptyContent',{attrs:{\"title\":_vm.t('files', 'No files in here'),\"description\":_vm.t('files', 'No files or folders have been deleted yet'),\"data-cy-files-content-empty\":\"\"},scopedSlots:_vm._u([{key:\"action\",fn:function(){return [(_vm.dir !== '/')?_c('NcButton',{attrs:{\"aria-label\":\"t('files', 'Go to the previous folder')\",\"type\":\"primary\",\"to\":_vm.toPreviousDir}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('files', 'Go back'))+\"\\n\\t\\t\\t\")]):_vm._e()]},proxy:true},{key:\"icon\",fn:function(){return [_c('TrashCan')]},proxy:true}])}):_c('FilesListVirtual',{ref:\"filesListVirtual\",attrs:{\"current-view\":_vm.currentView,\"nodes\":_vm.dirContents}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport type { Folder, Node } from '@nextcloud/files'\nimport type { FilesStore, RootsStore, RootOptions, Service, FilesState } from '../types.ts'\n\nimport { defineStore } from 'pinia'\nimport { subscribe } from '@nextcloud/event-bus'\nimport logger from '../logger'\nimport type { FileId } from '../types'\nimport Vue from 'vue'\n\nexport const useFilesStore = function() {\n\tconst store = defineStore('files', {\n\t\tstate: (): FilesState => ({\n\t\t\tfiles: {} as FilesStore,\n\t\t\troots: {} as RootsStore,\n\t\t}),\n\n\t\tgetters: {\n\t\t\t/**\n\t\t\t * Get a file or folder by id\n\t\t\t */\n\t\t\tgetNode: (state) => (id: FileId): Node|undefined => state.files[id],\n\n\t\t\t/**\n\t\t\t * Get a list of files or folders by their IDs\n\t\t\t * Does not return undefined values\n\t\t\t */\n\t\t\tgetNodes: (state) => (ids: FileId[]): Node[] => ids\n\t\t\t\t.map(id => state.files[id])\n\t\t\t\t.filter(Boolean),\n\t\t\t/**\n\t\t\t * Get a file or folder by id\n\t\t\t */\n\t\t\tgetRoot: (state) => (service: Service): Folder|undefined => state.roots[service],\n\t\t},\n\n\t\tactions: {\n\t\t\tupdateNodes(nodes: Node[]) {\n\t\t\t\t// Update the store all at once\n\t\t\t\tconst files = nodes.reduce((acc, node) => {\n\t\t\t\t\tif (!node.attributes.fileid) {\n\t\t\t\t\t\tlogger.warn('Trying to update/set a node without fileid', node)\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}\n\t\t\t\t\tacc[node.attributes.fileid] = node\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as FilesStore)\n\n\t\t\t\tVue.set(this, 'files', {...this.files, ...files})\n\t\t\t},\n\n\t\t\tdeleteNodes(nodes: Node[]) {\n\t\t\t\tnodes.forEach(node => {\n\t\t\t\t\tif (node.fileid) {\n\t\t\t\t\t\tVue.delete(this.files, node.fileid)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\n\t\t\tsetRoot({ service, root }: RootOptions) {\n\t\t\t\tVue.set(this.roots, service, root)\n\t\t\t},\n\n\t\t\tonDeletedNode(node: Node) {\n\t\t\t\tthis.deleteNodes([node])\n\t\t\t},\n\t\t}\n\t})\n\n\tconst fileStore = store(...arguments)\n\t// Make sure we only register the listeners once\n\tif (!fileStore._initialized) {\n\t\t// subscribe('files:node:created', fileStore.onCreatedNode)\n\t\tsubscribe('files:node:deleted', fileStore.onDeletedNode)\n\t\t// subscribe('files:node:moved', fileStore.onMovedNode)\n\t\t// subscribe('files:node:updated', fileStore.onUpdatedNode)\n\n\t\tfileStore._initialized = true\n\t}\n\n\treturn fileStore\n}\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport type { PathOptions, ServicesState } from '../types.ts'\n\nimport { defineStore } from 'pinia'\nimport { subscribe } from '@nextcloud/event-bus'\nimport type { FileId } from '../types'\nimport Vue from 'vue'\n\nexport const usePathsStore = function() {\n\tconst store = defineStore('paths', {\n\t\tstate: (): ServicesState => ({}),\n\n\t\tgetters: {\n\t\t\tgetPath: (state) => {\n\t\t\t\treturn (service: string, path: string): FileId|undefined => {\n\t\t\t\t\tif (!state[service]) {\n\t\t\t\t\t\treturn undefined\n\t\t\t\t\t}\n\t\t\t\t\treturn state[service][path]\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\n\t\tactions: {\n\t\t\taddPath(payload: PathOptions) {\n\t\t\t\t// If it doesn't exists, init the service state\n\t\t\t\tif (!this[payload.service]) {\n\t\t\t\t\tVue.set(this, payload.service, {})\n\t\t\t\t}\n\n\t\t\t\t// Now we can set the provided path\n\t\t\t\tVue.set(this[payload.service], payload.path, payload.fileid)\n\t\t\t},\n\t\t}\n\t})\n\n\tconst pathsStore = store(...arguments)\n\t// Make sure we only register the listeners once\n\tif (!pathsStore._initialized) {\n\t\t// TODO: watch folders to update paths?\n\t\t// subscribe('files:node:created', pathsStore.onCreatedNode)\n\t\t// subscribe('files:node:deleted', pathsStore.onDeletedNode)\n\t\t// subscribe('files:node:moved', pathsStore.onMovedNode)\n\n\t\tpathsStore._initialized = true\n\t}\n\n\treturn pathsStore\n}\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { defineStore } from 'pinia'\nimport Vue from 'vue'\nimport { FileId, SelectionStore } from '../types'\n\nexport const useSelectionStore = defineStore('selection', {\n\tstate: () => ({\n\t\tselected: [],\n\t\tlastSelection: [],\n\t\tlastSelectedIndex: null,\n\t} as SelectionStore),\n\n\tactions: {\n\t\t/**\n\t\t * Set the selection of fileIds\n\t\t */\n\t\tset(selection = [] as FileId[]) {\n\t\t\tVue.set(this, 'selected', selection)\n\t\t},\n\n\t\t/**\n\t\t * Set the last selected index\n\t\t */\n\t\tsetLastIndex(lastSelectedIndex = null as FileId | null) {\n\t\t\t// Update the last selection if we provided a new selection starting point\n\t\t\tVue.set(this, 'lastSelection', lastSelectedIndex ? this.selected : [])\n\t\t\tVue.set(this, 'lastSelectedIndex', lastSelectedIndex)\n\t\t},\n\n\t\t/**\n\t\t * Reset the selection\n\t\t */\n\t\treset() {\n\t\t\tVue.set(this, 'selected', [])\n\t\t\tVue.set(this, 'lastSelection', [])\n\t\t\tVue.set(this, 'lastSelectedIndex', null)\n\t\t}\n\t}\n})\n","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('NcBreadcrumbs',{attrs:{\"data-cy-files-content-breadcrumbs\":\"\"}},_vm._l((_vm.sections),function(section,index){return _c('NcBreadcrumb',_vm._b({key:section.dir,attrs:{\"aria-label\":_vm.ariaLabel(section),\"title\":_vm.ariaLabel(section)},nativeOn:{\"click\":function($event){return _vm.onClick(section.to)}},scopedSlots:_vm._u([(index === 0)?{key:\"icon\",fn:function(){return [_c('Home',{attrs:{\"size\":20}})]},proxy:true}:null],null,true)},'NcBreadcrumb',section,false))}),1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<NcBreadcrumbs data-cy-files-content-breadcrumbs>\n\t\t<!-- Current path sections -->\n\t\t<NcBreadcrumb v-for=\"(section, index) in sections\"\n\t\t\t:key=\"section.dir\"\n\t\t\t:aria-label=\"ariaLabel(section)\"\n\t\t\t:title=\"ariaLabel(section)\"\n\t\t\tv-bind=\"section\"\n\t\t\t@click.native=\"onClick(section.to)\">\n\t\t\t<template v-if=\"index === 0\" #icon>\n\t\t\t\t<Home :size=\"20\" />\n\t\t\t</template>\n\t\t</NcBreadcrumb>\n\t</NcBreadcrumbs>\n</template>\n\n<script>\nimport { basename } from 'path'\nimport Home from 'vue-material-design-icons/Home.vue'\nimport NcBreadcrumb from '@nextcloud/vue/dist/Components/NcBreadcrumb.js'\nimport NcBreadcrumbs from '@nextcloud/vue/dist/Components/NcBreadcrumbs.js'\nimport Vue from 'vue'\n\nimport { useFilesStore } from '../store/files.ts'\nimport { usePathsStore } from '../store/paths.ts'\n\nexport default Vue.extend({\n\tname: 'BreadCrumbs',\n\n\tcomponents: {\n\t\tHome,\n\t\tNcBreadcrumbs,\n\t\tNcBreadcrumb,\n\t},\n\n\tprops: {\n\t\tpath: {\n\t\t\ttype: String,\n\t\t\tdefault: '/',\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst filesStore = useFilesStore()\n\t\tconst pathsStore = usePathsStore()\n\t\treturn {\n\t\t\tfilesStore,\n\t\t\tpathsStore,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tcurrentView() {\n\t\t\treturn this.$navigation.active\n\t\t},\n\n\t\tdirs() {\n\t\t\tconst cumulativePath = (acc) => (value) => (acc += `${value}/`)\n\t\t\t// Generate a cumulative path for each path segment: ['/', '/foo', '/foo/bar', ...] etc\n\t\t\tconst paths = this.path.split('/').filter(Boolean).map(cumulativePath('/'))\n\t\t\t// Strip away trailing slash\n\t\t\treturn ['/', ...paths.map(path => path.replace(/^(.+)\\/$/, '$1'))]\n\t\t},\n\n\t\tsections() {\n\t\t\treturn this.dirs.map(dir => {\n\t\t\t\tconst to = { ...this.$route, query: { dir } }\n\t\t\t\treturn {\n\t\t\t\t\tdir,\n\t\t\t\t\texact: true,\n\t\t\t\t\tname: this.getDirDisplayName(dir),\n\t\t\t\t\tto,\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t},\n\n\tmethods: {\n\t\tgetNodeFromId(id) {\n\t\t\treturn this.filesStore.getNode(id)\n\t\t},\n\t\tgetFileIdFromPath(path) {\n\t\t\treturn this.pathsStore.getPath(this.currentView?.id, path)\n\t\t},\n\t\tgetDirDisplayName(path) {\n\t\t\tif (path === '/') {\n\t\t\t\treturn t('files', 'Home')\n\t\t\t}\n\n\t\t\tconst fileId = this.getFileIdFromPath(path)\n\t\t\tconst node = this.getNodeFromId(fileId)\n\t\t\treturn node?.attributes?.displayName || basename(path)\n\t\t},\n\n\t\tonClick(to) {\n\t\t\tif (to?.query?.dir === this.$route.query.dir) {\n\t\t\t\tthis.$emit('reload')\n\t\t\t}\n\t\t},\n\n\t\tariaLabel(section) {\n\t\t\tif (section?.to?.query?.dir === this.$route.query.dir) {\n\t\t\t\treturn t('files', 'Reload current directory')\n\t\t\t}\n\t\t\treturn t('files', 'Go to the \"{dir}\" directory', section)\n\t\t},\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.breadcrumb {\n\t// Take as much space as possible\n\tflex: 1 1 100% !important;\n\twidth: 100%;\n\n\t::v-deep a {\n\t\tcursor: pointer !important;\n\t}\n}\n\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BreadCrumbs.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BreadCrumbs.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BreadCrumbs.vue?vue&type=style&index=0&id=68b3b20b&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BreadCrumbs.vue?vue&type=style&index=0&id=68b3b20b&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./BreadCrumbs.vue?vue&type=template&id=68b3b20b&scoped=true&\"\nimport script from \"./BreadCrumbs.vue?vue&type=script&lang=js&\"\nexport * from \"./BreadCrumbs.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BreadCrumbs.vue?vue&type=style&index=0&id=68b3b20b&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"68b3b20b\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('RecycleScroller',{ref:\"recycleScroller\",staticClass:\"files-list\",attrs:{\"key-field\":\"source\",\"items\":_vm.nodes,\"item-size\":55,\"table-mode\":true,\"item-class\":\"files-list__row\",\"item-tag\":\"tr\",\"list-class\":\"files-list__body\",\"list-tag\":\"tbody\",\"role\":\"table\"},scopedSlots:_vm._u([{key:\"default\",fn:function({ item, active, index }){return [_c('FileEntry',{attrs:{\"active\":active,\"index\":index,\"is-size-available\":_vm.isSizeAvailable,\"files-list-width\":_vm.filesListWidth,\"nodes\":_vm.nodes,\"source\":item}})]}},{key:\"before\",fn:function(){return [_c('caption',{staticClass:\"hidden-visually\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.currentView.caption || '')+\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files', 'This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('FilesListHeader',{attrs:{\"files-list-width\":_vm.filesListWidth,\"is-size-available\":_vm.isSizeAvailable,\"nodes\":_vm.nodes}})]},proxy:true},{key:\"after\",fn:function(){return [_c('FilesListFooter',{attrs:{\"files-list-width\":_vm.filesListWidth,\"is-size-available\":_vm.isSizeAvailable,\"nodes\":_vm.nodes,\"summary\":_vm.summary}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n// The preview service worker cache name (see webpack config)\nconst SWCacheName = 'previews'\n\n/**\n * Check if the preview is already cached by the service worker\n */\nexport const isCachedPreview = function(previewUrl: string) {\n\treturn caches.open(SWCacheName)\n\t\t.then(function(cache) {\n\t\t\treturn cache.match(previewUrl)\n\t\t\t\t.then(function(response) {\n\t\t\t\t\treturn !!response\n\t\t\t\t})\n\t\t})\n}\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { defineStore } from 'pinia'\nimport type { ActionsMenuStore } from '../types'\n\nexport const useActionsMenuStore = defineStore('actionsmenu', {\n\tstate: () => ({\n\t\topened: null,\n\t} as ActionsMenuStore),\n})\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomElementRender.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomElementRender.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<span />\n</template>\n\n<script>\n/**\n * This component is used to render custom\n * elements provided by an API. Vue doesn't allow\n * to directly render an HTMLElement, so we can do\n * this magic here.\n */\nexport default {\n\tname: 'CustomElementRender',\n\tprops: {\n\t\tsource: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tcurrentView: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\trender: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tcomputed: {\n\t\telement() {\n\t\t\treturn this.render(this.source, this.currentView)\n\t\t},\n\t},\n\twatch: {\n\t\telement() {\n\t\t\tthis.$el.replaceWith(this.element)\n\t\t\tthis.$el = this.element\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$el.replaceWith(this.element)\n\t\tthis.$el = this.element\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./CustomElementRender.vue?vue&type=template&id=a261c93e&\"\nimport script from \"./CustomElementRender.vue?vue&type=script&lang=js&\"\nexport * from \"./CustomElementRender.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span')\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',{staticClass:\"custom-svg-icon\"})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<span class=\"custom-svg-icon\" />\n</template>\n\n<script>\n// eslint-disable-next-line import/named\nimport { sanitize } from 'dompurify'\n\nexport default {\n\tname: 'CustomSvgIconRender',\n\tprops: {\n\t\tsvg: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\twatch: {\n\t\tsvg() {\n\t\t\tthis.$el.innerHTML = sanitize(this.svg)\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$el.innerHTML = sanitize(this.svg)\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n.custom-svg-icon {\n\tdisplay: flex;\n\talign-items: center;\n\talign-self: center;\n\tjustify-content: center;\n\tjustify-self: center;\n\twidth: 44px;\n\theight: 44px;\n\topacity: 1;\n\n\t::v-deep svg {\n\t\t// mdi icons have a size of 24px\n\t\t// 22px results in roughly 16px inner size\n\t\theight: 22px;\n\t\twidth: 22px;\n\t\tfill: currentColor;\n\t}\n}\n\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomSvgIconRender.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomSvgIconRender.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomSvgIconRender.vue?vue&type=style&index=0&id=93e9b2f4&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomSvgIconRender.vue?vue&type=style&index=0&id=93e9b2f4&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./CustomSvgIconRender.vue?vue&type=template&id=93e9b2f4&scoped=true&\"\nimport script from \"./CustomSvgIconRender.vue?vue&type=script&lang=js&\"\nexport * from \"./CustomSvgIconRender.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CustomSvgIconRender.vue?vue&type=style&index=0&id=93e9b2f4&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"93e9b2f4\",\n null\n \n)\n\nexport default component.exports","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<Fragment>\n\t\t<td class=\"files-list__row-checkbox\">\n\t\t\t<NcCheckboxRadioSwitch v-if=\"active\"\n\t\t\t\t:aria-label=\"t('files', 'Select the row for {displayName}', { displayName })\"\n\t\t\t\t:checked=\"selectedFiles\"\n\t\t\t\t:value=\"fileid\"\n\t\t\t\tname=\"selectedFiles\"\n\t\t\t\t@update:checked=\"onSelectionChange\" />\n\t\t</td>\n\n\t\t<!-- Link to file -->\n\t\t<td class=\"files-list__row-name\">\n\t\t\t<a ref=\"name\" v-bind=\"linkTo\">\n\t\t\t\t<!-- Icon or preview -->\n\t\t\t\t<span class=\"files-list__row-icon\">\n\t\t\t\t\t<FolderIcon v-if=\"source.type === 'folder'\" />\n\n\t\t\t\t\t<!-- Decorative image, should not be aria documented -->\n\t\t\t\t\t<span v-else-if=\"previewUrl && !backgroundFailed\"\n\t\t\t\t\t\tref=\"previewImg\"\n\t\t\t\t\t\tclass=\"files-list__row-icon-preview\"\n\t\t\t\t\t\t:style=\"{ backgroundImage }\" />\n\n\t\t\t\t\t<span v-else-if=\"mimeIconUrl\"\n\t\t\t\t\t\tclass=\"files-list__row-icon-preview files-list__row-icon-preview--mime\"\n\t\t\t\t\t\t:style=\"{ backgroundImage: mimeIconUrl }\" />\n\n\t\t\t\t\t<FileIcon v-else />\n\t\t\t\t</span>\n\n\t\t\t\t<!-- File name -->\n\t\t\t\t<span class=\"files-list__row-name-text\">{{ displayName }}</span>\n\t\t\t</a>\n\t\t</td>\n\n\t\t<!-- Actions -->\n\t\t<td :class=\"`files-list__row-actions-${uniqueId}`\" class=\"files-list__row-actions\">\n\t\t\t<!-- Inline actions -->\n\t\t\t<!-- TODO: implement CustomElementRender -->\n\n\t\t\t<!-- Menu actions -->\n\t\t\t<NcActions v-if=\"active\"\n\t\t\t\tref=\"actionsMenu\"\n\t\t\t\t:disabled=\"source._loading\"\n\t\t\t\t:force-title=\"true\"\n\t\t\t\t:inline=\"enabledInlineActions.length\"\n\t\t\t\t:open.sync=\"openedMenu\">\n\t\t\t\t<NcActionButton v-for=\"action in enabledMenuActions\"\n\t\t\t\t\t:key=\"action.id\"\n\t\t\t\t\t:class=\"'files-list__row-action-' + action.id\"\n\t\t\t\t\t@click=\"onActionClick(action)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"loading === action.id\" :size=\"18\" />\n\t\t\t\t\t\t<CustomSvgIconRender v-else :svg=\"action.iconSvgInline([source], currentView)\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ action.displayName([source], currentView) }}\n\t\t\t\t</NcActionButton>\n\t\t\t</NcActions>\n\t\t</td>\n\n\t\t<!-- Size -->\n\t\t<td v-if=\"isSizeAvailable\"\n\t\t\t:style=\"{ opacity: sizeOpacity }\"\n\t\t\tclass=\"files-list__row-size\">\n\t\t\t<span>{{ size }}</span>\n\t\t</td>\n\n\t\t<!-- View columns -->\n\t\t<td v-for=\"column in columns\"\n\t\t\t:key=\"column.id\"\n\t\t\t:class=\"`files-list__row-${currentView?.id}-${column.id}`\"\n\t\t\tclass=\"files-list__row-column-custom\">\n\t\t\t<CustomElementRender v-if=\"active\"\n\t\t\t\t:current-view=\"currentView\"\n\t\t\t\t:render=\"column.render\"\n\t\t\t\t:source=\"source\" />\n\t\t</td>\n\t</Fragment>\n</template>\n\n<script lang='ts'>\nimport { debounce } from 'debounce'\nimport { formatFileSize } from '@nextcloud/files'\nimport { Fragment } from 'vue-frag'\nimport { join } from 'path'\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { translate } from '@nextcloud/l10n'\nimport CancelablePromise from 'cancelable-promise'\nimport FileIcon from 'vue-material-design-icons/File.vue'\nimport FolderIcon from 'vue-material-design-icons/Folder.vue'\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\nimport Vue from 'vue'\n\nimport { getFileActions } from '../services/FileAction.ts'\nimport { isCachedPreview } from '../services/PreviewService.ts'\nimport { useActionsMenuStore } from '../store/actionsmenu.ts'\nimport { useFilesStore } from '../store/files.ts'\nimport { useKeyboardStore } from '../store/keyboard.ts'\nimport { useSelectionStore } from '../store/selection.ts'\nimport { useUserConfigStore } from '../store/userconfig.ts'\nimport CustomElementRender from './CustomElementRender.vue'\nimport CustomSvgIconRender from './CustomSvgIconRender.vue'\nimport logger from '../logger.js'\n\n// The registered actions list\nconst actions = getFileActions()\n\nexport default Vue.extend({\n\tname: 'FileEntry',\n\n\tcomponents: {\n\t\tCustomElementRender,\n\t\tCustomSvgIconRender,\n\t\tFileIcon,\n\t\tFolderIcon,\n\t\tFragment,\n\t\tNcActionButton,\n\t\tNcActions,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcLoadingIcon,\n\t},\n\n\tprops: {\n\t\tactive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisSizeAvailable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tsource: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tindex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tnodes: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tfilesListWidth: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst actionsMenuStore = useActionsMenuStore()\n\t\tconst filesStore = useFilesStore()\n\t\tconst keyboardStore = useKeyboardStore()\n\t\tconst selectionStore = useSelectionStore()\n\t\tconst userConfigStore = useUserConfigStore()\n\t\treturn {\n\t\t\tactionsMenuStore,\n\t\t\tfilesStore,\n\t\t\tkeyboardStore,\n\t\t\tselectionStore,\n\t\t\tuserConfigStore,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tbackgroundFailed: false,\n\t\t\tbackgroundImage: '',\n\t\t\tloading: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tuserConfig() {\n\t\t\treturn this.userConfigStore.userConfig\n\t\t},\n\n\t\tcurrentView() {\n\t\t\treturn this.$navigation.active\n\t\t},\n\n\t\tcolumns() {\n\t\t\t// Hide columns if the list is too small\n\t\t\tif (this.filesListWidth < 512) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.currentView?.columns || []\n\t\t},\n\n\t\tdir() {\n\t\t\t// Remove any trailing slash but leave root slash\n\t\t\treturn (this.$route?.query?.dir || '/').replace(/^(.+)\\/$/, '$1')\n\t\t},\n\n\t\tfileid() {\n\t\t\treturn this.source?.fileid?.toString?.()\n\t\t},\n\t\tdisplayName() {\n\t\t\treturn this.source.attributes.displayName\n\t\t\t\t|| this.source.basename\n\t\t},\n\t\tsize() {\n\t\t\tconst size = parseInt(this.source.size, 10) || 0\n\t\t\tif (typeof size !== 'number' || size < 0) {\n\t\t\t\treturn this.t('files', 'Pending')\n\t\t\t}\n\t\t\treturn formatFileSize(size, true)\n\t\t},\n\n\t\tsizeOpacity() {\n\t\t\tconst size = parseInt(this.source.size, 10) || 0\n\t\t\tif (!size || size < 0) {\n\t\t\t\treturn 1\n\t\t\t}\n\n\t\t\t// Whatever theme is active, the contrast will pass WCAG AA\n\t\t\t// with color main text over main background and an opacity of 0.7\n\t\t\tconst minOpacity = 0.7\n\t\t\tconst maxOpacitySize = 10 * 1024 * 1024\n\t\t\treturn minOpacity + (1 - minOpacity) * Math.pow((this.source.size / maxOpacitySize), 2)\n\t\t},\n\n\t\tlinkTo() {\n\t\t\tif (this.source.type === 'folder') {\n\t\t\t\tconst to = { ...this.$route, query: { dir: join(this.dir, this.source.basename) } }\n\t\t\t\treturn {\n\t\t\t\t\tis: 'router-link',\n\t\t\t\t\ttitle: this.t('files', 'Open folder {name}', { name: this.displayName }),\n\t\t\t\t\tto,\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\thref: this.source.source,\n\t\t\t\t// TODO: Use first action title ?\n\t\t\t\ttitle: this.t('files', 'Download file {name}', { name: this.displayName }),\n\t\t\t}\n\t\t},\n\n\t\tselectedFiles() {\n\t\t\treturn this.selectionStore.selected\n\t\t},\n\t\tisSelected() {\n\t\t\treturn this.selectedFiles.includes(this.source?.fileid?.toString?.())\n\t\t},\n\n\t\tcropPreviews() {\n\t\t\treturn this.userConfig.crop_image_previews\n\t\t},\n\n\t\tpreviewUrl() {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(window.location.origin + this.source.attributes.previewUrl)\n\t\t\t\t// Request tiny previews\n\t\t\t\turl.searchParams.set('x', '32')\n\t\t\t\turl.searchParams.set('y', '32')\n\t\t\t\t// Handle cropping\n\t\t\t\turl.searchParams.set('a', this.cropPreviews === true ? '1' : '0')\n\t\t\t\treturn url.href\n\t\t\t} catch (e) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\tmimeIconUrl() {\n\t\t\tconst mimeType = this.source.mime || 'application/octet-stream'\n\t\t\tconst mimeIconUrl = window.OC?.MimeType?.getIconUrl?.(mimeType)\n\t\t\tif (mimeIconUrl) {\n\t\t\t\treturn `url(${mimeIconUrl})`\n\t\t\t}\n\t\t\treturn ''\n\t\t},\n\n\t\tenabledActions() {\n\t\t\treturn actions\n\t\t\t\t.filter(action => !action.enabled || action.enabled([this.source], this.currentView))\n\t\t\t\t.sort((a, b) => (a.order || 0) - (b.order || 0))\n\t\t},\n\n\t\tenabledInlineActions() {\n\t\t\tif (this.filesListWidth < 768) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.enabledActions.filter(action => action?.inline?.(this.source, this.currentView))\n\t\t},\n\n\t\tenabledMenuActions() {\n\t\t\tif (this.filesListWidth < 768) {\n\t\t\t\treturn this.enabledActions\n\t\t\t}\n\n\t\t\treturn [\n\t\t\t\t...this.enabledInlineActions,\n\t\t\t\t...this.enabledActions.filter(action => !action.inline),\n\t\t\t]\n\t\t},\n\n\t\tuniqueId() {\n\t\t\treturn this.hashCode(this.source.source)\n\t\t},\n\n\t\topenedMenu: {\n\t\t\tget() {\n\t\t\t\treturn this.actionsMenuStore.opened === this.uniqueId\n\t\t\t},\n\t\t\tset(opened) {\n\t\t\t\tthis.actionsMenuStore.opened = opened ? this.uniqueId : null\n\t\t\t},\n\t\t},\n\t},\n\n\twatch: {\n\t\tactive(active, before) {\n\t\t\tif (active === false && before === true) {\n\t\t\t\tthis.resetState()\n\n\t\t\t\t// When the row is not active anymore\n\t\t\t\t// remove the display from the row to prevent\n\t\t\t\t// keyboard interaction with it.\n\t\t\t\tthis.$el.parentNode.style.display = 'none'\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Restore default tabindex\n\t\t\tthis.$el.parentNode.style.display = ''\n\t\t},\n\n\t\t/**\n\t\t * When the source changes, reset the preview\n\t\t * and fetch the new one.\n\t\t */\n\t\tpreviewUrl() {\n\t\t\tthis.clearImg()\n\t\t\tthis.debounceIfNotCached()\n\t\t},\n\t},\n\n\t/**\n\t * The row is mounted once and reused as we scroll.\n\t */\n\tmounted() {\n\t\t// ⚠ Init the debounce function on mount and\n\t\t// not when the module is imported to\n\t\t// avoid sharing between recycled components\n\t\tthis.debounceGetPreview = debounce(function() {\n\t\t\tthis.fetchAndApplyPreview()\n\t\t}, 150, false)\n\n\t\t// Fetch the preview on init\n\t\tthis.debounceIfNotCached()\n\n\t\t// Right click watcher on tr\n\t\tthis.$el.parentNode?.addEventListener?.('contextmenu', this.onRightClick)\n\t},\n\n\tbeforeDestroy() {\n\t\tthis.resetState()\n\t},\n\n\tmethods: {\n\t\tasync debounceIfNotCached() {\n\t\t\tif (!this.previewUrl) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Check if we already have this preview cached\n\t\t\tconst isCached = await isCachedPreview(this.previewUrl)\n\t\t\tif (isCached) {\n\t\t\t\tthis.backgroundImage = `url(${this.previewUrl})`\n\t\t\t\tthis.backgroundFailed = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// We don't have this preview cached or it expired, requesting it\n\t\t\tthis.debounceGetPreview()\n\t\t},\n\n\t\tfetchAndApplyPreview() {\n\t\t\t// Ignore if no preview\n\t\t\tif (!this.previewUrl) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// If any image is being processed, reset it\n\t\t\tif (this.previewPromise) {\n\t\t\t\tthis.clearImg()\n\t\t\t}\n\n\t\t\t// Store the promise to be able to cancel it\n\t\t\tthis.previewPromise = new CancelablePromise((resolve, reject, onCancel) => {\n\t\t\t\tconst img = new Image()\n\t\t\t\t// If active, load the preview with higher priority\n\t\t\t\timg.fetchpriority = this.active ? 'high' : 'auto'\n\t\t\t\timg.onload = () => {\n\t\t\t\t\tthis.backgroundImage = `url(${this.previewUrl})`\n\t\t\t\t\tthis.backgroundFailed = false\n\t\t\t\t\tresolve(img)\n\t\t\t\t}\n\t\t\t\timg.onerror = () => {\n\t\t\t\t\tthis.backgroundFailed = true\n\t\t\t\t\treject(img)\n\t\t\t\t}\n\t\t\t\timg.src = this.previewUrl\n\n\t\t\t\t// Image loading has been canceled\n\t\t\t\tonCancel(() => {\n\t\t\t\t\timg.onerror = null\n\t\t\t\t\timg.onload = null\n\t\t\t\t\timg.src = ''\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\n\t\tresetState() {\n\t\t\t// Reset loading state\n\t\t\tthis.loading = ''\n\n\t\t\t// Reset the preview\n\t\t\tthis.clearImg()\n\n\t\t\t// Close menu\n\t\t\tthis.openedMenu = false\n\t\t},\n\n\t\tclearImg() {\n\t\t\tthis.backgroundImage = ''\n\t\t\tthis.backgroundFailed = false\n\n\t\t\tif (this.previewPromise) {\n\t\t\t\tthis.previewPromise.cancel()\n\t\t\t\tthis.previewPromise = null\n\t\t\t}\n\t\t},\n\n\t\thashCode(str) {\n\t\t\tlet hash = 0\n\t\t\tfor (let i = 0, len = str.length; i < len; i++) {\n\t\t\t\tconst chr = str.charCodeAt(i)\n\t\t\t\thash = (hash << 5) - hash + chr\n\t\t\t\thash |= 0 // Convert to 32bit integer\n\t\t\t}\n\t\t\treturn hash\n\t\t},\n\n\t\tasync onActionClick(action) {\n\t\t\tconst displayName = action.displayName([this.source], this.currentView)\n\t\t\ttry {\n\t\t\t\t// Set the loading marker\n\t\t\t\tthis.loading = action.id\n\t\t\t\tVue.set(this.source, '_loading', true)\n\n\t\t\t\tconst success = await action.exec(this.source, this.currentView)\n\t\t\t\tif (success) {\n\t\t\t\t\tshowSuccess(this.t('files', '\"{displayName}\" action executed successfully', { displayName }))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tshowError(this.t('files', '\"{displayName}\" action failed', { displayName }))\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error('Error while executing action', { action, e })\n\t\t\t\tshowError(this.t('files', '\"{displayName}\" action failed', { displayName }))\n\t\t\t} finally {\n\t\t\t\t// Reset the loading marker\n\t\t\t\tthis.loading = ''\n\t\t\t\tVue.set(this.source, '_loading', false)\n\t\t\t}\n\t\t},\n\n\t\tonSelectionChange(selection) {\n\t\t\tconst newSelectedIndex = this.index\n\t\t\tconst lastSelectedIndex = this.selectionStore.lastSelectedIndex\n\n\t\t\t// Get the last selected and select all files in between\n\t\t\tif (this.keyboardStore?.shiftKey && lastSelectedIndex !== null) {\n\t\t\t\tconst isAlreadySelected = this.selectedFiles.includes(this.fileid)\n\n\t\t\t\tconst start = Math.min(newSelectedIndex, lastSelectedIndex)\n\t\t\t\tconst end = Math.max(lastSelectedIndex, newSelectedIndex)\n\n\t\t\t\tconst lastSelection = this.selectionStore.lastSelection\n\t\t\t\tconst filesToSelect = this.nodes\n\t\t\t\t\t.map(file => file.fileid?.toString?.())\n\t\t\t\t\t.slice(start, end + 1)\n\n\t\t\t\t// If already selected, update the new selection _without_ the current file\n\t\t\t\tconst selection = [...lastSelection, ...filesToSelect]\n\t\t\t\t\t.filter(fileId => !isAlreadySelected || fileId !== this.fileid)\n\n\t\t\t\tlogger.debug('Shift key pressed, selecting all files in between', { start, end, filesToSelect, isAlreadySelected })\n\t\t\t\t// Keep previous lastSelectedIndex to be use for further shift selections\n\t\t\t\tthis.selectionStore.set(selection)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlogger.debug('Updating selection', { selection })\n\t\t\tthis.selectionStore.set(selection)\n\t\t\tthis.selectionStore.setLastIndex(newSelectedIndex)\n\t\t},\n\n\t\t// Open the actions menu on right click\n\t\tonRightClick(event) {\n\t\t\t// If already opened, fallback to default browser\n\t\t\tif (this.openedMenu) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// If the clicked row is in the selection, open global menu\n\t\t\tconst isMoreThanOneSelected = this.selectedFiles.length > 1\n\t\t\tthis.actionsMenuStore.opened = this.isSelected && isMoreThanOneSelected ? 'global' : this.uniqueId\n\n\t\t\t// Prevent any browser defaults\n\t\t\tevent.preventDefault()\n\t\t\tevent.stopPropagation()\n\t\t},\n\n\t\tt: translate,\n\t\tformatFileSize,\n\t},\n})\n</script>\n\n<style scoped lang='scss'>\n/* Hover effect on tbody lines only */\ntr {\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\tbackground-color: var(--color-background-dark);\n\t}\n}\n\n/* Preview not loaded animation effect */\n.files-list__row-icon-preview:not([style*='background']) {\n background: var(--color-loading-dark);\n\t// animation: preview-gradient-fade 1.2s ease-in-out infinite;\n}\n</style>\n\n<style>\n/* @keyframes preview-gradient-fade {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n 100% {\n opacity: 1;\n }\n} */\n</style>\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { defineStore } from 'pinia'\nimport Vue from 'vue'\n\n/**\n * Observe various events and save the current\n * special keys states. Useful for checking the\n * current status of a key when executing a method.\n */\nexport const useKeyboardStore = function() {\n\tconst store = defineStore('keyboard', {\n\t\tstate: () => ({\t\t\t\n\t\t\taltKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false,\n\t\t\tshiftKey: false,\n\t\t}),\n\n\t\tactions: {\n\t\t\tonEvent(event: MouseEvent | KeyboardEvent) {\n\t\t\t\tif (!event) {\n\t\t\t\t\tevent = window.event as MouseEvent | KeyboardEvent\n\t\t\t\t}\n\t\t\t\tVue.set(this, 'altKey', !!event.altKey)\n\t\t\t\tVue.set(this, 'ctrlKey', !!event.ctrlKey)\n\t\t\t\tVue.set(this, 'metaKey', !!event.metaKey)\n\t\t\t\tVue.set(this, 'shiftKey', !!event.shiftKey)\n\t\t\t},\n\t\t}\n\t})\n\n\tconst keyboardStore = store(...arguments)\n\t// Make sure we only register the listeners once\n\tif (!keyboardStore._initialized) {\n\t\twindow.addEventListener('keydown', keyboardStore.onEvent)\n\t\twindow.addEventListener('keyup', keyboardStore.onEvent)\n\t\twindow.addEventListener('mousemove', keyboardStore.onEvent)\n\n\t\tkeyboardStore._initialized = true\n\t}\n\n\treturn keyboardStore\n}\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=script&lang=ts&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=style&index=0&id=47057834&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=style&index=0&id=47057834&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=style&index=1&id=47057834&prod&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=style&index=1&id=47057834&prod&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FileEntry.vue?vue&type=template&id=47057834&scoped=true&\"\nimport script from \"./FileEntry.vue?vue&type=script&lang=ts&\"\nexport * from \"./FileEntry.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FileEntry.vue?vue&type=style&index=0&id=47057834&prod&scoped=true&lang=scss&\"\nimport style1 from \"./FileEntry.vue?vue&type=style&index=1&id=47057834&prod&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"47057834\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('Fragment',[_c('td',{staticClass:\"files-list__row-checkbox\"},[(_vm.active)?_c('NcCheckboxRadioSwitch',{attrs:{\"aria-label\":_vm.t('files', 'Select the row for {displayName}', { displayName: _vm.displayName }),\"checked\":_vm.selectedFiles,\"value\":_vm.fileid,\"name\":\"selectedFiles\"},on:{\"update:checked\":_vm.onSelectionChange}}):_vm._e()],1),_vm._v(\" \"),_c('td',{staticClass:\"files-list__row-name\"},[_c('a',_vm._b({ref:\"name\"},'a',_vm.linkTo,false),[_c('span',{staticClass:\"files-list__row-icon\"},[(_vm.source.type === 'folder')?_c('FolderIcon'):(_vm.previewUrl && !_vm.backgroundFailed)?_c('span',{ref:\"previewImg\",staticClass:\"files-list__row-icon-preview\",style:({ backgroundImage: _vm.backgroundImage })}):(_vm.mimeIconUrl)?_c('span',{staticClass:\"files-list__row-icon-preview files-list__row-icon-preview--mime\",style:({ backgroundImage: _vm.mimeIconUrl })}):_c('FileIcon')],1),_vm._v(\" \"),_c('span',{staticClass:\"files-list__row-name-text\"},[_vm._v(_vm._s(_vm.displayName))])])]),_vm._v(\" \"),_c('td',{staticClass:\"files-list__row-actions\",class:`files-list__row-actions-${_vm.uniqueId}`},[(_vm.active)?_c('NcActions',{ref:\"actionsMenu\",attrs:{\"disabled\":_vm.source._loading,\"force-title\":true,\"inline\":_vm.enabledInlineActions.length,\"open\":_vm.openedMenu},on:{\"update:open\":function($event){_vm.openedMenu=$event}}},_vm._l((_vm.enabledMenuActions),function(action){return _c('NcActionButton',{key:action.id,class:'files-list__row-action-' + action.id,on:{\"click\":function($event){return _vm.onActionClick(action)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(_vm.loading === action.id)?_c('NcLoadingIcon',{attrs:{\"size\":18}}):_c('CustomSvgIconRender',{attrs:{\"svg\":action.iconSvgInline([_vm.source], _vm.currentView)}})]},proxy:true}],null,true)},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(action.displayName([_vm.source], _vm.currentView))+\"\\n\\t\\t\\t\")])}),1):_vm._e()],1),_vm._v(\" \"),(_vm.isSizeAvailable)?_c('td',{staticClass:\"files-list__row-size\",style:({ opacity: _vm.sizeOpacity })},[_c('span',[_vm._v(_vm._s(_vm.size))])]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.columns),function(column){return _c('td',{key:column.id,staticClass:\"files-list__row-column-custom\",class:`files-list__row-${_vm.currentView?.id}-${column.id}`},[(_vm.active)?_c('CustomElementRender',{attrs:{\"current-view\":_vm.currentView,\"render\":column.render,\"source\":_vm.source}}):_vm._e()],1)})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListFooter.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListFooter.vue?vue&type=script&lang=ts&\"","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<tr>\n\t\t<th class=\"files-list__row-checkbox\">\n\t\t\t<span class=\"hidden-visually\">{{ t('files', 'Total rows summary') }}</span>\n\t\t</th>\n\n\t\t<!-- Link to file -->\n\t\t<td class=\"files-list__row-name\">\n\t\t\t<!-- Icon or preview -->\n\t\t\t<span class=\"files-list__row-icon\" />\n\n\t\t\t<!-- Summary -->\n\t\t\t<span>{{ summary }}</span>\n\t\t</td>\n\n\t\t<!-- Actions -->\n\t\t<td class=\"files-list__row-actions\" />\n\n\t\t<!-- Size -->\n\t\t<td v-if=\"isSizeAvailable\"\n\t\t\tclass=\"files-list__column files-list__row-size\">\n\t\t\t<span>{{ totalSize }}</span>\n\t\t</td>\n\n\t\t<!-- Custom views columns -->\n\t\t<th v-for=\"column in columns\"\n\t\t\t:key=\"column.id\"\n\t\t\t:class=\"classForColumn(column)\">\n\t\t\t<span>{{ column.summary?.(nodes, currentView) }}</span>\n\t\t</th>\n\t</tr>\n</template>\n\n<script lang=\"ts\">\nimport { formatFileSize } from '@nextcloud/files'\nimport { translate } from '@nextcloud/l10n'\nimport Vue from 'vue'\n\nimport { useFilesStore } from '../store/files.ts'\nimport { usePathsStore } from '../store/paths.ts'\n\nexport default Vue.extend({\n\tname: 'FilesListFooter',\n\n\tcomponents: {\n\t},\n\n\tprops: {\n\t\tisSizeAvailable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tnodes: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tsummary: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tfilesListWidth: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst pathsStore = usePathsStore()\n\t\tconst filesStore = useFilesStore()\n\t\treturn {\n\t\t\tfilesStore,\n\t\t\tpathsStore,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tcurrentView() {\n\t\t\treturn this.$navigation.active\n\t\t},\n\n\t\tdir() {\n\t\t\t// Remove any trailing slash but leave root slash\n\t\t\treturn (this.$route?.query?.dir || '/').replace(/^(.+)\\/$/, '$1')\n\t\t},\n\n\t\tcurrentFolder() {\n\t\t\tif (!this.currentView?.id) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (this.dir === '/') {\n\t\t\t\treturn this.filesStore.getRoot(this.currentView.id)\n\t\t\t}\n\t\t\tconst fileId = this.pathsStore.getPath(this.currentView.id, this.dir)\n\t\t\treturn this.filesStore.getNode(fileId)\n\t\t},\n\n\t\tcolumns() {\n\t\t\t// Hide columns if the list is too small\n\t\t\tif (this.filesListWidth < 512) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.currentView?.columns || []\n\t\t},\n\n\t\ttotalSize() {\n\t\t\t// If we have the size already, let's use it\n\t\t\tif (this.currentFolder?.size) {\n\t\t\t\treturn formatFileSize(this.currentFolder.size, true)\n\t\t\t}\n\n\t\t\t// Otherwise let's compute it\n\t\t\treturn formatFileSize(this.nodes.reduce((total, node) => total + node.size || 0, 0), true)\n\t\t},\n\t},\n\n\tmethods: {\n\t\tclassForColumn(column) {\n\t\t\treturn {\n\t\t\t\t'files-list__row-column-custom': true,\n\t\t\t\t[`files-list__row-${this.currentView.id}-${column.id}`]: true,\n\t\t\t}\n\t\t},\n\n\t\tt: translate,\n\t},\n})\n</script>\n\n<style scoped lang=\"scss\">\n// Scoped row\ntr {\n\tpadding-bottom: 300px;\n\tborder-top: 1px solid var(--color-border);\n\t// Prevent hover effect on the whole row\n\tbackground-color: transparent !important;\n\tborder-bottom: none !important;\n}\n\ntd {\n\tuser-select: none;\n\t// Make sure the cell colors don't apply to column headers\n\tcolor: var(--color-text-maxcontrast) !important;\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListFooter.vue?vue&type=style&index=0&id=e6a083be&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListFooter.vue?vue&type=style&index=0&id=e6a083be&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesListFooter.vue?vue&type=template&id=e6a083be&scoped=true&\"\nimport script from \"./FilesListFooter.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesListFooter.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesListFooter.vue?vue&type=style&index=0&id=e6a083be&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e6a083be\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('tr',[_c('th',{staticClass:\"files-list__row-checkbox\"},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('files', 'Total rows summary')))])]),_vm._v(\" \"),_c('td',{staticClass:\"files-list__row-name\"},[_c('span',{staticClass:\"files-list__row-icon\"}),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.summary))])]),_vm._v(\" \"),_c('td',{staticClass:\"files-list__row-actions\"}),_vm._v(\" \"),(_vm.isSizeAvailable)?_c('td',{staticClass:\"files-list__column files-list__row-size\"},[_c('span',[_vm._v(_vm._s(_vm.totalSize))])]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.columns),function(column){return _c('th',{key:column.id,class:_vm.classForColumn(column)},[_c('span',[_vm._v(_vm._s(column.summary?.(_vm.nodes, _vm.currentView)))])])})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\n\nexport default Vue.extend({\n\tdata() {\n\t\treturn {\n\t\t\tfilesListWidth: null as number | null,\n\t\t}\n\t},\n\tcreated() {\n\t\tconst fileListEl = document.querySelector('#app-content-vue')\n\t\tthis.$resizeObserver = new ResizeObserver((entries) => {\n\t\t\tif (entries.length > 0 && entries[0].target === fileListEl) {\n\t\t\t\tthis.filesListWidth = entries[0].contentRect.width\n\t\t\t}\n\t\t})\n\t\tthis.$resizeObserver.observe(fileListEl as Element)\n\t},\n\tbeforeDestroy() {\n\t\tthis.$resizeObserver.disconnect()\n\t},\n})\n","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<th class=\"files-list__column files-list__row-actions-batch\" colspan=\"2\">\n\t\t<NcActions ref=\"actionsMenu\"\n\t\t\t:disabled=\"!!loading || areSomeNodesLoading\"\n\t\t\t:force-title=\"true\"\n\t\t\t:inline=\"inlineActions\"\n\t\t\t:menu-title=\"inlineActions <= 1 ? t('files', 'Actions') : null\"\n\t\t\t:open.sync=\"openedMenu\">\n\t\t\t<NcActionButton v-for=\"action in enabledActions\"\n\t\t\t\t:key=\"action.id\"\n\t\t\t\t:class=\"'files-list__row-actions-batch-' + action.id\"\n\t\t\t\t@click=\"onActionClick(action)\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading === action.id\" :size=\"18\" />\n\t\t\t\t\t<CustomSvgIconRender v-else :svg=\"action.iconSvgInline(nodes, currentView)\" />\n\t\t\t\t</template>\n\t\t\t\t{{ action.displayName(nodes, currentView) }}\n\t\t\t</NcActionButton>\n\t\t</NcActions>\n\t</th>\n</template>\n\n<script lang=\"ts\">\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { translate } from '@nextcloud/l10n'\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\nimport Vue from 'vue'\n\nimport { getFileActions } from '../services/FileAction.ts'\nimport { useActionsMenuStore } from '../store/actionsmenu.ts'\nimport { useFilesStore } from '../store/files.ts'\nimport { useSelectionStore } from '../store/selection.ts'\nimport filesListWidthMixin from '../mixins/filesListWidth.ts'\nimport CustomSvgIconRender from './CustomSvgIconRender.vue'\nimport logger from '../logger.js'\n\n// The registered actions list\nconst actions = getFileActions()\n\nexport default Vue.extend({\n\tname: 'FilesListHeaderActions',\n\n\tcomponents: {\n\t\tCustomSvgIconRender,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcLoadingIcon,\n\t},\n\n\tmixins: [\n\t\tfilesListWidthMixin,\n\t],\n\n\tprops: {\n\t\tcurrentView: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tselectedNodes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => ([]),\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst actionsMenuStore = useActionsMenuStore()\n\t\tconst filesStore = useFilesStore()\n\t\tconst selectionStore = useSelectionStore()\n\t\treturn {\n\t\t\tactionsMenuStore,\n\t\t\tfilesStore,\n\t\t\tselectionStore,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloading: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tenabledActions() {\n\t\t\treturn actions\n\t\t\t\t.filter(action => action.execBatch)\n\t\t\t\t.filter(action => !action.enabled || action.enabled(this.nodes, this.currentView))\n\t\t\t\t.sort((a, b) => (a.order || 0) - (b.order || 0))\n\t\t},\n\n\t\tnodes() {\n\t\t\treturn this.selectedNodes\n\t\t\t\t.map(fileid => this.getNode(fileid))\n\t\t\t\t.filter(node => node)\n\t\t},\n\n\t\tareSomeNodesLoading() {\n\t\t\treturn this.nodes.some(node => node._loading)\n\t\t},\n\n\t\topenedMenu: {\n\t\t\tget() {\n\t\t\t\treturn this.actionsMenuStore.opened === 'global'\n\t\t\t},\n\t\t\tset(opened) {\n\t\t\t\tthis.actionsMenuStore.opened = opened ? 'global' : null\n\t\t\t},\n\t\t},\n\n\t\tinlineActions() {\n\t\t\tif (this.filesListWidth < 512) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\tif (this.filesListWidth < 768) {\n\t\t\t\treturn 1\n\t\t\t}\n\t\t\tif (this.filesListWidth < 1024) {\n\t\t\t\treturn 2\n\t\t\t}\n\t\t\treturn 3\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Get a cached note from the store\n\t\t *\n\t\t * @param {number} fileId the file id to get\n\t\t * @return {Folder|File}\n\t\t */\n\t\tgetNode(fileId) {\n\t\t\treturn this.filesStore.getNode(fileId)\n\t\t},\n\n\t\tasync onActionClick(action) {\n\t\t\tconst displayName = action.displayName(this.nodes, this.currentView)\n\t\t\tconst selectionIds = this.selectedNodes\n\t\t\ttry {\n\t\t\t\t// Set loading markers\n\t\t\t\tthis.loading = action.id\n\t\t\t\tthis.nodes.forEach(node => {\n\t\t\t\t\tVue.set(node, '_loading', true)\n\t\t\t\t})\n\n\t\t\t\t// Dispatch action execution\n\t\t\t\tconst results = await action.execBatch(this.nodes, this.currentView)\n\n\t\t\t\t// Handle potential failures\n\t\t\t\tif (results.some(result => result !== true)) {\n\t\t\t\t\t// Remove the failed ids from the selection\n\t\t\t\t\tconst failedIds = selectionIds\n\t\t\t\t\t\t.filter((fileid, index) => results[index] !== true)\n\t\t\t\t\tthis.selectionStore.set(failedIds)\n\n\t\t\t\t\tshowError(this.t('files', '\"{displayName}\" failed on some elements ', { displayName }))\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Show success message and clear selection\n\t\t\t\tshowSuccess(this.t('files', '\"{displayName}\" batch action executed successfully', { displayName }))\n\t\t\t\tthis.selectionStore.reset()\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error('Error while executing action', { action, e })\n\t\t\t\tshowError(this.t('files', '\"{displayName}\" action failed', { displayName }))\n\t\t\t} finally {\n\t\t\t\t// Remove loading markers\n\t\t\t\tthis.loading = null\n\t\t\t\tthis.nodes.forEach(node => {\n\t\t\t\t\tVue.set(node, '_loading', false)\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\n\t\tt: translate,\n\t},\n})\n</script>\n\n<style scoped lang=\"scss\">\n.files-list__row-actions-batch {\n\tflex: 1 1 100% !important;\n\n\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\n\t::v-deep .button-vue__wrapper {\n\t\twidth: 100%;\n\t\tspan.button-vue__text {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\t\t}\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderActions.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderActions.vue?vue&type=script&lang=ts&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderActions.vue?vue&type=style&index=0&id=9d92da06&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderActions.vue?vue&type=style&index=0&id=9d92da06&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesListHeaderActions.vue?vue&type=template&id=9d92da06&scoped=true&\"\nimport script from \"./FilesListHeaderActions.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesListHeaderActions.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesListHeaderActions.vue?vue&type=style&index=0&id=9d92da06&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"9d92da06\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('th',{staticClass:\"files-list__column files-list__row-actions-batch\",attrs:{\"colspan\":\"2\"}},[_c('NcActions',{ref:\"actionsMenu\",attrs:{\"disabled\":!!_vm.loading || _vm.areSomeNodesLoading,\"force-title\":true,\"inline\":_vm.inlineActions,\"menu-title\":_vm.inlineActions <= 1 ? _vm.t('files', 'Actions') : null,\"open\":_vm.openedMenu},on:{\"update:open\":function($event){_vm.openedMenu=$event}}},_vm._l((_vm.enabledActions),function(action){return _c('NcActionButton',{key:action.id,class:'files-list__row-actions-batch-' + action.id,on:{\"click\":function($event){return _vm.onActionClick(action)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(_vm.loading === action.id)?_c('NcLoadingIcon',{attrs:{\"size\":18}}):_c('CustomSvgIconRender',{attrs:{\"svg\":action.iconSvgInline(_vm.nodes, _vm.currentView)}})]},proxy:true}],null,true)},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(action.displayName(_vm.nodes, _vm.currentView))+\"\\n\\t\\t\")])}),1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('NcButton',{staticClass:\"files-list__column-sort-button\",class:{'files-list__column-sort-button--active': _vm.sortingMode === _vm.mode},attrs:{\"aria-label\":_vm.sortAriaLabel(_vm.name),\"type\":\"tertiary\"},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleSortBy(_vm.mode)}}},[(_vm.sortingMode !== _vm.mode || _vm.isAscSorting)?_c('MenuUp',{attrs:{\"slot\":\"icon\"},slot:\"icon\"}):_c('MenuDown',{attrs:{\"slot\":\"icon\"},slot:\"icon\"}),_vm._v(\"\\n\\t\"+_vm._s(_vm.name)+\"\\n\")],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport Vue from 'vue'\n\nimport { mapState } from 'pinia'\nimport { useViewConfigStore } from '../store/viewConfig'\nimport type { Navigation } from '../services/Navigation'\n\nexport default Vue.extend({\n\tcomputed: {\n\t\t...mapState(useViewConfigStore, ['getConfig', 'setSortingBy', 'toggleSortingDirection']),\n\n\t\tcurrentView(): Navigation {\n\t\t\treturn this.$navigation.active\n\t\t},\n\n\t\t/**\n\t\t * Get the sorting mode for the current view\n\t\t */\n\t\tsortingMode(): string {\n\t\t\treturn this.getConfig(this.currentView.id)?.sorting_mode as string\n\t\t\t\t|| this.currentView?.defaultSortKey\n\t\t\t\t|| 'basename'\n\t\t},\n\n\t\t/**\n\t\t * Get the sorting direction for the current view\n\t\t */\n\t\tisAscSorting(): boolean {\n\t\t\tconst sortingDirection = this.getConfig(this.currentView.id)?.sorting_direction\n\t\t\treturn sortingDirection === 'asc'\n\t\t},\n\t},\n\n\tmethods: {\n\t\ttoggleSortBy(key: string) {\n\t\t\t// If we're already sorting by this key, flip the direction\n\t\t\tif (this.sortingMode === key) {\n\t\t\t\tthis.toggleSortingDirection(this.currentView.id)\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// else sort ASC by this new key\n\t\t\tthis.setSortingBy(key, this.currentView.id)\n\t\t},\n\t},\n})\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderButton.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderButton.vue?vue&type=script&lang=ts&\"","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<NcButton :aria-label=\"sortAriaLabel(name)\"\n\t\t:class=\"{'files-list__column-sort-button--active': sortingMode === mode}\"\n\t\tclass=\"files-list__column-sort-button\"\n\t\ttype=\"tertiary\"\n\t\t@click.stop.prevent=\"toggleSortBy(mode)\">\n\t\t<!-- Sort icon before text as size is align right -->\n\t\t<MenuUp v-if=\"sortingMode !== mode || isAscSorting\" slot=\"icon\" />\n\t\t<MenuDown v-else slot=\"icon\" />\n\t\t{{ name }}\n\t</NcButton>\n</template>\n\n<script lang=\"ts\">\nimport { translate } from '@nextcloud/l10n'\nimport MenuDown from 'vue-material-design-icons/MenuDown.vue'\nimport MenuUp from 'vue-material-design-icons/MenuUp.vue'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport Vue from 'vue'\n\nimport filesSortingMixin from '../mixins/filesSorting.ts'\n\nexport default Vue.extend({\n\tname: 'FilesListHeaderButton',\n\n\tcomponents: {\n\t\tMenuDown,\n\t\tMenuUp,\n\t\tNcButton,\n\t},\n\n\tmixins: [\n\t\tfilesSortingMixin,\n\t],\n\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tmode: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tmethods: {\n\t\tsortAriaLabel(column) {\n\t\t\tconst direction = this.isAscSorting\n\t\t\t\t? this.t('files', 'ascending')\n\t\t\t\t: this.t('files', 'descending')\n\t\t\treturn this.t('files', 'Sort list by {column} ({direction})', {\n\t\t\t\tcolumn,\n\t\t\t\tdirection,\n\t\t\t})\n\t\t},\n\n\t\tt: translate,\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n.files-list__column-sort-button {\n\t// Compensate for cells margin\n\tmargin: 0 calc(var(--cell-margin) * -1);\n\t// Reverse padding\n\tpadding: 0 4px 0 16px !important;\n\n\t// Icon after text\n\t.button-vue__wrapper {\n\t\tflex-direction: row-reverse;\n\t\t// Take max inner width for text overflow ellipsis\n\t\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\n\t\twidth: 100%;\n\t}\n\n\t.button-vue__icon {\n\t\ttransition-timing-function: linear;\n\t\ttransition-duration: .1s;\n\t\ttransition-property: opacity;\n\t\topacity: 0;\n\t}\n\n\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\n\t.button-vue__text {\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t&--active,\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\t.button-vue__icon {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderButton.vue?vue&type=style&index=0&id=e85a09d2&prod&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderButton.vue?vue&type=style&index=0&id=e85a09d2&prod&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesListHeaderButton.vue?vue&type=template&id=e85a09d2&\"\nimport script from \"./FilesListHeaderButton.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesListHeaderButton.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesListHeaderButton.vue?vue&type=style&index=0&id=e85a09d2&prod&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeader.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeader.vue?vue&type=script&lang=ts&\"","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<tr>\n\t\t<th class=\"files-list__column files-list__row-checkbox\">\n\t\t\t<NcCheckboxRadioSwitch v-bind=\"selectAllBind\" @update:checked=\"onToggleAll\" />\n\t\t</th>\n\n\t\t<!-- Actions multiple if some are selected -->\n\t\t<FilesListHeaderActions v-if=\"!isNoneSelected\"\n\t\t\t:current-view=\"currentView\"\n\t\t\t:selected-nodes=\"selectedNodes\" />\n\n\t\t<!-- Columns display -->\n\t\t<template v-else>\n\t\t\t<!-- Link to file -->\n\t\t\t<th class=\"files-list__column files-list__row-name files-list__column--sortable\"\n\t\t\t\t@click.stop.prevent=\"toggleSortBy('basename')\">\n\t\t\t\t<!-- Icon or preview -->\n\t\t\t\t<span class=\"files-list__row-icon\" />\n\n\t\t\t\t<!-- Name -->\n\t\t\t\t<FilesListHeaderButton :name=\"t('files', 'Name')\" mode=\"basename\" />\n\t\t\t</th>\n\n\t\t\t<!-- Actions -->\n\t\t\t<th class=\"files-list__row-actions\" />\n\n\t\t\t<!-- Size -->\n\t\t\t<th v-if=\"isSizeAvailable\"\n\t\t\t\t:class=\"{'files-list__column--sortable': isSizeAvailable}\"\n\t\t\t\tclass=\"files-list__column files-list__row-size\">\n\t\t\t\t<FilesListHeaderButton :name=\"t('files', 'Size')\" mode=\"size\" />\n\t\t\t</th>\n\n\t\t\t<!-- Custom views columns -->\n\t\t\t<th v-for=\"column in columns\"\n\t\t\t\t:key=\"column.id\"\n\t\t\t\t:class=\"classForColumn(column)\">\n\t\t\t\t<FilesListHeaderButton v-if=\"!!column.sort\" :name=\"column.title\" :mode=\"column.id\" />\n\t\t\t\t<span v-else>\n\t\t\t\t\t{{ column.title }}\n\t\t\t\t</span>\n\t\t\t</th>\n\t\t</template>\n\t</tr>\n</template>\n\n<script lang=\"ts\">\nimport { translate } from '@nextcloud/l10n'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport Vue from 'vue'\n\nimport { useFilesStore } from '../store/files.ts'\nimport { useSelectionStore } from '../store/selection.ts'\nimport FilesListHeaderActions from './FilesListHeaderActions.vue'\nimport FilesListHeaderButton from './FilesListHeaderButton.vue'\nimport filesSortingMixin from '../mixins/filesSorting.ts'\nimport logger from '../logger.js'\n\nexport default Vue.extend({\n\tname: 'FilesListHeader',\n\n\tcomponents: {\n\t\tFilesListHeaderButton,\n\t\tNcCheckboxRadioSwitch,\n\t\tFilesListHeaderActions,\n\t},\n\n\tmixins: [\n\t\tfilesSortingMixin,\n\t],\n\n\tprops: {\n\t\tisSizeAvailable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tnodes: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tfilesListWidth: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst filesStore = useFilesStore()\n\t\tconst selectionStore = useSelectionStore()\n\t\treturn {\n\t\t\tfilesStore,\n\t\t\tselectionStore,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tcurrentView() {\n\t\t\treturn this.$navigation.active\n\t\t},\n\n\t\tcolumns() {\n\t\t\t// Hide columns if the list is too small\n\t\t\tif (this.filesListWidth < 512) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.currentView?.columns || []\n\t\t},\n\n\t\tdir() {\n\t\t\t// Remove any trailing slash but leave root slash\n\t\t\treturn (this.$route?.query?.dir || '/').replace(/^(.+)\\/$/, '$1')\n\t\t},\n\n\t\tselectAllBind() {\n\t\t\tconst label = this.isNoneSelected || this.isSomeSelected\n\t\t\t\t? this.t('files', 'Select all')\n\t\t\t\t: this.t('files', 'Unselect all')\n\t\t\treturn {\n\t\t\t\t'aria-label': label,\n\t\t\t\tchecked: this.isAllSelected,\n\t\t\t\tindeterminate: this.isSomeSelected,\n\t\t\t\ttitle: label,\n\t\t\t}\n\t\t},\n\n\t\tselectedNodes() {\n\t\t\treturn this.selectionStore.selected\n\t\t},\n\n\t\tisAllSelected() {\n\t\t\treturn this.selectedNodes.length === this.nodes.length\n\t\t},\n\n\t\tisNoneSelected() {\n\t\t\treturn this.selectedNodes.length === 0\n\t\t},\n\n\t\tisSomeSelected() {\n\t\t\treturn !this.isAllSelected && !this.isNoneSelected\n\t\t},\n\t},\n\n\tmethods: {\n\t\tclassForColumn(column) {\n\t\t\treturn {\n\t\t\t\t'files-list__column': true,\n\t\t\t\t'files-list__column--sortable': !!column.sort,\n\t\t\t\t'files-list__row-column-custom': true,\n\t\t\t\t[`files-list__row-${this.currentView.id}-${column.id}`]: true,\n\t\t\t}\n\t\t},\n\n\t\tonToggleAll(selected) {\n\t\t\tif (selected) {\n\t\t\t\tconst selection = this.nodes.map(node => node.attributes.fileid.toString())\n\t\t\t\tlogger.debug('Added all nodes to selection', { selection })\n\t\t\t\tthis.selectionStore.setLastIndex(null)\n\t\t\t\tthis.selectionStore.set(selection)\n\t\t\t} else {\n\t\t\t\tlogger.debug('Cleared selection')\n\t\t\t\tthis.selectionStore.reset()\n\t\t\t}\n\t\t},\n\n\t\tt: translate,\n\t},\n})\n</script>\n\n<style scoped lang=\"scss\">\n.files-list__column {\n\tuser-select: none;\n\t// Make sure the cell colors don't apply to column headers\n\tcolor: var(--color-text-maxcontrast) !important;\n\n\t&--sortable {\n\t\tcursor: pointer;\n\t}\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeader.vue?vue&type=style&index=0&id=53698ce8&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeader.vue?vue&type=style&index=0&id=53698ce8&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesListHeader.vue?vue&type=template&id=53698ce8&scoped=true&\"\nimport script from \"./FilesListHeader.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesListHeader.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesListHeader.vue?vue&type=style&index=0&id=53698ce8&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"53698ce8\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('tr',[_c('th',{staticClass:\"files-list__column files-list__row-checkbox\"},[_c('NcCheckboxRadioSwitch',_vm._b({on:{\"update:checked\":_vm.onToggleAll}},'NcCheckboxRadioSwitch',_vm.selectAllBind,false))],1),_vm._v(\" \"),(!_vm.isNoneSelected)?_c('FilesListHeaderActions',{attrs:{\"current-view\":_vm.currentView,\"selected-nodes\":_vm.selectedNodes}}):[_c('th',{staticClass:\"files-list__column files-list__row-name files-list__column--sortable\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleSortBy('basename')}}},[_c('span',{staticClass:\"files-list__row-icon\"}),_vm._v(\" \"),_c('FilesListHeaderButton',{attrs:{\"name\":_vm.t('files', 'Name'),\"mode\":\"basename\"}})],1),_vm._v(\" \"),_c('th',{staticClass:\"files-list__row-actions\"}),_vm._v(\" \"),(_vm.isSizeAvailable)?_c('th',{staticClass:\"files-list__column files-list__row-size\",class:{'files-list__column--sortable': _vm.isSizeAvailable}},[_c('FilesListHeaderButton',{attrs:{\"name\":_vm.t('files', 'Size'),\"mode\":\"size\"}})],1):_vm._e(),_vm._v(\" \"),_vm._l((_vm.columns),function(column){return _c('th',{key:column.id,class:_vm.classForColumn(column)},[(!!column.sort)?_c('FilesListHeaderButton',{attrs:{\"name\":column.title,\"mode\":column.id}}):_c('span',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(column.title)+\"\\n\\t\\t\\t\")])],1)})]],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListVirtual.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListVirtual.vue?vue&type=script&lang=ts&\"","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<RecycleScroller ref=\"recycleScroller\"\n\t\tclass=\"files-list\"\n\t\tkey-field=\"source\"\n\t\t:items=\"nodes\"\n\t\t:item-size=\"55\"\n\t\t:table-mode=\"true\"\n\t\titem-class=\"files-list__row\"\n\t\titem-tag=\"tr\"\n\t\tlist-class=\"files-list__body\"\n\t\tlist-tag=\"tbody\"\n\t\trole=\"table\">\n\t\t<template #default=\"{ item, active, index }\">\n\t\t\t<!-- File row -->\n\t\t\t<FileEntry :active=\"active\"\n\t\t\t\t:index=\"index\"\n\t\t\t\t:is-size-available=\"isSizeAvailable\"\n\t\t\t\t:files-list-width=\"filesListWidth\"\n\t\t\t\t:nodes=\"nodes\"\n\t\t\t\t:source=\"item\" />\n\t\t</template>\n\n\t\t<template #before>\n\t\t\t<!-- Accessibility description -->\n\t\t\t<caption class=\"hidden-visually\">\n\t\t\t\t{{ currentView.caption || '' }}\n\t\t\t\t{{ t('files', 'This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.') }}\n\t\t\t</caption>\n\n\t\t\t<!-- Thead-->\n\t\t\t<FilesListHeader :files-list-width=\"filesListWidth\"\n\t\t\t\t:is-size-available=\"isSizeAvailable\"\n\t\t\t\t:nodes=\"nodes\" />\n\t\t</template>\n\n\t\t<template #after>\n\t\t\t<!-- Tfoot-->\n\t\t\t<FilesListFooter :files-list-width=\"filesListWidth\"\n\t\t\t\t:is-size-available=\"isSizeAvailable\"\n\t\t\t\t:nodes=\"nodes\"\n\t\t\t\t:summary=\"summary\" />\n\t\t</template>\n\t</RecycleScroller>\n</template>\n\n<script lang=\"ts\">\nimport { RecycleScroller } from 'vue-virtual-scroller'\nimport { translate, translatePlural } from '@nextcloud/l10n'\nimport Vue from 'vue'\n\nimport FileEntry from './FileEntry.vue'\nimport FilesListFooter from './FilesListFooter.vue'\nimport FilesListHeader from './FilesListHeader.vue'\nimport filesListWidthMixin from '../mixins/filesListWidth.ts'\n\nexport default Vue.extend({\n\tname: 'FilesListVirtual',\n\n\tcomponents: {\n\t\tRecycleScroller,\n\t\tFileEntry,\n\t\tFilesListHeader,\n\t\tFilesListFooter,\n\t},\n\n\tmixins: [\n\t\tfilesListWidthMixin,\n\t],\n\n\tprops: {\n\t\tcurrentView: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tnodes: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tFileEntry,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tfiles() {\n\t\t\treturn this.nodes.filter(node => node.type === 'file')\n\t\t},\n\n\t\tsummaryFile() {\n\t\t\tconst count = this.files.length\n\t\t\treturn translatePlural('files', '{count} file', '{count} files', count, { count })\n\t\t},\n\t\tsummaryFolder() {\n\t\t\tconst count = this.nodes.length - this.files.length\n\t\t\treturn translatePlural('files', '{count} folder', '{count} folders', count, { count })\n\t\t},\n\t\tsummary() {\n\t\t\treturn translate('files', '{summaryFile} and {summaryFolder}', this)\n\t\t},\n\t\tisSizeAvailable() {\n\t\t\t// Hide size column on narrow screens\n\t\t\tif (this.filesListWidth < 768) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.nodes.some(node => node.attributes.size !== undefined)\n\t\t},\n\t},\n\n\tmounted() {\n\t\t// Make the root recycle scroller a table for proper semantics\n\t\tconst slots = this.$el.querySelectorAll('.vue-recycle-scroller__slot')\n\t\tslots[0].setAttribute('role', 'thead')\n\t\tslots[1].setAttribute('role', 'tfoot')\n\t},\n\n\tmethods: {\n\t\tgetFileId(node) {\n\t\t\treturn node.attributes.fileid\n\t\t},\n\n\t\tt: translate,\n\t},\n})\n</script>\n\n<style scoped lang=\"scss\">\n.files-list {\n\t--row-height: 55px;\n\t--cell-margin: 14px;\n\n\t--checkbox-padding: calc((var(--row-height) - var(--checkbox-size)) / 2);\n\t--checkbox-size: 24px;\n\t--clickable-area: 44px;\n\t--icon-preview-size: 32px;\n\n\tdisplay: block;\n\toverflow: auto;\n\theight: 100%;\n\n\t&::v-deep {\n\t\t// Table head, body and footer\n\t\ttbody, .vue-recycle-scroller__slot {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\twidth: 100%;\n\t\t\t// Necessary for virtual scrolling absolute\n\t\t\tposition: relative;\n\t\t}\n\n\t\t// Table header\n\t\t.vue-recycle-scroller__slot[role='thead'] {\n\t\t\t// Pinned on top when scrolling\n\t\t\tposition: sticky;\n\t\t\tz-index: 10;\n\t\t\ttop: 0;\n\t\t\theight: var(--row-height);\n\t\t\tbackground-color: var(--color-main-background);\n\t\t}\n\n\t\ttr {\n\t\t\tposition: absolute;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\twidth: 100%;\n\t\t\tborder-bottom: 1px solid var(--color-border);\n\t\t}\n\n\t\ttd, th {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tflex: 0 0 auto;\n\t\t\tjustify-content: left;\n\t\t\twidth: var(--row-height);\n\t\t\theight: var(--row-height);\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t\tborder: none;\n\n\t\t\t// Columns should try to add any text\n\t\t\t// node wrapped in a span. That should help\n\t\t\t// with the ellipsis on overflow.\n\t\t\tspan {\n\t\t\t\toverflow: hidden;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-checkbox {\n\t\t\tjustify-content: center;\n\t\t\t.checkbox-radio-switch {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: center;\n\n\t\t\t\t--icon-size: var(--checkbox-size);\n\n\t\t\t\tlabel.checkbox-radio-switch__label {\n\t\t\t\t\twidth: var(--clickable-area);\n\t\t\t\t\theight: var(--clickable-area);\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\tpadding: calc((var(--clickable-area) - var(--checkbox-size)) / 2);\n\t\t\t\t}\n\n\t\t\t\t.checkbox-radio-switch__icon {\n\t\t\t\t\tmargin: 0 !important;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-icon {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\twidth: var(--icon-preview-size);\n\t\t\theight: 100%;\n\t\t\t// Show same padding as the checkbox right padding for visual balance\n\t\t\tmargin-right: var(--checkbox-padding);\n\t\t\tcolor: var(--color-primary-element);\n\t\t\t// No shrinking or growing allowed\n\t\t\tflex: 0 0 var(--icon-preview-size);\n\n\t\t\t& > span {\n\t\t\t\tjustify-content: flex-start;\n\t\t\t}\n\n\t\t\tsvg {\n\t\t\t\twidth: var(--icon-preview-size);\n\t\t\t\theight: var(--icon-preview-size);\n\t\t\t}\n\n\t\t\t&-preview {\n\t\t\t\toverflow: hidden;\n\t\t\t\twidth: var(--icon-preview-size);\n\t\t\t\theight: var(--icon-preview-size);\n\t\t\t\tborder-radius: var(--border-radius);\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\t// Center and contain the preview\n\t\t\t\tbackground-position: center;\n\t\t\t\tbackground-size: contain;\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-name {\n\t\t\t// Prevent link from overflowing\n\t\t\toverflow: hidden;\n\t\t\t// Take as much space as possible\n\t\t\tflex: 1 1 auto;\n\n\t\t\ta {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\t// Fill cell height and width\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\n\t\t\t\t// Keyboard indicator a11y\n\t\t\t\t&:focus .files-list__row-name-text,\n\t\t\t\t&:focus-visible .files-list__row-name-text {\n\t\t\t\t\toutline: 2px solid var(--color-main-text) !important;\n\t\t\t\t\tborder-radius: 20px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.files-list__row-name-text {\n\t\t\t\t// Make some space for the outline\n\t\t\t\tpadding: 5px 10px;\n\t\t\t\tmargin-left: -10px;\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-actions {\n\t\t\twidth: auto;\n\n\t\t\t// Add margin to all cells after the actions\n\t\t\t& ~ td,\n\t\t\t& ~ th {\n\t\t\t\tmargin: 0 var(--cell-margin);\n\t\t\t}\n\n\t\t\tbutton {\n\t\t\t\t.button-vue__text {\n\t\t\t\t\t// Remove bold from default button styling\n\t\t\t\t\tfont-weight: normal;\n\t\t\t\t}\n\t\t\t\t&:not(:hover, :focus, :active) .button-vue__wrapper {\n\t\t\t\t\t// Also apply color-text-maxcontrast to non-active button\n\t\t\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-size {\n\t\t\t// Right align text\n\t\t\tjustify-content: flex-end;\n\t\t\twidth: calc(var(--row-height) * 1.5);\n\t\t\t// opacity varies with the size\n\t\t\tcolor: var(--color-main-text);\n\n\t\t\t// Icon is before text since size is right aligned\n\t\t\t.files-list__column-sort-button {\n\t\t\t\tpadding: 0 16px 0 4px !important;\n\t\t\t\t.button-vue__wrapper {\n\t\t\t\t\tflex-direction: row;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.files-list__row-column-custom {\n\t\t\twidth: calc(var(--row-height) * 2);\n\t\t}\n\t}\n}\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListVirtual.vue?vue&type=style&index=0&id=07b86e54&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListVirtual.vue?vue&type=style&index=0&id=07b86e54&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesListVirtual.vue?vue&type=template&id=07b86e54&scoped=true&\"\nimport script from \"./FilesListVirtual.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesListVirtual.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesListVirtual.vue?vue&type=style&index=0&id=07b86e54&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"07b86e54\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesList.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesList.vue?vue&type=script&lang=ts&\"","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<NcAppContent v-show=\"!currentView?.legacy\"\n\t\t:class=\"{'app-content--hidden': currentView?.legacy}\"\n\t\tdata-cy-files-content>\n\t\t<div class=\"files-list__header\">\n\t\t\t<!-- Current folder breadcrumbs -->\n\t\t\t<BreadCrumbs :path=\"dir\" @reload=\"fetchContent\" />\n\n\t\t\t<!-- Secondary loading indicator -->\n\t\t\t<NcLoadingIcon v-if=\"isRefreshing\" class=\"files-list__refresh-icon\" />\n\t\t</div>\n\n\t\t<!-- Initial loading -->\n\t\t<NcLoadingIcon v-if=\"loading && !isRefreshing\"\n\t\t\tclass=\"files-list__loading-icon\"\n\t\t\t:size=\"38\"\n\t\t\t:title=\"t('files', 'Loading current folder')\" />\n\n\t\t<!-- Empty content placeholder -->\n\t\t<NcEmptyContent v-else-if=\"!loading && isEmptyDir\"\n\t\t\t:title=\"t('files', 'No files in here')\"\n\t\t\t:description=\"t('files', 'No files or folders have been deleted yet')\"\n\t\t\tdata-cy-files-content-empty>\n\t\t\t<template #action>\n\t\t\t\t<NcButton v-if=\"dir !== '/'\"\n\t\t\t\t\taria-label=\"t('files', 'Go to the previous folder')\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t:to=\"toPreviousDir\">\n\t\t\t\t\t{{ t('files', 'Go back') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t\t<template #icon>\n\t\t\t\t<TrashCan />\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\n\t\t<!-- File list -->\n\t\t<FilesListVirtual v-else\n\t\t\tref=\"filesListVirtual\"\n\t\t\t:current-view=\"currentView\"\n\t\t\t:nodes=\"dirContents\" />\n\t</NcAppContent>\n</template>\n\n<script lang=\"ts\">\nimport { Folder, File, Node } from '@nextcloud/files'\nimport { join } from 'path'\nimport { orderBy } from 'natural-orderby'\nimport { translate } from '@nextcloud/l10n'\nimport NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\nimport TrashCan from 'vue-material-design-icons/TrashCan.vue'\nimport Vue from 'vue'\n\nimport { useFilesStore } from '../store/files.ts'\nimport { usePathsStore } from '../store/paths.ts'\nimport { useSelectionStore } from '../store/selection.ts'\nimport { useViewConfigStore } from '../store/viewConfig.ts'\nimport BreadCrumbs from '../components/BreadCrumbs.vue'\nimport FilesListVirtual from '../components/FilesListVirtual.vue'\nimport filesSortingMixin from '../mixins/filesSorting.ts'\nimport logger from '../logger.js'\nimport Navigation, { ContentsWithRoot } from '../services/Navigation.ts'\n\nexport default Vue.extend({\n\tname: 'FilesList',\n\n\tcomponents: {\n\t\tBreadCrumbs,\n\t\tFilesListVirtual,\n\t\tNcAppContent,\n\t\tNcButton,\n\t\tNcEmptyContent,\n\t\tNcLoadingIcon,\n\t\tTrashCan,\n\t},\n\n\tmixins: [\n\t\tfilesSortingMixin,\n\t],\n\n\tsetup() {\n\t\tconst pathsStore = usePathsStore()\n\t\tconst filesStore = useFilesStore()\n\t\tconst selectionStore = useSelectionStore()\n\t\tconst viewConfigStore = useViewConfigStore()\n\t\treturn {\n\t\t\tfilesStore,\n\t\t\tpathsStore,\n\t\t\tselectionStore,\n\t\t\tviewConfigStore,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloading: true,\n\t\t\tpromise: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {Navigation} */\n\t\tcurrentView() {\n\t\t\treturn this.$navigation.active\n\t\t\t\t|| this.$navigation.views.find(view => view.id === 'files')\n\t\t},\n\n\t\t/**\n\t\t * The current directory query.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tdir() {\n\t\t\t// Remove any trailing slash but leave root slash\n\t\t\treturn (this.$route?.query?.dir || '/').replace(/^(.+)\\/$/, '$1')\n\t\t},\n\n\t\t/**\n\t\t * The current folder.\n\t\t *\n\t\t * @return {Folder|undefined}\n\t\t */\n\t\tcurrentFolder() {\n\t\t\tif (!this.currentView?.id) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (this.dir === '/') {\n\t\t\t\treturn this.filesStore.getRoot(this.currentView.id)\n\t\t\t}\n\t\t\tconst fileId = this.pathsStore.getPath(this.currentView.id, this.dir)\n\t\t\treturn this.filesStore.getNode(fileId)\n\t\t},\n\n\t\t/**\n\t\t * The current directory contents.\n\t\t *\n\t\t * @return {Node[]}\n\t\t */\n\t\tdirContents() {\n\t\t\tif (!this.currentView) {\n\t\t\t\treturn []\n\t\t\t}\n\n\t\t\tconst customColumn = this.currentView.columns\n\t\t\t\t.find(column => column.id === this.sortingMode)\n\n\t\t\t// Custom column must provide their own sorting methods\n\t\t\tif (customColumn?.sort && typeof customColumn.sort === 'function') {\n\t\t\t\tconst results = [...(this.currentFolder?._children || []).map(this.getNode).filter(file => file)]\n\t\t\t\t\t.sort(customColumn.sort)\n\t\t\t\treturn this.isAscSorting ? results : results.reverse()\n\t\t\t}\n\n\t\t\treturn orderBy(\n\t\t\t\t[...(this.currentFolder?._children || []).map(this.getNode).filter(file => file)],\n\t\t\t\t[\n\t\t\t\t\t// Sort folders first if sorting by name\n\t\t\t\t\t...this.sortingMode === 'basename' ? [v => v.type !== 'folder'] : [],\n\t\t\t\t\t// Use sorting mode\n\t\t\t\t\tv => v[this.sortingMode],\n\t\t\t\t\t// Fallback to name\n\t\t\t\t\tv => v.basename,\n\t\t\t\t],\n\t\t\t\tthis.isAscSorting ? ['asc', 'asc', 'asc'] : ['desc', 'desc', 'desc'],\n\t\t\t)\n\t\t},\n\n\t\t/**\n\t\t * The current directory is empty.\n\t\t */\n\t\tisEmptyDir() {\n\t\t\treturn this.dirContents.length === 0\n\t\t},\n\n\t\t/**\n\t\t * We are refreshing the current directory.\n\t\t * But we already have a cached version of it\n\t\t * that is not empty.\n\t\t */\n\t\tisRefreshing() {\n\t\t\treturn this.currentFolder !== undefined\n\t\t\t\t&& !this.isEmptyDir\n\t\t\t\t&& this.loading\n\t\t},\n\n\t\t/**\n\t\t * Route to the previous directory.\n\t\t */\n\t\ttoPreviousDir() {\n\t\t\tconst dir = this.dir.split('/').slice(0, -1).join('/') || '/'\n\t\t\treturn { ...this.$route, query: { dir } }\n\t\t},\n\t},\n\n\twatch: {\n\t\tcurrentView(newView, oldView) {\n\t\t\tif (newView?.id === oldView?.id) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlogger.debug('View changed', { newView, oldView })\n\t\t\tthis.selectionStore.reset()\n\t\t\tthis.fetchContent()\n\t\t},\n\n\t\tdir(newDir, oldDir) {\n\t\t\tlogger.debug('Directory changed', { newDir, oldDir })\n\t\t\t// TODO: preserve selection on browsing?\n\t\t\tthis.selectionStore.reset()\n\t\t\tthis.fetchContent()\n\n\t\t\t// Scroll to top, force virtual scroller to re-render\n\t\t\tif (this.$refs?.filesListVirtual?.$el) {\n\t\t\t\tthis.$refs.filesListVirtual.$el.scrollTop = 0\n\t\t\t}\n\t\t},\n\t},\n\n\tmethods: {\n\t\tasync fetchContent() {\n\t\t\tif (this.currentView?.legacy) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.loading = true\n\t\t\tconst dir = this.dir\n\t\t\tconst currentView = this.currentView\n\n\t\t\t// If we have a cancellable promise ongoing, cancel it\n\t\t\tif (typeof this.promise?.cancel === 'function') {\n\t\t\t\tthis.promise.cancel()\n\t\t\t\tlogger.debug('Cancelled previous ongoing fetch')\n\t\t\t}\n\n\t\t\t// Fetch the current dir contents\n\t\t\t/** @type {Promise<ContentsWithRoot>} */\n\t\t\tthis.promise = currentView.getContents(dir)\n\t\t\ttry {\n\t\t\t\tconst { folder, contents } = await this.promise\n\t\t\t\tlogger.debug('Fetched contents', { dir, folder, contents })\n\n\t\t\t\t// Update store\n\t\t\t\tthis.filesStore.updateNodes(contents)\n\n\t\t\t\t// Define current directory children\n\t\t\t\tfolder._children = contents.map(node => node.attributes.fileid)\n\n\t\t\t\t// If we're in the root dir, define the root\n\t\t\t\tif (dir === '/') {\n\t\t\t\t\tthis.filesStore.setRoot({ service: currentView.id, root: folder })\n\t\t\t\t} else\n\t\t\t\t// Otherwise, add the folder to the store\n\t\t\t\tif (folder.attributes.fileid) {\n\t\t\t\t\tthis.filesStore.updateNodes([folder])\n\t\t\t\t\tthis.pathsStore.addPath({ service: currentView.id, fileid: folder.attributes.fileid, path: dir })\n\t\t\t\t} else {\n\t\t\t\t\t// If we're here, the view API messed up\n\t\t\t\t\tlogger.error('Invalid root folder returned', { dir, folder, currentView })\n\t\t\t\t}\n\n\t\t\t\t// Update paths store\n\t\t\t\tconst folders = contents.filter(node => node.type === 'folder')\n\t\t\t\tfolders.forEach(node => {\n\t\t\t\t\tthis.pathsStore.addPath({ service: currentView.id, fileid: node.attributes.fileid, path: join(dir, node.basename) })\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Error while fetching content', { error })\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Get a cached note from the store\n\t\t *\n\t\t * @param {number} fileId the file id to get\n\t\t * @return {Folder|File}\n\t\t */\n\t\t getNode(fileId) {\n\t\t\treturn this.filesStore.getNode(fileId)\n\t\t},\n\n\t\tt: translate,\n\t},\n})\n</script>\n\n<style scoped lang=\"scss\">\n.app-content {\n\t// Virtual list needs to be full height and is scrollable\n\tdisplay: flex;\n\toverflow: hidden;\n\tflex-direction: column;\n\tmax-height: 100%;\n\n\t// TODO: remove after all legacy views are migrated\n\t// Hides the legacy app-content if shown view is not legacy\n\t&:not(&--hidden)::v-deep + #app-content {\n\t\tdisplay: none;\n\t}\n}\n\n$margin: 4px;\n$navigationToggleSize: 50px;\n\n.files-list {\n\t&__header {\n\t\tdisplay: flex;\n\t\talign-content: center;\n\t\t// Do not grow or shrink (vertically)\n\t\tflex: 0 0;\n\t\t// Align with the navigation toggle icon\n\t\tmargin: $margin $margin $margin $navigationToggleSize;\n\t\t> * {\n\t\t\t// Do not grow or shrink (horizontally)\n\t\t\t// Only the breadcrumbs shrinks\n\t\t\tflex: 0 0;\n\t\t}\n\t}\n\t&__refresh-icon {\n\t\tflex: 0 0 44px;\n\t\twidth: 44px;\n\t\theight: 44px;\n\t}\n\t&__loading-icon {\n\t\tmargin: auto;\n\t}\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesList.vue?vue&type=style&index=0&id=77548daf&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesList.vue?vue&type=style&index=0&id=77548daf&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesList.vue?vue&type=template&id=77548daf&scoped=true&\"\nimport script from \"./FilesList.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesList.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesList.vue?vue&type=style&index=0&id=77548daf&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"77548daf\",\n null\n \n)\n\nexport default component.exports","/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport Vue from 'vue'\nimport Router from 'vue-router'\nimport { generateUrl } from '@nextcloud/router'\nimport { stringify } from 'query-string'\n\nVue.use(Router)\n\nconst router = new Router({\n\tmode: 'history',\n\n\t// if index.php is in the url AND we got this far, then it's working:\n\t// let's keep using index.php in the url\n\tbase: generateUrl('/apps/files', ''),\n\tlinkActiveClass: 'active',\n\n\troutes: [\n\t\t{\n\t\t\tpath: '/',\n\t\t\t// Pretending we're using the default view\n\t\t\talias: '/files',\n\t\t},\n\t\t{\n\t\t\tpath: '/:view/:fileid?',\n\t\t\tname: 'filelist',\n\t\t\tprops: true,\n\t\t},\n\t],\n\n\t// Custom stringifyQuery to prevent encoding of slashes in the url\n\tstringifyQuery(query) {\n\t\tconst result = stringify(query).replace(/%2F/gmi, '/')\n\t\treturn result ? ('?' + result) : ''\n\t},\n})\n\nexport default router\n","import './templates.js'\nimport './legacy/filelistSearch.js'\nimport './actions/deleteAction.ts'\n\nimport processLegacyFilesViews from './legacy/navigationMapper.js'\n\nimport Vue from 'vue'\nimport { createPinia, PiniaVuePlugin } from 'pinia'\n\nimport NavigationService from './services/Navigation.ts'\nimport registerPreviewServiceWorker from './services/ServiceWorker.js'\n\nimport NavigationView from './views/Navigation.vue'\nimport FilesListView from './views/FilesList.vue'\n\nimport SettingsService from './services/Settings.js'\nimport SettingsModel from './models/Setting.js'\n\nimport router from './router/router.js'\n\n// Init private and public Files namespace\nwindow.OCA.Files = window.OCA.Files ?? {}\nwindow.OCP.Files = window.OCP.Files ?? {}\n\n// Init Pinia store\nVue.use(PiniaVuePlugin)\nconst pinia = createPinia()\n\n// Init Navigation Service\nconst Navigation = new NavigationService()\nObject.assign(window.OCP.Files, { Navigation })\nVue.prototype.$navigation = Navigation\n\n// Init Files App Settings Service\nconst Settings = new SettingsService()\nObject.assign(window.OCA.Files, { Settings })\nObject.assign(window.OCA.Files.Settings, { Setting: SettingsModel })\n\n// Init Navigation View\nconst View = Vue.extend(NavigationView)\nconst FilesNavigationRoot = new View({\n\tname: 'FilesNavigationRoot',\n\tpropsData: {\n\t\tNavigation,\n\t},\n\trouter,\n\tpinia,\n})\nFilesNavigationRoot.$mount('#app-navigation-files')\n\n// Init content list view\nconst ListView = Vue.extend(FilesListView)\nconst FilesList = new ListView({\n\tname: 'FilesListRoot',\n\trouter,\n\tpinia,\n})\nFilesList.$mount('#app-content-vue')\n\n// Init legacy files views\nprocessLegacyFilesViews()\n\n// Register preview service worker\nregisterPreviewServiceWorker()\n","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nexport default class Settings {\n\n\t_settings\n\n\tconstructor() {\n\t\tthis._settings = []\n\t\tconsole.debug('OCA.Files.Settings initialized')\n\t}\n\n\t/**\n\t * Register a new setting\n\t *\n\t * @since 19.0.0\n\t * @param {OCA.Files.Settings.Setting} view element to add to settings\n\t * @return {boolean} whether registering was successful\n\t */\n\tregister(view) {\n\t\tif (this._settings.filter(e => e.name === view.name).length > 0) {\n\t\t\tconsole.error('A setting with the same name is already registered')\n\t\t\treturn false\n\t\t}\n\t\tthis._settings.push(view)\n\t\treturn true\n\t}\n\n\t/**\n\t * All settings elements\n\t *\n\t * @return {OCA.Files.Settings.Setting[]} All currently registered settings\n\t */\n\tget settings() {\n\t\treturn this._settings\n\t}\n\n}\n","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nexport default class Setting {\n\n\t_close\n\t_el\n\t_name\n\t_open\n\n\t/**\n\t * Create a new files app setting\n\t *\n\t * @since 19.0.0\n\t * @param {string} name the name of this setting\n\t * @param {object} component the component\n\t * @param {Function} component.el function that returns an unmounted dom element to be added\n\t * @param {Function} [component.open] callback for when setting is added\n\t * @param {Function} [component.close] callback for when setting is closed\n\t */\n\tconstructor(name, { el, open, close }) {\n\t\tthis._name = name\n\t\tthis._el = el\n\t\tthis._open = open\n\t\tthis._close = close\n\n\t\tif (typeof this._open !== 'function') {\n\t\t\tthis._open = () => {}\n\t\t}\n\n\t\tif (typeof this._close !== 'function') {\n\t\t\tthis._close = () => {}\n\t\t}\n\t}\n\n\tget name() {\n\t\treturn this._name\n\t}\n\n\tget el() {\n\t\treturn this._el\n\t}\n\n\tget open() {\n\t\treturn this._open\n\t}\n\n\tget close() {\n\t\treturn this._close\n\t}\n\n}\n","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { generateUrl } from '@nextcloud/router'\nimport logger from '../logger.js'\n\nexport default () => {\n\tif ('serviceWorker' in navigator) {\n\t\t// Use the window load event to keep the page load performant\n\t\twindow.addEventListener('load', async () => {\n\t\t\ttry {\n\t\t\t\tconst url = generateUrl('/apps/files/preview-service-worker.js', {}, { noRewrite: true })\n\t\t\t\tconst registration = await navigator.serviceWorker.register(url, { scope: '/' })\n\t\t\t\tlogger.debug('SW registered: ', { registration })\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('SW registration failed: ', { error })\n\t\t\t}\n\t\t})\n\t} else {\n\t\tlogger.debug('Service Worker is not enabled on this browser.')\n\t}\n}\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".breadcrumb[data-v-68b3b20b]{flex:1 1 100% !important;width:100%}.breadcrumb[data-v-68b3b20b] a{cursor:pointer !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/BreadCrumbs.vue\"],\"names\":[],\"mappings\":\"AACA,6BAEC,wBAAA,CACA,UAAA,CAEA,+BACC,yBAAA\",\"sourcesContent\":[\"\\n.breadcrumb {\\n\\t// Take as much space as possible\\n\\tflex: 1 1 100% !important;\\n\\twidth: 100%;\\n\\n\\t::v-deep a {\\n\\t\\tcursor: pointer !important;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".custom-svg-icon[data-v-93e9b2f4]{display:flex;align-items:center;align-self:center;justify-content:center;justify-self:center;width:44px;height:44px;opacity:1}.custom-svg-icon[data-v-93e9b2f4] svg{height:22px;width:22px;fill:currentColor}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/CustomSvgIconRender.vue\"],\"names\":[],\"mappings\":\"AACA,kCACC,YAAA,CACA,kBAAA,CACA,iBAAA,CACA,sBAAA,CACA,mBAAA,CACA,UAAA,CACA,WAAA,CACA,SAAA,CAEA,sCAGC,WAAA,CACA,UAAA,CACA,iBAAA\",\"sourcesContent\":[\"\\n.custom-svg-icon {\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\talign-self: center;\\n\\tjustify-content: center;\\n\\tjustify-self: center;\\n\\twidth: 44px;\\n\\theight: 44px;\\n\\topacity: 1;\\n\\n\\t::v-deep svg {\\n\\t\\t// mdi icons have a size of 24px\\n\\t\\t// 22px results in roughly 16px inner size\\n\\t\\theight: 22px;\\n\\t\\twidth: 22px;\\n\\t\\tfill: currentColor;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"tr[data-v-47057834]:hover,tr[data-v-47057834]:focus,tr[data-v-47057834]:active{background-color:var(--color-background-dark)}.files-list__row-icon-preview[data-v-47057834]:not([style*=background]){background:var(--color-loading-dark)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FileEntry.vue\"],\"names\":[],\"mappings\":\"AAGC,+EAGC,6CAAA,CAKF,wEACI,oCAAA\",\"sourcesContent\":[\"\\n/* Hover effect on tbody lines only */\\ntr {\\n\\t&:hover,\\n\\t&:focus,\\n\\t&:active {\\n\\t\\tbackground-color: var(--color-background-dark);\\n\\t}\\n}\\n\\n/* Preview not loaded animation effect */\\n.files-list__row-icon-preview:not([style*='background']) {\\n background: var(--color-loading-dark);\\n\\t// animation: preview-gradient-fade 1.2s ease-in-out infinite;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"tr[data-v-e6a083be]{padding-bottom:300px;border-top:1px solid var(--color-border);background-color:rgba(0,0,0,0) !important;border-bottom:none !important}td[data-v-e6a083be]{user-select:none;color:var(--color-text-maxcontrast) !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FilesListFooter.vue\"],\"names\":[],\"mappings\":\"AAEA,oBACC,oBAAA,CACA,wCAAA,CAEA,yCAAA,CACA,6BAAA,CAGD,oBACC,gBAAA,CAEA,8CAAA\",\"sourcesContent\":[\"\\n// Scoped row\\ntr {\\n\\tpadding-bottom: 300px;\\n\\tborder-top: 1px solid var(--color-border);\\n\\t// Prevent hover effect on the whole row\\n\\tbackground-color: transparent !important;\\n\\tborder-bottom: none !important;\\n}\\n\\ntd {\\n\\tuser-select: none;\\n\\t// Make sure the cell colors don't apply to column headers\\n\\tcolor: var(--color-text-maxcontrast) !important;\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".files-list__column[data-v-53698ce8]{user-select:none;color:var(--color-text-maxcontrast) !important}.files-list__column--sortable[data-v-53698ce8]{cursor:pointer}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FilesListHeader.vue\"],\"names\":[],\"mappings\":\"AACA,qCACC,gBAAA,CAEA,8CAAA,CAEA,+CACC,cAAA\",\"sourcesContent\":[\"\\n.files-list__column {\\n\\tuser-select: none;\\n\\t// Make sure the cell colors don't apply to column headers\\n\\tcolor: var(--color-text-maxcontrast) !important;\\n\\n\\t&--sortable {\\n\\t\\tcursor: pointer;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".files-list__row-actions-batch[data-v-9d92da06]{flex:1 1 100% !important}.files-list__row-actions-batch[data-v-9d92da06] .button-vue__wrapper{width:100%}.files-list__row-actions-batch[data-v-9d92da06] .button-vue__wrapper span.button-vue__text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FilesListHeaderActions.vue\"],\"names\":[],\"mappings\":\"AACA,gDACC,wBAAA,CAGA,qEACC,UAAA,CACA,2FACC,eAAA,CACA,sBAAA,CACA,kBAAA\",\"sourcesContent\":[\"\\n.files-list__row-actions-batch {\\n\\tflex: 1 1 100% !important;\\n\\n\\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\\n\\t::v-deep .button-vue__wrapper {\\n\\t\\twidth: 100%;\\n\\t\\tspan.button-vue__text {\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\twhite-space: nowrap;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".files-list__column-sort-button{margin:0 calc(var(--cell-margin)*-1);padding:0 4px 0 16px !important}.files-list__column-sort-button .button-vue__wrapper{flex-direction:row-reverse;width:100%}.files-list__column-sort-button .button-vue__icon{transition-timing-function:linear;transition-duration:.1s;transition-property:opacity;opacity:0}.files-list__column-sort-button .button-vue__text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.files-list__column-sort-button--active .button-vue__icon,.files-list__column-sort-button:hover .button-vue__icon,.files-list__column-sort-button:focus .button-vue__icon,.files-list__column-sort-button:active .button-vue__icon{opacity:1 !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FilesListHeaderButton.vue\"],\"names\":[],\"mappings\":\"AACA,gCAEC,oCAAA,CAEA,+BAAA,CAGA,qDACC,0BAAA,CAGA,UAAA,CAGD,kDACC,iCAAA,CACA,uBAAA,CACA,2BAAA,CACA,SAAA,CAID,kDACC,eAAA,CACA,kBAAA,CACA,sBAAA,CAOA,mOACC,oBAAA\",\"sourcesContent\":[\"\\n.files-list__column-sort-button {\\n\\t// Compensate for cells margin\\n\\tmargin: 0 calc(var(--cell-margin) * -1);\\n\\t// Reverse padding\\n\\tpadding: 0 4px 0 16px !important;\\n\\n\\t// Icon after text\\n\\t.button-vue__wrapper {\\n\\t\\tflex-direction: row-reverse;\\n\\t\\t// Take max inner width for text overflow ellipsis\\n\\t\\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\t.button-vue__icon {\\n\\t\\ttransition-timing-function: linear;\\n\\t\\ttransition-duration: .1s;\\n\\t\\ttransition-property: opacity;\\n\\t\\topacity: 0;\\n\\t}\\n\\n\\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\\n\\t.button-vue__text {\\n\\t\\toverflow: hidden;\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t}\\n\\n\\t&--active,\\n\\t&:hover,\\n\\t&:focus,\\n\\t&:active {\\n\\t\\t.button-vue__icon {\\n\\t\\t\\topacity: 1 !important;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".files-list[data-v-07b86e54]{--row-height: 55px;--cell-margin: 14px;--checkbox-padding: calc((var(--row-height) - var(--checkbox-size)) / 2);--checkbox-size: 24px;--clickable-area: 44px;--icon-preview-size: 32px;display:block;overflow:auto;height:100%}.files-list[data-v-07b86e54] tbody,.files-list[data-v-07b86e54] .vue-recycle-scroller__slot{display:flex;flex-direction:column;width:100%;position:relative}.files-list[data-v-07b86e54] .vue-recycle-scroller__slot[role=thead]{position:sticky;z-index:10;top:0;height:var(--row-height);background-color:var(--color-main-background)}.files-list[data-v-07b86e54] tr{position:absolute;display:flex;align-items:center;width:100%;border-bottom:1px solid var(--color-border)}.files-list[data-v-07b86e54] td,.files-list[data-v-07b86e54] th{display:flex;align-items:center;flex:0 0 auto;justify-content:left;width:var(--row-height);height:var(--row-height);margin:0;padding:0;color:var(--color-text-maxcontrast);border:none}.files-list[data-v-07b86e54] td span,.files-list[data-v-07b86e54] th span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.files-list[data-v-07b86e54] .files-list__row-checkbox{justify-content:center}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch{display:flex;justify-content:center;--icon-size: var(--checkbox-size)}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch label.checkbox-radio-switch__label{width:var(--clickable-area);height:var(--clickable-area);margin:0;padding:calc((var(--clickable-area) - var(--checkbox-size))/2)}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch .checkbox-radio-switch__icon{margin:0 !important}.files-list[data-v-07b86e54] .files-list__row-icon{display:flex;align-items:center;justify-content:center;width:var(--icon-preview-size);height:100%;margin-right:var(--checkbox-padding);color:var(--color-primary-element);flex:0 0 var(--icon-preview-size)}.files-list[data-v-07b86e54] .files-list__row-icon>span{justify-content:flex-start}.files-list[data-v-07b86e54] .files-list__row-icon svg{width:var(--icon-preview-size);height:var(--icon-preview-size)}.files-list[data-v-07b86e54] .files-list__row-icon-preview{overflow:hidden;width:var(--icon-preview-size);height:var(--icon-preview-size);border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center;background-size:contain}.files-list[data-v-07b86e54] .files-list__row-name{overflow:hidden;flex:1 1 auto}.files-list[data-v-07b86e54] .files-list__row-name a{display:flex;align-items:center;width:100%;height:100%}.files-list[data-v-07b86e54] .files-list__row-name a:focus .files-list__row-name-text,.files-list[data-v-07b86e54] .files-list__row-name a:focus-visible .files-list__row-name-text{outline:2px solid var(--color-main-text) !important;border-radius:20px}.files-list[data-v-07b86e54] .files-list__row-name .files-list__row-name-text{padding:5px 10px;margin-left:-10px}.files-list[data-v-07b86e54] .files-list__row-actions{width:auto}.files-list[data-v-07b86e54] .files-list__row-actions~td,.files-list[data-v-07b86e54] .files-list__row-actions~th{margin:0 var(--cell-margin)}.files-list[data-v-07b86e54] .files-list__row-actions button .button-vue__text{font-weight:normal}.files-list[data-v-07b86e54] .files-list__row-actions button:not(:hover,:focus,:active) .button-vue__wrapper{color:var(--color-text-maxcontrast)}.files-list[data-v-07b86e54] .files-list__row-size{justify-content:flex-end;width:calc(var(--row-height)*1.5);color:var(--color-main-text)}.files-list[data-v-07b86e54] .files-list__row-size .files-list__column-sort-button{padding:0 16px 0 4px !important}.files-list[data-v-07b86e54] .files-list__row-size .files-list__column-sort-button .button-vue__wrapper{flex-direction:row}.files-list[data-v-07b86e54] .files-list__row-column-custom{width:calc(var(--row-height)*2)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FilesListVirtual.vue\"],\"names\":[],\"mappings\":\"AACA,6BACC,kBAAA,CACA,mBAAA,CAEA,wEAAA,CACA,qBAAA,CACA,sBAAA,CACA,yBAAA,CAEA,aAAA,CACA,aAAA,CACA,WAAA,CAIC,4FACC,YAAA,CACA,qBAAA,CACA,UAAA,CAEA,iBAAA,CAID,qEAEC,eAAA,CACA,UAAA,CACA,KAAA,CACA,wBAAA,CACA,6CAAA,CAGD,gCACC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,UAAA,CACA,2CAAA,CAGD,gEACC,YAAA,CACA,kBAAA,CACA,aAAA,CACA,oBAAA,CACA,uBAAA,CACA,wBAAA,CACA,QAAA,CACA,SAAA,CACA,mCAAA,CACA,WAAA,CAKA,0EACC,eAAA,CACA,kBAAA,CACA,sBAAA,CAIF,uDACC,sBAAA,CACA,8EACC,YAAA,CACA,sBAAA,CAEA,iCAAA,CAEA,iHACC,2BAAA,CACA,4BAAA,CACA,QAAA,CACA,8DAAA,CAGD,2GACC,mBAAA,CAKH,mDACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,8BAAA,CACA,WAAA,CAEA,oCAAA,CACA,kCAAA,CAEA,iCAAA,CAEA,wDACC,0BAAA,CAGD,uDACC,8BAAA,CACA,+BAAA,CAGD,2DACC,eAAA,CACA,8BAAA,CACA,+BAAA,CACA,kCAAA,CACA,2BAAA,CAEA,0BAAA,CACA,uBAAA,CAIF,mDAEC,eAAA,CAEA,aAAA,CAEA,qDACC,YAAA,CACA,kBAAA,CAEA,UAAA,CACA,WAAA,CAGA,oLAEC,mDAAA,CACA,kBAAA,CAIF,8EAEC,gBAAA,CACA,iBAAA,CAIF,sDACC,UAAA,CAGA,kHAEC,2BAAA,CAIA,+EAEC,kBAAA,CAED,6GAEC,mCAAA,CAKH,mDAEC,wBAAA,CACA,iCAAA,CAEA,4BAAA,CAGA,mFACC,+BAAA,CACA,wGACC,kBAAA,CAKH,4DACC,+BAAA\",\"sourcesContent\":[\"\\n.files-list {\\n\\t--row-height: 55px;\\n\\t--cell-margin: 14px;\\n\\n\\t--checkbox-padding: calc((var(--row-height) - var(--checkbox-size)) / 2);\\n\\t--checkbox-size: 24px;\\n\\t--clickable-area: 44px;\\n\\t--icon-preview-size: 32px;\\n\\n\\tdisplay: block;\\n\\toverflow: auto;\\n\\theight: 100%;\\n\\n\\t&::v-deep {\\n\\t\\t// Table head, body and footer\\n\\t\\ttbody, .vue-recycle-scroller__slot {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tflex-direction: column;\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\t// Necessary for virtual scrolling absolute\\n\\t\\t\\tposition: relative;\\n\\t\\t}\\n\\n\\t\\t// Table header\\n\\t\\t.vue-recycle-scroller__slot[role='thead'] {\\n\\t\\t\\t// Pinned on top when scrolling\\n\\t\\t\\tposition: sticky;\\n\\t\\t\\tz-index: 10;\\n\\t\\t\\ttop: 0;\\n\\t\\t\\theight: var(--row-height);\\n\\t\\t\\tbackground-color: var(--color-main-background);\\n\\t\\t}\\n\\n\\t\\ttr {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\tborder-bottom: 1px solid var(--color-border);\\n\\t\\t}\\n\\n\\t\\ttd, th {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\tflex: 0 0 auto;\\n\\t\\t\\tjustify-content: left;\\n\\t\\t\\twidth: var(--row-height);\\n\\t\\t\\theight: var(--row-height);\\n\\t\\t\\tmargin: 0;\\n\\t\\t\\tpadding: 0;\\n\\t\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t\\t\\tborder: none;\\n\\n\\t\\t\\t// Columns should try to add any text\\n\\t\\t\\t// node wrapped in a span. That should help\\n\\t\\t\\t// with the ellipsis on overflow.\\n\\t\\t\\tspan {\\n\\t\\t\\t\\toverflow: hidden;\\n\\t\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-checkbox {\\n\\t\\t\\tjustify-content: center;\\n\\t\\t\\t.checkbox-radio-switch {\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\tjustify-content: center;\\n\\n\\t\\t\\t\\t--icon-size: var(--checkbox-size);\\n\\n\\t\\t\\t\\tlabel.checkbox-radio-switch__label {\\n\\t\\t\\t\\t\\twidth: var(--clickable-area);\\n\\t\\t\\t\\t\\theight: var(--clickable-area);\\n\\t\\t\\t\\t\\tmargin: 0;\\n\\t\\t\\t\\t\\tpadding: calc((var(--clickable-area) - var(--checkbox-size)) / 2);\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t.checkbox-radio-switch__icon {\\n\\t\\t\\t\\t\\tmargin: 0 !important;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-icon {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\tjustify-content: center;\\n\\t\\t\\twidth: var(--icon-preview-size);\\n\\t\\t\\theight: 100%;\\n\\t\\t\\t// Show same padding as the checkbox right padding for visual balance\\n\\t\\t\\tmargin-right: var(--checkbox-padding);\\n\\t\\t\\tcolor: var(--color-primary-element);\\n\\t\\t\\t// No shrinking or growing allowed\\n\\t\\t\\tflex: 0 0 var(--icon-preview-size);\\n\\n\\t\\t\\t& > span {\\n\\t\\t\\t\\tjustify-content: flex-start;\\n\\t\\t\\t}\\n\\n\\t\\t\\tsvg {\\n\\t\\t\\t\\twidth: var(--icon-preview-size);\\n\\t\\t\\t\\theight: var(--icon-preview-size);\\n\\t\\t\\t}\\n\\n\\t\\t\\t&-preview {\\n\\t\\t\\t\\toverflow: hidden;\\n\\t\\t\\t\\twidth: var(--icon-preview-size);\\n\\t\\t\\t\\theight: var(--icon-preview-size);\\n\\t\\t\\t\\tborder-radius: var(--border-radius);\\n\\t\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\t\\t// Center and contain the preview\\n\\t\\t\\t\\tbackground-position: center;\\n\\t\\t\\t\\tbackground-size: contain;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-name {\\n\\t\\t\\t// Prevent link from overflowing\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\t// Take as much space as possible\\n\\t\\t\\tflex: 1 1 auto;\\n\\n\\t\\t\\ta {\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\talign-items: center;\\n\\t\\t\\t\\t// Fill cell height and width\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\theight: 100%;\\n\\n\\t\\t\\t\\t// Keyboard indicator a11y\\n\\t\\t\\t\\t&:focus .files-list__row-name-text,\\n\\t\\t\\t\\t&:focus-visible .files-list__row-name-text {\\n\\t\\t\\t\\t\\toutline: 2px solid var(--color-main-text) !important;\\n\\t\\t\\t\\t\\tborder-radius: 20px;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t.files-list__row-name-text {\\n\\t\\t\\t\\t// Make some space for the outline\\n\\t\\t\\t\\tpadding: 5px 10px;\\n\\t\\t\\t\\tmargin-left: -10px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-actions {\\n\\t\\t\\twidth: auto;\\n\\n\\t\\t\\t// Add margin to all cells after the actions\\n\\t\\t\\t& ~ td,\\n\\t\\t\\t& ~ th {\\n\\t\\t\\t\\tmargin: 0 var(--cell-margin);\\n\\t\\t\\t}\\n\\n\\t\\t\\tbutton {\\n\\t\\t\\t\\t.button-vue__text {\\n\\t\\t\\t\\t\\t// Remove bold from default button styling\\n\\t\\t\\t\\t\\tfont-weight: normal;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t&:not(:hover, :focus, :active) .button-vue__wrapper {\\n\\t\\t\\t\\t\\t// Also apply color-text-maxcontrast to non-active button\\n\\t\\t\\t\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-size {\\n\\t\\t\\t// Right align text\\n\\t\\t\\tjustify-content: flex-end;\\n\\t\\t\\twidth: calc(var(--row-height) * 1.5);\\n\\t\\t\\t// opacity varies with the size\\n\\t\\t\\tcolor: var(--color-main-text);\\n\\n\\t\\t\\t// Icon is before text since size is right aligned\\n\\t\\t\\t.files-list__column-sort-button {\\n\\t\\t\\t\\tpadding: 0 16px 0 4px !important;\\n\\t\\t\\t\\t.button-vue__wrapper {\\n\\t\\t\\t\\t\\tflex-direction: row;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-column-custom {\\n\\t\\t\\twidth: calc(var(--row-height) * 2);\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-navigation-entry__settings-quota--not-unlimited[data-v-918797b2] .app-navigation-entry__title{margin-top:-4px}.app-navigation-entry__settings-quota progress[data-v-918797b2]{position:absolute;bottom:10px;margin-left:44px;width:calc(100% - 44px - 22px)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/NavigationQuota.vue\"],\"names\":[],\"mappings\":\"AAIC,mGACC,eAAA,CAGD,gEACC,iBAAA,CACA,WAAA,CACA,gBAAA,CACA,8BAAA\",\"sourcesContent\":[\"\\n// User storage stats display\\n.app-navigation-entry__settings-quota {\\n\\t// Align title with progress and icon\\n\\t&--not-unlimited::v-deep .app-navigation-entry__title {\\n\\t\\tmargin-top: -4px;\\n\\t}\\n\\n\\tprogress {\\n\\t\\tposition: absolute;\\n\\t\\tbottom: 10px;\\n\\t\\tmargin-left: 44px;\\n\\t\\twidth: calc(100% - 44px - 22px);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".template-picker__item[data-v-6c072a31]{display:flex}.template-picker__label[data-v-6c072a31]{display:flex;align-items:center;flex:1 1;flex-direction:column}.template-picker__label[data-v-6c072a31],.template-picker__label *[data-v-6c072a31]{cursor:pointer;user-select:none}.template-picker__label[data-v-6c072a31]::before{display:none !important}.template-picker__preview[data-v-6c072a31]{display:block;overflow:hidden;flex:1 1;width:var(--width);min-height:var(--height);max-height:var(--height);padding:0;border:var(--border) solid var(--color-border);border-radius:var(--border-radius-large)}input:checked+label>.template-picker__preview[data-v-6c072a31]{border-color:var(--color-primary)}.template-picker__preview--failed[data-v-6c072a31]{display:flex}.template-picker__image[data-v-6c072a31]{max-width:100%;background-color:var(--color-main-background);object-fit:cover}.template-picker__preview--failed .template-picker__image[data-v-6c072a31]{width:calc(var(--margin)*8);margin:auto;background-color:rgba(0,0,0,0) !important;object-fit:initial}.template-picker__title[data-v-6c072a31]{overflow:hidden;max-width:calc(var(--width) + 4px);padding:var(--margin);white-space:nowrap;text-overflow:ellipsis}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/TemplatePreview.vue\"],\"names\":[],\"mappings\":\"AAGC,wCACC,YAAA,CAGD,yCACC,YAAA,CAEA,kBAAA,CACA,QAAA,CACA,qBAAA,CAEA,oFACC,cAAA,CACA,gBAAA,CAGD,iDACC,uBAAA,CAIF,2CACC,aAAA,CACA,eAAA,CAEA,QAAA,CACA,kBAAA,CACA,wBAAA,CACA,wBAAA,CACA,SAAA,CACA,8CAAA,CACA,wCAAA,CAEA,+DACC,iCAAA,CAGD,mDAEC,YAAA,CAIF,yCACC,cAAA,CACA,6CAAA,CAEA,gBAAA,CAID,2EACC,2BAAA,CAEA,WAAA,CACA,yCAAA,CAEA,kBAAA,CAGD,yCACC,eAAA,CAEA,kCAAA,CACA,qBAAA,CACA,kBAAA,CACA,sBAAA\",\"sourcesContent\":[\"\\n\\n.template-picker {\\n\\t&__item {\\n\\t\\tdisplay: flex;\\n\\t}\\n\\n\\t&__label {\\n\\t\\tdisplay: flex;\\n\\t\\t// Align in the middle of the grid\\n\\t\\talign-items: center;\\n\\t\\tflex: 1 1;\\n\\t\\tflex-direction: column;\\n\\n\\t\\t&, * {\\n\\t\\t\\tcursor: pointer;\\n\\t\\t\\tuser-select: none;\\n\\t\\t}\\n\\n\\t\\t&::before {\\n\\t\\t\\tdisplay: none !important;\\n\\t\\t}\\n\\t}\\n\\n\\t&__preview {\\n\\t\\tdisplay: block;\\n\\t\\toverflow: hidden;\\n\\t\\t// Stretch so all entries are the same width\\n\\t\\tflex: 1 1;\\n\\t\\twidth: var(--width);\\n\\t\\tmin-height: var(--height);\\n\\t\\tmax-height: var(--height);\\n\\t\\tpadding: 0;\\n\\t\\tborder: var(--border) solid var(--color-border);\\n\\t\\tborder-radius: var(--border-radius-large);\\n\\n\\t\\tinput:checked + label > & {\\n\\t\\t\\tborder-color: var(--color-primary);\\n\\t\\t}\\n\\n\\t\\t&--failed {\\n\\t\\t\\t// Make sure to properly center fallback icon\\n\\t\\t\\tdisplay: flex;\\n\\t\\t}\\n\\t}\\n\\n\\t&__image {\\n\\t\\tmax-width: 100%;\\n\\t\\tbackground-color: var(--color-main-background);\\n\\n\\t\\tobject-fit: cover;\\n\\t}\\n\\n\\t// Failed preview, fallback to mime icon\\n\\t&__preview--failed &__image {\\n\\t\\twidth: calc(var(--margin) * 8);\\n\\t\\t// Center mime icon\\n\\t\\tmargin: auto;\\n\\t\\tbackground-color: transparent !important;\\n\\n\\t\\tobject-fit: initial;\\n\\t}\\n\\n\\t&__title {\\n\\t\\toverflow: hidden;\\n\\t\\t// also count preview border\\n\\t\\tmax-width: calc(var(--width) + 2*2px);\\n\\t\\tpadding: var(--margin);\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-content[data-v-77548daf]{display:flex;overflow:hidden;flex-direction:column;max-height:100%}.app-content[data-v-77548daf]:not(.app-content--hidden)+#app-content{display:none}.files-list__header[data-v-77548daf]{display:flex;align-content:center;flex:0 0;margin:4px 4px 4px 50px}.files-list__header>*[data-v-77548daf]{flex:0 0}.files-list__refresh-icon[data-v-77548daf]{flex:0 0 44px;width:44px;height:44px}.files-list__loading-icon[data-v-77548daf]{margin:auto}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/views/FilesList.vue\"],\"names\":[],\"mappings\":\"AACA,8BAEC,YAAA,CACA,eAAA,CACA,qBAAA,CACA,eAAA,CAIA,qEACC,YAAA,CAQD,qCACC,YAAA,CACA,oBAAA,CAEA,QAAA,CAEA,uBAAA,CACA,uCAGC,QAAA,CAGF,2CACC,aAAA,CACA,UAAA,CACA,WAAA,CAED,2CACC,WAAA\",\"sourcesContent\":[\"\\n.app-content {\\n\\t// Virtual list needs to be full height and is scrollable\\n\\tdisplay: flex;\\n\\toverflow: hidden;\\n\\tflex-direction: column;\\n\\tmax-height: 100%;\\n\\n\\t// TODO: remove after all legacy views are migrated\\n\\t// Hides the legacy app-content if shown view is not legacy\\n\\t&:not(&--hidden)::v-deep + #app-content {\\n\\t\\tdisplay: none;\\n\\t}\\n}\\n\\n$margin: 4px;\\n$navigationToggleSize: 50px;\\n\\n.files-list {\\n\\t&__header {\\n\\t\\tdisplay: flex;\\n\\t\\talign-content: center;\\n\\t\\t// Do not grow or shrink (vertically)\\n\\t\\tflex: 0 0;\\n\\t\\t// Align with the navigation toggle icon\\n\\t\\tmargin: $margin $margin $margin $navigationToggleSize;\\n\\t\\t> * {\\n\\t\\t\\t// Do not grow or shrink (horizontally)\\n\\t\\t\\t// Only the breadcrumbs shrinks\\n\\t\\t\\tflex: 0 0;\\n\\t\\t}\\n\\t}\\n\\t&__refresh-icon {\\n\\t\\tflex: 0 0 44px;\\n\\t\\twidth: 44px;\\n\\t\\theight: 44px;\\n\\t}\\n\\t&__loading-icon {\\n\\t\\tmargin: auto;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-navigation[data-v-508e08a4] .app-navigation-entry-icon{background-repeat:no-repeat;background-position:center}.app-navigation>ul.app-navigation__list[data-v-508e08a4]{padding-bottom:var(--default-grid-baseline, 4px)}.app-navigation-entry__settings[data-v-508e08a4]{height:auto !important;overflow:hidden !important;padding-top:0 !important;flex:0 0 auto}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/views/Navigation.vue\"],\"names\":[],\"mappings\":\"AAEA,4DACC,2BAAA,CACA,0BAAA,CAGD,yDAEC,gDAAA,CAGD,iDACC,sBAAA,CACA,0BAAA,CACA,wBAAA,CAEA,aAAA\",\"sourcesContent\":[\"\\n// TODO: remove when https://github.com/nextcloud/nextcloud-vue/pull/3539 is in\\n.app-navigation::v-deep .app-navigation-entry-icon {\\n\\tbackground-repeat: no-repeat;\\n\\tbackground-position: center;\\n}\\n\\n.app-navigation > ul.app-navigation__list {\\n\\t// Use flex gap value for more elegant spacing\\n\\tpadding-bottom: var(--default-grid-baseline, 4px);\\n}\\n\\n.app-navigation-entry__settings {\\n\\theight: auto !important;\\n\\toverflow: hidden !important;\\n\\tpadding-top: 0 !important;\\n\\t// Prevent shrinking or growing\\n\\tflex: 0 0 auto;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".setting-link[data-v-76ca5d1f]:hover{text-decoration:underline}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/views/Settings.vue\"],\"names\":[],\"mappings\":\"AACA,qCACC,yBAAA\",\"sourcesContent\":[\"\\n.setting-link:hover {\\n\\ttext-decoration: underline;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".templates-picker__form[data-v-715b4161]{padding:calc(var(--margin)*2);padding-bottom:0}.templates-picker__form h2[data-v-715b4161]{text-align:center;font-weight:bold;margin:var(--margin) 0 calc(var(--margin)*2)}.templates-picker__list[data-v-715b4161]{display:grid;grid-gap:calc(var(--margin)*2);grid-auto-columns:1fr;max-width:calc(var(--fullwidth)*6);grid-template-columns:repeat(auto-fit, var(--fullwidth));grid-auto-rows:1fr;justify-content:center}.templates-picker__buttons[data-v-715b4161]{display:flex;justify-content:space-between;padding:calc(var(--margin)*2) var(--margin);position:sticky;bottom:0;background-image:linear-gradient(0, var(--gradient-main-background))}.templates-picker__buttons button[data-v-715b4161],.templates-picker__buttons input[type=submit][data-v-715b4161]{height:44px}.templates-picker[data-v-715b4161] .modal-container{position:relative}.templates-picker__loading[data-v-715b4161]{position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;margin:0;background-color:var(--color-main-background-translucent)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/views/TemplatePicker.vue\"],\"names\":[],\"mappings\":\"AAEC,yCACC,6BAAA,CAEA,gBAAA,CAEA,4CACC,iBAAA,CACA,gBAAA,CACA,4CAAA,CAIF,yCACC,YAAA,CACA,8BAAA,CACA,qBAAA,CAEA,kCAAA,CACA,wDAAA,CAEA,kBAAA,CAEA,sBAAA,CAGD,4CACC,YAAA,CACA,6BAAA,CACA,2CAAA,CACA,eAAA,CACA,QAAA,CACA,oEAAA,CAEA,kHACC,WAAA,CAKF,oDACC,iBAAA,CAGD,4CACC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,sBAAA,CACA,UAAA,CACA,WAAA,CACA,QAAA,CACA,yDAAA\",\"sourcesContent\":[\"\\n.templates-picker {\\n\\t&__form {\\n\\t\\tpadding: calc(var(--margin) * 2);\\n\\t\\t// Will be handled by the buttons\\n\\t\\tpadding-bottom: 0;\\n\\n\\t\\th2 {\\n\\t\\t\\ttext-align: center;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tmargin: var(--margin) 0 calc(var(--margin) * 2);\\n\\t\\t}\\n\\t}\\n\\n\\t&__list {\\n\\t\\tdisplay: grid;\\n\\t\\tgrid-gap: calc(var(--margin) * 2);\\n\\t\\tgrid-auto-columns: 1fr;\\n\\t\\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\\n\\t\\tmax-width: calc(var(--fullwidth) * 6);\\n\\t\\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\\n\\t\\t// Make sure all rows are the same height\\n\\t\\tgrid-auto-rows: 1fr;\\n\\t\\t// Center the columns set\\n\\t\\tjustify-content: center;\\n\\t}\\n\\n\\t&__buttons {\\n\\t\\tdisplay: flex;\\n\\t\\tjustify-content: space-between;\\n\\t\\tpadding: calc(var(--margin) * 2) var(--margin);\\n\\t\\tposition: sticky;\\n\\t\\tbottom: 0;\\n\\t\\tbackground-image: linear-gradient(0, var(--gradient-main-background));\\n\\n\\t\\tbutton, input[type='submit'] {\\n\\t\\t\\theight: 44px;\\n\\t\\t}\\n\\t}\\n\\n\\t// Make sure we're relative for the loading emptycontent on top\\n\\t::v-deep .modal-container {\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\t&__loading {\\n\\t\\tposition: absolute;\\n\\t\\ttop: 0;\\n\\t\\tleft: 0;\\n\\t\\tjustify-content: center;\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\t\\tmargin: 0;\\n\\t\\tbackground-color: var(--color-main-background-translucent);\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n/* @keyframes preview-gradient-fade {\\n 0% {\\n opacity: 1;\\n }\\n 50% {\\n opacity: 0.5;\\n }\\n 100% {\\n opacity: 1;\\n }\\n} */\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FileEntry.vue\"],\"names\":[],\"mappings\":\";AAmjBA;;;;;;;;;;GAUA\",\"sourcesContent\":[\"<!--\\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\\n -\\n - @author John Molakvoæ <skjnldsv@protonmail.com>\\n -\\n - @license GNU AGPL version 3 or any later version\\n -\\n - This program is free software: you can redistribute it and/or modify\\n - it under the terms of the GNU Affero General Public License as\\n - published by the Free Software Foundation, either version 3 of the\\n - License, or (at your option) any later version.\\n -\\n - This program is distributed in the hope that it will be useful,\\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n - GNU Affero General Public License for more details.\\n -\\n - You should have received a copy of the GNU Affero General Public License\\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\\n -\\n -->\\n\\n<template>\\n\\t<Fragment>\\n\\t\\t<td class=\\\"files-list__row-checkbox\\\">\\n\\t\\t\\t<NcCheckboxRadioSwitch v-if=\\\"active\\\"\\n\\t\\t\\t\\t:aria-label=\\\"t('files', 'Select the row for {displayName}', { displayName })\\\"\\n\\t\\t\\t\\t:checked=\\\"selectedFiles\\\"\\n\\t\\t\\t\\t:value=\\\"fileid\\\"\\n\\t\\t\\t\\tname=\\\"selectedFiles\\\"\\n\\t\\t\\t\\t@update:checked=\\\"onSelectionChange\\\" />\\n\\t\\t</td>\\n\\n\\t\\t<!-- Link to file -->\\n\\t\\t<td class=\\\"files-list__row-name\\\">\\n\\t\\t\\t<a ref=\\\"name\\\" v-bind=\\\"linkTo\\\">\\n\\t\\t\\t\\t<!-- Icon or preview -->\\n\\t\\t\\t\\t<span class=\\\"files-list__row-icon\\\">\\n\\t\\t\\t\\t\\t<FolderIcon v-if=\\\"source.type === 'folder'\\\" />\\n\\n\\t\\t\\t\\t\\t<!-- Decorative image, should not be aria documented -->\\n\\t\\t\\t\\t\\t<span v-else-if=\\\"previewUrl && !backgroundFailed\\\"\\n\\t\\t\\t\\t\\t\\tref=\\\"previewImg\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"files-list__row-icon-preview\\\"\\n\\t\\t\\t\\t\\t\\t:style=\\\"{ backgroundImage }\\\" />\\n\\n\\t\\t\\t\\t\\t<span v-else-if=\\\"mimeIconUrl\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"files-list__row-icon-preview files-list__row-icon-preview--mime\\\"\\n\\t\\t\\t\\t\\t\\t:style=\\\"{ backgroundImage: mimeIconUrl }\\\" />\\n\\n\\t\\t\\t\\t\\t<FileIcon v-else />\\n\\t\\t\\t\\t</span>\\n\\n\\t\\t\\t\\t<!-- File name -->\\n\\t\\t\\t\\t<span class=\\\"files-list__row-name-text\\\">{{ displayName }}</span>\\n\\t\\t\\t</a>\\n\\t\\t</td>\\n\\n\\t\\t<!-- Actions -->\\n\\t\\t<td :class=\\\"`files-list__row-actions-${uniqueId}`\\\" class=\\\"files-list__row-actions\\\">\\n\\t\\t\\t<!-- Inline actions -->\\n\\t\\t\\t<!-- TODO: implement CustomElementRender -->\\n\\n\\t\\t\\t<!-- Menu actions -->\\n\\t\\t\\t<NcActions v-if=\\\"active\\\"\\n\\t\\t\\t\\tref=\\\"actionsMenu\\\"\\n\\t\\t\\t\\t:disabled=\\\"source._loading\\\"\\n\\t\\t\\t\\t:force-title=\\\"true\\\"\\n\\t\\t\\t\\t:inline=\\\"enabledInlineActions.length\\\"\\n\\t\\t\\t\\t:open.sync=\\\"openedMenu\\\">\\n\\t\\t\\t\\t<NcActionButton v-for=\\\"action in enabledMenuActions\\\"\\n\\t\\t\\t\\t\\t:key=\\\"action.id\\\"\\n\\t\\t\\t\\t\\t:class=\\\"'files-list__row-action-' + action.id\\\"\\n\\t\\t\\t\\t\\t@click=\\\"onActionClick(action)\\\">\\n\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t<NcLoadingIcon v-if=\\\"loading === action.id\\\" :size=\\\"18\\\" />\\n\\t\\t\\t\\t\\t\\t<CustomSvgIconRender v-else :svg=\\\"action.iconSvgInline([source], currentView)\\\" />\\n\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t\\t{{ action.displayName([source], currentView) }}\\n\\t\\t\\t\\t</NcActionButton>\\n\\t\\t\\t</NcActions>\\n\\t\\t</td>\\n\\n\\t\\t<!-- Size -->\\n\\t\\t<td v-if=\\\"isSizeAvailable\\\"\\n\\t\\t\\t:style=\\\"{ opacity: sizeOpacity }\\\"\\n\\t\\t\\tclass=\\\"files-list__row-size\\\">\\n\\t\\t\\t<span>{{ size }}</span>\\n\\t\\t</td>\\n\\n\\t\\t<!-- View columns -->\\n\\t\\t<td v-for=\\\"column in columns\\\"\\n\\t\\t\\t:key=\\\"column.id\\\"\\n\\t\\t\\t:class=\\\"`files-list__row-${currentView?.id}-${column.id}`\\\"\\n\\t\\t\\tclass=\\\"files-list__row-column-custom\\\">\\n\\t\\t\\t<CustomElementRender v-if=\\\"active\\\"\\n\\t\\t\\t\\t:current-view=\\\"currentView\\\"\\n\\t\\t\\t\\t:render=\\\"column.render\\\"\\n\\t\\t\\t\\t:source=\\\"source\\\" />\\n\\t\\t</td>\\n\\t</Fragment>\\n</template>\\n\\n<script lang='ts'>\\nimport { debounce } from 'debounce'\\nimport { formatFileSize } from '@nextcloud/files'\\nimport { Fragment } from 'vue-frag'\\nimport { join } from 'path'\\nimport { showError, showSuccess } from '@nextcloud/dialogs'\\nimport { translate } from '@nextcloud/l10n'\\nimport CancelablePromise from 'cancelable-promise'\\nimport FileIcon from 'vue-material-design-icons/File.vue'\\nimport FolderIcon from 'vue-material-design-icons/Folder.vue'\\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\\nimport Vue from 'vue'\\n\\nimport { getFileActions } from '../services/FileAction.ts'\\nimport { isCachedPreview } from '../services/PreviewService.ts'\\nimport { useActionsMenuStore } from '../store/actionsmenu.ts'\\nimport { useFilesStore } from '../store/files.ts'\\nimport { useKeyboardStore } from '../store/keyboard.ts'\\nimport { useSelectionStore } from '../store/selection.ts'\\nimport { useUserConfigStore } from '../store/userconfig.ts'\\nimport CustomElementRender from './CustomElementRender.vue'\\nimport CustomSvgIconRender from './CustomSvgIconRender.vue'\\nimport logger from '../logger.js'\\n\\n// The registered actions list\\nconst actions = getFileActions()\\n\\nexport default Vue.extend({\\n\\tname: 'FileEntry',\\n\\n\\tcomponents: {\\n\\t\\tCustomElementRender,\\n\\t\\tCustomSvgIconRender,\\n\\t\\tFileIcon,\\n\\t\\tFolderIcon,\\n\\t\\tFragment,\\n\\t\\tNcActionButton,\\n\\t\\tNcActions,\\n\\t\\tNcCheckboxRadioSwitch,\\n\\t\\tNcLoadingIcon,\\n\\t},\\n\\n\\tprops: {\\n\\t\\tactive: {\\n\\t\\t\\ttype: Boolean,\\n\\t\\t\\tdefault: false,\\n\\t\\t},\\n\\t\\tisSizeAvailable: {\\n\\t\\t\\ttype: Boolean,\\n\\t\\t\\tdefault: false,\\n\\t\\t},\\n\\t\\tsource: {\\n\\t\\t\\ttype: Object,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t\\tindex: {\\n\\t\\t\\ttype: Number,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t\\tnodes: {\\n\\t\\t\\ttype: Array,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t\\tfilesListWidth: {\\n\\t\\t\\ttype: Number,\\n\\t\\t\\tdefault: 0,\\n\\t\\t},\\n\\t},\\n\\n\\tsetup() {\\n\\t\\tconst actionsMenuStore = useActionsMenuStore()\\n\\t\\tconst filesStore = useFilesStore()\\n\\t\\tconst keyboardStore = useKeyboardStore()\\n\\t\\tconst selectionStore = useSelectionStore()\\n\\t\\tconst userConfigStore = useUserConfigStore()\\n\\t\\treturn {\\n\\t\\t\\tactionsMenuStore,\\n\\t\\t\\tfilesStore,\\n\\t\\t\\tkeyboardStore,\\n\\t\\t\\tselectionStore,\\n\\t\\t\\tuserConfigStore,\\n\\t\\t}\\n\\t},\\n\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tbackgroundFailed: false,\\n\\t\\t\\tbackgroundImage: '',\\n\\t\\t\\tloading: '',\\n\\t\\t}\\n\\t},\\n\\n\\tcomputed: {\\n\\t\\tuserConfig() {\\n\\t\\t\\treturn this.userConfigStore.userConfig\\n\\t\\t},\\n\\n\\t\\tcurrentView() {\\n\\t\\t\\treturn this.$navigation.active\\n\\t\\t},\\n\\n\\t\\tcolumns() {\\n\\t\\t\\t// Hide columns if the list is too small\\n\\t\\t\\tif (this.filesListWidth < 512) {\\n\\t\\t\\t\\treturn []\\n\\t\\t\\t}\\n\\t\\t\\treturn this.currentView?.columns || []\\n\\t\\t},\\n\\n\\t\\tdir() {\\n\\t\\t\\t// Remove any trailing slash but leave root slash\\n\\t\\t\\treturn (this.$route?.query?.dir || '/').replace(/^(.+)\\\\/$/, '$1')\\n\\t\\t},\\n\\n\\t\\tfileid() {\\n\\t\\t\\treturn this.source?.fileid?.toString?.()\\n\\t\\t},\\n\\t\\tdisplayName() {\\n\\t\\t\\treturn this.source.attributes.displayName\\n\\t\\t\\t\\t|| this.source.basename\\n\\t\\t},\\n\\t\\tsize() {\\n\\t\\t\\tconst size = parseInt(this.source.size, 10) || 0\\n\\t\\t\\tif (typeof size !== 'number' || size < 0) {\\n\\t\\t\\t\\treturn this.t('files', 'Pending')\\n\\t\\t\\t}\\n\\t\\t\\treturn formatFileSize(size, true)\\n\\t\\t},\\n\\n\\t\\tsizeOpacity() {\\n\\t\\t\\tconst size = parseInt(this.source.size, 10) || 0\\n\\t\\t\\tif (!size || size < 0) {\\n\\t\\t\\t\\treturn 1\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Whatever theme is active, the contrast will pass WCAG AA\\n\\t\\t\\t// with color main text over main background and an opacity of 0.7\\n\\t\\t\\tconst minOpacity = 0.7\\n\\t\\t\\tconst maxOpacitySize = 10 * 1024 * 1024\\n\\t\\t\\treturn minOpacity + (1 - minOpacity) * Math.pow((this.source.size / maxOpacitySize), 2)\\n\\t\\t},\\n\\n\\t\\tlinkTo() {\\n\\t\\t\\tif (this.source.type === 'folder') {\\n\\t\\t\\t\\tconst to = { ...this.$route, query: { dir: join(this.dir, this.source.basename) } }\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\tis: 'router-link',\\n\\t\\t\\t\\t\\ttitle: this.t('files', 'Open folder {name}', { name: this.displayName }),\\n\\t\\t\\t\\t\\tto,\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn {\\n\\t\\t\\t\\thref: this.source.source,\\n\\t\\t\\t\\t// TODO: Use first action title ?\\n\\t\\t\\t\\ttitle: this.t('files', 'Download file {name}', { name: this.displayName }),\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tselectedFiles() {\\n\\t\\t\\treturn this.selectionStore.selected\\n\\t\\t},\\n\\t\\tisSelected() {\\n\\t\\t\\treturn this.selectedFiles.includes(this.source?.fileid?.toString?.())\\n\\t\\t},\\n\\n\\t\\tcropPreviews() {\\n\\t\\t\\treturn this.userConfig.crop_image_previews\\n\\t\\t},\\n\\n\\t\\tpreviewUrl() {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tconst url = new URL(window.location.origin + this.source.attributes.previewUrl)\\n\\t\\t\\t\\t// Request tiny previews\\n\\t\\t\\t\\turl.searchParams.set('x', '32')\\n\\t\\t\\t\\turl.searchParams.set('y', '32')\\n\\t\\t\\t\\t// Handle cropping\\n\\t\\t\\t\\turl.searchParams.set('a', this.cropPreviews === true ? '1' : '0')\\n\\t\\t\\t\\treturn url.href\\n\\t\\t\\t} catch (e) {\\n\\t\\t\\t\\treturn null\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tmimeIconUrl() {\\n\\t\\t\\tconst mimeType = this.source.mime || 'application/octet-stream'\\n\\t\\t\\tconst mimeIconUrl = window.OC?.MimeType?.getIconUrl?.(mimeType)\\n\\t\\t\\tif (mimeIconUrl) {\\n\\t\\t\\t\\treturn `url(${mimeIconUrl})`\\n\\t\\t\\t}\\n\\t\\t\\treturn ''\\n\\t\\t},\\n\\n\\t\\tenabledActions() {\\n\\t\\t\\treturn actions\\n\\t\\t\\t\\t.filter(action => !action.enabled || action.enabled([this.source], this.currentView))\\n\\t\\t\\t\\t.sort((a, b) => (a.order || 0) - (b.order || 0))\\n\\t\\t},\\n\\n\\t\\tenabledInlineActions() {\\n\\t\\t\\tif (this.filesListWidth < 768) {\\n\\t\\t\\t\\treturn []\\n\\t\\t\\t}\\n\\t\\t\\treturn this.enabledActions.filter(action => action?.inline?.(this.source, this.currentView))\\n\\t\\t},\\n\\n\\t\\tenabledMenuActions() {\\n\\t\\t\\tif (this.filesListWidth < 768) {\\n\\t\\t\\t\\treturn this.enabledActions\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn [\\n\\t\\t\\t\\t...this.enabledInlineActions,\\n\\t\\t\\t\\t...this.enabledActions.filter(action => !action.inline),\\n\\t\\t\\t]\\n\\t\\t},\\n\\n\\t\\tuniqueId() {\\n\\t\\t\\treturn this.hashCode(this.source.source)\\n\\t\\t},\\n\\n\\t\\topenedMenu: {\\n\\t\\t\\tget() {\\n\\t\\t\\t\\treturn this.actionsMenuStore.opened === this.uniqueId\\n\\t\\t\\t},\\n\\t\\t\\tset(opened) {\\n\\t\\t\\t\\tthis.actionsMenuStore.opened = opened ? this.uniqueId : null\\n\\t\\t\\t},\\n\\t\\t},\\n\\t},\\n\\n\\twatch: {\\n\\t\\tactive(active, before) {\\n\\t\\t\\tif (active === false && before === true) {\\n\\t\\t\\t\\tthis.resetState()\\n\\n\\t\\t\\t\\t// When the row is not active anymore\\n\\t\\t\\t\\t// remove the display from the row to prevent\\n\\t\\t\\t\\t// keyboard interaction with it.\\n\\t\\t\\t\\tthis.$el.parentNode.style.display = 'none'\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Restore default tabindex\\n\\t\\t\\tthis.$el.parentNode.style.display = ''\\n\\t\\t},\\n\\n\\t\\t/**\\n\\t\\t * When the source changes, reset the preview\\n\\t\\t * and fetch the new one.\\n\\t\\t */\\n\\t\\tpreviewUrl() {\\n\\t\\t\\tthis.clearImg()\\n\\t\\t\\tthis.debounceIfNotCached()\\n\\t\\t},\\n\\t},\\n\\n\\t/**\\n\\t * The row is mounted once and reused as we scroll.\\n\\t */\\n\\tmounted() {\\n\\t\\t// ⚠ Init the debounce function on mount and\\n\\t\\t// not when the module is imported to\\n\\t\\t// avoid sharing between recycled components\\n\\t\\tthis.debounceGetPreview = debounce(function() {\\n\\t\\t\\tthis.fetchAndApplyPreview()\\n\\t\\t}, 150, false)\\n\\n\\t\\t// Fetch the preview on init\\n\\t\\tthis.debounceIfNotCached()\\n\\n\\t\\t// Right click watcher on tr\\n\\t\\tthis.$el.parentNode?.addEventListener?.('contextmenu', this.onRightClick)\\n\\t},\\n\\n\\tbeforeDestroy() {\\n\\t\\tthis.resetState()\\n\\t},\\n\\n\\tmethods: {\\n\\t\\tasync debounceIfNotCached() {\\n\\t\\t\\tif (!this.previewUrl) {\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Check if we already have this preview cached\\n\\t\\t\\tconst isCached = await isCachedPreview(this.previewUrl)\\n\\t\\t\\tif (isCached) {\\n\\t\\t\\t\\tthis.backgroundImage = `url(${this.previewUrl})`\\n\\t\\t\\t\\tthis.backgroundFailed = false\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\t// We don't have this preview cached or it expired, requesting it\\n\\t\\t\\tthis.debounceGetPreview()\\n\\t\\t},\\n\\n\\t\\tfetchAndApplyPreview() {\\n\\t\\t\\t// Ignore if no preview\\n\\t\\t\\tif (!this.previewUrl) {\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If any image is being processed, reset it\\n\\t\\t\\tif (this.previewPromise) {\\n\\t\\t\\t\\tthis.clearImg()\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Store the promise to be able to cancel it\\n\\t\\t\\tthis.previewPromise = new CancelablePromise((resolve, reject, onCancel) => {\\n\\t\\t\\t\\tconst img = new Image()\\n\\t\\t\\t\\t// If active, load the preview with higher priority\\n\\t\\t\\t\\timg.fetchpriority = this.active ? 'high' : 'auto'\\n\\t\\t\\t\\timg.onload = () => {\\n\\t\\t\\t\\t\\tthis.backgroundImage = `url(${this.previewUrl})`\\n\\t\\t\\t\\t\\tthis.backgroundFailed = false\\n\\t\\t\\t\\t\\tresolve(img)\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\timg.onerror = () => {\\n\\t\\t\\t\\t\\tthis.backgroundFailed = true\\n\\t\\t\\t\\t\\treject(img)\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\timg.src = this.previewUrl\\n\\n\\t\\t\\t\\t// Image loading has been canceled\\n\\t\\t\\t\\tonCancel(() => {\\n\\t\\t\\t\\t\\timg.onerror = null\\n\\t\\t\\t\\t\\timg.onload = null\\n\\t\\t\\t\\t\\timg.src = ''\\n\\t\\t\\t\\t})\\n\\t\\t\\t})\\n\\t\\t},\\n\\n\\t\\tresetState() {\\n\\t\\t\\t// Reset loading state\\n\\t\\t\\tthis.loading = ''\\n\\n\\t\\t\\t// Reset the preview\\n\\t\\t\\tthis.clearImg()\\n\\n\\t\\t\\t// Close menu\\n\\t\\t\\tthis.openedMenu = false\\n\\t\\t},\\n\\n\\t\\tclearImg() {\\n\\t\\t\\tthis.backgroundImage = ''\\n\\t\\t\\tthis.backgroundFailed = false\\n\\n\\t\\t\\tif (this.previewPromise) {\\n\\t\\t\\t\\tthis.previewPromise.cancel()\\n\\t\\t\\t\\tthis.previewPromise = null\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\thashCode(str) {\\n\\t\\t\\tlet hash = 0\\n\\t\\t\\tfor (let i = 0, len = str.length; i < len; i++) {\\n\\t\\t\\t\\tconst chr = str.charCodeAt(i)\\n\\t\\t\\t\\thash = (hash << 5) - hash + chr\\n\\t\\t\\t\\thash |= 0 // Convert to 32bit integer\\n\\t\\t\\t}\\n\\t\\t\\treturn hash\\n\\t\\t},\\n\\n\\t\\tasync onActionClick(action) {\\n\\t\\t\\tconst displayName = action.displayName([this.source], this.currentView)\\n\\t\\t\\ttry {\\n\\t\\t\\t\\t// Set the loading marker\\n\\t\\t\\t\\tthis.loading = action.id\\n\\t\\t\\t\\tVue.set(this.source, '_loading', true)\\n\\n\\t\\t\\t\\tconst success = await action.exec(this.source, this.currentView)\\n\\t\\t\\t\\tif (success) {\\n\\t\\t\\t\\t\\tshowSuccess(this.t('files', '\\\"{displayName}\\\" action executed successfully', { displayName }))\\n\\t\\t\\t\\t\\treturn\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tshowError(this.t('files', '\\\"{displayName}\\\" action failed', { displayName }))\\n\\t\\t\\t} catch (e) {\\n\\t\\t\\t\\tlogger.error('Error while executing action', { action, e })\\n\\t\\t\\t\\tshowError(this.t('files', '\\\"{displayName}\\\" action failed', { displayName }))\\n\\t\\t\\t} finally {\\n\\t\\t\\t\\t// Reset the loading marker\\n\\t\\t\\t\\tthis.loading = ''\\n\\t\\t\\t\\tVue.set(this.source, '_loading', false)\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tonSelectionChange(selection) {\\n\\t\\t\\tconst newSelectedIndex = this.index\\n\\t\\t\\tconst lastSelectedIndex = this.selectionStore.lastSelectedIndex\\n\\n\\t\\t\\t// Get the last selected and select all files in between\\n\\t\\t\\tif (this.keyboardStore?.shiftKey && lastSelectedIndex !== null) {\\n\\t\\t\\t\\tconst isAlreadySelected = this.selectedFiles.includes(this.fileid)\\n\\n\\t\\t\\t\\tconst start = Math.min(newSelectedIndex, lastSelectedIndex)\\n\\t\\t\\t\\tconst end = Math.max(lastSelectedIndex, newSelectedIndex)\\n\\n\\t\\t\\t\\tconst lastSelection = this.selectionStore.lastSelection\\n\\t\\t\\t\\tconst filesToSelect = this.nodes\\n\\t\\t\\t\\t\\t.map(file => file.fileid?.toString?.())\\n\\t\\t\\t\\t\\t.slice(start, end + 1)\\n\\n\\t\\t\\t\\t// If already selected, update the new selection _without_ the current file\\n\\t\\t\\t\\tconst selection = [...lastSelection, ...filesToSelect]\\n\\t\\t\\t\\t\\t.filter(fileId => !isAlreadySelected || fileId !== this.fileid)\\n\\n\\t\\t\\t\\tlogger.debug('Shift key pressed, selecting all files in between', { start, end, filesToSelect, isAlreadySelected })\\n\\t\\t\\t\\t// Keep previous lastSelectedIndex to be use for further shift selections\\n\\t\\t\\t\\tthis.selectionStore.set(selection)\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\tlogger.debug('Updating selection', { selection })\\n\\t\\t\\tthis.selectionStore.set(selection)\\n\\t\\t\\tthis.selectionStore.setLastIndex(newSelectedIndex)\\n\\t\\t},\\n\\n\\t\\t// Open the actions menu on right click\\n\\t\\tonRightClick(event) {\\n\\t\\t\\t// If already opened, fallback to default browser\\n\\t\\t\\tif (this.openedMenu) {\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If the clicked row is in the selection, open global menu\\n\\t\\t\\tconst isMoreThanOneSelected = this.selectedFiles.length > 1\\n\\t\\t\\tthis.actionsMenuStore.opened = this.isSelected && isMoreThanOneSelected ? 'global' : this.uniqueId\\n\\n\\t\\t\\t// Prevent any browser defaults\\n\\t\\t\\tevent.preventDefault()\\n\\t\\t\\tevent.stopPropagation()\\n\\t\\t},\\n\\n\\t\\tt: translate,\\n\\t\\tformatFileSize,\\n\\t},\\n})\\n</script>\\n\\n<style scoped lang='scss'>\\n/* Hover effect on tbody lines only */\\ntr {\\n\\t&:hover,\\n\\t&:focus,\\n\\t&:active {\\n\\t\\tbackground-color: var(--color-background-dark);\\n\\t}\\n}\\n\\n/* Preview not loaded animation effect */\\n.files-list__row-icon-preview:not([style*='background']) {\\n background: var(--color-loading-dark);\\n\\t// animation: preview-gradient-fade 1.2s ease-in-out infinite;\\n}\\n</style>\\n\\n<style>\\n/* @keyframes preview-gradient-fade {\\n 0% {\\n opacity: 1;\\n }\\n 50% {\\n opacity: 0.5;\\n }\\n 100% {\\n opacity: 1;\\n }\\n} */\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 2181;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t2181: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], () => (__webpack_require__(18482)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","getCurrentDirectory","currentDirInfo","OCA","Files","App","currentFileList","dirInfo","path","name","replace","previewWidth","inheritAttrs","props","basename","type","required","checked","default","fileid","filename","previewUrl","hasPreview","mime","ratio","data","failedPreview","computed","nameWithoutExt","id","realPreviewUrl","getCurrentUser","document","getElementById","value","pathSections","startsWith","split","relativePath","forEach","section","encodeURIComponent","mimeIcon","methods","onCheck","onFailure","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_c","_self","staticClass","attrs","domProps","on","_v","class","_s","components","NcEmptyContent","NcModal","TemplatePreview","logger","loading","opened","provider","emptyTemplate","selectedTemplate","style","margin","async","axios","generateOcsUrl","ocs","close","extension","filePath","templatePath","templateType","normalize","filesClient","fileAction","$file","dir","fileList","fileActions","fileInfoModel","console","showError","$event","preventDefault","stopPropagation","onSubmit","apply","arguments","t","_b","_l","templates","template","key","_e","getLoggerBuilder","setApp","detectUser","build","Vue","n","TemplatePickerRoot","createElement","body","appendChild","loadState","templatesPath","debug","TemplatePicker","TemplatePickerView","propsData","$mount","window","addEventListener","initTemplatesPlugin","attach","menu","addMenuEntry","displayName","templateName","iconClass","fileType","actionHandler","initTemplatesFolder","removeMenuEntry","OC","Plugins","register","index","newTemplatePlugin","app","label","open","response","copySystemTemplates","changeDirectory","template_path","error","FilesPlugin","subscribe","query","setFilter","getFileActions","_nc_fileactions","action","constructor","validateAction","_action","iconSvgInline","enabled","exec","execBatch","order","inline","renderInline","Error","nodes","view","TrashCan","length","map","node","permissions","every","permission","Permission","source","emit","Promise","all","find","search","push","registerLegacyView","icon","parent","classes","expanded","params","OCP","Navigation","legacy","sticky","includes","isValidNavigation","isUniqueNavigation","_views","e","message","views","setActive","_currentView","active","getContents","isSvg","columns","isValidColumn","emptyView","defaultSortKey","column","title","render","sort","summary","viewConfig","useViewConfigStore","store","defineStore","state","getters","getConfig","actions","onUpdate","generateUrl","setSortingBy","update","toggleSortingDirection","newDirection","sorting_direction","viewConfigStore","_initialized","ChartPie","NcAppNavigationItem","NcProgressBar","loadingStorageStats","storageStats","storageStatsTitle","usedQuotaByte","used","quota","storageStatsTooltip","beforeMount","setInterval","debounceUpdateStorageStats","throttleUpdateStorageStats","slot","relative","Math","min","el","mounted","userConfig","show_hidden","crop_image_previews","useUserConfigStore","userConfigStore","Clipboard","NcAppSettingsDialog","NcAppSettingsSection","NcCheckboxRadioSwitch","NcInputField","Setting","setup","settings","webdavUrl","webdavDocs","appPasswordUrl","webdavUrlCopied","beforeDestroy","onClose","setConfig","showSuccess","setTimeout","setting","target","select","copyCloudId","scopedSlots","_u","fn","proxy","Cog","NavigationQuota","NcAppNavigation","NcIconSvgWrapper","SettingsModal","settingsOpened","currentViewId","currentView","parentViews","filter","childViews","reduce","list","watch","showView","newAppContent","itemId","heading","headingEl","textContent","setPageHeading","onLegacyNavigationChanged","onToggleExpand","isExpanded","generateToNavigation","openSettings","onSettingsClose","child","useFilesStore","fileStore","files","roots","getNode","getNodes","ids","Boolean","getRoot","service","updateNodes","acc","attributes","deleteNodes","setRoot","root","onDeletedNode","usePathsStore","pathsStore","getPath","addPath","payload","useSelectionStore","selected","lastSelection","lastSelectedIndex","set","selection","setLastIndex","reset","Home","NcBreadcrumbs","NcBreadcrumb","filesStore","dirs","sections","exact","to","getNodeFromId","getFileIdFromPath","getDirDisplayName","onClick","ariaLabel","_setupProxy","nativeOn","useActionsMenuStore","element","svg","CustomElementRender","CustomSvgIconRender","FileIcon","FolderIcon","Fragment","NcActionButton","NcActions","NcLoadingIcon","isSizeAvailable","filesListWidth","keyboardStore","altKey","ctrlKey","metaKey","shiftKey","onEvent","event","actionsMenuStore","selectionStore","backgroundFailed","backgroundImage","size","sizeOpacity","linkTo","is","href","selectedFiles","isSelected","cropPreviews","url","mimeIconUrl","enabledActions","enabledInlineActions","enabledMenuActions","uniqueId","openedMenu","get","caches","then","cache","match","fetchAndApplyPreview","img","resolve","reject","onCancel","resetState","clearImg","hashCode","hash","onSelectionChange","slice","start","end","filesToSelect","isAlreadySelected","onRightClick","formatFileSize","ref","_loading","onActionClick","opacity","currentFolder","totalSize","classForColumn","created","fileListEl","querySelector","$resizeObserver","ResizeObserver","entries","contentRect","width","observe","disconnect","mixins","filesListWidthMixin","selectedNodes","areSomeNodesLoading","inlineActions","mapState","$navigation","sortingMode","sorting_mode","isAscSorting","toggleSortBy","MenuDown","MenuUp","NcButton","filesSortingMixin","mode","sortAriaLabel","direction","FilesListHeaderButton","FilesListHeaderActions","selectAllBind","indeterminate","isAllSelected","isNoneSelected","isSomeSelected","onToggleAll","RecycleScroller","FileEntry","FilesListHeader","FilesListFooter","summaryFile","count","summaryFolder","slots","getFileId","item","caption","BreadCrumbs","FilesListVirtual","NcAppContent","promise","dirContents","v","isEmptyDir","isRefreshing","toPreviousDir","newView","oldView","newDir","oldDir","folder","contents","folders","directives","rawName","expression","fetchContent","Router","base","linkActiveClass","routes","alias","stringifyQuery","result","stringify","PiniaVuePlugin","pinia","createPinia","NavigationService","Object","assign","Settings","_settings","_name","_el","_open","_close","NavigationView","router","FilesListView","legacyViews","values","sublist","subview","processLegacyFilesViews","navigator","noRewrite","registration","serviceWorker","scope","___CSS_LOADER_EXPORT___","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","O","chunkIds","priority","notFulfilled","Infinity","i","fulfilled","j","keys","splice","r","getter","__esModule","d","a","definition","o","defineProperty","enumerable","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","baseURI","self","location","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"files-main.js?v=57ff0f356ac390eab2f8","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/files/src/utils/davUtils.js","webpack:///nextcloud/apps/files/src/utils/fileUtils.js","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?8258","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?81db","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?c414","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/files/src/services/Templates.js","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?6cbe","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?afd8","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?1f7b","webpack:///nextcloud/apps/files/src/templates.js","webpack:///nextcloud/apps/files/src/legacy/filelistSearch.js","webpack:///nextcloud/apps/files/src/logger.js","webpack:///nextcloud/apps/files/src/services/FileAction.ts","webpack:///nextcloud/apps/files/src/actions/deleteAction.ts","webpack:///nextcloud/apps/files/src/legacy/navigationMapper.js","webpack:///nextcloud/apps/files/src/services/Navigation.ts","webpack://nextcloud/./apps/files/src/views/Navigation.vue?8122","webpack:///nextcloud/core/src/OCP/accessibility.js","webpack:///nextcloud/apps/files/src/store/viewConfig.ts","webpack://nextcloud/./apps/files/src/components/NavigationQuota.vue?08cb","webpack:///nextcloud/apps/files/src/components/NavigationQuota.vue","webpack:///nextcloud/apps/files/src/components/NavigationQuota.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/NavigationQuota.vue?ff39","webpack://nextcloud/./apps/files/src/components/NavigationQuota.vue?2966","webpack://nextcloud/./apps/files/src/views/Settings.vue?84f7","webpack:///nextcloud/apps/files/src/components/Setting.vue","webpack:///nextcloud/apps/files/src/components/Setting.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/Setting.vue?98ea","webpack://nextcloud/./apps/files/src/components/Setting.vue?8d57","webpack:///nextcloud/apps/files/src/store/userconfig.ts","webpack:///nextcloud/apps/files/src/views/Settings.vue","webpack:///nextcloud/apps/files/src/views/Settings.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/views/Settings.vue?7e31","webpack://nextcloud/./apps/files/src/views/Settings.vue?b81b","webpack:///nextcloud/apps/files/src/views/Navigation.vue","webpack:///nextcloud/apps/files/src/views/Navigation.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/views/Navigation.vue?2794","webpack://nextcloud/./apps/files/src/views/Navigation.vue?74b9","webpack:///nextcloud/apps/files/src/views/FilesList.vue","webpack:///nextcloud/apps/files/src/store/files.ts","webpack:///nextcloud/apps/files/src/store/paths.ts","webpack:///nextcloud/apps/files/src/store/selection.ts","webpack://nextcloud/./apps/files/src/components/BreadCrumbs.vue?e906","webpack:///nextcloud/apps/files/src/components/BreadCrumbs.vue","webpack:///nextcloud/apps/files/src/components/BreadCrumbs.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/BreadCrumbs.vue?e59f","webpack://nextcloud/./apps/files/src/components/BreadCrumbs.vue?d357","webpack:///nextcloud/apps/files/src/components/FilesListVirtual.vue","webpack:///nextcloud/apps/files/src/services/PreviewService.ts","webpack:///nextcloud/apps/files/src/store/actionsmenu.ts","webpack:///nextcloud/apps/files/src/components/CustomElementRender.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/files/src/components/CustomElementRender.vue","webpack://nextcloud/./apps/files/src/components/CustomElementRender.vue?5f5c","webpack://nextcloud/./apps/files/src/components/CustomElementRender.vue?4ee7","webpack://nextcloud/./apps/files/src/components/CustomSvgIconRender.vue?2c34","webpack:///nextcloud/apps/files/src/components/CustomSvgIconRender.vue","webpack:///nextcloud/apps/files/src/components/CustomSvgIconRender.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/CustomSvgIconRender.vue?6bea","webpack://nextcloud/./apps/files/src/components/CustomSvgIconRender.vue?5641","webpack:///nextcloud/apps/files/src/components/FileEntry.vue","webpack:///nextcloud/apps/files/src/store/keyboard.ts","webpack:///nextcloud/apps/files/src/components/FileEntry.vue?vue&type=script&lang=ts&","webpack://nextcloud/./apps/files/src/components/FileEntry.vue?8a78","webpack://nextcloud/./apps/files/src/components/FileEntry.vue?5d50","webpack://nextcloud/./apps/files/src/components/FileEntry.vue?da7c","webpack:///nextcloud/apps/files/src/components/FilesListFooter.vue?vue&type=script&lang=ts&","webpack:///nextcloud/apps/files/src/components/FilesListFooter.vue","webpack://nextcloud/./apps/files/src/components/FilesListFooter.vue?14b9","webpack://nextcloud/./apps/files/src/components/FilesListFooter.vue?80db","webpack:///nextcloud/apps/files/src/mixins/filesListWidth.ts","webpack:///nextcloud/apps/files/src/components/FilesListHeaderActions.vue","webpack:///nextcloud/apps/files/src/components/FilesListHeaderActions.vue?vue&type=script&lang=ts&","webpack://nextcloud/./apps/files/src/components/FilesListHeaderActions.vue?c5d9","webpack://nextcloud/./apps/files/src/components/FilesListHeaderActions.vue?9823","webpack:///nextcloud/apps/files/src/components/FilesListHeaderButton.vue","webpack:///nextcloud/apps/files/src/mixins/filesSorting.ts","webpack:///nextcloud/apps/files/src/components/FilesListHeaderButton.vue?vue&type=script&lang=ts&","webpack://nextcloud/./apps/files/src/components/FilesListHeaderButton.vue?d900","webpack://nextcloud/./apps/files/src/components/FilesListHeaderButton.vue?5686","webpack:///nextcloud/apps/files/src/components/FilesListHeader.vue?vue&type=script&lang=ts&","webpack:///nextcloud/apps/files/src/components/FilesListHeader.vue","webpack://nextcloud/./apps/files/src/components/FilesListHeader.vue?7248","webpack://nextcloud/./apps/files/src/components/FilesListHeader.vue?349b","webpack:///nextcloud/apps/files/src/components/FilesListVirtual.vue?vue&type=script&lang=ts&","webpack://nextcloud/./apps/files/src/components/FilesListVirtual.vue?d01d","webpack://nextcloud/./apps/files/src/components/FilesListVirtual.vue?3555","webpack:///nextcloud/apps/files/src/views/FilesList.vue?vue&type=script&lang=ts&","webpack://nextcloud/./apps/files/src/views/FilesList.vue?e4c4","webpack://nextcloud/./apps/files/src/views/FilesList.vue?1e5b","webpack:///nextcloud/apps/files/src/router/router.js","webpack:///nextcloud/apps/files/src/main.js","webpack:///nextcloud/apps/files/src/services/Settings.js","webpack:///nextcloud/apps/files/src/models/Setting.js","webpack:///nextcloud/apps/files/src/services/ServiceWorker.js","webpack:///nextcloud/apps/files/src/components/BreadCrumbs.vue?vue&type=style&index=0&id=68b3b20b&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/components/CustomSvgIconRender.vue?vue&type=style&index=0&id=93e9b2f4&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/components/FileEntry.vue?vue&type=style&index=0&id=47057834&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/components/FilesListFooter.vue?vue&type=style&index=0&id=e6a083be&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/components/FilesListHeader.vue?vue&type=style&index=0&id=53698ce8&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/components/FilesListHeaderActions.vue?vue&type=style&index=0&id=9d92da06&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/components/FilesListHeaderButton.vue?vue&type=style&index=0&id=e85a09d2&prod&lang=scss&","webpack:///nextcloud/apps/files/src/components/FilesListVirtual.vue?vue&type=style&index=0&id=07b86e54&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/components/NavigationQuota.vue?vue&type=style&index=0&id=918797b2&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue?vue&type=style&index=0&id=6c072a31&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/views/FilesList.vue?vue&type=style&index=0&id=77548daf&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/views/Navigation.vue?vue&type=style&index=0&id=508e08a4&prod&scoped=true&lang=scss&","webpack:///nextcloud/apps/files/src/views/Settings.vue?vue&type=style&index=0&id=76ca5d1f&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue?vue&type=style&index=0&id=715b4161&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/components/FileEntry.vue?vue&type=style&index=1&id=47057834&prod&lang=css&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { generateRemoteUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\n\nexport const getRootPath = function() {\n\tif (getCurrentUser()) {\n\t\treturn generateRemoteUrl(`dav/files/${getCurrentUser().uid}`)\n\t} else {\n\t\treturn generateRemoteUrl('webdav').replace('/remote.php', '/public.php')\n\t}\n}\n\nexport const isPublic = function() {\n\treturn !getCurrentUser()\n}\n\nexport const getToken = function() {\n\treturn document.getElementById('sharingToken') && document.getElementById('sharingToken').value\n}\n\n/**\n * Return the current directory, fallback to root\n *\n * @return {string}\n */\nexport const getCurrentDirectory = function() {\n\tconst currentDirInfo = OCA?.Files?.App?.currentFileList?.dirInfo\n\t\t|| { path: '/', name: '' }\n\n\t// Make sure we don't have double slashes\n\treturn `${currentDirInfo.path}/${currentDirInfo.name}`.replace(/\\/\\//gi, '/')\n}\n","/**\n * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nconst encodeFilePath = function(path) {\n\tconst pathSections = (path.startsWith('/') ? path : `/${path}`).split('/')\n\tlet relativePath = ''\n\tpathSections.forEach((section) => {\n\t\tif (section !== '') {\n\t\t\trelativePath += '/' + encodeURIComponent(section)\n\t\t}\n\t})\n\treturn relativePath\n}\n\n/**\n * Extract dir and name from file path\n *\n * @param {string} path the full path\n * @return {string[]} [dirPath, fileName]\n */\nconst extractFilePaths = function(path) {\n\tconst pathSections = path.split('/')\n\tconst fileName = pathSections[pathSections.length - 1]\n\tconst dirPath = pathSections.slice(0, pathSections.length - 1).join('/')\n\treturn [dirPath, fileName]\n}\n\nexport { encodeFilePath, extractFilePaths }\n","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<li class=\"template-picker__item\">\n\t\t<input :id=\"id\"\n\t\t\t:checked=\"checked\"\n\t\t\ttype=\"radio\"\n\t\t\tclass=\"radio\"\n\t\t\tname=\"template-picker\"\n\t\t\t@change=\"onCheck\">\n\n\t\t<label :for=\"id\" class=\"template-picker__label\">\n\t\t\t<div class=\"template-picker__preview\"\n\t\t\t\t:class=\"failedPreview ? 'template-picker__preview--failed' : ''\">\n\t\t\t\t<img class=\"template-picker__image\"\n\t\t\t\t\t:src=\"realPreviewUrl\"\n\t\t\t\t\talt=\"\"\n\t\t\t\t\tdraggable=\"false\"\n\t\t\t\t\t@error=\"onFailure\">\n\t\t\t</div>\n\n\t\t\t<span class=\"template-picker__title\">\n\t\t\t\t{{ nameWithoutExt }}\n\t\t\t</span>\n\t\t</label>\n\t</li>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\nimport { encodeFilePath } from '../utils/fileUtils.js'\nimport { getToken, isPublic } from '../utils/davUtils.js'\n\n// preview width generation\nconst previewWidth = 256\n\nexport default {\n\tname: 'TemplatePreview',\n\tinheritAttrs: false,\n\n\tprops: {\n\t\tbasename: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tchecked: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tfileid: {\n\t\t\ttype: [String, Number],\n\t\t\trequired: true,\n\t\t},\n\t\tfilename: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tpreviewUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\thasPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tmime: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tratio: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tfailedPreview: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Strip away extension from name\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tnameWithoutExt() {\n\t\t\treturn this.basename.indexOf('.') > -1 ? this.basename.split('.').slice(0, -1).join('.') : this.basename\n\t\t},\n\n\t\tid() {\n\t\t\treturn `template-picker-${this.fileid}`\n\t\t},\n\n\t\trealPreviewUrl() {\n\t\t\t// If original preview failed, fallback to mime icon\n\t\t\tif (this.failedPreview && this.mimeIcon) {\n\t\t\t\treturn this.mimeIcon\n\t\t\t}\n\n\t\t\tif (this.previewUrl) {\n\t\t\t\treturn this.previewUrl\n\t\t\t}\n\t\t\t// TODO: find a nicer standard way of doing this?\n\t\t\tif (isPublic()) {\n\t\t\t\treturn generateUrl(`/apps/files_sharing/publicpreview/${getToken()}?fileId=${this.fileid}&file=${encodeFilePath(this.filename)}&x=${previewWidth}&y=${previewWidth}&a=1`)\n\t\t\t}\n\t\t\treturn generateUrl(`/core/preview?fileId=${this.fileid}&x=${previewWidth}&y=${previewWidth}&a=1`)\n\t\t},\n\n\t\tmimeIcon() {\n\t\t\treturn OC.MimeType.getIconUrl(this.mime)\n\t\t},\n\t},\n\n\tmethods: {\n\t\tonCheck() {\n\t\t\tthis.$emit('check', this.fileid)\n\t\t},\n\t\tonFailure() {\n\t\t\tthis.failedPreview = true\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\n.template-picker {\n\t&__item {\n\t\tdisplay: flex;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\t// Align in the middle of the grid\n\t\talign-items: center;\n\t\tflex: 1 1;\n\t\tflex-direction: column;\n\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&::before {\n\t\t\tdisplay: none !important;\n\t\t}\n\t}\n\n\t&__preview {\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\t// Stretch so all entries are the same width\n\t\tflex: 1 1;\n\t\twidth: var(--width);\n\t\tmin-height: var(--height);\n\t\tmax-height: var(--height);\n\t\tpadding: 0;\n\t\tborder: var(--border) solid var(--color-border);\n\t\tborder-radius: var(--border-radius-large);\n\n\t\tinput:checked + label > & {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\n\t\t&--failed {\n\t\t\t// Make sure to properly center fallback icon\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n\n\t&__image {\n\t\tmax-width: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tobject-fit: cover;\n\t}\n\n\t// Failed preview, fallback to mime icon\n\t&__preview--failed &__image {\n\t\twidth: calc(var(--margin) * 8);\n\t\t// Center mime icon\n\t\tmargin: auto;\n\t\tbackground-color: transparent !important;\n\n\t\tobject-fit: initial;\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\t// also count preview border\n\t\tmax-width: calc(var(--width) + 2*2px);\n\t\tpadding: var(--margin);\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePreview.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePreview.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePreview.vue?vue&type=style&index=0&id=6c072a31&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePreview.vue?vue&type=style&index=0&id=6c072a31&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./TemplatePreview.vue?vue&type=template&id=6c072a31&scoped=true&\"\nimport script from \"./TemplatePreview.vue?vue&type=script&lang=js&\"\nexport * from \"./TemplatePreview.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemplatePreview.vue?vue&type=style&index=0&id=6c072a31&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6c072a31\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('li',{staticClass:\"template-picker__item\"},[_c('input',{staticClass:\"radio\",attrs:{\"id\":_vm.id,\"type\":\"radio\",\"name\":\"template-picker\"},domProps:{\"checked\":_vm.checked},on:{\"change\":_vm.onCheck}}),_vm._v(\" \"),_c('label',{staticClass:\"template-picker__label\",attrs:{\"for\":_vm.id}},[_c('div',{staticClass:\"template-picker__preview\",class:_vm.failedPreview ? 'template-picker__preview--failed' : ''},[_c('img',{staticClass:\"template-picker__image\",attrs:{\"src\":_vm.realPreviewUrl,\"alt\":\"\",\"draggable\":\"false\"},on:{\"error\":_vm.onFailure}})]),_vm._v(\" \"),_c('span',{staticClass:\"template-picker__title\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.nameWithoutExt)+\"\\n\\t\\t\")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<NcModal v-if=\"opened\"\n\t\t:clear-view-delay=\"-1\"\n\t\tclass=\"templates-picker\"\n\t\tsize=\"normal\"\n\t\t@close=\"close\">\n\t\t<form class=\"templates-picker__form\"\n\t\t\t:style=\"style\"\n\t\t\t@submit.prevent.stop=\"onSubmit\">\n\t\t\t<h2>{{ t('files', 'Pick a template for {name}', { name: nameWithoutExt }) }}</h2>\n\n\t\t\t<!-- Templates list -->\n\t\t\t<ul class=\"templates-picker__list\">\n\t\t\t\t<TemplatePreview v-bind=\"emptyTemplate\"\n\t\t\t\t\t:checked=\"checked === emptyTemplate.fileid\"\n\t\t\t\t\t@check=\"onCheck\" />\n\n\t\t\t\t<TemplatePreview v-for=\"template in provider.templates\"\n\t\t\t\t\t:key=\"template.fileid\"\n\t\t\t\t\tv-bind=\"template\"\n\t\t\t\t\t:checked=\"checked === template.fileid\"\n\t\t\t\t\t:ratio=\"provider.ratio\"\n\t\t\t\t\t@check=\"onCheck\" />\n\t\t\t</ul>\n\n\t\t\t<!-- Cancel and submit -->\n\t\t\t<div class=\"templates-picker__buttons\">\n\t\t\t\t<button @click=\"close\">\n\t\t\t\t\t{{ t('files', 'Cancel') }}\n\t\t\t\t</button>\n\t\t\t\t<input type=\"submit\"\n\t\t\t\t\tclass=\"primary\"\n\t\t\t\t\t:value=\"t('files', 'Create')\"\n\t\t\t\t\t:aria-label=\"t('files', 'Create a new file with the selected template')\">\n\t\t\t</div>\n\t\t</form>\n\n\t\t<NcEmptyContent v-if=\"loading\" class=\"templates-picker__loading\" icon=\"icon-loading\">\n\t\t\t{{ t('files', 'Creating file') }}\n\t\t</NcEmptyContent>\n\t</NcModal>\n</template>\n\n<script>\nimport { normalize } from 'path'\nimport { showError } from '@nextcloud/dialogs'\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\nimport NcModal from '@nextcloud/vue/dist/Components/NcModal.js'\n\nimport { getCurrentDirectory } from '../utils/davUtils.js'\nimport { createFromTemplate, getTemplates } from '../services/Templates.js'\nimport TemplatePreview from '../components/TemplatePreview.vue'\n\nconst border = 2\nconst margin = 8\nconst width = margin * 20\n\nexport default {\n\tname: 'TemplatePicker',\n\n\tcomponents: {\n\t\tNcEmptyContent,\n\t\tNcModal,\n\t\tTemplatePreview,\n\t},\n\n\tprops: {\n\t\tlogger: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\t// Check empty template by default\n\t\t\tchecked: -1,\n\t\t\tloading: false,\n\t\t\tname: null,\n\t\t\topened: false,\n\t\t\tprovider: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Strip away extension from name\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tnameWithoutExt() {\n\t\t\treturn this.name.indexOf('.') > -1\n\t\t\t\t? this.name.split('.').slice(0, -1).join('.')\n\t\t\t\t: this.name\n\t\t},\n\n\t\temptyTemplate() {\n\t\t\treturn {\n\t\t\t\tbasename: t('files', 'Blank'),\n\t\t\t\tfileid: -1,\n\t\t\t\tfilename: this.t('files', 'Blank'),\n\t\t\t\thasPreview: false,\n\t\t\t\tmime: this.provider?.mimetypes[0] || this.provider?.mimetypes,\n\t\t\t}\n\t\t},\n\n\t\tselectedTemplate() {\n\t\t\treturn this.provider.templates.find(template => template.fileid === this.checked)\n\t\t},\n\n\t\t/**\n\t\t * Style css vars bin,d\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tstyle() {\n\t\t\treturn {\n\t\t\t\t'--margin': margin + 'px',\n\t\t\t\t'--width': width + 'px',\n\t\t\t\t'--border': border + 'px',\n\t\t\t\t'--fullwidth': width + 2 * margin + 2 * border + 'px',\n\t\t\t\t'--height': this.provider.ratio ? Math.round(width / this.provider.ratio) + 'px' : null,\n\t\t\t}\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Open the picker\n\t\t *\n\t\t * @param {string} name the file name to create\n\t\t * @param {object} provider the template provider picked\n\t\t */\n\t\tasync open(name, provider) {\n\n\t\t\tthis.checked = this.emptyTemplate.fileid\n\t\t\tthis.name = name\n\t\t\tthis.provider = provider\n\n\t\t\tconst templates = await getTemplates()\n\t\t\tconst fetchedProvider = templates.find((fetchedProvider) => fetchedProvider.app === provider.app && fetchedProvider.label === provider.label)\n\t\t\tif (fetchedProvider === null) {\n\t\t\t\tthrow new Error('Failed to match provider in results')\n\t\t\t}\n\t\t\tthis.provider = fetchedProvider\n\n\t\t\t// If there is no templates available, just create an empty file\n\t\t\tif (fetchedProvider.templates.length === 0) {\n\t\t\t\tthis.onSubmit()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Else, open the picker\n\t\t\tthis.opened = true\n\t\t},\n\n\t\t/**\n\t\t * Close the picker and reset variables\n\t\t */\n\t\tclose() {\n\t\t\tthis.checked = this.emptyTemplate.fileid\n\t\t\tthis.loading = false\n\t\t\tthis.name = null\n\t\t\tthis.opened = false\n\t\t\tthis.provider = null\n\t\t},\n\n\t\t/**\n\t\t * Manages the radio template picker change\n\t\t *\n\t\t * @param {number} fileid the selected template file id\n\t\t */\n\t\tonCheck(fileid) {\n\t\t\tthis.checked = fileid\n\t\t},\n\n\t\tasync onSubmit() {\n\t\t\tthis.loading = true\n\t\t\tconst currentDirectory = getCurrentDirectory()\n\t\t\tconst fileList = OCA?.Files?.App?.currentFileList\n\n\t\t\t// If the file doesn't have an extension, add the default one\n\t\t\tif (this.nameWithoutExt === this.name) {\n\t\t\t\tthis.logger.debug('Fixed invalid filename', { name: this.name, extension: this.provider?.extension })\n\t\t\t\tthis.name = this.name + this.provider?.extension\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst fileInfo = await createFromTemplate(\n\t\t\t\t\tnormalize(`${currentDirectory}/${this.name}`),\n\t\t\t\t\tthis.selectedTemplate?.filename,\n\t\t\t\t\tthis.selectedTemplate?.templateType,\n\t\t\t\t)\n\t\t\t\tthis.logger.debug('Created new file', fileInfo)\n\n\t\t\t\t// Fetch FileInfo and model\n\t\t\t\tconst data = await fileList?.addAndFetchFileInfo(this.name).then((status, data) => data)\n\t\t\t\tconst model = new OCA.Files.FileInfoModel(data, {\n\t\t\t\t\tfilesClient: fileList?.filesClient,\n\t\t\t\t})\n\n\t\t\t\t// Run default action\n\t\t\t\tconst fileAction = OCA.Files.fileActions.getDefaultFileAction(fileInfo.mime, 'file', OC.PERMISSION_ALL)\n\t\t\t\tif (fileAction) {\n\t\t\t\t\tfileAction.action(fileInfo.basename, {\n\t\t\t\t\t\t$file: fileList?.findFileEl(this.name),\n\t\t\t\t\t\tdir: currentDirectory,\n\t\t\t\t\t\tfileList,\n\t\t\t\t\t\tfileActions: fileList?.fileActions,\n\t\t\t\t\t\tfileInfoModel: model,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tthis.close()\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error('Error while creating the new file from template')\n\t\t\t\tconsole.error(error)\n\t\t\t\tshowError(this.t('files', 'Unable to create new file from template'))\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.templates-picker {\n\t&__form {\n\t\tpadding: calc(var(--margin) * 2);\n\t\t// Will be handled by the buttons\n\t\tpadding-bottom: 0;\n\n\t\th2 {\n\t\t\ttext-align: center;\n\t\t\tfont-weight: bold;\n\t\t\tmargin: var(--margin) 0 calc(var(--margin) * 2);\n\t\t}\n\t}\n\n\t&__list {\n\t\tdisplay: grid;\n\t\tgrid-gap: calc(var(--margin) * 2);\n\t\tgrid-auto-columns: 1fr;\n\t\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\n\t\tmax-width: calc(var(--fullwidth) * 6);\n\t\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\n\t\t// Make sure all rows are the same height\n\t\tgrid-auto-rows: 1fr;\n\t\t// Center the columns set\n\t\tjustify-content: center;\n\t}\n\n\t&__buttons {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tpadding: calc(var(--margin) * 2) var(--margin);\n\t\tposition: sticky;\n\t\tbottom: 0;\n\t\tbackground-image: linear-gradient(0, var(--gradient-main-background));\n\n\t\tbutton, input[type='submit'] {\n\t\t\theight: 44px;\n\t\t}\n\t}\n\n\t// Make sure we're relative for the loading emptycontent on top\n\t::v-deep .modal-container {\n\t\tposition: relative;\n\t}\n\n\t&__loading {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin: 0;\n\t\tbackground-color: var(--color-main-background-translucent);\n\t}\n}\n\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePicker.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePicker.vue?vue&type=script&lang=js&\"","/**\n * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { generateOcsUrl } from '@nextcloud/router'\nimport axios from '@nextcloud/axios'\n\nexport const getTemplates = async function() {\n\tconst response = await axios.get(generateOcsUrl('apps/files/api/v1/templates'))\n\treturn response.data.ocs.data\n}\n\n/**\n * Create a new file from a specified template\n *\n * @param {string} filePath The new file destination path\n * @param {string} templatePath The template source path\n * @param {string} templateType The template type e.g 'user'\n */\nexport const createFromTemplate = async function(filePath, templatePath, templateType) {\n\tconst response = await axios.post(generateOcsUrl('apps/files/api/v1/templates/create'), {\n\t\tfilePath,\n\t\ttemplatePath,\n\t\ttemplateType,\n\t})\n\treturn response.data.ocs.data\n}\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePicker.vue?vue&type=style&index=0&id=715b4161&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePicker.vue?vue&type=style&index=0&id=715b4161&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./TemplatePicker.vue?vue&type=template&id=715b4161&scoped=true&\"\nimport script from \"./TemplatePicker.vue?vue&type=script&lang=js&\"\nexport * from \"./TemplatePicker.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemplatePicker.vue?vue&type=style&index=0&id=715b4161&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"715b4161\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.opened)?_c('NcModal',{staticClass:\"templates-picker\",attrs:{\"clear-view-delay\":-1,\"size\":\"normal\"},on:{\"close\":_vm.close}},[_c('form',{staticClass:\"templates-picker__form\",style:(_vm.style),on:{\"submit\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.onSubmit.apply(null, arguments)}}},[_c('h2',[_vm._v(_vm._s(_vm.t('files', 'Pick a template for {name}', { name: _vm.nameWithoutExt })))]),_vm._v(\" \"),_c('ul',{staticClass:\"templates-picker__list\"},[_c('TemplatePreview',_vm._b({attrs:{\"checked\":_vm.checked === _vm.emptyTemplate.fileid},on:{\"check\":_vm.onCheck}},'TemplatePreview',_vm.emptyTemplate,false)),_vm._v(\" \"),_vm._l((_vm.provider.templates),function(template){return _c('TemplatePreview',_vm._b({key:template.fileid,attrs:{\"checked\":_vm.checked === template.fileid,\"ratio\":_vm.provider.ratio},on:{\"check\":_vm.onCheck}},'TemplatePreview',template,false))})],2),_vm._v(\" \"),_c('div',{staticClass:\"templates-picker__buttons\"},[_c('button',{on:{\"click\":_vm.close}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('files', 'Cancel'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('input',{staticClass:\"primary\",attrs:{\"type\":\"submit\",\"aria-label\":_vm.t('files', 'Create a new file with the selected template')},domProps:{\"value\":_vm.t('files', 'Create')}})])]),_vm._v(\" \"),(_vm.loading)?_c('NcEmptyContent',{staticClass:\"templates-picker__loading\",attrs:{\"icon\":\"icon-loading\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('files', 'Creating file'))+\"\\n\\t\")]):_vm._e()],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\nimport { loadState } from '@nextcloud/initial-state'\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { getCurrentDirectory } from './utils/davUtils.js'\nimport axios from '@nextcloud/axios'\nimport Vue from 'vue'\n\nimport TemplatePickerView from './views/TemplatePicker.vue'\nimport { showError } from '@nextcloud/dialogs'\n\n// Set up logger\nconst logger = getLoggerBuilder()\n\t.setApp('files')\n\t.detectUser()\n\t.build()\n\n// Add translates functions\nVue.mixin({\n\tmethods: {\n\t\tt,\n\t\tn,\n\t},\n})\n\n// Create document root\nconst TemplatePickerRoot = document.createElement('div')\nTemplatePickerRoot.id = 'template-picker'\ndocument.body.appendChild(TemplatePickerRoot)\n\n// Retrieve and init templates\nlet templates = loadState('files', 'templates', [])\nlet templatesPath = loadState('files', 'templates_path', false)\nlogger.debug('Templates providers', templates)\nlogger.debug('Templates folder', { templatesPath })\n\n// Init vue app\nconst View = Vue.extend(TemplatePickerView)\nconst TemplatePicker = new View({\n\tname: 'TemplatePicker',\n\tpropsData: {\n\t\tlogger,\n\t},\n})\nTemplatePicker.$mount('#template-picker')\n\n// Init template engine after load to make sure it's the last injected entry\nwindow.addEventListener('DOMContentLoaded', function() {\n\tif (!templatesPath) {\n\t\tlogger.debug('Templates folder not initialized')\n\t\tconst initTemplatesPlugin = {\n\t\t\tattach(menu) {\n\t\t\t\t// register the new menu entry\n\t\t\t\tmenu.addMenuEntry({\n\t\t\t\t\tid: 'template-init',\n\t\t\t\t\tdisplayName: t('files', 'Set up templates folder'),\n\t\t\t\t\ttemplateName: t('files', 'Templates'),\n\t\t\t\t\ticonClass: 'icon-template-add',\n\t\t\t\t\tfileType: 'file',\n\t\t\t\t\tactionHandler(name) {\n\t\t\t\t\t\tinitTemplatesFolder(name)\n\t\t\t\t\t\tmenu.removeMenuEntry('template-init')\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t\tOC.Plugins.register('OCA.Files.NewFileMenu', initTemplatesPlugin)\n\t}\n})\n\n// Init template files menu\ntemplates.forEach((provider, index) => {\n\tconst newTemplatePlugin = {\n\t\tattach(menu) {\n\t\t\tconst fileList = menu.fileList\n\n\t\t\t// only attach to main file list, public view is not supported yet\n\t\t\tif (fileList.id !== 'files' && fileList.id !== 'files.public') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// register the new menu entry\n\t\t\tmenu.addMenuEntry({\n\t\t\t\tid: `template-new-${provider.app}-${index}`,\n\t\t\t\tdisplayName: provider.label,\n\t\t\t\ttemplateName: provider.label + provider.extension,\n\t\t\t\ticonClass: provider.iconClass || 'icon-file',\n\t\t\t\tfileType: 'file',\n\t\t\t\tactionHandler(name) {\n\t\t\t\t\tTemplatePicker.open(name, provider)\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\t}\n\tOC.Plugins.register('OCA.Files.NewFileMenu', newTemplatePlugin)\n})\n\n/**\n * Init the template directory\n *\n * @param {string} name the templates folder name\n */\nconst initTemplatesFolder = async function(name) {\n\tconst templatePath = (getCurrentDirectory() + `/${name}`).replace('//', '/')\n\ttry {\n\t\tlogger.debug('Initializing the templates directory', { templatePath })\n\t\tconst response = await axios.post(generateOcsUrl('apps/files/api/v1/templates/path'), {\n\t\t\ttemplatePath,\n\t\t\tcopySystemTemplates: true,\n\t\t})\n\n\t\t// Go to template directory\n\t\tOCA.Files.App.currentFileList.changeDirectory(templatePath, true, true)\n\n\t\ttemplates = response.data.ocs.data.templates\n\t\ttemplatesPath = response.data.ocs.data.template_path\n\t} catch (error) {\n\t\tlogger.error('Unable to initialize the templates directory')\n\t\tshowError(t('files', 'Unable to initialize the templates directory'))\n\t}\n}\n","/*\n * @copyright Copyright (c) 2021 Julius Härtl <jus@bitgrid.net>\n *\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { subscribe } from '@nextcloud/event-bus'\n\n(function() {\n\n\tconst FilesPlugin = {\n\t\tattach(fileList) {\n\t\t\tsubscribe('nextcloud:unified-search.search', ({ query }) => {\n\t\t\t\tfileList.setFilter(query)\n\t\t\t})\n\t\t\tsubscribe('nextcloud:unified-search.reset', () => {\n\t\t\t\tthis.query = null\n\t\t\t\tfileList.setFilter('')\n\t\t\t})\n\n\t\t},\n\t}\n\n\twindow.OC.Plugins.register('OCA.Files.FileList', FilesPlugin)\n\n})()\n","/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('files')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { Node } from '@nextcloud/files';\nimport logger from '../logger';\nexport class FileAction {\n _action;\n constructor(action) {\n this.validateAction(action);\n this._action = action;\n }\n get id() {\n return this._action.id;\n }\n get displayName() {\n return this._action.displayName;\n }\n get iconSvgInline() {\n return this._action.iconSvgInline;\n }\n get enabled() {\n return this._action.enabled;\n }\n get exec() {\n return this._action.exec;\n }\n get execBatch() {\n return this._action.execBatch;\n }\n get order() {\n return this._action.order;\n }\n get default() {\n return this._action.default;\n }\n get inline() {\n return this._action.inline;\n }\n get renderInline() {\n return this._action.renderInline;\n }\n validateAction(action) {\n if (!action.id || typeof action.id !== 'string') {\n throw new Error('Invalid id');\n }\n if (!action.displayName || typeof action.displayName !== 'function') {\n throw new Error('Invalid displayName function');\n }\n if (!action.iconSvgInline || typeof action.iconSvgInline !== 'function') {\n throw new Error('Invalid iconSvgInline function');\n }\n if (!action.exec || typeof action.exec !== 'function') {\n throw new Error('Invalid exec function');\n }\n // Optional properties --------------------------------------------\n if ('enabled' in action && typeof action.enabled !== 'function') {\n throw new Error('Invalid enabled function');\n }\n if ('execBatch' in action && typeof action.execBatch !== 'function') {\n throw new Error('Invalid execBatch function');\n }\n if ('order' in action && typeof action.order !== 'number') {\n throw new Error('Invalid order');\n }\n if ('default' in action && typeof action.default !== 'boolean') {\n throw new Error('Invalid default');\n }\n if ('inline' in action && typeof action.inline !== 'function') {\n throw new Error('Invalid inline function');\n }\n if ('renderInline' in action && typeof action.renderInline !== 'function') {\n throw new Error('Invalid renderInline function');\n }\n }\n}\nexport const registerFileAction = function (action) {\n if (typeof window._nc_fileactions === 'undefined') {\n window._nc_fileactions = [];\n logger.debug('FileActions initialized');\n }\n // Check duplicates\n if (window._nc_fileactions.find(search => search.id === action.id)) {\n logger.error(`FileAction ${action.id} already registered`, { action });\n return;\n }\n window._nc_fileactions.push(action);\n};\nexport const getFileActions = function () {\n return window._nc_fileactions || [];\n};\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { emit } from '@nextcloud/event-bus';\nimport { Permission, Node } from '@nextcloud/files';\nimport { translate as t } from '@nextcloud/l10n';\nimport axios from '@nextcloud/axios';\nimport TrashCan from '@mdi/svg/svg/trash-can.svg?raw';\nimport { registerFileAction, FileAction } from '../services/FileAction.ts';\nimport logger from '../logger.js';\nregisterFileAction(new FileAction({\n id: 'delete',\n displayName(nodes, view) {\n return view.id === 'trashbin'\n ? t('files_trashbin', 'Delete permanently')\n : t('files', 'Delete');\n },\n iconSvgInline: () => TrashCan,\n enabled(nodes) {\n return nodes.length > 0 && nodes\n .map(node => node.permissions)\n .every(permission => (permission & Permission.DELETE) !== 0);\n },\n async exec(node) {\n try {\n await axios.delete(node.source);\n // Let's delete even if it's moved to the trashbin\n // since it has been removed from the current view\n // and changing the view will trigger a reload anyway.\n emit('files:node:deleted', node);\n return true;\n }\n catch (error) {\n logger.error('Error while deleting a file', { error, source: node.source, node });\n return false;\n }\n },\n async execBatch(nodes, view) {\n return Promise.all(nodes.map(node => this.exec(node, view)));\n },\n order: 100,\n}));\n","/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { loadState } from '@nextcloud/initial-state'\nimport logger from '../logger.js'\n\n/**\n * Fetch and register the legacy files views\n */\nexport default function() {\n\tconst legacyViews = Object.values(loadState('files', 'navigation', {}))\n\n\tif (legacyViews.length > 0) {\n\t\tlogger.debug('Legacy files views detected. Processing...', legacyViews)\n\t\tlegacyViews.forEach(view => {\n\t\t\tregisterLegacyView(view)\n\t\t\tif (view.sublist) {\n\t\t\t\tview.sublist.forEach(subview => registerLegacyView({ ...subview, parent: view.id }))\n\t\t\t}\n\t\t})\n\t}\n}\n\nconst registerLegacyView = function({ id, name, order, icon, parent, classes = '', expanded, params }) {\n\tOCP.Files.Navigation.register({\n\t\tid,\n\t\tname,\n\t\torder,\n\t\tparams,\n\t\tparent,\n\t\texpanded: expanded === true,\n\t\ticonClass: icon ? `icon-${icon}` : 'nav-icon-' + id,\n\t\tlegacy: true,\n\t\tsticky: classes.includes('pinned'),\n\t})\n}\n","import isSvg from 'is-svg';\nimport logger from '../logger.js';\nexport default class {\n _views = [];\n _currentView = null;\n constructor() {\n logger.debug('Navigation service initialized');\n }\n register(view) {\n try {\n isValidNavigation(view);\n isUniqueNavigation(view, this._views);\n }\n catch (e) {\n if (e instanceof Error) {\n logger.error(e.message, { view });\n }\n throw e;\n }\n if (view.legacy) {\n logger.warn('Legacy view detected, please migrate to Vue');\n }\n if (view.iconClass) {\n view.legacy = true;\n }\n this._views.push(view);\n }\n get views() {\n return this._views;\n }\n setActive(view) {\n this._currentView = view;\n }\n get active() {\n return this._currentView;\n }\n}\n/**\n * Make sure the given view is unique\n * and not already registered.\n */\nconst isUniqueNavigation = function (view, views) {\n if (views.find(search => search.id === view.id)) {\n throw new Error(`Navigation id ${view.id} is already registered`);\n }\n return true;\n};\n/**\n * Typescript cannot validate an interface.\n * Please keep in sync with the Navigation interface requirements.\n */\nconst isValidNavigation = function (view) {\n if (!view.id || typeof view.id !== 'string') {\n throw new Error('Navigation id is required and must be a string');\n }\n if (!view.name || typeof view.name !== 'string') {\n throw new Error('Navigation name is required and must be a string');\n }\n /**\n * Legacy handle their content and icon differently\n * TODO: remove when support for legacy views is removed\n */\n if (!view.legacy) {\n if (!view.getContents || typeof view.getContents !== 'function') {\n throw new Error('Navigation getContents is required and must be a function');\n }\n if (!view.icon || typeof view.icon !== 'string' || !isSvg(view.icon)) {\n throw new Error('Navigation icon is required and must be a valid svg string');\n }\n }\n if (!('order' in view) || typeof view.order !== 'number') {\n throw new Error('Navigation order is required and must be a number');\n }\n // Optional properties\n if (view.columns) {\n view.columns.forEach(isValidColumn);\n }\n if (view.emptyView && typeof view.emptyView !== 'function') {\n throw new Error('Navigation emptyView must be a function');\n }\n if (view.parent && typeof view.parent !== 'string') {\n throw new Error('Navigation parent must be a string');\n }\n if ('sticky' in view && typeof view.sticky !== 'boolean') {\n throw new Error('Navigation sticky must be a boolean');\n }\n if ('expanded' in view && typeof view.expanded !== 'boolean') {\n throw new Error('Navigation expanded must be a boolean');\n }\n if (view.defaultSortKey && typeof view.defaultSortKey !== 'string') {\n throw new Error('Navigation defaultSortKey must be a string');\n }\n return true;\n};\n/**\n * Typescript cannot validate an interface.\n * Please keep in sync with the Column interface requirements.\n */\nconst isValidColumn = function (column) {\n if (!column.id || typeof column.id !== 'string') {\n throw new Error('A column id is required');\n }\n if (!column.title || typeof column.title !== 'string') {\n throw new Error('A column title is required');\n }\n if (!column.render || typeof column.render !== 'function') {\n throw new Error('A render function is required');\n }\n // Optional properties\n if (column.sort && typeof column.sort !== 'function') {\n throw new Error('Column sortFunction must be a function');\n }\n if (column.summary && typeof column.summary !== 'function') {\n throw new Error('Column summary must be a function');\n }\n return true;\n};\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('NcAppNavigation',{attrs:{\"data-cy-files-navigation\":\"\"},scopedSlots:_vm._u([{key:\"list\",fn:function(){return _vm._l((_vm.parentViews),function(view){return _c('NcAppNavigationItem',{key:view.id,attrs:{\"allow-collapse\":true,\"data-cy-files-navigation-item\":view.id,\"icon\":view.iconClass,\"open\":_vm.isExpanded(view),\"pinned\":view.sticky,\"title\":view.name,\"to\":_vm.generateToNavigation(view)},on:{\"update:open\":function($event){return _vm.onToggleExpand(view)}}},[(view.icon)?_c('NcIconSvgWrapper',{attrs:{\"slot\":\"icon\",\"svg\":view.icon},slot:\"icon\"}):_vm._e(),_vm._v(\" \"),_vm._l((_vm.childViews[view.id]),function(child){return _c('NcAppNavigationItem',{key:child.id,attrs:{\"data-cy-files-navigation-item\":child.id,\"exact\":true,\"icon\":child.iconClass,\"title\":child.name,\"to\":_vm.generateToNavigation(child)}},[(view.icon)?_c('NcIconSvgWrapper',{attrs:{\"slot\":\"icon\",\"svg\":view.icon},slot:\"icon\"}):_vm._e()],1)})],2)})},proxy:true},{key:\"footer\",fn:function(){return [_c('ul',{staticClass:\"app-navigation-entry__settings\"},[_c('NavigationQuota'),_vm._v(\" \"),_c('NcAppNavigationItem',{attrs:{\"aria-label\":_vm.t('files', 'Open the files app settings'),\"title\":_vm.t('files', 'Files settings'),\"data-cy-files-navigation-settings-button\":\"\"},on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.openSettings.apply(null, arguments)}}},[_c('Cog',{attrs:{\"slot\":\"icon\",\"size\":20},slot:\"icon\"})],1)],1)]},proxy:true}])},[_vm._v(\" \"),_vm._v(\" \"),_c('SettingsModal',{attrs:{\"open\":_vm.settingsOpened,\"data-cy-files-navigation-settings\":\"\"},on:{\"close\":_vm.onSettingsClose}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2022 Joas Schilling <coding@schilljs.com>\n *\n * @author Joas Schilling <coding@schilljs.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { loadState } from '@nextcloud/initial-state'\n\n/**\n * Set the page heading\n *\n * @param {string} heading page title from the history api\n * @since 27.0.0\n */\nexport function setPageHeading(heading) {\n\tconst headingEl = document.getElementById('page-heading-level-1')\n\tif (headingEl) {\n\t\theadingEl.textContent = heading\n\t}\n}\nexport default {\n\t/**\n\t * @return {boolean} Whether the user opted-out of shortcuts so that they should not be registered\n\t */\n\tdisableKeyboardShortcuts() {\n\t\treturn loadState('theming', 'shortcutsDisabled', false)\n\t},\n\tsetPageHeading,\n}\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { defineStore } from 'pinia';\nimport { emit, subscribe } from '@nextcloud/event-bus';\nimport { generateUrl } from '@nextcloud/router';\nimport { loadState } from '@nextcloud/initial-state';\nimport axios from '@nextcloud/axios';\nimport Vue from 'vue';\nconst viewConfig = loadState('files', 'viewConfigs', {});\nexport const useViewConfigStore = function () {\n const store = defineStore('viewconfig', {\n state: () => ({\n viewConfig,\n }),\n getters: {\n getConfig: (state) => (view) => state.viewConfig[view] || {},\n },\n actions: {\n /**\n * Update the view config local store\n */\n onUpdate(view, key, value) {\n if (!this.viewConfig[view]) {\n Vue.set(this.viewConfig, view, {});\n }\n Vue.set(this.viewConfig[view], key, value);\n },\n /**\n * Update the view config local store AND on server side\n */\n async update(view, key, value) {\n axios.put(generateUrl(`/apps/files/api/v1/views/${view}/${key}`), {\n value,\n });\n emit('files:viewconfig:updated', { view, key, value });\n },\n /**\n * Set the sorting key AND sort by ASC\n * The key param must be a valid key of a File object\n * If not found, will be searched within the File attributes\n */\n setSortingBy(key = 'basename', view = 'files') {\n // Save new config\n this.update(view, 'sorting_mode', key);\n this.update(view, 'sorting_direction', 'asc');\n },\n /**\n * Toggle the sorting direction\n */\n toggleSortingDirection(view = 'files') {\n const config = this.getConfig(view) || { 'sorting_direction': 'asc' };\n const newDirection = config.sorting_direction === 'asc' ? 'desc' : 'asc';\n // Save new config\n this.update(view, 'sorting_direction', newDirection);\n }\n }\n });\n const viewConfigStore = store(...arguments);\n // Make sure we only register the listeners once\n if (!viewConfigStore._initialized) {\n subscribe('files:viewconfig:updated', function ({ view, key, value }) {\n viewConfigStore.onUpdate(view, key, value);\n });\n viewConfigStore._initialized = true;\n }\n return viewConfigStore;\n};\n","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.storageStats)?_c('NcAppNavigationItem',{staticClass:\"app-navigation-entry__settings-quota\",class:{ 'app-navigation-entry__settings-quota--not-unlimited': _vm.storageStats.quota >= 0},attrs:{\"aria-label\":_vm.t('files', 'Storage informations'),\"loading\":_vm.loadingStorageStats,\"name\":_vm.storageStatsTitle,\"title\":_vm.storageStatsTooltip,\"data-cy-files-navigation-settings-quota\":\"\"},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.debounceUpdateStorageStats.apply(null, arguments)}}},[_c('ChartPie',{attrs:{\"slot\":\"icon\",\"size\":20},slot:\"icon\"}),_vm._v(\" \"),(_vm.storageStats.quota >= 0)?_c('NcProgressBar',{attrs:{\"slot\":\"extra\",\"error\":_vm.storageStats.relative > 80,\"value\":Math.min(_vm.storageStats.relative, 100)},slot:\"extra\"}):_vm._e()],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<NcAppNavigationItem v-if=\"storageStats\"\n\t\t:aria-label=\"t('files', 'Storage informations')\"\n\t\t:class=\"{ 'app-navigation-entry__settings-quota--not-unlimited': storageStats.quota >= 0}\"\n\t\t:loading=\"loadingStorageStats\"\n\t\t:name=\"storageStatsTitle\"\n\t\t:title=\"storageStatsTooltip\"\n\t\tclass=\"app-navigation-entry__settings-quota\"\n\t\tdata-cy-files-navigation-settings-quota\n\t\t@click.stop.prevent=\"debounceUpdateStorageStats\">\n\t\t<ChartPie slot=\"icon\" :size=\"20\" />\n\n\t\t<!-- Progress bar -->\n\t\t<NcProgressBar v-if=\"storageStats.quota >= 0\"\n\t\t\tslot=\"extra\"\n\t\t\t:error=\"storageStats.relative > 80\"\n\t\t\t:value=\"Math.min(storageStats.relative, 100)\" />\n\t</NcAppNavigationItem>\n</template>\n\n<script>\nimport { formatFileSize } from '@nextcloud/files'\nimport { generateUrl } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport { showError } from '@nextcloud/dialogs'\nimport { debounce, throttle } from 'throttle-debounce'\nimport { translate } from '@nextcloud/l10n'\nimport axios from '@nextcloud/axios'\nimport ChartPie from 'vue-material-design-icons/ChartPie.vue'\nimport NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem.js'\nimport NcProgressBar from '@nextcloud/vue/dist/Components/NcProgressBar.js'\n\nimport logger from '../logger.js'\nimport { subscribe } from '@nextcloud/event-bus'\n\nexport default {\n\tname: 'NavigationQuota',\n\n\tcomponents: {\n\t\tChartPie,\n\t\tNcAppNavigationItem,\n\t\tNcProgressBar,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloadingStorageStats: false,\n\t\t\tstorageStats: loadState('files', 'storageStats', null),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tstorageStatsTitle() {\n\t\t\tconst usedQuotaByte = formatFileSize(this.storageStats?.used)\n\t\t\tconst quotaByte = formatFileSize(this.storageStats?.quota)\n\n\t\t\t// If no quota set\n\t\t\tif (this.storageStats?.quota < 0) {\n\t\t\t\treturn this.t('files', '{usedQuotaByte} used', { usedQuotaByte })\n\t\t\t}\n\n\t\t\treturn this.t('files', '{used} of {quota} used', {\n\t\t\t\tused: usedQuotaByte,\n\t\t\t\tquota: quotaByte,\n\t\t\t})\n\t\t},\n\t\tstorageStatsTooltip() {\n\t\t\tif (!this.storageStats.relative) {\n\t\t\t\treturn ''\n\t\t\t}\n\n\t\t\treturn this.t('files', '{relative}% used', this.storageStats)\n\t\t},\n\t},\n\n\tbeforeMount() {\n\t\t/**\n\t\t * Update storage stats every minute\n\t\t * TODO: remove when all views are migrated to Vue\n\t\t */\n\t\tsetInterval(this.throttleUpdateStorageStats, 60 * 1000)\n\n\t\tsubscribe('files:node:created', this.throttleUpdateStorageStats)\n\t\tsubscribe('files:node:deleted', this.throttleUpdateStorageStats)\n\t\tsubscribe('files:node:moved', this.throttleUpdateStorageStats)\n\t\tsubscribe('files:node:updated', this.throttleUpdateStorageStats)\n\t},\n\n\tmethods: {\n\t\t// From user input\n\t\tdebounceUpdateStorageStats: debounce(200, function(event) {\n\t\t\tthis.updateStorageStats(event)\n\t\t}),\n\t\t// From interval or event bus\n\t\tthrottleUpdateStorageStats: throttle(1000, function(event) {\n\t\t\tthis.updateStorageStats(event)\n\t\t}),\n\n\t\t/**\n\t\t * Update the storage stats\n\t\t * Throttled at max 1 refresh per minute\n\t\t *\n\t\t * @param {Event} [event = null] if user interaction\n\t\t */\n\t\tasync updateStorageStats(event = null) {\n\t\t\tif (this.loadingStorageStats) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.loadingStorageStats = true\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateUrl('/apps/files/api/v1/stats'))\n\t\t\t\tif (!response?.data?.data) {\n\t\t\t\t\tthrow new Error('Invalid storage stats')\n\t\t\t\t}\n\t\t\t\tthis.storageStats = response.data.data\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Could not refresh storage stats', { error })\n\t\t\t\t// Only show to the user if it was manually triggered\n\t\t\t\tif (event) {\n\t\t\t\t\tshowError(t('files', 'Could not refresh storage stats'))\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tthis.loadingStorageStats = false\n\t\t\t}\n\t\t},\n\n\t\tt: translate,\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n// User storage stats display\n.app-navigation-entry__settings-quota {\n\t// Align title with progress and icon\n\t&--not-unlimited::v-deep .app-navigation-entry__title {\n\t\tmargin-top: -4px;\n\t}\n\n\tprogress {\n\t\tposition: absolute;\n\t\tbottom: 10px;\n\t\tmargin-left: 44px;\n\t\twidth: calc(100% - 44px - 22px);\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationQuota.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationQuota.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationQuota.vue?vue&type=style&index=0&id=918797b2&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationQuota.vue?vue&type=style&index=0&id=918797b2&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./NavigationQuota.vue?vue&type=template&id=918797b2&scoped=true&\"\nimport script from \"./NavigationQuota.vue?vue&type=script&lang=js&\"\nexport * from \"./NavigationQuota.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NavigationQuota.vue?vue&type=style&index=0&id=918797b2&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"918797b2\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('NcAppSettingsDialog',{attrs:{\"open\":_vm.open,\"show-navigation\":true,\"title\":_vm.t('files', 'Files settings')},on:{\"update:open\":_vm.onClose}},[_c('NcAppSettingsSection',{attrs:{\"id\":\"settings\",\"title\":_vm.t('files', 'Files settings')}},[_c('NcCheckboxRadioSwitch',{attrs:{\"checked\":_vm.userConfig.show_hidden},on:{\"update:checked\":function($event){return _vm.setConfig('show_hidden', $event)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files', 'Show hidden files'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('NcCheckboxRadioSwitch',{attrs:{\"checked\":_vm.userConfig.crop_image_previews},on:{\"update:checked\":function($event){return _vm.setConfig('crop_image_previews', $event)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files', 'Crop image previews'))+\"\\n\\t\\t\")])],1),_vm._v(\" \"),(_vm.settings.length !== 0)?_c('NcAppSettingsSection',{attrs:{\"id\":\"more-settings\",\"title\":_vm.t('files', 'Additional settings')}},[_vm._l((_vm.settings),function(setting){return [_c('Setting',{key:setting.name,attrs:{\"el\":setting.el}})]})],2):_vm._e(),_vm._v(\" \"),_c('NcAppSettingsSection',{attrs:{\"id\":\"webdav\",\"title\":_vm.t('files', 'WebDAV')}},[_c('NcInputField',{attrs:{\"id\":\"webdav-url-input\",\"show-trailing-button\":true,\"success\":_vm.webdavUrlCopied,\"trailing-button-label\":_vm.t('files', 'Copy to clipboard'),\"value\":_vm.webdavUrl,\"readonly\":\"readonly\",\"type\":\"url\"},on:{\"focus\":function($event){return $event.target.select()},\"trailing-button-click\":_vm.copyCloudId},scopedSlots:_vm._u([{key:\"trailing-button-icon\",fn:function(){return [_c('Clipboard',{attrs:{\"size\":20}})]},proxy:true}])}),_vm._v(\" \"),_c('em',[_c('a',{staticClass:\"setting-link\",attrs:{\"href\":_vm.webdavDocs,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('files', 'Use this address to access your Files via WebDAV'))+\" ↗\\n\\t\\t\\t\")])]),_vm._v(\" \"),_c('br'),_vm._v(\" \"),_c('em',[_c('a',{staticClass:\"setting-link\",attrs:{\"href\":_vm.appPasswordUrl}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('files', 'If you have enabled 2FA, you must create and use a new app password by clicking here.'))+\" ↗\\n\\t\\t\\t\")])])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2020 Gary Kim <gary@garykim.dev>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div />\n</template>\n<script>\nexport default {\n\tname: 'Setting',\n\tprops: {\n\t\tel: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$el.appendChild(this.el())\n\t},\n}\n</script>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Setting.vue?vue&type=template&id=61d69eae&\"\nimport script from \"./Setting.vue?vue&type=script&lang=js&\"\nexport * from \"./Setting.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div')\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { loadState } from '@nextcloud/initial-state';\nimport { generateUrl } from '@nextcloud/router';\nimport { defineStore } from 'pinia';\nimport Vue from 'vue';\nimport axios from '@nextcloud/axios';\nimport { emit, subscribe } from '@nextcloud/event-bus';\nconst userConfig = loadState('files', 'config', {\n show_hidden: false,\n crop_image_previews: true,\n});\nexport const useUserConfigStore = function () {\n const store = defineStore('userconfig', {\n state: () => ({\n userConfig,\n }),\n actions: {\n /**\n * Update the user config local store\n */\n onUpdate(key, value) {\n Vue.set(this.userConfig, key, value);\n },\n /**\n * Update the user config local store AND on server side\n */\n async update(key, value) {\n await axios.put(generateUrl('/apps/files/api/v1/config/' + key), {\n value,\n });\n emit('files:config:updated', { key, value });\n }\n }\n });\n const userConfigStore = store(...arguments);\n // Make sure we only register the listeners once\n if (!userConfigStore._initialized) {\n subscribe('files:config:updated', function ({ key, value }) {\n userConfigStore.onUpdate(key, value);\n });\n userConfigStore._initialized = true;\n }\n return userConfigStore;\n};\n","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<NcAppSettingsDialog :open=\"open\"\n\t\t:show-navigation=\"true\"\n\t\t:title=\"t('files', 'Files settings')\"\n\t\t@update:open=\"onClose\">\n\t\t<!-- Settings API-->\n\t\t<NcAppSettingsSection id=\"settings\" :title=\"t('files', 'Files settings')\">\n\t\t\t<NcCheckboxRadioSwitch :checked=\"userConfig.show_hidden\"\n\t\t\t\t@update:checked=\"setConfig('show_hidden', $event)\">\n\t\t\t\t{{ t('files', 'Show hidden files') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t<NcCheckboxRadioSwitch :checked=\"userConfig.crop_image_previews\"\n\t\t\t\t@update:checked=\"setConfig('crop_image_previews', $event)\">\n\t\t\t\t{{ t('files', 'Crop image previews') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t</NcAppSettingsSection>\n\n\t\t<!-- Settings API-->\n\t\t<NcAppSettingsSection v-if=\"settings.length !== 0\"\n\t\t\tid=\"more-settings\"\n\t\t\t:title=\"t('files', 'Additional settings')\">\n\t\t\t<template v-for=\"setting in settings\">\n\t\t\t\t<Setting :key=\"setting.name\" :el=\"setting.el\" />\n\t\t\t</template>\n\t\t</NcAppSettingsSection>\n\n\t\t<!-- Webdav URL-->\n\t\t<NcAppSettingsSection id=\"webdav\" :title=\"t('files', 'WebDAV')\">\n\t\t\t<NcInputField id=\"webdav-url-input\"\n\t\t\t\t:show-trailing-button=\"true\"\n\t\t\t\t:success=\"webdavUrlCopied\"\n\t\t\t\t:trailing-button-label=\"t('files', 'Copy to clipboard')\"\n\t\t\t\t:value=\"webdavUrl\"\n\t\t\t\treadonly=\"readonly\"\n\t\t\t\ttype=\"url\"\n\t\t\t\t@focus=\"$event.target.select()\"\n\t\t\t\t@trailing-button-click=\"copyCloudId\">\n\t\t\t\t<template #trailing-button-icon>\n\t\t\t\t\t<Clipboard :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcInputField>\n\t\t\t<em>\n\t\t\t\t<a class=\"setting-link\"\n\t\t\t\t\t:href=\"webdavDocs\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noreferrer noopener\">\n\t\t\t\t\t{{ t('files', 'Use this address to access your Files via WebDAV') }} ↗\n\t\t\t\t</a>\n\t\t\t</em>\n\t\t\t<br>\n\t\t\t<em>\n\t\t\t\t<a class=\"setting-link\" :href=\"appPasswordUrl\">\n\t\t\t\t\t{{ t('files', 'If you have enabled 2FA, you must create and use a new app password by clicking here.') }} ↗\n\t\t\t\t</a>\n\t\t\t</em>\n\t\t</NcAppSettingsSection>\n\t</NcAppSettingsDialog>\n</template>\n\n<script>\nimport NcAppSettingsDialog from '@nextcloud/vue/dist/Components/NcAppSettingsDialog.js'\nimport NcAppSettingsSection from '@nextcloud/vue/dist/Components/NcAppSettingsSection.js'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport Clipboard from 'vue-material-design-icons/Clipboard.vue'\nimport NcInputField from '@nextcloud/vue/dist/Components/NcInputField.js'\nimport Setting from '../components/Setting.vue'\n\nimport { generateRemoteUrl, generateUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { translate } from '@nextcloud/l10n'\nimport { useUserConfigStore } from '../store/userconfig.ts'\n\nexport default {\n\tname: 'Settings',\n\tcomponents: {\n\t\tClipboard,\n\t\tNcAppSettingsDialog,\n\t\tNcAppSettingsSection,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcInputField,\n\t\tSetting,\n\t},\n\n\tprops: {\n\t\topen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst userConfigStore = useUserConfigStore()\n\t\treturn {\n\t\t\tuserConfigStore,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\t// Settings API\n\t\t\tsettings: window.OCA?.Files?.Settings?.settings || [],\n\n\t\t\t// Webdav infos\n\t\t\twebdavUrl: generateRemoteUrl('dav/files/' + encodeURIComponent(getCurrentUser()?.uid)),\n\t\t\twebdavDocs: 'https://docs.nextcloud.com/server/stable/go.php?to=user-webdav',\n\t\t\tappPasswordUrl: generateUrl('/settings/user/security#generate-app-token-section'),\n\t\t\twebdavUrlCopied: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tuserConfig() {\n\t\t\treturn this.userConfigStore.userConfig\n\t\t},\n\t},\n\n\tbeforeMount() {\n\t\t// Update the settings API entries state\n\t\tthis.settings.forEach(setting => setting.open())\n\t},\n\n\tbeforeDestroy() {\n\t\t// Update the settings API entries state\n\t\tthis.settings.forEach(setting => setting.close())\n\t},\n\n\tmethods: {\n\t\tonClose() {\n\t\t\tthis.$emit('close')\n\t\t},\n\n\t\tsetConfig(key, value) {\n\t\t\tthis.userConfigStore.update(key, value)\n\t\t},\n\n\t\tasync copyCloudId() {\n\t\t\tdocument.querySelector('input#webdav-url-input').select()\n\n\t\t\tif (!navigator.clipboard) {\n\t\t\t\t// Clipboard API not available\n\t\t\t\tshowError(t('files', 'Clipboard is not available'))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tawait navigator.clipboard.writeText(this.webdavUrl)\n\t\t\tthis.webdavUrlCopied = true\n\t\t\tshowSuccess(t('files', 'WebDAV URL copied to clipboard'))\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.webdavUrlCopied = false\n\t\t\t}, 5000)\n\t\t},\n\n\t\tt: translate,\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.setting-link:hover {\n\ttext-decoration: underline;\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=style&index=0&id=76ca5d1f&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=style&index=0&id=76ca5d1f&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Settings.vue?vue&type=template&id=76ca5d1f&scoped=true&\"\nimport script from \"./Settings.vue?vue&type=script&lang=js&\"\nexport * from \"./Settings.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Settings.vue?vue&type=style&index=0&id=76ca5d1f&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"76ca5d1f\",\n null\n \n)\n\nexport default component.exports","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<NcAppNavigation data-cy-files-navigation>\n\t\t<template #list>\n\t\t\t<NcAppNavigationItem v-for=\"view in parentViews\"\n\t\t\t\t:key=\"view.id\"\n\t\t\t\t:allow-collapse=\"true\"\n\t\t\t\t:data-cy-files-navigation-item=\"view.id\"\n\t\t\t\t:icon=\"view.iconClass\"\n\t\t\t\t:open=\"isExpanded(view)\"\n\t\t\t\t:pinned=\"view.sticky\"\n\t\t\t\t:title=\"view.name\"\n\t\t\t\t:to=\"generateToNavigation(view)\"\n\t\t\t\t@update:open=\"onToggleExpand(view)\">\n\t\t\t\t<!-- Sanitized icon as svg if provided -->\n\t\t\t\t<NcIconSvgWrapper v-if=\"view.icon\" slot=\"icon\" :svg=\"view.icon\" />\n\n\t\t\t\t<!-- Child views if any -->\n\t\t\t\t<NcAppNavigationItem v-for=\"child in childViews[view.id]\"\n\t\t\t\t\t:key=\"child.id\"\n\t\t\t\t\t:data-cy-files-navigation-item=\"child.id\"\n\t\t\t\t\t:exact=\"true\"\n\t\t\t\t\t:icon=\"child.iconClass\"\n\t\t\t\t\t:title=\"child.name\"\n\t\t\t\t\t:to=\"generateToNavigation(child)\">\n\t\t\t\t\t<!-- Sanitized icon as svg if provided -->\n\t\t\t\t\t<NcIconSvgWrapper v-if=\"view.icon\" slot=\"icon\" :svg=\"view.icon\" />\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t</NcAppNavigationItem>\n\t\t</template>\n\n\t\t<!-- Non-scrollable navigation bottom elements -->\n\t\t<template #footer>\n\t\t\t<ul class=\"app-navigation-entry__settings\">\n\t\t\t\t<!-- User storage usage statistics -->\n\t\t\t\t<NavigationQuota />\n\n\t\t\t\t<!-- Files settings modal toggle-->\n\t\t\t\t<NcAppNavigationItem :aria-label=\"t('files', 'Open the files app settings')\"\n\t\t\t\t\t:title=\"t('files', 'Files settings')\"\n\t\t\t\t\tdata-cy-files-navigation-settings-button\n\t\t\t\t\t@click.prevent.stop=\"openSettings\">\n\t\t\t\t\t<Cog slot=\"icon\" :size=\"20\" />\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t</ul>\n\t\t</template>\n\n\t\t<!-- Settings modal-->\n\t\t<SettingsModal :open=\"settingsOpened\"\n\t\t\tdata-cy-files-navigation-settings\n\t\t\t@close=\"onSettingsClose\" />\n\t</NcAppNavigation>\n</template>\n\n<script>\nimport { emit, subscribe } from '@nextcloud/event-bus'\nimport { translate } from '@nextcloud/l10n'\nimport Cog from 'vue-material-design-icons/Cog.vue'\nimport NcAppNavigation from '@nextcloud/vue/dist/Components/NcAppNavigation.js'\nimport NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem.js'\nimport NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'\n\nimport { setPageHeading } from '../../../../core/src/OCP/accessibility.js'\nimport { useViewConfigStore } from '../store/viewConfig.ts'\nimport logger from '../logger.js'\nimport Navigation from '../services/Navigation.ts'\nimport NavigationQuota from '../components/NavigationQuota.vue'\nimport SettingsModal from './Settings.vue'\n\nexport default {\n\tname: 'Navigation',\n\n\tcomponents: {\n\t\tCog,\n\t\tNavigationQuota,\n\t\tNcAppNavigation,\n\t\tNcAppNavigationItem,\n\t\tNcIconSvgWrapper,\n\t\tSettingsModal,\n\t},\n\n\tprops: {\n\t\t// eslint-disable-next-line vue/prop-name-casing\n\t\tNavigation: {\n\t\t\ttype: Navigation,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst viewConfigStore = useViewConfigStore()\n\t\treturn {\n\t\t\tviewConfigStore,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tsettingsOpened: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tcurrentViewId() {\n\t\t\treturn this.$route?.params?.view || 'files'\n\t\t},\n\n\t\t/** @return {Navigation} */\n\t\tcurrentView() {\n\t\t\treturn this.views.find(view => view.id === this.currentViewId)\n\t\t},\n\n\t\t/** @return {Navigation[]} */\n\t\tviews() {\n\t\t\treturn this.Navigation.views\n\t\t},\n\n\t\t/** @return {Navigation[]} */\n\t\tparentViews() {\n\t\t\treturn this.views\n\t\t\t\t// filter child views\n\t\t\t\t.filter(view => !view.parent)\n\t\t\t\t// sort views by order\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\treturn a.order - b.order\n\t\t\t\t})\n\t\t},\n\n\t\t/** @return {Navigation[]} */\n\t\tchildViews() {\n\t\t\treturn this.views\n\t\t\t\t// filter parent views\n\t\t\t\t.filter(view => !!view.parent)\n\t\t\t\t// create a map of parents and their children\n\t\t\t\t.reduce((list, view) => {\n\t\t\t\t\tlist[view.parent] = [...(list[view.parent] || []), view]\n\t\t\t\t\t// Sort children by order\n\t\t\t\t\tlist[view.parent].sort((a, b) => {\n\t\t\t\t\t\treturn a.order - b.order\n\t\t\t\t\t})\n\t\t\t\t\treturn list\n\t\t\t\t}, {})\n\t\t},\n\t},\n\n\twatch: {\n\t\tcurrentView(view, oldView) {\n\t\t\t// If undefined, it means we're initializing the view\n\t\t\t// This is handled by the legacy-view:initialized event\n\t\t\t// TODO: remove when legacy views are dropped\n\t\t\tif (view?.id === oldView?.id) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.Navigation.setActive(view)\n\t\t\tlogger.debug('Navigation changed', { id: view.id, view })\n\n\t\t\t// debugger\n\t\t\tthis.showView(view, oldView)\n\t\t},\n\t},\n\n\tbeforeMount() {\n\t\tif (this.currentView) {\n\t\t\tlogger.debug('Navigation mounted. Showing requested view', { view: this.currentView })\n\t\t\tthis.showView(this.currentView)\n\t\t}\n\n\t\tsubscribe('files:legacy-navigation:changed', this.onLegacyNavigationChanged)\n\n\t\t// TODO: remove this once the legacy navigation is gone\n\t\tsubscribe('files:legacy-view:initialized', () => {\n\t\t\tlogger.debug('Legacy view initialized', { ...this.currentView })\n\t\t\tthis.showView(this.currentView)\n\t\t})\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * @param {Navigation} view the new active view\n\t\t * @param {Navigation} oldView the old active view\n\t\t */\n\t\tshowView(view, oldView) {\n\t\t\t// Closing any opened sidebar\n\t\t\twindow?.OCA?.Files?.Sidebar?.close?.()\n\n\t\t\tif (view?.legacy) {\n\t\t\t\tconst newAppContent = document.querySelector('#app-content #app-content-' + this.currentView.id + '.viewcontainer')\n\t\t\t\tdocument.querySelectorAll('#app-content .viewcontainer').forEach(el => {\n\t\t\t\t\tel.classList.add('hidden')\n\t\t\t\t})\n\t\t\t\tnewAppContent.classList.remove('hidden')\n\n\t\t\t\t// Triggering legacy navigation events\n\t\t\t\tconst { dir = '/' } = OC.Util.History.parseUrlQuery()\n\t\t\t\tconst params = { itemId: view.id, dir }\n\n\t\t\t\tlogger.debug('Triggering legacy navigation event', params)\n\t\t\t\twindow.jQuery(newAppContent).trigger(new window.jQuery.Event('show', params))\n\t\t\t\twindow.jQuery(newAppContent).trigger(new window.jQuery.Event('urlChanged', params))\n\t\t\t}\n\n\t\t\tthis.Navigation.setActive(view)\n\t\t\tsetPageHeading(view.name)\n\t\t\temit('files:navigation:changed', view)\n\t\t},\n\n\t\t/**\n\t\t * Coming from the legacy files app.\n\t\t * TODO: remove when all views are migrated.\n\t\t *\n\t\t * @param {Navigation} view the new active view\n\t\t */\n\t\tonLegacyNavigationChanged({ id } = { id: 'files' }) {\n\t\t\tconst view = this.Navigation.views.find(view => view.id === id)\n\t\t\tif (view && view.legacy && view.id !== this.currentView.id) {\n\t\t\t\t// Force update the current route as the request comes\n\t\t\t\t// from the legacy files app router\n\t\t\t\tthis.$router.replace({ ...this.$route, params: { view: view.id } })\n\t\t\t\tthis.Navigation.setActive(view)\n\t\t\t\tthis.showView(view)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Expand/collapse a a view with children and permanently\n\t\t * save this setting in the server.\n\t\t *\n\t\t * @param {Navigation} view the view to toggle\n\t\t */\n\t\tonToggleExpand(view) {\n\t\t\t// Invert state\n\t\t\tconst isExpanded = this.isExpanded(view)\n\t\t\t// Update the view expanded state, might not be necessary\n\t\t\tview.expanded = !isExpanded\n\t\t\tthis.viewConfigStore.update(view.id, 'expanded', !isExpanded)\n\t\t},\n\n\t\t/**\n\t\t * Check if a view is expanded by user config\n\t\t * or fallback to the default value.\n\t\t *\n\t\t * @param {Navigation} view the view to check\n\t\t */\n\t\tisExpanded(view) {\n\t\t\treturn typeof this.viewConfigStore.getConfig(view.id)?.expanded === 'boolean'\n\t\t\t\t? this.viewConfigStore.getConfig(view.id).expanded === true\n\t\t\t\t: view.expanded === true\n\t\t},\n\n\t\t/**\n\t\t * Generate the route to a view\n\t\t *\n\t\t * @param {Navigation} view the view to toggle\n\t\t */\n\t\tgenerateToNavigation(view) {\n\t\t\tif (view.params) {\n\t\t\t\tconst { dir, fileid } = view.params\n\t\t\t\treturn { name: 'filelist', params: view.params, query: { dir, fileid } }\n\t\t\t}\n\t\t\treturn { name: 'filelist', params: { view: view.id } }\n\t\t},\n\n\t\t/**\n\t\t * Open the settings modal\n\t\t */\n\t\topenSettings() {\n\t\t\tthis.settingsOpened = true\n\t\t},\n\n\t\t/**\n\t\t * Close the settings modal\n\t\t */\n\t\tonSettingsClose() {\n\t\t\tthis.settingsOpened = false\n\t\t},\n\n\t\tt: translate,\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n// TODO: remove when https://github.com/nextcloud/nextcloud-vue/pull/3539 is in\n.app-navigation::v-deep .app-navigation-entry-icon {\n\tbackground-repeat: no-repeat;\n\tbackground-position: center;\n}\n\n.app-navigation > ul.app-navigation__list {\n\t// Use flex gap value for more elegant spacing\n\tpadding-bottom: var(--default-grid-baseline, 4px);\n}\n\n.app-navigation-entry__settings {\n\theight: auto !important;\n\toverflow: hidden !important;\n\tpadding-top: 0 !important;\n\t// Prevent shrinking or growing\n\tflex: 0 0 auto;\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=style&index=0&id=508e08a4&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=style&index=0&id=508e08a4&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Navigation.vue?vue&type=template&id=508e08a4&scoped=true&\"\nimport script from \"./Navigation.vue?vue&type=script&lang=js&\"\nexport * from \"./Navigation.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Navigation.vue?vue&type=style&index=0&id=508e08a4&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"508e08a4\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('NcAppContent',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.currentView?.legacy),expression:\"!currentView?.legacy\"}],class:{'app-content--hidden': _vm.currentView?.legacy},attrs:{\"data-cy-files-content\":\"\"}},[_c('div',{staticClass:\"files-list__header\"},[_c('BreadCrumbs',{attrs:{\"path\":_vm.dir},on:{\"reload\":_vm.fetchContent}}),_vm._v(\" \"),(_vm.isRefreshing)?_c('NcLoadingIcon',{staticClass:\"files-list__refresh-icon\"}):_vm._e()],1),_vm._v(\" \"),(_vm.loading && !_vm.isRefreshing)?_c('NcLoadingIcon',{staticClass:\"files-list__loading-icon\",attrs:{\"size\":38,\"title\":_vm.t('files', 'Loading current folder')}}):(!_vm.loading && _vm.isEmptyDir)?_c('NcEmptyContent',{attrs:{\"title\":_vm.t('files', 'No files in here'),\"description\":_vm.t('files', 'No files or folders have been deleted yet'),\"data-cy-files-content-empty\":\"\"},scopedSlots:_vm._u([{key:\"action\",fn:function(){return [(_vm.dir !== '/')?_c('NcButton',{attrs:{\"aria-label\":\"t('files', 'Go to the previous folder')\",\"type\":\"primary\",\"to\":_vm.toPreviousDir}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('files', 'Go back'))+\"\\n\\t\\t\\t\")]):_vm._e()]},proxy:true},{key:\"icon\",fn:function(){return [_c('TrashCan')]},proxy:true}])}):_c('FilesListVirtual',{ref:\"filesListVirtual\",attrs:{\"current-view\":_vm.currentView,\"nodes\":_vm.dirContents}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { defineStore } from 'pinia';\nimport { subscribe } from '@nextcloud/event-bus';\nimport logger from '../logger';\nimport Vue from 'vue';\nexport const useFilesStore = function () {\n const store = defineStore('files', {\n state: () => ({\n files: {},\n roots: {},\n }),\n getters: {\n /**\n * Get a file or folder by id\n */\n getNode: (state) => (id) => state.files[id],\n /**\n * Get a list of files or folders by their IDs\n * Does not return undefined values\n */\n getNodes: (state) => (ids) => ids\n .map(id => state.files[id])\n .filter(Boolean),\n /**\n * Get a file or folder by id\n */\n getRoot: (state) => (service) => state.roots[service],\n },\n actions: {\n updateNodes(nodes) {\n // Update the store all at once\n const files = nodes.reduce((acc, node) => {\n if (!node.attributes.fileid) {\n logger.warn('Trying to update/set a node without fileid', node);\n return acc;\n }\n acc[node.attributes.fileid] = node;\n return acc;\n }, {});\n Vue.set(this, 'files', { ...this.files, ...files });\n },\n deleteNodes(nodes) {\n nodes.forEach(node => {\n if (node.fileid) {\n Vue.delete(this.files, node.fileid);\n }\n });\n },\n setRoot({ service, root }) {\n Vue.set(this.roots, service, root);\n },\n onDeletedNode(node) {\n this.deleteNodes([node]);\n },\n }\n });\n const fileStore = store(...arguments);\n // Make sure we only register the listeners once\n if (!fileStore._initialized) {\n // subscribe('files:node:created', fileStore.onCreatedNode)\n subscribe('files:node:deleted', fileStore.onDeletedNode);\n // subscribe('files:node:moved', fileStore.onMovedNode)\n // subscribe('files:node:updated', fileStore.onUpdatedNode)\n fileStore._initialized = true;\n }\n return fileStore;\n};\n","import { defineStore } from 'pinia';\nimport { subscribe } from '@nextcloud/event-bus';\nimport Vue from 'vue';\nexport const usePathsStore = function () {\n const store = defineStore('paths', {\n state: () => ({}),\n getters: {\n getPath: (state) => {\n return (service, path) => {\n if (!state[service]) {\n return undefined;\n }\n return state[service][path];\n };\n },\n },\n actions: {\n addPath(payload) {\n // If it doesn't exists, init the service state\n if (!this[payload.service]) {\n Vue.set(this, payload.service, {});\n }\n // Now we can set the provided path\n Vue.set(this[payload.service], payload.path, payload.fileid);\n },\n }\n });\n const pathsStore = store(...arguments);\n // Make sure we only register the listeners once\n if (!pathsStore._initialized) {\n // TODO: watch folders to update paths?\n // subscribe('files:node:created', pathsStore.onCreatedNode)\n // subscribe('files:node:deleted', pathsStore.onDeletedNode)\n // subscribe('files:node:moved', pathsStore.onMovedNode)\n pathsStore._initialized = true;\n }\n return pathsStore;\n};\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { defineStore } from 'pinia';\nimport Vue from 'vue';\nimport { FileId, SelectionStore } from '../types';\nexport const useSelectionStore = defineStore('selection', {\n state: () => ({\n selected: [],\n lastSelection: [],\n lastSelectedIndex: null,\n }),\n actions: {\n /**\n * Set the selection of fileIds\n */\n set(selection = []) {\n Vue.set(this, 'selected', selection);\n },\n /**\n * Set the last selected index\n */\n setLastIndex(lastSelectedIndex = null) {\n // Update the last selection if we provided a new selection starting point\n Vue.set(this, 'lastSelection', lastSelectedIndex ? this.selected : []);\n Vue.set(this, 'lastSelectedIndex', lastSelectedIndex);\n },\n /**\n * Reset the selection\n */\n reset() {\n Vue.set(this, 'selected', []);\n Vue.set(this, 'lastSelection', []);\n Vue.set(this, 'lastSelectedIndex', null);\n }\n }\n});\n","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('NcBreadcrumbs',{attrs:{\"data-cy-files-content-breadcrumbs\":\"\"}},_vm._l((_vm.sections),function(section,index){return _c('NcBreadcrumb',_vm._b({key:section.dir,attrs:{\"aria-label\":_vm.ariaLabel(section),\"title\":_vm.ariaLabel(section)},nativeOn:{\"click\":function($event){return _vm.onClick(section.to)}},scopedSlots:_vm._u([(index === 0)?{key:\"icon\",fn:function(){return [_c('Home',{attrs:{\"size\":20}})]},proxy:true}:null],null,true)},'NcBreadcrumb',section,false))}),1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<NcBreadcrumbs data-cy-files-content-breadcrumbs>\n\t\t<!-- Current path sections -->\n\t\t<NcBreadcrumb v-for=\"(section, index) in sections\"\n\t\t\t:key=\"section.dir\"\n\t\t\t:aria-label=\"ariaLabel(section)\"\n\t\t\t:title=\"ariaLabel(section)\"\n\t\t\tv-bind=\"section\"\n\t\t\t@click.native=\"onClick(section.to)\">\n\t\t\t<template v-if=\"index === 0\" #icon>\n\t\t\t\t<Home :size=\"20\" />\n\t\t\t</template>\n\t\t</NcBreadcrumb>\n\t</NcBreadcrumbs>\n</template>\n\n<script>\nimport { basename } from 'path'\nimport Home from 'vue-material-design-icons/Home.vue'\nimport NcBreadcrumb from '@nextcloud/vue/dist/Components/NcBreadcrumb.js'\nimport NcBreadcrumbs from '@nextcloud/vue/dist/Components/NcBreadcrumbs.js'\nimport Vue from 'vue'\n\nimport { useFilesStore } from '../store/files.ts'\nimport { usePathsStore } from '../store/paths.ts'\n\nexport default Vue.extend({\n\tname: 'BreadCrumbs',\n\n\tcomponents: {\n\t\tHome,\n\t\tNcBreadcrumbs,\n\t\tNcBreadcrumb,\n\t},\n\n\tprops: {\n\t\tpath: {\n\t\t\ttype: String,\n\t\t\tdefault: '/',\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst filesStore = useFilesStore()\n\t\tconst pathsStore = usePathsStore()\n\t\treturn {\n\t\t\tfilesStore,\n\t\t\tpathsStore,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tcurrentView() {\n\t\t\treturn this.$navigation.active\n\t\t},\n\n\t\tdirs() {\n\t\t\tconst cumulativePath = (acc) => (value) => (acc += `${value}/`)\n\t\t\t// Generate a cumulative path for each path segment: ['/', '/foo', '/foo/bar', ...] etc\n\t\t\tconst paths = this.path.split('/').filter(Boolean).map(cumulativePath('/'))\n\t\t\t// Strip away trailing slash\n\t\t\treturn ['/', ...paths.map(path => path.replace(/^(.+)\\/$/, '$1'))]\n\t\t},\n\n\t\tsections() {\n\t\t\treturn this.dirs.map(dir => {\n\t\t\t\tconst to = { ...this.$route, query: { dir } }\n\t\t\t\treturn {\n\t\t\t\t\tdir,\n\t\t\t\t\texact: true,\n\t\t\t\t\tname: this.getDirDisplayName(dir),\n\t\t\t\t\tto,\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t},\n\n\tmethods: {\n\t\tgetNodeFromId(id) {\n\t\t\treturn this.filesStore.getNode(id)\n\t\t},\n\t\tgetFileIdFromPath(path) {\n\t\t\treturn this.pathsStore.getPath(this.currentView?.id, path)\n\t\t},\n\t\tgetDirDisplayName(path) {\n\t\t\tif (path === '/') {\n\t\t\t\treturn t('files', 'Home')\n\t\t\t}\n\n\t\t\tconst fileId = this.getFileIdFromPath(path)\n\t\t\tconst node = this.getNodeFromId(fileId)\n\t\t\treturn node?.attributes?.displayName || basename(path)\n\t\t},\n\n\t\tonClick(to) {\n\t\t\tif (to?.query?.dir === this.$route.query.dir) {\n\t\t\t\tthis.$emit('reload')\n\t\t\t}\n\t\t},\n\n\t\tariaLabel(section) {\n\t\t\tif (section?.to?.query?.dir === this.$route.query.dir) {\n\t\t\t\treturn t('files', 'Reload current directory')\n\t\t\t}\n\t\t\treturn t('files', 'Go to the \"{dir}\" directory', section)\n\t\t},\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.breadcrumb {\n\t// Take as much space as possible\n\tflex: 1 1 100% !important;\n\twidth: 100%;\n\n\t::v-deep a {\n\t\tcursor: pointer !important;\n\t}\n}\n\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BreadCrumbs.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BreadCrumbs.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BreadCrumbs.vue?vue&type=style&index=0&id=68b3b20b&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BreadCrumbs.vue?vue&type=style&index=0&id=68b3b20b&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./BreadCrumbs.vue?vue&type=template&id=68b3b20b&scoped=true&\"\nimport script from \"./BreadCrumbs.vue?vue&type=script&lang=js&\"\nexport * from \"./BreadCrumbs.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BreadCrumbs.vue?vue&type=style&index=0&id=68b3b20b&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"68b3b20b\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('RecycleScroller',{ref:\"recycleScroller\",staticClass:\"files-list\",attrs:{\"key-field\":\"source\",\"items\":_vm.nodes,\"item-size\":55,\"table-mode\":true,\"item-class\":\"files-list__row\",\"item-tag\":\"tr\",\"list-class\":\"files-list__body\",\"list-tag\":\"tbody\",\"role\":\"table\"},scopedSlots:_vm._u([{key:\"default\",fn:function({ item, active, index }){return [_c('FileEntry',{attrs:{\"active\":active,\"index\":index,\"is-size-available\":_vm.isSizeAvailable,\"files-list-width\":_vm.filesListWidth,\"nodes\":_vm.nodes,\"source\":item}})]}},{key:\"before\",fn:function(){return [_c('caption',{staticClass:\"hidden-visually\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.currentView.caption || '')+\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files', 'This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('FilesListHeader',{attrs:{\"files-list-width\":_vm.filesListWidth,\"is-size-available\":_vm.isSizeAvailable,\"nodes\":_vm.nodes}})]},proxy:true},{key:\"after\",fn:function(){return [_c('FilesListFooter',{attrs:{\"files-list-width\":_vm.filesListWidth,\"is-size-available\":_vm.isSizeAvailable,\"nodes\":_vm.nodes,\"summary\":_vm.summary}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n// The preview service worker cache name (see webpack config)\nconst SWCacheName = 'previews';\n/**\n * Check if the preview is already cached by the service worker\n */\nexport const isCachedPreview = function (previewUrl) {\n return caches.open(SWCacheName)\n .then(function (cache) {\n return cache.match(previewUrl)\n .then(function (response) {\n return !!response;\n });\n });\n};\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { defineStore } from 'pinia';\nexport const useActionsMenuStore = defineStore('actionsmenu', {\n state: () => ({\n opened: null,\n }),\n});\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomElementRender.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomElementRender.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<span />\n</template>\n\n<script>\n/**\n * This component is used to render custom\n * elements provided by an API. Vue doesn't allow\n * to directly render an HTMLElement, so we can do\n * this magic here.\n */\nexport default {\n\tname: 'CustomElementRender',\n\tprops: {\n\t\tsource: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tcurrentView: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\trender: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tcomputed: {\n\t\telement() {\n\t\t\treturn this.render(this.source, this.currentView)\n\t\t},\n\t},\n\twatch: {\n\t\telement() {\n\t\t\tthis.$el.replaceWith(this.element)\n\t\t\tthis.$el = this.element\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$el.replaceWith(this.element)\n\t\tthis.$el = this.element\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./CustomElementRender.vue?vue&type=template&id=a261c93e&\"\nimport script from \"./CustomElementRender.vue?vue&type=script&lang=js&\"\nexport * from \"./CustomElementRender.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span')\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',{staticClass:\"custom-svg-icon\"})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<span class=\"custom-svg-icon\" />\n</template>\n\n<script>\n// eslint-disable-next-line import/named\nimport { sanitize } from 'dompurify'\n\nexport default {\n\tname: 'CustomSvgIconRender',\n\tprops: {\n\t\tsvg: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\twatch: {\n\t\tsvg() {\n\t\t\tthis.$el.innerHTML = sanitize(this.svg)\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$el.innerHTML = sanitize(this.svg)\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n.custom-svg-icon {\n\tdisplay: flex;\n\talign-items: center;\n\talign-self: center;\n\tjustify-content: center;\n\tjustify-self: center;\n\twidth: 44px;\n\theight: 44px;\n\topacity: 1;\n\n\t::v-deep svg {\n\t\t// mdi icons have a size of 24px\n\t\t// 22px results in roughly 16px inner size\n\t\theight: 22px;\n\t\twidth: 22px;\n\t\tfill: currentColor;\n\t}\n}\n\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomSvgIconRender.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomSvgIconRender.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomSvgIconRender.vue?vue&type=style&index=0&id=93e9b2f4&prod&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomSvgIconRender.vue?vue&type=style&index=0&id=93e9b2f4&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./CustomSvgIconRender.vue?vue&type=template&id=93e9b2f4&scoped=true&\"\nimport script from \"./CustomSvgIconRender.vue?vue&type=script&lang=js&\"\nexport * from \"./CustomSvgIconRender.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CustomSvgIconRender.vue?vue&type=style&index=0&id=93e9b2f4&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"93e9b2f4\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('Fragment',[_c('td',{staticClass:\"files-list__row-checkbox\"},[(_vm.active)?_c('NcCheckboxRadioSwitch',{attrs:{\"aria-label\":_vm.t('files', 'Select the row for {displayName}', { displayName: _vm.displayName }),\"checked\":_vm.selectedFiles,\"value\":_vm.fileid,\"name\":\"selectedFiles\"},on:{\"update:checked\":_vm.onSelectionChange}}):_vm._e()],1),_vm._v(\" \"),_c('td',{staticClass:\"files-list__row-name\"},[_c('a',_vm._b({ref:\"name\"},'a',_vm.linkTo,false),[_c('span',{staticClass:\"files-list__row-icon\"},[(_vm.source.type === 'folder')?_c('FolderIcon'):(_vm.previewUrl && !_vm.backgroundFailed)?_c('span',{ref:\"previewImg\",staticClass:\"files-list__row-icon-preview\",style:({ backgroundImage: _vm.backgroundImage })}):(_vm.mimeIconUrl)?_c('span',{staticClass:\"files-list__row-icon-preview files-list__row-icon-preview--mime\",style:({ backgroundImage: _vm.mimeIconUrl })}):_c('FileIcon')],1),_vm._v(\" \"),_c('span',{staticClass:\"files-list__row-name-text\"},[_vm._v(_vm._s(_vm.displayName))])])]),_vm._v(\" \"),_c('td',{staticClass:\"files-list__row-actions\",class:`files-list__row-actions-${_vm.uniqueId}`},[(_vm.active)?_c('NcActions',{ref:\"actionsMenu\",attrs:{\"disabled\":_vm.source._loading,\"force-title\":true,\"inline\":_vm.enabledInlineActions.length,\"open\":_vm.openedMenu},on:{\"update:open\":function($event){_vm.openedMenu=$event}}},_vm._l((_vm.enabledMenuActions),function(action){return _c('NcActionButton',{key:action.id,class:'files-list__row-action-' + action.id,on:{\"click\":function($event){return _vm.onActionClick(action)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(_vm.loading === action.id)?_c('NcLoadingIcon',{attrs:{\"size\":18}}):_c('CustomSvgIconRender',{attrs:{\"svg\":action.iconSvgInline([_vm.source], _vm.currentView)}})]},proxy:true}],null,true)},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(action.displayName([_vm.source], _vm.currentView))+\"\\n\\t\\t\\t\")])}),1):_vm._e()],1),_vm._v(\" \"),(_vm.isSizeAvailable)?_c('td',{staticClass:\"files-list__row-size\",style:({ opacity: _vm.sizeOpacity })},[_c('span',[_vm._v(_vm._s(_vm.size))])]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.columns),function(column){return _c('td',{key:column.id,staticClass:\"files-list__row-column-custom\",class:`files-list__row-${_vm.currentView?.id}-${column.id}`},[(_vm.active)?_c('CustomElementRender',{attrs:{\"current-view\":_vm.currentView,\"render\":column.render,\"source\":_vm.source}}):_vm._e()],1)})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { defineStore } from 'pinia';\nimport Vue from 'vue';\n/**\n * Observe various events and save the current\n * special keys states. Useful for checking the\n * current status of a key when executing a method.\n */\nexport const useKeyboardStore = function () {\n const store = defineStore('keyboard', {\n state: () => ({\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }),\n actions: {\n onEvent(event) {\n if (!event) {\n event = window.event;\n }\n Vue.set(this, 'altKey', !!event.altKey);\n Vue.set(this, 'ctrlKey', !!event.ctrlKey);\n Vue.set(this, 'metaKey', !!event.metaKey);\n Vue.set(this, 'shiftKey', !!event.shiftKey);\n },\n }\n });\n const keyboardStore = store(...arguments);\n // Make sure we only register the listeners once\n if (!keyboardStore._initialized) {\n window.addEventListener('keydown', keyboardStore.onEvent);\n window.addEventListener('keyup', keyboardStore.onEvent);\n window.addEventListener('mousemove', keyboardStore.onEvent);\n keyboardStore._initialized = true;\n }\n return keyboardStore;\n};\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=script&lang=ts&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=style&index=0&id=47057834&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=style&index=0&id=47057834&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=style&index=1&id=47057834&prod&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileEntry.vue?vue&type=style&index=1&id=47057834&prod&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FileEntry.vue?vue&type=template&id=47057834&scoped=true&\"\nimport script from \"./FileEntry.vue?vue&type=script&lang=ts&\"\nexport * from \"./FileEntry.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FileEntry.vue?vue&type=style&index=0&id=47057834&prod&scoped=true&lang=scss&\"\nimport style1 from \"./FileEntry.vue?vue&type=style&index=1&id=47057834&prod&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"47057834\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListFooter.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListFooter.vue?vue&type=script&lang=ts&\"","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('tr',[_c('th',{staticClass:\"files-list__row-checkbox\"},[_c('span',{staticClass:\"hidden-visually\"},[_vm._v(_vm._s(_vm.t('files', 'Total rows summary')))])]),_vm._v(\" \"),_c('td',{staticClass:\"files-list__row-name\"},[_c('span',{staticClass:\"files-list__row-icon\"}),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.summary))])]),_vm._v(\" \"),_c('td',{staticClass:\"files-list__row-actions\"}),_vm._v(\" \"),(_vm.isSizeAvailable)?_c('td',{staticClass:\"files-list__column files-list__row-size\"},[_c('span',[_vm._v(_vm._s(_vm.totalSize))])]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.columns),function(column){return _c('th',{key:column.id,class:_vm.classForColumn(column)},[_c('span',[_vm._v(_vm._s(column.summary?.(_vm.nodes, _vm.currentView)))])])})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListFooter.vue?vue&type=style&index=0&id=e6a083be&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListFooter.vue?vue&type=style&index=0&id=e6a083be&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesListFooter.vue?vue&type=template&id=e6a083be&scoped=true&\"\nimport script from \"./FilesListFooter.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesListFooter.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesListFooter.vue?vue&type=style&index=0&id=e6a083be&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e6a083be\",\n null\n \n)\n\nexport default component.exports","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport Vue from 'vue';\nexport default Vue.extend({\n data() {\n return {\n filesListWidth: null,\n };\n },\n created() {\n const fileListEl = document.querySelector('#app-content-vue');\n this.$resizeObserver = new ResizeObserver((entries) => {\n if (entries.length > 0 && entries[0].target === fileListEl) {\n this.filesListWidth = entries[0].contentRect.width;\n }\n });\n this.$resizeObserver.observe(fileListEl);\n },\n beforeDestroy() {\n this.$resizeObserver.disconnect();\n },\n});\n","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('th',{staticClass:\"files-list__column files-list__row-actions-batch\",attrs:{\"colspan\":\"2\"}},[_c('NcActions',{ref:\"actionsMenu\",attrs:{\"disabled\":!!_vm.loading || _vm.areSomeNodesLoading,\"force-title\":true,\"inline\":_vm.inlineActions,\"menu-title\":_vm.inlineActions <= 1 ? _vm.t('files', 'Actions') : null,\"open\":_vm.openedMenu},on:{\"update:open\":function($event){_vm.openedMenu=$event}}},_vm._l((_vm.enabledActions),function(action){return _c('NcActionButton',{key:action.id,class:'files-list__row-actions-batch-' + action.id,on:{\"click\":function($event){return _vm.onActionClick(action)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(_vm.loading === action.id)?_c('NcLoadingIcon',{attrs:{\"size\":18}}):_c('CustomSvgIconRender',{attrs:{\"svg\":action.iconSvgInline(_vm.nodes, _vm.currentView)}})]},proxy:true}],null,true)},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(action.displayName(_vm.nodes, _vm.currentView))+\"\\n\\t\\t\")])}),1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderActions.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderActions.vue?vue&type=script&lang=ts&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderActions.vue?vue&type=style&index=0&id=9d92da06&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderActions.vue?vue&type=style&index=0&id=9d92da06&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesListHeaderActions.vue?vue&type=template&id=9d92da06&scoped=true&\"\nimport script from \"./FilesListHeaderActions.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesListHeaderActions.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesListHeaderActions.vue?vue&type=style&index=0&id=9d92da06&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"9d92da06\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('NcButton',{staticClass:\"files-list__column-sort-button\",class:{'files-list__column-sort-button--active': _vm.sortingMode === _vm.mode},attrs:{\"aria-label\":_vm.sortAriaLabel(_vm.name),\"type\":\"tertiary\"},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleSortBy(_vm.mode)}}},[(_vm.sortingMode !== _vm.mode || _vm.isAscSorting)?_c('MenuUp',{attrs:{\"slot\":\"icon\"},slot:\"icon\"}):_c('MenuDown',{attrs:{\"slot\":\"icon\"},slot:\"icon\"}),_vm._v(\"\\n\\t\"+_vm._s(_vm.name)+\"\\n\")],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport Vue from 'vue';\nimport { mapState } from 'pinia';\nimport { useViewConfigStore } from '../store/viewConfig';\nexport default Vue.extend({\n computed: {\n ...mapState(useViewConfigStore, ['getConfig', 'setSortingBy', 'toggleSortingDirection']),\n currentView() {\n return this.$navigation.active;\n },\n /**\n * Get the sorting mode for the current view\n */\n sortingMode() {\n return this.getConfig(this.currentView.id)?.sorting_mode\n || this.currentView?.defaultSortKey\n || 'basename';\n },\n /**\n * Get the sorting direction for the current view\n */\n isAscSorting() {\n const sortingDirection = this.getConfig(this.currentView.id)?.sorting_direction;\n return sortingDirection === 'asc';\n },\n },\n methods: {\n toggleSortBy(key) {\n // If we're already sorting by this key, flip the direction\n if (this.sortingMode === key) {\n this.toggleSortingDirection(this.currentView.id);\n return;\n }\n // else sort ASC by this new key\n this.setSortingBy(key, this.currentView.id);\n },\n },\n});\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderButton.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderButton.vue?vue&type=script&lang=ts&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderButton.vue?vue&type=style&index=0&id=e85a09d2&prod&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeaderButton.vue?vue&type=style&index=0&id=e85a09d2&prod&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesListHeaderButton.vue?vue&type=template&id=e85a09d2&\"\nimport script from \"./FilesListHeaderButton.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesListHeaderButton.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesListHeaderButton.vue?vue&type=style&index=0&id=e85a09d2&prod&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeader.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeader.vue?vue&type=script&lang=ts&\"","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('tr',[_c('th',{staticClass:\"files-list__column files-list__row-checkbox\"},[_c('NcCheckboxRadioSwitch',_vm._b({on:{\"update:checked\":_vm.onToggleAll}},'NcCheckboxRadioSwitch',_vm.selectAllBind,false))],1),_vm._v(\" \"),(!_vm.isNoneSelected)?_c('FilesListHeaderActions',{attrs:{\"current-view\":_vm.currentView,\"selected-nodes\":_vm.selectedNodes}}):[_c('th',{staticClass:\"files-list__column files-list__row-name files-list__column--sortable\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleSortBy('basename')}}},[_c('span',{staticClass:\"files-list__row-icon\"}),_vm._v(\" \"),_c('FilesListHeaderButton',{attrs:{\"name\":_vm.t('files', 'Name'),\"mode\":\"basename\"}})],1),_vm._v(\" \"),_c('th',{staticClass:\"files-list__row-actions\"}),_vm._v(\" \"),(_vm.isSizeAvailable)?_c('th',{staticClass:\"files-list__column files-list__row-size\",class:{'files-list__column--sortable': _vm.isSizeAvailable}},[_c('FilesListHeaderButton',{attrs:{\"name\":_vm.t('files', 'Size'),\"mode\":\"size\"}})],1):_vm._e(),_vm._v(\" \"),_vm._l((_vm.columns),function(column){return _c('th',{key:column.id,class:_vm.classForColumn(column)},[(!!column.sort)?_c('FilesListHeaderButton',{attrs:{\"name\":column.title,\"mode\":column.id}}):_c('span',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(column.title)+\"\\n\\t\\t\\t\")])],1)})]],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeader.vue?vue&type=style&index=0&id=53698ce8&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListHeader.vue?vue&type=style&index=0&id=53698ce8&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesListHeader.vue?vue&type=template&id=53698ce8&scoped=true&\"\nimport script from \"./FilesListHeader.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesListHeader.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesListHeader.vue?vue&type=style&index=0&id=53698ce8&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"53698ce8\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListVirtual.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListVirtual.vue?vue&type=script&lang=ts&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListVirtual.vue?vue&type=style&index=0&id=07b86e54&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesListVirtual.vue?vue&type=style&index=0&id=07b86e54&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesListVirtual.vue?vue&type=template&id=07b86e54&scoped=true&\"\nimport script from \"./FilesListVirtual.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesListVirtual.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesListVirtual.vue?vue&type=style&index=0&id=07b86e54&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"07b86e54\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesList.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesList.vue?vue&type=script&lang=ts&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesList.vue?vue&type=style&index=0&id=77548daf&prod&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilesList.vue?vue&type=style&index=0&id=77548daf&prod&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./FilesList.vue?vue&type=template&id=77548daf&scoped=true&\"\nimport script from \"./FilesList.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilesList.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilesList.vue?vue&type=style&index=0&id=77548daf&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"77548daf\",\n null\n \n)\n\nexport default component.exports","/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport Vue from 'vue'\nimport Router from 'vue-router'\nimport { generateUrl } from '@nextcloud/router'\nimport { stringify } from 'query-string'\n\nVue.use(Router)\n\nconst router = new Router({\n\tmode: 'history',\n\n\t// if index.php is in the url AND we got this far, then it's working:\n\t// let's keep using index.php in the url\n\tbase: generateUrl('/apps/files', ''),\n\tlinkActiveClass: 'active',\n\n\troutes: [\n\t\t{\n\t\t\tpath: '/',\n\t\t\t// Pretending we're using the default view\n\t\t\talias: '/files',\n\t\t},\n\t\t{\n\t\t\tpath: '/:view/:fileid?',\n\t\t\tname: 'filelist',\n\t\t\tprops: true,\n\t\t},\n\t],\n\n\t// Custom stringifyQuery to prevent encoding of slashes in the url\n\tstringifyQuery(query) {\n\t\tconst result = stringify(query).replace(/%2F/gmi, '/')\n\t\treturn result ? ('?' + result) : ''\n\t},\n})\n\nexport default router\n","import './templates.js'\nimport './legacy/filelistSearch.js'\nimport './actions/deleteAction.ts'\n\nimport processLegacyFilesViews from './legacy/navigationMapper.js'\n\nimport Vue from 'vue'\nimport { createPinia, PiniaVuePlugin } from 'pinia'\n\nimport NavigationService from './services/Navigation.ts'\nimport registerPreviewServiceWorker from './services/ServiceWorker.js'\n\nimport NavigationView from './views/Navigation.vue'\nimport FilesListView from './views/FilesList.vue'\n\nimport SettingsService from './services/Settings.js'\nimport SettingsModel from './models/Setting.js'\n\nimport router from './router/router.js'\n\n// Init private and public Files namespace\nwindow.OCA.Files = window.OCA.Files ?? {}\nwindow.OCP.Files = window.OCP.Files ?? {}\n\n// Init Pinia store\nVue.use(PiniaVuePlugin)\nconst pinia = createPinia()\n\n// Init Navigation Service\nconst Navigation = new NavigationService()\nObject.assign(window.OCP.Files, { Navigation })\nVue.prototype.$navigation = Navigation\n\n// Init Files App Settings Service\nconst Settings = new SettingsService()\nObject.assign(window.OCA.Files, { Settings })\nObject.assign(window.OCA.Files.Settings, { Setting: SettingsModel })\n\n// Init Navigation View\nconst View = Vue.extend(NavigationView)\nconst FilesNavigationRoot = new View({\n\tname: 'FilesNavigationRoot',\n\tpropsData: {\n\t\tNavigation,\n\t},\n\trouter,\n\tpinia,\n})\nFilesNavigationRoot.$mount('#app-navigation-files')\n\n// Init content list view\nconst ListView = Vue.extend(FilesListView)\nconst FilesList = new ListView({\n\tname: 'FilesListRoot',\n\trouter,\n\tpinia,\n})\nFilesList.$mount('#app-content-vue')\n\n// Init legacy files views\nprocessLegacyFilesViews()\n\n// Register preview service worker\nregisterPreviewServiceWorker()\n","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nexport default class Settings {\n\n\t_settings\n\n\tconstructor() {\n\t\tthis._settings = []\n\t\tconsole.debug('OCA.Files.Settings initialized')\n\t}\n\n\t/**\n\t * Register a new setting\n\t *\n\t * @since 19.0.0\n\t * @param {OCA.Files.Settings.Setting} view element to add to settings\n\t * @return {boolean} whether registering was successful\n\t */\n\tregister(view) {\n\t\tif (this._settings.filter(e => e.name === view.name).length > 0) {\n\t\t\tconsole.error('A setting with the same name is already registered')\n\t\t\treturn false\n\t\t}\n\t\tthis._settings.push(view)\n\t\treturn true\n\t}\n\n\t/**\n\t * All settings elements\n\t *\n\t * @return {OCA.Files.Settings.Setting[]} All currently registered settings\n\t */\n\tget settings() {\n\t\treturn this._settings\n\t}\n\n}\n","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nexport default class Setting {\n\n\t_close\n\t_el\n\t_name\n\t_open\n\n\t/**\n\t * Create a new files app setting\n\t *\n\t * @since 19.0.0\n\t * @param {string} name the name of this setting\n\t * @param {object} component the component\n\t * @param {Function} component.el function that returns an unmounted dom element to be added\n\t * @param {Function} [component.open] callback for when setting is added\n\t * @param {Function} [component.close] callback for when setting is closed\n\t */\n\tconstructor(name, { el, open, close }) {\n\t\tthis._name = name\n\t\tthis._el = el\n\t\tthis._open = open\n\t\tthis._close = close\n\n\t\tif (typeof this._open !== 'function') {\n\t\t\tthis._open = () => {}\n\t\t}\n\n\t\tif (typeof this._close !== 'function') {\n\t\t\tthis._close = () => {}\n\t\t}\n\t}\n\n\tget name() {\n\t\treturn this._name\n\t}\n\n\tget el() {\n\t\treturn this._el\n\t}\n\n\tget open() {\n\t\treturn this._open\n\t}\n\n\tget close() {\n\t\treturn this._close\n\t}\n\n}\n","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { generateUrl } from '@nextcloud/router'\nimport logger from '../logger.js'\n\nexport default () => {\n\tif ('serviceWorker' in navigator) {\n\t\t// Use the window load event to keep the page load performant\n\t\twindow.addEventListener('load', async () => {\n\t\t\ttry {\n\t\t\t\tconst url = generateUrl('/apps/files/preview-service-worker.js', {}, { noRewrite: true })\n\t\t\t\tconst registration = await navigator.serviceWorker.register(url, { scope: '/' })\n\t\t\t\tlogger.debug('SW registered: ', { registration })\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('SW registration failed: ', { error })\n\t\t\t}\n\t\t})\n\t} else {\n\t\tlogger.debug('Service Worker is not enabled on this browser.')\n\t}\n}\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".breadcrumb[data-v-68b3b20b]{flex:1 1 100% !important;width:100%}.breadcrumb[data-v-68b3b20b] a{cursor:pointer !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/BreadCrumbs.vue\"],\"names\":[],\"mappings\":\"AACA,6BAEC,wBAAA,CACA,UAAA,CAEA,+BACC,yBAAA\",\"sourcesContent\":[\"\\n.breadcrumb {\\n\\t// Take as much space as possible\\n\\tflex: 1 1 100% !important;\\n\\twidth: 100%;\\n\\n\\t::v-deep a {\\n\\t\\tcursor: pointer !important;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".custom-svg-icon[data-v-93e9b2f4]{display:flex;align-items:center;align-self:center;justify-content:center;justify-self:center;width:44px;height:44px;opacity:1}.custom-svg-icon[data-v-93e9b2f4] svg{height:22px;width:22px;fill:currentColor}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/CustomSvgIconRender.vue\"],\"names\":[],\"mappings\":\"AACA,kCACC,YAAA,CACA,kBAAA,CACA,iBAAA,CACA,sBAAA,CACA,mBAAA,CACA,UAAA,CACA,WAAA,CACA,SAAA,CAEA,sCAGC,WAAA,CACA,UAAA,CACA,iBAAA\",\"sourcesContent\":[\"\\n.custom-svg-icon {\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\talign-self: center;\\n\\tjustify-content: center;\\n\\tjustify-self: center;\\n\\twidth: 44px;\\n\\theight: 44px;\\n\\topacity: 1;\\n\\n\\t::v-deep svg {\\n\\t\\t// mdi icons have a size of 24px\\n\\t\\t// 22px results in roughly 16px inner size\\n\\t\\theight: 22px;\\n\\t\\twidth: 22px;\\n\\t\\tfill: currentColor;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"tr[data-v-47057834]:hover,tr[data-v-47057834]:focus,tr[data-v-47057834]:active{background-color:var(--color-background-dark)}.files-list__row-icon-preview[data-v-47057834]:not([style*=background]){background:var(--color-loading-dark)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FileEntry.vue\"],\"names\":[],\"mappings\":\"AAGC,+EAGC,6CAAA,CAKF,wEACI,oCAAA\",\"sourcesContent\":[\"\\n/* Hover effect on tbody lines only */\\ntr {\\n\\t&:hover,\\n\\t&:focus,\\n\\t&:active {\\n\\t\\tbackground-color: var(--color-background-dark);\\n\\t}\\n}\\n\\n/* Preview not loaded animation effect */\\n.files-list__row-icon-preview:not([style*='background']) {\\n background: var(--color-loading-dark);\\n\\t// animation: preview-gradient-fade 1.2s ease-in-out infinite;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"tr[data-v-e6a083be]{padding-bottom:300px;border-top:1px solid var(--color-border);background-color:rgba(0,0,0,0) !important;border-bottom:none !important}td[data-v-e6a083be]{user-select:none;color:var(--color-text-maxcontrast) !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FilesListFooter.vue\"],\"names\":[],\"mappings\":\"AAEA,oBACC,oBAAA,CACA,wCAAA,CAEA,yCAAA,CACA,6BAAA,CAGD,oBACC,gBAAA,CAEA,8CAAA\",\"sourcesContent\":[\"\\n// Scoped row\\ntr {\\n\\tpadding-bottom: 300px;\\n\\tborder-top: 1px solid var(--color-border);\\n\\t// Prevent hover effect on the whole row\\n\\tbackground-color: transparent !important;\\n\\tborder-bottom: none !important;\\n}\\n\\ntd {\\n\\tuser-select: none;\\n\\t// Make sure the cell colors don't apply to column headers\\n\\tcolor: var(--color-text-maxcontrast) !important;\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".files-list__column[data-v-53698ce8]{user-select:none;color:var(--color-text-maxcontrast) !important}.files-list__column--sortable[data-v-53698ce8]{cursor:pointer}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FilesListHeader.vue\"],\"names\":[],\"mappings\":\"AACA,qCACC,gBAAA,CAEA,8CAAA,CAEA,+CACC,cAAA\",\"sourcesContent\":[\"\\n.files-list__column {\\n\\tuser-select: none;\\n\\t// Make sure the cell colors don't apply to column headers\\n\\tcolor: var(--color-text-maxcontrast) !important;\\n\\n\\t&--sortable {\\n\\t\\tcursor: pointer;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".files-list__row-actions-batch[data-v-9d92da06]{flex:1 1 100% !important}.files-list__row-actions-batch[data-v-9d92da06] .button-vue__wrapper{width:100%}.files-list__row-actions-batch[data-v-9d92da06] .button-vue__wrapper span.button-vue__text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FilesListHeaderActions.vue\"],\"names\":[],\"mappings\":\"AACA,gDACC,wBAAA,CAGA,qEACC,UAAA,CACA,2FACC,eAAA,CACA,sBAAA,CACA,kBAAA\",\"sourcesContent\":[\"\\n.files-list__row-actions-batch {\\n\\tflex: 1 1 100% !important;\\n\\n\\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\\n\\t::v-deep .button-vue__wrapper {\\n\\t\\twidth: 100%;\\n\\t\\tspan.button-vue__text {\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\twhite-space: nowrap;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".files-list__column-sort-button{margin:0 calc(var(--cell-margin)*-1);padding:0 4px 0 16px !important}.files-list__column-sort-button .button-vue__wrapper{flex-direction:row-reverse;width:100%}.files-list__column-sort-button .button-vue__icon{transition-timing-function:linear;transition-duration:.1s;transition-property:opacity;opacity:0}.files-list__column-sort-button .button-vue__text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.files-list__column-sort-button--active .button-vue__icon,.files-list__column-sort-button:hover .button-vue__icon,.files-list__column-sort-button:focus .button-vue__icon,.files-list__column-sort-button:active .button-vue__icon{opacity:1 !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FilesListHeaderButton.vue\"],\"names\":[],\"mappings\":\"AACA,gCAEC,oCAAA,CAEA,+BAAA,CAGA,qDACC,0BAAA,CAGA,UAAA,CAGD,kDACC,iCAAA,CACA,uBAAA,CACA,2BAAA,CACA,SAAA,CAID,kDACC,eAAA,CACA,kBAAA,CACA,sBAAA,CAOA,mOACC,oBAAA\",\"sourcesContent\":[\"\\n.files-list__column-sort-button {\\n\\t// Compensate for cells margin\\n\\tmargin: 0 calc(var(--cell-margin) * -1);\\n\\t// Reverse padding\\n\\tpadding: 0 4px 0 16px !important;\\n\\n\\t// Icon after text\\n\\t.button-vue__wrapper {\\n\\t\\tflex-direction: row-reverse;\\n\\t\\t// Take max inner width for text overflow ellipsis\\n\\t\\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\t.button-vue__icon {\\n\\t\\ttransition-timing-function: linear;\\n\\t\\ttransition-duration: .1s;\\n\\t\\ttransition-property: opacity;\\n\\t\\topacity: 0;\\n\\t}\\n\\n\\t// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged\\n\\t.button-vue__text {\\n\\t\\toverflow: hidden;\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t}\\n\\n\\t&--active,\\n\\t&:hover,\\n\\t&:focus,\\n\\t&:active {\\n\\t\\t.button-vue__icon {\\n\\t\\t\\topacity: 1 !important;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".files-list[data-v-07b86e54]{--row-height: 55px;--cell-margin: 14px;--checkbox-padding: calc((var(--row-height) - var(--checkbox-size)) / 2);--checkbox-size: 24px;--clickable-area: 44px;--icon-preview-size: 32px;display:block;overflow:auto;height:100%}.files-list[data-v-07b86e54] tbody,.files-list[data-v-07b86e54] .vue-recycle-scroller__slot{display:flex;flex-direction:column;width:100%;position:relative}.files-list[data-v-07b86e54] .vue-recycle-scroller__slot[role=thead]{position:sticky;z-index:10;top:0;height:var(--row-height);background-color:var(--color-main-background)}.files-list[data-v-07b86e54] tr{position:absolute;display:flex;align-items:center;width:100%;border-bottom:1px solid var(--color-border)}.files-list[data-v-07b86e54] td,.files-list[data-v-07b86e54] th{display:flex;align-items:center;flex:0 0 auto;justify-content:left;width:var(--row-height);height:var(--row-height);margin:0;padding:0;color:var(--color-text-maxcontrast);border:none}.files-list[data-v-07b86e54] td span,.files-list[data-v-07b86e54] th span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.files-list[data-v-07b86e54] .files-list__row-checkbox{justify-content:center}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch{display:flex;justify-content:center;--icon-size: var(--checkbox-size)}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch label.checkbox-radio-switch__label{width:var(--clickable-area);height:var(--clickable-area);margin:0;padding:calc((var(--clickable-area) - var(--checkbox-size))/2)}.files-list[data-v-07b86e54] .files-list__row-checkbox .checkbox-radio-switch .checkbox-radio-switch__icon{margin:0 !important}.files-list[data-v-07b86e54] .files-list__row-icon{display:flex;align-items:center;justify-content:center;width:var(--icon-preview-size);height:100%;margin-right:var(--checkbox-padding);color:var(--color-primary-element);flex:0 0 var(--icon-preview-size)}.files-list[data-v-07b86e54] .files-list__row-icon>span{justify-content:flex-start}.files-list[data-v-07b86e54] .files-list__row-icon svg{width:var(--icon-preview-size);height:var(--icon-preview-size)}.files-list[data-v-07b86e54] .files-list__row-icon-preview{overflow:hidden;width:var(--icon-preview-size);height:var(--icon-preview-size);border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center;background-size:contain}.files-list[data-v-07b86e54] .files-list__row-name{overflow:hidden;flex:1 1 auto}.files-list[data-v-07b86e54] .files-list__row-name a{display:flex;align-items:center;width:100%;height:100%}.files-list[data-v-07b86e54] .files-list__row-name a:focus .files-list__row-name-text,.files-list[data-v-07b86e54] .files-list__row-name a:focus-visible .files-list__row-name-text{outline:2px solid var(--color-main-text) !important;border-radius:20px}.files-list[data-v-07b86e54] .files-list__row-name .files-list__row-name-text{padding:5px 10px;margin-left:-10px}.files-list[data-v-07b86e54] .files-list__row-actions{width:auto}.files-list[data-v-07b86e54] .files-list__row-actions~td,.files-list[data-v-07b86e54] .files-list__row-actions~th{margin:0 var(--cell-margin)}.files-list[data-v-07b86e54] .files-list__row-actions button .button-vue__text{font-weight:normal}.files-list[data-v-07b86e54] .files-list__row-actions button:not(:hover,:focus,:active) .button-vue__wrapper{color:var(--color-text-maxcontrast)}.files-list[data-v-07b86e54] .files-list__row-size{justify-content:flex-end;width:calc(var(--row-height)*1.5);color:var(--color-main-text)}.files-list[data-v-07b86e54] .files-list__row-size .files-list__column-sort-button{padding:0 16px 0 4px !important}.files-list[data-v-07b86e54] .files-list__row-size .files-list__column-sort-button .button-vue__wrapper{flex-direction:row}.files-list[data-v-07b86e54] .files-list__row-column-custom{width:calc(var(--row-height)*2)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FilesListVirtual.vue\"],\"names\":[],\"mappings\":\"AACA,6BACC,kBAAA,CACA,mBAAA,CAEA,wEAAA,CACA,qBAAA,CACA,sBAAA,CACA,yBAAA,CAEA,aAAA,CACA,aAAA,CACA,WAAA,CAIC,4FACC,YAAA,CACA,qBAAA,CACA,UAAA,CAEA,iBAAA,CAID,qEAEC,eAAA,CACA,UAAA,CACA,KAAA,CACA,wBAAA,CACA,6CAAA,CAGD,gCACC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,UAAA,CACA,2CAAA,CAGD,gEACC,YAAA,CACA,kBAAA,CACA,aAAA,CACA,oBAAA,CACA,uBAAA,CACA,wBAAA,CACA,QAAA,CACA,SAAA,CACA,mCAAA,CACA,WAAA,CAKA,0EACC,eAAA,CACA,kBAAA,CACA,sBAAA,CAIF,uDACC,sBAAA,CACA,8EACC,YAAA,CACA,sBAAA,CAEA,iCAAA,CAEA,iHACC,2BAAA,CACA,4BAAA,CACA,QAAA,CACA,8DAAA,CAGD,2GACC,mBAAA,CAKH,mDACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,8BAAA,CACA,WAAA,CAEA,oCAAA,CACA,kCAAA,CAEA,iCAAA,CAEA,wDACC,0BAAA,CAGD,uDACC,8BAAA,CACA,+BAAA,CAGD,2DACC,eAAA,CACA,8BAAA,CACA,+BAAA,CACA,kCAAA,CACA,2BAAA,CAEA,0BAAA,CACA,uBAAA,CAIF,mDAEC,eAAA,CAEA,aAAA,CAEA,qDACC,YAAA,CACA,kBAAA,CAEA,UAAA,CACA,WAAA,CAGA,oLAEC,mDAAA,CACA,kBAAA,CAIF,8EAEC,gBAAA,CACA,iBAAA,CAIF,sDACC,UAAA,CAGA,kHAEC,2BAAA,CAIA,+EAEC,kBAAA,CAED,6GAEC,mCAAA,CAKH,mDAEC,wBAAA,CACA,iCAAA,CAEA,4BAAA,CAGA,mFACC,+BAAA,CACA,wGACC,kBAAA,CAKH,4DACC,+BAAA\",\"sourcesContent\":[\"\\n.files-list {\\n\\t--row-height: 55px;\\n\\t--cell-margin: 14px;\\n\\n\\t--checkbox-padding: calc((var(--row-height) - var(--checkbox-size)) / 2);\\n\\t--checkbox-size: 24px;\\n\\t--clickable-area: 44px;\\n\\t--icon-preview-size: 32px;\\n\\n\\tdisplay: block;\\n\\toverflow: auto;\\n\\theight: 100%;\\n\\n\\t&::v-deep {\\n\\t\\t// Table head, body and footer\\n\\t\\ttbody, .vue-recycle-scroller__slot {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tflex-direction: column;\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\t// Necessary for virtual scrolling absolute\\n\\t\\t\\tposition: relative;\\n\\t\\t}\\n\\n\\t\\t// Table header\\n\\t\\t.vue-recycle-scroller__slot[role='thead'] {\\n\\t\\t\\t// Pinned on top when scrolling\\n\\t\\t\\tposition: sticky;\\n\\t\\t\\tz-index: 10;\\n\\t\\t\\ttop: 0;\\n\\t\\t\\theight: var(--row-height);\\n\\t\\t\\tbackground-color: var(--color-main-background);\\n\\t\\t}\\n\\n\\t\\ttr {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\tborder-bottom: 1px solid var(--color-border);\\n\\t\\t}\\n\\n\\t\\ttd, th {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\tflex: 0 0 auto;\\n\\t\\t\\tjustify-content: left;\\n\\t\\t\\twidth: var(--row-height);\\n\\t\\t\\theight: var(--row-height);\\n\\t\\t\\tmargin: 0;\\n\\t\\t\\tpadding: 0;\\n\\t\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t\\t\\tborder: none;\\n\\n\\t\\t\\t// Columns should try to add any text\\n\\t\\t\\t// node wrapped in a span. That should help\\n\\t\\t\\t// with the ellipsis on overflow.\\n\\t\\t\\tspan {\\n\\t\\t\\t\\toverflow: hidden;\\n\\t\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-checkbox {\\n\\t\\t\\tjustify-content: center;\\n\\t\\t\\t.checkbox-radio-switch {\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\tjustify-content: center;\\n\\n\\t\\t\\t\\t--icon-size: var(--checkbox-size);\\n\\n\\t\\t\\t\\tlabel.checkbox-radio-switch__label {\\n\\t\\t\\t\\t\\twidth: var(--clickable-area);\\n\\t\\t\\t\\t\\theight: var(--clickable-area);\\n\\t\\t\\t\\t\\tmargin: 0;\\n\\t\\t\\t\\t\\tpadding: calc((var(--clickable-area) - var(--checkbox-size)) / 2);\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t.checkbox-radio-switch__icon {\\n\\t\\t\\t\\t\\tmargin: 0 !important;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-icon {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\tjustify-content: center;\\n\\t\\t\\twidth: var(--icon-preview-size);\\n\\t\\t\\theight: 100%;\\n\\t\\t\\t// Show same padding as the checkbox right padding for visual balance\\n\\t\\t\\tmargin-right: var(--checkbox-padding);\\n\\t\\t\\tcolor: var(--color-primary-element);\\n\\t\\t\\t// No shrinking or growing allowed\\n\\t\\t\\tflex: 0 0 var(--icon-preview-size);\\n\\n\\t\\t\\t& > span {\\n\\t\\t\\t\\tjustify-content: flex-start;\\n\\t\\t\\t}\\n\\n\\t\\t\\tsvg {\\n\\t\\t\\t\\twidth: var(--icon-preview-size);\\n\\t\\t\\t\\theight: var(--icon-preview-size);\\n\\t\\t\\t}\\n\\n\\t\\t\\t&-preview {\\n\\t\\t\\t\\toverflow: hidden;\\n\\t\\t\\t\\twidth: var(--icon-preview-size);\\n\\t\\t\\t\\theight: var(--icon-preview-size);\\n\\t\\t\\t\\tborder-radius: var(--border-radius);\\n\\t\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\t\\t// Center and contain the preview\\n\\t\\t\\t\\tbackground-position: center;\\n\\t\\t\\t\\tbackground-size: contain;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-name {\\n\\t\\t\\t// Prevent link from overflowing\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\t// Take as much space as possible\\n\\t\\t\\tflex: 1 1 auto;\\n\\n\\t\\t\\ta {\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\talign-items: center;\\n\\t\\t\\t\\t// Fill cell height and width\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\theight: 100%;\\n\\n\\t\\t\\t\\t// Keyboard indicator a11y\\n\\t\\t\\t\\t&:focus .files-list__row-name-text,\\n\\t\\t\\t\\t&:focus-visible .files-list__row-name-text {\\n\\t\\t\\t\\t\\toutline: 2px solid var(--color-main-text) !important;\\n\\t\\t\\t\\t\\tborder-radius: 20px;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t.files-list__row-name-text {\\n\\t\\t\\t\\t// Make some space for the outline\\n\\t\\t\\t\\tpadding: 5px 10px;\\n\\t\\t\\t\\tmargin-left: -10px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-actions {\\n\\t\\t\\twidth: auto;\\n\\n\\t\\t\\t// Add margin to all cells after the actions\\n\\t\\t\\t& ~ td,\\n\\t\\t\\t& ~ th {\\n\\t\\t\\t\\tmargin: 0 var(--cell-margin);\\n\\t\\t\\t}\\n\\n\\t\\t\\tbutton {\\n\\t\\t\\t\\t.button-vue__text {\\n\\t\\t\\t\\t\\t// Remove bold from default button styling\\n\\t\\t\\t\\t\\tfont-weight: normal;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t&:not(:hover, :focus, :active) .button-vue__wrapper {\\n\\t\\t\\t\\t\\t// Also apply color-text-maxcontrast to non-active button\\n\\t\\t\\t\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-size {\\n\\t\\t\\t// Right align text\\n\\t\\t\\tjustify-content: flex-end;\\n\\t\\t\\twidth: calc(var(--row-height) * 1.5);\\n\\t\\t\\t// opacity varies with the size\\n\\t\\t\\tcolor: var(--color-main-text);\\n\\n\\t\\t\\t// Icon is before text since size is right aligned\\n\\t\\t\\t.files-list__column-sort-button {\\n\\t\\t\\t\\tpadding: 0 16px 0 4px !important;\\n\\t\\t\\t\\t.button-vue__wrapper {\\n\\t\\t\\t\\t\\tflex-direction: row;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.files-list__row-column-custom {\\n\\t\\t\\twidth: calc(var(--row-height) * 2);\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-navigation-entry__settings-quota--not-unlimited[data-v-918797b2] .app-navigation-entry__title{margin-top:-4px}.app-navigation-entry__settings-quota progress[data-v-918797b2]{position:absolute;bottom:10px;margin-left:44px;width:calc(100% - 44px - 22px)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/NavigationQuota.vue\"],\"names\":[],\"mappings\":\"AAIC,mGACC,eAAA,CAGD,gEACC,iBAAA,CACA,WAAA,CACA,gBAAA,CACA,8BAAA\",\"sourcesContent\":[\"\\n// User storage stats display\\n.app-navigation-entry__settings-quota {\\n\\t// Align title with progress and icon\\n\\t&--not-unlimited::v-deep .app-navigation-entry__title {\\n\\t\\tmargin-top: -4px;\\n\\t}\\n\\n\\tprogress {\\n\\t\\tposition: absolute;\\n\\t\\tbottom: 10px;\\n\\t\\tmargin-left: 44px;\\n\\t\\twidth: calc(100% - 44px - 22px);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".template-picker__item[data-v-6c072a31]{display:flex}.template-picker__label[data-v-6c072a31]{display:flex;align-items:center;flex:1 1;flex-direction:column}.template-picker__label[data-v-6c072a31],.template-picker__label *[data-v-6c072a31]{cursor:pointer;user-select:none}.template-picker__label[data-v-6c072a31]::before{display:none !important}.template-picker__preview[data-v-6c072a31]{display:block;overflow:hidden;flex:1 1;width:var(--width);min-height:var(--height);max-height:var(--height);padding:0;border:var(--border) solid var(--color-border);border-radius:var(--border-radius-large)}input:checked+label>.template-picker__preview[data-v-6c072a31]{border-color:var(--color-primary)}.template-picker__preview--failed[data-v-6c072a31]{display:flex}.template-picker__image[data-v-6c072a31]{max-width:100%;background-color:var(--color-main-background);object-fit:cover}.template-picker__preview--failed .template-picker__image[data-v-6c072a31]{width:calc(var(--margin)*8);margin:auto;background-color:rgba(0,0,0,0) !important;object-fit:initial}.template-picker__title[data-v-6c072a31]{overflow:hidden;max-width:calc(var(--width) + 4px);padding:var(--margin);white-space:nowrap;text-overflow:ellipsis}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/TemplatePreview.vue\"],\"names\":[],\"mappings\":\"AAGC,wCACC,YAAA,CAGD,yCACC,YAAA,CAEA,kBAAA,CACA,QAAA,CACA,qBAAA,CAEA,oFACC,cAAA,CACA,gBAAA,CAGD,iDACC,uBAAA,CAIF,2CACC,aAAA,CACA,eAAA,CAEA,QAAA,CACA,kBAAA,CACA,wBAAA,CACA,wBAAA,CACA,SAAA,CACA,8CAAA,CACA,wCAAA,CAEA,+DACC,iCAAA,CAGD,mDAEC,YAAA,CAIF,yCACC,cAAA,CACA,6CAAA,CAEA,gBAAA,CAID,2EACC,2BAAA,CAEA,WAAA,CACA,yCAAA,CAEA,kBAAA,CAGD,yCACC,eAAA,CAEA,kCAAA,CACA,qBAAA,CACA,kBAAA,CACA,sBAAA\",\"sourcesContent\":[\"\\n\\n.template-picker {\\n\\t&__item {\\n\\t\\tdisplay: flex;\\n\\t}\\n\\n\\t&__label {\\n\\t\\tdisplay: flex;\\n\\t\\t// Align in the middle of the grid\\n\\t\\talign-items: center;\\n\\t\\tflex: 1 1;\\n\\t\\tflex-direction: column;\\n\\n\\t\\t&, * {\\n\\t\\t\\tcursor: pointer;\\n\\t\\t\\tuser-select: none;\\n\\t\\t}\\n\\n\\t\\t&::before {\\n\\t\\t\\tdisplay: none !important;\\n\\t\\t}\\n\\t}\\n\\n\\t&__preview {\\n\\t\\tdisplay: block;\\n\\t\\toverflow: hidden;\\n\\t\\t// Stretch so all entries are the same width\\n\\t\\tflex: 1 1;\\n\\t\\twidth: var(--width);\\n\\t\\tmin-height: var(--height);\\n\\t\\tmax-height: var(--height);\\n\\t\\tpadding: 0;\\n\\t\\tborder: var(--border) solid var(--color-border);\\n\\t\\tborder-radius: var(--border-radius-large);\\n\\n\\t\\tinput:checked + label > & {\\n\\t\\t\\tborder-color: var(--color-primary);\\n\\t\\t}\\n\\n\\t\\t&--failed {\\n\\t\\t\\t// Make sure to properly center fallback icon\\n\\t\\t\\tdisplay: flex;\\n\\t\\t}\\n\\t}\\n\\n\\t&__image {\\n\\t\\tmax-width: 100%;\\n\\t\\tbackground-color: var(--color-main-background);\\n\\n\\t\\tobject-fit: cover;\\n\\t}\\n\\n\\t// Failed preview, fallback to mime icon\\n\\t&__preview--failed &__image {\\n\\t\\twidth: calc(var(--margin) * 8);\\n\\t\\t// Center mime icon\\n\\t\\tmargin: auto;\\n\\t\\tbackground-color: transparent !important;\\n\\n\\t\\tobject-fit: initial;\\n\\t}\\n\\n\\t&__title {\\n\\t\\toverflow: hidden;\\n\\t\\t// also count preview border\\n\\t\\tmax-width: calc(var(--width) + 2*2px);\\n\\t\\tpadding: var(--margin);\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-content[data-v-77548daf]{display:flex;overflow:hidden;flex-direction:column;max-height:100%}.app-content[data-v-77548daf]:not(.app-content--hidden)+#app-content{display:none}.files-list__header[data-v-77548daf]{display:flex;align-content:center;flex:0 0;margin:4px 4px 4px 50px}.files-list__header>*[data-v-77548daf]{flex:0 0}.files-list__refresh-icon[data-v-77548daf]{flex:0 0 44px;width:44px;height:44px}.files-list__loading-icon[data-v-77548daf]{margin:auto}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/views/FilesList.vue\"],\"names\":[],\"mappings\":\"AACA,8BAEC,YAAA,CACA,eAAA,CACA,qBAAA,CACA,eAAA,CAIA,qEACC,YAAA,CAQD,qCACC,YAAA,CACA,oBAAA,CAEA,QAAA,CAEA,uBAAA,CACA,uCAGC,QAAA,CAGF,2CACC,aAAA,CACA,UAAA,CACA,WAAA,CAED,2CACC,WAAA\",\"sourcesContent\":[\"\\n.app-content {\\n\\t// Virtual list needs to be full height and is scrollable\\n\\tdisplay: flex;\\n\\toverflow: hidden;\\n\\tflex-direction: column;\\n\\tmax-height: 100%;\\n\\n\\t// TODO: remove after all legacy views are migrated\\n\\t// Hides the legacy app-content if shown view is not legacy\\n\\t&:not(&--hidden)::v-deep + #app-content {\\n\\t\\tdisplay: none;\\n\\t}\\n}\\n\\n$margin: 4px;\\n$navigationToggleSize: 50px;\\n\\n.files-list {\\n\\t&__header {\\n\\t\\tdisplay: flex;\\n\\t\\talign-content: center;\\n\\t\\t// Do not grow or shrink (vertically)\\n\\t\\tflex: 0 0;\\n\\t\\t// Align with the navigation toggle icon\\n\\t\\tmargin: $margin $margin $margin $navigationToggleSize;\\n\\t\\t> * {\\n\\t\\t\\t// Do not grow or shrink (horizontally)\\n\\t\\t\\t// Only the breadcrumbs shrinks\\n\\t\\t\\tflex: 0 0;\\n\\t\\t}\\n\\t}\\n\\t&__refresh-icon {\\n\\t\\tflex: 0 0 44px;\\n\\t\\twidth: 44px;\\n\\t\\theight: 44px;\\n\\t}\\n\\t&__loading-icon {\\n\\t\\tmargin: auto;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-navigation[data-v-508e08a4] .app-navigation-entry-icon{background-repeat:no-repeat;background-position:center}.app-navigation>ul.app-navigation__list[data-v-508e08a4]{padding-bottom:var(--default-grid-baseline, 4px)}.app-navigation-entry__settings[data-v-508e08a4]{height:auto !important;overflow:hidden !important;padding-top:0 !important;flex:0 0 auto}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/views/Navigation.vue\"],\"names\":[],\"mappings\":\"AAEA,4DACC,2BAAA,CACA,0BAAA,CAGD,yDAEC,gDAAA,CAGD,iDACC,sBAAA,CACA,0BAAA,CACA,wBAAA,CAEA,aAAA\",\"sourcesContent\":[\"\\n// TODO: remove when https://github.com/nextcloud/nextcloud-vue/pull/3539 is in\\n.app-navigation::v-deep .app-navigation-entry-icon {\\n\\tbackground-repeat: no-repeat;\\n\\tbackground-position: center;\\n}\\n\\n.app-navigation > ul.app-navigation__list {\\n\\t// Use flex gap value for more elegant spacing\\n\\tpadding-bottom: var(--default-grid-baseline, 4px);\\n}\\n\\n.app-navigation-entry__settings {\\n\\theight: auto !important;\\n\\toverflow: hidden !important;\\n\\tpadding-top: 0 !important;\\n\\t// Prevent shrinking or growing\\n\\tflex: 0 0 auto;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".setting-link[data-v-76ca5d1f]:hover{text-decoration:underline}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/views/Settings.vue\"],\"names\":[],\"mappings\":\"AACA,qCACC,yBAAA\",\"sourcesContent\":[\"\\n.setting-link:hover {\\n\\ttext-decoration: underline;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".templates-picker__form[data-v-715b4161]{padding:calc(var(--margin)*2);padding-bottom:0}.templates-picker__form h2[data-v-715b4161]{text-align:center;font-weight:bold;margin:var(--margin) 0 calc(var(--margin)*2)}.templates-picker__list[data-v-715b4161]{display:grid;grid-gap:calc(var(--margin)*2);grid-auto-columns:1fr;max-width:calc(var(--fullwidth)*6);grid-template-columns:repeat(auto-fit, var(--fullwidth));grid-auto-rows:1fr;justify-content:center}.templates-picker__buttons[data-v-715b4161]{display:flex;justify-content:space-between;padding:calc(var(--margin)*2) var(--margin);position:sticky;bottom:0;background-image:linear-gradient(0, var(--gradient-main-background))}.templates-picker__buttons button[data-v-715b4161],.templates-picker__buttons input[type=submit][data-v-715b4161]{height:44px}.templates-picker[data-v-715b4161] .modal-container{position:relative}.templates-picker__loading[data-v-715b4161]{position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;margin:0;background-color:var(--color-main-background-translucent)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/views/TemplatePicker.vue\"],\"names\":[],\"mappings\":\"AAEC,yCACC,6BAAA,CAEA,gBAAA,CAEA,4CACC,iBAAA,CACA,gBAAA,CACA,4CAAA,CAIF,yCACC,YAAA,CACA,8BAAA,CACA,qBAAA,CAEA,kCAAA,CACA,wDAAA,CAEA,kBAAA,CAEA,sBAAA,CAGD,4CACC,YAAA,CACA,6BAAA,CACA,2CAAA,CACA,eAAA,CACA,QAAA,CACA,oEAAA,CAEA,kHACC,WAAA,CAKF,oDACC,iBAAA,CAGD,4CACC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,sBAAA,CACA,UAAA,CACA,WAAA,CACA,QAAA,CACA,yDAAA\",\"sourcesContent\":[\"\\n.templates-picker {\\n\\t&__form {\\n\\t\\tpadding: calc(var(--margin) * 2);\\n\\t\\t// Will be handled by the buttons\\n\\t\\tpadding-bottom: 0;\\n\\n\\t\\th2 {\\n\\t\\t\\ttext-align: center;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tmargin: var(--margin) 0 calc(var(--margin) * 2);\\n\\t\\t}\\n\\t}\\n\\n\\t&__list {\\n\\t\\tdisplay: grid;\\n\\t\\tgrid-gap: calc(var(--margin) * 2);\\n\\t\\tgrid-auto-columns: 1fr;\\n\\t\\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\\n\\t\\tmax-width: calc(var(--fullwidth) * 6);\\n\\t\\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\\n\\t\\t// Make sure all rows are the same height\\n\\t\\tgrid-auto-rows: 1fr;\\n\\t\\t// Center the columns set\\n\\t\\tjustify-content: center;\\n\\t}\\n\\n\\t&__buttons {\\n\\t\\tdisplay: flex;\\n\\t\\tjustify-content: space-between;\\n\\t\\tpadding: calc(var(--margin) * 2) var(--margin);\\n\\t\\tposition: sticky;\\n\\t\\tbottom: 0;\\n\\t\\tbackground-image: linear-gradient(0, var(--gradient-main-background));\\n\\n\\t\\tbutton, input[type='submit'] {\\n\\t\\t\\theight: 44px;\\n\\t\\t}\\n\\t}\\n\\n\\t// Make sure we're relative for the loading emptycontent on top\\n\\t::v-deep .modal-container {\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\t&__loading {\\n\\t\\tposition: absolute;\\n\\t\\ttop: 0;\\n\\t\\tleft: 0;\\n\\t\\tjustify-content: center;\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\t\\tmargin: 0;\\n\\t\\tbackground-color: var(--color-main-background-translucent);\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n/* @keyframes preview-gradient-fade {\\n 0% {\\n opacity: 1;\\n }\\n 50% {\\n opacity: 0.5;\\n }\\n 100% {\\n opacity: 1;\\n }\\n} */\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/FileEntry.vue\"],\"names\":[],\"mappings\":\";AAmjBA;;;;;;;;;;GAUA\",\"sourcesContent\":[\"<!--\\n - @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\\n -\\n - @author John Molakvoæ <skjnldsv@protonmail.com>\\n -\\n - @license GNU AGPL version 3 or any later version\\n -\\n - This program is free software: you can redistribute it and/or modify\\n - it under the terms of the GNU Affero General Public License as\\n - published by the Free Software Foundation, either version 3 of the\\n - License, or (at your option) any later version.\\n -\\n - This program is distributed in the hope that it will be useful,\\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n - GNU Affero General Public License for more details.\\n -\\n - You should have received a copy of the GNU Affero General Public License\\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\\n -\\n -->\\n\\n<template>\\n\\t<Fragment>\\n\\t\\t<td class=\\\"files-list__row-checkbox\\\">\\n\\t\\t\\t<NcCheckboxRadioSwitch v-if=\\\"active\\\"\\n\\t\\t\\t\\t:aria-label=\\\"t('files', 'Select the row for {displayName}', { displayName })\\\"\\n\\t\\t\\t\\t:checked=\\\"selectedFiles\\\"\\n\\t\\t\\t\\t:value=\\\"fileid\\\"\\n\\t\\t\\t\\tname=\\\"selectedFiles\\\"\\n\\t\\t\\t\\t@update:checked=\\\"onSelectionChange\\\" />\\n\\t\\t</td>\\n\\n\\t\\t<!-- Link to file -->\\n\\t\\t<td class=\\\"files-list__row-name\\\">\\n\\t\\t\\t<a ref=\\\"name\\\" v-bind=\\\"linkTo\\\">\\n\\t\\t\\t\\t<!-- Icon or preview -->\\n\\t\\t\\t\\t<span class=\\\"files-list__row-icon\\\">\\n\\t\\t\\t\\t\\t<FolderIcon v-if=\\\"source.type === 'folder'\\\" />\\n\\n\\t\\t\\t\\t\\t<!-- Decorative image, should not be aria documented -->\\n\\t\\t\\t\\t\\t<span v-else-if=\\\"previewUrl && !backgroundFailed\\\"\\n\\t\\t\\t\\t\\t\\tref=\\\"previewImg\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"files-list__row-icon-preview\\\"\\n\\t\\t\\t\\t\\t\\t:style=\\\"{ backgroundImage }\\\" />\\n\\n\\t\\t\\t\\t\\t<span v-else-if=\\\"mimeIconUrl\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"files-list__row-icon-preview files-list__row-icon-preview--mime\\\"\\n\\t\\t\\t\\t\\t\\t:style=\\\"{ backgroundImage: mimeIconUrl }\\\" />\\n\\n\\t\\t\\t\\t\\t<FileIcon v-else />\\n\\t\\t\\t\\t</span>\\n\\n\\t\\t\\t\\t<!-- File name -->\\n\\t\\t\\t\\t<span class=\\\"files-list__row-name-text\\\">{{ displayName }}</span>\\n\\t\\t\\t</a>\\n\\t\\t</td>\\n\\n\\t\\t<!-- Actions -->\\n\\t\\t<td :class=\\\"`files-list__row-actions-${uniqueId}`\\\" class=\\\"files-list__row-actions\\\">\\n\\t\\t\\t<!-- Inline actions -->\\n\\t\\t\\t<!-- TODO: implement CustomElementRender -->\\n\\n\\t\\t\\t<!-- Menu actions -->\\n\\t\\t\\t<NcActions v-if=\\\"active\\\"\\n\\t\\t\\t\\tref=\\\"actionsMenu\\\"\\n\\t\\t\\t\\t:disabled=\\\"source._loading\\\"\\n\\t\\t\\t\\t:force-title=\\\"true\\\"\\n\\t\\t\\t\\t:inline=\\\"enabledInlineActions.length\\\"\\n\\t\\t\\t\\t:open.sync=\\\"openedMenu\\\">\\n\\t\\t\\t\\t<NcActionButton v-for=\\\"action in enabledMenuActions\\\"\\n\\t\\t\\t\\t\\t:key=\\\"action.id\\\"\\n\\t\\t\\t\\t\\t:class=\\\"'files-list__row-action-' + action.id\\\"\\n\\t\\t\\t\\t\\t@click=\\\"onActionClick(action)\\\">\\n\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t<NcLoadingIcon v-if=\\\"loading === action.id\\\" :size=\\\"18\\\" />\\n\\t\\t\\t\\t\\t\\t<CustomSvgIconRender v-else :svg=\\\"action.iconSvgInline([source], currentView)\\\" />\\n\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t\\t{{ action.displayName([source], currentView) }}\\n\\t\\t\\t\\t</NcActionButton>\\n\\t\\t\\t</NcActions>\\n\\t\\t</td>\\n\\n\\t\\t<!-- Size -->\\n\\t\\t<td v-if=\\\"isSizeAvailable\\\"\\n\\t\\t\\t:style=\\\"{ opacity: sizeOpacity }\\\"\\n\\t\\t\\tclass=\\\"files-list__row-size\\\">\\n\\t\\t\\t<span>{{ size }}</span>\\n\\t\\t</td>\\n\\n\\t\\t<!-- View columns -->\\n\\t\\t<td v-for=\\\"column in columns\\\"\\n\\t\\t\\t:key=\\\"column.id\\\"\\n\\t\\t\\t:class=\\\"`files-list__row-${currentView?.id}-${column.id}`\\\"\\n\\t\\t\\tclass=\\\"files-list__row-column-custom\\\">\\n\\t\\t\\t<CustomElementRender v-if=\\\"active\\\"\\n\\t\\t\\t\\t:current-view=\\\"currentView\\\"\\n\\t\\t\\t\\t:render=\\\"column.render\\\"\\n\\t\\t\\t\\t:source=\\\"source\\\" />\\n\\t\\t</td>\\n\\t</Fragment>\\n</template>\\n\\n<script lang='ts'>\\nimport { debounce } from 'debounce'\\nimport { formatFileSize } from '@nextcloud/files'\\nimport { Fragment } from 'vue-frag'\\nimport { join } from 'path'\\nimport { showError, showSuccess } from '@nextcloud/dialogs'\\nimport { translate } from '@nextcloud/l10n'\\nimport CancelablePromise from 'cancelable-promise'\\nimport FileIcon from 'vue-material-design-icons/File.vue'\\nimport FolderIcon from 'vue-material-design-icons/Folder.vue'\\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\\nimport Vue from 'vue'\\n\\nimport { getFileActions } from '../services/FileAction.ts'\\nimport { isCachedPreview } from '../services/PreviewService.ts'\\nimport { useActionsMenuStore } from '../store/actionsmenu.ts'\\nimport { useFilesStore } from '../store/files.ts'\\nimport { useKeyboardStore } from '../store/keyboard.ts'\\nimport { useSelectionStore } from '../store/selection.ts'\\nimport { useUserConfigStore } from '../store/userconfig.ts'\\nimport CustomElementRender from './CustomElementRender.vue'\\nimport CustomSvgIconRender from './CustomSvgIconRender.vue'\\nimport logger from '../logger.js'\\n\\n// The registered actions list\\nconst actions = getFileActions()\\n\\nexport default Vue.extend({\\n\\tname: 'FileEntry',\\n\\n\\tcomponents: {\\n\\t\\tCustomElementRender,\\n\\t\\tCustomSvgIconRender,\\n\\t\\tFileIcon,\\n\\t\\tFolderIcon,\\n\\t\\tFragment,\\n\\t\\tNcActionButton,\\n\\t\\tNcActions,\\n\\t\\tNcCheckboxRadioSwitch,\\n\\t\\tNcLoadingIcon,\\n\\t},\\n\\n\\tprops: {\\n\\t\\tactive: {\\n\\t\\t\\ttype: Boolean,\\n\\t\\t\\tdefault: false,\\n\\t\\t},\\n\\t\\tisSizeAvailable: {\\n\\t\\t\\ttype: Boolean,\\n\\t\\t\\tdefault: false,\\n\\t\\t},\\n\\t\\tsource: {\\n\\t\\t\\ttype: Object,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t\\tindex: {\\n\\t\\t\\ttype: Number,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t\\tnodes: {\\n\\t\\t\\ttype: Array,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t\\tfilesListWidth: {\\n\\t\\t\\ttype: Number,\\n\\t\\t\\tdefault: 0,\\n\\t\\t},\\n\\t},\\n\\n\\tsetup() {\\n\\t\\tconst actionsMenuStore = useActionsMenuStore()\\n\\t\\tconst filesStore = useFilesStore()\\n\\t\\tconst keyboardStore = useKeyboardStore()\\n\\t\\tconst selectionStore = useSelectionStore()\\n\\t\\tconst userConfigStore = useUserConfigStore()\\n\\t\\treturn {\\n\\t\\t\\tactionsMenuStore,\\n\\t\\t\\tfilesStore,\\n\\t\\t\\tkeyboardStore,\\n\\t\\t\\tselectionStore,\\n\\t\\t\\tuserConfigStore,\\n\\t\\t}\\n\\t},\\n\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tbackgroundFailed: false,\\n\\t\\t\\tbackgroundImage: '',\\n\\t\\t\\tloading: '',\\n\\t\\t}\\n\\t},\\n\\n\\tcomputed: {\\n\\t\\tuserConfig() {\\n\\t\\t\\treturn this.userConfigStore.userConfig\\n\\t\\t},\\n\\n\\t\\tcurrentView() {\\n\\t\\t\\treturn this.$navigation.active\\n\\t\\t},\\n\\n\\t\\tcolumns() {\\n\\t\\t\\t// Hide columns if the list is too small\\n\\t\\t\\tif (this.filesListWidth < 512) {\\n\\t\\t\\t\\treturn []\\n\\t\\t\\t}\\n\\t\\t\\treturn this.currentView?.columns || []\\n\\t\\t},\\n\\n\\t\\tdir() {\\n\\t\\t\\t// Remove any trailing slash but leave root slash\\n\\t\\t\\treturn (this.$route?.query?.dir || '/').replace(/^(.+)\\\\/$/, '$1')\\n\\t\\t},\\n\\n\\t\\tfileid() {\\n\\t\\t\\treturn this.source?.fileid?.toString?.()\\n\\t\\t},\\n\\t\\tdisplayName() {\\n\\t\\t\\treturn this.source.attributes.displayName\\n\\t\\t\\t\\t|| this.source.basename\\n\\t\\t},\\n\\t\\tsize() {\\n\\t\\t\\tconst size = parseInt(this.source.size, 10) || 0\\n\\t\\t\\tif (typeof size !== 'number' || size < 0) {\\n\\t\\t\\t\\treturn this.t('files', 'Pending')\\n\\t\\t\\t}\\n\\t\\t\\treturn formatFileSize(size, true)\\n\\t\\t},\\n\\n\\t\\tsizeOpacity() {\\n\\t\\t\\tconst size = parseInt(this.source.size, 10) || 0\\n\\t\\t\\tif (!size || size < 0) {\\n\\t\\t\\t\\treturn 1\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Whatever theme is active, the contrast will pass WCAG AA\\n\\t\\t\\t// with color main text over main background and an opacity of 0.7\\n\\t\\t\\tconst minOpacity = 0.7\\n\\t\\t\\tconst maxOpacitySize = 10 * 1024 * 1024\\n\\t\\t\\treturn minOpacity + (1 - minOpacity) * Math.pow((this.source.size / maxOpacitySize), 2)\\n\\t\\t},\\n\\n\\t\\tlinkTo() {\\n\\t\\t\\tif (this.source.type === 'folder') {\\n\\t\\t\\t\\tconst to = { ...this.$route, query: { dir: join(this.dir, this.source.basename) } }\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\tis: 'router-link',\\n\\t\\t\\t\\t\\ttitle: this.t('files', 'Open folder {name}', { name: this.displayName }),\\n\\t\\t\\t\\t\\tto,\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn {\\n\\t\\t\\t\\thref: this.source.source,\\n\\t\\t\\t\\t// TODO: Use first action title ?\\n\\t\\t\\t\\ttitle: this.t('files', 'Download file {name}', { name: this.displayName }),\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tselectedFiles() {\\n\\t\\t\\treturn this.selectionStore.selected\\n\\t\\t},\\n\\t\\tisSelected() {\\n\\t\\t\\treturn this.selectedFiles.includes(this.source?.fileid?.toString?.())\\n\\t\\t},\\n\\n\\t\\tcropPreviews() {\\n\\t\\t\\treturn this.userConfig.crop_image_previews\\n\\t\\t},\\n\\n\\t\\tpreviewUrl() {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tconst url = new URL(window.location.origin + this.source.attributes.previewUrl)\\n\\t\\t\\t\\t// Request tiny previews\\n\\t\\t\\t\\turl.searchParams.set('x', '32')\\n\\t\\t\\t\\turl.searchParams.set('y', '32')\\n\\t\\t\\t\\t// Handle cropping\\n\\t\\t\\t\\turl.searchParams.set('a', this.cropPreviews === true ? '1' : '0')\\n\\t\\t\\t\\treturn url.href\\n\\t\\t\\t} catch (e) {\\n\\t\\t\\t\\treturn null\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tmimeIconUrl() {\\n\\t\\t\\tconst mimeType = this.source.mime || 'application/octet-stream'\\n\\t\\t\\tconst mimeIconUrl = window.OC?.MimeType?.getIconUrl?.(mimeType)\\n\\t\\t\\tif (mimeIconUrl) {\\n\\t\\t\\t\\treturn `url(${mimeIconUrl})`\\n\\t\\t\\t}\\n\\t\\t\\treturn ''\\n\\t\\t},\\n\\n\\t\\tenabledActions() {\\n\\t\\t\\treturn actions\\n\\t\\t\\t\\t.filter(action => !action.enabled || action.enabled([this.source], this.currentView))\\n\\t\\t\\t\\t.sort((a, b) => (a.order || 0) - (b.order || 0))\\n\\t\\t},\\n\\n\\t\\tenabledInlineActions() {\\n\\t\\t\\tif (this.filesListWidth < 768) {\\n\\t\\t\\t\\treturn []\\n\\t\\t\\t}\\n\\t\\t\\treturn this.enabledActions.filter(action => action?.inline?.(this.source, this.currentView))\\n\\t\\t},\\n\\n\\t\\tenabledMenuActions() {\\n\\t\\t\\tif (this.filesListWidth < 768) {\\n\\t\\t\\t\\treturn this.enabledActions\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn [\\n\\t\\t\\t\\t...this.enabledInlineActions,\\n\\t\\t\\t\\t...this.enabledActions.filter(action => !action.inline),\\n\\t\\t\\t]\\n\\t\\t},\\n\\n\\t\\tuniqueId() {\\n\\t\\t\\treturn this.hashCode(this.source.source)\\n\\t\\t},\\n\\n\\t\\topenedMenu: {\\n\\t\\t\\tget() {\\n\\t\\t\\t\\treturn this.actionsMenuStore.opened === this.uniqueId\\n\\t\\t\\t},\\n\\t\\t\\tset(opened) {\\n\\t\\t\\t\\tthis.actionsMenuStore.opened = opened ? this.uniqueId : null\\n\\t\\t\\t},\\n\\t\\t},\\n\\t},\\n\\n\\twatch: {\\n\\t\\tactive(active, before) {\\n\\t\\t\\tif (active === false && before === true) {\\n\\t\\t\\t\\tthis.resetState()\\n\\n\\t\\t\\t\\t// When the row is not active anymore\\n\\t\\t\\t\\t// remove the display from the row to prevent\\n\\t\\t\\t\\t// keyboard interaction with it.\\n\\t\\t\\t\\tthis.$el.parentNode.style.display = 'none'\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Restore default tabindex\\n\\t\\t\\tthis.$el.parentNode.style.display = ''\\n\\t\\t},\\n\\n\\t\\t/**\\n\\t\\t * When the source changes, reset the preview\\n\\t\\t * and fetch the new one.\\n\\t\\t */\\n\\t\\tpreviewUrl() {\\n\\t\\t\\tthis.clearImg()\\n\\t\\t\\tthis.debounceIfNotCached()\\n\\t\\t},\\n\\t},\\n\\n\\t/**\\n\\t * The row is mounted once and reused as we scroll.\\n\\t */\\n\\tmounted() {\\n\\t\\t// ⚠ Init the debounce function on mount and\\n\\t\\t// not when the module is imported to\\n\\t\\t// avoid sharing between recycled components\\n\\t\\tthis.debounceGetPreview = debounce(function() {\\n\\t\\t\\tthis.fetchAndApplyPreview()\\n\\t\\t}, 150, false)\\n\\n\\t\\t// Fetch the preview on init\\n\\t\\tthis.debounceIfNotCached()\\n\\n\\t\\t// Right click watcher on tr\\n\\t\\tthis.$el.parentNode?.addEventListener?.('contextmenu', this.onRightClick)\\n\\t},\\n\\n\\tbeforeDestroy() {\\n\\t\\tthis.resetState()\\n\\t},\\n\\n\\tmethods: {\\n\\t\\tasync debounceIfNotCached() {\\n\\t\\t\\tif (!this.previewUrl) {\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Check if we already have this preview cached\\n\\t\\t\\tconst isCached = await isCachedPreview(this.previewUrl)\\n\\t\\t\\tif (isCached) {\\n\\t\\t\\t\\tthis.backgroundImage = `url(${this.previewUrl})`\\n\\t\\t\\t\\tthis.backgroundFailed = false\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\t// We don't have this preview cached or it expired, requesting it\\n\\t\\t\\tthis.debounceGetPreview()\\n\\t\\t},\\n\\n\\t\\tfetchAndApplyPreview() {\\n\\t\\t\\t// Ignore if no preview\\n\\t\\t\\tif (!this.previewUrl) {\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If any image is being processed, reset it\\n\\t\\t\\tif (this.previewPromise) {\\n\\t\\t\\t\\tthis.clearImg()\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Store the promise to be able to cancel it\\n\\t\\t\\tthis.previewPromise = new CancelablePromise((resolve, reject, onCancel) => {\\n\\t\\t\\t\\tconst img = new Image()\\n\\t\\t\\t\\t// If active, load the preview with higher priority\\n\\t\\t\\t\\timg.fetchpriority = this.active ? 'high' : 'auto'\\n\\t\\t\\t\\timg.onload = () => {\\n\\t\\t\\t\\t\\tthis.backgroundImage = `url(${this.previewUrl})`\\n\\t\\t\\t\\t\\tthis.backgroundFailed = false\\n\\t\\t\\t\\t\\tresolve(img)\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\timg.onerror = () => {\\n\\t\\t\\t\\t\\tthis.backgroundFailed = true\\n\\t\\t\\t\\t\\treject(img)\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\timg.src = this.previewUrl\\n\\n\\t\\t\\t\\t// Image loading has been canceled\\n\\t\\t\\t\\tonCancel(() => {\\n\\t\\t\\t\\t\\timg.onerror = null\\n\\t\\t\\t\\t\\timg.onload = null\\n\\t\\t\\t\\t\\timg.src = ''\\n\\t\\t\\t\\t})\\n\\t\\t\\t})\\n\\t\\t},\\n\\n\\t\\tresetState() {\\n\\t\\t\\t// Reset loading state\\n\\t\\t\\tthis.loading = ''\\n\\n\\t\\t\\t// Reset the preview\\n\\t\\t\\tthis.clearImg()\\n\\n\\t\\t\\t// Close menu\\n\\t\\t\\tthis.openedMenu = false\\n\\t\\t},\\n\\n\\t\\tclearImg() {\\n\\t\\t\\tthis.backgroundImage = ''\\n\\t\\t\\tthis.backgroundFailed = false\\n\\n\\t\\t\\tif (this.previewPromise) {\\n\\t\\t\\t\\tthis.previewPromise.cancel()\\n\\t\\t\\t\\tthis.previewPromise = null\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\thashCode(str) {\\n\\t\\t\\tlet hash = 0\\n\\t\\t\\tfor (let i = 0, len = str.length; i < len; i++) {\\n\\t\\t\\t\\tconst chr = str.charCodeAt(i)\\n\\t\\t\\t\\thash = (hash << 5) - hash + chr\\n\\t\\t\\t\\thash |= 0 // Convert to 32bit integer\\n\\t\\t\\t}\\n\\t\\t\\treturn hash\\n\\t\\t},\\n\\n\\t\\tasync onActionClick(action) {\\n\\t\\t\\tconst displayName = action.displayName([this.source], this.currentView)\\n\\t\\t\\ttry {\\n\\t\\t\\t\\t// Set the loading marker\\n\\t\\t\\t\\tthis.loading = action.id\\n\\t\\t\\t\\tVue.set(this.source, '_loading', true)\\n\\n\\t\\t\\t\\tconst success = await action.exec(this.source, this.currentView)\\n\\t\\t\\t\\tif (success) {\\n\\t\\t\\t\\t\\tshowSuccess(this.t('files', '\\\"{displayName}\\\" action executed successfully', { displayName }))\\n\\t\\t\\t\\t\\treturn\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tshowError(this.t('files', '\\\"{displayName}\\\" action failed', { displayName }))\\n\\t\\t\\t} catch (e) {\\n\\t\\t\\t\\tlogger.error('Error while executing action', { action, e })\\n\\t\\t\\t\\tshowError(this.t('files', '\\\"{displayName}\\\" action failed', { displayName }))\\n\\t\\t\\t} finally {\\n\\t\\t\\t\\t// Reset the loading marker\\n\\t\\t\\t\\tthis.loading = ''\\n\\t\\t\\t\\tVue.set(this.source, '_loading', false)\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tonSelectionChange(selection) {\\n\\t\\t\\tconst newSelectedIndex = this.index\\n\\t\\t\\tconst lastSelectedIndex = this.selectionStore.lastSelectedIndex\\n\\n\\t\\t\\t// Get the last selected and select all files in between\\n\\t\\t\\tif (this.keyboardStore?.shiftKey && lastSelectedIndex !== null) {\\n\\t\\t\\t\\tconst isAlreadySelected = this.selectedFiles.includes(this.fileid)\\n\\n\\t\\t\\t\\tconst start = Math.min(newSelectedIndex, lastSelectedIndex)\\n\\t\\t\\t\\tconst end = Math.max(lastSelectedIndex, newSelectedIndex)\\n\\n\\t\\t\\t\\tconst lastSelection = this.selectionStore.lastSelection\\n\\t\\t\\t\\tconst filesToSelect = this.nodes\\n\\t\\t\\t\\t\\t.map(file => file.fileid?.toString?.())\\n\\t\\t\\t\\t\\t.slice(start, end + 1)\\n\\n\\t\\t\\t\\t// If already selected, update the new selection _without_ the current file\\n\\t\\t\\t\\tconst selection = [...lastSelection, ...filesToSelect]\\n\\t\\t\\t\\t\\t.filter(fileId => !isAlreadySelected || fileId !== this.fileid)\\n\\n\\t\\t\\t\\tlogger.debug('Shift key pressed, selecting all files in between', { start, end, filesToSelect, isAlreadySelected })\\n\\t\\t\\t\\t// Keep previous lastSelectedIndex to be use for further shift selections\\n\\t\\t\\t\\tthis.selectionStore.set(selection)\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\tlogger.debug('Updating selection', { selection })\\n\\t\\t\\tthis.selectionStore.set(selection)\\n\\t\\t\\tthis.selectionStore.setLastIndex(newSelectedIndex)\\n\\t\\t},\\n\\n\\t\\t// Open the actions menu on right click\\n\\t\\tonRightClick(event) {\\n\\t\\t\\t// If already opened, fallback to default browser\\n\\t\\t\\tif (this.openedMenu) {\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If the clicked row is in the selection, open global menu\\n\\t\\t\\tconst isMoreThanOneSelected = this.selectedFiles.length > 1\\n\\t\\t\\tthis.actionsMenuStore.opened = this.isSelected && isMoreThanOneSelected ? 'global' : this.uniqueId\\n\\n\\t\\t\\t// Prevent any browser defaults\\n\\t\\t\\tevent.preventDefault()\\n\\t\\t\\tevent.stopPropagation()\\n\\t\\t},\\n\\n\\t\\tt: translate,\\n\\t\\tformatFileSize,\\n\\t},\\n})\\n</script>\\n\\n<style scoped lang='scss'>\\n/* Hover effect on tbody lines only */\\ntr {\\n\\t&:hover,\\n\\t&:focus,\\n\\t&:active {\\n\\t\\tbackground-color: var(--color-background-dark);\\n\\t}\\n}\\n\\n/* Preview not loaded animation effect */\\n.files-list__row-icon-preview:not([style*='background']) {\\n background: var(--color-loading-dark);\\n\\t// animation: preview-gradient-fade 1.2s ease-in-out infinite;\\n}\\n</style>\\n\\n<style>\\n/* @keyframes preview-gradient-fade {\\n 0% {\\n opacity: 1;\\n }\\n 50% {\\n opacity: 0.5;\\n }\\n 100% {\\n opacity: 1;\\n }\\n} */\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 2181;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t2181: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], () => (__webpack_require__(7867)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","getCurrentDirectory","currentDirInfo","OCA","Files","App","currentFileList","dirInfo","path","name","replace","previewWidth","inheritAttrs","props","basename","type","required","checked","default","fileid","filename","previewUrl","hasPreview","mime","ratio","data","failedPreview","computed","nameWithoutExt","id","realPreviewUrl","getCurrentUser","document","getElementById","value","pathSections","startsWith","split","relativePath","forEach","section","encodeURIComponent","mimeIcon","methods","onCheck","onFailure","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_c","_self","staticClass","attrs","domProps","on","_v","class","_s","components","NcEmptyContent","NcModal","TemplatePreview","logger","loading","opened","provider","emptyTemplate","selectedTemplate","style","margin","async","axios","generateOcsUrl","ocs","close","extension","filePath","templatePath","templateType","normalize","filesClient","fileAction","$file","dir","fileList","fileActions","fileInfoModel","console","showError","$event","preventDefault","stopPropagation","onSubmit","apply","arguments","t","_b","_l","templates","template","key","_e","getLoggerBuilder","setApp","detectUser","build","Vue","n","TemplatePickerRoot","createElement","body","appendChild","loadState","templatesPath","debug","TemplatePicker","TemplatePickerView","propsData","$mount","window","addEventListener","initTemplatesPlugin","attach","menu","addMenuEntry","displayName","templateName","iconClass","fileType","actionHandler","initTemplatesFolder","removeMenuEntry","OC","Plugins","register","index","newTemplatePlugin","app","label","open","response","copySystemTemplates","changeDirectory","template_path","error","FilesPlugin","subscribe","query","setFilter","getFileActions","_nc_fileactions","action","constructor","validateAction","_action","iconSvgInline","enabled","exec","execBatch","order","inline","renderInline","Error","nodes","view","TrashCan","length","map","node","permissions","every","permission","Permission","source","emit","Promise","all","find","search","push","registerLegacyView","icon","parent","classes","expanded","params","OCP","Navigation","legacy","sticky","includes","isValidNavigation","isUniqueNavigation","_views","e","message","views","setActive","_currentView","active","getContents","isSvg","columns","isValidColumn","emptyView","defaultSortKey","column","title","render","sort","summary","viewConfig","useViewConfigStore","store","defineStore","state","getters","getConfig","actions","onUpdate","generateUrl","setSortingBy","update","toggleSortingDirection","newDirection","sorting_direction","viewConfigStore","_initialized","ChartPie","NcAppNavigationItem","NcProgressBar","loadingStorageStats","storageStats","storageStatsTitle","usedQuotaByte","used","quota","storageStatsTooltip","beforeMount","setInterval","debounceUpdateStorageStats","throttleUpdateStorageStats","slot","relative","Math","min","el","mounted","userConfig","show_hidden","crop_image_previews","useUserConfigStore","userConfigStore","Clipboard","NcAppSettingsDialog","NcAppSettingsSection","NcCheckboxRadioSwitch","NcInputField","Setting","setup","settings","webdavUrl","webdavDocs","appPasswordUrl","webdavUrlCopied","beforeDestroy","onClose","setConfig","showSuccess","setTimeout","setting","target","select","copyCloudId","scopedSlots","_u","fn","proxy","Cog","NavigationQuota","NcAppNavigation","NcIconSvgWrapper","SettingsModal","settingsOpened","currentViewId","currentView","parentViews","filter","childViews","reduce","list","watch","showView","newAppContent","itemId","heading","headingEl","textContent","setPageHeading","onLegacyNavigationChanged","onToggleExpand","isExpanded","generateToNavigation","openSettings","onSettingsClose","child","useFilesStore","fileStore","files","roots","getNode","getNodes","ids","Boolean","getRoot","service","updateNodes","acc","attributes","deleteNodes","setRoot","root","onDeletedNode","usePathsStore","pathsStore","getPath","addPath","payload","useSelectionStore","selected","lastSelection","lastSelectedIndex","set","selection","setLastIndex","reset","Home","NcBreadcrumbs","NcBreadcrumb","filesStore","dirs","sections","exact","to","getNodeFromId","getFileIdFromPath","getDirDisplayName","onClick","ariaLabel","_setupProxy","nativeOn","useActionsMenuStore","element","svg","CustomElementRender","CustomSvgIconRender","FileIcon","FolderIcon","Fragment","NcActionButton","NcActions","NcLoadingIcon","isSizeAvailable","Object","Number","Array","filesListWidth","actionsMenuStore","keyboardStore","altKey","ctrlKey","metaKey","shiftKey","onEvent","event","useKeyboardStore","selectionStore","backgroundFailed","backgroundImage","$navigation","$route","toString","size","parseInt","formatFileSize","sizeOpacity","pow","linkTo","join","is","href","selectedFiles","isSelected","cropPreviews","url","URL","location","origin","searchParams","mimeIconUrl","mimeType","MimeType","getIconUrl","enabledActions","a","b","enabledInlineActions","enabledMenuActions","uniqueId","hashCode","openedMenu","get","before","resetState","$el","parentNode","display","clearImg","debounceIfNotCached","debounceGetPreview","debounce","fetchAndApplyPreview","onRightClick","caches","then","cache","match","previewPromise","CancelablePromise","resolve","reject","onCancel","img","Image","fetchpriority","onload","onerror","src","cancel","str","hash","i","len","charCodeAt","onSelectionChange","newSelectedIndex","isAlreadySelected","start","end","max","filesToSelect","file","slice","fileId","isMoreThanOneSelected","translate","ref","_loading","onActionClick","opacity","String","currentFolder","totalSize","total","classForColumn","created","fileListEl","querySelector","$resizeObserver","ResizeObserver","entries","contentRect","width","observe","disconnect","mixins","filesListWidthMixin","selectedNodes","areSomeNodesLoading","some","inlineActions","selectionIds","results","result","failedIds","mapState","sortingMode","sorting_mode","isAscSorting","toggleSortBy","MenuDown","MenuUp","NcButton","filesSortingMixin","mode","sortAriaLabel","direction","FilesListHeaderButton","FilesListHeaderActions","selectAllBind","isNoneSelected","isSomeSelected","isAllSelected","indeterminate","onToggleAll","RecycleScroller","FileEntry","FilesListHeader","FilesListFooter","summaryFile","count","translatePlural","summaryFolder","undefined","slots","querySelectorAll","setAttribute","getFileId","item","caption","BreadCrumbs","FilesListVirtual","NcAppContent","promise","dirContents","customColumn","_children","reverse","orderBy","v","isEmptyDir","isRefreshing","toPreviousDir","newView","oldView","fetchContent","newDir","oldDir","$refs","filesListVirtual","scrollTop","folder","contents","directives","rawName","expression","Router","base","linkActiveClass","routes","alias","stringifyQuery","stringify","PiniaVuePlugin","pinia","createPinia","NavigationService","assign","Settings","_settings","_name","_el","_open","_close","NavigationView","router","FilesListView","legacyViews","values","sublist","subview","processLegacyFilesViews","navigator","noRewrite","registration","serviceWorker","scope","___CSS_LOADER_EXPORT___","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","loaded","__webpack_modules__","call","m","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","keys","splice","r","getter","__esModule","d","definition","o","defineProperty","enumerable","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","baseURI","self","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file diff --git a/dist/files_trashbin-main.js b/dist/files_trashbin-main.js index bf56d0766c7..474074b99c8 100644 --- a/dist/files_trashbin-main.js +++ b/dist/files_trashbin-main.js @@ -1,3 +1,3 @@ /*! For license information please see files_trashbin-main.js.LICENSE.txt */ -(()=>{var e,t={95761:(e,t,n)=>{"use strict";var i,s=n(31352),r=n(61137),o=n(80351),a=n.n(o),l=n(45994),d=n(91770),c=n(79753),u=n(14596);const j="/trashbin/".concat(null===(i=(0,l.ts)())||void 0===i?void 0:i.uid,"/trash"),f=(0,c.generateRemoteUrl)("dav"+j),h=(0,u.eI)(f,{headers:{requesttoken:(0,l.IH)()}}),m='<?xml version="1.0"?>\n<d:propfind xmlns:d="DAV:"\n\txmlns:oc="http://owncloud.org/ns"\n\txmlns:nc="http://nextcloud.org/ns">\n\t<d:prop>\n\t\t<nc:trashbin-filename />\n\t\t<nc:trashbin-deletion-time />\n\t\t<nc:trashbin-original-location />\n\t\t<nc:trashbin-title />\n\t\t<d:getlastmodified />\n\t\t<d:getetag />\n\t\t<d:getcontenttype />\n\t\t<d:resourcetype />\n\t\t<oc:fileid />\n\t\t<oc:permissions />\n\t\t<oc:size />\n\t\t<d:getcontentlength />\n\t</d:prop>\n</d:propfind>',v=function(e){var t,n,i,s,r;const o=(0,d.wE)(null===(t=e.props)||void 0===t?void 0:t.permissions),a=null===(n=(0,l.ts)())||void 0===n?void 0:n.uid,u=(0,c.generateUrl)("/apps/files_trashbin/preview?fileId={fileid}&x=32&y=32",e.props),f={id:(null===(i=e.props)||void 0===i?void 0:i.fileid)||0,source:(0,c.generateRemoteUrl)("dav"+j+e.filename),mtime:new Date(e.lastmod),mime:e.mime,size:(null===(s=e.props)||void 0===s?void 0:s.size)||0,permissions:o,owner:a,root:j,attributes:{...e,...e.props,displayName:null===(r=e.props)||void 0===r?void 0:r["trashbin-filename"],previewUrl:u}};return"file"===e.type?new d.$B(f):new d.gt(f)};var p=n(78595),b=n(4820),g=n(64009);const y=(0,n(17499).IY)().setApp("files").detectUser().build();var w;w=new class{constructor(e){var t,n,i;t=this,i=void 0,(n=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:String(t)}(n="_action"))in t?Object.defineProperty(t,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[n]=i,this.validateAction(e),this._action=e}get id(){return this._action.id}get displayName(){return this._action.displayName}get iconSvgInline(){return this._action.iconSvgInline}get enabled(){return this._action.enabled}get exec(){return this._action.exec}get execBatch(){return this._action.execBatch}get order(){return this._action.order}get default(){return this._action.default}get inline(){return this._action.inline}get renderInline(){return this._action.renderInline}validateAction(e){if(!e.id||"string"!=typeof e.id)throw new Error("Invalid id");if(!e.displayName||"function"!=typeof e.displayName)throw new Error("Invalid displayName function");if(!e.iconSvgInline||"function"!=typeof e.iconSvgInline)throw new Error("Invalid iconSvgInline function");if(!e.exec||"function"!=typeof e.exec)throw new Error("Invalid exec function");if("enabled"in e&&"function"!=typeof e.enabled)throw new Error("Invalid enabled function");if("execBatch"in e&&"function"!=typeof e.execBatch)throw new Error("Invalid execBatch function");if("order"in e&&"number"!=typeof e.order)throw new Error("Invalid order");if("default"in e&&"boolean"!=typeof e.default)throw new Error("Invalid default");if("inline"in e&&"function"!=typeof e.inline)throw new Error("Invalid inline function");if("renderInline"in e&&"function"!=typeof e.renderInline)throw new Error("Invalid renderInline function")}}({id:"restore",displayName:()=>(0,s.Iu)("files_trashbin","Restore"),iconSvgInline:()=>g,enabled:(e,t)=>"trashbin"===t.id&&e.length>0&&e.map((e=>e.permissions)).every((e=>0!=(e&d.y3.READ))),async exec(e){try{var t;const n=(0,c.generateRemoteUrl)("dav/trashbin/".concat(null===(t=(0,l.ts)())||void 0===t?void 0:t.uid,"/restore/").concat(e.basename));return await(0,b.default)({method:"MOVE",url:e.source,headers:{destination:n}}),(0,p.j8)("files:node:deleted",e),!0}catch(e){return y.error(e),!1}},async execBatch(e,t){return Promise.all(e.map((e=>this.exec(e,t))))},order:1,inline:()=>!0}),void 0===window._nc_fileactions&&(window._nc_fileactions=[],y.debug("FileActions initialized")),window._nc_fileactions.find((e=>e.id===w.id))?y.error("FileAction ".concat(w.id," already registered"),{action:w}):window._nc_fileactions.push(w),window.OCP.Files.Navigation.register({id:"trashbin",name:(0,s.Iu)("files_trashbin","Deleted files"),caption:(0,s.Iu)("files_trashbin","List of files that have been deleted."),icon:r,order:50,sticky:!0,defaultSortKey:"deleted",columns:[{id:"deleted",title:(0,s.Iu)("files_trashbin","Deleted"),render(e){var t;const n=null===(t=e.attributes)||void 0===t?void 0:t["trashbin-deletion-time"],i=document.createElement("span");return n?(i.title=a().unix(n).format("LLL"),i.textContent=a().unix(n).fromNow(),i):(i.textContent=(0,s.Iu)("files_trashbin","A long time ago"),i)},sort(e,t){var n,i;const s=(null===(n=e.attributes)||void 0===n?void 0:n["trashbin-deletion-time"])||(null==e?void 0:e.mtime)||0;return((null===(i=t.attributes)||void 0===i?void 0:i["trashbin-deletion-time"])||(null==t?void 0:t.mtime)||0)-s}}],getContents:async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/";const t=await h.stat(e,{details:!0,data:m}),n=await h.getDirectoryContents(e,{details:!0,data:m});return{folder:v(t.data),contents:n.data.map(v)}}})},46700:(e,t,n)=>{var i={"./af":42786,"./af.js":42786,"./ar":30867,"./ar-dz":14130,"./ar-dz.js":14130,"./ar-kw":96135,"./ar-kw.js":96135,"./ar-ly":56440,"./ar-ly.js":56440,"./ar-ma":47702,"./ar-ma.js":47702,"./ar-sa":16040,"./ar-sa.js":16040,"./ar-tn":37100,"./ar-tn.js":37100,"./ar.js":30867,"./az":31083,"./az.js":31083,"./be":9808,"./be.js":9808,"./bg":68338,"./bg.js":68338,"./bm":67438,"./bm.js":67438,"./bn":8905,"./bn-bd":76225,"./bn-bd.js":76225,"./bn.js":8905,"./bo":11560,"./bo.js":11560,"./br":1278,"./br.js":1278,"./bs":80622,"./bs.js":80622,"./ca":2468,"./ca.js":2468,"./cs":5822,"./cs.js":5822,"./cv":50877,"./cv.js":50877,"./cy":47373,"./cy.js":47373,"./da":24780,"./da.js":24780,"./de":59740,"./de-at":60217,"./de-at.js":60217,"./de-ch":60894,"./de-ch.js":60894,"./de.js":59740,"./dv":5300,"./dv.js":5300,"./el":50837,"./el.js":50837,"./en-au":78348,"./en-au.js":78348,"./en-ca":77925,"./en-ca.js":77925,"./en-gb":22243,"./en-gb.js":22243,"./en-ie":46436,"./en-ie.js":46436,"./en-il":47207,"./en-il.js":47207,"./en-in":44175,"./en-in.js":44175,"./en-nz":76319,"./en-nz.js":76319,"./en-sg":31662,"./en-sg.js":31662,"./eo":92915,"./eo.js":92915,"./es":55655,"./es-do":55251,"./es-do.js":55251,"./es-mx":96112,"./es-mx.js":96112,"./es-us":71146,"./es-us.js":71146,"./es.js":55655,"./et":5603,"./et.js":5603,"./eu":77763,"./eu.js":77763,"./fa":76959,"./fa.js":76959,"./fi":11897,"./fi.js":11897,"./fil":42549,"./fil.js":42549,"./fo":94694,"./fo.js":94694,"./fr":94470,"./fr-ca":63049,"./fr-ca.js":63049,"./fr-ch":52330,"./fr-ch.js":52330,"./fr.js":94470,"./fy":5044,"./fy.js":5044,"./ga":29295,"./ga.js":29295,"./gd":2101,"./gd.js":2101,"./gl":38794,"./gl.js":38794,"./gom-deva":27884,"./gom-deva.js":27884,"./gom-latn":23168,"./gom-latn.js":23168,"./gu":95349,"./gu.js":95349,"./he":24206,"./he.js":24206,"./hi":30094,"./hi.js":30094,"./hr":30316,"./hr.js":30316,"./hu":22138,"./hu.js":22138,"./hy-am":11423,"./hy-am.js":11423,"./id":29218,"./id.js":29218,"./is":90135,"./is.js":90135,"./it":90626,"./it-ch":10150,"./it-ch.js":10150,"./it.js":90626,"./ja":39183,"./ja.js":39183,"./jv":24286,"./jv.js":24286,"./ka":12105,"./ka.js":12105,"./kk":47772,"./kk.js":47772,"./km":18758,"./km.js":18758,"./kn":79282,"./kn.js":79282,"./ko":33730,"./ko.js":33730,"./ku":1408,"./ku.js":1408,"./ky":33291,"./ky.js":33291,"./lb":36841,"./lb.js":36841,"./lo":55466,"./lo.js":55466,"./lt":57010,"./lt.js":57010,"./lv":37595,"./lv.js":37595,"./me":39861,"./me.js":39861,"./mi":35493,"./mi.js":35493,"./mk":95966,"./mk.js":95966,"./ml":87341,"./ml.js":87341,"./mn":5115,"./mn.js":5115,"./mr":10370,"./mr.js":10370,"./ms":9847,"./ms-my":41237,"./ms-my.js":41237,"./ms.js":9847,"./mt":72126,"./mt.js":72126,"./my":56165,"./my.js":56165,"./nb":64924,"./nb.js":64924,"./ne":16744,"./ne.js":16744,"./nl":93901,"./nl-be":59814,"./nl-be.js":59814,"./nl.js":93901,"./nn":83877,"./nn.js":83877,"./oc-lnc":92135,"./oc-lnc.js":92135,"./pa-in":15858,"./pa-in.js":15858,"./pl":64495,"./pl.js":64495,"./pt":89520,"./pt-br":57971,"./pt-br.js":57971,"./pt.js":89520,"./ro":96459,"./ro.js":96459,"./ru":21793,"./ru.js":21793,"./sd":40950,"./sd.js":40950,"./se":10490,"./se.js":10490,"./si":90124,"./si.js":90124,"./sk":64249,"./sk.js":64249,"./sl":14985,"./sl.js":14985,"./sq":51104,"./sq.js":51104,"./sr":49131,"./sr-cyrl":79915,"./sr-cyrl.js":79915,"./sr.js":49131,"./ss":85893,"./ss.js":85893,"./sv":98760,"./sv.js":98760,"./sw":91172,"./sw.js":91172,"./ta":27333,"./ta.js":27333,"./te":23110,"./te.js":23110,"./tet":52095,"./tet.js":52095,"./tg":27321,"./tg.js":27321,"./th":9041,"./th.js":9041,"./tk":19005,"./tk.js":19005,"./tl-ph":75768,"./tl-ph.js":75768,"./tlh":89444,"./tlh.js":89444,"./tr":72397,"./tr.js":72397,"./tzl":28254,"./tzl.js":28254,"./tzm":51106,"./tzm-latn":30699,"./tzm-latn.js":30699,"./tzm.js":51106,"./ug-cn":9288,"./ug-cn.js":9288,"./uk":67691,"./uk.js":67691,"./ur":13795,"./ur.js":13795,"./uz":6791,"./uz-latn":60588,"./uz-latn.js":60588,"./uz.js":6791,"./vi":65666,"./vi.js":65666,"./x-pseudo":14378,"./x-pseudo.js":14378,"./yo":75805,"./yo.js":75805,"./zh-cn":83839,"./zh-cn.js":83839,"./zh-hk":55726,"./zh-hk.js":55726,"./zh-mo":99807,"./zh-mo.js":99807,"./zh-tw":74152,"./zh-tw.js":74152};function s(e){var t=r(e);return n(t)}function r(e){if(!n.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}s.keys=function(){return Object.keys(i)},s.resolve=r,e.exports=s,s.id=46700}},n={};function i(e){var s=n[e];if(void 0!==s)return s.exports;var r=n[e]={id:e,loaded:!1,exports:{}};return t[e].call(r.exports,r,r.exports,i),r.loaded=!0,r.exports}i.m=t,e=[],i.O=(t,n,s,r)=>{if(!n){var o=1/0;for(c=0;c<e.length;c++){n=e[c][0],s=e[c][1],r=e[c][2];for(var a=!0,l=0;l<n.length;l++)(!1&r||o>=r)&&Object.keys(i.O).every((e=>i.O[e](n[l])))?n.splice(l--,1):(a=!1,r<o&&(o=r));if(a){e.splice(c--,1);var d=s();void 0!==d&&(t=d)}}return t}r=r||0;for(var c=e.length;c>0&&e[c-1][2]>r;c--)e[c]=e[c-1];e[c]=[n,s,r]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),i.j=5992,(()=>{i.b=document.baseURI||self.location.href;var e={5992:0};i.O.j=t=>0===e[t];var t=(t,n)=>{var s,r,o=n[0],a=n[1],l=n[2],d=0;if(o.some((t=>0!==e[t]))){for(s in a)i.o(a,s)&&(i.m[s]=a[s]);if(l)var c=l(i)}for(t&&t(n);d<o.length;d++)r=o[d],i.o(e,r)&&e[r]&&e[r][0](),e[r]=0;return i.O(c)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),i.nc=void 0;var s=i.O(void 0,[7874],(()=>i(95761)));s=i.O(s)})(); -//# sourceMappingURL=files_trashbin-main.js.map?v=d929b5d97b426d8432cd
\ No newline at end of file +(()=>{var e,t={1345:(e,t,n)=>{"use strict";var i,s=n(31352),r=n(61137),o=n(80351),a=n.n(o),l=n(45994),d=n(91770),c=n(79753),u=n(14596);const j="/trashbin/".concat(null===(i=(0,l.ts)())||void 0===i?void 0:i.uid,"/trash"),f=(0,c.generateRemoteUrl)("dav"+j),h=(0,u.eI)(f,{headers:{requesttoken:(0,l.IH)()}}),m='<?xml version="1.0"?>\n<d:propfind xmlns:d="DAV:"\n\txmlns:oc="http://owncloud.org/ns"\n\txmlns:nc="http://nextcloud.org/ns">\n\t<d:prop>\n\t\t<nc:trashbin-filename />\n\t\t<nc:trashbin-deletion-time />\n\t\t<nc:trashbin-original-location />\n\t\t<nc:trashbin-title />\n\t\t<d:getlastmodified />\n\t\t<d:getetag />\n\t\t<d:getcontenttype />\n\t\t<d:resourcetype />\n\t\t<oc:fileid />\n\t\t<oc:permissions />\n\t\t<oc:size />\n\t\t<d:getcontentlength />\n\t</d:prop>\n</d:propfind>',v=function(e){var t,n,i,s,r;const o=(0,d.wE)(null===(t=e.props)||void 0===t?void 0:t.permissions),a=null===(n=(0,l.ts)())||void 0===n?void 0:n.uid,u=(0,c.generateUrl)("/apps/files_trashbin/preview?fileId={fileid}&x=32&y=32",e.props),f={id:(null===(i=e.props)||void 0===i?void 0:i.fileid)||0,source:(0,c.generateRemoteUrl)("dav"+j+e.filename),mtime:new Date(e.lastmod),mime:e.mime,size:(null===(s=e.props)||void 0===s?void 0:s.size)||0,permissions:o,owner:a,root:j,attributes:{...e,...e.props,displayName:null===(r=e.props)||void 0===r?void 0:r["trashbin-filename"],previewUrl:u}};return"file"===e.type?new d.$B(f):new d.gt(f)};var p=n(78595),b=n(4820),g=n(64009);const y=(0,n(17499).IY)().setApp("files").detectUser().build();var w;w=new class{constructor(e){var t,n,i;t=this,i=void 0,(n=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:String(t)}(n="_action"))in t?Object.defineProperty(t,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[n]=i,this.validateAction(e),this._action=e}get id(){return this._action.id}get displayName(){return this._action.displayName}get iconSvgInline(){return this._action.iconSvgInline}get enabled(){return this._action.enabled}get exec(){return this._action.exec}get execBatch(){return this._action.execBatch}get order(){return this._action.order}get default(){return this._action.default}get inline(){return this._action.inline}get renderInline(){return this._action.renderInline}validateAction(e){if(!e.id||"string"!=typeof e.id)throw new Error("Invalid id");if(!e.displayName||"function"!=typeof e.displayName)throw new Error("Invalid displayName function");if(!e.iconSvgInline||"function"!=typeof e.iconSvgInline)throw new Error("Invalid iconSvgInline function");if(!e.exec||"function"!=typeof e.exec)throw new Error("Invalid exec function");if("enabled"in e&&"function"!=typeof e.enabled)throw new Error("Invalid enabled function");if("execBatch"in e&&"function"!=typeof e.execBatch)throw new Error("Invalid execBatch function");if("order"in e&&"number"!=typeof e.order)throw new Error("Invalid order");if("default"in e&&"boolean"!=typeof e.default)throw new Error("Invalid default");if("inline"in e&&"function"!=typeof e.inline)throw new Error("Invalid inline function");if("renderInline"in e&&"function"!=typeof e.renderInline)throw new Error("Invalid renderInline function")}}({id:"restore",displayName:()=>(0,s.Iu)("files_trashbin","Restore"),iconSvgInline:()=>g,enabled:(e,t)=>"trashbin"===t.id&&e.length>0&&e.map((e=>e.permissions)).every((e=>0!=(e&d.y3.READ))),async exec(e){try{var t;const n=(0,c.generateRemoteUrl)("dav/trashbin/".concat(null===(t=(0,l.ts)())||void 0===t?void 0:t.uid,"/restore/").concat(e.basename));return await(0,b.default)({method:"MOVE",url:e.source,headers:{destination:n}}),(0,p.j8)("files:node:deleted",e),!0}catch(e){return y.error(e),!1}},async execBatch(e,t){return Promise.all(e.map((e=>this.exec(e,t))))},order:1,inline:()=>!0}),void 0===window._nc_fileactions&&(window._nc_fileactions=[],y.debug("FileActions initialized")),window._nc_fileactions.find((e=>e.id===w.id))?y.error("FileAction ".concat(w.id," already registered"),{action:w}):window._nc_fileactions.push(w),window.OCP.Files.Navigation.register({id:"trashbin",name:(0,s.Iu)("files_trashbin","Deleted files"),caption:(0,s.Iu)("files_trashbin","List of files that have been deleted."),icon:r,order:50,sticky:!0,defaultSortKey:"deleted",columns:[{id:"deleted",title:(0,s.Iu)("files_trashbin","Deleted"),render(e){var t;const n=null===(t=e.attributes)||void 0===t?void 0:t["trashbin-deletion-time"],i=document.createElement("span");return n?(i.title=a().unix(n).format("LLL"),i.textContent=a().unix(n).fromNow(),i):(i.textContent=(0,s.Iu)("files_trashbin","A long time ago"),i)},sort(e,t){var n,i;const s=(null===(n=e.attributes)||void 0===n?void 0:n["trashbin-deletion-time"])||(null==e?void 0:e.mtime)||0;return((null===(i=t.attributes)||void 0===i?void 0:i["trashbin-deletion-time"])||(null==t?void 0:t.mtime)||0)-s}}],getContents:async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/";const t=await h.stat(e,{details:!0,data:m}),n=await h.getDirectoryContents(e,{details:!0,data:m});return{folder:v(t.data),contents:n.data.map(v)}}})},46700:(e,t,n)=>{var i={"./af":42786,"./af.js":42786,"./ar":30867,"./ar-dz":14130,"./ar-dz.js":14130,"./ar-kw":96135,"./ar-kw.js":96135,"./ar-ly":56440,"./ar-ly.js":56440,"./ar-ma":47702,"./ar-ma.js":47702,"./ar-sa":16040,"./ar-sa.js":16040,"./ar-tn":37100,"./ar-tn.js":37100,"./ar.js":30867,"./az":31083,"./az.js":31083,"./be":9808,"./be.js":9808,"./bg":68338,"./bg.js":68338,"./bm":67438,"./bm.js":67438,"./bn":8905,"./bn-bd":76225,"./bn-bd.js":76225,"./bn.js":8905,"./bo":11560,"./bo.js":11560,"./br":1278,"./br.js":1278,"./bs":80622,"./bs.js":80622,"./ca":2468,"./ca.js":2468,"./cs":5822,"./cs.js":5822,"./cv":50877,"./cv.js":50877,"./cy":47373,"./cy.js":47373,"./da":24780,"./da.js":24780,"./de":59740,"./de-at":60217,"./de-at.js":60217,"./de-ch":60894,"./de-ch.js":60894,"./de.js":59740,"./dv":5300,"./dv.js":5300,"./el":50837,"./el.js":50837,"./en-au":78348,"./en-au.js":78348,"./en-ca":77925,"./en-ca.js":77925,"./en-gb":22243,"./en-gb.js":22243,"./en-ie":46436,"./en-ie.js":46436,"./en-il":47207,"./en-il.js":47207,"./en-in":44175,"./en-in.js":44175,"./en-nz":76319,"./en-nz.js":76319,"./en-sg":31662,"./en-sg.js":31662,"./eo":92915,"./eo.js":92915,"./es":55655,"./es-do":55251,"./es-do.js":55251,"./es-mx":96112,"./es-mx.js":96112,"./es-us":71146,"./es-us.js":71146,"./es.js":55655,"./et":5603,"./et.js":5603,"./eu":77763,"./eu.js":77763,"./fa":76959,"./fa.js":76959,"./fi":11897,"./fi.js":11897,"./fil":42549,"./fil.js":42549,"./fo":94694,"./fo.js":94694,"./fr":94470,"./fr-ca":63049,"./fr-ca.js":63049,"./fr-ch":52330,"./fr-ch.js":52330,"./fr.js":94470,"./fy":5044,"./fy.js":5044,"./ga":29295,"./ga.js":29295,"./gd":2101,"./gd.js":2101,"./gl":38794,"./gl.js":38794,"./gom-deva":27884,"./gom-deva.js":27884,"./gom-latn":23168,"./gom-latn.js":23168,"./gu":95349,"./gu.js":95349,"./he":24206,"./he.js":24206,"./hi":30094,"./hi.js":30094,"./hr":30316,"./hr.js":30316,"./hu":22138,"./hu.js":22138,"./hy-am":11423,"./hy-am.js":11423,"./id":29218,"./id.js":29218,"./is":90135,"./is.js":90135,"./it":90626,"./it-ch":10150,"./it-ch.js":10150,"./it.js":90626,"./ja":39183,"./ja.js":39183,"./jv":24286,"./jv.js":24286,"./ka":12105,"./ka.js":12105,"./kk":47772,"./kk.js":47772,"./km":18758,"./km.js":18758,"./kn":79282,"./kn.js":79282,"./ko":33730,"./ko.js":33730,"./ku":1408,"./ku.js":1408,"./ky":33291,"./ky.js":33291,"./lb":36841,"./lb.js":36841,"./lo":55466,"./lo.js":55466,"./lt":57010,"./lt.js":57010,"./lv":37595,"./lv.js":37595,"./me":39861,"./me.js":39861,"./mi":35493,"./mi.js":35493,"./mk":95966,"./mk.js":95966,"./ml":87341,"./ml.js":87341,"./mn":5115,"./mn.js":5115,"./mr":10370,"./mr.js":10370,"./ms":9847,"./ms-my":41237,"./ms-my.js":41237,"./ms.js":9847,"./mt":72126,"./mt.js":72126,"./my":56165,"./my.js":56165,"./nb":64924,"./nb.js":64924,"./ne":16744,"./ne.js":16744,"./nl":93901,"./nl-be":59814,"./nl-be.js":59814,"./nl.js":93901,"./nn":83877,"./nn.js":83877,"./oc-lnc":92135,"./oc-lnc.js":92135,"./pa-in":15858,"./pa-in.js":15858,"./pl":64495,"./pl.js":64495,"./pt":89520,"./pt-br":57971,"./pt-br.js":57971,"./pt.js":89520,"./ro":96459,"./ro.js":96459,"./ru":21793,"./ru.js":21793,"./sd":40950,"./sd.js":40950,"./se":10490,"./se.js":10490,"./si":90124,"./si.js":90124,"./sk":64249,"./sk.js":64249,"./sl":14985,"./sl.js":14985,"./sq":51104,"./sq.js":51104,"./sr":49131,"./sr-cyrl":79915,"./sr-cyrl.js":79915,"./sr.js":49131,"./ss":85893,"./ss.js":85893,"./sv":98760,"./sv.js":98760,"./sw":91172,"./sw.js":91172,"./ta":27333,"./ta.js":27333,"./te":23110,"./te.js":23110,"./tet":52095,"./tet.js":52095,"./tg":27321,"./tg.js":27321,"./th":9041,"./th.js":9041,"./tk":19005,"./tk.js":19005,"./tl-ph":75768,"./tl-ph.js":75768,"./tlh":89444,"./tlh.js":89444,"./tr":72397,"./tr.js":72397,"./tzl":28254,"./tzl.js":28254,"./tzm":51106,"./tzm-latn":30699,"./tzm-latn.js":30699,"./tzm.js":51106,"./ug-cn":9288,"./ug-cn.js":9288,"./uk":67691,"./uk.js":67691,"./ur":13795,"./ur.js":13795,"./uz":6791,"./uz-latn":60588,"./uz-latn.js":60588,"./uz.js":6791,"./vi":65666,"./vi.js":65666,"./x-pseudo":14378,"./x-pseudo.js":14378,"./yo":75805,"./yo.js":75805,"./zh-cn":83839,"./zh-cn.js":83839,"./zh-hk":55726,"./zh-hk.js":55726,"./zh-mo":99807,"./zh-mo.js":99807,"./zh-tw":74152,"./zh-tw.js":74152};function s(e){var t=r(e);return n(t)}function r(e){if(!n.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}s.keys=function(){return Object.keys(i)},s.resolve=r,e.exports=s,s.id=46700}},n={};function i(e){var s=n[e];if(void 0!==s)return s.exports;var r=n[e]={id:e,loaded:!1,exports:{}};return t[e].call(r.exports,r,r.exports,i),r.loaded=!0,r.exports}i.m=t,e=[],i.O=(t,n,s,r)=>{if(!n){var o=1/0;for(c=0;c<e.length;c++){n=e[c][0],s=e[c][1],r=e[c][2];for(var a=!0,l=0;l<n.length;l++)(!1&r||o>=r)&&Object.keys(i.O).every((e=>i.O[e](n[l])))?n.splice(l--,1):(a=!1,r<o&&(o=r));if(a){e.splice(c--,1);var d=s();void 0!==d&&(t=d)}}return t}r=r||0;for(var c=e.length;c>0&&e[c-1][2]>r;c--)e[c]=e[c-1];e[c]=[n,s,r]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),i.j=5992,(()=>{i.b=document.baseURI||self.location.href;var e={5992:0};i.O.j=t=>0===e[t];var t=(t,n)=>{var s,r,o=n[0],a=n[1],l=n[2],d=0;if(o.some((t=>0!==e[t]))){for(s in a)i.o(a,s)&&(i.m[s]=a[s]);if(l)var c=l(i)}for(t&&t(n);d<o.length;d++)r=o[d],i.o(e,r)&&e[r]&&e[r][0](),e[r]=0;return i.O(c)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),i.nc=void 0;var s=i.O(void 0,[7874],(()=>i(1345)));s=i.O(s)})(); +//# sourceMappingURL=files_trashbin-main.js.map?v=848da85278e89893aec7
\ No newline at end of file diff --git a/dist/files_trashbin-main.js.map b/dist/files_trashbin-main.js.map index 2fa829e4eb0..eb3b7a4fe46 100644 --- a/dist/files_trashbin-main.js.map +++ b/dist/files_trashbin-main.js.map @@ -1 +1 @@ -{"version":3,"file":"files_trashbin-main.js?v=d929b5d97b426d8432cd","mappings":";UAAIA,8HCyBG,MAAMC,EAAW,aAAH,OAAgC,QAAhC,GAAgBC,EAAAA,EAAAA,aAAgB,aAAhB,EAAkBC,IAAG,UAC7CC,GAAUC,EAAAA,EAAAA,mBAAkB,MAAQJ,GAMjD,GALeK,EAAAA,EAAAA,IAAaF,EAAS,CACpCG,QAAS,CACRC,cAAcC,EAAAA,EAAAA,SCEVC,EAAO,oeAqBPC,EAAe,SAASC,GAA+B,cAC5D,MAAMC,GAAcC,EAAAA,EAAAA,IAAiC,QAAX,EAACF,EAAKG,aAAK,aAAV,EAAYF,aACjDG,EAAwB,QAAnB,GAAGd,EAAAA,EAAAA,aAAgB,aAAhB,EAAkBC,IAC1Bc,GAAaC,EAAAA,EAAAA,aAAY,yDAA0DN,EAAKG,OAExFI,EAAW,CAChBC,IAAc,QAAV,EAAAR,EAAKG,aAAK,aAAV,EAAYM,SAAoB,EACpCC,QAAQjB,EAAAA,EAAAA,mBAAkB,MAAQJ,EAAWW,EAAKW,UAClDC,MAAO,IAAIC,KAAKb,EAAKc,SACrBC,KAAMf,EAAKe,KACXC,MAAgB,QAAV,EAAAhB,EAAKG,aAAK,aAAV,EAAYa,OAAkB,EACpCf,cACAG,QACAa,KAAM5B,EACN6B,WAAY,IACRlB,KACAA,EAAKG,MAERgB,YAAuB,QAAZ,EAAEnB,EAAKG,aAAK,aAAV,EAAa,qBAC1BE,eAIF,MAAqB,SAAdL,EAAKoB,KACT,IAAIC,EAAAA,GAAKd,GACT,IAAIe,EAAAA,GAAOf,EACf,sCCvDA,SAAegB,WAAAA,MACbC,OAAO,SACPC,aACAC,QC4IgC,IAASC,ICtIxB,IDwCZ,MAINC,YAAYD,eAAwB,oaACnCE,KAAKC,eAAeH,GACpBE,KAAKE,QAAUJ,CAChB,CAEInB,SACH,OAAOqB,KAAKE,QAAQvB,EACrB,CAEIW,kBACH,OAAOU,KAAKE,QAAQZ,WACrB,CAEIa,oBACH,OAAOH,KAAKE,QAAQC,aACrB,CAEIC,cACH,OAAOJ,KAAKE,QAAQE,OACrB,CAEIC,WACH,OAAOL,KAAKE,QAAQG,IACrB,CAEIC,gBACH,OAAON,KAAKE,QAAQI,SACrB,CAEIC,YACH,OAAOP,KAAKE,QAAQK,KACrB,CAEIC,cACH,OAAOR,KAAKE,QAAQM,OACrB,CAEIC,aACH,OAAOT,KAAKE,QAAQO,MACrB,CAEIC,mBACH,OAAOV,KAAKE,QAAQQ,YACrB,CAEQT,eAAeH,GACtB,IAAKA,EAAOnB,IAA2B,iBAAdmB,EAAOnB,GAC/B,MAAM,IAAIgC,MAAM,cAGjB,IAAKb,EAAOR,aAA6C,mBAAvBQ,EAAOR,YACxC,MAAM,IAAIqB,MAAM,gCAGjB,IAAKb,EAAOK,eAAiD,mBAAzBL,EAAOK,cAC1C,MAAM,IAAIQ,MAAM,kCAGjB,IAAKb,EAAOO,MAA+B,mBAAhBP,EAAOO,KACjC,MAAM,IAAIM,MAAM,yBAIjB,GAAI,YAAab,GAAoC,mBAAnBA,EAAOM,QACxC,MAAM,IAAIO,MAAM,4BAGjB,GAAI,cAAeb,GAAsC,mBAArBA,EAAOQ,UAC1C,MAAM,IAAIK,MAAM,8BAGjB,GAAI,UAAWb,GAAkC,iBAAjBA,EAAOS,MACtC,MAAM,IAAII,MAAM,iBAGjB,GAAI,YAAab,GAAoC,kBAAnBA,EAAOU,QACxC,MAAM,IAAIG,MAAM,mBAGjB,GAAI,WAAYb,GAAmC,mBAAlBA,EAAOW,OACvC,MAAM,IAAIE,MAAM,2BAGjB,GAAI,iBAAkBb,GAAyC,mBAAxBA,EAAOY,aAC7C,MAAM,IAAIC,MAAM,gCAElB,GClIiC,CACjChC,GAAI,UACJW,YAAW,KACHsB,EAAAA,EAAAA,IAAE,iBAAkB,WAE5BT,cAAe,IAAMU,EAErBT,QAAO,CAACU,EAAeC,IAEN,aAAZA,EAAKpC,IAKFmC,EAAME,OAAS,GAAKF,EACzBG,KAAI9C,GAAQA,EAAKC,cACjB8C,OAAMC,GAAiD,IAAlCA,EAAaC,EAAAA,GAAAA,QAGrCC,WAAWlD,GACV,IAAI,MACH,MAAMmD,GAAc1D,EAAAA,EAAAA,mBAAkB,gBAAD,OAAiC,QAAjC,GAAiBH,EAAAA,EAAAA,aAAgB,aAAhB,EAAkBC,IAAG,oBAAYS,EAAKoD,WAY5F,aAXMC,EAAAA,EAAAA,SAAM,CACXC,OAAQ,OACRC,IAAKvD,EAAKU,OACVf,QAAS,CACRwD,kBAMFK,EAAAA,EAAAA,IAAK,qBAAsBxD,IACpB,CACR,CAAE,MAAOyD,GAER,OADAC,EAAOD,MAAMA,IACN,CACR,CACD,EACAP,gBAAgBP,EAAeC,GAC9B,OAAOe,QAAQC,IAAIjB,EAAMG,KAAI9C,GAAQ6B,KAAKK,KAAKlC,EAAM4C,KACtD,EAEAR,MAAO,EACPE,OAAQ,KAAM,SD2FwB,IAA3BuB,OAAOC,kBACjBD,OAAOC,gBAAkB,GACzBJ,EAAOK,MAAM,4BAIVF,OAAOC,gBAAgBE,MAAKC,GAAUA,EAAOzD,KAAOmB,EAAOnB,KAC9DkD,EAAOD,MAAM,cAAD,OAAe9B,EAAOnB,GAAE,uBAAuB,CAAEmB,WAI9DkC,OAAOC,gBAAgBI,KAAKvC,GEjJVkC,OAAOM,IAAIC,MAAMC,WACzBC,SAAS,CACnB9D,GAAI,WACJ+D,MAAM9B,EAAAA,EAAAA,IAAE,iBAAkB,iBAC1B+B,SAAS/B,EAAAA,EAAAA,IAAE,iBAAkB,yCAE7BgC,KAAMC,EACNtC,MAAO,GACPuC,QAAQ,EAERC,eAAgB,UAEhBC,QAAS,CACR,CACCrE,GAAI,UACJsE,OAAOrC,EAAAA,EAAAA,IAAE,iBAAkB,WAC3BsC,OAAO/E,GAAM,MACZ,MAAMgF,EAA8B,QAAlB,EAAGhF,EAAKkB,kBAAU,aAAf,EAAkB,0BACjC+D,EAAOC,SAASC,cAAc,QACpC,OAAIH,GACHC,EAAKH,MAAQM,IAAAA,KAAYJ,GAAcK,OAAO,OAC9CJ,EAAKK,YAAcF,IAAAA,KAAYJ,GAAcO,UACtCN,IAIRA,EAAKK,aAAcE,EAAAA,EAAAA,IAAU,iBAAkB,mBACxCP,EACR,EACAQ,KAAKC,EAAOC,GAAO,QAClB,MAAMC,GAAgC,QAAhB,EAAAF,EAAMxE,kBAAU,aAAhB,EAAmB,6BAA6BwE,aAAK,EAALA,EAAO9E,QAAS,EAEtF,QADsC,QAAhB,EAAA+E,EAAMzE,kBAAU,aAAhB,EAAmB,6BAA6ByE,aAAK,EAALA,EAAO/E,QAAS,GAC/DgF,CACxB,IAIFC,YJU2B3C,iBAAyD,IAAlD4C,EAAe,UAAH,6CAAG,IAGjD,MAAMC,QAAqBC,EAAAA,KAAYF,EAAM,CAC5CG,SAAS,EACTnG,SAGKoG,QAAyBF,EAAAA,qBAA4BF,EAAM,CAChEG,SAAS,EACTnG,SAGD,MAAO,CACNqG,OAAQpG,EAAagG,EAAajG,MAClCsG,SAAUF,EAAiBpG,KAAKgD,IAAI/C,GAEtC,qBKjGA,IAAI+C,EAAM,CACT,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,MACX,aAAc,MACd,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,QAAS,MACT,WAAY,MACZ,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,gBAAiB,MACjB,aAAc,MACd,gBAAiB,MACjB,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,MACX,aAAc,MACd,UAAW,KACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,WAAY,MACZ,cAAe,MACf,UAAW,MACX,aAAc,MACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,YAAa,MACb,eAAgB,MAChB,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,QAAS,MACT,WAAY,MACZ,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,UAAW,KACX,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,QAAS,MACT,WAAY,MACZ,OAAQ,MACR,UAAW,MACX,QAAS,MACT,WAAY,MACZ,QAAS,MACT,aAAc,MACd,gBAAiB,MACjB,WAAY,MACZ,UAAW,KACX,aAAc,KACd,OAAQ,MACR,UAAW,MACX,OAAQ,MACR,UAAW,MACX,OAAQ,KACR,YAAa,MACb,eAAgB,MAChB,UAAW,KACX,OAAQ,MACR,UAAW,MACX,aAAc,MACd,gBAAiB,MACjB,OAAQ,MACR,UAAW,MACX,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,MACd,UAAW,MACX,aAAc,OAIf,SAASuD,EAAeC,GACvB,IAAI9F,EAAK+F,EAAsBD,GAC/B,OAAOE,EAAoBhG,EAC5B,CACA,SAAS+F,EAAsBD,GAC9B,IAAIE,EAAoBC,EAAE3D,EAAKwD,GAAM,CACpC,IAAII,EAAI,IAAIlE,MAAM,uBAAyB8D,EAAM,KAEjD,MADAI,EAAEC,KAAO,mBACHD,CACP,CACA,OAAO5D,EAAIwD,EACZ,CACAD,EAAeO,KAAO,WACrB,OAAOC,OAAOD,KAAK9D,EACpB,EACAuD,EAAeS,QAAUP,EACzBQ,EAAOC,QAAUX,EACjBA,EAAe7F,GAAK,QClShByG,EAA2B,CAAC,EAGhC,SAAST,EAAoBU,GAE5B,IAAIC,EAAeF,EAAyBC,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaH,QAGrB,IAAID,EAASE,EAAyBC,GAAY,CACjD1G,GAAI0G,EACJG,QAAQ,EACRL,QAAS,CAAC,GAUX,OANAM,EAAoBJ,GAAUK,KAAKR,EAAOC,QAASD,EAAQA,EAAOC,QAASR,GAG3EO,EAAOM,QAAS,EAGTN,EAAOC,OACf,CAGAR,EAAoBgB,EAAIF,ER5BpBlI,EAAW,GACfoH,EAAoBiB,EAAI,CAACC,EAAQC,EAAUC,EAAIC,KAC9C,IAAGF,EAAH,CAMA,IAAIG,EAAeC,IACnB,IAASC,EAAI,EAAGA,EAAI5I,EAASyD,OAAQmF,IAAK,CACrCL,EAAWvI,EAAS4I,GAAG,GACvBJ,EAAKxI,EAAS4I,GAAG,GACjBH,EAAWzI,EAAS4I,GAAG,GAE3B,IAJA,IAGIC,GAAY,EACPC,EAAI,EAAGA,EAAIP,EAAS9E,OAAQqF,MACpB,EAAXL,GAAsBC,GAAgBD,IAAahB,OAAOD,KAAKJ,EAAoBiB,GAAG1E,OAAOoF,GAAS3B,EAAoBiB,EAAEU,GAAKR,EAASO,MAC9IP,EAASS,OAAOF,IAAK,IAErBD,GAAY,EACTJ,EAAWC,IAAcA,EAAeD,IAG7C,GAAGI,EAAW,CACb7I,EAASgJ,OAAOJ,IAAK,GACrB,IAAIK,EAAIT,SACER,IAANiB,IAAiBX,EAASW,EAC/B,CACD,CACA,OAAOX,CArBP,CAJCG,EAAWA,GAAY,EACvB,IAAI,IAAIG,EAAI5I,EAASyD,OAAQmF,EAAI,GAAK5I,EAAS4I,EAAI,GAAG,GAAKH,EAAUG,IAAK5I,EAAS4I,GAAK5I,EAAS4I,EAAI,GACrG5I,EAAS4I,GAAK,CAACL,EAAUC,EAAIC,EAuBjB,ES3BdrB,EAAoB8B,EAAKvB,IACxB,IAAIwB,EAASxB,GAAUA,EAAOyB,WAC7B,IAAOzB,EAAiB,QACxB,IAAM,EAEP,OADAP,EAAoBiC,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLd/B,EAAoBiC,EAAI,CAACzB,EAAS2B,KACjC,IAAI,IAAIR,KAAOQ,EACXnC,EAAoBC,EAAEkC,EAAYR,KAAS3B,EAAoBC,EAAEO,EAASmB,IAC5EtB,OAAO+B,eAAe5B,EAASmB,EAAK,CAAEU,YAAY,EAAMC,IAAKH,EAAWR,IAE1E,ECND3B,EAAoBuC,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAOnH,MAAQ,IAAIoH,SAAS,cAAb,EAChB,CAAE,MAAOvC,GACR,GAAsB,iBAAX7C,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxB2C,EAAoBC,EAAI,CAACyC,EAAKC,IAAUtC,OAAOuC,UAAUC,eAAe9B,KAAK2B,EAAKC,GCClF3C,EAAoB6B,EAAKrB,IACH,oBAAXsC,QAA0BA,OAAOC,aAC1C1C,OAAO+B,eAAe5B,EAASsC,OAAOC,YAAa,CAAEC,MAAO,WAE7D3C,OAAO+B,eAAe5B,EAAS,aAAc,CAAEwC,OAAO,GAAO,ECL9DhD,EAAoBiD,IAAO1C,IAC1BA,EAAO2C,MAAQ,GACV3C,EAAO4C,WAAU5C,EAAO4C,SAAW,IACjC5C,GCHRP,EAAoB0B,EAAI,WCAxB1B,EAAoBoD,EAAI1E,SAAS2E,SAAWC,KAAKC,SAASC,KAK1D,IAAIC,EAAkB,CACrB,KAAM,GAaPzD,EAAoBiB,EAAES,EAAKgC,GAA0C,IAA7BD,EAAgBC,GAGxD,IAAIC,EAAuB,CAACC,EAA4BtK,KACvD,IAKIoH,EAAUgD,EALVvC,EAAW7H,EAAK,GAChBuK,EAAcvK,EAAK,GACnBwK,EAAUxK,EAAK,GAGIkI,EAAI,EAC3B,GAAGL,EAAS4C,MAAM/J,GAAgC,IAAxByJ,EAAgBzJ,KAAa,CACtD,IAAI0G,KAAYmD,EACZ7D,EAAoBC,EAAE4D,EAAanD,KACrCV,EAAoBgB,EAAEN,GAAYmD,EAAYnD,IAGhD,GAAGoD,EAAS,IAAI5C,EAAS4C,EAAQ9D,EAClC,CAEA,IADG4D,GAA4BA,EAA2BtK,GACrDkI,EAAIL,EAAS9E,OAAQmF,IACzBkC,EAAUvC,EAASK,GAChBxB,EAAoBC,EAAEwD,EAAiBC,IAAYD,EAAgBC,IACrED,EAAgBC,GAAS,KAE1BD,EAAgBC,GAAW,EAE5B,OAAO1D,EAAoBiB,EAAEC,EAAO,EAGjC8C,EAAqBV,KAA4B,sBAAIA,KAA4B,uBAAK,GAC1FU,EAAmBC,QAAQN,EAAqBO,KAAK,KAAM,IAC3DF,EAAmBtG,KAAOiG,EAAqBO,KAAK,KAAMF,EAAmBtG,KAAKwG,KAAKF,QClDvFhE,EAAoBmE,QAAKvD,ECGzB,IAAIwD,EAAsBpE,EAAoBiB,OAAEL,EAAW,CAAC,OAAO,IAAOZ,EAAoB,SAC9FoE,EAAsBpE,EAAoBiB,EAAEmD","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/files_trashbin/src/services/client.ts","webpack:///nextcloud/apps/files_trashbin/src/services/trashbin.ts","webpack:///nextcloud/apps/files/src/logger.js","webpack:///nextcloud/apps/files/src/services/FileAction.ts","webpack:///nextcloud/apps/files_trashbin/src/actions/restoreAction.ts","webpack:///nextcloud/apps/files_trashbin/src/main.ts","webpack:///nextcloud/node_modules/moment/locale|sync|/^\\.\\/.*$","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { createClient } from 'webdav'\nimport { generateRemoteUrl } from '@nextcloud/router'\nimport { getCurrentUser, getRequestToken } from '@nextcloud/auth'\n\nexport const rootPath = `/trashbin/${getCurrentUser()?.uid}/trash`\nexport const rootUrl = generateRemoteUrl('dav' + rootPath)\nconst client = createClient(rootUrl, {\n\theaders: {\n\t\trequesttoken: getRequestToken(),\n\t},\n})\nexport default client\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { File, Folder, parseWebdavPermissions } from '@nextcloud/files'\nimport { generateRemoteUrl, generateUrl } from '@nextcloud/router'\n\nimport type { FileStat, ResponseDataDetailed } from 'webdav'\nimport type { ContentsWithRoot } from '../../../files/src/services/Navigation.ts'\n\nimport client, { rootPath } from './client'\n\nconst data = `<?xml version=\"1.0\"?>\n<d:propfind xmlns:d=\"DAV:\"\n\txmlns:oc=\"http://owncloud.org/ns\"\n\txmlns:nc=\"http://nextcloud.org/ns\">\n\t<d:prop>\n\t\t<nc:trashbin-filename />\n\t\t<nc:trashbin-deletion-time />\n\t\t<nc:trashbin-original-location />\n\t\t<nc:trashbin-title />\n\t\t<d:getlastmodified />\n\t\t<d:getetag />\n\t\t<d:getcontenttype />\n\t\t<d:resourcetype />\n\t\t<oc:fileid />\n\t\t<oc:permissions />\n\t\t<oc:size />\n\t\t<d:getcontentlength />\n\t</d:prop>\n</d:propfind>`\n\n\nconst resultToNode = function(node: FileStat): File | Folder {\n\tconst permissions = parseWebdavPermissions(node.props?.permissions)\n\tconst owner = getCurrentUser()?.uid as string\n\tconst previewUrl = generateUrl('/apps/files_trashbin/preview?fileId={fileid}&x=32&y=32', node.props)\n\n\tconst nodeData = {\n\t\tid: node.props?.fileid as number || 0,\n\t\tsource: generateRemoteUrl('dav' + rootPath + node.filename),\n\t\tmtime: new Date(node.lastmod),\n\t\tmime: node.mime as string,\n\t\tsize: node.props?.size as number || 0,\n\t\tpermissions,\n\t\towner,\n\t\troot: rootPath,\n\t\tattributes: {\n\t\t\t...node,\n\t\t\t...node.props,\n\t\t\t// Override displayed name on the list\n\t\t\tdisplayName: node.props?.['trashbin-filename'],\n\t\t\tpreviewUrl,\n\t\t},\n\t}\n\n\treturn node.type === 'file'\n\t\t? new File(nodeData)\n\t\t: new Folder(nodeData)\n}\n\nexport const getContents = async (path: string = '/'): Promise<ContentsWithRoot> => {\n\t// TODO: use only one request when webdav-client supports it\n\t// @see https://github.com/perry-mitchell/webdav-client/pull/334\n\tconst rootResponse = await client.stat(path, {\n\t\tdetails: true,\n\t\tdata,\n\t}) as ResponseDataDetailed<FileStat>\n\n\tconst contentsResponse = await client.getDirectoryContents(path, {\n\t\tdetails: true,\n\t\tdata,\n\t}) as ResponseDataDetailed<FileStat[]>\n\n\treturn {\n\t\tfolder: resultToNode(rootResponse.data) as Folder,\n\t\tcontents: contentsResponse.data.map(resultToNode),\n\t}\n}\n","/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('files')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { Node } from '@nextcloud/files'\nimport logger from '../logger'\n\ndeclare global {\n\tinterface Window {\n\t\tOC: any;\n\t\t_nc_fileactions: FileAction[] | undefined;\n\t}\n}\n\n/**\n * TODO: remove and move to @nextcloud/files\n * @see https://github.com/nextcloud/nextcloud-files/pull/608\n */\ninterface FileActionData {\n\t/** Unique ID */\n\tid: string\n\t/** Translatable string displayed in the menu */\n\tdisplayName: (files: Node[], view) => string\n\t/** Svg as inline string. <svg><path fill=\"...\" /></svg> */\n\ticonSvgInline: (files: Node[], view) => string\n\t/** Condition wether this action is shown or not */\n\tenabled?: (files: Node[], view) => boolean\n\t/**\n\t * Function executed on single file action\n\t * @returns true if the action was executed, false otherwise\n\t * @throws Error if the action failed\n\t */\n\texec: (file: Node, view) => Promise<boolean>,\n\t/**\n\t * Function executed on multiple files action\n\t * @returns true if the action was executed, false otherwise\n\t * @throws Error if the action failed\n\t */\n\texecBatch?: (files: Node[], view) => Promise<boolean[]>\n\t/** This action order in the list */\n\torder?: number,\n\t/** Make this action the default */\n\tdefault?: boolean,\n\t/**\n\t * If true, the renderInline function will be called\n\t */\n\tinline?: (file: Node, view) => boolean,\n\t/**\n\t * If defined, the returned html element will be\n\t * appended before the actions menu.\n\t */\n\trenderInline?: (file: Node, view) => HTMLElement,\n}\n\nexport class FileAction {\n\n\tprivate _action: FileActionData\n\n\tconstructor(action: FileActionData) {\n\t\tthis.validateAction(action)\n\t\tthis._action = action\n\t}\n\n\tget id() {\n\t\treturn this._action.id\n\t}\n\n\tget displayName() {\n\t\treturn this._action.displayName\n\t}\n\n\tget iconSvgInline() {\n\t\treturn this._action.iconSvgInline\n\t}\n\n\tget enabled() {\n\t\treturn this._action.enabled\n\t}\n\n\tget exec() {\n\t\treturn this._action.exec\n\t}\n\n\tget execBatch() {\n\t\treturn this._action.execBatch\n\t}\n\n\tget order() {\n\t\treturn this._action.order\n\t}\n\n\tget default() {\n\t\treturn this._action.default\n\t}\n\n\tget inline() {\n\t\treturn this._action.inline\n\t}\n\n\tget renderInline() {\n\t\treturn this._action.renderInline\n\t}\n\n\tprivate validateAction(action: FileActionData) {\n\t\tif (!action.id || typeof action.id !== 'string') {\n\t\t\tthrow new Error('Invalid id')\n\t\t}\n\n\t\tif (!action.displayName || typeof action.displayName !== 'function') {\n\t\t\tthrow new Error('Invalid displayName function')\n\t\t}\n\n\t\tif (!action.iconSvgInline || typeof action.iconSvgInline !== 'function') {\n\t\t\tthrow new Error('Invalid iconSvgInline function')\n\t\t}\n\n\t\tif (!action.exec || typeof action.exec !== 'function') {\n\t\t\tthrow new Error('Invalid exec function')\n\t\t}\n\n\t\t// Optional properties --------------------------------------------\n\t\tif ('enabled' in action && typeof action.enabled !== 'function') {\n\t\t\tthrow new Error('Invalid enabled function')\n\t\t}\n\n\t\tif ('execBatch' in action && typeof action.execBatch !== 'function') {\n\t\t\tthrow new Error('Invalid execBatch function')\n\t\t}\n\n\t\tif ('order' in action && typeof action.order !== 'number') {\n\t\t\tthrow new Error('Invalid order')\n\t\t}\n\n\t\tif ('default' in action && typeof action.default !== 'boolean') {\n\t\t\tthrow new Error('Invalid default')\n\t\t}\n\n\t\tif ('inline' in action && typeof action.inline !== 'function') {\n\t\t\tthrow new Error('Invalid inline function')\n\t\t}\n\n\t\tif ('renderInline' in action && typeof action.renderInline !== 'function') {\n\t\t\tthrow new Error('Invalid renderInline function')\n\t\t}\n\t}\n\n}\n\nexport const registerFileAction = function(action: FileAction): void {\n\tif (typeof window._nc_fileactions === 'undefined') {\n\t\twindow._nc_fileactions = []\n\t\tlogger.debug('FileActions initialized')\n\t}\n\n\t// Check duplicates\n\tif (window._nc_fileactions.find(search => search.id === action.id)) {\n\t\tlogger.error(`FileAction ${action.id} already registered`, { action })\n\t\treturn\n\t}\n\n\twindow._nc_fileactions.push(action)\n}\n\nexport const getFileActions = function(): FileAction[] {\n\treturn window._nc_fileactions || []\n}\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { emit } from '@nextcloud/event-bus'\nimport { generateRemoteUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { Permission, Node } from '@nextcloud/files'\nimport { translate as t } from '@nextcloud/l10n'\nimport axios from '@nextcloud/axios'\nimport History from '@mdi/svg/svg/history.svg?raw'\n\nimport { registerFileAction, FileAction } from '../../../files/src/services/FileAction.ts'\nimport logger from '../../../files/src/logger.js'\n\nregisterFileAction(new FileAction({\n\tid: 'restore',\n\tdisplayName() {\n\t\treturn t('files_trashbin', 'Restore')\n\t},\n\ticonSvgInline: () => History,\n\n\tenabled(nodes: Node[], view) {\n\t\t// Only available in the trashbin view\n\t\tif (view.id !== 'trashbin') {\n\t\t\treturn false\n\t\t}\n\n\t\t// Only available if all nodes have read permission\n\t\treturn nodes.length > 0 && nodes\n\t\t\t.map(node => node.permissions)\n\t\t\t.every(permission => (permission & Permission.READ) !== 0)\n\t},\n\n\tasync exec(node: Node) {\n\t\ttry {\n\t\t\tconst destination = generateRemoteUrl(`dav/trashbin/${getCurrentUser()?.uid}/restore/${node.basename}`)\n\t\t\tawait axios({\n\t\t\t\tmethod: 'MOVE',\n\t\t\t\turl: node.source,\n\t\t\t\theaders: {\n\t\t\t\t\tdestination,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\t// Let's pretend the file is deleted since\n\t\t\t// we don't know the restored location\n\t\t\temit('files:node:deleted', node)\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tlogger.error(error)\n\t\t\treturn false\n\t\t}\n\t},\n\tasync execBatch(nodes: Node[], view) {\n\t\treturn Promise.all(nodes.map(node => this.exec(node, view)))\n\t},\n\n\torder: 1,\n\tinline: () => true,\n}))\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport type NavigationService from '../../files/src/services/Navigation.ts'\nimport type { Navigation } from '../../files/src/services/Navigation.ts'\n\nimport { translate as t, translate } from '@nextcloud/l10n'\nimport DeleteSvg from '@mdi/svg/svg/delete.svg?raw'\nimport moment from '@nextcloud/moment'\n\nimport { getContents } from './services/trashbin'\n\n// Register restore action\nimport './actions/restoreAction'\n\nconst Navigation = window.OCP.Files.Navigation as NavigationService\nNavigation.register({\n\tid: 'trashbin',\n\tname: t('files_trashbin', 'Deleted files'),\n\tcaption: t('files_trashbin', 'List of files that have been deleted.'),\n\n\ticon: DeleteSvg,\n\torder: 50,\n\tsticky: true,\n\n\tdefaultSortKey: 'deleted',\n\n\tcolumns: [\n\t\t{\n\t\t\tid: 'deleted',\n\t\t\ttitle: t('files_trashbin', 'Deleted'),\n\t\t\trender(node) {\n\t\t\t\tconst deletionTime = node.attributes?.['trashbin-deletion-time']\n\t\t\t\tconst span = document.createElement('span')\n\t\t\t\tif (deletionTime) {\n\t\t\t\t\tspan.title = moment.unix(deletionTime).format('LLL')\n\t\t\t\t\tspan.textContent = moment.unix(deletionTime).fromNow()\n\t\t\t\t\treturn span\n\t\t\t\t}\n\n\t\t\t\t// Unknown deletion time\n\t\t\t\tspan.textContent = translate('files_trashbin', 'A long time ago')\n\t\t\t\treturn span\n\t\t\t},\n\t\t\tsort(nodeA, nodeB) {\n\t\t\t\tconst deletionTimeA = nodeA.attributes?.['trashbin-deletion-time'] || nodeA?.mtime || 0\n\t\t\t\tconst deletionTimeB = nodeB.attributes?.['trashbin-deletion-time'] || nodeB?.mtime || 0\n\t\t\t\treturn deletionTimeB - deletionTimeA\n\t\t\t},\n\t\t},\n\t],\n\n\tgetContents,\n} as Navigation)\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 5992;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t5992: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], () => (__webpack_require__(95761)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","rootPath","getCurrentUser","uid","rootUrl","generateRemoteUrl","createClient","headers","requesttoken","getRequestToken","data","resultToNode","node","permissions","parseWebdavPermissions","props","owner","previewUrl","generateUrl","nodeData","id","fileid","source","filename","mtime","Date","lastmod","mime","size","root","attributes","displayName","type","File","Folder","getLoggerBuilder","setApp","detectUser","build","action","constructor","this","validateAction","_action","iconSvgInline","enabled","exec","execBatch","order","default","inline","renderInline","Error","t","History","nodes","view","length","map","every","permission","Permission","async","destination","basename","axios","method","url","emit","error","logger","Promise","all","window","_nc_fileactions","debug","find","search","push","OCP","Files","Navigation","register","name","caption","icon","DeleteSvg","sticky","defaultSortKey","columns","title","render","deletionTime","span","document","createElement","moment","format","textContent","fromNow","translate","sort","nodeA","nodeB","deletionTimeA","getContents","path","rootResponse","client","details","contentsResponse","folder","contents","webpackContext","req","webpackContextResolve","__webpack_require__","o","e","code","keys","Object","resolve","module","exports","__webpack_module_cache__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","key","splice","r","n","getter","__esModule","d","a","definition","defineProperty","enumerable","get","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","value","nmd","paths","children","b","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"files_trashbin-main.js?v=848da85278e89893aec7","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/files_trashbin/src/services/client.ts","webpack:///nextcloud/apps/files_trashbin/src/services/trashbin.ts","webpack:///nextcloud/apps/files/src/logger.js","webpack:///nextcloud/apps/files/src/services/FileAction.ts","webpack:///nextcloud/apps/files_trashbin/src/actions/restoreAction.ts","webpack:///nextcloud/apps/files_trashbin/src/main.ts","webpack:///nextcloud/node_modules/moment/locale|sync|/^\\.\\/.*$","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { createClient } from 'webdav';\nimport { generateRemoteUrl } from '@nextcloud/router';\nimport { getCurrentUser, getRequestToken } from '@nextcloud/auth';\nexport const rootPath = `/trashbin/${getCurrentUser()?.uid}/trash`;\nexport const rootUrl = generateRemoteUrl('dav' + rootPath);\nconst client = createClient(rootUrl, {\n headers: {\n requesttoken: getRequestToken(),\n },\n});\nexport default client;\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n/* eslint-disable */\nimport { getCurrentUser } from '@nextcloud/auth';\nimport { File, Folder, parseWebdavPermissions } from '@nextcloud/files';\nimport { generateRemoteUrl, generateUrl } from '@nextcloud/router';\nimport client, { rootPath } from './client';\nconst data = `<?xml version=\"1.0\"?>\n<d:propfind xmlns:d=\"DAV:\"\n\txmlns:oc=\"http://owncloud.org/ns\"\n\txmlns:nc=\"http://nextcloud.org/ns\">\n\t<d:prop>\n\t\t<nc:trashbin-filename />\n\t\t<nc:trashbin-deletion-time />\n\t\t<nc:trashbin-original-location />\n\t\t<nc:trashbin-title />\n\t\t<d:getlastmodified />\n\t\t<d:getetag />\n\t\t<d:getcontenttype />\n\t\t<d:resourcetype />\n\t\t<oc:fileid />\n\t\t<oc:permissions />\n\t\t<oc:size />\n\t\t<d:getcontentlength />\n\t</d:prop>\n</d:propfind>`;\nconst resultToNode = function (node) {\n const permissions = parseWebdavPermissions(node.props?.permissions);\n const owner = getCurrentUser()?.uid;\n const previewUrl = generateUrl('/apps/files_trashbin/preview?fileId={fileid}&x=32&y=32', node.props);\n const nodeData = {\n id: node.props?.fileid || 0,\n source: generateRemoteUrl('dav' + rootPath + node.filename),\n mtime: new Date(node.lastmod),\n mime: node.mime,\n size: node.props?.size || 0,\n permissions,\n owner,\n root: rootPath,\n attributes: {\n ...node,\n ...node.props,\n // Override displayed name on the list\n displayName: node.props?.['trashbin-filename'],\n previewUrl,\n },\n };\n return node.type === 'file'\n ? new File(nodeData)\n : new Folder(nodeData);\n};\nexport const getContents = async (path = '/') => {\n // TODO: use only one request when webdav-client supports it\n // @see https://github.com/perry-mitchell/webdav-client/pull/334\n const rootResponse = await client.stat(path, {\n details: true,\n data,\n });\n const contentsResponse = await client.getDirectoryContents(path, {\n details: true,\n data,\n });\n return {\n folder: resultToNode(rootResponse.data),\n contents: contentsResponse.data.map(resultToNode),\n };\n};\n","/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('files')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { Node } from '@nextcloud/files';\nimport logger from '../logger';\nexport class FileAction {\n _action;\n constructor(action) {\n this.validateAction(action);\n this._action = action;\n }\n get id() {\n return this._action.id;\n }\n get displayName() {\n return this._action.displayName;\n }\n get iconSvgInline() {\n return this._action.iconSvgInline;\n }\n get enabled() {\n return this._action.enabled;\n }\n get exec() {\n return this._action.exec;\n }\n get execBatch() {\n return this._action.execBatch;\n }\n get order() {\n return this._action.order;\n }\n get default() {\n return this._action.default;\n }\n get inline() {\n return this._action.inline;\n }\n get renderInline() {\n return this._action.renderInline;\n }\n validateAction(action) {\n if (!action.id || typeof action.id !== 'string') {\n throw new Error('Invalid id');\n }\n if (!action.displayName || typeof action.displayName !== 'function') {\n throw new Error('Invalid displayName function');\n }\n if (!action.iconSvgInline || typeof action.iconSvgInline !== 'function') {\n throw new Error('Invalid iconSvgInline function');\n }\n if (!action.exec || typeof action.exec !== 'function') {\n throw new Error('Invalid exec function');\n }\n // Optional properties --------------------------------------------\n if ('enabled' in action && typeof action.enabled !== 'function') {\n throw new Error('Invalid enabled function');\n }\n if ('execBatch' in action && typeof action.execBatch !== 'function') {\n throw new Error('Invalid execBatch function');\n }\n if ('order' in action && typeof action.order !== 'number') {\n throw new Error('Invalid order');\n }\n if ('default' in action && typeof action.default !== 'boolean') {\n throw new Error('Invalid default');\n }\n if ('inline' in action && typeof action.inline !== 'function') {\n throw new Error('Invalid inline function');\n }\n if ('renderInline' in action && typeof action.renderInline !== 'function') {\n throw new Error('Invalid renderInline function');\n }\n }\n}\nexport const registerFileAction = function (action) {\n if (typeof window._nc_fileactions === 'undefined') {\n window._nc_fileactions = [];\n logger.debug('FileActions initialized');\n }\n // Check duplicates\n if (window._nc_fileactions.find(search => search.id === action.id)) {\n logger.error(`FileAction ${action.id} already registered`, { action });\n return;\n }\n window._nc_fileactions.push(action);\n};\nexport const getFileActions = function () {\n return window._nc_fileactions || [];\n};\n","/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { emit } from '@nextcloud/event-bus';\nimport { generateRemoteUrl } from '@nextcloud/router';\nimport { getCurrentUser } from '@nextcloud/auth';\nimport { Permission, Node } from '@nextcloud/files';\nimport { translate as t } from '@nextcloud/l10n';\nimport axios from '@nextcloud/axios';\nimport History from '@mdi/svg/svg/history.svg?raw';\nimport { registerFileAction, FileAction } from '../../../files/src/services/FileAction.ts';\nimport logger from '../../../files/src/logger.js';\nregisterFileAction(new FileAction({\n id: 'restore',\n displayName() {\n return t('files_trashbin', 'Restore');\n },\n iconSvgInline: () => History,\n enabled(nodes, view) {\n // Only available in the trashbin view\n if (view.id !== 'trashbin') {\n return false;\n }\n // Only available if all nodes have read permission\n return nodes.length > 0 && nodes\n .map(node => node.permissions)\n .every(permission => (permission & Permission.READ) !== 0);\n },\n async exec(node) {\n try {\n const destination = generateRemoteUrl(`dav/trashbin/${getCurrentUser()?.uid}/restore/${node.basename}`);\n await axios({\n method: 'MOVE',\n url: node.source,\n headers: {\n destination,\n },\n });\n // Let's pretend the file is deleted since\n // we don't know the restored location\n emit('files:node:deleted', node);\n return true;\n }\n catch (error) {\n logger.error(error);\n return false;\n }\n },\n async execBatch(nodes, view) {\n return Promise.all(nodes.map(node => this.exec(node, view)));\n },\n order: 1,\n inline: () => true,\n}));\n","import { translate as t, translate } from '@nextcloud/l10n';\nimport DeleteSvg from '@mdi/svg/svg/delete.svg?raw';\nimport moment from '@nextcloud/moment';\nimport { getContents } from './services/trashbin';\n// Register restore action\nimport './actions/restoreAction';\nconst Navigation = window.OCP.Files.Navigation;\nNavigation.register({\n id: 'trashbin',\n name: t('files_trashbin', 'Deleted files'),\n caption: t('files_trashbin', 'List of files that have been deleted.'),\n icon: DeleteSvg,\n order: 50,\n sticky: true,\n defaultSortKey: 'deleted',\n columns: [\n {\n id: 'deleted',\n title: t('files_trashbin', 'Deleted'),\n render(node) {\n const deletionTime = node.attributes?.['trashbin-deletion-time'];\n const span = document.createElement('span');\n if (deletionTime) {\n span.title = moment.unix(deletionTime).format('LLL');\n span.textContent = moment.unix(deletionTime).fromNow();\n return span;\n }\n // Unknown deletion time\n span.textContent = translate('files_trashbin', 'A long time ago');\n return span;\n },\n sort(nodeA, nodeB) {\n const deletionTimeA = nodeA.attributes?.['trashbin-deletion-time'] || nodeA?.mtime || 0;\n const deletionTimeB = nodeB.attributes?.['trashbin-deletion-time'] || nodeB?.mtime || 0;\n return deletionTimeB - deletionTimeA;\n },\n },\n ],\n getContents,\n});\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 5992;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t5992: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], () => (__webpack_require__(1345)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","rootPath","getCurrentUser","uid","rootUrl","generateRemoteUrl","createClient","headers","requesttoken","getRequestToken","data","resultToNode","node","permissions","parseWebdavPermissions","props","owner","previewUrl","generateUrl","nodeData","id","fileid","source","filename","mtime","Date","lastmod","mime","size","root","attributes","displayName","type","File","Folder","getLoggerBuilder","setApp","detectUser","build","action","constructor","this","validateAction","_action","iconSvgInline","enabled","exec","execBatch","order","default","inline","renderInline","Error","t","History","nodes","view","length","map","every","permission","Permission","async","destination","basename","axios","method","url","emit","error","logger","Promise","all","window","_nc_fileactions","debug","find","search","push","OCP","Files","Navigation","register","name","caption","icon","DeleteSvg","sticky","defaultSortKey","columns","title","render","deletionTime","span","document","createElement","moment","format","textContent","fromNow","translate","sort","nodeA","nodeB","deletionTimeA","getContents","path","rootResponse","client","details","contentsResponse","folder","contents","webpackContext","req","webpackContextResolve","__webpack_require__","o","e","code","keys","Object","resolve","module","exports","__webpack_module_cache__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","key","splice","r","n","getter","__esModule","d","a","definition","defineProperty","enumerable","get","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","value","nmd","paths","children","b","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file diff --git a/webpack.common.js b/webpack.common.js index 4d61ded36dc..9f1d34cba39 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -89,7 +89,16 @@ module.exports = { }, { test: /\.tsx?$/, - use: 'babel-loader', + use: [ + 'babel-loader', + { + // Fix TypeScript syntax errors in Vue + loader: 'ts-loader', + options: { + transpileOnly: true, + }, + }, + ], exclude: BabelLoaderExcludeNodeModulesExcept([]), }, { @@ -210,6 +219,13 @@ module.exports = { vue$: path.resolve('./node_modules/vue'), }, extensions: ['*', '.ts', '.js', '.vue'], + extensionAlias: { + /** + * Resolve TypeScript files when using fully-specified esm import paths + * https://github.com/webpack/webpack/issues/13252 + */ + '.js': ['.js', '.ts'], + }, symlinks: true, fallback: { fs: false, |