From 97cc9cfea17ca41ff393ea29b0454880f29da9ba Mon Sep 17 00:00:00 2001 From: Marco Ambrosini Date: Tue, 22 Sep 2026 14:28:53 +0200 Subject: [PATCH 1/2] fix(teams): hide circles the user is not a member of The /circles endpoint returns visible/public circles (initiator: null) alongside the user's own circles. Filter them out so only member circles appear on the Teams home page. Assisted-by: ClaudeCode:claude-sonnet-4-6 Signed-off-by: Marco Ambrosini --- ...mjs => TrashCanOutline-DbEqwasY.chunk.mjs} | 4 ++-- ...rashCanOutline-DbEqwasY.chunk.mjs.license} | 0 ...=> TrashCanOutline-DbEqwasY.chunk.mjs.map} | 2 +- ...CanOutline-DbEqwasY.chunk.mjs.map.license} | 0 js/teams-main.mjs | 2 +- js/teams-settings-team-folders.mjs | 2 +- src/teams/api.spec.ts | 20 ++++++++++++++++++- src/teams/api.ts | 4 ++-- 8 files changed, 26 insertions(+), 8 deletions(-) rename js/{TrashCanOutline-CC2GsQhE.chunk.mjs => TrashCanOutline-DbEqwasY.chunk.mjs} (80%) rename js/{TrashCanOutline-CC2GsQhE.chunk.mjs.license => TrashCanOutline-DbEqwasY.chunk.mjs.license} (100%) rename js/{TrashCanOutline-CC2GsQhE.chunk.mjs.map => TrashCanOutline-DbEqwasY.chunk.mjs.map} (52%) rename js/{TrashCanOutline-CC2GsQhE.chunk.mjs.map.license => TrashCanOutline-DbEqwasY.chunk.mjs.map.license} (100%) diff --git a/js/TrashCanOutline-CC2GsQhE.chunk.mjs b/js/TrashCanOutline-DbEqwasY.chunk.mjs similarity index 80% rename from js/TrashCanOutline-CC2GsQhE.chunk.mjs rename to js/TrashCanOutline-DbEqwasY.chunk.mjs index 689106849..3080dd3bc 100644 --- a/js/TrashCanOutline-CC2GsQhE.chunk.mjs +++ b/js/TrashCanOutline-DbEqwasY.chunk.mjs @@ -1,3 +1,3 @@ import{E as te,x as I,c as o,a as ae,D as Ee,ai as Be,aj as xe,f as ie,C as Ne,ak as Te,al as $e,y as Ae,K as Le}from"./logger-BzLa-8Kq.chunk.mjs";import{S as f,g as F,d as O,e as Re,r as Oe,F as Me}from"./NcSelect--kERLlBK-CMhSEo4a.chunk.mjs";import{_ as j,d as M,am as Ve,an as Se,ao as Fe,e as p,p as h,v as w,K as R,ap as He,aq as De,h as $,f as N,w as y,j as g,q as x,i as v,x as V,Z as Ue,s as S,a0 as Pe,E as je,C as qe,F as W,Q as ze,ar as Ge,k as T,I as X,S as l,b as se,G as re,H as We,P as c,D,c as k,as as Ze,X as Je,at as Ke,r as Qe,au as Ye,a as ee,A as Xe,T as H,ah as et,l as tt,V as A}from"./_plugin-vue_export-helper-BBv7rb2Q.chunk.mjs";import{b as at}from"./NcPasswordField-BFyzHTOO-BWr8u7xv.chunk.mjs";const it=M({__name:"NcFormBox",props:{row:{type:Boolean}},setup(e){const a=Ve();return Se(Fe,{isInFormBox:!0,formBoxItemClass:a.ncFormBox__item}),(i,r)=>(p(),h("div",{class:R([i.$style.ncFormBox,e.row?i.$style.ncFormBox_row:i.$style.ncFormBox_col])},[w(i.$slots,"default",{itemClass:i.$style.ncFormBox__item})],2))}}),st="_ncFormBox_s7kf-",rt="_ncFormBox_row_GzYuE",nt="_ncFormBox__item_691pI",ct="_ncFormBox_col_Lt4lg",ot={"material-design-icon":"_material-design-icon_JPsV1",ncFormBox:st,ncFormBox_row:rt,ncFormBox__item:nt,ncFormBox_col:ct},lt={$style:ot},ne=j(it,[["__cssModules",lt]]),dt=["id"],ut=M({inheritAttrs:!1,__name:"NcFormBoxItem",props:{tag:{},label:{default:()=>{}},description:{default:()=>{}},invertedAccent:{type:Boolean,default:!1},class:{default:()=>{}},itemClasses:{default:()=>{}}},emits:["click"],setup(e){const a=He(),{formBoxItemClass:i}=De(),r=te(),d=()=>!!e.description||!!a.description;return(s,n)=>(p(),h("div",{class:R([e.class,s.$style.formBoxItem,g(i),{[s.$style.formBoxItem_inverted]:e.invertedAccent&&d(),[s.$style.formBoxItem_legacy]:g(Pe)}])},[$("span",{class:R(s.$style.formBoxItem__content)},[(p(),N(Ue(e.tag),V({class:[s.$style.formBoxItem__element,e.itemClasses]},s.$attrs,{onClick:n[0]||(n[0]=m=>s.$emit("click",m))}),{default:y(()=>[w(s.$slots,"default",{descriptionId:g(r)},()=>[x(v(e.label||"⚠️ Label is missing"),1)])]),_:3},16,["class"])),d()?(p(),h("span",{key:0,id:g(r),class:R(s.$style.formBoxItem__description)},[w(s.$slots,"description",{},()=>[x(v(e.description),1)])],10,dt)):S("",!0)],2),$("span",{class:R(s.$style.formBoxItem__icon)},[w(s.$slots,"icon",{descriptionId:g(r)},()=>[n[1]||(n[1]=x(" ⚠️ Icon is missing ",-1))])],2)],2))}}),mt="_formBoxItem_Gp-TA",pt="_formBoxItem__description_UqZJ1",ft="_formBoxItem_legacy_dP9aJ",ht="_formBoxItem_inverted_BU-i-",yt="_formBoxItem__element_jHCux",bt="_formBoxItem__content_UKovC",gt="_formBoxItem__icon_AvkP3",vt={"material-design-icon":"_material-design-icon_8BFGk",formBoxItem:mt,formBoxItem__description:pt,formBoxItem_legacy:ft,formBoxItem_inverted:ht,formBoxItem__element:yt,formBoxItem__content:bt,formBoxItem__icon:gt},_t={$style:vt},ce=j(ut,[["__cssModules",_t]]),It=["id","aria-describedby","disabled"],wt=M({__name:"NcFormBoxSwitch",props:X({label:{default:()=>{}},description:{default:()=>{}},disabled:{type:Boolean,default:!1}},{modelValue:{type:Boolean,required:!0},modelModifiers:{}}),emits:X(["enable","disable"],["update:modelValue"]),setup(e,{emit:a}){const i=je(e,"modelValue"),r=a,d=te();return qe(i,()=>{i.value?r("enable"):r("disable")},{flush:"sync"}),(s,n)=>(p(),N(ce,{tag:"label",for:g(d)},W({icon:y(({descriptionId:m})=>[ze($("input",{id:g(d),"onUpdate:modelValue":n[0]||(n[0]=b=>i.value=b),class:R(s.$style.formBoxSwitch__input),type:"checkbox",role:"switch","aria-describedby":m,disabled:e.disabled},null,10,It),[[Ge,i.value]]),T(at,{checked:i.value,inline:""},null,8,["checked"])]),_:2},[s.$slots.default||e.label?{name:"default",fn:y(()=>[w(s.$slots,"default",{},()=>[x(v(e.label),1)])]),key:"0"}:void 0,s.$slots.description||e.description?{name:"description",fn:y(()=>[w(s.$slots,"description",{},()=>[x(v(e.description),1)])]),key:"1"}:void 0]),1032,["for"]))}}),Ct="_formBoxSwitch__input_n8432",kt={"material-design-icon":"_material-design-icon_v0XYD",formBoxSwitch__input:Ct},Et={$style:kt},Bt=j(wt,[["__cssModules",Et]]);class L{_data={};_circle;constructor(a,i){if(typeof a!="object")throw new Error("Invalid member");if(a.id&&typeof a.id!="string")throw I.error("This member do not have a proper uid",a),new Error("This member do not have a proper uid");this._circle=i,this._data=a}get circle(){return this._circle}set circle(a){if(a.constructor.name!==q.name)throw new Error("circle must be a Circle type");this._circle=a}get id(){return this._data.id}get singleId(){return this._data.singleId}get displayName(){return this._data.displayName}get userId(){return this._data.userId}get userType(){return this._data.userType!==we.CIRCLE?this._data.userType:this.basedOn.source}get basedOn(){return this._data.basedOn}get level(){return this._data.level}set level(a){if(!(a in B))throw new Error("Invalid level");this._data.level=a}get status(){return this._data.status}get isUser(){return this._data.userType===B.MEMBER}get isOrphan(){return this._circle?.constructor?.name!==q.name}delete(){if(this.isOrphan)throw new Error("Cannot delete this member as it doesn't belong to any circle");this.circle.deleteMember(this),this._data=void 0}}class q{_data={};_members={};_owner;_initiator;constructor(a){this.updateData(a)}updateData(a){if(typeof a!="object")throw new Error("Invalid circle");if(!a.id)throw new Error("This circle do not have a proper uid");this._data=a,this._owner=new L(a.owner,this),a.initiator&&(this._initiator=new L(a.initiator,this))}get id(){return this._data.id}get displayName(){return this._data.displayName}set displayName(a){this._data.displayName=a}get creation(){return this._data.creation}get description(){return this._data.description}set description(a){this._data.description=a}get population(){return this._data.population}get populationInherited(){return this._data.populationInherited}get initiator(){return this._initiator}set initiator(a){if(a&&a.constructor.name!==L.name)throw new Error("Initiator must be a Member type");this._initiator=a}get owner(){return this._owner}set owner(a){if(a.constructor.name!==L.name)throw new Error("Owner must be a Member type");this._owner=a}get members(){return this._members}set members(a){this._members=a}addMember(a){if(a.constructor.name!==L.name)throw new Error("Member must be a Member type");const i=a.singleId;this._members[i]&&I.warn("Replacing existing member data",{member:a}),this._members[i]=a}deleteMember(a){if(a.constructor.name!==L.name)throw new Error("Member must be a Member type");const i=a.singleId;this._members[i]||I.warn("The member was not in this circle. Nothing was done.",{member:a}),delete this._members[i]}get settings(){return this._data.settings}get config(){return this._data.config}set config(a){this._data.config=a}get isPersonal(){return(this._data.config&E.PERSONAL)!==0}get requireJoinAccept(){return(this._data.config&E.VISIBLE)!==0}get canJoin(){return(this._data.config&E.OPEN)!==0}get isVisible(){return(this._data.config&E.VISIBLE)!==0}get requireInviteAccept(){return(this._data.config&E.INVITE)!==0}get isOwner(){return this.initiator?.level===B.OWNER}get isAdmin(){return this.initiator?.level===B.ADMIN}get isMember(){return this.initiator?.level&&this.initiator?.level>B.NONE}get isPendingMember(){return this.initiator?.level===B.NONE}get canDelete(){return this.isOwner}get canLeave(){return this.isMember&&!this.isOwner}get canManageMembers(){return this.initiator?.level&&this.initiator?.level>=B.MODERATOR||(this.config&E.FRIEND)!==0}get router(){return{name:"team",params:{teamId:this.id}}}get invitationCode(){return this._data.invitationCode}set invitationCode(a){this._data.invitationCode=a}toString(){return this.displayName}}var oe=(e=>(e.Name="name",e.Description="description",e.Settings="settings",e.Config="config",e))(oe||{});async function Sa(){return(await o.get(l("apps/circles/circles"))).data.ocs.data}async function Fa(e){return(await o.get(l("apps/circles/circles/{circleId}",{circleId:e}))).data.ocs.data}async function Ha(e,a,i){return(await o.post(l("apps/circles/circles"),{name:e,personal:a,local:i})).data.ocs.data}async function Da(e){return(await o.delete(l("apps/circles/circles/{circleId}",{circleId:e}))).data.ocs.data}async function xt(e,a,i){return(await o.put(l("apps/circles/circles/{circleId}/{type}",{circleId:e,type:a}),{value:i})).data.ocs.data}async function Ua(e){return(await o.put(l("apps/circles/circles/{circleId}/join",{circleId:e}))).data.ocs.data}async function Pa(e){return(await o.put(l("apps/circles/circles/{circleId}/leave",{circleId:e}))).data.ocs.data}async function ja(e,a,i,r){return(await o.get(l("apps/circles/circles/{circleId}/members",{circleId:e}),{params:{search:a,role:i,...r?{limit:r}:{}}})).data.ocs.data}async function qa(e,a){return(await o.post(l("apps/circles/circles/{circleId}/members/multi",{circleId:e}),{members:a})).data.ocs.data}async function za(e,a){const i=await o.delete(l("apps/circles/circles/{circleId}/members/{memberId}",{circleId:e,memberId:a}));return Object.values(i.data.ocs.data)}async function Ga(e,a,i){if(!(i in B))throw new Error("Invalid level.");const r=await o.put(l("apps/circles/circles/{circleId}/members/{memberId}/level",{circleId:e,memberId:a}),{level:i});return Object.values(r.data.ocs.data)}async function Wa(e,a){return(await o.put(l("apps/circles/circles/{circleId}/members/{memberId}",{circleId:e,memberId:a}))).data.ocs.data}async function Za(e,a){return(await o.put(l("apps/circles/circles/{circleId}/setting",{circleId:e}),a)).data.ocs.data}async function Ja(e){return(await o.get(l("apps/circles/invitations/{invitationCode}",{invitationCode:e}))).data.ocs.data}async function Ka(e){return(await o.post(l("apps/circles/invitations/{invitationCode}",{invitationCode:e}))).data.ocs.data}async function Qa(e){return(await o.put(l("apps/circles/circles/{circleId}/invitation",{circleId:e}))).data.ocs.data}async function Ya(e){return(await o.delete(l("apps/circles/circles/{circleId}/invitation",{circleId:e}))).data.ocs.data}const U=M({__name:"CircleConfigCheckboxesList",props:{circle:{},configs:{}},setup(e){const a=e,i=se(!1);function r(n){return(a.circle.config&n)!==0}async function d(n,m){if(I.debug(`Circle config ${n} is set to ${m}`),m&&n===E.FEDERATED&&!await s())return;i.value=n;const b=a.circle.config,_=m?b|n:b&~n;try{const u=await xt(a.circle.id,oe.Config,_);a.circle.config=u.config}catch(u){I.error("Unable to edit circle config",{prevConfig:b,config:_,error:u}),ae(c("circles","An error happened during the config change"))}finally{i.value=!1}}async function s(){return await Ee({name:c("circles","Confirm enabling federation"),text:c("circles",`Enabling this will prevent {circle} from being a member of other teams. -Are you sure?`,{circle:a.circle.displayName}),labelConfirm:c("circles","Enable federation"),labelReject:c("circles","Cancel"),severity:"warning"})?!0:(I.debug("Enable federation cancelled"),!1)}return(n,m)=>(p(),N(g(ne),null,{default:y(()=>[(p(!0),h(re,null,We(e.configs,(b,_)=>(p(),N(g(Bt),{key:"circle-config"+_,"model-value":r(Number(_)),label:b,disabled:i.value!==!1,"onUpdate:modelValue":u=>d(Number(_),u)},null,8,["model-value","label","disabled","onUpdate:modelValue"]))),128))]),_:1}))}});function Nt(e){const a=Ze(e),i=Je(Ke,null)!==null,r=k(()=>i&&a.to?"RouterLink":a.href?"a":"button"),d=k(()=>r.value==="RouterLink"||r.value==="a"),s=k(()=>r.value==="a"),n=k(()=>r.value==="RouterLink"),m=k(()=>r.value==="button"),b=k(()=>{if(r.value==="RouterLink")return{to:a.to,activeClass:"active",...a.additionalAttrs?.("RouterLink")??{}};if(r.value==="a")return{href:a.href,target:a.target,download:a.download||void 0,rel:"nofollow noreferrer noopener",...a.additionalAttrs?.("a")??{}};if(r.value==="button")return{type:a.type||"button",disabled:a.disabled,...a.additionalAttrs?.("button")??{}}});return{tag:r,isLink:d,isHyperLink:s,isRouterLink:n,isButton:m,attrs:b}}const Tt=M({__name:"NcFormBoxButton",props:{label:{default:()=>{}},description:{default:()=>{}},invertedAccent:{type:Boolean,default:!1},to:{default:()=>{}},href:{default:()=>{}},target:{default:()=>{}},disabled:{type:Boolean,default:!1}},emits:["click"],setup(e){const{tag:a,attrs:i,isLink:r}=Nt({to:D(()=>e.to),href:D(()=>e.href),target:D(()=>e.target),disabled:D(()=>e.disabled)}),d=k(()=>{if(r.value)return e.target==="_blank"?Be:xe});return(s,n)=>(p(),N(ce,V({tag:g(a),itemClasses:["button-vue",s.$style.formBoxButton],invertedAccent:e.invertedAccent},g(i),{tabindex:"0",onClick:n[0]||(n[0]=m=>s.$emit("click",m))}),W({_:2},[s.$slots.default||e.label?{name:"default",fn:y(()=>[w(s.$slots,"default",{},()=>[x(v(e.label),1)])]),key:"0"}:void 0,s.$slots.description||e.description?{name:"description",fn:y(()=>[w(s.$slots,"description",{},()=>[x(v(e.description),1)])]),key:"1"}:void 0,s.$slots.icon||d.value?{name:"icon",fn:y(()=>[w(s.$slots,"icon",{},()=>[d.value?(p(),N(ie,{key:0,path:d.value,inline:""},null,8,["path"])):S("",!0)])]),key:"2"}:void 0]),1040,["tag","itemClasses","invertedAccent"]))}}),$t="_formBoxButton_E8Xfr",At={"material-design-icon":"_material-design-icon_MaIxG",formBoxButton:$t},Lt={$style:At},le=j(Tt,[["__cssModules",Lt]]);Qe(Ye);const Rt=2e3;function Ot(e){const a=se(!1),i=k(()=>a.value?Ne:Te),r=k(()=>a.value?ee("Copied"):ee("Copy to clipboard"));async function d(){if(a.value)return;const s=Xe(e);try{await navigator.clipboard.writeText(s)}catch{prompt("",s)}a.value=!0,setTimeout(()=>{a.value=!1},Rt)}return{isCopied:a,copy:d,icon:i,altText:r}}const Mt={class:"hidden-visually"},Vt=M({__name:"NcFormBoxCopyButton",props:{label:{default:()=>{}},value:{},disabled:{type:Boolean,default:!1}},emits:["copy"],setup(e,{emit:a}){const i=a,{isCopied:r,copy:d,icon:s,altText:n}=Ot(()=>e.value);return $e(r,()=>i("copy")),(m,b)=>(p(),N(le,{disabled:e.disabled,invertedAccent:"",onClick:g(d)},W({description:y(()=>[x(v(e.value),1)]),icon:y(()=>[T(ie,{path:g(s),inline:""},null,8,["path"])]),_:2},[m.$slots.default||e.label?{name:"default",fn:y(()=>[$("span",Mt,v(g(n)),1),w(m.$slots,"default",{},()=>[x(v(e.label),1)])]),key:"0"}:void 0]),1032,["disabled","onClick"]))}}),St={name:"AutorenewIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},Ft=["aria-hidden","aria-label"],Ht=["fill","width","height"],Dt={d:"M12,6V9L16,5L12,1V4A8,8 0 0,0 4,12C4,13.57 4.46,15.03 5.24,16.26L6.7,14.8C6.25,13.97 6,13 6,12A6,6 0 0,1 12,6M18.76,7.74L17.3,9.2C17.74,10.04 18,11 18,12A6,6 0 0,1 12,18V15L8,19L12,23V20A8,8 0 0,0 20,12C20,10.43 19.54,8.97 18.76,7.74Z"},Ut={key:0};function Pt(e,a,i,r,d,s){return p(),h("span",V(e.$attrs,{"aria-hidden":i.title?null:"true","aria-label":i.title,class:"material-design-icon autorenew-icon",role:"img",onClick:a[0]||(a[0]=n=>e.$emit("click",n))}),[(p(),h("svg",{fill:i.fillColor,class:"material-design-icon__svg",width:i.size,height:i.size,viewBox:"0 0 24 24"},[$("path",Dt,[i.title?(p(),h("title",Ut,v(i.title),1)):S("",!0)])],8,Ht))],16,Ft)}const jt=H(St,[["render",Pt]]),qt={name:"LinkOffIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},zt=["aria-hidden","aria-label"],Gt=["fill","width","height"],Wt={d:"M17,7H13V8.9H17C18.71,8.9 20.1,10.29 20.1,12C20.1,13.43 19.12,14.63 17.79,15L19.25,16.44C20.88,15.61 22,13.95 22,12A5,5 0 0,0 17,7M16,11H13.81L15.81,13H16V11M2,4.27L5.11,7.38C3.29,8.12 2,9.91 2,12A5,5 0 0,0 7,17H11V15.1H7C5.29,15.1 3.9,13.71 3.9,12C3.9,10.41 5.11,9.1 6.66,8.93L8.73,11H8V13H10.73L13,15.27V17H14.73L18.74,21L20,19.74L3.27,3L2,4.27Z"},Zt={key:0};function Jt(e,a,i,r,d,s){return p(),h("span",V(e.$attrs,{"aria-hidden":i.title?null:"true","aria-label":i.title,class:"material-design-icon link-off-icon",role:"img",onClick:a[0]||(a[0]=n=>e.$emit("click",n))}),[(p(),h("svg",{fill:i.fillColor,class:"material-design-icon__svg",width:i.size,height:i.size,viewBox:"0 0 24 24"},[$("path",Wt,[i.title?(p(),h("title",Zt,v(i.title),1)):S("",!0)])],8,Gt))],16,zt)}const Kt=H(qt,[["render",Jt]]),Qt={name:"LinkPlusIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},Yt=["aria-hidden","aria-label"],Xt=["fill","width","height"],ea={d:"M7,7H11V9H7A3,3 0 0,0 4,12A3,3 0 0,0 7,15H11V17H7A5,5 0 0,1 2,12A5,5 0 0,1 7,7M17,7A5,5 0 0,1 22,12H20A3,3 0 0,0 17,9H13V7H17M8,11H16V13H8V11M17,12H19V15H22V17H19V20H17V17H14V15H17V12Z"},ta={key:0};function aa(e,a,i,r,d,s){return p(),h("span",V(e.$attrs,{"aria-hidden":i.title?null:"true","aria-label":i.title,class:"material-design-icon link-plus-icon",role:"img",onClick:a[0]||(a[0]=n=>e.$emit("click",n))}),[(p(),h("svg",{fill:i.fillColor,class:"material-design-icon__svg",width:i.size,height:i.size,viewBox:"0 0 24 24"},[$("path",ea,[i.title?(p(),h("title",ta,v(i.title),1)):S("",!0)])],8,Xt))],16,Yt)}const ia=H(Qt,[["render",aa]]),sa={data(){return{copied:!1,copyLoading:!1,copySuccess:!1}},computed:{copyLinkIcon(){return this.copySuccess?"icon-checkmark":this.copyLoading?"icon-loading-small":"icon-public"}},methods:{async copyToClipboard(e){this.copyLoading=!0;try{await navigator.clipboard.writeText(e),this.copySuccess=!0,this.copied=!0,Ae(t("circles","Link copied to the clipboard"))}catch{this.copySuccess=!1,this.copied=!0,ae(t("circles","Could not copy link to the clipboard."))}finally{this.copyLoading=!1,setTimeout(()=>{this.copied=!1,this.copySuccess=!1},2e3)}}}},ra={name:"CircleConfigInvitationLink",components:{Autorenew:jt,LinkOff:Kt,LinkPlus:ia,NcFormBox:ne,NcFormBoxButton:le,NcFormBoxCopyButton:Vt},mixins:[sa],props:{circle:{type:q,required:!0}},computed:{invitationUrl(){return this.circle.invitationCode?et()+tt("apps/circles/teams/join/{invitationCode}",{invitationCode:this.circle.invitationCode.match(/.{1,4}/g).join("-")}):null}},methods:{async createInvitationLink(){await this.$store.dispatch("createInvitationLink",{circleId:this.circle.id}),await this.copyToClipboard(this.invitationUrl)},async revokeInvitationLink(){await this.$store.dispatch("revokeInvitationLink",{circleId:this.circle.id})},confirm(e,a){window.confirm(e)&&a()}}};function na(e,a,i,r,d,s){const n=A("LinkPlus"),m=A("NcFormBoxButton"),b=A("NcFormBoxCopyButton"),_=A("Autorenew"),u=A("LinkOff"),C=A("NcFormBox");return p(),N(C,null,{default:y(()=>[s.invitationUrl?(p(),h(re,{key:1},[T(b,{label:e.t("circles","Copy link"),value:s.invitationUrl},null,8,["label","value"]),T(m,{label:e.t("circles","Reset link"),onClick:a[1]||(a[1]=Y=>s.confirm(e.t("circles","This action will make it impossible to join the team using the current link. Do we really want to change the link?"),()=>s.createInvitationLink()))},{icon:y(()=>[T(_,{size:20})]),_:1},8,["label"]),T(m,{label:e.t("circles","Reject link"),onClick:a[2]||(a[2]=Y=>s.confirm(e.t("circles","This action will make it impossible to join the team using the current link. Do we really want to delete the link?"),()=>s.revokeInvitationLink()))},{icon:y(()=>[T(u,{size:20})]),_:1},8,["label"])],64)):(p(),N(m,{key:0,label:e.t("circles","Create link"),onClick:a[0]||(a[0]=Y=>s.createInvitationLink())},{icon:y(()=>[T(n,{size:20})]),_:1},8,["label"]))]),_:1})}const ca=H(ra,[["render",na]]);c("circles","All contacts"),c("circles","Not grouped"),c("circles","Recently contacted"),c("circles","Organization chart"),c("circles","Contacts settings");const oa=0,de=1,ue=4,me=8,pe=9,P=1,Z=2,J=4,K=8,Q=16;c("circles","Create your own teams for sharing. Add Nextcloud users, contacts, or anyone via email.");const la=2,da=4,fe=8,he=16,ye=32,be=64,ge=128,ua=256,ma=512,pa=1024,fa=2048,ha=4096,ve=8192,ya=16384,_e=32768;Q+"",c("circles","Team"),P+"",c("circles","User"),Z+"",c("circles","Group"),J+"",c("circles","Email"),K+"",c("circles","Contact");const Xa={[de]:c("circles","Member"),[ue]:c("circles","Moderator"),[me]:c("circles","Admin"),[pe]:c("circles","Owner")},ei={[c("circles","Invites")]:{component:U,props:{configs:{[he]:c("circles","Anyone can request membership"),[ye]:c("circles","Members need to accept invitation"),[be]:c("circles",'Memberships must be confirmed/accepted by a Moderator (requires "Anyone can request membership")'),[ge]:c("circles","Members can also invite")}}},[c("circles","Invitation links")]:{component:ca,props:{}},[c("circles","Membership")]:{component:U,props:{configs:{[ve]:c("circles","Prevent teams from being a member of another team")}}},[c("circles","Federation")]:{component:U,props:{configs:{[_e]:c("circles","Allow federated members")}}},[c("circles","Privacy")]:{component:U,props:{configs:{[fe]:c("circles","Visible to everyone")}}}},ba=[{id:`picker-${f.User}`,label:c("circles","users"),labelStandalone:c("circles","Users"),share:f.User,type:P},{id:`picker-${f.Group}`,label:c("circles","groups"),labelStandalone:c("circles","Groups"),share:f.Group,type:Z},{id:`picker-${f.Remote}`,label:c("circles","federated users"),labelStandalone:c("circles","Federated users"),share:f.Remote,type:P},{id:`picker-${f.Team}`,label:c("circles","teams"),labelStandalone:c("circles","Teams"),share:f.Team,type:Q},{id:`picker-${f.Email}`,label:c("circles","email addresses"),labelStandalone:c("circles","Email addresses"),share:f.Email,type:J},{id:"picker-contact",label:c("circles","contacts"),labelStandalone:c("circles","Contacts"),share:f.Email,type:K}],Ie=ba.reduce((e,a)=>(e[a.share]||(e[a.share]=a.type),e),{});var B=(e=>(e[e.NONE=oa]="NONE",e[e.MEMBER=de]="MEMBER",e[e.MODERATOR=ue]="MODERATOR",e[e.ADMIN=me]="ADMIN",e[e.OWNER=pe]="OWNER",e))(B||{}),we=(e=>(e[e.CIRCLE=Q]="CIRCLE",e[e.USER=P]="USER",e[e.GROUP=Z]="GROUP",e[e.MAIL=J]="MAIL",e[e.CONTACT=K]="CONTACT",e))(we||{}),E=(e=>(e[e.PERSONAL=la]="PERSONAL",e[e.SYSTEM=da]="SYSTEM",e[e.VISIBLE=fe]="VISIBLE",e[e.OPEN=he]="OPEN",e[e.INVITE=ye]="INVITE",e[e.REQUEST=be]="REQUEST",e[e.FRIEND=ge]="FRIEND",e[e.PROTECTED=ua]="PROTECTED",e[e.NO_OWNER=ma]="NO_OWNER",e[e.HIDDEN=pa]="HIDDEN",e[e.BACKEND=fa]="BACKEND",e[e.LOCAL=ha]="LOCAL",e[e.ROOT=ve]="ROOT",e[e.CIRCLE_INVITE=ya]="CIRCLE_INVITE",e[e.FEDERATED=_e]="FEDERATED",e))(E||{}),ga=(e=>(e.INVITED="Invited",e.MEMBER="Member",e.REQUESTING="Requesting",e))(ga||{});const Ce=Object.keys(Ie),va=parseInt(window.OC.config["sharing.maxAutocompleteResults"],10)||25;async function _a(e,a=null){const i=await o.get(l("apps/files_sharing/api/v1/sharees"),{params:{format:"json",itemType:"teams",search:e,perPage:va,shareType:Ce,lookup:!1}}),r=i.data.ocs.data,d=i.data.ocs.data.exact;r.exact=[];let s=Object.values(d).reduce((u,C)=>u.concat(C),[]),n=Object.values(r).reduce((u,C)=>u.concat(C),[]);a&&(a.config&E.FEDERATED)!==0?(s=s.filter(u=>!(u.value?.shareType===f.Remote&&u.value?.isTrustedServer===!1)),n=n.filter(u=>!(u.value?.shareType===f.Remote&&u.value?.isTrustedServer===!1))):(s=s.filter(u=>u.value?.shareType!==f.Remote),n=n.filter(u=>u.value?.shareType!==f.Remote));const m=s.filter(u=>typeof u=="object").map(u=>z(u)).sort((u,C)=>u.shareType-C.shareType),b=n.filter(u=>typeof u=="object").map(u=>z(u)).sort((u,C)=>u.shareType-C.shareType),_=m.concat(b);return I.info("suggestions",{finalResults:_}),_}async function Ia(){const e=(await o.get(l("apps/files_sharing/api/v1/sharees_recommended"),{params:{format:"json",itemType:"contacts",shareType:Ce}})).data.ocs.data.exact,a=Object.values(e).reduce((i,r)=>i.concat(r),[]).map(i=>z(i));return I.info("recommendations",a),a}function wa(e){switch(e.value.shareType){case f.User:return Le().files_sharing?.sharee?.always_show_unique===!0?e.shareWithDisplayNameUnique??"":"";case f.Email:return e.value.shareWith;case f.Remote:case f.RemoteGroup:return e.value.server?c("circles","on {server}",{server:e.value.server}):"";default:return e.shareWithDescription??""}}function z(e){const a=`picker-${e.value.shareType}`;return{label:e.label,id:`${a}-${e.value.shareWith}`,user:[f.User,f.Remote].indexOf(e.value.shareType)>-1?e.value.shareWith:null,type:a,subname:wa(e),...e.value}}const Ca=Ie;function ke(e){return e===void 0?"member":e>=9?"owner":e>=8?"admin":e>=4?"moderator":"member"}function ka(e){return{id:String(e.id),name:e.name,type:e.type==="folder"?"folder":"file",iconUrl:e.iconUrl,fallbackIcon:e.fallbackIcon,url:e.url}}function Ea(e){return{id:e.singleId,userId:e.userId??null,displayName:e.displayName,isUser:e.type===1,role:"member"}}function Ba(e){return{id:e.singleId,userId:e.userId??null,displayName:e.displayName,isUser:e.userType===1,role:ke(e.level)}}async function ti(){const[e,a]=await Promise.allSettled([o.get(l("apps/circles/circles")+"?limit=-1"),o.get(l("apps/circles/teams/dashboard/widget")+"?limit=200&offset=0")]);if(e.status==="rejected")throw e.reason;const i=e.value.data.ocs.data??[];let r=[];a.status==="fulfilled"?r=a.value.data.ocs.data??[]:I.warn("Failed to load team dashboard previews",{error:a.reason});const d=new Map(r.map(s=>[s.singleId,s]));return i.map(s=>{const n=d.get(s.id);return{id:s.id,displayName:s.displayName||s.name,description:s.description??"",memberCount:s.population??n?.members.length??0,myRole:ke(s.initiator?.level),members:(n?.members??[]).map(Ea),resources:(n?.resources??[]).map(ka)}})}async function ai(e){return((await o.get(l("apps/circles/circles/{circleId}/members",{circleId:e}))).data.ocs.data??[]).map(Ba)}async function ii(e,a=!0){return(await o.post(l("apps/circles/circles"),{name:e,createTeamFolder:a})).data.ocs.data.id}async function si(e,a){await o.put(l("apps/circles/circles/{circleId}/description",{circleId:e}),{value:a})}async function ri(e){await o.put(l("apps/circles/circles/{circleId}/leave",{circleId:e}),{})}async function ni(e){await o.delete(l("apps/circles/circles/{circleId}",{circleId:e}))}async function ci(){const{data:e}=await o.get(l("/apps/circles/admin/teamfolders"));return e.ocs.data}async function oi(e,a){const{data:i}=await o.put(l("/apps/circles/admin/teamfolders/{circleId}/default-quota",{circleId:e}),{quota:a});return i.ocs.data}async function li(e){try{const{data:a}=await o.get(l("apps/circles/teams/{circleId}/folder",{circleId:e}));return a.ocs.data}catch(a){if(a&&typeof a=="object"&&"response"in a&&a.response?.status===404)return null;throw a}}async function di(e,a){const{data:i}=await o.post(l("apps/circles/teams/{circleId}/folder",{circleId:e}),{name:a});return i.ocs.data.folder}async function ui(e){const{data:a}=await o.get(l("apps/circles/teams/{circleId}/folder/linkable",{circleId:e}));return a.ocs.data}async function mi(e,a){const{data:i}=await o.post(l("apps/circles/teams/{circleId}/folder/link",{circleId:e}),{folderId:a});return i.ocs.data.folder}async function pi(e,a){const{data:i}=await o.put(l("apps/circles/teams/{circleId}/folder/quota",{circleId:e}),{quota:a});return i.ocs.data.folder}const G=".system/teams/pages";async function fi(e){let a;try{a=await F().getDirectoryContents(`${O}/${e}/${G}`,{details:!0,data:Re()})}catch(i){if(i?.status===404)return[];throw i}return(Array.isArray(a)?a:a.data).map(i=>Oe(i,O)).filter(i=>i.type===Me.File&&i.extension?.toLowerCase()===".md"&&i.fileid!==void 0).map(i=>({fileId:i.fileid,title:i.basename.slice(0,-i.extension.length),filePath:`/${e}/${G}/${i.basename}`})).sort((i,r)=>i.title.localeCompare(r.title))}async function hi(e,a){const i=`${O}/${e}/${G}`;try{await F().createDirectory(i,{recursive:!0})}catch(r){if(r?.status!==405)throw r}if(await F().putFileContents(`${i}/${a}.md`,"",{overwrite:!1})===!1)throw Object.assign(new Error("A page with this name already exists"),{status:412})}async function yi(e){await F().deleteFile(`${O}${e.filePath}`)}async function bi(e,a){const i=e.filePath.slice(0,e.filePath.lastIndexOf("/"));await F().moveFile(`${O}${e.filePath}`,`${O}${i}/${a}.md`,{overwrite:!1})}async function gi(e){const{data:a}=await o.get(l("apps/circles/teams/{circleId}/tab-order",{circleId:e}));return a.ocs.data.order??[]}async function vi(e,a){await o.put(l("apps/circles/teams/{circleId}/tab-order",{circleId:e}),{order:a})}async function _i(e){return(await o.get(l("teams/{teamId}/resources",{teamId:e}))).data.ocs.data.resources??[]}async function Ii(e){await o.post(l("apps/collectives/api/v1.0/collectives"),{name:e})}async function wi(e,a){if(!(await o.post(l("apps/deck/api/v1.0/boards/team"),{title:a,teamId:e})).data.ocs.data.id)throw new Error("The board creation response contains no board id")}async function Ci(e,a){const i=await Promise.allSettled(a.map(d=>o.get(l("apps/deck/api/v1.0/board/{boardId}",{boardId:d.id})))),r=[];return i.forEach((d,s)=>{const n=a[s];if(d.status==="rejected"){I.warn("Could not read a deck board, not showing it as a tab",{resource:n,reason:d.reason});return}const m=d.value.data.ocs.data;m.teamId===e&&!m.archived&&(m.deletedAt??0)===0&&r.push({id:m.id,title:m.title,url:n.url})}),r.sort((d,s)=>d.title.localeCompare(s.title))}async function ki(e){return(e.trim()?await _a(e):await Ia()).map(a=>({key:a.id,shareWith:a.shareWith,shareType:a.shareType,displayName:a.label,subname:a.subname,isUser:a.user!==null&&a.user!==void 0}))}async function Ei(e,a){const i=a.map(d=>({id:d.shareWith,type:Ca[d.shareType]})),r=await o.post(l("apps/circles/circles/{circleId}/members/multi",{circleId:e}),{members:i});return Object.keys(r.data.ocs.data??{}).length}const xa={name:"TrashCanOutlineIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},Na=["aria-hidden","aria-label"],Ta=["fill","width","height"],$a={d:"M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z"},Aa={key:0};function La(e,a,i,r,d,s){return p(),h("span",V(e.$attrs,{"aria-hidden":i.title?null:"true","aria-label":i.title,class:"material-design-icon trash-can-outline-icon",role:"img",onClick:a[0]||(a[0]=n=>e.$emit("click",n))}),[(p(),h("svg",{fill:i.fillColor,class:"material-design-icon__svg",width:i.size,height:i.size,viewBox:"0 0 24 24"},[$("path",$a,[i.title?(p(),h("title",Aa,v(i.title),1)):S("",!0)])],8,Ta))],16,Na)}const Bi=H(xa,[["render",La]]);export{Ha as $,bi as A,yi as B,oe as C,Ja as D,Ka as E,Ga as F,Xa as G,ga as H,Bi as I,_a as J,Ia as K,ba as L,B as M,ne as N,Ua as O,ei as P,Ya as Q,Qa as R,Ie as S,Za as T,Wa as U,L as V,Pa as W,za as X,qa as Y,Sa as Z,Da as _,ui as a,q as a0,ja as a1,Fa as a2,pi as b,oi as c,ni as d,ri as e,Ei as f,ci as g,ii as h,si as i,ai as j,ti as k,mi as l,Bt as m,le as n,xt as o,vi as p,gi as q,fi as r,ki as s,Ci as t,di as u,_i as v,li as w,Ii as x,wi as y,hi as z}; -//# sourceMappingURL=TrashCanOutline-CC2GsQhE.chunk.mjs.map +Are you sure?`,{circle:a.circle.displayName}),labelConfirm:c("circles","Enable federation"),labelReject:c("circles","Cancel"),severity:"warning"})?!0:(I.debug("Enable federation cancelled"),!1)}return(n,m)=>(p(),N(g(ne),null,{default:y(()=>[(p(!0),h(re,null,We(e.configs,(b,_)=>(p(),N(g(Bt),{key:"circle-config"+_,"model-value":r(Number(_)),label:b,disabled:i.value!==!1,"onUpdate:modelValue":u=>d(Number(_),u)},null,8,["model-value","label","disabled","onUpdate:modelValue"]))),128))]),_:1}))}});function Nt(e){const a=Ze(e),i=Je(Ke,null)!==null,r=k(()=>i&&a.to?"RouterLink":a.href?"a":"button"),d=k(()=>r.value==="RouterLink"||r.value==="a"),s=k(()=>r.value==="a"),n=k(()=>r.value==="RouterLink"),m=k(()=>r.value==="button"),b=k(()=>{if(r.value==="RouterLink")return{to:a.to,activeClass:"active",...a.additionalAttrs?.("RouterLink")??{}};if(r.value==="a")return{href:a.href,target:a.target,download:a.download||void 0,rel:"nofollow noreferrer noopener",...a.additionalAttrs?.("a")??{}};if(r.value==="button")return{type:a.type||"button",disabled:a.disabled,...a.additionalAttrs?.("button")??{}}});return{tag:r,isLink:d,isHyperLink:s,isRouterLink:n,isButton:m,attrs:b}}const Tt=M({__name:"NcFormBoxButton",props:{label:{default:()=>{}},description:{default:()=>{}},invertedAccent:{type:Boolean,default:!1},to:{default:()=>{}},href:{default:()=>{}},target:{default:()=>{}},disabled:{type:Boolean,default:!1}},emits:["click"],setup(e){const{tag:a,attrs:i,isLink:r}=Nt({to:D(()=>e.to),href:D(()=>e.href),target:D(()=>e.target),disabled:D(()=>e.disabled)}),d=k(()=>{if(r.value)return e.target==="_blank"?Be:xe});return(s,n)=>(p(),N(ce,V({tag:g(a),itemClasses:["button-vue",s.$style.formBoxButton],invertedAccent:e.invertedAccent},g(i),{tabindex:"0",onClick:n[0]||(n[0]=m=>s.$emit("click",m))}),W({_:2},[s.$slots.default||e.label?{name:"default",fn:y(()=>[w(s.$slots,"default",{},()=>[x(v(e.label),1)])]),key:"0"}:void 0,s.$slots.description||e.description?{name:"description",fn:y(()=>[w(s.$slots,"description",{},()=>[x(v(e.description),1)])]),key:"1"}:void 0,s.$slots.icon||d.value?{name:"icon",fn:y(()=>[w(s.$slots,"icon",{},()=>[d.value?(p(),N(ie,{key:0,path:d.value,inline:""},null,8,["path"])):S("",!0)])]),key:"2"}:void 0]),1040,["tag","itemClasses","invertedAccent"]))}}),$t="_formBoxButton_E8Xfr",At={"material-design-icon":"_material-design-icon_MaIxG",formBoxButton:$t},Lt={$style:At},le=j(Tt,[["__cssModules",Lt]]);Qe(Ye);const Rt=2e3;function Ot(e){const a=se(!1),i=k(()=>a.value?Ne:Te),r=k(()=>a.value?ee("Copied"):ee("Copy to clipboard"));async function d(){if(a.value)return;const s=Xe(e);try{await navigator.clipboard.writeText(s)}catch{prompt("",s)}a.value=!0,setTimeout(()=>{a.value=!1},Rt)}return{isCopied:a,copy:d,icon:i,altText:r}}const Mt={class:"hidden-visually"},Vt=M({__name:"NcFormBoxCopyButton",props:{label:{default:()=>{}},value:{},disabled:{type:Boolean,default:!1}},emits:["copy"],setup(e,{emit:a}){const i=a,{isCopied:r,copy:d,icon:s,altText:n}=Ot(()=>e.value);return $e(r,()=>i("copy")),(m,b)=>(p(),N(le,{disabled:e.disabled,invertedAccent:"",onClick:g(d)},W({description:y(()=>[x(v(e.value),1)]),icon:y(()=>[T(ie,{path:g(s),inline:""},null,8,["path"])]),_:2},[m.$slots.default||e.label?{name:"default",fn:y(()=>[$("span",Mt,v(g(n)),1),w(m.$slots,"default",{},()=>[x(v(e.label),1)])]),key:"0"}:void 0]),1032,["disabled","onClick"]))}}),St={name:"AutorenewIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},Ft=["aria-hidden","aria-label"],Ht=["fill","width","height"],Dt={d:"M12,6V9L16,5L12,1V4A8,8 0 0,0 4,12C4,13.57 4.46,15.03 5.24,16.26L6.7,14.8C6.25,13.97 6,13 6,12A6,6 0 0,1 12,6M18.76,7.74L17.3,9.2C17.74,10.04 18,11 18,12A6,6 0 0,1 12,18V15L8,19L12,23V20A8,8 0 0,0 20,12C20,10.43 19.54,8.97 18.76,7.74Z"},Ut={key:0};function Pt(e,a,i,r,d,s){return p(),h("span",V(e.$attrs,{"aria-hidden":i.title?null:"true","aria-label":i.title,class:"material-design-icon autorenew-icon",role:"img",onClick:a[0]||(a[0]=n=>e.$emit("click",n))}),[(p(),h("svg",{fill:i.fillColor,class:"material-design-icon__svg",width:i.size,height:i.size,viewBox:"0 0 24 24"},[$("path",Dt,[i.title?(p(),h("title",Ut,v(i.title),1)):S("",!0)])],8,Ht))],16,Ft)}const jt=H(St,[["render",Pt]]),qt={name:"LinkOffIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},zt=["aria-hidden","aria-label"],Gt=["fill","width","height"],Wt={d:"M17,7H13V8.9H17C18.71,8.9 20.1,10.29 20.1,12C20.1,13.43 19.12,14.63 17.79,15L19.25,16.44C20.88,15.61 22,13.95 22,12A5,5 0 0,0 17,7M16,11H13.81L15.81,13H16V11M2,4.27L5.11,7.38C3.29,8.12 2,9.91 2,12A5,5 0 0,0 7,17H11V15.1H7C5.29,15.1 3.9,13.71 3.9,12C3.9,10.41 5.11,9.1 6.66,8.93L8.73,11H8V13H10.73L13,15.27V17H14.73L18.74,21L20,19.74L3.27,3L2,4.27Z"},Zt={key:0};function Jt(e,a,i,r,d,s){return p(),h("span",V(e.$attrs,{"aria-hidden":i.title?null:"true","aria-label":i.title,class:"material-design-icon link-off-icon",role:"img",onClick:a[0]||(a[0]=n=>e.$emit("click",n))}),[(p(),h("svg",{fill:i.fillColor,class:"material-design-icon__svg",width:i.size,height:i.size,viewBox:"0 0 24 24"},[$("path",Wt,[i.title?(p(),h("title",Zt,v(i.title),1)):S("",!0)])],8,Gt))],16,zt)}const Kt=H(qt,[["render",Jt]]),Qt={name:"LinkPlusIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},Yt=["aria-hidden","aria-label"],Xt=["fill","width","height"],ea={d:"M7,7H11V9H7A3,3 0 0,0 4,12A3,3 0 0,0 7,15H11V17H7A5,5 0 0,1 2,12A5,5 0 0,1 7,7M17,7A5,5 0 0,1 22,12H20A3,3 0 0,0 17,9H13V7H17M8,11H16V13H8V11M17,12H19V15H22V17H19V20H17V17H14V15H17V12Z"},ta={key:0};function aa(e,a,i,r,d,s){return p(),h("span",V(e.$attrs,{"aria-hidden":i.title?null:"true","aria-label":i.title,class:"material-design-icon link-plus-icon",role:"img",onClick:a[0]||(a[0]=n=>e.$emit("click",n))}),[(p(),h("svg",{fill:i.fillColor,class:"material-design-icon__svg",width:i.size,height:i.size,viewBox:"0 0 24 24"},[$("path",ea,[i.title?(p(),h("title",ta,v(i.title),1)):S("",!0)])],8,Xt))],16,Yt)}const ia=H(Qt,[["render",aa]]),sa={data(){return{copied:!1,copyLoading:!1,copySuccess:!1}},computed:{copyLinkIcon(){return this.copySuccess?"icon-checkmark":this.copyLoading?"icon-loading-small":"icon-public"}},methods:{async copyToClipboard(e){this.copyLoading=!0;try{await navigator.clipboard.writeText(e),this.copySuccess=!0,this.copied=!0,Ae(t("circles","Link copied to the clipboard"))}catch{this.copySuccess=!1,this.copied=!0,ae(t("circles","Could not copy link to the clipboard."))}finally{this.copyLoading=!1,setTimeout(()=>{this.copied=!1,this.copySuccess=!1},2e3)}}}},ra={name:"CircleConfigInvitationLink",components:{Autorenew:jt,LinkOff:Kt,LinkPlus:ia,NcFormBox:ne,NcFormBoxButton:le,NcFormBoxCopyButton:Vt},mixins:[sa],props:{circle:{type:q,required:!0}},computed:{invitationUrl(){return this.circle.invitationCode?et()+tt("apps/circles/teams/join/{invitationCode}",{invitationCode:this.circle.invitationCode.match(/.{1,4}/g).join("-")}):null}},methods:{async createInvitationLink(){await this.$store.dispatch("createInvitationLink",{circleId:this.circle.id}),await this.copyToClipboard(this.invitationUrl)},async revokeInvitationLink(){await this.$store.dispatch("revokeInvitationLink",{circleId:this.circle.id})},confirm(e,a){window.confirm(e)&&a()}}};function na(e,a,i,r,d,s){const n=A("LinkPlus"),m=A("NcFormBoxButton"),b=A("NcFormBoxCopyButton"),_=A("Autorenew"),u=A("LinkOff"),C=A("NcFormBox");return p(),N(C,null,{default:y(()=>[s.invitationUrl?(p(),h(re,{key:1},[T(b,{label:e.t("circles","Copy link"),value:s.invitationUrl},null,8,["label","value"]),T(m,{label:e.t("circles","Reset link"),onClick:a[1]||(a[1]=Y=>s.confirm(e.t("circles","This action will make it impossible to join the team using the current link. Do we really want to change the link?"),()=>s.createInvitationLink()))},{icon:y(()=>[T(_,{size:20})]),_:1},8,["label"]),T(m,{label:e.t("circles","Reject link"),onClick:a[2]||(a[2]=Y=>s.confirm(e.t("circles","This action will make it impossible to join the team using the current link. Do we really want to delete the link?"),()=>s.revokeInvitationLink()))},{icon:y(()=>[T(u,{size:20})]),_:1},8,["label"])],64)):(p(),N(m,{key:0,label:e.t("circles","Create link"),onClick:a[0]||(a[0]=Y=>s.createInvitationLink())},{icon:y(()=>[T(n,{size:20})]),_:1},8,["label"]))]),_:1})}const ca=H(ra,[["render",na]]);c("circles","All contacts"),c("circles","Not grouped"),c("circles","Recently contacted"),c("circles","Organization chart"),c("circles","Contacts settings");const oa=0,de=1,ue=4,me=8,pe=9,P=1,Z=2,J=4,K=8,Q=16;c("circles","Create your own teams for sharing. Add Nextcloud users, contacts, or anyone via email.");const la=2,da=4,fe=8,he=16,ye=32,be=64,ge=128,ua=256,ma=512,pa=1024,fa=2048,ha=4096,ve=8192,ya=16384,_e=32768;Q+"",c("circles","Team"),P+"",c("circles","User"),Z+"",c("circles","Group"),J+"",c("circles","Email"),K+"",c("circles","Contact");const Xa={[de]:c("circles","Member"),[ue]:c("circles","Moderator"),[me]:c("circles","Admin"),[pe]:c("circles","Owner")},ei={[c("circles","Invites")]:{component:U,props:{configs:{[he]:c("circles","Anyone can request membership"),[ye]:c("circles","Members need to accept invitation"),[be]:c("circles",'Memberships must be confirmed/accepted by a Moderator (requires "Anyone can request membership")'),[ge]:c("circles","Members can also invite")}}},[c("circles","Invitation links")]:{component:ca,props:{}},[c("circles","Membership")]:{component:U,props:{configs:{[ve]:c("circles","Prevent teams from being a member of another team")}}},[c("circles","Federation")]:{component:U,props:{configs:{[_e]:c("circles","Allow federated members")}}},[c("circles","Privacy")]:{component:U,props:{configs:{[fe]:c("circles","Visible to everyone")}}}},ba=[{id:`picker-${f.User}`,label:c("circles","users"),labelStandalone:c("circles","Users"),share:f.User,type:P},{id:`picker-${f.Group}`,label:c("circles","groups"),labelStandalone:c("circles","Groups"),share:f.Group,type:Z},{id:`picker-${f.Remote}`,label:c("circles","federated users"),labelStandalone:c("circles","Federated users"),share:f.Remote,type:P},{id:`picker-${f.Team}`,label:c("circles","teams"),labelStandalone:c("circles","Teams"),share:f.Team,type:Q},{id:`picker-${f.Email}`,label:c("circles","email addresses"),labelStandalone:c("circles","Email addresses"),share:f.Email,type:J},{id:"picker-contact",label:c("circles","contacts"),labelStandalone:c("circles","Contacts"),share:f.Email,type:K}],Ie=ba.reduce((e,a)=>(e[a.share]||(e[a.share]=a.type),e),{});var B=(e=>(e[e.NONE=oa]="NONE",e[e.MEMBER=de]="MEMBER",e[e.MODERATOR=ue]="MODERATOR",e[e.ADMIN=me]="ADMIN",e[e.OWNER=pe]="OWNER",e))(B||{}),we=(e=>(e[e.CIRCLE=Q]="CIRCLE",e[e.USER=P]="USER",e[e.GROUP=Z]="GROUP",e[e.MAIL=J]="MAIL",e[e.CONTACT=K]="CONTACT",e))(we||{}),E=(e=>(e[e.PERSONAL=la]="PERSONAL",e[e.SYSTEM=da]="SYSTEM",e[e.VISIBLE=fe]="VISIBLE",e[e.OPEN=he]="OPEN",e[e.INVITE=ye]="INVITE",e[e.REQUEST=be]="REQUEST",e[e.FRIEND=ge]="FRIEND",e[e.PROTECTED=ua]="PROTECTED",e[e.NO_OWNER=ma]="NO_OWNER",e[e.HIDDEN=pa]="HIDDEN",e[e.BACKEND=fa]="BACKEND",e[e.LOCAL=ha]="LOCAL",e[e.ROOT=ve]="ROOT",e[e.CIRCLE_INVITE=ya]="CIRCLE_INVITE",e[e.FEDERATED=_e]="FEDERATED",e))(E||{}),ga=(e=>(e.INVITED="Invited",e.MEMBER="Member",e.REQUESTING="Requesting",e))(ga||{});const Ce=Object.keys(Ie),va=parseInt(window.OC.config["sharing.maxAutocompleteResults"],10)||25;async function _a(e,a=null){const i=await o.get(l("apps/files_sharing/api/v1/sharees"),{params:{format:"json",itemType:"teams",search:e,perPage:va,shareType:Ce,lookup:!1}}),r=i.data.ocs.data,d=i.data.ocs.data.exact;r.exact=[];let s=Object.values(d).reduce((u,C)=>u.concat(C),[]),n=Object.values(r).reduce((u,C)=>u.concat(C),[]);a&&(a.config&E.FEDERATED)!==0?(s=s.filter(u=>!(u.value?.shareType===f.Remote&&u.value?.isTrustedServer===!1)),n=n.filter(u=>!(u.value?.shareType===f.Remote&&u.value?.isTrustedServer===!1))):(s=s.filter(u=>u.value?.shareType!==f.Remote),n=n.filter(u=>u.value?.shareType!==f.Remote));const m=s.filter(u=>typeof u=="object").map(u=>z(u)).sort((u,C)=>u.shareType-C.shareType),b=n.filter(u=>typeof u=="object").map(u=>z(u)).sort((u,C)=>u.shareType-C.shareType),_=m.concat(b);return I.info("suggestions",{finalResults:_}),_}async function Ia(){const e=(await o.get(l("apps/files_sharing/api/v1/sharees_recommended"),{params:{format:"json",itemType:"contacts",shareType:Ce}})).data.ocs.data.exact,a=Object.values(e).reduce((i,r)=>i.concat(r),[]).map(i=>z(i));return I.info("recommendations",a),a}function wa(e){switch(e.value.shareType){case f.User:return Le().files_sharing?.sharee?.always_show_unique===!0?e.shareWithDisplayNameUnique??"":"";case f.Email:return e.value.shareWith;case f.Remote:case f.RemoteGroup:return e.value.server?c("circles","on {server}",{server:e.value.server}):"";default:return e.shareWithDescription??""}}function z(e){const a=`picker-${e.value.shareType}`;return{label:e.label,id:`${a}-${e.value.shareWith}`,user:[f.User,f.Remote].indexOf(e.value.shareType)>-1?e.value.shareWith:null,type:a,subname:wa(e),...e.value}}const Ca=Ie;function ke(e){return e===void 0?"member":e>=9?"owner":e>=8?"admin":e>=4?"moderator":"member"}function ka(e){return{id:String(e.id),name:e.name,type:e.type==="folder"?"folder":"file",iconUrl:e.iconUrl,fallbackIcon:e.fallbackIcon,url:e.url}}function Ea(e){return{id:e.singleId,userId:e.userId??null,displayName:e.displayName,isUser:e.type===1,role:"member"}}function Ba(e){return{id:e.singleId,userId:e.userId??null,displayName:e.displayName,isUser:e.userType===1,role:ke(e.level)}}async function ti(){const[e,a]=await Promise.allSettled([o.get(l("apps/circles/circles")+"?limit=-1"),o.get(l("apps/circles/teams/dashboard/widget")+"?limit=200&offset=0")]);if(e.status==="rejected")throw e.reason;const i=(e.value.data.ocs.data??[]).filter(s=>s.initiator);let r=[];a.status==="fulfilled"?r=a.value.data.ocs.data??[]:I.warn("Failed to load team dashboard previews",{error:a.reason});const d=new Map(r.map(s=>[s.singleId,s]));return i.map(s=>{const n=d.get(s.id);return{id:s.id,displayName:s.displayName||s.name,description:s.description??"",memberCount:s.population??n?.members.length??0,myRole:ke(s.initiator?.level),members:(n?.members??[]).map(Ea),resources:(n?.resources??[]).map(ka)}})}async function ai(e){return((await o.get(l("apps/circles/circles/{circleId}/members",{circleId:e}))).data.ocs.data??[]).map(Ba)}async function ii(e,a=!0){return(await o.post(l("apps/circles/circles"),{name:e,createTeamFolder:a})).data.ocs.data.id}async function si(e,a){await o.put(l("apps/circles/circles/{circleId}/description",{circleId:e}),{value:a})}async function ri(e){await o.put(l("apps/circles/circles/{circleId}/leave",{circleId:e}),{})}async function ni(e){await o.delete(l("apps/circles/circles/{circleId}",{circleId:e}))}async function ci(){const{data:e}=await o.get(l("/apps/circles/admin/teamfolders"));return e.ocs.data}async function oi(e,a){const{data:i}=await o.put(l("/apps/circles/admin/teamfolders/{circleId}/default-quota",{circleId:e}),{quota:a});return i.ocs.data}async function li(e){try{const{data:a}=await o.get(l("apps/circles/teams/{circleId}/folder",{circleId:e}));return a.ocs.data}catch(a){if(a&&typeof a=="object"&&"response"in a&&a.response?.status===404)return null;throw a}}async function di(e,a){const{data:i}=await o.post(l("apps/circles/teams/{circleId}/folder",{circleId:e}),{name:a});return i.ocs.data.folder}async function ui(e){const{data:a}=await o.get(l("apps/circles/teams/{circleId}/folder/linkable",{circleId:e}));return a.ocs.data}async function mi(e,a){const{data:i}=await o.post(l("apps/circles/teams/{circleId}/folder/link",{circleId:e}),{folderId:a});return i.ocs.data.folder}async function pi(e,a){const{data:i}=await o.put(l("apps/circles/teams/{circleId}/folder/quota",{circleId:e}),{quota:a});return i.ocs.data.folder}const G=".system/teams/pages";async function fi(e){let a;try{a=await F().getDirectoryContents(`${O}/${e}/${G}`,{details:!0,data:Re()})}catch(i){if(i?.status===404)return[];throw i}return(Array.isArray(a)?a:a.data).map(i=>Oe(i,O)).filter(i=>i.type===Me.File&&i.extension?.toLowerCase()===".md"&&i.fileid!==void 0).map(i=>({fileId:i.fileid,title:i.basename.slice(0,-i.extension.length),filePath:`/${e}/${G}/${i.basename}`})).sort((i,r)=>i.title.localeCompare(r.title))}async function hi(e,a){const i=`${O}/${e}/${G}`;try{await F().createDirectory(i,{recursive:!0})}catch(r){if(r?.status!==405)throw r}if(await F().putFileContents(`${i}/${a}.md`,"",{overwrite:!1})===!1)throw Object.assign(new Error("A page with this name already exists"),{status:412})}async function yi(e){await F().deleteFile(`${O}${e.filePath}`)}async function bi(e,a){const i=e.filePath.slice(0,e.filePath.lastIndexOf("/"));await F().moveFile(`${O}${e.filePath}`,`${O}${i}/${a}.md`,{overwrite:!1})}async function gi(e){const{data:a}=await o.get(l("apps/circles/teams/{circleId}/tab-order",{circleId:e}));return a.ocs.data.order??[]}async function vi(e,a){await o.put(l("apps/circles/teams/{circleId}/tab-order",{circleId:e}),{order:a})}async function _i(e){return(await o.get(l("teams/{teamId}/resources",{teamId:e}))).data.ocs.data.resources??[]}async function Ii(e){await o.post(l("apps/collectives/api/v1.0/collectives"),{name:e})}async function wi(e,a){if(!(await o.post(l("apps/deck/api/v1.0/boards/team"),{title:a,teamId:e})).data.ocs.data.id)throw new Error("The board creation response contains no board id")}async function Ci(e,a){const i=await Promise.allSettled(a.map(d=>o.get(l("apps/deck/api/v1.0/board/{boardId}",{boardId:d.id})))),r=[];return i.forEach((d,s)=>{const n=a[s];if(d.status==="rejected"){I.warn("Could not read a deck board, not showing it as a tab",{resource:n,reason:d.reason});return}const m=d.value.data.ocs.data;m.teamId===e&&!m.archived&&(m.deletedAt??0)===0&&r.push({id:m.id,title:m.title,url:n.url})}),r.sort((d,s)=>d.title.localeCompare(s.title))}async function ki(e){return(e.trim()?await _a(e):await Ia()).map(a=>({key:a.id,shareWith:a.shareWith,shareType:a.shareType,displayName:a.label,subname:a.subname,isUser:a.user!==null&&a.user!==void 0}))}async function Ei(e,a){const i=a.map(d=>({id:d.shareWith,type:Ca[d.shareType]})),r=await o.post(l("apps/circles/circles/{circleId}/members/multi",{circleId:e}),{members:i});return Object.keys(r.data.ocs.data??{}).length}const xa={name:"TrashCanOutlineIcon",emits:["click"],props:{title:{type:String},fillColor:{type:String,default:"currentColor"},size:{type:Number,default:24}}},Na=["aria-hidden","aria-label"],Ta=["fill","width","height"],$a={d:"M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z"},Aa={key:0};function La(e,a,i,r,d,s){return p(),h("span",V(e.$attrs,{"aria-hidden":i.title?null:"true","aria-label":i.title,class:"material-design-icon trash-can-outline-icon",role:"img",onClick:a[0]||(a[0]=n=>e.$emit("click",n))}),[(p(),h("svg",{fill:i.fillColor,class:"material-design-icon__svg",width:i.size,height:i.size,viewBox:"0 0 24 24"},[$("path",$a,[i.title?(p(),h("title",Aa,v(i.title),1)):S("",!0)])],8,Ta))],16,Na)}const Bi=H(xa,[["render",La]]);export{Ha as $,bi as A,yi as B,oe as C,Ja as D,Ka as E,Ga as F,Xa as G,ga as H,Bi as I,_a as J,Ia as K,ba as L,B as M,ne as N,Ua as O,ei as P,Ya as Q,Qa as R,Ie as S,Za as T,Wa as U,L as V,Pa as W,za as X,qa as Y,Sa as Z,Da as _,ui as a,q as a0,ja as a1,Fa as a2,pi as b,oi as c,ni as d,ri as e,Ei as f,ci as g,ii as h,si as i,ai as j,ti as k,mi as l,Bt as m,le as n,xt as o,vi as p,gi as q,fi as r,ki as s,Ci as t,di as u,_i as v,li as w,Ii as x,wi as y,hi as z}; +//# sourceMappingURL=TrashCanOutline-DbEqwasY.chunk.mjs.map diff --git a/js/TrashCanOutline-CC2GsQhE.chunk.mjs.license b/js/TrashCanOutline-DbEqwasY.chunk.mjs.license similarity index 100% rename from js/TrashCanOutline-CC2GsQhE.chunk.mjs.license rename to js/TrashCanOutline-DbEqwasY.chunk.mjs.license diff --git a/js/TrashCanOutline-CC2GsQhE.chunk.mjs.map b/js/TrashCanOutline-DbEqwasY.chunk.mjs.map similarity index 52% rename from js/TrashCanOutline-CC2GsQhE.chunk.mjs.map rename to js/TrashCanOutline-DbEqwasY.chunk.mjs.map index a31d9d91b..8ff053dbb 100644 --- a/js/TrashCanOutline-CC2GsQhE.chunk.mjs.map +++ b/js/TrashCanOutline-DbEqwasY.chunk.mjs.map @@ -1 +1 @@ -{"version":3,"file":"TrashCanOutline-CC2GsQhE.chunk.mjs","sources":["../node_modules/@nextcloud/vue/dist/chunks/NcFormBox-Bmqar8nn.mjs","../node_modules/@nextcloud/vue/dist/chunks/NcFormBoxItem-Cm8aZaVJ.mjs","../node_modules/@nextcloud/vue/dist/chunks/NcFormBoxSwitch-DSXiQcnq.mjs","../src/teams/team-page/models/member.ts","../src/teams/team-page/models/circle.ts","../src/teams/team-page/services/circles.ts","../src/teams/team-page/components/CircleDetails/CircleConfigs/CircleConfigCheckboxesList.vue","../node_modules/@nextcloud/vue/dist/chunks/NcFormBoxButton-G_PkUiQy.mjs","../node_modules/@nextcloud/vue/dist/chunks/useCopy-6F-qWHq0.mjs","../node_modules/@nextcloud/vue/dist/chunks/NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang-BA_gWnmz.mjs","../node_modules/vue-material-design-icons/Autorenew.vue","../node_modules/vue-material-design-icons/LinkOff.vue","../node_modules/vue-material-design-icons/LinkPlus.vue","../src/teams/team-page/mixins/CopyToClipboardMixin.js","../src/teams/team-page/components/CircleDetails/CircleConfigs/CircleConfigInvitationLink.vue","../src/teams/team-page/models/constants.ts","../src/teams/team-page/services/collaborationAutocompletion.js","../src/teams/api.ts","../node_modules/vue-material-design-icons/TrashCanOutline.vue"],"sourcesContent":["import '../assets/NcFormBox-TRgICDO3.css';\nimport { defineComponent, useCssModule, provide, openBlock, createElementBlock, normalizeClass, renderSlot } from \"vue\";\nimport { N as NC_FORM_BOX_CONTEXT_KEY } from \"./useNcFormBox-Djlh582y.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcFormBox\",\n props: {\n row: { type: Boolean }\n },\n setup(__props) {\n const style = useCssModule();\n provide(NC_FORM_BOX_CONTEXT_KEY, {\n isInFormBox: true,\n formBoxItemClass: style.ncFormBox__item\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([_ctx.$style.ncFormBox, __props.row ? _ctx.$style.ncFormBox_row : _ctx.$style.ncFormBox_col])\n }, [\n renderSlot(_ctx.$slots, \"default\", {\n itemClass: _ctx.$style.ncFormBox__item\n })\n ], 2);\n };\n }\n});\nconst ncFormBox = \"_ncFormBox_s7kf-\";\nconst ncFormBox_row = \"_ncFormBox_row_GzYuE\";\nconst ncFormBox__item = \"_ncFormBox__item_691pI\";\nconst ncFormBox_col = \"_ncFormBox_col_Lt4lg\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_JPsV1\",\n ncFormBox,\n ncFormBox_row,\n ncFormBox__item,\n ncFormBox_col\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcFormBox = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcFormBox as N\n};\n//# sourceMappingURL=NcFormBox-Bmqar8nn.mjs.map\n","import '../assets/NcFormBoxItem-CABDVZLe.css';\nimport { defineComponent, useSlots, openBlock, createElementBlock, normalizeClass, unref, createElementVNode, createBlock, resolveDynamicComponent, mergeProps, withCtx, renderSlot, createTextVNode, toDisplayString, createCommentVNode } from \"vue\";\nimport { u as useNcFormBox } from \"./useNcFormBox-Djlh582y.mjs\";\nimport { c as createElementId } from \"./createElementId-DhjFt1I9.mjs\";\nimport { a as isLegacy } from \"./legacy-BoqDmOCa.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nconst _hoisted_1 = [\"id\"];\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n ...{ inheritAttrs: false },\n __name: \"NcFormBoxItem\",\n props: {\n tag: {},\n label: { default: () => void 0 },\n description: { default: () => void 0 },\n invertedAccent: { type: Boolean, default: false },\n class: { default: () => void 0 },\n itemClasses: { default: () => void 0 }\n },\n emits: [\"click\"],\n setup(__props) {\n const slots = useSlots();\n const { formBoxItemClass } = useNcFormBox();\n const descriptionId = createElementId();\n const hasDescription = () => !!__props.description || !!slots.description;\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\n __props.class,\n _ctx.$style.formBoxItem,\n unref(formBoxItemClass),\n {\n [_ctx.$style.formBoxItem_inverted]: __props.invertedAccent && hasDescription(),\n [_ctx.$style.formBoxItem_legacy]: unref(isLegacy)\n }\n ])\n }, [\n createElementVNode(\"span\", {\n class: normalizeClass(_ctx.$style.formBoxItem__content)\n }, [\n (openBlock(), createBlock(resolveDynamicComponent(__props.tag), mergeProps({\n class: [_ctx.$style.formBoxItem__element, __props.itemClasses]\n }, _ctx.$attrs, {\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), {\n default: withCtx(() => [\n renderSlot(_ctx.$slots, \"default\", { descriptionId: unref(descriptionId) }, () => [\n createTextVNode(toDisplayString(__props.label || \"⚠️ Label is missing\"), 1)\n ])\n ]),\n _: 3\n }, 16, [\"class\"])),\n hasDescription() ? (openBlock(), createElementBlock(\"span\", {\n key: 0,\n id: unref(descriptionId),\n class: normalizeClass(_ctx.$style.formBoxItem__description)\n }, [\n renderSlot(_ctx.$slots, \"description\", {}, () => [\n createTextVNode(toDisplayString(__props.description), 1)\n ])\n ], 10, _hoisted_1)) : createCommentVNode(\"\", true)\n ], 2),\n createElementVNode(\"span\", {\n class: normalizeClass(_ctx.$style.formBoxItem__icon)\n }, [\n renderSlot(_ctx.$slots, \"icon\", { descriptionId: unref(descriptionId) }, () => [\n _cache[1] || (_cache[1] = createTextVNode(\" ⚠️ Icon is missing \", -1))\n ])\n ], 2)\n ], 2);\n };\n }\n});\nconst formBoxItem = \"_formBoxItem_Gp-TA\";\nconst formBoxItem__description = \"_formBoxItem__description_UqZJ1\";\nconst formBoxItem_legacy = \"_formBoxItem_legacy_dP9aJ\";\nconst formBoxItem_inverted = \"_formBoxItem_inverted_BU-i-\";\nconst formBoxItem__element = \"_formBoxItem__element_jHCux\";\nconst formBoxItem__content = \"_formBoxItem__content_UKovC\";\nconst formBoxItem__icon = \"_formBoxItem__icon_AvkP3\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_8BFGk\",\n formBoxItem,\n formBoxItem__description,\n formBoxItem_legacy,\n formBoxItem_inverted,\n formBoxItem__element,\n formBoxItem__content,\n formBoxItem__icon\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcFormBoxItem = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcFormBoxItem as N\n};\n//# sourceMappingURL=NcFormBoxItem-Cm8aZaVJ.mjs.map\n","import '../assets/NcFormBoxSwitch-NCjook_Z.css';\nimport { defineComponent, useModel, watch, openBlock, createBlock, unref, createSlots, withCtx, withDirectives, createElementVNode, normalizeClass, vModelCheckbox, createVNode, renderSlot, createTextVNode, toDisplayString, mergeModels } from \"vue\";\nimport { N as NcFormBoxItem } from \"./NcFormBoxItem-Cm8aZaVJ.mjs\";\nimport { N as NcIconToggleSwitch } from \"./NcIconToggleSwitch-CRvGt4su.mjs\";\nimport { c as createElementId } from \"./createElementId-DhjFt1I9.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nconst _hoisted_1 = [\"id\", \"aria-describedby\", \"disabled\"];\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcFormBoxSwitch\",\n props: /* @__PURE__ */ mergeModels({\n label: { default: () => void 0 },\n description: { default: () => void 0 },\n disabled: { type: Boolean, default: false }\n }, {\n \"modelValue\": { type: Boolean, ...{ required: true } },\n \"modelModifiers\": {}\n }),\n emits: /* @__PURE__ */ mergeModels([\"enable\", \"disable\"], [\"update:modelValue\"]),\n setup(__props, { emit: __emit }) {\n const modelValue = useModel(__props, \"modelValue\");\n const emit = __emit;\n const inputId = createElementId();\n watch(modelValue, () => {\n if (modelValue.value) {\n emit(\"enable\");\n } else {\n emit(\"disable\");\n }\n }, {\n // defineModel emits update:modelValue synchronously\n // Watching it synchronously to emit the enable/disable events together with the update:modelValue event\n flush: \"sync\"\n });\n return (_ctx, _cache) => {\n return openBlock(), createBlock(NcFormBoxItem, {\n tag: \"label\",\n for: unref(inputId)\n }, createSlots({\n icon: withCtx(({ descriptionId }) => [\n withDirectives(createElementVNode(\"input\", {\n id: unref(inputId),\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),\n class: normalizeClass(_ctx.$style.formBoxSwitch__input),\n type: \"checkbox\",\n role: \"switch\",\n \"aria-describedby\": descriptionId,\n disabled: __props.disabled\n }, null, 10, _hoisted_1), [\n [vModelCheckbox, modelValue.value]\n ]),\n createVNode(NcIconToggleSwitch, {\n checked: modelValue.value,\n inline: \"\"\n }, null, 8, [\"checked\"])\n ]),\n _: 2\n }, [\n _ctx.$slots.default || __props.label ? {\n name: \"default\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"default\", {}, () => [\n createTextVNode(toDisplayString(__props.label), 1)\n ])\n ]),\n key: \"0\"\n } : void 0,\n _ctx.$slots.description || __props.description ? {\n name: \"description\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"description\", {}, () => [\n createTextVNode(toDisplayString(__props.description), 1)\n ])\n ]),\n key: \"1\"\n } : void 0\n ]), 1032, [\"for\"]);\n };\n }\n});\nconst formBoxSwitch__input = \"_formBoxSwitch__input_n8432\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_v0XYD\",\n formBoxSwitch__input\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcFormBoxSwitch = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcFormBoxSwitch as N\n};\n//# sourceMappingURL=NcFormBoxSwitch-DSXiQcnq.mjs.map\n","// @ts-nocheck\n/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { MemberLevel, MemberType } from './constants.ts'\n\nimport { logger } from '../../../logger.ts'\nimport Circle from './circle.ts'\nimport { MemberLevels, MemberTypes } from './constants.ts'\n\nexport default class Member {\n\t_data: any = {}\n\t_circle: Circle\n\n\t/**\n\t * Creates an instance of Member\n\t *\n\t * @param data\n\t * @param circle\n\t */\n\tconstructor(data: any, circle: Circle) {\n\t\tif (typeof data !== 'object') {\n\t\t\tthrow new Error('Invalid member')\n\t\t}\n\n\t\t// if no uid set, fail\n\t\tif (data.id && typeof data.id !== 'string') {\n\t\t\tlogger.error('This member do not have a proper uid', data)\n\t\t\tthrow new Error('This member do not have a proper uid')\n\t\t}\n\n\t\tthis._circle = circle\n\t\tthis._data = data\n\t}\n\n\t/**\n\t * Get the circle of this member\n\t */\n\tget circle(): Circle {\n\t\treturn this._circle\n\t}\n\n\t/**\n\t * Set the circle of this member\n\t */\n\tset circle(circle: Circle) {\n\t\tif (circle.constructor.name !== Circle.name) {\n\t\t\tthrow new Error('circle must be a Circle type')\n\t\t}\n\t\tthis._circle = circle\n\t}\n\n\t/**\n\t * Member id\n\t */\n\tget id(): string {\n\t\treturn this._data.id\n\t}\n\n\t/**\n\t * Single uid\n\t */\n\tget singleId(): string {\n\t\treturn this._data.singleId\n\t}\n\n\t/**\n\t * Formatted display name\n\t */\n\tget displayName(): string {\n\t\treturn this._data.displayName\n\t}\n\n\t/**\n\t * Member userId\n\t */\n\tget userId(): string {\n\t\treturn this._data.userId\n\t}\n\n\t/**\n\t * Member type\n\t */\n\tget userType(): MemberType {\n\t\t// If the user type is a circle, this could originate from multiple sources\n\t\treturn this._data.userType !== MemberTypes.CIRCLE\n\t\t\t? this._data.userType\n\t\t\t: this.basedOn.source\n\t}\n\n\t/**\n\t * Member based on source\n\t */\n\tget basedOn(): any {\n\t\treturn this._data.basedOn\n\t}\n\n\t/**\n\t * Member level\n\t *\n\t */\n\tget level(): MemberLevel {\n\t\treturn this._data.level\n\t}\n\n\t/**\n\t * Set member level\n\t */\n\tset level(level: MemberLevel) {\n\t\tif (!(level in MemberLevels)) {\n\t\t\tthrow new Error('Invalid level')\n\t\t}\n\t\tthis._data.level = level\n\t}\n\n\t/**\n\t * Member request status\n\t *\n\t */\n\tget status(): string {\n\t\treturn this._data.status\n\t}\n\n\t/**\n\t * Is the current member a user?\n\t */\n\tget isUser() {\n\t\treturn this._data.userType === MemberLevels.MEMBER\n\t}\n\n\t/**\n\t * Is the current member without a circle?\n\t */\n\tget isOrphan() {\n\t\treturn this._circle?.constructor?.name !== Circle.name\n\t}\n\n\t/**\n\t * Delete this member and any reference from its circle\n\t */\n\tdelete() {\n\t\tif (this.isOrphan) {\n\t\t\tthrow new Error('Cannot delete this member as it doesn\\'t belong to any circle')\n\t\t}\n\t\tthis.circle.deleteMember(this)\n\t\tthis._data = undefined\n\t}\n}\n","// @ts-nocheck\n/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { CircleConfigs, MemberLevels, ROUTE_CIRCLE } from './constants.ts'\nimport Member from './member.ts'\nimport { logger } from '../../../logger.ts'\n\ntype MemberList = Record\n\nexport default class Circle {\n\t_data: any = {}\n\t_members: MemberList = {}\n\t_owner: Member\n\t_initiator: Member\n\n\t/**\n\t * Creates an instance of Circle\n\t *\n\t * @param data\n\t */\n\tconstructor(data: object) {\n\t\tthis.updateData(data)\n\t}\n\n\t/**\n\t * Update inner circle data, owner and initiator\n\t *\n\t * @param data\n\t */\n\tupdateData(data: any) {\n\t\tif (typeof data !== 'object') {\n\t\t\tthrow new Error('Invalid circle')\n\t\t}\n\n\t\t// if no uid set, fail\n\t\tif (!data.id) {\n\t\t\tthrow new Error('This circle do not have a proper uid')\n\t\t}\n\n\t\tthis._data = data\n\t\tthis._owner = new Member(data.owner, this)\n\n\t\tif (data.initiator) {\n\t\t\tthis._initiator = new Member(data.initiator, this)\n\t\t}\n\t}\n\n\t// METADATA -----------------------------------------\n\t/**\n\t * Circle id\n\t */\n\tget id(): string {\n\t\treturn this._data.id\n\t}\n\n\t/**\n\t * Formatted display name\n\t */\n\tget displayName(): string {\n\t\treturn this._data.displayName\n\t}\n\n\t/**\n\t * Set the display name\n\t */\n\tset displayName(text: string) {\n\t\tthis._data.displayName = text\n\t}\n\n\t/**\n\t * Circle creation date\n\t */\n\tget creation(): number {\n\t\treturn this._data.creation\n\t}\n\n\t/**\n\t * Circle description\n\t */\n\tget description(): string {\n\t\treturn this._data.description\n\t}\n\n\t/**\n\t * Circle description\n\t */\n\tset description(text: string) {\n\t\tthis._data.description = text\n\t}\n\n\t/**\n\t * Circle direct member count (excluding nested circles)\n\t */\n\tget population() {\n\t\treturn this._data.population\n\t}\n\n\t/**\n\t * Circle total member count (direct + inherited from nested circles)\n\t */\n\tget populationInherited() {\n\t\treturn this._data.populationInherited\n\t}\n\n\t// MEMBERSHIP -----------------------------------------\n\t/**\n\t * Circle ini_initiator the current\n\t * user info for this circle\n\t * null if not a member\n\t */\n\tget initiator(): Member | null {\n\t\treturn this._initiator\n\t}\n\n\t/**\n\t * Set new circle initiator\n\t * null if not a member\n\t */\n\tset initiator(initiator: Member) {\n\t\tif (initiator && initiator.constructor.name !== Member.name) {\n\t\t\tthrow new Error('Initiator must be a Member type')\n\t\t}\n\t\tthis._initiator = initiator\n\t}\n\n\t/**\n\t * Circle ownership\n\t */\n\tget owner(): Member {\n\t\treturn this._owner\n\t}\n\n\t/**\n\t * Set new circle owner\n\t */\n\tset owner(owner: Member) {\n\t\tif (owner.constructor.name !== Member.name) {\n\t\t\tthrow new Error('Owner must be a Member type')\n\t\t}\n\t\tthis._owner = owner\n\t}\n\n\t/**\n\t * Circle members\n\t */\n\tget members(): MemberList {\n\t\treturn this._members\n\t}\n\n\t/**\n\t * Define members circle\n\t */\n\tset members(members: MemberList) {\n\t\tthis._members = members\n\t}\n\n\t/**\n\t * Add a member to this circle\n\t *\n\t * @param member\n\t */\n\taddMember(member: Member) {\n\t\tif (member.constructor.name !== Member.name) {\n\t\t\tthrow new Error('Member must be a Member type')\n\t\t}\n\n\t\tconst singleId = member.singleId\n\t\tif (this._members[singleId]) {\n\t\t\tlogger.warn('Replacing existing member data', { member })\n\t\t}\n\t\tthis._members[singleId] = member\n\t}\n\n\t/**\n\t * Remove a member from this circle\n\t *\n\t * @param member\n\t */\n\tdeleteMember(member: Member) {\n\t\tif (member.constructor.name !== Member.name) {\n\t\t\tthrow new Error('Member must be a Member type')\n\t\t}\n\n\t\tconst singleId = member.singleId\n\t\tif (!this._members[singleId]) {\n\t\t\tlogger.warn('The member was not in this circle. Nothing was done.', { member })\n\t\t}\n\n\t\t// Delete and clear memory\n\t\tdelete this._members[singleId]\n\t}\n\n\t// CONFIGS --------------------------------------------\n\tget settings() {\n\t\treturn this._data.settings\n\t}\n\n\t/**\n\t * Circle config\n\t */\n\tget config(): number {\n\t\treturn this._data.config\n\t}\n\n\t/**\n\t * Define circle config\n\t */\n\tset config(config: number) {\n\t\tthis._data.config = config\n\t}\n\n\t/**\n\t * Circle is personal\n\t */\n\tget isPersonal() {\n\t\treturn (this._data.config & CircleConfigs.PERSONAL) !== 0\n\t}\n\n\t/**\n\t * Circle requires invite to be confirmed by moderator or above\n\t */\n\tget requireJoinAccept() {\n\t\treturn (this._data.config & CircleConfigs.VISIBLE) !== 0\n\t}\n\n\t/**\n\t * Circle can be requested to join\n\t */\n\tget canJoin() {\n\t\treturn (this._data.config & CircleConfigs.OPEN) !== 0\n\t}\n\n\t/**\n\t * Circle is visible to others\n\t */\n\tget isVisible() {\n\t\treturn (this._data.config & CircleConfigs.VISIBLE) !== 0\n\t}\n\n\t/**\n\t * Circle requires invite to be accepted by the member\n\t */\n\tget requireInviteAccept() {\n\t\treturn (this._data.config & CircleConfigs.INVITE) !== 0\n\t}\n\n\t// PERMISSIONS SHORTCUTS ------------------------------\n\t/**\n\t * Can the initiator add members to this circle?\n\t */\n\tget isOwner() {\n\t\treturn this.initiator?.level === MemberLevels.OWNER\n\t}\n\n\t// PERMISSIONS SHORTCUTS ------------------------------\n\t/**\n\t * Is the initiator an admin of this circle?\n\t */\n\tget isAdmin() {\n\t\treturn this.initiator?.level === MemberLevels.ADMIN\n\t}\n\n\t/**\n\t * Is the initiator a member of this circle?\n\t */\n\tget isMember() {\n\t\treturn this.initiator?.level\n\t\t\t&& this.initiator?.level > MemberLevels.NONE\n\t}\n\n\t/**\n\t * Is the initiator a pending member of this circle?\n\t */\n\tget isPendingMember() {\n\t\treturn this.initiator?.level === MemberLevels.NONE\n\t}\n\n\t/**\n\t * Can the initiator delete this circle?\n\t */\n\tget canDelete() {\n\t\treturn this.isOwner\n\t}\n\n\t/**\n\t * Can the initiator leave this circle?\n\t */\n\tget canLeave() {\n\t\treturn this.isMember && !this.isOwner\n\t}\n\n\t/**\n\t * Can the initiator add/remove members to this circle?\n\t */\n\tget canManageMembers() {\n\t\treturn (this.initiator?.level\n\t\t\t&& this.initiator?.level >= MemberLevels.MODERATOR)\n\t\t|| (this.config & CircleConfigs.FRIEND) !== 0\n\t}\n\n\t// PARAMS ---------------------------------------------\n\t/**\n\t * Vue router param\n\t */\n\tget router() {\n\t\treturn {\n\t\t\tname: 'team',\n\t\t\tparams: { teamId: this.id },\n\t\t}\n\t}\n\n\tget invitationCode() {\n\t\treturn this._data.invitationCode\n\t}\n\n\tset invitationCode(invitationCode: string) {\n\t\tthis._data.invitationCode = invitationCode\n\t}\n\n\t/**\n\t * Default javascript fallback\n\t * Used for sorting as well\n\t */\n\ttoString() {\n\t\treturn this.displayName\n\t}\n}\n","// @ts-nocheck\n/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { MemberLevel, MemberType } from '../models/constants.ts'\n\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { MemberLevels } from '../models/constants.ts'\ninterface MemberPairs {\n\tid: string\n\ttype: MemberType\n}\n\ntype CircleEditType = 'name' | 'description' | 'settings' | 'config'\nexport enum CircleEdit {\n\tName = 'name',\n\tDescription = 'description',\n\tSettings = 'settings',\n\tConfig = 'config',\n}\n\ninterface CircleSetting {\n\tsetting: string\n\tvalue: string\n}\n\n/**\n * Get the circles list without the members\n *\n * @return\n */\nexport async function getCircles() {\n\tconst response = await axios.get(generateOcsUrl('apps/circles/circles'))\n\treturn response.data.ocs.data\n}\n\n/**\n * Get a specific circle\n *\n * @param circleId\n * @return\n */\nexport async function getCircle(circleId: string) {\n\tconst response = await axios.get(generateOcsUrl('apps/circles/circles/{circleId}', { circleId }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Create a new circle\n *\n * @param name the circle name\n * @param personal\n * @param local\n * @return\n */\nexport async function createCircle(name: string, personal: boolean, local: boolean) {\n\tconst response = await axios.post(generateOcsUrl('apps/circles/circles'), {\n\t\tname,\n\t\tpersonal,\n\t\tlocal,\n\t})\n\treturn response.data.ocs.data\n}\n\n/**\n * Delete an existing circle\n *\n * @param circleId the circle id\n * @return\n */\nexport async function deleteCircle(circleId: string) {\n\tconst response = await axios.delete(generateOcsUrl('apps/circles/circles/{circleId}', { circleId }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Edit an existing circle\n *\n * @param circleId the circle id\n * @param type the edit type\n * @param data the data\n * @param value\n * @return\n */\nexport async function editCircle(circleId: string, type: CircleEditType, value: any) {\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/{type}', { circleId, type }), { value })\n\treturn response.data.ocs.data\n}\n\n/**\n * Join a circle\n *\n * @param circleId the circle id\n * @return\n */\nexport async function joinCircle(circleId: string) {\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/join', { circleId }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Leave a circle\n *\n * @param circleId the circle id\n * @return\n */\nexport async function leaveCircle(circleId: string) {\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/leave', { circleId }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Get the circle members without the members\n *\n * @param circleId the circle id\n * @param search the search query\n * @param role the role\n * @param limit the limit\n * @return\n */\nexport async function getCircleMembers(circleId: string, search?: string, role?: string, limit?: number) {\n\tconst response = await axios.get(\n\t\tgenerateOcsUrl('apps/circles/circles/{circleId}/members', { circleId }),\n\t\t{\n\t\t\tparams: {\n\t\t\t\tsearch,\n\t\t\t\trole,\n\t\t\t\t...(limit ? { limit } : {}),\n\t\t\t},\n\t\t},\n\t)\n\treturn response.data.ocs.data\n}\n\n/**\n * Search a potential circle member\n *\n * @param term the search query\n * @return\n */\nexport async function searchMember(term: string) {\n\tconst response = await axios.get(generateOcsUrl('apps/circles/search?term={term}', { term }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Add a circle member\n *\n * @param circleId the circle id\n * @param members the member id\n * @return\n */\nexport async function addMembers(circleId: string, members: Array) {\n\tconst response = await axios.post(generateOcsUrl('apps/circles/circles/{circleId}/members/multi', { circleId }), { members })\n\treturn response.data.ocs.data\n}\n\n/**\n * Delete a circle member\n *\n * @param circleId the circle id\n * @param memberId the member id\n * @return\n */\nexport async function deleteMember(circleId: string, memberId: string) {\n\tconst response = await axios.delete(generateOcsUrl('apps/circles/circles/{circleId}/members/{memberId}', { circleId, memberId }))\n\treturn Object.values(response.data.ocs.data)\n}\n\n/**\n * change a member level\n *\n * @see levels file src/models/constants.js\n *\n * @param circleId the circle id\n * @param memberId the member id\n * @param level the new member level\n * @return\n */\nexport async function changeMemberLevel(circleId: string, memberId: string, level: MemberLevel) {\n\tif (!(level in MemberLevels)) {\n\t\tthrow new Error('Invalid level.')\n\t}\n\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/members/{memberId}/level', { circleId, memberId }), {\n\t\tlevel,\n\t})\n\treturn Object.values(response.data.ocs.data)\n}\n\n/**\n * Accept a circle member request\n *\n * @param circleId the circle id\n * @param memberId the member id\n * @return\n */\nexport async function acceptMember(circleId: string, memberId: string) {\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/members/{memberId}', { circleId, memberId }))\n\treturn response.data.ocs.data\n}\n\nexport async function editCircleSetting(circleId: string, setting: CircleSetting) {\n\tconst response = await axios.put(\n\t\tgenerateOcsUrl('apps/circles/circles/{circleId}/setting', { circleId }),\n\t\tsetting,\n\t)\n\treturn response.data.ocs.data\n}\n\n/**\n * Get a specific invitation\n *\n * @param invitationCode\n * @return\n */\nexport async function getInvitation(invitationCode: string) {\n\tconst response = await axios.get(generateOcsUrl('apps/circles/invitations/{invitationCode}', { invitationCode }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Join a circle using an invitation\n *\n * @param invitationCode\n * @return\n */\nexport async function joinInvitation(invitationCode: string) {\n\tconst response = await axios.post(generateOcsUrl('apps/circles/invitations/{invitationCode}', { invitationCode }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Create an invitation link for a circle\n *\n * @param circleId\n * @return\n */\nexport async function createInvitationLink(circleId: string) {\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/invitation', { circleId }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Revoke the invitation link of a circle\n *\n * @param circleId\n * @return\n */\nexport async function revokeInvitationLink(circleId: string) {\n\tconst response = await axios.delete(generateOcsUrl('apps/circles/circles/{circleId}/invitation', { circleId }))\n\treturn response.data.ocs.data\n}\n","\n\n\n\n\n","import '../assets/NcFormBoxButton-ClkxmO-H.css';\nimport { reactive, inject, computed, defineComponent, toRef, openBlock, createBlock, mergeProps, unref, createSlots, withCtx, renderSlot, createTextVNode, toDisplayString, createCommentVNode } from \"vue\";\nimport { s as mdiOpenInNew, t as mdiArrowTopRight } from \"./mdi-CpchYUUV.mjs\";\nimport { N as NcFormBoxItem } from \"./NcFormBoxItem-Cm8aZaVJ.mjs\";\nimport { N as NcIconSvgWrapper } from \"./NcIconSvgWrapper-g8ubWhoz.mjs\";\nimport { routerKey } from \"vue-router\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\n/*!\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nfunction useButtonLink(options) {\n const props = reactive(options);\n const hasVueRouterContext = inject(routerKey, null) !== null;\n const tag = computed(() => {\n if (hasVueRouterContext && props.to) {\n return \"RouterLink\";\n } else if (props.href) {\n return \"a\";\n } else {\n return \"button\";\n }\n });\n const isLink = computed(() => tag.value === \"RouterLink\" || tag.value === \"a\");\n const isHyperLink = computed(() => tag.value === \"a\");\n const isRouterLink = computed(() => tag.value === \"RouterLink\");\n const isButton = computed(() => tag.value === \"button\");\n const attrs = computed(() => {\n if (tag.value === \"RouterLink\") {\n return {\n to: props.to,\n activeClass: \"active\",\n ...props.additionalAttrs?.(\"RouterLink\") ?? {}\n };\n } else if (tag.value === \"a\") {\n return {\n href: props.href,\n target: props.target,\n download: props.download || void 0,\n rel: \"nofollow noreferrer noopener\",\n ...props.additionalAttrs?.(\"a\") ?? {}\n };\n } else if (tag.value === \"button\") {\n return {\n type: props.type || \"button\",\n disabled: props.disabled,\n ...props.additionalAttrs?.(\"button\") ?? {}\n };\n }\n });\n return {\n tag,\n isLink,\n isHyperLink,\n isRouterLink,\n isButton,\n attrs\n };\n}\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcFormBoxButton\",\n props: {\n label: { default: () => void 0 },\n description: { default: () => void 0 },\n invertedAccent: { type: Boolean, default: false },\n to: { default: () => void 0 },\n href: { default: () => void 0 },\n target: { default: () => void 0 },\n disabled: { type: Boolean, default: false }\n },\n emits: [\"click\"],\n setup(__props) {\n const { tag, attrs, isLink } = useButtonLink({\n to: toRef(() => __props.to),\n href: toRef(() => __props.href),\n target: toRef(() => __props.target),\n disabled: toRef(() => __props.disabled)\n });\n const icon = computed(() => {\n if (isLink.value) {\n return __props.target === \"_blank\" ? mdiOpenInNew : mdiArrowTopRight;\n }\n return void 0;\n });\n return (_ctx, _cache) => {\n return openBlock(), createBlock(NcFormBoxItem, mergeProps({\n tag: unref(tag),\n itemClasses: [\n \"button-vue\",\n /* Reset server's global HTML button styles */\n _ctx.$style.formBoxButton\n ],\n invertedAccent: __props.invertedAccent\n }, unref(attrs), {\n tabindex: \"0\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), createSlots({ _: 2 }, [\n _ctx.$slots.default || __props.label ? {\n name: \"default\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"default\", {}, () => [\n createTextVNode(toDisplayString(__props.label), 1)\n ])\n ]),\n key: \"0\"\n } : void 0,\n _ctx.$slots.description || __props.description ? {\n name: \"description\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"description\", {}, () => [\n createTextVNode(toDisplayString(__props.description), 1)\n ])\n ]),\n key: \"1\"\n } : void 0,\n _ctx.$slots.icon || icon.value ? {\n name: \"icon\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"icon\", {}, () => [\n icon.value ? (openBlock(), createBlock(NcIconSvgWrapper, {\n key: 0,\n path: icon.value,\n inline: \"\"\n }, null, 8, [\"path\"])) : createCommentVNode(\"\", true)\n ])\n ]),\n key: \"2\"\n } : void 0\n ]), 1040, [\"tag\", \"itemClasses\", \"invertedAccent\"]);\n };\n }\n});\nconst formBoxButton = \"_formBoxButton_E8Xfr\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_MaIxG\",\n formBoxButton\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcFormBoxButton = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcFormBoxButton as N\n};\n//# sourceMappingURL=NcFormBoxButton-G_PkUiQy.mjs.map\n","import { d as mdiCheck, e as mdiContentCopy } from \"./mdi-CpchYUUV.mjs\";\nimport { ref, computed, toValue } from \"vue\";\nimport { r as register, e as t22, a as t } from \"./_l10n-wdIzZwir.mjs\";\nregister(t22);\n/*!\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nconst DELAY = 2e3;\nfunction useCopy(content) {\n const isCopied = ref(false);\n const icon = computed(() => isCopied.value ? mdiCheck : mdiContentCopy);\n const altText = computed(() => isCopied.value ? t(\"Copied\") : t(\"Copy to clipboard\"));\n async function copy() {\n if (isCopied.value) {\n return;\n }\n const value = toValue(content);\n try {\n await navigator.clipboard.writeText(value);\n } catch {\n prompt(\"\", value);\n }\n isCopied.value = true;\n setTimeout(() => {\n isCopied.value = false;\n }, DELAY);\n }\n return {\n isCopied,\n copy,\n icon,\n altText\n };\n}\nexport {\n useCopy as u\n};\n//# sourceMappingURL=useCopy-6F-qWHq0.mjs.map\n","import { defineComponent, openBlock, createBlock, unref, createSlots, withCtx, createVNode, createTextVNode, toDisplayString, createElementVNode, renderSlot } from \"vue\";\nimport { whenever } from \"@vueuse/core\";\nimport { N as NcFormBoxButton } from \"./NcFormBoxButton-G_PkUiQy.mjs\";\nimport { N as NcIconSvgWrapper } from \"./NcIconSvgWrapper-g8ubWhoz.mjs\";\nimport { u as useCopy } from \"./useCopy-6F-qWHq0.mjs\";\nconst _hoisted_1 = { class: \"hidden-visually\" };\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcFormBoxCopyButton\",\n props: {\n label: { default: () => void 0 },\n value: {},\n disabled: { type: Boolean, default: false }\n },\n emits: [\"copy\"],\n setup(__props, { emit: __emit }) {\n const emit = __emit;\n const { isCopied, copy, icon, altText } = useCopy(() => __props.value);\n whenever(isCopied, () => emit(\"copy\"));\n return (_ctx, _cache) => {\n return openBlock(), createBlock(NcFormBoxButton, {\n disabled: __props.disabled,\n invertedAccent: \"\",\n onClick: unref(copy)\n }, createSlots({\n description: withCtx(() => [\n createTextVNode(toDisplayString(__props.value), 1)\n ]),\n icon: withCtx(() => [\n createVNode(NcIconSvgWrapper, {\n path: unref(icon),\n inline: \"\"\n }, null, 8, [\"path\"])\n ]),\n _: 2\n }, [\n _ctx.$slots.default || __props.label ? {\n name: \"default\",\n fn: withCtx(() => [\n createElementVNode(\"span\", _hoisted_1, toDisplayString(unref(altText)), 1),\n renderSlot(_ctx.$slots, \"default\", {}, () => [\n createTextVNode(toDisplayString(__props.label), 1)\n ])\n ]),\n key: \"0\"\n } : void 0\n ]), 1032, [\"disabled\", \"onClick\"]);\n };\n }\n});\nexport {\n _sfc_main as _\n};\n//# sourceMappingURL=NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang-BA_gWnmz.mjs.map\n","\n\n","\n\n","\n\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { showError, showSuccess } from '@nextcloud/dialogs'\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tcopied: false,\n\t\t\tcopyLoading: false,\n\t\t\tcopySuccess: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tcopyLinkIcon() {\n\t\t\tif (this.copySuccess) {\n\t\t\t\treturn 'icon-checkmark'\n\t\t\t}\n\t\t\tif (this.copyLoading) {\n\t\t\t\treturn 'icon-loading-small'\n\t\t\t}\n\t\t\treturn 'icon-public'\n\t\t},\n\t},\n\n\tmethods: {\n\t\tasync copyToClipboard(url) {\n\t\t\t// change to loading status\n\t\t\tthis.copyLoading = true\n\n\t\t\t// copy link to clipboard\n\t\t\ttry {\n\t\t\t\tawait navigator.clipboard.writeText(url)\n\t\t\t\tthis.copySuccess = true\n\t\t\t\tthis.copied = true\n\n\t\t\t\t// Notify success\n\t\t\t\tshowSuccess(t('circles', 'Link copied to the clipboard'))\n\t\t\t} catch (error) {\n\t\t\t\tthis.copySuccess = false\n\t\t\t\tthis.copied = true\n\t\t\t\tshowError(t('circles', 'Could not copy link to the clipboard.'))\n\t\t\t} finally {\n\t\t\t\tthis.copyLoading = false\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t// stop loading status regardless of outcome\n\t\t\t\t\tthis.copied = false\n\t\t\t\t\tthis.copySuccess = false\n\t\t\t\t}, 2000)\n\t\t\t}\n\t\t},\n\t},\n}\n","\n\n\n\n\n","// @ts-nocheck\n/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n/// \n\nimport { translate as t } from '@nextcloud/l10n'\nimport { ShareType } from '@nextcloud/sharing'\nimport CircleConfigCheckboxesList from '../components/CircleDetails/CircleConfigs/CircleConfigCheckboxesList.vue'\nimport CircleConfigInvitationLink from '../components/CircleDetails/CircleConfigs/CircleConfigInvitationLink.vue'\n\nexport type DefaultGroup = string\nexport type DefaultChart = string\nexport type CircleConfig = number\nexport type MemberLevel = number\nexport type MemberType = number\n\n// Global sizes\nexport const LIST_SIZE = 60\n\n// Dynamic default groups\nexport const GROUP_ALL_CONTACTS: DefaultGroup = t('circles', 'All contacts')\nexport const GROUP_NO_GROUP_CONTACTS: DefaultGroup = t('circles', 'Not grouped')\nexport const GROUP_RECENTLY_CONTACTED: DefaultGroup = t('circles', 'Recently contacted')\n\n// Organization default chart for all contacts\nexport const CHART_ALL_CONTACTS: DefaultChart = t('circles', 'Organization chart')\n\n// Circle route, see vue-router conf\nexport const ROUTE_CIRCLE = 'circle'\nexport const ROUTE_CHART = 'chart'\nexport const ROUTE_USER_GROUP = 'user_group'\n\n// Contact settings\nexport const CONTACTS_SETTINGS: DefaultGroup = t('circles', 'Contacts settings')\n\n// Default max number of items to show in the navigation\nexport const ELLIPSIS_COUNT = 5\n\n// Circles member levels\nconst MEMBER_LEVEL_NONE: MemberLevel = 0\nconst MEMBER_LEVEL_MEMBER: MemberLevel = 1\nconst MEMBER_LEVEL_MODERATOR: MemberLevel = 4\nconst MEMBER_LEVEL_ADMIN: MemberLevel = 8\nconst MEMBER_LEVEL_OWNER: MemberLevel = 9\n\n// Circles member types\n\nconst MEMBER_TYPE_SINGLEID: MemberType = 0\nconst MEMBER_TYPE_USER: MemberType = 1\nconst MEMBER_TYPE_GROUP: MemberType = 2\nconst MEMBER_TYPE_MAIL: MemberType = 4\nconst MEMBER_TYPE_CONTACT: MemberType = 8\nconst MEMBER_TYPE_CIRCLE: MemberType = 16\n\nexport const CIRCLE_DESC = t('circles', 'Create your own teams for sharing. Add Nextcloud users, contacts, or anyone via email.')\n\n// Circles config flags\n\nconst CIRCLE_CONFIG_PERSONAL: CircleConfig = 2 // Personal circle, only the owner can see it.\nconst CIRCLE_CONFIG_SYSTEM: CircleConfig = 4 // System Circle (not managed by the official front-end). Meaning some config are limited\nconst CIRCLE_CONFIG_VISIBLE: CircleConfig = 8 // Visible to everyone, if not visible, people have to know its name to be able to find it\nconst CIRCLE_CONFIG_OPEN: CircleConfig = 16 // Circle is open, people can join\nconst CIRCLE_CONFIG_INVITE: CircleConfig = 32 // Adding a member generate an invitation that needs to be accepted\nconst CIRCLE_CONFIG_REQUEST: CircleConfig = 64 // Request to join Circles needs to be confirmed by a moderator\nconst CIRCLE_CONFIG_FRIEND: CircleConfig = 128 // Members of the circle can invite their friends\nconst CIRCLE_CONFIG_PROTECTED: CircleConfig = 256 // Password protected to join/request\nconst CIRCLE_CONFIG_NO_OWNER: CircleConfig = 512 // no owner, only members\nconst CIRCLE_CONFIG_HIDDEN: CircleConfig = 1024 // hidden from listing, but available as a share entity\nconst CIRCLE_CONFIG_BACKEND: CircleConfig = 2048 // Fully hidden, only backend Circles\nconst CIRCLE_CONFIG_LOCAL: CircleConfig = 4096 // Circle is not shared to other instance in globalscale\nconst CIRCLE_CONFIG_ROOT: CircleConfig = 8192 // Circle cannot be a member of another Circle\nconst CIRCLE_CONFIG_CIRCLE_INVITE: CircleConfig = 16384 // Circle must confirm when invited in another circle\nconst CIRCLE_CONFIG_FEDERATED: CircleConfig = 32768 // Federated\n\n// Existing members types\nexport const CIRCLES_MEMBER_TYPES = {\n\t[MEMBER_TYPE_CIRCLE]: t('circles', 'Team'),\n\t[MEMBER_TYPE_USER]: t('circles', 'User'),\n\t[MEMBER_TYPE_GROUP]: t('circles', 'Group'),\n\t[MEMBER_TYPE_MAIL]: t('circles', 'Email'),\n\t[MEMBER_TYPE_CONTACT]: t('circles', 'Contact'),\n}\n\n// Available circles promote/demote levels\nexport const CIRCLES_MEMBER_LEVELS = {\n\t// [MEMBER_LEVEL_NONE]: t('circles', 'Pending'),\n\t[MEMBER_LEVEL_MEMBER]: t('circles', 'Member'),\n\t[MEMBER_LEVEL_MODERATOR]: t('circles', 'Moderator'),\n\t[MEMBER_LEVEL_ADMIN]: t('circles', 'Admin'),\n\t[MEMBER_LEVEL_OWNER]: t('circles', 'Owner'),\n}\n\n// Available circle configs in the circle details view\nexport const PUBLIC_CIRCLE_CONFIG = {\n\t[t('circles', 'Invites')]: {\n\t\tcomponent: CircleConfigCheckboxesList,\n\t\tprops: {\n\t\t\tconfigs: {\n\t\t\t\t[CIRCLE_CONFIG_OPEN]: t('circles', 'Anyone can request membership'),\n\t\t\t\t[CIRCLE_CONFIG_INVITE]: t('circles', 'Members need to accept invitation'),\n\t\t\t\t[CIRCLE_CONFIG_REQUEST]: t('circles', 'Memberships must be confirmed/accepted by a Moderator (requires \"Anyone can request membership\")'),\n\t\t\t\t[CIRCLE_CONFIG_FRIEND]: t('circles', 'Members can also invite'),\n\t\t\t},\n\t\t},\n\t},\n\n\t[t('circles', 'Invitation links')]: {\n\t\tcomponent: CircleConfigInvitationLink,\n\t\tprops: {},\n\t},\n\n\t[t('circles', 'Membership')]: {\n\t\tcomponent: CircleConfigCheckboxesList,\n\t\tprops: {\n\t\t\tconfigs: {\n\t\t\t\t// TODO: implement backend\n\t\t\t\t// [CIRCLE_CONFIG_CIRCLE_INVITE]: t('circles', 'Team must confirm when invited in another circle'),\n\t\t\t\t[CIRCLE_CONFIG_ROOT]: t('circles', 'Prevent teams from being a member of another team'),\n\t\t\t},\n\t\t},\n\t},\n\n\t[t('circles', 'Federation')]: {\n\t\tcomponent: CircleConfigCheckboxesList,\n\t\tprops: {\n\t\t\tconfigs: {\n\t\t\t\t[CIRCLE_CONFIG_FEDERATED]: t('circles', 'Allow federated members'),\n\t\t\t},\n\t\t},\n\t},\n\n\t[t('circles', 'Privacy')]: {\n\t\tcomponent: CircleConfigCheckboxesList,\n\t\tprops: {\n\t\t\tconfigs: {\n\t\t\t\t[CIRCLE_CONFIG_VISIBLE]: t('circles', 'Visible to everyone'),\n\t\t\t},\n\t\t},\n\t},\n}\n\n// Represents the picker options (label is used lower case in a list of options: Search users, groups, teams, ...)\n// labelStandalone is used as heading for the member list where we need it starting captialized\nexport const CIRCLES_MEMBER_GROUPING = [\n\t{\n\t\tid: `picker-${ShareType.User}`,\n\t\tlabel: t('circles', 'users'),\n\t\tlabelStandalone: t('circles', 'Users'),\n\t\tshare: ShareType.User,\n\t\ttype: MEMBER_TYPE_USER,\n\t},\n\t{\n\t\tid: `picker-${ShareType.Group}`,\n\t\tlabel: t('circles', 'groups'),\n\t\tlabelStandalone: t('circles', 'Groups'),\n\t\tshare: ShareType.Group,\n\t\ttype: MEMBER_TYPE_GROUP,\n\t},\n\t{\n\t\tid: `picker-${ShareType.Remote}`,\n\t\tlabel: t('circles', 'federated users'),\n\t\tlabelStandalone: t('circles', 'Federated users'),\n\t\tshare: ShareType.Remote,\n\t\ttype: MEMBER_TYPE_USER,\n\t},\n\t// {\n\t// id: `picker-${ShareType.RemoteGroup}`,\n\t// label: t('circles', 'federated groups'),\n\t// share: ShareType.RemoteGroup,\n\t// type: MEMBER_TYPE_GROUP\n\t// },\n\t{\n\t\tid: `picker-${ShareType.Team}`,\n\t\tlabel: t('circles', 'teams'),\n\t\tlabelStandalone: t('circles', 'Teams'),\n\t\tshare: ShareType.Team,\n\t\ttype: MEMBER_TYPE_CIRCLE,\n\t},\n\t{\n\t\tid: `picker-${ShareType.Email}`,\n\t\tlabel: t('circles', 'email addresses'),\n\t\tlabelStandalone: t('circles', 'Email addresses'),\n\t\tshare: ShareType.Email,\n\t\ttype: MEMBER_TYPE_MAIL,\n\t},\n\t// TODO: implement SHARE_TYPE_CONTACT\n\t{\n\t\tid: 'picker-contact',\n\t\tlabel: t('circles', 'contacts'),\n\t\tlabelStandalone: t('circles', 'Contacts'),\n\t\tshare: ShareType.Email,\n\t\ttype: MEMBER_TYPE_CONTACT,\n\t},\n]\n\n// Generating a map between share types and circle member types\nexport const SHARES_TYPES_MEMBER_MAP = CIRCLES_MEMBER_GROUPING.reduce((list, entry) => {\n\t// ! Ignore duplicate share types\n\tif (!list[entry.share]) {\n\t\tlist[entry.share] = entry.type\n\t}\n\treturn list\n}, {})\n\nexport enum MemberLevels {\n\tNONE = MEMBER_LEVEL_NONE,\n\tMEMBER = MEMBER_LEVEL_MEMBER,\n\tMODERATOR = MEMBER_LEVEL_MODERATOR,\n\tADMIN = MEMBER_LEVEL_ADMIN,\n\tOWNER = MEMBER_LEVEL_OWNER,\n}\n\nexport enum MemberTypes {\n\tCIRCLE = MEMBER_TYPE_CIRCLE,\n\tUSER = MEMBER_TYPE_USER,\n\tGROUP = MEMBER_TYPE_GROUP,\n\tMAIL = MEMBER_TYPE_MAIL,\n\tCONTACT = MEMBER_TYPE_CONTACT,\n}\n\nexport enum CircleConfigs {\n\tPERSONAL = CIRCLE_CONFIG_PERSONAL,\n\tSYSTEM = CIRCLE_CONFIG_SYSTEM,\n\tVISIBLE = CIRCLE_CONFIG_VISIBLE,\n\tOPEN = CIRCLE_CONFIG_OPEN,\n\tINVITE = CIRCLE_CONFIG_INVITE,\n\tREQUEST = CIRCLE_CONFIG_REQUEST,\n\tFRIEND = CIRCLE_CONFIG_FRIEND,\n\tPROTECTED = CIRCLE_CONFIG_PROTECTED,\n\tNO_OWNER = CIRCLE_CONFIG_NO_OWNER,\n\tHIDDEN = CIRCLE_CONFIG_HIDDEN,\n\tBACKEND = CIRCLE_CONFIG_BACKEND,\n\tLOCAL = CIRCLE_CONFIG_LOCAL,\n\tROOT = CIRCLE_CONFIG_ROOT,\n\tCIRCLE_INVITE = CIRCLE_CONFIG_CIRCLE_INVITE,\n\tFEDERATED = CIRCLE_CONFIG_FEDERATED,\n}\n\nexport enum MemberStatus {\n\tINVITED = 'Invited',\n\tMEMBER = 'Member',\n\tREQUESTING = 'Requesting',\n}\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios from '@nextcloud/axios'\nimport { getCapabilities } from '@nextcloud/capabilities'\nimport { t } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { ShareType } from '@nextcloud/sharing'\nimport { CircleConfigs, SHARES_TYPES_MEMBER_MAP } from '../models/constants.ts'\nimport { logger } from '../../../logger.ts'\n\n// generate allowed shareType from SHARES_TYPES_MEMBER_MAP\nconst shareType = Object.keys(SHARES_TYPES_MEMBER_MAP)\nconst maxAutocompleteResults = parseInt(window.OC.config['sharing.maxAutocompleteResults'], 10) || 25\n\n/**\n * Get suggestions\n *\n * @param {string} search the search query\n * @param {object|null} circle - the circle object\n */\nexport async function getSuggestions(search, circle = null) {\n\tconst request = await axios.get(generateOcsUrl('apps/files_sharing/api/v1/sharees'), {\n\t\tparams: {\n\t\t\tformat: 'json',\n\t\t\titemType: 'teams',\n\t\t\tsearch,\n\t\t\tperPage: maxAutocompleteResults,\n\t\t\tshareType,\n\t\t\tlookup: false,\n\t\t},\n\t})\n\n\tconst data = request.data.ocs.data\n\tconst exact = request.data.ocs.data.exact\n\tdata.exact = [] // removing exact from general results\n\n\t// flatten array of arrays\n\tlet rawExactSuggestions = Object.values(exact).reduce((arr, elem) => arr.concat(elem), [])\n\tlet rawSuggestions = Object.values(data).reduce((arr, elem) => arr.concat(elem), [])\n\n\t// check if federation flag is enabled using bitwise AND on circle config\n\tconst isCircleFederated = circle ? (circle.config & CircleConfigs.FEDERATED) !== 0 : false\n\tif (isCircleFederated) {\n\t\t// remove results from untrusted remote servers\n\t\trawExactSuggestions = rawExactSuggestions\n\t\t\t.filter((result) => !(result.value?.shareType === ShareType.Remote && result.value?.isTrustedServer === false))\n\t\trawSuggestions = rawSuggestions\n\t\t\t.filter((result) => !(result.value?.shareType === ShareType.Remote && result.value?.isTrustedServer === false))\n\t} else {\n\t\t// remove all results from remote servers\n\t\trawExactSuggestions = rawExactSuggestions\n\t\t\t.filter((result) => result.value?.shareType !== ShareType.Remote)\n\t\trawSuggestions = rawSuggestions\n\t\t\t.filter((result) => result.value?.shareType !== ShareType.Remote)\n\t}\n\n\t// remove invalid data and format to user-select layout\n\tconst exactSuggestions = rawExactSuggestions\n\t\t.filter((result) => typeof result === 'object')\n\t\t.map((share) => formatResults(share))\n\t\t// sort by type so we can get user&groups first...\n\t\t.sort((a, b) => a.shareType - b.shareType)\n\tconst suggestions = rawSuggestions\n\t\t.filter((result) => typeof result === 'object')\n\t\t.map((share) => formatResults(share))\n\t\t// sort by type so we can get user&groups first...\n\t\t.sort((a, b) => a.shareType - b.shareType)\n\n\tconst finalResults = exactSuggestions.concat(suggestions)\n\n\tlogger.info('suggestions', { finalResults })\n\n\treturn finalResults\n}\n\n/**\n * Get the sharing recommendations\n */\nexport async function getRecommendations() {\n\tconst request = await axios.get(generateOcsUrl('apps/files_sharing/api/v1/sharees_recommended'), {\n\t\tparams: {\n\t\t\tformat: 'json',\n\t\t\titemType: 'contacts',\n\t\t\tshareType,\n\t\t},\n\t})\n\n\t// flatten array of arrays\n\tconst exact = request.data.ocs.data.exact\n\tconst recommendations = Object.values(exact).reduce((arr, elem) => arr.concat(elem), [])\n\n\t// remove invalid data and format to user-select layout\n\tconst finalResults = recommendations\n\t\t.map((share) => formatResults(share))\n\n\tlogger.info('recommendations', finalResults)\n\n\treturn finalResults\n}\n\n/**\n * Secondary line telling apart entries with the same name,\n * same rules as the files_sharing sharing input.\n *\n * @param {object} result raw sharee result\n * @return {string}\n */\nfunction getSubname(result) {\n\tswitch (result.value.shareType) {\n\t\tcase ShareType.User:\n\t\t\t// Admins can hide the email/unique name for privacy\n\t\t\treturn getCapabilities().files_sharing?.sharee?.always_show_unique === true\n\t\t\t\t? result.shareWithDisplayNameUnique ?? ''\n\t\t\t\t: ''\n\t\tcase ShareType.Email:\n\t\t\treturn result.value.shareWith\n\t\tcase ShareType.Remote:\n\t\tcase ShareType.RemoteGroup:\n\t\t\treturn result.value.server\n\t\t\t\t? t('circles', 'on {server}', { server: result.value.server })\n\t\t\t\t: ''\n\t\tdefault:\n\t\t\treturn result.shareWithDescription ?? ''\n\t}\n}\n\nfunction formatResults(result) {\n\tconst type = `picker-${result.value.shareType}`\n\treturn {\n\t\tlabel: result.label,\n\t\tid: `${type}-${result.value.shareWith}`,\n\t\t// If this is a user, set as user for avatar display by UserBubble\n\t\tuser: [ShareType.User, ShareType.Remote].indexOf(result.value.shareType) > -1\n\t\t\t? result.value.shareWith\n\t\t\t: null,\n\t\ttype,\n\t\tsubname: getSubname(result),\n\t\t...result.value,\n\t}\n}\n","/*!\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { Member, MemberCandidate, Resource, SharedResource, Team, TeamRole } from './types.ts'\n\nimport axios from '@nextcloud/axios'\nimport { FileType } from '@nextcloud/files'\nimport { defaultRootPath, getClient, getDefaultPropfind, resultToNode } from '@nextcloud/files/dav'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { logger } from '../logger.ts'\nimport { SHARES_TYPES_MEMBER_MAP } from './team-page/models/constants.ts'\nimport { getRecommendations, getSuggestions } from './team-page/services/collaborationAutocompletion.js'\n\n/** `SHARES_TYPES_MEMBER_MAP` is built dynamically, so type its shape explicitly. */\nconst shareTypeToMemberType = SHARES_TYPES_MEMBER_MAP as Record\n\n/** Minimal shape of an OCS response envelope. */\ninterface OcsResponse {\n\tocs: { data: T }\n}\n\n/** Raw member as returned by the circles API. */\ninterface RawMember {\n\tsingleId: string\n\tuserId: string | null\n\tdisplayName: string\n\tuserType?: number\n\ttype?: number\n\tlevel?: number\n}\n\n/** Raw resource as returned by the dashboard endpoint. */\ninterface RawResource {\n\tid: string | number\n\tname: string\n\ttype: string\n\ticonUrl: string\n\tfallbackIcon: string\n\turl: string\n}\n\n/** Raw circle as returned by the `/circles` endpoint. */\ninterface RawCircle {\n\tid: string\n\tname: string\n\tdisplayName: string\n\tdescription?: string\n\tpopulation?: number\n\tinitiator?: { level?: number }\n}\n\n/** Raw team as returned by the dashboard widget endpoint. */\ninterface RawDashboardTeam {\n\tsingleId: string\n\tmembers: RawMember[]\n\tresources: RawResource[]\n}\n\n/** Raw sharee suggestion, as returned by the files_sharing autocompletion helper. */\ninterface RawSuggestion {\n\tid: string\n\tlabel: string\n\tshareWith: string\n\tshareType: number\n\tuser?: string | null\n\tsubname: string\n}\n\n/**\n * Map a circles member level to a role.\n *\n * @param level - The circles member level (9 owner, 8 admin, 4 moderator, …)\n */\nfunction levelToRole(level: number | undefined): TeamRole {\n\tif (level === undefined) {\n\t\treturn 'member'\n\t}\n\tif (level >= 9) {\n\t\treturn 'owner'\n\t}\n\tif (level >= 8) {\n\t\treturn 'admin'\n\t}\n\tif (level >= 4) {\n\t\treturn 'moderator'\n\t}\n\treturn 'member'\n}\n\n/**\n * Map a resource from the dashboard endpoint to our type.\n *\n * @param raw - The raw resource\n */\nfunction mapResource(raw: RawResource): Resource {\n\treturn {\n\t\tid: String(raw.id),\n\t\tname: raw.name,\n\t\ttype: raw.type === 'folder' ? 'folder' : 'file',\n\t\ticonUrl: raw.iconUrl,\n\t\tfallbackIcon: raw.fallbackIcon,\n\t\turl: raw.url,\n\t}\n}\n\n/**\n * Map a preview member (from the dashboard endpoint, no level) to our type.\n *\n * @param raw - The raw member\n */\nfunction mapPreviewMember(raw: RawMember): Member {\n\treturn {\n\t\tid: raw.singleId,\n\t\tuserId: raw.userId ?? null,\n\t\tdisplayName: raw.displayName,\n\t\tisUser: raw.type === 1,\n\t\trole: 'member',\n\t}\n}\n\n/**\n * Map a full member (from the members endpoint, includes level) to our type.\n *\n * @param raw - The raw member\n */\nfunction mapFullMember(raw: RawMember): Member {\n\treturn {\n\t\tid: raw.singleId,\n\t\tuserId: raw.userId ?? null,\n\t\tdisplayName: raw.displayName,\n\t\tisUser: raw.userType === 1,\n\t\trole: levelToRole(raw.level),\n\t}\n}\n\n/**\n * Fetch all of the current user's teams, merging team metadata (name,\n * description, member count, our role) with the members preview and resources.\n */\nexport async function fetchTeams(): Promise {\n\tconst [circlesRes, dashRes] = await Promise.allSettled([\n\t\taxios.get>(generateOcsUrl('apps/circles/circles') + '?limit=-1'),\n\t\taxios.get>(generateOcsUrl('apps/circles/teams/dashboard/widget') + '?limit=200&offset=0'),\n\t])\n\n\t// The team list is required; without it we have nothing to show.\n\tif (circlesRes.status === 'rejected') {\n\t\tthrow circlesRes.reason\n\t}\n\tconst circles = circlesRes.value.data.ocs.data ?? []\n\n\t// The dashboard only enriches each team with member/resource previews, so\n\t// treat a failure there as \"no previews\" rather than failing the whole page.\n\tlet dashboard: RawDashboardTeam[] = []\n\tif (dashRes.status === 'fulfilled') {\n\t\tdashboard = dashRes.value.data.ocs.data ?? []\n\t} else {\n\t\tlogger.warn('Failed to load team dashboard previews', { error: dashRes.reason })\n\t}\n\tconst dashboardById = new Map(dashboard.map((team) => [team.singleId, team]))\n\n\treturn circles.map((circle) => {\n\t\tconst extra = dashboardById.get(circle.id)\n\t\treturn {\n\t\t\tid: circle.id,\n\t\t\tdisplayName: circle.displayName || circle.name,\n\t\t\tdescription: circle.description ?? '',\n\t\t\tmemberCount: circle.population ?? extra?.members.length ?? 0,\n\t\t\tmyRole: levelToRole(circle.initiator?.level),\n\t\t\tmembers: (extra?.members ?? []).map(mapPreviewMember),\n\t\t\tresources: (extra?.resources ?? []).map(mapResource),\n\t\t}\n\t})\n}\n\n/**\n * Fetch the full member list for a team (includes roles).\n *\n * @param teamId - The team single id\n */\nexport async function fetchTeamMembers(teamId: string): Promise {\n\tconst res = await axios.get>(generateOcsUrl('apps/circles/circles/{circleId}/members', { circleId: teamId }))\n\treturn (res.data.ocs.data ?? []).map(mapFullMember)\n}\n\n/**\n * Create a team and return its single id.\n *\n * @param name - The team name\n * @param createTeamFolder - Whether to auto-create a team space. Defaults to\n * true so existing API callers keep the previous behaviour.\n */\nexport async function createTeam(name: string, createTeamFolder = true): Promise {\n\tconst res = await axios.post>(\n\t\tgenerateOcsUrl('apps/circles/circles'),\n\t\t{ name, createTeamFolder },\n\t)\n\treturn res.data.ocs.data.id\n}\n\n/**\n * Set a team's description.\n *\n * @param teamId - The team single id\n * @param description - The new description\n */\nexport async function setTeamDescription(teamId: string, description: string): Promise {\n\tawait axios.put(\n\t\tgenerateOcsUrl('apps/circles/circles/{circleId}/description', { circleId: teamId }),\n\t\t{ value: description },\n\t)\n}\n\n/**\n * Leave a team.\n *\n * @param teamId - The team single id\n */\nexport async function leaveTeam(teamId: string): Promise {\n\tawait axios.put(\n\t\tgenerateOcsUrl('apps/circles/circles/{circleId}/leave', { circleId: teamId }),\n\t\t{},\n\t)\n}\n\n/**\n * Delete a team.\n *\n * @param teamId - The team single id\n */\nexport async function deleteTeam(teamId: string): Promise {\n\tawait axios.delete(generateOcsUrl('apps/circles/circles/{circleId}', { circleId: teamId }))\n}\n\n/**\n * The team folder linked to a team.\n */\nexport interface TeamFolder {\n\tid: number\n\tmountPoint: string\n\tquota: number | null\n}\n\n/** Team and its linked folder as exposed to administrators. */\nexport interface AdminTeamFolder {\n\tteamId: string\n\tteamName: string\n\tdefaultQuota: number | null\n\tfolder: TeamFolder | null\n}\n\n/**\n * Fetch all teams and their optionally linked team folders for the admin settings view.\n */\nexport async function getAdminTeamFolders(): Promise {\n\tconst { data } = await axios.get>(generateOcsUrl('/apps/circles/admin/teamfolders'))\n\treturn data.ocs.data\n}\n\n/**\n * Update the default quota associated with a team.\n *\n * @param teamId - The team single id\n * @param quota - Quota in bytes, zero for unlimited, or null to remove the override\n */\nexport async function updateTeamFolderDefaultQuota(teamId: string, quota: number | null): Promise<{ teamId: string, defaultQuota: number | null }> {\n\tconst { data } = await axios.put>(\n\t\tgenerateOcsUrl('/apps/circles/admin/teamfolders/{circleId}/default-quota', { circleId: teamId }),\n\t\t{ quota },\n\t)\n\treturn data.ocs.data\n}\n\n/**\n * Fetch the team folder linked to a team.\n *\n * The Circles app exposes the team-folder lifecycle through the core Teams\n * contract. The active provider is discovered server-side.\n *\n * @param teamId - The team single id\n * @return The linked team folder, or null if none exists.\n */\nexport async function getTeamFolder(teamId: string): Promise {\n\ttry {\n\t\tconst { data } = await axios.get>(generateOcsUrl('apps/circles/teams/{circleId}/folder', { circleId: teamId }))\n\t\treturn data.ocs.data\n\t} catch (error) {\n\t\tif (error && typeof error === 'object'\n\t\t\t&& 'response' in error\n\t\t\t&& (error.response as { status?: number })?.status === 404) {\n\t\t\treturn null\n\t\t}\n\t\tthrow error\n\t}\n}\n\n/**\n * Create a team folder for a team that predates the auto-create feature.\n *\n * Idempotent: if the team already owns a folder, the existing folder is\n * returned. Requires team owner privileges.\n *\n * @param teamId - The team single id\n * @param name - Optional team folder name\n * @return The created (or existing) team folder.\n */\nexport async function upgradeTeamFolder(teamId: string, name?: string): Promise {\n\tconst { data } = await axios.post>(\n\t\tgenerateOcsUrl('apps/circles/teams/{circleId}/folder', { circleId: teamId }),\n\t\t{ name },\n\t)\n\treturn data.ocs.data.folder\n}\n\n/**\n * Fetch team folders that are not yet linked to a team.\n *\n * @param teamId - The team single id\n */\nexport async function getLinkableTeamFolders(teamId: string): Promise {\n\tconst { data } = await axios.get>(generateOcsUrl('apps/circles/teams/{circleId}/folder/linkable', { circleId: teamId }))\n\treturn data.ocs.data\n}\n\n/**\n * Link a team to a team folder.\n *\n * @param teamId - The team single id\n * @param folderId - The id of the existing team folder\n */\nexport async function linkTeamFolder(teamId: string, folderId: number): Promise {\n\tconst { data } = await axios.post>(\n\t\tgenerateOcsUrl('apps/circles/teams/{circleId}/folder/link', { circleId: teamId }),\n\t\t{ folderId },\n\t)\n\treturn data.ocs.data.folder\n}\n\n/**\n * Update the storage quota of the team folder linked to a team.\n *\n * @param teamId - The team single id\n * @param quota - Quota in bytes, or zero for unlimited\n */\nexport async function updateTeamFolderQuota(teamId: string, quota: number): Promise {\n\tconst { data } = await axios.put>(\n\t\tgenerateOcsUrl('apps/circles/teams/{circleId}/folder/quota', { circleId: teamId }),\n\t\t{ quota },\n\t)\n\treturn data.ocs.data.folder\n}\n\n/**\n * Subfolder of the team folder holding the page files, inside the app's\n * own namespace of the hidden `.system` folder: the pages neither clutter\n * the files the team actually shares nor the `.system` root itself.\n */\nconst PAGES_FOLDER = '.system/teams/pages'\n\n/**\n * A team page: a markdown file stored in the team folder's hidden pages\n * subfolder, surfaced as a tab on the team.\n */\nexport interface TeamPage {\n\tfileId: number\n\t/** Page title: the file name without the .md extension. */\n\ttitle: string\n\t/** Path relative to the user's files root, as the Text editor expects. */\n\tfilePath: string\n}\n\n/**\n * List the team pages: the markdown files in the team folder's hidden\n * pages subfolder.\n *\n * @param mountPoint - The team folder mount point of the current user\n */\nexport async function fetchTeamPages(mountPoint: string): Promise {\n\tlet response\n\ttry {\n\t\tresponse = await getClient().getDirectoryContents(`${defaultRootPath}/${mountPoint}/${PAGES_FOLDER}`, {\n\t\t\tdetails: true,\n\t\t\tdata: getDefaultPropfind(),\n\t\t})\n\t} catch (error) {\n\t\t// 404 means the pages subfolder was not created yet (it appears with\n\t\t// the first page), or the team folder itself has not been physically\n\t\t// created — either way \"no pages\".\n\t\tif ((error as { status?: number })?.status === 404) {\n\t\t\treturn []\n\t\t}\n\t\tthrow error\n\t}\n\tconst data = Array.isArray(response) ? response : response.data\n\n\treturn data\n\t\t.map((entry) => resultToNode(entry, defaultRootPath))\n\t\t.filter((node) => node.type === FileType.File\n\t\t\t&& node.extension?.toLowerCase() === '.md'\n\t\t\t&& node.fileid !== undefined)\n\t\t.map((node) => ({\n\t\t\tfileId: node.fileid!,\n\t\t\ttitle: node.basename.slice(0, -node.extension!.length),\n\t\t\tfilePath: `/${mountPoint}/${PAGES_FOLDER}/${node.basename}`,\n\t\t}))\n\t\t.sort((a, b) => a.title.localeCompare(b.title))\n}\n\n/**\n * Create a team page: an empty markdown file in the team folder's hidden\n * pages subfolder, which appears with the first page.\n *\n * @param mountPoint - The team folder mount point of the current user\n * @param name - The page name (without extension)\n */\nexport async function createTeamPage(mountPoint: string, name: string): Promise {\n\tconst pagesFolder = `${defaultRootPath}/${mountPoint}/${PAGES_FOLDER}`\n\ttry {\n\t\t// Recursive: `.system` and the pages folder inside it appear with\n\t\t// the first page.\n\t\tawait getClient().createDirectory(pagesFolder, { recursive: true })\n\t} catch (error) {\n\t\t// 405: the folder appeared between the existence probe and the MKCOL.\n\t\tif ((error as { status?: number })?.status !== 405) {\n\t\t\tthrow error\n\t\t}\n\t}\n\tconst written = await getClient().putFileContents(`${pagesFolder}/${name}.md`, '', {\n\t\t// Refuse to overwrite an existing page of the same name\n\t\toverwrite: false,\n\t})\n\t// The webdav client returns false instead of throwing on the 412 an\n\t// existing page produces with overwrite disabled.\n\tif (written === false) {\n\t\tthrow Object.assign(new Error('A page with this name already exists'), { status: 412 })\n\t}\n}\n\n/**\n * Delete a team page: remove its markdown file from the team folder.\n *\n * @param page - The team page to delete\n */\nexport async function deleteTeamPage(page: TeamPage): Promise {\n\tawait getClient().deleteFile(`${defaultRootPath}${page.filePath}`)\n}\n\n/**\n * Rename a team page: move its markdown file to the new name within the\n * team folder. Refuses to overwrite an existing page of the same name.\n *\n * @param page - The team page to rename\n * @param name - The new page name (without extension)\n */\nexport async function renameTeamPage(page: TeamPage, name: string): Promise {\n\tconst directory = page.filePath.slice(0, page.filePath.lastIndexOf('/'))\n\tawait getClient().moveFile(\n\t\t`${defaultRootPath}${page.filePath}`,\n\t\t`${defaultRootPath}${directory}/${name}.md`,\n\t\t{ overwrite: false },\n\t)\n}\n\n/**\n * Fetch the team-level tab order (readable by every member).\n *\n * @param teamId - The team single id\n * @return Tab ids, first to last. Empty when no order has been saved.\n */\nexport async function fetchTabOrder(teamId: string): Promise {\n\tconst { data } = await axios.get>(generateOcsUrl('apps/circles/teams/{circleId}/tab-order', { circleId: teamId }))\n\treturn data.ocs.data.order ?? []\n}\n\n/**\n * Save the team-level tab order. Requires team admin or above.\n *\n * @param teamId - The team single id\n * @param order - Tab ids, first to last\n */\nexport async function saveTabOrder(teamId: string, order: string[]): Promise {\n\tawait axios.put(\n\t\tgenerateOcsUrl('apps/circles/teams/{circleId}/tab-order', { circleId: teamId }),\n\t\t{ order },\n\t)\n}\n\n/**\n * Fetch the resources shared to a team from the core teams resource\n * providers (Talk rooms, calendars, collectives, …).\n *\n * @param teamId - The team single id\n */\nexport async function fetchTeamResources(teamId: string): Promise {\n\tconst res = await axios.get>(generateOcsUrl('teams/{teamId}/resources', { teamId }))\n\treturn res.data.ocs.data.resources ?? []\n}\n\n/**\n * Create a collective named after a team. The collectives app links the\n * collective to the team by name, so no separate share step is needed.\n *\n * TODO: calls the collectives API directly; should eventually go through\n * a teams extension point instead of hardcoding another app's route.\n *\n * @param name - The collective name (the team's name)\n */\nexport async function createCollective(name: string): Promise {\n\tawait axios.post(\n\t\tgenerateOcsUrl('apps/collectives/api/v1.0/collectives'),\n\t\t{ name },\n\t)\n}\n\n/**\n * Create a Deck board linked to a team. The deck endpoint links the board\n * to the team itself, so no separate share step is needed.\n *\n * TODO: calls the deck API directly; should eventually go through a teams\n * extension point instead of hardcoding another app's route.\n *\n * @param teamId - The team single id\n * @param title - The board title\n */\nexport async function createDeckBoard(teamId: string, title: string): Promise {\n\tconst res = await axios.post>(\n\t\tgenerateOcsUrl('apps/deck/api/v1.0/boards/team'),\n\t\t{ title, teamId },\n\t)\n\tif (!res.data.ocs.data.id) {\n\t\tthrow new Error('The board creation response contains no board id')\n\t}\n}\n\n/** A deck board attached to the team itself, shown as a navigation entry. */\nexport interface TeamBoard {\n\tid: number\n\ttitle: string\n\t/** Absolute deep link to the board in the deck app. */\n\turl: string\n}\n\n/** The subset of deck's serialized board relevant here. */\ninterface RawDeckBoard {\n\tid: number\n\ttitle: string\n\tteamId?: string | null\n\tarchived?: boolean\n\tdeletedAt?: number\n}\n\n/**\n * Pick the deck boards attached to the team itself out of the shared deck\n * resources. The generic resource list cannot tell a team board from a\n * personally-shared one (and deck's board list omits teamId), so each\n * candidate is read individually from deck.\n *\n * TODO: calls the deck API directly; should eventually go through a teams\n * extension point instead of hardcoding another app's route.\n *\n * @param teamId - The team single id\n * @param candidates - The team's shared resources from the deck provider\n */\nexport async function fetchTeamDeckBoards(teamId: string, candidates: SharedResource[]): Promise {\n\tconst responses = await Promise.allSettled(candidates.map((resource) => axios.get>(generateOcsUrl('apps/deck/api/v1.0/board/{boardId}', { boardId: resource.id }))))\n\n\tconst boards: TeamBoard[] = []\n\tresponses.forEach((response, index) => {\n\t\tconst resource = candidates[index]\n\t\tif (response.status === 'rejected') {\n\t\t\t// The board stays reachable through the shared resources.\n\t\t\tlogger.warn('Could not read a deck board, not showing it as a tab', { resource, reason: response.reason })\n\t\t\treturn\n\t\t}\n\t\tconst board = response.value.data.ocs.data\n\t\tif (board.teamId === teamId && !board.archived && (board.deletedAt ?? 0) === 0) {\n\t\t\tboards.push({ id: board.id, title: board.title, url: resource.url })\n\t\t}\n\t})\n\n\treturn boards.sort((a, b) => a.title.localeCompare(b.title))\n}\n\n/**\n * Search for potential new members (users, groups, emails, contacts, other\n * teams…) using the same sharee autocompletion endpoint as file sharing.\n * This restores the legacy \"add members while creating a team\" feature for\n * the team creation wizard.\n *\n * @param term - The search query. An empty term returns curated recommendations.\n */\nexport async function searchMemberCandidates(term: string): Promise {\n\tconst suggestions: RawSuggestion[] = term.trim()\n\t\t? await getSuggestions(term)\n\t\t: await getRecommendations()\n\n\treturn suggestions.map((suggestion) => ({\n\t\tkey: suggestion.id,\n\t\tshareWith: suggestion.shareWith,\n\t\tshareType: suggestion.shareType,\n\t\tdisplayName: suggestion.label,\n\t\tsubname: suggestion.subname,\n\t\tisUser: suggestion.user !== null && suggestion.user !== undefined,\n\t}))\n}\n\n/**\n * Add a batch of picked candidates as members of a team, typically right\n * after creating it from the wizard.\n *\n * @param teamId - The team single id\n * @param candidates - The candidates picked in the wizard's member step\n * @return The number of candidates that were actually added.\n */\nexport async function addTeamMembers(teamId: string, candidates: MemberCandidate[]): Promise {\n\tconst members = candidates.map((candidate) => ({\n\t\tid: candidate.shareWith,\n\t\ttype: shareTypeToMemberType[candidate.shareType],\n\t}))\n\tconst res = await axios.post>>(\n\t\tgenerateOcsUrl('apps/circles/circles/{circleId}/members/multi', { circleId: teamId }),\n\t\t{ members },\n\t)\n\treturn Object.keys(res.data.ocs.data ?? {}).length\n}\n","\n\n"],"names":["_sfc_main","defineComponent","__props","style","useCssModule","provide","NC_FORM_BOX_CONTEXT_KEY","_ctx","_cache","openBlock","createElementBlock","normalizeClass","renderSlot","ncFormBox","ncFormBox_row","ncFormBox__item","ncFormBox_col","style0","cssModules","NcFormBox","_export_sfc","_hoisted_1","slots","useSlots","formBoxItemClass","useNcFormBox","descriptionId","createElementId","hasDescription","unref","isLegacy","createElementVNode","createBlock","resolveDynamicComponent","mergeProps","$event","withCtx","createTextVNode","toDisplayString","createCommentVNode","formBoxItem","formBoxItem__description","formBoxItem_legacy","formBoxItem_inverted","formBoxItem__element","formBoxItem__content","formBoxItem__icon","NcFormBoxItem","mergeModels","__emit","modelValue","useModel","emit","inputId","watch","createSlots","withDirectives","vModelCheckbox","createVNode","NcIconToggleSwitch","formBoxSwitch__input","NcFormBoxSwitch","Member","data","circle","logger","Circle","MemberTypes","level","MemberLevels","text","initiator","owner","members","member","singleId","config","CircleConfigs","invitationCode","CircleEdit","getCircles","axios","generateOcsUrl","getCircle","circleId","createCircle","name","personal","local","deleteCircle","editCircle","type","value","joinCircle","leaveCircle","getCircleMembers","search","role","limit","addMembers","deleteMember","memberId","response","changeMemberLevel","acceptMember","editCircleSetting","setting","getInvitation","joinInvitation","createInvitationLink","revokeInvitationLink","props","loading","ref","isChecked","onChange","checked","confirmEnableFederationForCircle","prevConfig","nextConfig","circleData","error","showError","t","showConfirmation","_createBlock","_unref","_openBlock","_createElementBlock","_Fragment","_renderList","label","useButtonLink","options","reactive","hasVueRouterContext","inject","routerKey","tag","computed","isLink","isHyperLink","isRouterLink","isButton","attrs","toRef","icon","mdiOpenInNew","mdiArrowTopRight","NcIconSvgWrapper","formBoxButton","NcFormBoxButton","register","t22","DELAY","useCopy","content","isCopied","mdiCheck","mdiContentCopy","altText","copy","toValue","whenever","_hoisted_3","_mergeProps","$props","_createElementVNode","CopyToClipboardMixin","url","showSuccess","Autorenew","LinkOff","LinkPlus","NcFormBoxCopyButton","getBaseUrl","generateUrl","message","action","_component_NcFormBox","$options","_createVNode","_component_NcFormBoxCopyButton","_component_NcFormBoxButton","_component_Autorenew","_component_LinkOff","_component_LinkPlus","MEMBER_LEVEL_NONE","MEMBER_LEVEL_MEMBER","MEMBER_LEVEL_MODERATOR","MEMBER_LEVEL_ADMIN","MEMBER_LEVEL_OWNER","MEMBER_TYPE_USER","MEMBER_TYPE_GROUP","MEMBER_TYPE_MAIL","MEMBER_TYPE_CONTACT","MEMBER_TYPE_CIRCLE","CIRCLE_CONFIG_PERSONAL","CIRCLE_CONFIG_SYSTEM","CIRCLE_CONFIG_VISIBLE","CIRCLE_CONFIG_OPEN","CIRCLE_CONFIG_INVITE","CIRCLE_CONFIG_REQUEST","CIRCLE_CONFIG_FRIEND","CIRCLE_CONFIG_PROTECTED","CIRCLE_CONFIG_NO_OWNER","CIRCLE_CONFIG_HIDDEN","CIRCLE_CONFIG_BACKEND","CIRCLE_CONFIG_LOCAL","CIRCLE_CONFIG_ROOT","CIRCLE_CONFIG_CIRCLE_INVITE","CIRCLE_CONFIG_FEDERATED","CIRCLES_MEMBER_LEVELS","PUBLIC_CIRCLE_CONFIG","CircleConfigCheckboxesList","CircleConfigInvitationLink","CIRCLES_MEMBER_GROUPING","ShareType","SHARES_TYPES_MEMBER_MAP","list","entry","MemberStatus","shareType","maxAutocompleteResults","getSuggestions","request","exact","rawExactSuggestions","arr","elem","rawSuggestions","result","exactSuggestions","share","formatResults","a","b","suggestions","finalResults","getRecommendations","getSubname","getCapabilities","shareTypeToMemberType","levelToRole","mapResource","raw","mapPreviewMember","mapFullMember","fetchTeams","circlesRes","dashRes","circles","dashboard","dashboardById","team","extra","fetchTeamMembers","teamId","createTeam","createTeamFolder","setTeamDescription","description","leaveTeam","deleteTeam","getAdminTeamFolders","updateTeamFolderDefaultQuota","quota","getTeamFolder","upgradeTeamFolder","getLinkableTeamFolders","linkTeamFolder","folderId","updateTeamFolderQuota","PAGES_FOLDER","fetchTeamPages","mountPoint","getClient","defaultRootPath","getDefaultPropfind","resultToNode","node","FileType","createTeamPage","pagesFolder","deleteTeamPage","page","renameTeamPage","directory","fetchTabOrder","saveTabOrder","order","fetchTeamResources","createCollective","createDeckBoard","title","fetchTeamDeckBoards","candidates","responses","resource","boards","index","board","searchMemberCandidates","term","suggestion","addTeamMembers","candidate","res"],"mappings":"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","x_google_ignoreList":[0,1,2,7,8,9,10,11,12,18]} \ No newline at end of file +{"version":3,"file":"TrashCanOutline-DbEqwasY.chunk.mjs","sources":["../node_modules/@nextcloud/vue/dist/chunks/NcFormBox-Bmqar8nn.mjs","../node_modules/@nextcloud/vue/dist/chunks/NcFormBoxItem-Cm8aZaVJ.mjs","../node_modules/@nextcloud/vue/dist/chunks/NcFormBoxSwitch-DSXiQcnq.mjs","../src/teams/team-page/models/member.ts","../src/teams/team-page/models/circle.ts","../src/teams/team-page/services/circles.ts","../src/teams/team-page/components/CircleDetails/CircleConfigs/CircleConfigCheckboxesList.vue","../node_modules/@nextcloud/vue/dist/chunks/NcFormBoxButton-G_PkUiQy.mjs","../node_modules/@nextcloud/vue/dist/chunks/useCopy-6F-qWHq0.mjs","../node_modules/@nextcloud/vue/dist/chunks/NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang-BA_gWnmz.mjs","../node_modules/vue-material-design-icons/Autorenew.vue","../node_modules/vue-material-design-icons/LinkOff.vue","../node_modules/vue-material-design-icons/LinkPlus.vue","../src/teams/team-page/mixins/CopyToClipboardMixin.js","../src/teams/team-page/components/CircleDetails/CircleConfigs/CircleConfigInvitationLink.vue","../src/teams/team-page/models/constants.ts","../src/teams/team-page/services/collaborationAutocompletion.js","../src/teams/api.ts","../node_modules/vue-material-design-icons/TrashCanOutline.vue"],"sourcesContent":["import '../assets/NcFormBox-TRgICDO3.css';\nimport { defineComponent, useCssModule, provide, openBlock, createElementBlock, normalizeClass, renderSlot } from \"vue\";\nimport { N as NC_FORM_BOX_CONTEXT_KEY } from \"./useNcFormBox-Djlh582y.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcFormBox\",\n props: {\n row: { type: Boolean }\n },\n setup(__props) {\n const style = useCssModule();\n provide(NC_FORM_BOX_CONTEXT_KEY, {\n isInFormBox: true,\n formBoxItemClass: style.ncFormBox__item\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([_ctx.$style.ncFormBox, __props.row ? _ctx.$style.ncFormBox_row : _ctx.$style.ncFormBox_col])\n }, [\n renderSlot(_ctx.$slots, \"default\", {\n itemClass: _ctx.$style.ncFormBox__item\n })\n ], 2);\n };\n }\n});\nconst ncFormBox = \"_ncFormBox_s7kf-\";\nconst ncFormBox_row = \"_ncFormBox_row_GzYuE\";\nconst ncFormBox__item = \"_ncFormBox__item_691pI\";\nconst ncFormBox_col = \"_ncFormBox_col_Lt4lg\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_JPsV1\",\n ncFormBox,\n ncFormBox_row,\n ncFormBox__item,\n ncFormBox_col\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcFormBox = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcFormBox as N\n};\n//# sourceMappingURL=NcFormBox-Bmqar8nn.mjs.map\n","import '../assets/NcFormBoxItem-CABDVZLe.css';\nimport { defineComponent, useSlots, openBlock, createElementBlock, normalizeClass, unref, createElementVNode, createBlock, resolveDynamicComponent, mergeProps, withCtx, renderSlot, createTextVNode, toDisplayString, createCommentVNode } from \"vue\";\nimport { u as useNcFormBox } from \"./useNcFormBox-Djlh582y.mjs\";\nimport { c as createElementId } from \"./createElementId-DhjFt1I9.mjs\";\nimport { a as isLegacy } from \"./legacy-BoqDmOCa.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nconst _hoisted_1 = [\"id\"];\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n ...{ inheritAttrs: false },\n __name: \"NcFormBoxItem\",\n props: {\n tag: {},\n label: { default: () => void 0 },\n description: { default: () => void 0 },\n invertedAccent: { type: Boolean, default: false },\n class: { default: () => void 0 },\n itemClasses: { default: () => void 0 }\n },\n emits: [\"click\"],\n setup(__props) {\n const slots = useSlots();\n const { formBoxItemClass } = useNcFormBox();\n const descriptionId = createElementId();\n const hasDescription = () => !!__props.description || !!slots.description;\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\n __props.class,\n _ctx.$style.formBoxItem,\n unref(formBoxItemClass),\n {\n [_ctx.$style.formBoxItem_inverted]: __props.invertedAccent && hasDescription(),\n [_ctx.$style.formBoxItem_legacy]: unref(isLegacy)\n }\n ])\n }, [\n createElementVNode(\"span\", {\n class: normalizeClass(_ctx.$style.formBoxItem__content)\n }, [\n (openBlock(), createBlock(resolveDynamicComponent(__props.tag), mergeProps({\n class: [_ctx.$style.formBoxItem__element, __props.itemClasses]\n }, _ctx.$attrs, {\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), {\n default: withCtx(() => [\n renderSlot(_ctx.$slots, \"default\", { descriptionId: unref(descriptionId) }, () => [\n createTextVNode(toDisplayString(__props.label || \"⚠️ Label is missing\"), 1)\n ])\n ]),\n _: 3\n }, 16, [\"class\"])),\n hasDescription() ? (openBlock(), createElementBlock(\"span\", {\n key: 0,\n id: unref(descriptionId),\n class: normalizeClass(_ctx.$style.formBoxItem__description)\n }, [\n renderSlot(_ctx.$slots, \"description\", {}, () => [\n createTextVNode(toDisplayString(__props.description), 1)\n ])\n ], 10, _hoisted_1)) : createCommentVNode(\"\", true)\n ], 2),\n createElementVNode(\"span\", {\n class: normalizeClass(_ctx.$style.formBoxItem__icon)\n }, [\n renderSlot(_ctx.$slots, \"icon\", { descriptionId: unref(descriptionId) }, () => [\n _cache[1] || (_cache[1] = createTextVNode(\" ⚠️ Icon is missing \", -1))\n ])\n ], 2)\n ], 2);\n };\n }\n});\nconst formBoxItem = \"_formBoxItem_Gp-TA\";\nconst formBoxItem__description = \"_formBoxItem__description_UqZJ1\";\nconst formBoxItem_legacy = \"_formBoxItem_legacy_dP9aJ\";\nconst formBoxItem_inverted = \"_formBoxItem_inverted_BU-i-\";\nconst formBoxItem__element = \"_formBoxItem__element_jHCux\";\nconst formBoxItem__content = \"_formBoxItem__content_UKovC\";\nconst formBoxItem__icon = \"_formBoxItem__icon_AvkP3\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_8BFGk\",\n formBoxItem,\n formBoxItem__description,\n formBoxItem_legacy,\n formBoxItem_inverted,\n formBoxItem__element,\n formBoxItem__content,\n formBoxItem__icon\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcFormBoxItem = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcFormBoxItem as N\n};\n//# sourceMappingURL=NcFormBoxItem-Cm8aZaVJ.mjs.map\n","import '../assets/NcFormBoxSwitch-NCjook_Z.css';\nimport { defineComponent, useModel, watch, openBlock, createBlock, unref, createSlots, withCtx, withDirectives, createElementVNode, normalizeClass, vModelCheckbox, createVNode, renderSlot, createTextVNode, toDisplayString, mergeModels } from \"vue\";\nimport { N as NcFormBoxItem } from \"./NcFormBoxItem-Cm8aZaVJ.mjs\";\nimport { N as NcIconToggleSwitch } from \"./NcIconToggleSwitch-CRvGt4su.mjs\";\nimport { c as createElementId } from \"./createElementId-DhjFt1I9.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nconst _hoisted_1 = [\"id\", \"aria-describedby\", \"disabled\"];\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcFormBoxSwitch\",\n props: /* @__PURE__ */ mergeModels({\n label: { default: () => void 0 },\n description: { default: () => void 0 },\n disabled: { type: Boolean, default: false }\n }, {\n \"modelValue\": { type: Boolean, ...{ required: true } },\n \"modelModifiers\": {}\n }),\n emits: /* @__PURE__ */ mergeModels([\"enable\", \"disable\"], [\"update:modelValue\"]),\n setup(__props, { emit: __emit }) {\n const modelValue = useModel(__props, \"modelValue\");\n const emit = __emit;\n const inputId = createElementId();\n watch(modelValue, () => {\n if (modelValue.value) {\n emit(\"enable\");\n } else {\n emit(\"disable\");\n }\n }, {\n // defineModel emits update:modelValue synchronously\n // Watching it synchronously to emit the enable/disable events together with the update:modelValue event\n flush: \"sync\"\n });\n return (_ctx, _cache) => {\n return openBlock(), createBlock(NcFormBoxItem, {\n tag: \"label\",\n for: unref(inputId)\n }, createSlots({\n icon: withCtx(({ descriptionId }) => [\n withDirectives(createElementVNode(\"input\", {\n id: unref(inputId),\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),\n class: normalizeClass(_ctx.$style.formBoxSwitch__input),\n type: \"checkbox\",\n role: \"switch\",\n \"aria-describedby\": descriptionId,\n disabled: __props.disabled\n }, null, 10, _hoisted_1), [\n [vModelCheckbox, modelValue.value]\n ]),\n createVNode(NcIconToggleSwitch, {\n checked: modelValue.value,\n inline: \"\"\n }, null, 8, [\"checked\"])\n ]),\n _: 2\n }, [\n _ctx.$slots.default || __props.label ? {\n name: \"default\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"default\", {}, () => [\n createTextVNode(toDisplayString(__props.label), 1)\n ])\n ]),\n key: \"0\"\n } : void 0,\n _ctx.$slots.description || __props.description ? {\n name: \"description\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"description\", {}, () => [\n createTextVNode(toDisplayString(__props.description), 1)\n ])\n ]),\n key: \"1\"\n } : void 0\n ]), 1032, [\"for\"]);\n };\n }\n});\nconst formBoxSwitch__input = \"_formBoxSwitch__input_n8432\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_v0XYD\",\n formBoxSwitch__input\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcFormBoxSwitch = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcFormBoxSwitch as N\n};\n//# sourceMappingURL=NcFormBoxSwitch-DSXiQcnq.mjs.map\n","// @ts-nocheck\n/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { MemberLevel, MemberType } from './constants.ts'\n\nimport { logger } from '../../../logger.ts'\nimport Circle from './circle.ts'\nimport { MemberLevels, MemberTypes } from './constants.ts'\n\nexport default class Member {\n\t_data: any = {}\n\t_circle: Circle\n\n\t/**\n\t * Creates an instance of Member\n\t *\n\t * @param data\n\t * @param circle\n\t */\n\tconstructor(data: any, circle: Circle) {\n\t\tif (typeof data !== 'object') {\n\t\t\tthrow new Error('Invalid member')\n\t\t}\n\n\t\t// if no uid set, fail\n\t\tif (data.id && typeof data.id !== 'string') {\n\t\t\tlogger.error('This member do not have a proper uid', data)\n\t\t\tthrow new Error('This member do not have a proper uid')\n\t\t}\n\n\t\tthis._circle = circle\n\t\tthis._data = data\n\t}\n\n\t/**\n\t * Get the circle of this member\n\t */\n\tget circle(): Circle {\n\t\treturn this._circle\n\t}\n\n\t/**\n\t * Set the circle of this member\n\t */\n\tset circle(circle: Circle) {\n\t\tif (circle.constructor.name !== Circle.name) {\n\t\t\tthrow new Error('circle must be a Circle type')\n\t\t}\n\t\tthis._circle = circle\n\t}\n\n\t/**\n\t * Member id\n\t */\n\tget id(): string {\n\t\treturn this._data.id\n\t}\n\n\t/**\n\t * Single uid\n\t */\n\tget singleId(): string {\n\t\treturn this._data.singleId\n\t}\n\n\t/**\n\t * Formatted display name\n\t */\n\tget displayName(): string {\n\t\treturn this._data.displayName\n\t}\n\n\t/**\n\t * Member userId\n\t */\n\tget userId(): string {\n\t\treturn this._data.userId\n\t}\n\n\t/**\n\t * Member type\n\t */\n\tget userType(): MemberType {\n\t\t// If the user type is a circle, this could originate from multiple sources\n\t\treturn this._data.userType !== MemberTypes.CIRCLE\n\t\t\t? this._data.userType\n\t\t\t: this.basedOn.source\n\t}\n\n\t/**\n\t * Member based on source\n\t */\n\tget basedOn(): any {\n\t\treturn this._data.basedOn\n\t}\n\n\t/**\n\t * Member level\n\t *\n\t */\n\tget level(): MemberLevel {\n\t\treturn this._data.level\n\t}\n\n\t/**\n\t * Set member level\n\t */\n\tset level(level: MemberLevel) {\n\t\tif (!(level in MemberLevels)) {\n\t\t\tthrow new Error('Invalid level')\n\t\t}\n\t\tthis._data.level = level\n\t}\n\n\t/**\n\t * Member request status\n\t *\n\t */\n\tget status(): string {\n\t\treturn this._data.status\n\t}\n\n\t/**\n\t * Is the current member a user?\n\t */\n\tget isUser() {\n\t\treturn this._data.userType === MemberLevels.MEMBER\n\t}\n\n\t/**\n\t * Is the current member without a circle?\n\t */\n\tget isOrphan() {\n\t\treturn this._circle?.constructor?.name !== Circle.name\n\t}\n\n\t/**\n\t * Delete this member and any reference from its circle\n\t */\n\tdelete() {\n\t\tif (this.isOrphan) {\n\t\t\tthrow new Error('Cannot delete this member as it doesn\\'t belong to any circle')\n\t\t}\n\t\tthis.circle.deleteMember(this)\n\t\tthis._data = undefined\n\t}\n}\n","// @ts-nocheck\n/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { CircleConfigs, MemberLevels, ROUTE_CIRCLE } from './constants.ts'\nimport Member from './member.ts'\nimport { logger } from '../../../logger.ts'\n\ntype MemberList = Record\n\nexport default class Circle {\n\t_data: any = {}\n\t_members: MemberList = {}\n\t_owner: Member\n\t_initiator: Member\n\n\t/**\n\t * Creates an instance of Circle\n\t *\n\t * @param data\n\t */\n\tconstructor(data: object) {\n\t\tthis.updateData(data)\n\t}\n\n\t/**\n\t * Update inner circle data, owner and initiator\n\t *\n\t * @param data\n\t */\n\tupdateData(data: any) {\n\t\tif (typeof data !== 'object') {\n\t\t\tthrow new Error('Invalid circle')\n\t\t}\n\n\t\t// if no uid set, fail\n\t\tif (!data.id) {\n\t\t\tthrow new Error('This circle do not have a proper uid')\n\t\t}\n\n\t\tthis._data = data\n\t\tthis._owner = new Member(data.owner, this)\n\n\t\tif (data.initiator) {\n\t\t\tthis._initiator = new Member(data.initiator, this)\n\t\t}\n\t}\n\n\t// METADATA -----------------------------------------\n\t/**\n\t * Circle id\n\t */\n\tget id(): string {\n\t\treturn this._data.id\n\t}\n\n\t/**\n\t * Formatted display name\n\t */\n\tget displayName(): string {\n\t\treturn this._data.displayName\n\t}\n\n\t/**\n\t * Set the display name\n\t */\n\tset displayName(text: string) {\n\t\tthis._data.displayName = text\n\t}\n\n\t/**\n\t * Circle creation date\n\t */\n\tget creation(): number {\n\t\treturn this._data.creation\n\t}\n\n\t/**\n\t * Circle description\n\t */\n\tget description(): string {\n\t\treturn this._data.description\n\t}\n\n\t/**\n\t * Circle description\n\t */\n\tset description(text: string) {\n\t\tthis._data.description = text\n\t}\n\n\t/**\n\t * Circle direct member count (excluding nested circles)\n\t */\n\tget population() {\n\t\treturn this._data.population\n\t}\n\n\t/**\n\t * Circle total member count (direct + inherited from nested circles)\n\t */\n\tget populationInherited() {\n\t\treturn this._data.populationInherited\n\t}\n\n\t// MEMBERSHIP -----------------------------------------\n\t/**\n\t * Circle ini_initiator the current\n\t * user info for this circle\n\t * null if not a member\n\t */\n\tget initiator(): Member | null {\n\t\treturn this._initiator\n\t}\n\n\t/**\n\t * Set new circle initiator\n\t * null if not a member\n\t */\n\tset initiator(initiator: Member) {\n\t\tif (initiator && initiator.constructor.name !== Member.name) {\n\t\t\tthrow new Error('Initiator must be a Member type')\n\t\t}\n\t\tthis._initiator = initiator\n\t}\n\n\t/**\n\t * Circle ownership\n\t */\n\tget owner(): Member {\n\t\treturn this._owner\n\t}\n\n\t/**\n\t * Set new circle owner\n\t */\n\tset owner(owner: Member) {\n\t\tif (owner.constructor.name !== Member.name) {\n\t\t\tthrow new Error('Owner must be a Member type')\n\t\t}\n\t\tthis._owner = owner\n\t}\n\n\t/**\n\t * Circle members\n\t */\n\tget members(): MemberList {\n\t\treturn this._members\n\t}\n\n\t/**\n\t * Define members circle\n\t */\n\tset members(members: MemberList) {\n\t\tthis._members = members\n\t}\n\n\t/**\n\t * Add a member to this circle\n\t *\n\t * @param member\n\t */\n\taddMember(member: Member) {\n\t\tif (member.constructor.name !== Member.name) {\n\t\t\tthrow new Error('Member must be a Member type')\n\t\t}\n\n\t\tconst singleId = member.singleId\n\t\tif (this._members[singleId]) {\n\t\t\tlogger.warn('Replacing existing member data', { member })\n\t\t}\n\t\tthis._members[singleId] = member\n\t}\n\n\t/**\n\t * Remove a member from this circle\n\t *\n\t * @param member\n\t */\n\tdeleteMember(member: Member) {\n\t\tif (member.constructor.name !== Member.name) {\n\t\t\tthrow new Error('Member must be a Member type')\n\t\t}\n\n\t\tconst singleId = member.singleId\n\t\tif (!this._members[singleId]) {\n\t\t\tlogger.warn('The member was not in this circle. Nothing was done.', { member })\n\t\t}\n\n\t\t// Delete and clear memory\n\t\tdelete this._members[singleId]\n\t}\n\n\t// CONFIGS --------------------------------------------\n\tget settings() {\n\t\treturn this._data.settings\n\t}\n\n\t/**\n\t * Circle config\n\t */\n\tget config(): number {\n\t\treturn this._data.config\n\t}\n\n\t/**\n\t * Define circle config\n\t */\n\tset config(config: number) {\n\t\tthis._data.config = config\n\t}\n\n\t/**\n\t * Circle is personal\n\t */\n\tget isPersonal() {\n\t\treturn (this._data.config & CircleConfigs.PERSONAL) !== 0\n\t}\n\n\t/**\n\t * Circle requires invite to be confirmed by moderator or above\n\t */\n\tget requireJoinAccept() {\n\t\treturn (this._data.config & CircleConfigs.VISIBLE) !== 0\n\t}\n\n\t/**\n\t * Circle can be requested to join\n\t */\n\tget canJoin() {\n\t\treturn (this._data.config & CircleConfigs.OPEN) !== 0\n\t}\n\n\t/**\n\t * Circle is visible to others\n\t */\n\tget isVisible() {\n\t\treturn (this._data.config & CircleConfigs.VISIBLE) !== 0\n\t}\n\n\t/**\n\t * Circle requires invite to be accepted by the member\n\t */\n\tget requireInviteAccept() {\n\t\treturn (this._data.config & CircleConfigs.INVITE) !== 0\n\t}\n\n\t// PERMISSIONS SHORTCUTS ------------------------------\n\t/**\n\t * Can the initiator add members to this circle?\n\t */\n\tget isOwner() {\n\t\treturn this.initiator?.level === MemberLevels.OWNER\n\t}\n\n\t// PERMISSIONS SHORTCUTS ------------------------------\n\t/**\n\t * Is the initiator an admin of this circle?\n\t */\n\tget isAdmin() {\n\t\treturn this.initiator?.level === MemberLevels.ADMIN\n\t}\n\n\t/**\n\t * Is the initiator a member of this circle?\n\t */\n\tget isMember() {\n\t\treturn this.initiator?.level\n\t\t\t&& this.initiator?.level > MemberLevels.NONE\n\t}\n\n\t/**\n\t * Is the initiator a pending member of this circle?\n\t */\n\tget isPendingMember() {\n\t\treturn this.initiator?.level === MemberLevels.NONE\n\t}\n\n\t/**\n\t * Can the initiator delete this circle?\n\t */\n\tget canDelete() {\n\t\treturn this.isOwner\n\t}\n\n\t/**\n\t * Can the initiator leave this circle?\n\t */\n\tget canLeave() {\n\t\treturn this.isMember && !this.isOwner\n\t}\n\n\t/**\n\t * Can the initiator add/remove members to this circle?\n\t */\n\tget canManageMembers() {\n\t\treturn (this.initiator?.level\n\t\t\t&& this.initiator?.level >= MemberLevels.MODERATOR)\n\t\t|| (this.config & CircleConfigs.FRIEND) !== 0\n\t}\n\n\t// PARAMS ---------------------------------------------\n\t/**\n\t * Vue router param\n\t */\n\tget router() {\n\t\treturn {\n\t\t\tname: 'team',\n\t\t\tparams: { teamId: this.id },\n\t\t}\n\t}\n\n\tget invitationCode() {\n\t\treturn this._data.invitationCode\n\t}\n\n\tset invitationCode(invitationCode: string) {\n\t\tthis._data.invitationCode = invitationCode\n\t}\n\n\t/**\n\t * Default javascript fallback\n\t * Used for sorting as well\n\t */\n\ttoString() {\n\t\treturn this.displayName\n\t}\n}\n","// @ts-nocheck\n/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { MemberLevel, MemberType } from '../models/constants.ts'\n\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { MemberLevels } from '../models/constants.ts'\ninterface MemberPairs {\n\tid: string\n\ttype: MemberType\n}\n\ntype CircleEditType = 'name' | 'description' | 'settings' | 'config'\nexport enum CircleEdit {\n\tName = 'name',\n\tDescription = 'description',\n\tSettings = 'settings',\n\tConfig = 'config',\n}\n\ninterface CircleSetting {\n\tsetting: string\n\tvalue: string\n}\n\n/**\n * Get the circles list without the members\n *\n * @return\n */\nexport async function getCircles() {\n\tconst response = await axios.get(generateOcsUrl('apps/circles/circles'))\n\treturn response.data.ocs.data\n}\n\n/**\n * Get a specific circle\n *\n * @param circleId\n * @return\n */\nexport async function getCircle(circleId: string) {\n\tconst response = await axios.get(generateOcsUrl('apps/circles/circles/{circleId}', { circleId }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Create a new circle\n *\n * @param name the circle name\n * @param personal\n * @param local\n * @return\n */\nexport async function createCircle(name: string, personal: boolean, local: boolean) {\n\tconst response = await axios.post(generateOcsUrl('apps/circles/circles'), {\n\t\tname,\n\t\tpersonal,\n\t\tlocal,\n\t})\n\treturn response.data.ocs.data\n}\n\n/**\n * Delete an existing circle\n *\n * @param circleId the circle id\n * @return\n */\nexport async function deleteCircle(circleId: string) {\n\tconst response = await axios.delete(generateOcsUrl('apps/circles/circles/{circleId}', { circleId }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Edit an existing circle\n *\n * @param circleId the circle id\n * @param type the edit type\n * @param data the data\n * @param value\n * @return\n */\nexport async function editCircle(circleId: string, type: CircleEditType, value: any) {\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/{type}', { circleId, type }), { value })\n\treturn response.data.ocs.data\n}\n\n/**\n * Join a circle\n *\n * @param circleId the circle id\n * @return\n */\nexport async function joinCircle(circleId: string) {\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/join', { circleId }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Leave a circle\n *\n * @param circleId the circle id\n * @return\n */\nexport async function leaveCircle(circleId: string) {\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/leave', { circleId }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Get the circle members without the members\n *\n * @param circleId the circle id\n * @param search the search query\n * @param role the role\n * @param limit the limit\n * @return\n */\nexport async function getCircleMembers(circleId: string, search?: string, role?: string, limit?: number) {\n\tconst response = await axios.get(\n\t\tgenerateOcsUrl('apps/circles/circles/{circleId}/members', { circleId }),\n\t\t{\n\t\t\tparams: {\n\t\t\t\tsearch,\n\t\t\t\trole,\n\t\t\t\t...(limit ? { limit } : {}),\n\t\t\t},\n\t\t},\n\t)\n\treturn response.data.ocs.data\n}\n\n/**\n * Search a potential circle member\n *\n * @param term the search query\n * @return\n */\nexport async function searchMember(term: string) {\n\tconst response = await axios.get(generateOcsUrl('apps/circles/search?term={term}', { term }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Add a circle member\n *\n * @param circleId the circle id\n * @param members the member id\n * @return\n */\nexport async function addMembers(circleId: string, members: Array) {\n\tconst response = await axios.post(generateOcsUrl('apps/circles/circles/{circleId}/members/multi', { circleId }), { members })\n\treturn response.data.ocs.data\n}\n\n/**\n * Delete a circle member\n *\n * @param circleId the circle id\n * @param memberId the member id\n * @return\n */\nexport async function deleteMember(circleId: string, memberId: string) {\n\tconst response = await axios.delete(generateOcsUrl('apps/circles/circles/{circleId}/members/{memberId}', { circleId, memberId }))\n\treturn Object.values(response.data.ocs.data)\n}\n\n/**\n * change a member level\n *\n * @see levels file src/models/constants.js\n *\n * @param circleId the circle id\n * @param memberId the member id\n * @param level the new member level\n * @return\n */\nexport async function changeMemberLevel(circleId: string, memberId: string, level: MemberLevel) {\n\tif (!(level in MemberLevels)) {\n\t\tthrow new Error('Invalid level.')\n\t}\n\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/members/{memberId}/level', { circleId, memberId }), {\n\t\tlevel,\n\t})\n\treturn Object.values(response.data.ocs.data)\n}\n\n/**\n * Accept a circle member request\n *\n * @param circleId the circle id\n * @param memberId the member id\n * @return\n */\nexport async function acceptMember(circleId: string, memberId: string) {\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/members/{memberId}', { circleId, memberId }))\n\treturn response.data.ocs.data\n}\n\nexport async function editCircleSetting(circleId: string, setting: CircleSetting) {\n\tconst response = await axios.put(\n\t\tgenerateOcsUrl('apps/circles/circles/{circleId}/setting', { circleId }),\n\t\tsetting,\n\t)\n\treturn response.data.ocs.data\n}\n\n/**\n * Get a specific invitation\n *\n * @param invitationCode\n * @return\n */\nexport async function getInvitation(invitationCode: string) {\n\tconst response = await axios.get(generateOcsUrl('apps/circles/invitations/{invitationCode}', { invitationCode }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Join a circle using an invitation\n *\n * @param invitationCode\n * @return\n */\nexport async function joinInvitation(invitationCode: string) {\n\tconst response = await axios.post(generateOcsUrl('apps/circles/invitations/{invitationCode}', { invitationCode }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Create an invitation link for a circle\n *\n * @param circleId\n * @return\n */\nexport async function createInvitationLink(circleId: string) {\n\tconst response = await axios.put(generateOcsUrl('apps/circles/circles/{circleId}/invitation', { circleId }))\n\treturn response.data.ocs.data\n}\n\n/**\n * Revoke the invitation link of a circle\n *\n * @param circleId\n * @return\n */\nexport async function revokeInvitationLink(circleId: string) {\n\tconst response = await axios.delete(generateOcsUrl('apps/circles/circles/{circleId}/invitation', { circleId }))\n\treturn response.data.ocs.data\n}\n","\n\n\n\n\n","import '../assets/NcFormBoxButton-ClkxmO-H.css';\nimport { reactive, inject, computed, defineComponent, toRef, openBlock, createBlock, mergeProps, unref, createSlots, withCtx, renderSlot, createTextVNode, toDisplayString, createCommentVNode } from \"vue\";\nimport { s as mdiOpenInNew, t as mdiArrowTopRight } from \"./mdi-CpchYUUV.mjs\";\nimport { N as NcFormBoxItem } from \"./NcFormBoxItem-Cm8aZaVJ.mjs\";\nimport { N as NcIconSvgWrapper } from \"./NcIconSvgWrapper-g8ubWhoz.mjs\";\nimport { routerKey } from \"vue-router\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\n/*!\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nfunction useButtonLink(options) {\n const props = reactive(options);\n const hasVueRouterContext = inject(routerKey, null) !== null;\n const tag = computed(() => {\n if (hasVueRouterContext && props.to) {\n return \"RouterLink\";\n } else if (props.href) {\n return \"a\";\n } else {\n return \"button\";\n }\n });\n const isLink = computed(() => tag.value === \"RouterLink\" || tag.value === \"a\");\n const isHyperLink = computed(() => tag.value === \"a\");\n const isRouterLink = computed(() => tag.value === \"RouterLink\");\n const isButton = computed(() => tag.value === \"button\");\n const attrs = computed(() => {\n if (tag.value === \"RouterLink\") {\n return {\n to: props.to,\n activeClass: \"active\",\n ...props.additionalAttrs?.(\"RouterLink\") ?? {}\n };\n } else if (tag.value === \"a\") {\n return {\n href: props.href,\n target: props.target,\n download: props.download || void 0,\n rel: \"nofollow noreferrer noopener\",\n ...props.additionalAttrs?.(\"a\") ?? {}\n };\n } else if (tag.value === \"button\") {\n return {\n type: props.type || \"button\",\n disabled: props.disabled,\n ...props.additionalAttrs?.(\"button\") ?? {}\n };\n }\n });\n return {\n tag,\n isLink,\n isHyperLink,\n isRouterLink,\n isButton,\n attrs\n };\n}\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcFormBoxButton\",\n props: {\n label: { default: () => void 0 },\n description: { default: () => void 0 },\n invertedAccent: { type: Boolean, default: false },\n to: { default: () => void 0 },\n href: { default: () => void 0 },\n target: { default: () => void 0 },\n disabled: { type: Boolean, default: false }\n },\n emits: [\"click\"],\n setup(__props) {\n const { tag, attrs, isLink } = useButtonLink({\n to: toRef(() => __props.to),\n href: toRef(() => __props.href),\n target: toRef(() => __props.target),\n disabled: toRef(() => __props.disabled)\n });\n const icon = computed(() => {\n if (isLink.value) {\n return __props.target === \"_blank\" ? mdiOpenInNew : mdiArrowTopRight;\n }\n return void 0;\n });\n return (_ctx, _cache) => {\n return openBlock(), createBlock(NcFormBoxItem, mergeProps({\n tag: unref(tag),\n itemClasses: [\n \"button-vue\",\n /* Reset server's global HTML button styles */\n _ctx.$style.formBoxButton\n ],\n invertedAccent: __props.invertedAccent\n }, unref(attrs), {\n tabindex: \"0\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), createSlots({ _: 2 }, [\n _ctx.$slots.default || __props.label ? {\n name: \"default\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"default\", {}, () => [\n createTextVNode(toDisplayString(__props.label), 1)\n ])\n ]),\n key: \"0\"\n } : void 0,\n _ctx.$slots.description || __props.description ? {\n name: \"description\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"description\", {}, () => [\n createTextVNode(toDisplayString(__props.description), 1)\n ])\n ]),\n key: \"1\"\n } : void 0,\n _ctx.$slots.icon || icon.value ? {\n name: \"icon\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"icon\", {}, () => [\n icon.value ? (openBlock(), createBlock(NcIconSvgWrapper, {\n key: 0,\n path: icon.value,\n inline: \"\"\n }, null, 8, [\"path\"])) : createCommentVNode(\"\", true)\n ])\n ]),\n key: \"2\"\n } : void 0\n ]), 1040, [\"tag\", \"itemClasses\", \"invertedAccent\"]);\n };\n }\n});\nconst formBoxButton = \"_formBoxButton_E8Xfr\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_MaIxG\",\n formBoxButton\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcFormBoxButton = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcFormBoxButton as N\n};\n//# sourceMappingURL=NcFormBoxButton-G_PkUiQy.mjs.map\n","import { d as mdiCheck, e as mdiContentCopy } from \"./mdi-CpchYUUV.mjs\";\nimport { ref, computed, toValue } from \"vue\";\nimport { r as register, e as t22, a as t } from \"./_l10n-wdIzZwir.mjs\";\nregister(t22);\n/*!\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nconst DELAY = 2e3;\nfunction useCopy(content) {\n const isCopied = ref(false);\n const icon = computed(() => isCopied.value ? mdiCheck : mdiContentCopy);\n const altText = computed(() => isCopied.value ? t(\"Copied\") : t(\"Copy to clipboard\"));\n async function copy() {\n if (isCopied.value) {\n return;\n }\n const value = toValue(content);\n try {\n await navigator.clipboard.writeText(value);\n } catch {\n prompt(\"\", value);\n }\n isCopied.value = true;\n setTimeout(() => {\n isCopied.value = false;\n }, DELAY);\n }\n return {\n isCopied,\n copy,\n icon,\n altText\n };\n}\nexport {\n useCopy as u\n};\n//# sourceMappingURL=useCopy-6F-qWHq0.mjs.map\n","import { defineComponent, openBlock, createBlock, unref, createSlots, withCtx, createVNode, createTextVNode, toDisplayString, createElementVNode, renderSlot } from \"vue\";\nimport { whenever } from \"@vueuse/core\";\nimport { N as NcFormBoxButton } from \"./NcFormBoxButton-G_PkUiQy.mjs\";\nimport { N as NcIconSvgWrapper } from \"./NcIconSvgWrapper-g8ubWhoz.mjs\";\nimport { u as useCopy } from \"./useCopy-6F-qWHq0.mjs\";\nconst _hoisted_1 = { class: \"hidden-visually\" };\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcFormBoxCopyButton\",\n props: {\n label: { default: () => void 0 },\n value: {},\n disabled: { type: Boolean, default: false }\n },\n emits: [\"copy\"],\n setup(__props, { emit: __emit }) {\n const emit = __emit;\n const { isCopied, copy, icon, altText } = useCopy(() => __props.value);\n whenever(isCopied, () => emit(\"copy\"));\n return (_ctx, _cache) => {\n return openBlock(), createBlock(NcFormBoxButton, {\n disabled: __props.disabled,\n invertedAccent: \"\",\n onClick: unref(copy)\n }, createSlots({\n description: withCtx(() => [\n createTextVNode(toDisplayString(__props.value), 1)\n ]),\n icon: withCtx(() => [\n createVNode(NcIconSvgWrapper, {\n path: unref(icon),\n inline: \"\"\n }, null, 8, [\"path\"])\n ]),\n _: 2\n }, [\n _ctx.$slots.default || __props.label ? {\n name: \"default\",\n fn: withCtx(() => [\n createElementVNode(\"span\", _hoisted_1, toDisplayString(unref(altText)), 1),\n renderSlot(_ctx.$slots, \"default\", {}, () => [\n createTextVNode(toDisplayString(__props.label), 1)\n ])\n ]),\n key: \"0\"\n } : void 0\n ]), 1032, [\"disabled\", \"onClick\"]);\n };\n }\n});\nexport {\n _sfc_main as _\n};\n//# sourceMappingURL=NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang-BA_gWnmz.mjs.map\n","\n\n","\n\n","\n\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { showError, showSuccess } from '@nextcloud/dialogs'\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tcopied: false,\n\t\t\tcopyLoading: false,\n\t\t\tcopySuccess: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tcopyLinkIcon() {\n\t\t\tif (this.copySuccess) {\n\t\t\t\treturn 'icon-checkmark'\n\t\t\t}\n\t\t\tif (this.copyLoading) {\n\t\t\t\treturn 'icon-loading-small'\n\t\t\t}\n\t\t\treturn 'icon-public'\n\t\t},\n\t},\n\n\tmethods: {\n\t\tasync copyToClipboard(url) {\n\t\t\t// change to loading status\n\t\t\tthis.copyLoading = true\n\n\t\t\t// copy link to clipboard\n\t\t\ttry {\n\t\t\t\tawait navigator.clipboard.writeText(url)\n\t\t\t\tthis.copySuccess = true\n\t\t\t\tthis.copied = true\n\n\t\t\t\t// Notify success\n\t\t\t\tshowSuccess(t('circles', 'Link copied to the clipboard'))\n\t\t\t} catch (error) {\n\t\t\t\tthis.copySuccess = false\n\t\t\t\tthis.copied = true\n\t\t\t\tshowError(t('circles', 'Could not copy link to the clipboard.'))\n\t\t\t} finally {\n\t\t\t\tthis.copyLoading = false\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t// stop loading status regardless of outcome\n\t\t\t\t\tthis.copied = false\n\t\t\t\t\tthis.copySuccess = false\n\t\t\t\t}, 2000)\n\t\t\t}\n\t\t},\n\t},\n}\n","\n\n\n\n\n","// @ts-nocheck\n/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n/// \n\nimport { translate as t } from '@nextcloud/l10n'\nimport { ShareType } from '@nextcloud/sharing'\nimport CircleConfigCheckboxesList from '../components/CircleDetails/CircleConfigs/CircleConfigCheckboxesList.vue'\nimport CircleConfigInvitationLink from '../components/CircleDetails/CircleConfigs/CircleConfigInvitationLink.vue'\n\nexport type DefaultGroup = string\nexport type DefaultChart = string\nexport type CircleConfig = number\nexport type MemberLevel = number\nexport type MemberType = number\n\n// Global sizes\nexport const LIST_SIZE = 60\n\n// Dynamic default groups\nexport const GROUP_ALL_CONTACTS: DefaultGroup = t('circles', 'All contacts')\nexport const GROUP_NO_GROUP_CONTACTS: DefaultGroup = t('circles', 'Not grouped')\nexport const GROUP_RECENTLY_CONTACTED: DefaultGroup = t('circles', 'Recently contacted')\n\n// Organization default chart for all contacts\nexport const CHART_ALL_CONTACTS: DefaultChart = t('circles', 'Organization chart')\n\n// Circle route, see vue-router conf\nexport const ROUTE_CIRCLE = 'circle'\nexport const ROUTE_CHART = 'chart'\nexport const ROUTE_USER_GROUP = 'user_group'\n\n// Contact settings\nexport const CONTACTS_SETTINGS: DefaultGroup = t('circles', 'Contacts settings')\n\n// Default max number of items to show in the navigation\nexport const ELLIPSIS_COUNT = 5\n\n// Circles member levels\nconst MEMBER_LEVEL_NONE: MemberLevel = 0\nconst MEMBER_LEVEL_MEMBER: MemberLevel = 1\nconst MEMBER_LEVEL_MODERATOR: MemberLevel = 4\nconst MEMBER_LEVEL_ADMIN: MemberLevel = 8\nconst MEMBER_LEVEL_OWNER: MemberLevel = 9\n\n// Circles member types\n\nconst MEMBER_TYPE_SINGLEID: MemberType = 0\nconst MEMBER_TYPE_USER: MemberType = 1\nconst MEMBER_TYPE_GROUP: MemberType = 2\nconst MEMBER_TYPE_MAIL: MemberType = 4\nconst MEMBER_TYPE_CONTACT: MemberType = 8\nconst MEMBER_TYPE_CIRCLE: MemberType = 16\n\nexport const CIRCLE_DESC = t('circles', 'Create your own teams for sharing. Add Nextcloud users, contacts, or anyone via email.')\n\n// Circles config flags\n\nconst CIRCLE_CONFIG_PERSONAL: CircleConfig = 2 // Personal circle, only the owner can see it.\nconst CIRCLE_CONFIG_SYSTEM: CircleConfig = 4 // System Circle (not managed by the official front-end). Meaning some config are limited\nconst CIRCLE_CONFIG_VISIBLE: CircleConfig = 8 // Visible to everyone, if not visible, people have to know its name to be able to find it\nconst CIRCLE_CONFIG_OPEN: CircleConfig = 16 // Circle is open, people can join\nconst CIRCLE_CONFIG_INVITE: CircleConfig = 32 // Adding a member generate an invitation that needs to be accepted\nconst CIRCLE_CONFIG_REQUEST: CircleConfig = 64 // Request to join Circles needs to be confirmed by a moderator\nconst CIRCLE_CONFIG_FRIEND: CircleConfig = 128 // Members of the circle can invite their friends\nconst CIRCLE_CONFIG_PROTECTED: CircleConfig = 256 // Password protected to join/request\nconst CIRCLE_CONFIG_NO_OWNER: CircleConfig = 512 // no owner, only members\nconst CIRCLE_CONFIG_HIDDEN: CircleConfig = 1024 // hidden from listing, but available as a share entity\nconst CIRCLE_CONFIG_BACKEND: CircleConfig = 2048 // Fully hidden, only backend Circles\nconst CIRCLE_CONFIG_LOCAL: CircleConfig = 4096 // Circle is not shared to other instance in globalscale\nconst CIRCLE_CONFIG_ROOT: CircleConfig = 8192 // Circle cannot be a member of another Circle\nconst CIRCLE_CONFIG_CIRCLE_INVITE: CircleConfig = 16384 // Circle must confirm when invited in another circle\nconst CIRCLE_CONFIG_FEDERATED: CircleConfig = 32768 // Federated\n\n// Existing members types\nexport const CIRCLES_MEMBER_TYPES = {\n\t[MEMBER_TYPE_CIRCLE]: t('circles', 'Team'),\n\t[MEMBER_TYPE_USER]: t('circles', 'User'),\n\t[MEMBER_TYPE_GROUP]: t('circles', 'Group'),\n\t[MEMBER_TYPE_MAIL]: t('circles', 'Email'),\n\t[MEMBER_TYPE_CONTACT]: t('circles', 'Contact'),\n}\n\n// Available circles promote/demote levels\nexport const CIRCLES_MEMBER_LEVELS = {\n\t// [MEMBER_LEVEL_NONE]: t('circles', 'Pending'),\n\t[MEMBER_LEVEL_MEMBER]: t('circles', 'Member'),\n\t[MEMBER_LEVEL_MODERATOR]: t('circles', 'Moderator'),\n\t[MEMBER_LEVEL_ADMIN]: t('circles', 'Admin'),\n\t[MEMBER_LEVEL_OWNER]: t('circles', 'Owner'),\n}\n\n// Available circle configs in the circle details view\nexport const PUBLIC_CIRCLE_CONFIG = {\n\t[t('circles', 'Invites')]: {\n\t\tcomponent: CircleConfigCheckboxesList,\n\t\tprops: {\n\t\t\tconfigs: {\n\t\t\t\t[CIRCLE_CONFIG_OPEN]: t('circles', 'Anyone can request membership'),\n\t\t\t\t[CIRCLE_CONFIG_INVITE]: t('circles', 'Members need to accept invitation'),\n\t\t\t\t[CIRCLE_CONFIG_REQUEST]: t('circles', 'Memberships must be confirmed/accepted by a Moderator (requires \"Anyone can request membership\")'),\n\t\t\t\t[CIRCLE_CONFIG_FRIEND]: t('circles', 'Members can also invite'),\n\t\t\t},\n\t\t},\n\t},\n\n\t[t('circles', 'Invitation links')]: {\n\t\tcomponent: CircleConfigInvitationLink,\n\t\tprops: {},\n\t},\n\n\t[t('circles', 'Membership')]: {\n\t\tcomponent: CircleConfigCheckboxesList,\n\t\tprops: {\n\t\t\tconfigs: {\n\t\t\t\t// TODO: implement backend\n\t\t\t\t// [CIRCLE_CONFIG_CIRCLE_INVITE]: t('circles', 'Team must confirm when invited in another circle'),\n\t\t\t\t[CIRCLE_CONFIG_ROOT]: t('circles', 'Prevent teams from being a member of another team'),\n\t\t\t},\n\t\t},\n\t},\n\n\t[t('circles', 'Federation')]: {\n\t\tcomponent: CircleConfigCheckboxesList,\n\t\tprops: {\n\t\t\tconfigs: {\n\t\t\t\t[CIRCLE_CONFIG_FEDERATED]: t('circles', 'Allow federated members'),\n\t\t\t},\n\t\t},\n\t},\n\n\t[t('circles', 'Privacy')]: {\n\t\tcomponent: CircleConfigCheckboxesList,\n\t\tprops: {\n\t\t\tconfigs: {\n\t\t\t\t[CIRCLE_CONFIG_VISIBLE]: t('circles', 'Visible to everyone'),\n\t\t\t},\n\t\t},\n\t},\n}\n\n// Represents the picker options (label is used lower case in a list of options: Search users, groups, teams, ...)\n// labelStandalone is used as heading for the member list where we need it starting captialized\nexport const CIRCLES_MEMBER_GROUPING = [\n\t{\n\t\tid: `picker-${ShareType.User}`,\n\t\tlabel: t('circles', 'users'),\n\t\tlabelStandalone: t('circles', 'Users'),\n\t\tshare: ShareType.User,\n\t\ttype: MEMBER_TYPE_USER,\n\t},\n\t{\n\t\tid: `picker-${ShareType.Group}`,\n\t\tlabel: t('circles', 'groups'),\n\t\tlabelStandalone: t('circles', 'Groups'),\n\t\tshare: ShareType.Group,\n\t\ttype: MEMBER_TYPE_GROUP,\n\t},\n\t{\n\t\tid: `picker-${ShareType.Remote}`,\n\t\tlabel: t('circles', 'federated users'),\n\t\tlabelStandalone: t('circles', 'Federated users'),\n\t\tshare: ShareType.Remote,\n\t\ttype: MEMBER_TYPE_USER,\n\t},\n\t// {\n\t// id: `picker-${ShareType.RemoteGroup}`,\n\t// label: t('circles', 'federated groups'),\n\t// share: ShareType.RemoteGroup,\n\t// type: MEMBER_TYPE_GROUP\n\t// },\n\t{\n\t\tid: `picker-${ShareType.Team}`,\n\t\tlabel: t('circles', 'teams'),\n\t\tlabelStandalone: t('circles', 'Teams'),\n\t\tshare: ShareType.Team,\n\t\ttype: MEMBER_TYPE_CIRCLE,\n\t},\n\t{\n\t\tid: `picker-${ShareType.Email}`,\n\t\tlabel: t('circles', 'email addresses'),\n\t\tlabelStandalone: t('circles', 'Email addresses'),\n\t\tshare: ShareType.Email,\n\t\ttype: MEMBER_TYPE_MAIL,\n\t},\n\t// TODO: implement SHARE_TYPE_CONTACT\n\t{\n\t\tid: 'picker-contact',\n\t\tlabel: t('circles', 'contacts'),\n\t\tlabelStandalone: t('circles', 'Contacts'),\n\t\tshare: ShareType.Email,\n\t\ttype: MEMBER_TYPE_CONTACT,\n\t},\n]\n\n// Generating a map between share types and circle member types\nexport const SHARES_TYPES_MEMBER_MAP = CIRCLES_MEMBER_GROUPING.reduce((list, entry) => {\n\t// ! Ignore duplicate share types\n\tif (!list[entry.share]) {\n\t\tlist[entry.share] = entry.type\n\t}\n\treturn list\n}, {})\n\nexport enum MemberLevels {\n\tNONE = MEMBER_LEVEL_NONE,\n\tMEMBER = MEMBER_LEVEL_MEMBER,\n\tMODERATOR = MEMBER_LEVEL_MODERATOR,\n\tADMIN = MEMBER_LEVEL_ADMIN,\n\tOWNER = MEMBER_LEVEL_OWNER,\n}\n\nexport enum MemberTypes {\n\tCIRCLE = MEMBER_TYPE_CIRCLE,\n\tUSER = MEMBER_TYPE_USER,\n\tGROUP = MEMBER_TYPE_GROUP,\n\tMAIL = MEMBER_TYPE_MAIL,\n\tCONTACT = MEMBER_TYPE_CONTACT,\n}\n\nexport enum CircleConfigs {\n\tPERSONAL = CIRCLE_CONFIG_PERSONAL,\n\tSYSTEM = CIRCLE_CONFIG_SYSTEM,\n\tVISIBLE = CIRCLE_CONFIG_VISIBLE,\n\tOPEN = CIRCLE_CONFIG_OPEN,\n\tINVITE = CIRCLE_CONFIG_INVITE,\n\tREQUEST = CIRCLE_CONFIG_REQUEST,\n\tFRIEND = CIRCLE_CONFIG_FRIEND,\n\tPROTECTED = CIRCLE_CONFIG_PROTECTED,\n\tNO_OWNER = CIRCLE_CONFIG_NO_OWNER,\n\tHIDDEN = CIRCLE_CONFIG_HIDDEN,\n\tBACKEND = CIRCLE_CONFIG_BACKEND,\n\tLOCAL = CIRCLE_CONFIG_LOCAL,\n\tROOT = CIRCLE_CONFIG_ROOT,\n\tCIRCLE_INVITE = CIRCLE_CONFIG_CIRCLE_INVITE,\n\tFEDERATED = CIRCLE_CONFIG_FEDERATED,\n}\n\nexport enum MemberStatus {\n\tINVITED = 'Invited',\n\tMEMBER = 'Member',\n\tREQUESTING = 'Requesting',\n}\n","/**\n * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios from '@nextcloud/axios'\nimport { getCapabilities } from '@nextcloud/capabilities'\nimport { t } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { ShareType } from '@nextcloud/sharing'\nimport { CircleConfigs, SHARES_TYPES_MEMBER_MAP } from '../models/constants.ts'\nimport { logger } from '../../../logger.ts'\n\n// generate allowed shareType from SHARES_TYPES_MEMBER_MAP\nconst shareType = Object.keys(SHARES_TYPES_MEMBER_MAP)\nconst maxAutocompleteResults = parseInt(window.OC.config['sharing.maxAutocompleteResults'], 10) || 25\n\n/**\n * Get suggestions\n *\n * @param {string} search the search query\n * @param {object|null} circle - the circle object\n */\nexport async function getSuggestions(search, circle = null) {\n\tconst request = await axios.get(generateOcsUrl('apps/files_sharing/api/v1/sharees'), {\n\t\tparams: {\n\t\t\tformat: 'json',\n\t\t\titemType: 'teams',\n\t\t\tsearch,\n\t\t\tperPage: maxAutocompleteResults,\n\t\t\tshareType,\n\t\t\tlookup: false,\n\t\t},\n\t})\n\n\tconst data = request.data.ocs.data\n\tconst exact = request.data.ocs.data.exact\n\tdata.exact = [] // removing exact from general results\n\n\t// flatten array of arrays\n\tlet rawExactSuggestions = Object.values(exact).reduce((arr, elem) => arr.concat(elem), [])\n\tlet rawSuggestions = Object.values(data).reduce((arr, elem) => arr.concat(elem), [])\n\n\t// check if federation flag is enabled using bitwise AND on circle config\n\tconst isCircleFederated = circle ? (circle.config & CircleConfigs.FEDERATED) !== 0 : false\n\tif (isCircleFederated) {\n\t\t// remove results from untrusted remote servers\n\t\trawExactSuggestions = rawExactSuggestions\n\t\t\t.filter((result) => !(result.value?.shareType === ShareType.Remote && result.value?.isTrustedServer === false))\n\t\trawSuggestions = rawSuggestions\n\t\t\t.filter((result) => !(result.value?.shareType === ShareType.Remote && result.value?.isTrustedServer === false))\n\t} else {\n\t\t// remove all results from remote servers\n\t\trawExactSuggestions = rawExactSuggestions\n\t\t\t.filter((result) => result.value?.shareType !== ShareType.Remote)\n\t\trawSuggestions = rawSuggestions\n\t\t\t.filter((result) => result.value?.shareType !== ShareType.Remote)\n\t}\n\n\t// remove invalid data and format to user-select layout\n\tconst exactSuggestions = rawExactSuggestions\n\t\t.filter((result) => typeof result === 'object')\n\t\t.map((share) => formatResults(share))\n\t\t// sort by type so we can get user&groups first...\n\t\t.sort((a, b) => a.shareType - b.shareType)\n\tconst suggestions = rawSuggestions\n\t\t.filter((result) => typeof result === 'object')\n\t\t.map((share) => formatResults(share))\n\t\t// sort by type so we can get user&groups first...\n\t\t.sort((a, b) => a.shareType - b.shareType)\n\n\tconst finalResults = exactSuggestions.concat(suggestions)\n\n\tlogger.info('suggestions', { finalResults })\n\n\treturn finalResults\n}\n\n/**\n * Get the sharing recommendations\n */\nexport async function getRecommendations() {\n\tconst request = await axios.get(generateOcsUrl('apps/files_sharing/api/v1/sharees_recommended'), {\n\t\tparams: {\n\t\t\tformat: 'json',\n\t\t\titemType: 'contacts',\n\t\t\tshareType,\n\t\t},\n\t})\n\n\t// flatten array of arrays\n\tconst exact = request.data.ocs.data.exact\n\tconst recommendations = Object.values(exact).reduce((arr, elem) => arr.concat(elem), [])\n\n\t// remove invalid data and format to user-select layout\n\tconst finalResults = recommendations\n\t\t.map((share) => formatResults(share))\n\n\tlogger.info('recommendations', finalResults)\n\n\treturn finalResults\n}\n\n/**\n * Secondary line telling apart entries with the same name,\n * same rules as the files_sharing sharing input.\n *\n * @param {object} result raw sharee result\n * @return {string}\n */\nfunction getSubname(result) {\n\tswitch (result.value.shareType) {\n\t\tcase ShareType.User:\n\t\t\t// Admins can hide the email/unique name for privacy\n\t\t\treturn getCapabilities().files_sharing?.sharee?.always_show_unique === true\n\t\t\t\t? result.shareWithDisplayNameUnique ?? ''\n\t\t\t\t: ''\n\t\tcase ShareType.Email:\n\t\t\treturn result.value.shareWith\n\t\tcase ShareType.Remote:\n\t\tcase ShareType.RemoteGroup:\n\t\t\treturn result.value.server\n\t\t\t\t? t('circles', 'on {server}', { server: result.value.server })\n\t\t\t\t: ''\n\t\tdefault:\n\t\t\treturn result.shareWithDescription ?? ''\n\t}\n}\n\nfunction formatResults(result) {\n\tconst type = `picker-${result.value.shareType}`\n\treturn {\n\t\tlabel: result.label,\n\t\tid: `${type}-${result.value.shareWith}`,\n\t\t// If this is a user, set as user for avatar display by UserBubble\n\t\tuser: [ShareType.User, ShareType.Remote].indexOf(result.value.shareType) > -1\n\t\t\t? result.value.shareWith\n\t\t\t: null,\n\t\ttype,\n\t\tsubname: getSubname(result),\n\t\t...result.value,\n\t}\n}\n","/*!\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { Member, MemberCandidate, Resource, SharedResource, Team, TeamRole } from './types.ts'\n\nimport axios from '@nextcloud/axios'\nimport { FileType } from '@nextcloud/files'\nimport { defaultRootPath, getClient, getDefaultPropfind, resultToNode } from '@nextcloud/files/dav'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { logger } from '../logger.ts'\nimport { SHARES_TYPES_MEMBER_MAP } from './team-page/models/constants.ts'\nimport { getRecommendations, getSuggestions } from './team-page/services/collaborationAutocompletion.js'\n\n/** `SHARES_TYPES_MEMBER_MAP` is built dynamically, so type its shape explicitly. */\nconst shareTypeToMemberType = SHARES_TYPES_MEMBER_MAP as Record\n\n/** Minimal shape of an OCS response envelope. */\ninterface OcsResponse {\n\tocs: { data: T }\n}\n\n/** Raw member as returned by the circles API. */\ninterface RawMember {\n\tsingleId: string\n\tuserId: string | null\n\tdisplayName: string\n\tuserType?: number\n\ttype?: number\n\tlevel?: number\n}\n\n/** Raw resource as returned by the dashboard endpoint. */\ninterface RawResource {\n\tid: string | number\n\tname: string\n\ttype: string\n\ticonUrl: string\n\tfallbackIcon: string\n\turl: string\n}\n\n/** Raw circle as returned by the `/circles` endpoint. */\ninterface RawCircle {\n\tid: string\n\tname: string\n\tdisplayName: string\n\tdescription?: string\n\tpopulation?: number\n\tinitiator?: { level?: number } | null\n}\n\n/** Raw team as returned by the dashboard widget endpoint. */\ninterface RawDashboardTeam {\n\tsingleId: string\n\tmembers: RawMember[]\n\tresources: RawResource[]\n}\n\n/** Raw sharee suggestion, as returned by the files_sharing autocompletion helper. */\ninterface RawSuggestion {\n\tid: string\n\tlabel: string\n\tshareWith: string\n\tshareType: number\n\tuser?: string | null\n\tsubname: string\n}\n\n/**\n * Map a circles member level to a role.\n *\n * @param level - The circles member level (9 owner, 8 admin, 4 moderator, …)\n */\nfunction levelToRole(level: number | undefined): TeamRole {\n\tif (level === undefined) {\n\t\treturn 'member'\n\t}\n\tif (level >= 9) {\n\t\treturn 'owner'\n\t}\n\tif (level >= 8) {\n\t\treturn 'admin'\n\t}\n\tif (level >= 4) {\n\t\treturn 'moderator'\n\t}\n\treturn 'member'\n}\n\n/**\n * Map a resource from the dashboard endpoint to our type.\n *\n * @param raw - The raw resource\n */\nfunction mapResource(raw: RawResource): Resource {\n\treturn {\n\t\tid: String(raw.id),\n\t\tname: raw.name,\n\t\ttype: raw.type === 'folder' ? 'folder' : 'file',\n\t\ticonUrl: raw.iconUrl,\n\t\tfallbackIcon: raw.fallbackIcon,\n\t\turl: raw.url,\n\t}\n}\n\n/**\n * Map a preview member (from the dashboard endpoint, no level) to our type.\n *\n * @param raw - The raw member\n */\nfunction mapPreviewMember(raw: RawMember): Member {\n\treturn {\n\t\tid: raw.singleId,\n\t\tuserId: raw.userId ?? null,\n\t\tdisplayName: raw.displayName,\n\t\tisUser: raw.type === 1,\n\t\trole: 'member',\n\t}\n}\n\n/**\n * Map a full member (from the members endpoint, includes level) to our type.\n *\n * @param raw - The raw member\n */\nfunction mapFullMember(raw: RawMember): Member {\n\treturn {\n\t\tid: raw.singleId,\n\t\tuserId: raw.userId ?? null,\n\t\tdisplayName: raw.displayName,\n\t\tisUser: raw.userType === 1,\n\t\trole: levelToRole(raw.level),\n\t}\n}\n\n/**\n * Fetch all of the current user's teams, merging team metadata (name,\n * description, member count, our role) with the members preview and resources.\n */\nexport async function fetchTeams(): Promise {\n\tconst [circlesRes, dashRes] = await Promise.allSettled([\n\t\taxios.get>(generateOcsUrl('apps/circles/circles') + '?limit=-1'),\n\t\taxios.get>(generateOcsUrl('apps/circles/teams/dashboard/widget') + '?limit=200&offset=0'),\n\t])\n\n\t// The team list is required; without it we have nothing to show.\n\tif (circlesRes.status === 'rejected') {\n\t\tthrow circlesRes.reason\n\t}\n\tconst circles = (circlesRes.value.data.ocs.data ?? []).filter((circle) => circle.initiator)\n\n\t// The dashboard only enriches each team with member/resource previews, so\n\t// treat a failure there as \"no previews\" rather than failing the whole page.\n\tlet dashboard: RawDashboardTeam[] = []\n\tif (dashRes.status === 'fulfilled') {\n\t\tdashboard = dashRes.value.data.ocs.data ?? []\n\t} else {\n\t\tlogger.warn('Failed to load team dashboard previews', { error: dashRes.reason })\n\t}\n\tconst dashboardById = new Map(dashboard.map((team) => [team.singleId, team]))\n\n\treturn circles.map((circle) => {\n\t\tconst extra = dashboardById.get(circle.id)\n\t\treturn {\n\t\t\tid: circle.id,\n\t\t\tdisplayName: circle.displayName || circle.name,\n\t\t\tdescription: circle.description ?? '',\n\t\t\tmemberCount: circle.population ?? extra?.members.length ?? 0,\n\t\t\tmyRole: levelToRole(circle.initiator?.level),\n\t\t\tmembers: (extra?.members ?? []).map(mapPreviewMember),\n\t\t\tresources: (extra?.resources ?? []).map(mapResource),\n\t\t}\n\t})\n}\n\n/**\n * Fetch the full member list for a team (includes roles).\n *\n * @param teamId - The team single id\n */\nexport async function fetchTeamMembers(teamId: string): Promise {\n\tconst res = await axios.get>(generateOcsUrl('apps/circles/circles/{circleId}/members', { circleId: teamId }))\n\treturn (res.data.ocs.data ?? []).map(mapFullMember)\n}\n\n/**\n * Create a team and return its single id.\n *\n * @param name - The team name\n * @param createTeamFolder - Whether to auto-create a team space. Defaults to\n * true so existing API callers keep the previous behaviour.\n */\nexport async function createTeam(name: string, createTeamFolder = true): Promise {\n\tconst res = await axios.post>(\n\t\tgenerateOcsUrl('apps/circles/circles'),\n\t\t{ name, createTeamFolder },\n\t)\n\treturn res.data.ocs.data.id\n}\n\n/**\n * Set a team's description.\n *\n * @param teamId - The team single id\n * @param description - The new description\n */\nexport async function setTeamDescription(teamId: string, description: string): Promise {\n\tawait axios.put(\n\t\tgenerateOcsUrl('apps/circles/circles/{circleId}/description', { circleId: teamId }),\n\t\t{ value: description },\n\t)\n}\n\n/**\n * Leave a team.\n *\n * @param teamId - The team single id\n */\nexport async function leaveTeam(teamId: string): Promise {\n\tawait axios.put(\n\t\tgenerateOcsUrl('apps/circles/circles/{circleId}/leave', { circleId: teamId }),\n\t\t{},\n\t)\n}\n\n/**\n * Delete a team.\n *\n * @param teamId - The team single id\n */\nexport async function deleteTeam(teamId: string): Promise {\n\tawait axios.delete(generateOcsUrl('apps/circles/circles/{circleId}', { circleId: teamId }))\n}\n\n/**\n * The team folder linked to a team.\n */\nexport interface TeamFolder {\n\tid: number\n\tmountPoint: string\n\tquota: number | null\n}\n\n/** Team and its linked folder as exposed to administrators. */\nexport interface AdminTeamFolder {\n\tteamId: string\n\tteamName: string\n\tdefaultQuota: number | null\n\tfolder: TeamFolder | null\n}\n\n/**\n * Fetch all teams and their optionally linked team folders for the admin settings view.\n */\nexport async function getAdminTeamFolders(): Promise {\n\tconst { data } = await axios.get>(generateOcsUrl('/apps/circles/admin/teamfolders'))\n\treturn data.ocs.data\n}\n\n/**\n * Update the default quota associated with a team.\n *\n * @param teamId - The team single id\n * @param quota - Quota in bytes, zero for unlimited, or null to remove the override\n */\nexport async function updateTeamFolderDefaultQuota(teamId: string, quota: number | null): Promise<{ teamId: string, defaultQuota: number | null }> {\n\tconst { data } = await axios.put>(\n\t\tgenerateOcsUrl('/apps/circles/admin/teamfolders/{circleId}/default-quota', { circleId: teamId }),\n\t\t{ quota },\n\t)\n\treturn data.ocs.data\n}\n\n/**\n * Fetch the team folder linked to a team.\n *\n * The Circles app exposes the team-folder lifecycle through the core Teams\n * contract. The active provider is discovered server-side.\n *\n * @param teamId - The team single id\n * @return The linked team folder, or null if none exists.\n */\nexport async function getTeamFolder(teamId: string): Promise {\n\ttry {\n\t\tconst { data } = await axios.get>(generateOcsUrl('apps/circles/teams/{circleId}/folder', { circleId: teamId }))\n\t\treturn data.ocs.data\n\t} catch (error) {\n\t\tif (error && typeof error === 'object'\n\t\t\t&& 'response' in error\n\t\t\t&& (error.response as { status?: number })?.status === 404) {\n\t\t\treturn null\n\t\t}\n\t\tthrow error\n\t}\n}\n\n/**\n * Create a team folder for a team that predates the auto-create feature.\n *\n * Idempotent: if the team already owns a folder, the existing folder is\n * returned. Requires team owner privileges.\n *\n * @param teamId - The team single id\n * @param name - Optional team folder name\n * @return The created (or existing) team folder.\n */\nexport async function upgradeTeamFolder(teamId: string, name?: string): Promise {\n\tconst { data } = await axios.post>(\n\t\tgenerateOcsUrl('apps/circles/teams/{circleId}/folder', { circleId: teamId }),\n\t\t{ name },\n\t)\n\treturn data.ocs.data.folder\n}\n\n/**\n * Fetch team folders that are not yet linked to a team.\n *\n * @param teamId - The team single id\n */\nexport async function getLinkableTeamFolders(teamId: string): Promise {\n\tconst { data } = await axios.get>(generateOcsUrl('apps/circles/teams/{circleId}/folder/linkable', { circleId: teamId }))\n\treturn data.ocs.data\n}\n\n/**\n * Link a team to a team folder.\n *\n * @param teamId - The team single id\n * @param folderId - The id of the existing team folder\n */\nexport async function linkTeamFolder(teamId: string, folderId: number): Promise {\n\tconst { data } = await axios.post>(\n\t\tgenerateOcsUrl('apps/circles/teams/{circleId}/folder/link', { circleId: teamId }),\n\t\t{ folderId },\n\t)\n\treturn data.ocs.data.folder\n}\n\n/**\n * Update the storage quota of the team folder linked to a team.\n *\n * @param teamId - The team single id\n * @param quota - Quota in bytes, or zero for unlimited\n */\nexport async function updateTeamFolderQuota(teamId: string, quota: number): Promise {\n\tconst { data } = await axios.put>(\n\t\tgenerateOcsUrl('apps/circles/teams/{circleId}/folder/quota', { circleId: teamId }),\n\t\t{ quota },\n\t)\n\treturn data.ocs.data.folder\n}\n\n/**\n * Subfolder of the team folder holding the page files, inside the app's\n * own namespace of the hidden `.system` folder: the pages neither clutter\n * the files the team actually shares nor the `.system` root itself.\n */\nconst PAGES_FOLDER = '.system/teams/pages'\n\n/**\n * A team page: a markdown file stored in the team folder's hidden pages\n * subfolder, surfaced as a tab on the team.\n */\nexport interface TeamPage {\n\tfileId: number\n\t/** Page title: the file name without the .md extension. */\n\ttitle: string\n\t/** Path relative to the user's files root, as the Text editor expects. */\n\tfilePath: string\n}\n\n/**\n * List the team pages: the markdown files in the team folder's hidden\n * pages subfolder.\n *\n * @param mountPoint - The team folder mount point of the current user\n */\nexport async function fetchTeamPages(mountPoint: string): Promise {\n\tlet response\n\ttry {\n\t\tresponse = await getClient().getDirectoryContents(`${defaultRootPath}/${mountPoint}/${PAGES_FOLDER}`, {\n\t\t\tdetails: true,\n\t\t\tdata: getDefaultPropfind(),\n\t\t})\n\t} catch (error) {\n\t\t// 404 means the pages subfolder was not created yet (it appears with\n\t\t// the first page), or the team folder itself has not been physically\n\t\t// created — either way \"no pages\".\n\t\tif ((error as { status?: number })?.status === 404) {\n\t\t\treturn []\n\t\t}\n\t\tthrow error\n\t}\n\tconst data = Array.isArray(response) ? response : response.data\n\n\treturn data\n\t\t.map((entry) => resultToNode(entry, defaultRootPath))\n\t\t.filter((node) => node.type === FileType.File\n\t\t\t&& node.extension?.toLowerCase() === '.md'\n\t\t\t&& node.fileid !== undefined)\n\t\t.map((node) => ({\n\t\t\tfileId: node.fileid!,\n\t\t\ttitle: node.basename.slice(0, -node.extension!.length),\n\t\t\tfilePath: `/${mountPoint}/${PAGES_FOLDER}/${node.basename}`,\n\t\t}))\n\t\t.sort((a, b) => a.title.localeCompare(b.title))\n}\n\n/**\n * Create a team page: an empty markdown file in the team folder's hidden\n * pages subfolder, which appears with the first page.\n *\n * @param mountPoint - The team folder mount point of the current user\n * @param name - The page name (without extension)\n */\nexport async function createTeamPage(mountPoint: string, name: string): Promise {\n\tconst pagesFolder = `${defaultRootPath}/${mountPoint}/${PAGES_FOLDER}`\n\ttry {\n\t\t// Recursive: `.system` and the pages folder inside it appear with\n\t\t// the first page.\n\t\tawait getClient().createDirectory(pagesFolder, { recursive: true })\n\t} catch (error) {\n\t\t// 405: the folder appeared between the existence probe and the MKCOL.\n\t\tif ((error as { status?: number })?.status !== 405) {\n\t\t\tthrow error\n\t\t}\n\t}\n\tconst written = await getClient().putFileContents(`${pagesFolder}/${name}.md`, '', {\n\t\t// Refuse to overwrite an existing page of the same name\n\t\toverwrite: false,\n\t})\n\t// The webdav client returns false instead of throwing on the 412 an\n\t// existing page produces with overwrite disabled.\n\tif (written === false) {\n\t\tthrow Object.assign(new Error('A page with this name already exists'), { status: 412 })\n\t}\n}\n\n/**\n * Delete a team page: remove its markdown file from the team folder.\n *\n * @param page - The team page to delete\n */\nexport async function deleteTeamPage(page: TeamPage): Promise {\n\tawait getClient().deleteFile(`${defaultRootPath}${page.filePath}`)\n}\n\n/**\n * Rename a team page: move its markdown file to the new name within the\n * team folder. Refuses to overwrite an existing page of the same name.\n *\n * @param page - The team page to rename\n * @param name - The new page name (without extension)\n */\nexport async function renameTeamPage(page: TeamPage, name: string): Promise {\n\tconst directory = page.filePath.slice(0, page.filePath.lastIndexOf('/'))\n\tawait getClient().moveFile(\n\t\t`${defaultRootPath}${page.filePath}`,\n\t\t`${defaultRootPath}${directory}/${name}.md`,\n\t\t{ overwrite: false },\n\t)\n}\n\n/**\n * Fetch the team-level tab order (readable by every member).\n *\n * @param teamId - The team single id\n * @return Tab ids, first to last. Empty when no order has been saved.\n */\nexport async function fetchTabOrder(teamId: string): Promise {\n\tconst { data } = await axios.get>(generateOcsUrl('apps/circles/teams/{circleId}/tab-order', { circleId: teamId }))\n\treturn data.ocs.data.order ?? []\n}\n\n/**\n * Save the team-level tab order. Requires team admin or above.\n *\n * @param teamId - The team single id\n * @param order - Tab ids, first to last\n */\nexport async function saveTabOrder(teamId: string, order: string[]): Promise {\n\tawait axios.put(\n\t\tgenerateOcsUrl('apps/circles/teams/{circleId}/tab-order', { circleId: teamId }),\n\t\t{ order },\n\t)\n}\n\n/**\n * Fetch the resources shared to a team from the core teams resource\n * providers (Talk rooms, calendars, collectives, …).\n *\n * @param teamId - The team single id\n */\nexport async function fetchTeamResources(teamId: string): Promise {\n\tconst res = await axios.get>(generateOcsUrl('teams/{teamId}/resources', { teamId }))\n\treturn res.data.ocs.data.resources ?? []\n}\n\n/**\n * Create a collective named after a team. The collectives app links the\n * collective to the team by name, so no separate share step is needed.\n *\n * TODO: calls the collectives API directly; should eventually go through\n * a teams extension point instead of hardcoding another app's route.\n *\n * @param name - The collective name (the team's name)\n */\nexport async function createCollective(name: string): Promise {\n\tawait axios.post(\n\t\tgenerateOcsUrl('apps/collectives/api/v1.0/collectives'),\n\t\t{ name },\n\t)\n}\n\n/**\n * Create a Deck board linked to a team. The deck endpoint links the board\n * to the team itself, so no separate share step is needed.\n *\n * TODO: calls the deck API directly; should eventually go through a teams\n * extension point instead of hardcoding another app's route.\n *\n * @param teamId - The team single id\n * @param title - The board title\n */\nexport async function createDeckBoard(teamId: string, title: string): Promise {\n\tconst res = await axios.post>(\n\t\tgenerateOcsUrl('apps/deck/api/v1.0/boards/team'),\n\t\t{ title, teamId },\n\t)\n\tif (!res.data.ocs.data.id) {\n\t\tthrow new Error('The board creation response contains no board id')\n\t}\n}\n\n/** A deck board attached to the team itself, shown as a navigation entry. */\nexport interface TeamBoard {\n\tid: number\n\ttitle: string\n\t/** Absolute deep link to the board in the deck app. */\n\turl: string\n}\n\n/** The subset of deck's serialized board relevant here. */\ninterface RawDeckBoard {\n\tid: number\n\ttitle: string\n\tteamId?: string | null\n\tarchived?: boolean\n\tdeletedAt?: number\n}\n\n/**\n * Pick the deck boards attached to the team itself out of the shared deck\n * resources. The generic resource list cannot tell a team board from a\n * personally-shared one (and deck's board list omits teamId), so each\n * candidate is read individually from deck.\n *\n * TODO: calls the deck API directly; should eventually go through a teams\n * extension point instead of hardcoding another app's route.\n *\n * @param teamId - The team single id\n * @param candidates - The team's shared resources from the deck provider\n */\nexport async function fetchTeamDeckBoards(teamId: string, candidates: SharedResource[]): Promise {\n\tconst responses = await Promise.allSettled(candidates.map((resource) => axios.get>(generateOcsUrl('apps/deck/api/v1.0/board/{boardId}', { boardId: resource.id }))))\n\n\tconst boards: TeamBoard[] = []\n\tresponses.forEach((response, index) => {\n\t\tconst resource = candidates[index]\n\t\tif (response.status === 'rejected') {\n\t\t\t// The board stays reachable through the shared resources.\n\t\t\tlogger.warn('Could not read a deck board, not showing it as a tab', { resource, reason: response.reason })\n\t\t\treturn\n\t\t}\n\t\tconst board = response.value.data.ocs.data\n\t\tif (board.teamId === teamId && !board.archived && (board.deletedAt ?? 0) === 0) {\n\t\t\tboards.push({ id: board.id, title: board.title, url: resource.url })\n\t\t}\n\t})\n\n\treturn boards.sort((a, b) => a.title.localeCompare(b.title))\n}\n\n/**\n * Search for potential new members (users, groups, emails, contacts, other\n * teams…) using the same sharee autocompletion endpoint as file sharing.\n * This restores the legacy \"add members while creating a team\" feature for\n * the team creation wizard.\n *\n * @param term - The search query. An empty term returns curated recommendations.\n */\nexport async function searchMemberCandidates(term: string): Promise {\n\tconst suggestions: RawSuggestion[] = term.trim()\n\t\t? await getSuggestions(term)\n\t\t: await getRecommendations()\n\n\treturn suggestions.map((suggestion) => ({\n\t\tkey: suggestion.id,\n\t\tshareWith: suggestion.shareWith,\n\t\tshareType: suggestion.shareType,\n\t\tdisplayName: suggestion.label,\n\t\tsubname: suggestion.subname,\n\t\tisUser: suggestion.user !== null && suggestion.user !== undefined,\n\t}))\n}\n\n/**\n * Add a batch of picked candidates as members of a team, typically right\n * after creating it from the wizard.\n *\n * @param teamId - The team single id\n * @param candidates - The candidates picked in the wizard's member step\n * @return The number of candidates that were actually added.\n */\nexport async function addTeamMembers(teamId: string, candidates: MemberCandidate[]): Promise {\n\tconst members = candidates.map((candidate) => ({\n\t\tid: candidate.shareWith,\n\t\ttype: shareTypeToMemberType[candidate.shareType],\n\t}))\n\tconst res = await axios.post>>(\n\t\tgenerateOcsUrl('apps/circles/circles/{circleId}/members/multi', { circleId: teamId }),\n\t\t{ members },\n\t)\n\treturn Object.keys(res.data.ocs.data ?? {}).length\n}\n","\n\n"],"names":["_sfc_main","defineComponent","__props","style","useCssModule","provide","NC_FORM_BOX_CONTEXT_KEY","_ctx","_cache","openBlock","createElementBlock","normalizeClass","renderSlot","ncFormBox","ncFormBox_row","ncFormBox__item","ncFormBox_col","style0","cssModules","NcFormBox","_export_sfc","_hoisted_1","slots","useSlots","formBoxItemClass","useNcFormBox","descriptionId","createElementId","hasDescription","unref","isLegacy","createElementVNode","createBlock","resolveDynamicComponent","mergeProps","$event","withCtx","createTextVNode","toDisplayString","createCommentVNode","formBoxItem","formBoxItem__description","formBoxItem_legacy","formBoxItem_inverted","formBoxItem__element","formBoxItem__content","formBoxItem__icon","NcFormBoxItem","mergeModels","__emit","modelValue","useModel","emit","inputId","watch","createSlots","withDirectives","vModelCheckbox","createVNode","NcIconToggleSwitch","formBoxSwitch__input","NcFormBoxSwitch","Member","data","circle","logger","Circle","MemberTypes","level","MemberLevels","text","initiator","owner","members","member","singleId","config","CircleConfigs","invitationCode","CircleEdit","getCircles","axios","generateOcsUrl","getCircle","circleId","createCircle","name","personal","local","deleteCircle","editCircle","type","value","joinCircle","leaveCircle","getCircleMembers","search","role","limit","addMembers","deleteMember","memberId","response","changeMemberLevel","acceptMember","editCircleSetting","setting","getInvitation","joinInvitation","createInvitationLink","revokeInvitationLink","props","loading","ref","isChecked","onChange","checked","confirmEnableFederationForCircle","prevConfig","nextConfig","circleData","error","showError","t","showConfirmation","_createBlock","_unref","_openBlock","_createElementBlock","_Fragment","_renderList","label","useButtonLink","options","reactive","hasVueRouterContext","inject","routerKey","tag","computed","isLink","isHyperLink","isRouterLink","isButton","attrs","toRef","icon","mdiOpenInNew","mdiArrowTopRight","NcIconSvgWrapper","formBoxButton","NcFormBoxButton","register","t22","DELAY","useCopy","content","isCopied","mdiCheck","mdiContentCopy","altText","copy","toValue","whenever","_hoisted_3","_mergeProps","$props","_createElementVNode","CopyToClipboardMixin","url","showSuccess","Autorenew","LinkOff","LinkPlus","NcFormBoxCopyButton","getBaseUrl","generateUrl","message","action","_component_NcFormBox","$options","_createVNode","_component_NcFormBoxCopyButton","_component_NcFormBoxButton","_component_Autorenew","_component_LinkOff","_component_LinkPlus","MEMBER_LEVEL_NONE","MEMBER_LEVEL_MEMBER","MEMBER_LEVEL_MODERATOR","MEMBER_LEVEL_ADMIN","MEMBER_LEVEL_OWNER","MEMBER_TYPE_USER","MEMBER_TYPE_GROUP","MEMBER_TYPE_MAIL","MEMBER_TYPE_CONTACT","MEMBER_TYPE_CIRCLE","CIRCLE_CONFIG_PERSONAL","CIRCLE_CONFIG_SYSTEM","CIRCLE_CONFIG_VISIBLE","CIRCLE_CONFIG_OPEN","CIRCLE_CONFIG_INVITE","CIRCLE_CONFIG_REQUEST","CIRCLE_CONFIG_FRIEND","CIRCLE_CONFIG_PROTECTED","CIRCLE_CONFIG_NO_OWNER","CIRCLE_CONFIG_HIDDEN","CIRCLE_CONFIG_BACKEND","CIRCLE_CONFIG_LOCAL","CIRCLE_CONFIG_ROOT","CIRCLE_CONFIG_CIRCLE_INVITE","CIRCLE_CONFIG_FEDERATED","CIRCLES_MEMBER_LEVELS","PUBLIC_CIRCLE_CONFIG","CircleConfigCheckboxesList","CircleConfigInvitationLink","CIRCLES_MEMBER_GROUPING","ShareType","SHARES_TYPES_MEMBER_MAP","list","entry","MemberStatus","shareType","maxAutocompleteResults","getSuggestions","request","exact","rawExactSuggestions","arr","elem","rawSuggestions","result","exactSuggestions","share","formatResults","a","b","suggestions","finalResults","getRecommendations","getSubname","getCapabilities","shareTypeToMemberType","levelToRole","mapResource","raw","mapPreviewMember","mapFullMember","fetchTeams","circlesRes","dashRes","circles","dashboard","dashboardById","team","extra","fetchTeamMembers","teamId","createTeam","createTeamFolder","setTeamDescription","description","leaveTeam","deleteTeam","getAdminTeamFolders","updateTeamFolderDefaultQuota","quota","getTeamFolder","upgradeTeamFolder","getLinkableTeamFolders","linkTeamFolder","folderId","updateTeamFolderQuota","PAGES_FOLDER","fetchTeamPages","mountPoint","getClient","defaultRootPath","getDefaultPropfind","resultToNode","node","FileType","createTeamPage","pagesFolder","deleteTeamPage","page","renameTeamPage","directory","fetchTabOrder","saveTabOrder","order","fetchTeamResources","createCollective","createDeckBoard","title","fetchTeamDeckBoards","candidates","responses","resource","boards","index","board","searchMemberCandidates","term","suggestion","addTeamMembers","candidate","res"],"mappings":"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","x_google_ignoreList":[0,1,2,7,8,9,10,11,12,18]} \ No newline at end of file diff --git a/js/TrashCanOutline-CC2GsQhE.chunk.mjs.map.license b/js/TrashCanOutline-DbEqwasY.chunk.mjs.map.license similarity index 100% rename from js/TrashCanOutline-CC2GsQhE.chunk.mjs.map.license rename to js/TrashCanOutline-DbEqwasY.chunk.mjs.map.license diff --git a/js/teams-main.mjs b/js/teams-main.mjs index e565ca566..0a9dd04f6 100644 --- a/js/teams-main.mjs +++ b/js/teams-main.mjs @@ -1,4 +1,4 @@ -import{aR as Fa,d as Ue,as as ma,X as dt,at as ic,c as q,ae as nr,aS as Kd,j as v,aT as Jd,aU as ac,aC as Qi,aV as Co,D as rc,aB as Eo,b as ge,aW as So,aD as Zd,ax as Qd,ay as eh,C as Qe,n as pn,aX as th,ap as ko,o as On,aY as fi,an as $t,e as _,f as G,Z as Xn,aA as nh,p as M,v as Ve,O as Ii,y as ea,r as Ze,aZ as ih,_ as ct,V as Ne,i as J,s as ie,G as rt,K as ke,L as zt,Q as ci,R as ta,h as F,k as L,w as A,a as ze,N as Fe,a_ as ah,a$ as rh,q as xe,aQ as oh,b0 as Wn,B as sh,b1 as lh,aP as oc,a4 as ch,x as ht,ab as mn,F as ui,a9 as xo,aa as Io,P as T,H as xt,T as Xe,b2 as uh,ad as sc,u as To,z as dh,J as Jr,E as fa,b3 as hh,b4 as lc,b5 as ph,a1 as mh,b6 as fh,S as Zr,b7 as Ki,b8 as En,b9 as It,ba as xa,bb as No,bc as vh,bd as cc,be as Hn,bf as gh,bg as uc,bh as yh,bi as $n,bj as dc,bk as Ls,bl as _h,bm as bh,bn as wh,bo as Ch,bp as Eh,bq as ir,br as Sh,bs as Oo,bt as kh,bu as xh,av as Ih,bv as Th,I as na,$ as Nh,a0 as zr,a7 as Oh,bw as hc,l as ai,bx as Ah,by as pc,bz as Mh,bA as mc,bB as Lh,bC as Dh,bD as Rh,bE as Ph,bF as fc,bG as vc,bH as jh,g as zh,bI as Bh,bJ as Vh,bK as $h,bL as Uh,bM as Hh,bN as Fh,bO as Ds,bP as Xh,bQ as Wh,bR as qh,bS as Gh,bT as Yh,bU as Kh,bV as Jh,bW as Ao,bX as Zh,ag as Qh,bY as ep,U as tp}from"./_plugin-vue_export-helper-BBv7rb2Q.chunk.mjs";import{L as Sn,ae as gc,K as yc,e as kn,am as np,an as ip,ao as vi,f as Pe,H as ap,J as rp,b as xn,x as Te,N as ar,ap as _c,aq as op,ar as sp,as as Xa,F as tn,at as bc,au as Qr,y as Qt,a as We,A as lp,ah as ia,av as cp,aw as up,ag as dp,ax as hp,ay as pp,E as wc,d as Cc,D as eo,az as Rs,aA as mp,aB as fp,aC as vp,aD as Ec,aE as gp,aF as Wa,aG as Sc,C as yp,G as _p,aH as bp,aI as wp,aJ as Cp,c as Ia,R as Ep,aK as Sp,m as kc,aL as kp,aM as xp,aN as Ip,aO as Tp,aP as Np,aQ as Op,aR as Ap,aS as Mp,aT as Lp,aU as Dp,aV as Rp,aW as Pp,aX as jp,Q as Mo,u as Lo,aY as zp,aZ as Bp,P as Vp,a_ as $p,a$ as Up,b1 as Hp,b2 as Fp,b3 as Xp,b4 as Wp}from"./logger-BzLa-8Kq.chunk.mjs";import{N as qn,u as qp,a as Gp}from"./NcAvatar-1KxMUN7V-CWATy5U8.chunk.mjs";import{_ as Gn,a as Yp,d as Do,N as Kp}from"./NcPasswordField-BFyzHTOO-BWr8u7xv.chunk.mjs";import{N as In}from"./NcActionButton-BO5T5ePT-lZsea0n8.chunk.mjs";import{N as Et}from"./NcActionRouter-vYFtIOzD-BwEV1tW7.chunk.mjs";import{d as Jp,e as Zp,f as Qp,s as em,h as tm,i as nm,j as im,k as am,N as rm,m as Ps,n as om,P as sm,I as to,o as js,C as zs,p as lm,u as cm,q as um,r as dm,t as hm,v as pm,w as mm,x as fm,y as vm,z as gm,A as ym,B as _m,D as bm,E as wm,F as Cm,M as Lt,G as Si,H as Em,J as Bs,S as Vs,K as Sm,L as km,O as xm,Q as Im,R as Tm,T as Nm,U as Om,V as Br,W as Am,X as Mm,Y as Lm,Z as $s,_ as Dm,$ as Rm,a0 as ja,a1 as Pm,a2 as jm}from"./TrashCanOutline-CC2GsQhE.chunk.mjs";import{h as zm,C as Bm,g as Vm,F as Rn,f as $m,d as Um,e as Hm,r as Us,N as xc,S as Ic}from"./NcSelect--kERLlBK-CMhSEo4a.chunk.mjs";import{a as Fm,b as Xm,_ as Hs,P as Wm}from"./index-DAcIjPCZ.chunk.mjs";import"./index-ZjEp2Wt7.chunk.mjs";import"./index-C2PdqvXb.chunk.mjs";import{C as bi}from"./colors-Cv9F-jWS-KfUUs2UU.chunk.mjs";import"./NcSettingsSection-Caz1fuWt-BRuIFkG8.chunk.mjs";const tc="circles",nc="36.0.0-dev.0";function Fs(e,n){return(e.aliasOf||e)===(n.aliasOf||n)}function qm(e,n){if(Object.keys(e).length!==Object.keys(n).length)return!1;for(var i in e)if(!Gm(e[i],n[i]))return!1;return!0}function Gm(e,n){return Fa(e)?Xs(e,n):Fa(n)?Xs(n,e):(e&&e.valueOf())===(n&&n.valueOf())}function Xs(e,n){return Fa(n)?e.length===n.length&&e.every((i,a)=>i===n[a]):e.length===1&&e[0]===n}function Ws(e){const n=dt(ic),i=dt(Kd),a=q(()=>{const c=v(e.to);return n.resolve(c)}),r=q(()=>{const{matched:c}=a.value,{length:f}=c,g=c[f-1],u=i.matched;if(!g||!u.length)return-1;const y=u.findIndex(Fs.bind(null,g));if(y>-1)return y;const b=qs(c[f-2]);return f>1&&qs(g)===b&&u[u.length-1].path!==b?u.findIndex(Fs.bind(null,c[f-2])):y}),o=q(()=>r.value>-1&&Zm(i.params,a.value.params)),s=q(()=>r.value>-1&&r.value===i.matched.length-1&&qm(i.params,a.value.params));function l(c={}){if(Jm(c)){const f=n[v(e.replace)?"replace":"push"](v(e.to)).catch(Jd);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>f),f}return Promise.resolve()}return{route:a,href:q(()=>a.value.href),isActive:o,isExactActive:s,navigate:l}}function Ym(e){return e.length===1?e[0]:e}const Km=Ue({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Ws,setup(e,{slots:n}){const i=ma(Ws(e)),{options:a}=dt(ic),r=q(()=>({[Gs(e.activeClass,a.linkActiveClass,"router-link-active")]:i.isActive,[Gs(e.exactActiveClass,a.linkExactActiveClass,"router-link-exact-active")]:i.isExactActive}));return()=>{const o=n.default&&Ym(n.default(i));return e.custom?o:nr("a",{"aria-current":i.isExactActive?e.ariaCurrentValue:null,href:i.href,onClick:i.navigate,class:r.value},o)}}});function Jm(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const n=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(n))return}return e.preventDefault&&e.preventDefault(),!0}}function Zm(e,n){for(const i in n){const a=n[i],r=e[i];if(typeof a=="string"){if(a!==r)return!1}else if(!Fa(r)||r.length!==a.length||a.some((o,s)=>o.valueOf()!==r[s].valueOf()))return!1}return!0}function qs(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Gs=(e,n,i)=>e??n??i;let Tc;const rr=e=>Tc=e,Nc=Symbol();function Ys(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}function Qm(){const e=Eo(!0),n=e.run(()=>ge({}));let i=[],a=[];const r=So({install(o){rr(r),r._a=o,o.provide(Nc,r),o.config.globalProperties.$pinia=r,a.forEach(s=>i.push(s)),a=[]},use(o){return this._a?i.push(o):a.push(o),this},_p:i,_a:null,_e:e,_s:new Map,state:n});return r}const no=()=>{};function Ks(e,n,i,a=no){e.add(n);const r=()=>{e.delete(n)&&a()};return!i&&Qd()&&eh(r),r}function wi(e,...n){e.forEach(i=>{i(...n)})}const ef=e=>e(),Js=Symbol(),Vr=Symbol();function io(e,n){e instanceof Map&&n instanceof Map?n.forEach((i,a)=>e.set(a,i)):e instanceof Set&&n instanceof Set&&n.forEach(e.add,e);for(const i in n){if(!Object.hasOwn(n,i))continue;const a=n[i],r=e[i];Ys(r)&&Ys(a)&&Object.hasOwn(e,i)&&!Qi(a)&&!Co(a)?e[i]=io(r,a):e[i]=a}return e}const tf=Symbol();function nf(e){return!e||typeof e!="object"||!Object.hasOwn(e,tf)}const{assign:zn}=Object;function af(e){return!!(Qi(e)&&e.effect)}function rf(e,n,i,a){const{state:r,actions:o,getters:s}=n,l=i.state.value[e];let c;function f(){l||(i.state.value[e]=r?r():{});const g=th(i.state.value[e]);return zn(g,o,Object.keys(s||{}).reduce((u,y)=>(u[y]=So(q(()=>{rr(i);const b=i._s.get(e);return s[y].call(b,b)})),u),{}))}return c=Oc(e,f,n,i,a,!0),c}function Oc(e,n,i={},a,r,o){let s;const l=zn({actions:{}},i),c={deep:!0};let f,g,u=new Set,y=new Set,b;const S=a.state.value[e];!o&&!S&&(a.state.value[e]={});let I;function D(se){let re;f=g=!1,typeof se=="function"?(se(a.state.value[e]),re={type:"patch function",storeId:e,events:b}):(io(a.state.value[e],se),re={type:"patch object",payload:se,storeId:e,events:b});const ae=I=Symbol();pn().then(()=>{I===ae&&(f=!0)}),g=!0,wi(u,re,a.state.value[e])}const z=o?function(){const{state:se}=i,re=se?se():{};this.$patch(ae=>{zn(ae,re)})}:no;function R(){s.stop(),u.clear(),y.clear(),a._s.delete(e)}const ee=(se,re="")=>{if(Js in se)return se[Vr]=re,se;const ae=function(){rr(a);const le=Array.from(arguments),fe=new Set,ce=new Set;function we(O){fe.add(O)}function Z(O){ce.add(O)}wi(y,{args:le,name:ae[Vr],store:U,after:we,onError:Z});let H;try{H=se.apply(this&&this.$id===e?this:U,le)}catch(O){throw wi(ce,O),O}return H instanceof Promise?H.then(O=>(wi(fe,O),O)).catch(O=>(wi(ce,O),Promise.reject(O))):(wi(fe,H),H)};return ae[Js]=!0,ae[Vr]=re,ae},me={_p:a,$id:e,$onAction:Ks.bind(null,y),$patch:D,$reset:z,$subscribe(se,re={}){if(u.has(se))return no;const ae=Ks(u,se,re.detached,()=>le()),le=s.run(()=>Qe(()=>a.state.value[e],fe=>{(re.flush==="sync"?g:f)&&se({storeId:e,type:"direct",events:b},fe)},zn({},c,re)));return ae},$dispose:R},U=ma(me);a._s.set(e,U);const de=(a._a&&a._a.runWithContext||ef)(()=>a._e.run(()=>(s=Eo()).run(()=>n({action:ee}))));for(const se in de){const re=de[se];Qi(re)&&!af(re)||Co(re)?o||(S&&nf(re)&&(Qi(re)?re.value=S[se]:((re instanceof Set||re instanceof Map)&&re.clear(),io(re,S[se]))),a.state.value[e][se]=re):typeof re=="function"&&(de[se]=ee(re,se),l.actions[se]=re)}return zn(U,de),zn(ac(U),de),Object.defineProperty(U,"$state",{get:()=>a.state.value[e],set:se=>{D(re=>{zn(re,se)})}}),a._p.forEach(se=>{const re=s.run(()=>se({store:U,app:a._a,pinia:a,options:l}));zn(U,re)}),S&&o&&i.hydrate&&i.hydrate(U.$state,S),f=!0,g=!0,U}function Ac(e,n,i){let a;const r=typeof n=="function";a=r?i:n;function o(s,l){const c=Zd();return s=s||(c?dt(Nc,null):null),s&&rr(s),s=Tc,s._s.has(e)||(r?Oc(e,n,a,s):rf(e,a,s)),s._s.get(e)}return o.$id=e,o}function Mc(e){const n=ac(e),i={};for(const a in n){const r=n[a];r?.effect?i[a]=q({get:()=>e[a],set(o){e[a]=o}}):(Qi(r)||Co(r))&&(i[a]=rc(e,a))}return i}const of={__name:"splitpanes",props:{horizontal:{type:Boolean,default:!1},pushOtherPanes:{type:Boolean,default:!0},maximizePanes:{type:Boolean,default:!0},rtl:{type:Boolean,default:!1},firstSplitter:{type:Boolean,default:!1}},emits:["ready","resize","resized","pane-click","pane-maximize","pane-add","pane-remove","splitter-click","splitter-dblclick"],setup(e,{emit:n}){const i=n,a=e,r=ko(),o=ge([]),s=q(()=>o.value.reduce((k,P)=>(k[~~P.id]=P)&&k,{})),l=q(()=>o.value.length),c=ge(null),f=ge(!1),g=ge({mouseDown:!1,dragging:!1,activeSplitter:null,cursorOffset:0}),u=ge({splitter:null,timeoutId:null}),y=q(()=>({[`splitpanes splitpanes--${a.horizontal?"horizontal":"vertical"}`]:!0,"splitpanes--dragging":g.value.dragging})),b=()=>{document.addEventListener("mousemove",D,{passive:!1}),document.addEventListener("mouseup",z),"ontouchstart"in window&&(document.addEventListener("touchmove",D,{passive:!1}),document.addEventListener("touchend",z))},S=()=>{document.removeEventListener("mousemove",D,{passive:!1}),document.removeEventListener("mouseup",z),"ontouchstart"in window&&(document.removeEventListener("touchmove",D,{passive:!1}),document.removeEventListener("touchend",z))},I=(k,P)=>{const j=k.target.closest(".splitpanes__splitter");if(j){const{left:B,top:Y}=j.getBoundingClientRect(),{clientX:be,clientY:ye}="ontouchstart"in window&&k.touches?k.touches[0]:k;g.value.cursorOffset=a.horizontal?ye-Y:be-B}b(),g.value.mouseDown=!0,g.value.activeSplitter=P},D=k=>{g.value.mouseDown&&(k.preventDefault(),g.value.dragging=!0,requestAnimationFrame(()=>{se(U(k)),Ae("resize",{event:k},!0)}))},z=k=>{g.value.dragging&&(window.getSelection().removeAllRanges(),Ae("resized",{event:k},!0)),g.value.mouseDown=!1,g.value.activeSplitter=null,setTimeout(()=>{g.value.dragging=!1,S()},100)},R=(k,P)=>{"ontouchstart"in window&&(k.preventDefault(),u.value.splitter===P?(clearTimeout(u.value.timeoutId),u.value.timeoutId=null,ee(k,P),u.value.splitter=null):(u.value.splitter=P,u.value.timeoutId=setTimeout(()=>u.value.splitter=null,500))),g.value.dragging||Ae("splitter-click",{event:k,index:P},!0)},ee=(k,P)=>{if(Ae("splitter-dblclick",{event:k,index:P},!0),a.maximizePanes){let j=0;o.value=o.value.map((B,Y)=>(B.size=Y===P?B.max:B.min,Y!==P&&(j+=B.min),B)),o.value[P].size-=j,Ae("pane-maximize",{event:k,index:P,pane:o.value[P]}),Ae("resized",{event:k,index:P},!0)}},me=(k,P)=>{Ae("pane-click",{event:k,index:s.value[P].index,pane:s.value[P]})},U=k=>{const P=c.value.getBoundingClientRect(),{clientX:j,clientY:B}="ontouchstart"in window&&k.touches?k.touches[0]:k;return{x:j-(a.horizontal?0:g.value.cursorOffset)-P.left,y:B-(a.horizontal?g.value.cursorOffset:0)-P.top}},de=k=>{k=k[a.horizontal?"y":"x"];const P=c.value[a.horizontal?"clientHeight":"clientWidth"];return a.rtl&&!a.horizontal&&(k=P-k),k*100/P},se=k=>{const P=g.value.activeSplitter;let j={prevPanesSize:ae(P),nextPanesSize:le(P),prevReachedMinPanes:0,nextReachedMinPanes:0};const B=0+(a.pushOtherPanes?0:j.prevPanesSize),Y=100-(a.pushOtherPanes?0:j.nextPanesSize),be=Math.max(Math.min(de(k),Y),B);let ye=[P,P+1],Ee=o.value[ye[0]]||null,Be=o.value[ye[1]]||null;const _e=Ee.max<100&&be>=Ee.max+j.prevPanesSize,ue=Be.max<100&&be<=100-(Be.max+le(P+1));if(_e||ue){_e?(Ee.size=Ee.max,Be.size=Math.max(100-Ee.max-j.prevPanesSize-j.nextPanesSize,0)):(Ee.size=Math.max(100-Be.max-j.prevPanesSize-le(P+1),0),Be.size=Be.max);return}if(a.pushOtherPanes){const Se=re(j,be);if(!Se)return;({sums:j,panesToResize:ye}=Se),Ee=o.value[ye[0]]||null,Be=o.value[ye[1]]||null}Ee!==null&&(Ee.size=Math.min(Math.max(be-j.prevPanesSize-j.prevReachedMinPanes,Ee.min),Ee.max)),Be!==null&&(Be.size=Math.min(Math.max(100-be-j.nextPanesSize-j.nextReachedMinPanes,Be.min),Be.max))},re=(k,P)=>{const j=g.value.activeSplitter,B=[j,j+1];return P{be>B[0]&&be<=j&&(Y.size=Y.min,k.prevReachedMinPanes+=Y.min)}),k.prevPanesSize=ae(B[0]),B[0]===void 0)?(k.prevReachedMinPanes=0,o.value[0].size=o.value[0].min,o.value.forEach((Y,be)=>{be>0&&be<=j&&(Y.size=Y.min,k.prevReachedMinPanes+=Y.min)}),o.value[B[1]].size=100-k.prevReachedMinPanes-o.value[0].min-k.prevPanesSize-k.nextPanesSize,null):P>100-k.nextPanesSize-o.value[B[1]].min&&(B[1]=ce(j).index,k.nextReachedMinPanes=0,B[1]>j+1&&o.value.forEach((Y,be)=>{be>j&&be{be=j+1&&(Y.size=Y.min,k.nextReachedMinPanes+=Y.min)}),o.value[B[0]].size=100-k.prevPanesSize-le(B[0]-1),null):{sums:k,panesToResize:B}},ae=k=>o.value.reduce((P,j,B)=>P+(Bo.value.reduce((P,j,B)=>P+(B>k+1?j.size:0),0),fe=k=>[...o.value].reverse().find(P=>P.indexP.min)||{},ce=k=>o.value.find(P=>P.index>k+1&&P.size>P.min)||{},we=()=>{var k;const P=Array.from(((k=c.value)==null?void 0:k.children)||[]);for(const j of P){const B=j.classList.contains("splitpanes__pane"),Y=j.classList.contains("splitpanes__splitter");!B&&!Y&&(j.remove(),console.warn("Splitpanes: Only elements are allowed at the root of . One of your DOM nodes was removed."))}},Z=(k,P,j=!1)=>{const B=k-1,Y=document.createElement("div");Y.classList.add("splitpanes__splitter"),j||(Y.onmousedown=be=>I(be,B),typeof window<"u"&&"ontouchstart"in window&&(Y.ontouchstart=be=>I(be,B)),Y.onclick=be=>R(be,B+1)),Y.ondblclick=be=>ee(be,B+1),P.parentNode.insertBefore(Y,P)},H=k=>{k.onmousedown=void 0,k.onclick=void 0,k.ondblclick=void 0,k.remove()},O=()=>{var k;const P=Array.from(((k=c.value)==null?void 0:k.children)||[]);for(const B of P)B.className.includes("splitpanes__splitter")&&H(B);let j=0;for(const B of P)B.className.includes("splitpanes__pane")&&(!j&&a.firstSplitter?Z(j,B,!0):j&&Z(j,B),j++)},Q=({uid:k,...P})=>{const j=s.value[k];for(const[B,Y]of Object.entries(P))j[B]=Y},Ce=k=>{var P;let j=-1;Array.from(((P=c.value)==null?void 0:P.children)||[]).some(B=>(B.className.includes("splitpanes__pane")&&j++,B.isSameNode(k.el))),o.value.splice(j,0,{...k,index:j}),o.value.forEach((B,Y)=>B.index=Y),f.value&&pn(()=>{O(),De({addedPane:o.value[j]}),Ae("pane-add",{pane:o.value[j]})})},Ie=k=>{const P=o.value.findIndex(B=>B.id===k);o.value[P].el=null;const j=o.value.splice(P,1)[0];o.value.forEach((B,Y)=>B.index=Y),pn(()=>{O(),Ae("pane-remove",{pane:j}),De({removedPane:{...j}})})},De=(k={})=>{!k.addedPane&&!k.removedPane?it():o.value.some(P=>P.givenSize!==null||P.min||P.max<100)?Me(k):Ge(),f.value&&Ae("resized")},Ge=()=>{const k=100/l.value;let P=0;const j=[],B=[];for(const Y of o.value)Y.size=Math.max(Math.min(k,Y.max),Y.min),P-=Y.size,Y.size>=Y.max&&j.push(Y.id),Y.size<=Y.min&&B.push(Y.id);P>.1&&Le(P,j,B)},it=()=>{let k=100;const P=[],j=[];let B=0;for(const be of o.value)k-=be.size,be.givenSize!==null&&B++,be.size>=be.max&&P.push(be.id),be.size<=be.min&&j.push(be.id);let Y=100;if(k>.1){for(const be of o.value)be.givenSize===null&&(be.size=Math.max(Math.min(k/(l.value-B),be.max),be.min)),Y-=be.size;Y>.1&&Le(Y,P,j)}},Me=({addedPane:k,removedPane:P}={})=>{let j=100/l.value,B=0;const Y=[],be=[];(k?.givenSize??null)!==null&&(j=(100-k.givenSize)/(l.value-1));for(const ye of o.value)B-=ye.size,ye.size>=ye.max&&Y.push(ye.id),ye.size<=ye.min&&be.push(ye.id);if(!(Math.abs(B)<.1)){for(const ye of o.value)k?.givenSize!==null&&k?.id===ye.id||(ye.size=Math.max(Math.min(j,ye.max),ye.min)),B-=ye.size,ye.size>=ye.max&&Y.push(ye.id),ye.size<=ye.min&&be.push(ye.id);B>.1&&Le(B,Y,be)}},Le=(k,P,j)=>{let B;k>0?B=k/(l.value-P.length):B=k/(l.value-j.length),o.value.forEach((Y,be)=>{if(k>0&&!P.includes(Y.id)){const ye=Math.max(Math.min(Y.size+B,Y.max),Y.min),Ee=ye-Y.size;k-=Ee,Y.size=ye}else if(!j.includes(Y.id)){const ye=Math.max(Math.min(Y.size+B,Y.max),Y.min),Ee=ye-Y.size;k-=Ee,Y.size=ye}}),Math.abs(k)>.1&&pn(()=>{f.value&&console.warn("Splitpanes: Could not resize panes correctly due to their constraints.")})},Ae=(k,P=void 0,j=!1)=>{const B=P?.index??g.value.activeSplitter??null;i(k,{...P,...B!==null&&{index:B},...j&&B!==null&&{prevPane:o.value[B-(a.firstSplitter?1:0)],nextPane:o.value[B+(a.firstSplitter?0:1)]},panes:o.value.map(Y=>({min:Y.min,max:Y.max,size:Y.size}))})};Qe(()=>a.firstSplitter,()=>O()),On(()=>{we(),O(),De(),Ae("ready"),f.value=!0}),fi(()=>f.value=!1);const st=()=>{var k;return nr("div",{ref:c,class:y.value},(k=r.default)==null?void 0:k.call(r))};return $t("panes",o),$t("indexedPanes",s),$t("horizontal",q(()=>a.horizontal)),$t("requestUpdate",Q),$t("onPaneAdd",Ce),$t("onPaneRemove",Ie),$t("onPaneClick",me),(k,P)=>(_(),G(Xn(st)))}},sf={__name:"pane",props:{size:{type:[Number,String]},minSize:{type:[Number,String],default:0},maxSize:{type:[Number,String],default:100}},setup(e){var n;const i=e,a=dt("requestUpdate"),r=dt("onPaneAdd"),o=dt("horizontal"),s=dt("onPaneRemove"),l=dt("onPaneClick"),c=(n=nh())==null?void 0:n.uid,f=dt("indexedPanes"),g=q(()=>f.value[c]),u=ge(null),y=q(()=>{const D=isNaN(i.size)||i.size===void 0?0:parseFloat(i.size);return Math.max(Math.min(D,S.value),b.value)}),b=q(()=>{const D=parseFloat(i.minSize);return isNaN(D)?0:D}),S=q(()=>{const D=parseFloat(i.maxSize);return isNaN(D)?100:D}),I=q(()=>{var D;return`${o.value?"height":"width"}: ${(D=g.value)==null?void 0:D.size}%`});return Qe(()=>y.value,D=>a({uid:c,size:D})),Qe(()=>b.value,D=>a({uid:c,min:D})),Qe(()=>S.value,D=>a({uid:c,max:D})),On(()=>{r({id:c,el:u.value,min:b.value,max:S.value,givenSize:i.size===void 0?null:y.value,size:y.value})}),fi(()=>s(c)),(D,z)=>(_(),M("div",{ref_key:"paneEl",ref:u,class:"splitpanes__pane",onClick:z[0]||(z[0]=R=>v(l)(R,D._.uid)),style:Ii(I.value)},[Ve(D.$slots,"default")],4))}};function lf(e){let n=!1,i;return(...a)=>(n||(n=!0,i=e(...a)),i)}let Lc="missing-app-name";try{Lc=tc}catch{Sn.error("The `@nextcloud/vue` library was used without setting / replacing the `appName`.")}const cf=Lc;let Dc="";try{Dc=nc}catch{Sn.error("The `@nextcloud/vue` library was used without setting / replacing the `appVersion`.")}const uf=Dc;function Rc(){return dt("appName",cf)}const Pc=lf(()=>{const e=ea("core","apps",[]),n=Rc();return e.find(({id:i})=>i===n)?.name??n});Ze(ih);const df=Ue({__name:"NcAppContentDetailsToggle",setup(e){const n=vi();Qe(n,i),On(()=>{i(n.value)}),fi(()=>{n.value&&i(!1)});function i(a=!0){const r=document.querySelector(".app-navigation .app-navigation-toggle");r&&(r.style.display=a?"none":"",a===!0&&kn("toggle-navigation",{open:!1}))}return(a,r)=>(_(),G(v(Fe),{"aria-label":v(ze)("Go back to the list"),class:ke(["app-details-toggle",{"app-details-toggle--mobile":v(n)}]),title:v(ze)("Go back to the list"),variant:"tertiary"},{icon:A(()=>[L(v(Pe),{directional:"",path:v(ap)},null,8,["path"])]),_:1},8,["aria-label","class","title"]))}}),hf=ct(df,[["__scopeId","data-v-a28923a1"]]),Zs=gc("nextcloud").persist().build(),pf=yc().theming?.name??"Nextcloud",mf={name:"NcAppContent",components:{NcAppContentDetailsToggle:hf,Pane:sf,Splitpanes:of},props:{disableSwipe:{type:Boolean,default:!1},listSize:{type:Number,default:20},listMinWidth:{type:Number,default:15},listMaxWidth:{type:Number,default:40},paneConfigKey:{type:String,default:""},showDetails:{type:Boolean,default:!0},layout:{type:String,default:"vertical-split",validator(e){return["no-split","vertical-split","horizontal-split"].includes(e)}},pageHeading:{type:String,default:null},pageTitle:{type:String,default:null}},emits:["update:showDetails","resizeList"],setup(){return{appName:Rc(),localizedAppName:Pc(),isMobile:vi(),isRtl:ip}},data(){return{contentHeight:0,swiping:{},listPaneSize:this.restorePaneConfig()}},computed:{paneConfigID(){if(this.paneConfigKey!=="")return`pane-list-size-${this.paneConfigKey}`;try{return`pane-list-size-${this.appName}`}catch{return Sn.info("[NcAppContent]: falling back to global nextcloud pane config"),"pane-list-size-nextcloud"}},detailsPaneSize(){return this.listPaneSize?100-this.listPaneSize:this.paneDefaults.details.size},paneDefaults(){return{list:{size:this.listSize,min:this.listMinWidth,max:this.listMaxWidth},details:{size:100-this.listSize,min:100-this.listMaxWidth,max:100-this.listMinWidth}}},realPageTitle(){const e=new Set;if(this.pageTitle)for(const n of this.pageTitle.split(" - "))e.add(n);else if(this.pageHeading){for(const n of this.pageHeading.split(" - "))e.add(n);e.size>0&&e.add(this.localizedAppName)}else return null;return e.add(pf),[...e.values()].join(" - ")}},watch:{realPageTitle:{immediate:!0,handler(){this.realPageTitle!==null&&(document.title=this.realPageTitle)}},paneConfigKey:{immediate:!0,handler(){this.restorePaneConfig()}}},mounted(){this.disableSwipe||(this.swiping=np(this.$el,{onSwipeEnd:this.handleSwipe})),this.restorePaneConfig()},methods:{handleSwipe(e,n){Math.abs(this.swiping.lengthX)>70&&(this.swiping.coordsStart.x<300/2&&n==="right"?kn("toggle-navigation",{open:!0}):this.swiping.coordsStart.x<300*1.5&&n==="left"&&kn("toggle-navigation",{open:!1}))},handlePaneResize(e){const n=parseInt(e.panes[0].size,10);Zs.setItem(this.paneConfigID,JSON.stringify(n)),this.listPaneSize=n,this.$emit("resizeList",{size:n}),Sn.debug("[NcAppContent] pane config",{listPaneSize:n})},restorePaneConfig(){const e=parseInt(Zs.getItem(this.paneConfigID),10);if(!isNaN(e)&&e!==this.listPaneSize)return Sn.debug("[NcAppContent] pane config",{listPaneSize:e}),this.listPaneSize=e,e},hideDetails(){this.$emit("update:showDetails",!1)}}},ff={key:0,class:"hidden-visually"},vf={class:"app-content-wrapper__list"},gf={key:1,class:"app-content-wrapper"};function yf(e,n,i,a,r,o){const s=Ne("NcAppContentDetailsToggle"),l=Ne("Pane"),c=Ne("Splitpanes");return _(),M("main",{id:"app-content-vue",class:ke(["app-content no-snapper",{"app-content--has-list":!!e.$slots.list}])},[i.pageHeading?(_(),M("h1",ff,J(i.pageHeading),1)):ie("",!0),e.$slots.list?(_(),M(rt,{key:1},[a.isMobile||i.layout==="no-split"?(_(),M("div",{key:0,class:ke(["app-content-wrapper app-content-wrapper--no-split",{"app-content-wrapper--show-details":i.showDetails,"app-content-wrapper--show-list":!i.showDetails,"app-content-wrapper--mobile":a.isMobile}])},[i.showDetails?(_(),G(s,{key:0,onClick:zt(o.hideDetails,["stop","prevent"])},null,8,["onClick"])):ie("",!0),ci(F("div",vf,[Ve(e.$slots,"list",{},void 0,!0)],512),[[ta,!i.showDetails]]),i.showDetails?Ve(e.$slots,"default",{key:1},void 0,!0):ie("",!0)],2)):i.layout==="vertical-split"||i.layout==="horizontal-split"?(_(),M("div",gf,[L(c,{horizontal:i.layout==="horizontal-split",class:ke(["default-theme",{"splitpanes--horizontal":i.layout==="horizontal-split","splitpanes--vertical":i.layout==="vertical-split"}]),rtl:a.isRtl,onResized:o.handlePaneResize},{default:A(()=>[L(l,{class:"splitpanes__pane-list",size:r.listPaneSize||o.paneDefaults.list.size,minSize:o.paneDefaults.list.min,maxSize:o.paneDefaults.list.max},{default:A(()=>[Ve(e.$slots,"list",{},void 0,!0)]),_:3},8,["size","minSize","maxSize"]),L(l,{class:"splitpanes__pane-details",size:o.detailsPaneSize,minSize:o.paneDefaults.details.min,maxSize:o.paneDefaults.details.max},{default:A(()=>[Ve(e.$slots,"default",{},void 0,!0)]),_:3},8,["size","minSize","maxSize"])]),_:3},8,["horizontal","class","rtl","onResized"])])):ie("",!0)],64)):ie("",!0),e.$slots.list?ie("",!0):Ve(e.$slots,"default",{key:2},void 0,!0)],2)}const _f=ct(mf,[["render",yf],["__scopeId","data-v-51427d61"]]),jc=Symbol.for("NcContent:setHasAppNavigation"),bf=Symbol.for("NcContent:selector");Ze(ah);const wf=` diff --git a/js/teams-settings-team-folders.mjs b/js/teams-settings-team-folders.mjs index 659834133..1025c1283 100644 --- a/js/teams-settings-team-folders.mjs +++ b/js/teams-settings-team-folders.mjs @@ -1,2 +1,2 @@ -import{d as De,P as a,y as fe,b as i,c as M,o as $e,e as m,p as _,h as s,i as u,j as t,K as ve,Q as pe,R as be,k as n,w as c,s as y,N as F,q as p,G as _e,H as ge,f as R,S as ae,T as Pe,U as xe}from"./_plugin-vue_export-helper-BBv7rb2Q.chunk.mjs";import{b as ye,N as Fe,a as f,x as h,c as le,y as K,D as Oe}from"./logger-BzLa-8Kq.chunk.mjs";import{f as H,N as O,p as B}from"./NcSelect--kERLlBK-CMhSEo4a.chunk.mjs";import{c as Be}from"./modulepreload-polyfill-BDZ74nf0.chunk.mjs";import{N as te}from"./NcActionButton-BO5T5ePT-lZsea0n8.chunk.mjs";import{a as he,_ as Ge}from"./NcPasswordField-BFyzHTOO-BWr8u7xv.chunk.mjs";import{N as Ee}from"./NcSettingsSection-Caz1fuWt-BRuIFkG8.chunk.mjs";import{I as je,g as Le,a as Me,u as Re,l as Ke,d as He,b as ze,c as Je}from"./TrashCanOutline-CC2GsQhE.chunk.mjs";const We={class:"team-folders__settings"},Xe={class:"team-folders__title"},Ye={class:"team-folders__description"},Ze=["aria-label"],ea=["aria-selected","tabindex"],aa=["aria-selected","tabindex"],la={key:0,class:"team-folders__warning"},ta={class:"team-folders__input-row"},oa={class:"team-folders__hint"},ra={class:"team-folders__hint team-folders__hint--quota-overrides"},sa={class:"team-folders__add-row"},ua=["aria-label"],da={class:"team-folders__header",role:"row"},ia={role:"columnheader"},na={role:"columnheader"},ca={role:"columnheader"},ma={role:"columnheader"},fa={class:"team-folders__team",role:"cell"},va={role:"cell"},pa={class:"team-folders__options",role:"cell"},ba={class:"team-folders__quota-save"},_a={id:"team-folder-folders-panel",role:"tabpanel","aria-labelledby":"team-folder-folders-tab",class:"team-folders__list"},ga={class:"team-folders__list-title"},ya={key:0,class:"team-folders__hint"},ha={key:1,class:"team-folders__scroll"},qa={class:"team-folders__table"},wa={key:0},ka={class:"team-folders__mountpoint"},Ca={key:0},Ua={class:"team-folders__quota"},Ia={class:"hidden-visually"},Va={key:0,class:"team-folders__empty"},Ta={colspan:"4"},Na={class:"team-folders__mountpoint"},Qa={class:"team-folders__quota"},Sa={class:"team-folders__remove"},Aa={class:"team-folders__warning"},Da={class:"team-folders__dialog-options"},$a=De({__name:"AdminTeamFolders",setup(Fa){const q={id:"0",label:a("circles","Unlimited")},qe=[{id:"1 GB",label:"1 GB"},{id:"5 GB",label:"5 GB"},{id:"10 GB",label:"10 GB"}],G=Number(fe("circles","teamFolderDefaultQuota",0)),we=!!fe("circles","teamFolderProvisioningEnabled",!0),w=i(G<=0?q:{id:H(G),label:H(G)}),k=i([]),z=i({}),C=i([]),ke=i({}),J=i([]),I=i(null),W=i(!0),V=i(!1),T=["teamFolders","defaultQuotas"],v=i("teamFolders"),X=M(()=>{const e=[q,...qe];for(const o of[w.value,...k.value.map(l=>l.quota),...C.value.map(l=>l.quota)])e.some(l=>l.id===o.id)||e.push(o);return e}),N=i([]),Q=i({}),oe=i(new Set),Y=i(new Set),x=i(!0),S=i("teamName"),A=i(!0),U=i(null),D=i(""),g=i(!1),b=i("create"),Z=i([]),$=i(null),E=i(!1),Ce=M(()=>{const e=new Set([...k.value,...C.value].map(r=>`${r.type}:${r.id}`)),o=N.value.map(r=>({id:r.teamId,label:r.teamName,selectionLabel:`${r.teamName} (${a("circles","Team")})`,type:"team",quota:w.value})).filter(r=>!e.has(`${r.type}:${r.id}`)),l=J.value.map(r=>({...r,selectionLabel:`${r.label} (${a("circles","Group")})`,type:"group",quota:w.value})).filter(r=>!e.has(`${r.type}:${r.id}`));return[...o,...l].sort((r,d)=>r.label.localeCompare(d.label))}),Ue=M(()=>[...k.value,...C.value].sort((e,o)=>e.label.localeCompare(o.label))),re=M(()=>{const e=A.value?1:-1;return[...N.value].sort((o,l)=>{const r=se(o,S.value),d=se(l,S.value);return rd?e:0})});function se(e,o){switch(o){case"teamName":return e.teamName;case"mountPoint":return e.folder?.mountPoint??""}}function Ie(e){return e.folder?.mountPoint??""}function ue(e){S.value===e?A.value=!A.value:(S.value=e,A.value=!0)}async function j(){x.value=!0;try{N.value=await Le(),z.value=Object.fromEntries(N.value.filter(e=>e.defaultQuota!==null).map(e=>[e.teamId,e.defaultQuota])),k.value=N.value.filter(e=>e.defaultQuota!==null).map(e=>({id:e.teamId,label:e.teamName,type:"team",quota:L(e.defaultQuota)})).sort((e,o)=>e.label.localeCompare(o.label)),Q.value=Object.fromEntries(N.value.map(e=>[e.teamId,L(e.folder?.quota??G)])),oe.value=new Set}catch(e){f(a("circles","Unable to load team folders")),h.error("Unable to load team folders",{error:e})}finally{x.value=!1}}async function de(){W.value=!0;try{const[e,o]=await Promise.all([le.get(ae("/apps/circles/settings/groups")),le.get(ae("/apps/circles/settings"))]);J.value=e.data.ocs.data;const l=o.data.ocs.data.team_folder_group_quotas??{};ke.value=l;const r=new Map(J.value.map(d=>[d.id,d]));C.value=Object.entries(l).map(([d,P])=>({id:d,label:r.get(d)?.label??d,type:"group",quota:L(P)})).sort((d,P)=>d.label.localeCompare(P.label))}catch(e){f(a("circles","Unable to load group quotas")),h.error("Unable to load group quotas",{error:e})}finally{W.value=!1}}async function Ve(e){U.value=e,D.value=e.teamName,b.value="create",$.value=null,E.value=!0;try{Z.value=await Me(e.teamId)}catch(o){Z.value=[],f(a("circles","Unable to load available team folders")),h.error("Unable to load available team folders",{error:o,teamId:e.teamId})}finally{E.value=!1}}function ie(){g.value||(U.value=null)}async function Te(){if(U.value===null||b.value==="create"&&D.value.trim()===""||b.value==="existing"&&$.value===null)return;const e=U.value.teamId,o=$.value?.id;g.value=!0;try{b.value==="create"?await Re(e,D.value.trim()):o!==void 0&&await Ke(e,o),K(a("circles","Team folder added")),U.value=null,await j()}catch(l){f(a("circles","Unable to add team folder")),h.error("Unable to add team folder",{error:l,teamId:e})}finally{g.value=!1}}async function Ne(e){if(await Oe({name:a("circles","Delete team"),text:a("circles","Are you sure you want to delete {team}? This cannot be undone.",{team:e.teamName}),labelConfirm:a("circles","Delete team"),labelReject:a("circles","Cancel"),severity:"error"}))try{await He(e.teamId),K(a("circles","Team deleted")),await j()}catch(o){f(a("circles","Unable to delete the team")),h.error("Unable to delete team",{error:o,teamId:e.teamId})}}function ee(e){const o=B(e,!0);if(o!==null&&o>=0){const l=H(o);return{id:l,label:l}}return q}function L(e){if(e<=0)return q;const o=H(e);return{id:o,label:o}}async function Qe(e,o){const l=Q.value[e.teamId],r=o.id===q.id?0:B(o.id,!0);if(r===null||r<0){f(a("circles","Quota must be a non-negative number."));return}oe.value.add(e.teamId),Q.value[e.teamId]=o,Y.value.add(e.teamId);try{const d=await ze(e.teamId,Math.round(r));Q.value[e.teamId]=L(d.quota??r),K(a("circles","Changed team folder quota"))}catch(d){Q.value[e.teamId]=l,f(a("circles","Unable to update team folder quota")),h.error("Unable to update team folder quota",{error:d,teamId:e.teamId})}finally{Y.value.delete(e.teamId)}}async function ne(e,o){try{await Be();const l=ae("/apps/circles/settings/{key}",{appId:"circles",key:e}),{data:r}=await le.post(l,{value:o});if(r.ocs.meta.status!=="ok"){if(r.ocs.meta.message)return f(a("circles","Unable to update team folder config")),h.error("Error while updating team folder config",{error:r.ocs}),!1;throw new Error(`${r.ocs.meta.statuscode}`)}return!0}catch(l){return f(a("circles","Unable to update team folder config")),h.error("Error while updating team folder config",{error:l}),!1}}async function ce(){const e=w.value.id===q.id?0:B(w.value.id,!0);if(e===null||e<0){f(a("circles","Quota must be a non-negative number."));return}const o={};for(const r of k.value){const d=r.quota.id===q.id?0:B(r.quota.id,!0);if(d===null||d<0){f(a("circles","Quota must be a non-negative number."));return}o[r.id]=Math.round(d)}const l={};for(const r of C.value){const d=r.quota.id===q.id?0:B(r.quota.id,!0);if(d===null||d<0){f(a("circles","Quota must be a non-negative number."));return}l[r.id]=Math.round(d)}V.value=!0;try{if(!await ne("team_folder_default_quota",String(Math.round(e)))||!await ne("team_folder_group_quotas",JSON.stringify(l)))return;const r=new Set([...Object.keys(z.value),...Object.keys(o)]);await Promise.all([...r].map(async d=>{const P=o[d]??null;(z.value[d]??null)!==P&&await Je(d,P)})),K(a("circles","Changed default team folder quotas")),await Promise.all([j(),de()])}catch(r){f(a("circles","Unable to update team folder config")),h.error("Unable to update team quota settings",{error:r})}finally{V.value=!1}}function Se(){if(I.value===null)return;const e={...I.value,quota:w.value};e.type==="team"?k.value.push(e):C.value.push(e),I.value=null}function Ae(e){e.type==="team"?k.value=k.value.filter(o=>o.id!==e.id):C.value=C.value.filter(o=>o.id!==e.id)}function me(e){const o=T.indexOf(v.value);let l;switch(e.key){case"ArrowLeft":l=(o-1+T.length)%T.length;break;case"ArrowRight":l=(o+1)%T.length;break;case"Home":l=0;break;case"End":l=T.length-1;break;default:return}e.preventDefault(),v.value=T[l],e.currentTarget.parentElement?.querySelectorAll('[role="tab"]')?.[l]?.focus()}return $e(()=>Promise.all([j(),de()])),(e,o)=>(m(),_("section",We,[s("h2",Xe,u(t(a)("circles","Teams")),1),s("p",Ye,u(t(a)("circles","Configure default storage quotas and manage team folders.")),1),s("div",{class:"team-folders__tabs",role:"tablist","aria-label":t(a)("circles","Team folder settings")},[s("button",{id:"team-folder-folders-tab",type:"button",role:"tab","aria-selected":v.value==="teamFolders","aria-controls":"team-folder-folders-panel",tabindex:v.value==="teamFolders"?0:-1,class:ve([{"team-folders__tab--active":v.value==="teamFolders"},"team-folders__tab"]),onClick:o[0]||(o[0]=l=>v.value="teamFolders"),onKeydown:me},u(t(a)("circles","Team folders")),43,ea),s("button",{id:"team-folder-default-quotas-tab",type:"button",role:"tab","aria-selected":v.value==="defaultQuotas","aria-controls":"team-folder-default-quotas-panel",tabindex:v.value==="defaultQuotas"?0:-1,class:ve([{"team-folders__tab--active":v.value==="defaultQuotas"},"team-folders__tab"]),onClick:o[1]||(o[1]=l=>v.value="defaultQuotas"),onKeydown:me},u(t(a)("circles","Default quotas")),43,aa)],8,Ze),pe(n(t(Ee),{id:"team-folder-default-quotas-panel",role:"tabpanel","aria-labelledby":"team-folder-default-quotas-tab",name:t(a)("circles","Default quotas"),description:t(a)("circles","Configure the default storage quota for team folders. Requires the Team Folders app to be installed and enabled.")},{default:c(()=>[t(we)?y("",!0):(m(),_("p",la,u(t(a)("circles","Automatic team folder creation is disabled. These quota mappings will not apply until it is enabled again through the occ command.")),1)),s("div",ta,[n(t(O),{modelValue:w.value,"onUpdate:modelValue":o[2]||(o[2]=l=>w.value=l),clearable:!1,createOption:ee,inputLabel:t(a)("circles","Default quota"),options:X.value,placeholder:t(a)("circles","Select default quota"),taggable:"",class:"team-folders__input"},null,8,["modelValue","inputLabel","options","placeholder"]),n(t(F),{variant:"primary",disabled:V.value,onClick:ce},{default:c(()=>[p(u(V.value?t(a)("circles","Saving…"):t(a)("circles","Save")),1)]),_:1},8,["disabled"])]),s("p",oa,u(t(a)("circles","Default storage quota applied to each auto-created team folder. Use 0 for unlimited storage.")),1),s("h3",null,u(t(a)("circles","Quota overrides")),1),s("p",ra,u(t(a)("circles","Choose the default quota assigned to a Team folder created by users based on group membership. The default quota for a new Team folder is always the highest from the default quotas assigned to any of the groups a user is member of.")),1),s("div",sa,[n(t(O),{modelValue:I.value,"onUpdate:modelValue":o[3]||(o[3]=l=>I.value=l),loading:x.value||W.value,options:Ce.value,placeholder:t(a)("circles","Select a team or group"),label:"selectionLabel",class:"team-folders__team-select"},null,8,["modelValue","loading","options","placeholder"]),n(t(F),{disabled:I.value===null,onClick:Se},{default:c(()=>[p(u(t(a)("circles","Add")),1)]),_:1},8,["disabled"])]),s("div",{class:"team-folders__quota-mapping",role:"table","aria-label":t(a)("circles","Default team folder quotas")},[s("div",da,[s("span",ia,u(t(a)("circles","Name")),1),s("span",na,u(t(a)("circles","Type")),1),s("span",ca,u(t(a)("circles","Default quota")),1),s("span",ma,u(t(a)("circles","Options")),1)]),(m(!0),_(_e,null,ge(Ue.value,l=>(m(),_("div",{key:`${l.type}:${l.id}`,class:"team-folders__row",role:"row"},[s("div",fa,[s("strong",null,u(l.label),1)]),s("span",va,u(l.type==="team"?t(a)("circles","Team"):t(a)("circles","Group")),1),n(t(O),{modelValue:l.quota,"onUpdate:modelValue":r=>l.quota=r,"aria-label":t(a)("circles","Default quota for {team}",{team:l.label}),clearable:!1,createOption:ee,options:X.value,taggable:"",role:"cell"},null,8,["modelValue","onUpdate:modelValue","aria-label","options"]),s("div",pa,[n(t(ye),{"aria-label":t(a)("circles","Quota mapping actions")},{default:c(()=>[n(t(te),{closeAfterClick:"",onClick:r=>Ae(l)},{icon:c(()=>[n(je,{size:20})]),default:c(()=>[p(" "+u(t(a)("circles","Delete")),1)]),_:1},8,["onClick"])]),_:2},1032,["aria-label"])])]))),128))],8,ua),s("div",ba,[n(t(F),{variant:"primary",disabled:V.value,onClick:ce},{default:c(()=>[p(u(V.value?t(a)("circles","Saving…"):t(a)("circles","Save")),1)]),_:1},8,["disabled"])])]),_:1},8,["name","description"]),[[be,v.value==="defaultQuotas"]]),pe(s("div",_a,[s("h3",ga,u(t(a)("circles","Teams")),1),x.value?(m(),_("p",ya,u(t(a)("circles","Loading team folders…")),1)):y("",!0),x.value?y("",!0):(m(),_("div",ha,[s("table",qa,[s("thead",null,[s("tr",null,[s("th",null,[s("button",{type:"button",class:"team-folders__sort-header",onClick:o[4]||(o[4]=l=>ue("teamName"))},[p(u(t(a)("circles","Team"))+" ",1),S.value==="teamName"?(m(),_("span",wa,u(A.value?"▲":"▼"),1)):y("",!0)])]),s("th",ka,[s("button",{type:"button",class:"team-folders__sort-header",onClick:o[5]||(o[5]=l=>ue("mountPoint"))},[p(u(t(a)("circles","Team folder"))+" ",1),S.value==="mountPoint"?(m(),_("span",Ca,u(A.value?"▲":"▼"),1)):y("",!0)])]),s("th",Ua,u(t(a)("circles","Storage quota")),1),s("th",null,[s("span",Ia,u(t(a)("circles","Actions")),1)])])]),s("tbody",null,[re.value.length===0?(m(),_("tr",Va,[s("td",Ta,u(t(a)("circles","No team folders found.")),1)])):(m(!0),_(_e,{key:1},ge(re.value,l=>(m(),_("tr",{key:l.teamId},[s("td",null,u(l.teamName),1),s("td",Na,u(Ie(l)),1),s("td",Qa,[n(t(O),{modelValue:Q.value[l.teamId],options:X.value,createOption:ee,disabled:l.folder===null||Y.value.has(l.teamId),"aria-label":t(a)("circles","Storage quota"),clearable:!1,taggable:"",class:"team-folders__quota-select","onUpdate:modelValue":r=>Qe(l,r)},null,8,["modelValue","options","disabled","aria-label","onUpdate:modelValue"])]),s("td",Sa,[n(t(ye),{forceMenu:"","aria-label":t(a)("circles","Team actions")},{default:c(()=>[l.folder===null?(m(),R(t(te),{key:0,closeAfterClick:"",onClick:r=>Ve(l)},{default:c(()=>[p(u(t(a)("circles","Add")),1)]),_:1},8,["onClick"])):y("",!0),n(t(te),{closeAfterClick:"",onClick:r=>Ne(l)},{default:c(()=>[p(u(t(a)("circles","Delete team")),1)]),_:1},8,["onClick"])]),_:2},1032,["aria-label"])])]))),128))])])])),U.value?(m(),R(t(Fe),{key:2,name:t(a)("circles","Add a team folder"),open:U.value!==null,onClosing:ie},{actions:c(()=>[n(t(F),{disabled:g.value,onClick:ie},{default:c(()=>[p(u(t(a)("circles","Cancel")),1)]),_:1},8,["disabled"]),n(t(F),{variant:"primary",disabled:g.value||(b.value==="create"?D.value.trim()==="":$.value===null),onClick:Te},{default:c(()=>[p(u(t(a)("circles","Add")),1)]),_:1},8,["disabled"])]),default:c(()=>[s("p",Aa,u(t(a)("circles","This team folder can only be assigned to this team. It cannot be assigned to another team, and this action cannot be undone.")),1),s("div",Da,[n(t(he),{modelValue:b.value,"onUpdate:modelValue":o[6]||(o[6]=l=>b.value=l),value:"create",type:"radio",disabled:g.value},{default:c(()=>[p(u(t(a)("circles","Create a new team folder")),1)]),_:1},8,["modelValue","disabled"]),b.value==="create"?(m(),R(t(Ge),{key:0,modelValue:D.value,"onUpdate:modelValue":o[7]||(o[7]=l=>D.value=l),label:t(a)("circles","Team folder name"),disabled:g.value,required:""},null,8,["modelValue","label","disabled"])):y("",!0),n(t(he),{modelValue:b.value,"onUpdate:modelValue":o[8]||(o[8]=l=>b.value=l),value:"existing",type:"radio",disabled:g.value},{default:c(()=>[p(u(t(a)("circles","Use an existing team folder")),1)]),_:1},8,["modelValue","disabled"]),b.value==="existing"?(m(),R(t(O),{key:1,modelValue:$.value,"onUpdate:modelValue":o[9]||(o[9]=l=>$.value=l),options:Z.value,loading:E.value,disabled:g.value||E.value,placeholder:t(a)("circles","Select a team folder"),label:"mountPoint",clearable:!1},null,8,["modelValue","options","loading","disabled","placeholder"])):y("",!0)])]),_:1},8,["name","open"])):y("",!0)],512),[[be,v.value==="teamFolders"]])]))}}),Pa=Pe($a,[["__scopeId","data-v-a64cbff0"]]),xa=xe(Pa);xa.mount("#vue-admin-team-folders"); +import{d as De,P as a,y as fe,b as i,c as M,o as $e,e as m,p as _,h as s,i as u,j as t,K as ve,Q as pe,R as be,k as n,w as c,s as y,N as F,q as p,G as _e,H as ge,f as R,S as ae,T as Pe,U as xe}from"./_plugin-vue_export-helper-BBv7rb2Q.chunk.mjs";import{b as ye,N as Fe,a as f,x as h,c as le,y as K,D as Oe}from"./logger-BzLa-8Kq.chunk.mjs";import{f as H,N as O,p as B}from"./NcSelect--kERLlBK-CMhSEo4a.chunk.mjs";import{c as Be}from"./modulepreload-polyfill-BDZ74nf0.chunk.mjs";import{N as te}from"./NcActionButton-BO5T5ePT-lZsea0n8.chunk.mjs";import{a as he,_ as Ge}from"./NcPasswordField-BFyzHTOO-BWr8u7xv.chunk.mjs";import{N as Ee}from"./NcSettingsSection-Caz1fuWt-BRuIFkG8.chunk.mjs";import{I as je,g as Le,a as Me,u as Re,l as Ke,d as He,b as ze,c as Je}from"./TrashCanOutline-DbEqwasY.chunk.mjs";const We={class:"team-folders__settings"},Xe={class:"team-folders__title"},Ye={class:"team-folders__description"},Ze=["aria-label"],ea=["aria-selected","tabindex"],aa=["aria-selected","tabindex"],la={key:0,class:"team-folders__warning"},ta={class:"team-folders__input-row"},oa={class:"team-folders__hint"},ra={class:"team-folders__hint team-folders__hint--quota-overrides"},sa={class:"team-folders__add-row"},ua=["aria-label"],da={class:"team-folders__header",role:"row"},ia={role:"columnheader"},na={role:"columnheader"},ca={role:"columnheader"},ma={role:"columnheader"},fa={class:"team-folders__team",role:"cell"},va={role:"cell"},pa={class:"team-folders__options",role:"cell"},ba={class:"team-folders__quota-save"},_a={id:"team-folder-folders-panel",role:"tabpanel","aria-labelledby":"team-folder-folders-tab",class:"team-folders__list"},ga={class:"team-folders__list-title"},ya={key:0,class:"team-folders__hint"},ha={key:1,class:"team-folders__scroll"},qa={class:"team-folders__table"},wa={key:0},ka={class:"team-folders__mountpoint"},Ca={key:0},Ua={class:"team-folders__quota"},Ia={class:"hidden-visually"},Va={key:0,class:"team-folders__empty"},Ta={colspan:"4"},Na={class:"team-folders__mountpoint"},Qa={class:"team-folders__quota"},Sa={class:"team-folders__remove"},Aa={class:"team-folders__warning"},Da={class:"team-folders__dialog-options"},$a=De({__name:"AdminTeamFolders",setup(Fa){const q={id:"0",label:a("circles","Unlimited")},qe=[{id:"1 GB",label:"1 GB"},{id:"5 GB",label:"5 GB"},{id:"10 GB",label:"10 GB"}],G=Number(fe("circles","teamFolderDefaultQuota",0)),we=!!fe("circles","teamFolderProvisioningEnabled",!0),w=i(G<=0?q:{id:H(G),label:H(G)}),k=i([]),z=i({}),C=i([]),ke=i({}),J=i([]),I=i(null),W=i(!0),V=i(!1),T=["teamFolders","defaultQuotas"],v=i("teamFolders"),X=M(()=>{const e=[q,...qe];for(const o of[w.value,...k.value.map(l=>l.quota),...C.value.map(l=>l.quota)])e.some(l=>l.id===o.id)||e.push(o);return e}),N=i([]),Q=i({}),oe=i(new Set),Y=i(new Set),x=i(!0),S=i("teamName"),A=i(!0),U=i(null),D=i(""),g=i(!1),b=i("create"),Z=i([]),$=i(null),E=i(!1),Ce=M(()=>{const e=new Set([...k.value,...C.value].map(r=>`${r.type}:${r.id}`)),o=N.value.map(r=>({id:r.teamId,label:r.teamName,selectionLabel:`${r.teamName} (${a("circles","Team")})`,type:"team",quota:w.value})).filter(r=>!e.has(`${r.type}:${r.id}`)),l=J.value.map(r=>({...r,selectionLabel:`${r.label} (${a("circles","Group")})`,type:"group",quota:w.value})).filter(r=>!e.has(`${r.type}:${r.id}`));return[...o,...l].sort((r,d)=>r.label.localeCompare(d.label))}),Ue=M(()=>[...k.value,...C.value].sort((e,o)=>e.label.localeCompare(o.label))),re=M(()=>{const e=A.value?1:-1;return[...N.value].sort((o,l)=>{const r=se(o,S.value),d=se(l,S.value);return rd?e:0})});function se(e,o){switch(o){case"teamName":return e.teamName;case"mountPoint":return e.folder?.mountPoint??""}}function Ie(e){return e.folder?.mountPoint??""}function ue(e){S.value===e?A.value=!A.value:(S.value=e,A.value=!0)}async function j(){x.value=!0;try{N.value=await Le(),z.value=Object.fromEntries(N.value.filter(e=>e.defaultQuota!==null).map(e=>[e.teamId,e.defaultQuota])),k.value=N.value.filter(e=>e.defaultQuota!==null).map(e=>({id:e.teamId,label:e.teamName,type:"team",quota:L(e.defaultQuota)})).sort((e,o)=>e.label.localeCompare(o.label)),Q.value=Object.fromEntries(N.value.map(e=>[e.teamId,L(e.folder?.quota??G)])),oe.value=new Set}catch(e){f(a("circles","Unable to load team folders")),h.error("Unable to load team folders",{error:e})}finally{x.value=!1}}async function de(){W.value=!0;try{const[e,o]=await Promise.all([le.get(ae("/apps/circles/settings/groups")),le.get(ae("/apps/circles/settings"))]);J.value=e.data.ocs.data;const l=o.data.ocs.data.team_folder_group_quotas??{};ke.value=l;const r=new Map(J.value.map(d=>[d.id,d]));C.value=Object.entries(l).map(([d,P])=>({id:d,label:r.get(d)?.label??d,type:"group",quota:L(P)})).sort((d,P)=>d.label.localeCompare(P.label))}catch(e){f(a("circles","Unable to load group quotas")),h.error("Unable to load group quotas",{error:e})}finally{W.value=!1}}async function Ve(e){U.value=e,D.value=e.teamName,b.value="create",$.value=null,E.value=!0;try{Z.value=await Me(e.teamId)}catch(o){Z.value=[],f(a("circles","Unable to load available team folders")),h.error("Unable to load available team folders",{error:o,teamId:e.teamId})}finally{E.value=!1}}function ie(){g.value||(U.value=null)}async function Te(){if(U.value===null||b.value==="create"&&D.value.trim()===""||b.value==="existing"&&$.value===null)return;const e=U.value.teamId,o=$.value?.id;g.value=!0;try{b.value==="create"?await Re(e,D.value.trim()):o!==void 0&&await Ke(e,o),K(a("circles","Team folder added")),U.value=null,await j()}catch(l){f(a("circles","Unable to add team folder")),h.error("Unable to add team folder",{error:l,teamId:e})}finally{g.value=!1}}async function Ne(e){if(await Oe({name:a("circles","Delete team"),text:a("circles","Are you sure you want to delete {team}? This cannot be undone.",{team:e.teamName}),labelConfirm:a("circles","Delete team"),labelReject:a("circles","Cancel"),severity:"error"}))try{await He(e.teamId),K(a("circles","Team deleted")),await j()}catch(o){f(a("circles","Unable to delete the team")),h.error("Unable to delete team",{error:o,teamId:e.teamId})}}function ee(e){const o=B(e,!0);if(o!==null&&o>=0){const l=H(o);return{id:l,label:l}}return q}function L(e){if(e<=0)return q;const o=H(e);return{id:o,label:o}}async function Qe(e,o){const l=Q.value[e.teamId],r=o.id===q.id?0:B(o.id,!0);if(r===null||r<0){f(a("circles","Quota must be a non-negative number."));return}oe.value.add(e.teamId),Q.value[e.teamId]=o,Y.value.add(e.teamId);try{const d=await ze(e.teamId,Math.round(r));Q.value[e.teamId]=L(d.quota??r),K(a("circles","Changed team folder quota"))}catch(d){Q.value[e.teamId]=l,f(a("circles","Unable to update team folder quota")),h.error("Unable to update team folder quota",{error:d,teamId:e.teamId})}finally{Y.value.delete(e.teamId)}}async function ne(e,o){try{await Be();const l=ae("/apps/circles/settings/{key}",{appId:"circles",key:e}),{data:r}=await le.post(l,{value:o});if(r.ocs.meta.status!=="ok"){if(r.ocs.meta.message)return f(a("circles","Unable to update team folder config")),h.error("Error while updating team folder config",{error:r.ocs}),!1;throw new Error(`${r.ocs.meta.statuscode}`)}return!0}catch(l){return f(a("circles","Unable to update team folder config")),h.error("Error while updating team folder config",{error:l}),!1}}async function ce(){const e=w.value.id===q.id?0:B(w.value.id,!0);if(e===null||e<0){f(a("circles","Quota must be a non-negative number."));return}const o={};for(const r of k.value){const d=r.quota.id===q.id?0:B(r.quota.id,!0);if(d===null||d<0){f(a("circles","Quota must be a non-negative number."));return}o[r.id]=Math.round(d)}const l={};for(const r of C.value){const d=r.quota.id===q.id?0:B(r.quota.id,!0);if(d===null||d<0){f(a("circles","Quota must be a non-negative number."));return}l[r.id]=Math.round(d)}V.value=!0;try{if(!await ne("team_folder_default_quota",String(Math.round(e)))||!await ne("team_folder_group_quotas",JSON.stringify(l)))return;const r=new Set([...Object.keys(z.value),...Object.keys(o)]);await Promise.all([...r].map(async d=>{const P=o[d]??null;(z.value[d]??null)!==P&&await Je(d,P)})),K(a("circles","Changed default team folder quotas")),await Promise.all([j(),de()])}catch(r){f(a("circles","Unable to update team folder config")),h.error("Unable to update team quota settings",{error:r})}finally{V.value=!1}}function Se(){if(I.value===null)return;const e={...I.value,quota:w.value};e.type==="team"?k.value.push(e):C.value.push(e),I.value=null}function Ae(e){e.type==="team"?k.value=k.value.filter(o=>o.id!==e.id):C.value=C.value.filter(o=>o.id!==e.id)}function me(e){const o=T.indexOf(v.value);let l;switch(e.key){case"ArrowLeft":l=(o-1+T.length)%T.length;break;case"ArrowRight":l=(o+1)%T.length;break;case"Home":l=0;break;case"End":l=T.length-1;break;default:return}e.preventDefault(),v.value=T[l],e.currentTarget.parentElement?.querySelectorAll('[role="tab"]')?.[l]?.focus()}return $e(()=>Promise.all([j(),de()])),(e,o)=>(m(),_("section",We,[s("h2",Xe,u(t(a)("circles","Teams")),1),s("p",Ye,u(t(a)("circles","Configure default storage quotas and manage team folders.")),1),s("div",{class:"team-folders__tabs",role:"tablist","aria-label":t(a)("circles","Team folder settings")},[s("button",{id:"team-folder-folders-tab",type:"button",role:"tab","aria-selected":v.value==="teamFolders","aria-controls":"team-folder-folders-panel",tabindex:v.value==="teamFolders"?0:-1,class:ve([{"team-folders__tab--active":v.value==="teamFolders"},"team-folders__tab"]),onClick:o[0]||(o[0]=l=>v.value="teamFolders"),onKeydown:me},u(t(a)("circles","Team folders")),43,ea),s("button",{id:"team-folder-default-quotas-tab",type:"button",role:"tab","aria-selected":v.value==="defaultQuotas","aria-controls":"team-folder-default-quotas-panel",tabindex:v.value==="defaultQuotas"?0:-1,class:ve([{"team-folders__tab--active":v.value==="defaultQuotas"},"team-folders__tab"]),onClick:o[1]||(o[1]=l=>v.value="defaultQuotas"),onKeydown:me},u(t(a)("circles","Default quotas")),43,aa)],8,Ze),pe(n(t(Ee),{id:"team-folder-default-quotas-panel",role:"tabpanel","aria-labelledby":"team-folder-default-quotas-tab",name:t(a)("circles","Default quotas"),description:t(a)("circles","Configure the default storage quota for team folders. Requires the Team Folders app to be installed and enabled.")},{default:c(()=>[t(we)?y("",!0):(m(),_("p",la,u(t(a)("circles","Automatic team folder creation is disabled. These quota mappings will not apply until it is enabled again through the occ command.")),1)),s("div",ta,[n(t(O),{modelValue:w.value,"onUpdate:modelValue":o[2]||(o[2]=l=>w.value=l),clearable:!1,createOption:ee,inputLabel:t(a)("circles","Default quota"),options:X.value,placeholder:t(a)("circles","Select default quota"),taggable:"",class:"team-folders__input"},null,8,["modelValue","inputLabel","options","placeholder"]),n(t(F),{variant:"primary",disabled:V.value,onClick:ce},{default:c(()=>[p(u(V.value?t(a)("circles","Saving…"):t(a)("circles","Save")),1)]),_:1},8,["disabled"])]),s("p",oa,u(t(a)("circles","Default storage quota applied to each auto-created team folder. Use 0 for unlimited storage.")),1),s("h3",null,u(t(a)("circles","Quota overrides")),1),s("p",ra,u(t(a)("circles","Choose the default quota assigned to a Team folder created by users based on group membership. The default quota for a new Team folder is always the highest from the default quotas assigned to any of the groups a user is member of.")),1),s("div",sa,[n(t(O),{modelValue:I.value,"onUpdate:modelValue":o[3]||(o[3]=l=>I.value=l),loading:x.value||W.value,options:Ce.value,placeholder:t(a)("circles","Select a team or group"),label:"selectionLabel",class:"team-folders__team-select"},null,8,["modelValue","loading","options","placeholder"]),n(t(F),{disabled:I.value===null,onClick:Se},{default:c(()=>[p(u(t(a)("circles","Add")),1)]),_:1},8,["disabled"])]),s("div",{class:"team-folders__quota-mapping",role:"table","aria-label":t(a)("circles","Default team folder quotas")},[s("div",da,[s("span",ia,u(t(a)("circles","Name")),1),s("span",na,u(t(a)("circles","Type")),1),s("span",ca,u(t(a)("circles","Default quota")),1),s("span",ma,u(t(a)("circles","Options")),1)]),(m(!0),_(_e,null,ge(Ue.value,l=>(m(),_("div",{key:`${l.type}:${l.id}`,class:"team-folders__row",role:"row"},[s("div",fa,[s("strong",null,u(l.label),1)]),s("span",va,u(l.type==="team"?t(a)("circles","Team"):t(a)("circles","Group")),1),n(t(O),{modelValue:l.quota,"onUpdate:modelValue":r=>l.quota=r,"aria-label":t(a)("circles","Default quota for {team}",{team:l.label}),clearable:!1,createOption:ee,options:X.value,taggable:"",role:"cell"},null,8,["modelValue","onUpdate:modelValue","aria-label","options"]),s("div",pa,[n(t(ye),{"aria-label":t(a)("circles","Quota mapping actions")},{default:c(()=>[n(t(te),{closeAfterClick:"",onClick:r=>Ae(l)},{icon:c(()=>[n(je,{size:20})]),default:c(()=>[p(" "+u(t(a)("circles","Delete")),1)]),_:1},8,["onClick"])]),_:2},1032,["aria-label"])])]))),128))],8,ua),s("div",ba,[n(t(F),{variant:"primary",disabled:V.value,onClick:ce},{default:c(()=>[p(u(V.value?t(a)("circles","Saving…"):t(a)("circles","Save")),1)]),_:1},8,["disabled"])])]),_:1},8,["name","description"]),[[be,v.value==="defaultQuotas"]]),pe(s("div",_a,[s("h3",ga,u(t(a)("circles","Teams")),1),x.value?(m(),_("p",ya,u(t(a)("circles","Loading team folders…")),1)):y("",!0),x.value?y("",!0):(m(),_("div",ha,[s("table",qa,[s("thead",null,[s("tr",null,[s("th",null,[s("button",{type:"button",class:"team-folders__sort-header",onClick:o[4]||(o[4]=l=>ue("teamName"))},[p(u(t(a)("circles","Team"))+" ",1),S.value==="teamName"?(m(),_("span",wa,u(A.value?"▲":"▼"),1)):y("",!0)])]),s("th",ka,[s("button",{type:"button",class:"team-folders__sort-header",onClick:o[5]||(o[5]=l=>ue("mountPoint"))},[p(u(t(a)("circles","Team folder"))+" ",1),S.value==="mountPoint"?(m(),_("span",Ca,u(A.value?"▲":"▼"),1)):y("",!0)])]),s("th",Ua,u(t(a)("circles","Storage quota")),1),s("th",null,[s("span",Ia,u(t(a)("circles","Actions")),1)])])]),s("tbody",null,[re.value.length===0?(m(),_("tr",Va,[s("td",Ta,u(t(a)("circles","No team folders found.")),1)])):(m(!0),_(_e,{key:1},ge(re.value,l=>(m(),_("tr",{key:l.teamId},[s("td",null,u(l.teamName),1),s("td",Na,u(Ie(l)),1),s("td",Qa,[n(t(O),{modelValue:Q.value[l.teamId],options:X.value,createOption:ee,disabled:l.folder===null||Y.value.has(l.teamId),"aria-label":t(a)("circles","Storage quota"),clearable:!1,taggable:"",class:"team-folders__quota-select","onUpdate:modelValue":r=>Qe(l,r)},null,8,["modelValue","options","disabled","aria-label","onUpdate:modelValue"])]),s("td",Sa,[n(t(ye),{forceMenu:"","aria-label":t(a)("circles","Team actions")},{default:c(()=>[l.folder===null?(m(),R(t(te),{key:0,closeAfterClick:"",onClick:r=>Ve(l)},{default:c(()=>[p(u(t(a)("circles","Add")),1)]),_:1},8,["onClick"])):y("",!0),n(t(te),{closeAfterClick:"",onClick:r=>Ne(l)},{default:c(()=>[p(u(t(a)("circles","Delete team")),1)]),_:1},8,["onClick"])]),_:2},1032,["aria-label"])])]))),128))])])])),U.value?(m(),R(t(Fe),{key:2,name:t(a)("circles","Add a team folder"),open:U.value!==null,onClosing:ie},{actions:c(()=>[n(t(F),{disabled:g.value,onClick:ie},{default:c(()=>[p(u(t(a)("circles","Cancel")),1)]),_:1},8,["disabled"]),n(t(F),{variant:"primary",disabled:g.value||(b.value==="create"?D.value.trim()==="":$.value===null),onClick:Te},{default:c(()=>[p(u(t(a)("circles","Add")),1)]),_:1},8,["disabled"])]),default:c(()=>[s("p",Aa,u(t(a)("circles","This team folder can only be assigned to this team. It cannot be assigned to another team, and this action cannot be undone.")),1),s("div",Da,[n(t(he),{modelValue:b.value,"onUpdate:modelValue":o[6]||(o[6]=l=>b.value=l),value:"create",type:"radio",disabled:g.value},{default:c(()=>[p(u(t(a)("circles","Create a new team folder")),1)]),_:1},8,["modelValue","disabled"]),b.value==="create"?(m(),R(t(Ge),{key:0,modelValue:D.value,"onUpdate:modelValue":o[7]||(o[7]=l=>D.value=l),label:t(a)("circles","Team folder name"),disabled:g.value,required:""},null,8,["modelValue","label","disabled"])):y("",!0),n(t(he),{modelValue:b.value,"onUpdate:modelValue":o[8]||(o[8]=l=>b.value=l),value:"existing",type:"radio",disabled:g.value},{default:c(()=>[p(u(t(a)("circles","Use an existing team folder")),1)]),_:1},8,["modelValue","disabled"]),b.value==="existing"?(m(),R(t(O),{key:1,modelValue:$.value,"onUpdate:modelValue":o[9]||(o[9]=l=>$.value=l),options:Z.value,loading:E.value,disabled:g.value||E.value,placeholder:t(a)("circles","Select a team folder"),label:"mountPoint",clearable:!1},null,8,["modelValue","options","loading","disabled","placeholder"])):y("",!0)])]),_:1},8,["name","open"])):y("",!0)],512),[[be,v.value==="teamFolders"]])]))}}),Pa=Pe($a,[["__scopeId","data-v-a64cbff0"]]),xa=xe(Pa);xa.mount("#vue-admin-team-folders"); //# sourceMappingURL=teams-settings-team-folders.mjs.map diff --git a/src/teams/api.spec.ts b/src/teams/api.spec.ts index 6111f37c1..e5ce28792 100644 --- a/src/teams/api.spec.ts +++ b/src/teams/api.spec.ts @@ -32,7 +32,25 @@ vi.mock('./team-page/services/collaborationAutocompletion.js', () => ({ getSuggestions: vi.fn(), })) -const { createTeam } = await import('./api.ts') +const { createTeam, fetchTeams } = await import('./api.ts') + +describe('fetchTeams', () => { + it('drops circles the current user is not a member of', async () => { + const circles = [ + { id: 'team1', name: 'team1', displayName: 'Team One', population: 3, initiator: { level: 9 } }, + { id: 'visible1', name: 'visible1', displayName: 'Visible circle', population: 10, initiator: null }, + ] + vi.mocked(axios.get) + .mockResolvedValueOnce({ data: { ocs: { data: circles } } }) + .mockResolvedValueOnce({ data: { ocs: { data: [] } } }) + + const teams = await fetchTeams() + + expect(teams).toHaveLength(1) + expect(teams[0].id).toBe('team1') + expect(teams[0].myRole).toBe('owner') + }) +}) describe('createTeam', () => { beforeEach(() => { diff --git a/src/teams/api.ts b/src/teams/api.ts index 60e98e91b..2a476100d 100644 --- a/src/teams/api.ts +++ b/src/teams/api.ts @@ -48,7 +48,7 @@ interface RawCircle { displayName: string description?: string population?: number - initiator?: { level?: number } + initiator?: { level?: number } | null } /** Raw team as returned by the dashboard widget endpoint. */ @@ -149,7 +149,7 @@ export async function fetchTeams(): Promise { if (circlesRes.status === 'rejected') { throw circlesRes.reason } - const circles = circlesRes.value.data.ocs.data ?? [] + const circles = (circlesRes.value.data.ocs.data ?? []).filter((circle) => circle.initiator) // The dashboard only enriches each team with member/resource previews, so // treat a failure there as "no previews" rather than failing the whole page. From 1c2f2da181a8fda07ff1c76538132e3250ea1895 Mon Sep 17 00:00:00 2001 From: Peter Ringelmann Date: Tue, 22 Sep 2026 15:31:58 +0200 Subject: [PATCH 2/2] test(teams): cover the empty circles response in fetchTeams Signed-off-by: Peter Ringelmann --- src/teams/api.spec.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/teams/api.spec.ts b/src/teams/api.spec.ts index e5ce28792..44e0609f2 100644 --- a/src/teams/api.spec.ts +++ b/src/teams/api.spec.ts @@ -50,6 +50,14 @@ describe('fetchTeams', () => { expect(teams[0].id).toBe('team1') expect(teams[0].myRole).toBe('owner') }) + + it('returns an empty list when the circles response carries no data', async () => { + vi.mocked(axios.get) + .mockResolvedValueOnce({ data: { ocs: {} } }) + .mockResolvedValueOnce({ data: { ocs: { data: [] } } }) + + await expect(fetchTeams()).resolves.toEqual([]) + }) }) describe('createTeam', () => {