Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 63 additions & 22 deletions apps/files/src/views/FilesList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -637,35 +637,37 @@ export default defineComponent({
return
}

// Check known status codes
if (status === 507) {
showError(t('files', 'Not enough free space'))
// Quota / size limits may surface as either classic 507 or EntityTooLarge (413)
if (status === 507 || status === 413) {
showError(t('files', 'File is too large or there is not enough free space'))
return
} else if (status === 404 || status === 409) {
showError(t('files', 'Target folder does not exist any more'))
return
} else if (status === 403) {
}

const davError = this.parseDavError(upload.response?.data)

if (this.isAccessControlError(status, davError)) {
showError(t('files', 'Operation is blocked by access control'))
return
}

// Else we try to parse the response error message
if (typeof upload.response?.data === 'string') {
try {
const parser = new DOMParser()
const doc = parser.parseFromString(upload.response.data, 'text/xml')
const message = doc.getElementsByTagName('s:message')[0]?.textContent ?? ''
if (message.trim() !== '') {
// The server message is also translated
showError(t('files', 'Error during upload: {message}', { message }))
return
}
} catch (error) {
logger.error('Could not parse message', { error })
}
// Prefer explicit Nextcloud/Sabre error payload over generic status assumptions
const reasonOrMessage = davError.reason || davError.message
if (reasonOrMessage !== '') {
// The server message is also translated
showError(t('files', 'Error during upload: {message}', { message: reasonOrMessage }))
return
}

// Only use generic fallback messages if DAV XML did not provide one
if (status === 404 || status === 409) {
showError(t('files', 'Target folder does not exist any more'))
return
}

// Finally, check the status code if we have one
// TODO: optionally special-case more DAV statuses in the future, e.g.:
// 400 InvalidPath, 401 PasswordLoginForbidden, 413 EntityTooLarge,
// 415 UnsupportedMediaType, 423 FileLocked, 429 TooManyRequests, 502 BadGateway

if (status !== 0) {
showError(t('files', 'Error during upload, status code {status}', { status }))
return
Expand All @@ -674,6 +676,45 @@ export default defineComponent({
showError(t('files', 'Unknown error during upload'))
},

parseDavError(data?: unknown) {
const empty = {
exception: '',
message: '',
reason: '',
retry: '',
hint: '',
}

if (typeof data !== 'string' || data.trim() === '') {
return empty
}

try {
const parser = new DOMParser()
const doc = parser.parseFromString(data, 'text/xml')

return {
exception: doc.getElementsByTagName('s:exception')[0]?.textContent?.trim() ?? '',
message: doc.getElementsByTagName('s:message')[0]?.textContent?.trim() ?? '',
reason: doc.getElementsByTagName('o:reason')[0]?.textContent?.trim() ?? '',
retry: doc.getElementsByTagName('o:retry')[0]?.textContent?.trim() ?? '',
hint: doc.getElementsByTagName('o:hint')[0]?.textContent?.trim() ?? '',
}
} catch (error) {
logger.error('Could not parse DAV error response', { error })
return empty
}
},

isAccessControlError(status: number, davError: { exception: string, message: string, reason: string }) {
return status === 403
&& davError.exception === 'OCA\\DAV\\Connector\\Sabre\\Exception\\Forbidden'
&& (
davError.reason === 'Access denied by access control'
|| davError.message === 'Access denied by access control'
)
},

/**
* Refreshes the current folder on update.
*
Expand Down

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
import{b as w,l as h,z as I,o as p,f as y,t as N,u as a,h as D,g as u,k as r,w as d,c as k,m as M,T,F as q,B as z,v as s,G as A}from"./Web-BwmPK40i.chunk.mjs";import{f as B,g as F,h as G,i as P}from"./mdi-Lt-19ASw.chunk.mjs";import{t as n}from"./translation-DoG5ZELJ-CFYnqluG.chunk.mjs";import{N as f}from"./logger-D3RVzcfQ-8mOgKmZ4.chunk.mjs";import{N as g}from"./createElementId-DhjFt1I9-B4kXTdvj.chunk.mjs";import{c as S,D as j,u as E}from"./DiscoverTypePost-iZg8MLG2.chunk.mjs";import{_ as H}from"./public-C1mLBHT3.chunk.mjs";import"./index-B-dGqfIG.chunk.mjs";import"./index-DlyLvrtV.chunk.mjs";import"./appstore-main.mjs";import"./pinia-CLibr4cC.chunk.mjs";import"./NcContent-BhMoPROW-DisoN_bw.chunk.mjs";import"./NcModal-DUWLRm_F-CU-AeBE5.chunk.mjs";import"./PencilOutline-CJ2aSuY5.chunk.mjs";import"./NcTextArea-Dxzj4zdb-FMRUOSZF.chunk.mjs";import"./index-BOH7nBEM.chunk.mjs";import"./TrashCanOutline-Cv7t-yKN.chunk.mjs";import"./TrayArrowDown-BI3qCRD6.chunk.mjs";import"./NcInputField-B1bGxYHt-BybY_CkS.chunk.mjs";import"./index-BW4M2n71.chunk.mjs";import"./NcAvatar-M3-CbKbq-D3H79LgO.chunk.mjs";import"./index-BLNGy7h5.chunk.mjs";import"./util-Alk1iwuj.chunk.mjs";import"./ArrowRight-DKsMJImQ.chunk.mjs";import"./colors-BDeMBgfq-BQ_6MaUU.chunk.mjs";import"./NcUserStatusIcon-DsviB2Cr-CpKCZ3VO.chunk.mjs";import"./NcDateTime.vue_vue_type_script_setup_true_lang-BJuPH7S7-B1iF5g9H.chunk.mjs";import"./NcEmptyContent-CGAPqk4S-6l5cDfPe.chunk.mjs";import"./NcBreadcrumbs-5gl8Syfa-DEY8F3C7.chunk.mjs";import"./NcPasswordField-Be5_qcfm-ZLEgTVOQ.chunk.mjs";import"./NcTextField.vue_vue_type_script_setup_true_lang-BQHjkK8r-BU5OWoch.chunk.mjs";/* empty css */import"./NcCheckboxRadioSwitch-D8Dfv4iw-ChIm2mK6.chunk.mjs";import"./Plus-DYmK9QaT.chunk.mjs";import"./index-BoBLp2fu.chunk.mjs";import"./index-CMXcwXc6.chunk.mjs";import"./NcEmojiPicker-Bpw-68QP-D7y9NGJt.chunk.mjs";import"./emoji-C8k9NUlo-rFKNlNNR.chunk.mjs";import"./index-C_wPY1fR.chunk.mjs";/* empty css */import"./index-xEyWukTf.chunk.mjs";import"./NcSelectTags-D7qWNjXa-DQjEDMdI.chunk.mjs";import"./ContentCopy-BF1gBM5z.chunk.mjs";import"./NcUserBubble-CDQa0hGy-BM5qrjQl.chunk.mjs";import"./modulepreload-polyfill-BxzAKjcf.chunk.mjs";import"./index-DL1yHC1K-DnBG6QLJ.chunk.mjs";import"./index-BU6wm4Hd.chunk.mjs";const J=["aria-roledescription","aria-labelledby"],K=["id"],L={class:"app-discover-carousel__wrapper"},O={class:"app-discover-carousel__button-wrapper"},Q={class:"app-discover-carousel__button-wrapper"},R=["aria-label"],U=w({__name:"DiscoverTypeCarousel",props:{...S,content:{type:Array,required:!0}},setup(m){const t=m,$=E(s(()=>t.headline)),e=h(Math.min(1,t.content.length-1)),c=h(t.content[e.value]),C=s(()=>e.value<t.content.length-1),x=s(()=>e.value>0),l=s(()=>t.id??(Math.random()+1).toString(36).substring(7)),v=s(()=>`${l.value}-h`),b=h("slide-in");return I(()=>e.value,(_,i)=>{_<i?b.value="slide-in":b.value="slide-out",A(()=>{c.value=t.content[e.value]})}),(_,i)=>(p(),y("section",{"aria-roledescription":a(n)("appstore","Carousel"),"aria-labelledby":v.value?`${v.value}`:void 0},[_.headline?(p(),y("h3",{key:0,id:v.value},N(a($)),9,K)):D("",!0),u("div",L,[u("div",O,[r(a(f),{class:"app-discover-carousel__button app-discover-carousel__button--previous",variant:"tertiary-no-background","aria-label":a(n)("appstore","Previous slide"),disabled:!x.value,onClick:i[0]||(i[0]=o=>e.value-=1)},{icon:d(()=>[r(a(g),{path:a(B)},null,8,["path"])]),_:1},8,["aria-label","disabled"])]),r(T,{name:b.value,mode:"out-in"},{default:d(()=>[(p(),k(j,M(c.value,{key:c.value.id??e.value,"aria-labelledby":`${l.value}-tab-${e.value}`,domId:`${l.value}-tabpanel-${e.value}`,inline:"",role:"tabpanel"}),null,16,["aria-labelledby","domId"]))]),_:1},8,["name"]),u("div",Q,[r(a(f),{class:"app-discover-carousel__button app-discover-carousel__button--next",variant:"tertiary-no-background","aria-label":a(n)("appstore","Next slide"),disabled:!C.value,onClick:i[1]||(i[1]=o=>e.value+=1)},{icon:d(()=>[r(a(g),{path:a(F)},null,8,["path"])]),_:1},8,["aria-label","disabled"])])]),u("div",{class:"app-discover-carousel__tabs",role:"tablist","aria-label":a(n)("appstore","Choose slide to display")},[(p(!0),y(q,null,z(m.content.length,o=>(p(),k(a(f),{id:`${l.value}-tab-${o}`,key:o,"aria-label":a(n)("appstore","{index} of {total}",{index:o,total:m.content.length}),"aria-controls":`${l.value}-tabpanel-${o}`,"aria-selected":`${e.value===o-1}`,role:"tab",variant:"tertiary-no-background",onClick:V=>e.value=o-1},{icon:d(()=>[r(a(g),{path:e.value===o-1?a(G):a(P)},null,8,["path"])]),_:2},1032,["id","aria-label","aria-controls","aria-selected","onClick"]))),128))],8,R)],8,J))}}),Ka=H(U,[["__scopeId","data-v-89f194e4"]]);export{Ka as default};
//# sourceMappingURL=DiscoverTypeCarousel-D1Tykxta.chunk.mjs.map
import{b as w,l as h,z as I,o as p,f as y,t as N,u as a,h as D,g as u,k as r,w as d,c as k,m as M,T,F as q,B as z,v as s,G as A}from"./Web-BwmPK40i.chunk.mjs";import{f as B,g as F,h as G,i as P}from"./mdi-Lt-19ASw.chunk.mjs";import{t as n}from"./translation-DoG5ZELJ-CFYnqluG.chunk.mjs";import{N as f}from"./logger-D3RVzcfQ-8mOgKmZ4.chunk.mjs";import{N as g}from"./createElementId-DhjFt1I9-B4kXTdvj.chunk.mjs";import{c as S,D as j,u as E}from"./DiscoverTypePost-iZg8MLG2.chunk.mjs";import{_ as H}from"./public-C1mLBHT3.chunk.mjs";import"./index-B-dGqfIG.chunk.mjs";import"./index-DlyLvrtV.chunk.mjs";import"./appstore-main.mjs";import"./pinia-CLibr4cC.chunk.mjs";import"./NcContent-BhMoPROW-DisoN_bw.chunk.mjs";import"./NcModal-DUWLRm_F-CU-AeBE5.chunk.mjs";import"./PencilOutline-CJ2aSuY5.chunk.mjs";import"./NcTextArea-Dxzj4zdb-stc727hj.chunk.mjs";import"./index-BOH7nBEM.chunk.mjs";import"./TrashCanOutline-Cv7t-yKN.chunk.mjs";import"./TrayArrowDown-BI3qCRD6.chunk.mjs";import"./NcInputField-B1bGxYHt-BybY_CkS.chunk.mjs";import"./index-BW4M2n71.chunk.mjs";import"./NcAvatar-M3-CbKbq-D3H79LgO.chunk.mjs";import"./index-BLNGy7h5.chunk.mjs";import"./util-Alk1iwuj.chunk.mjs";import"./ArrowRight-DKsMJImQ.chunk.mjs";import"./colors-BDeMBgfq-BQ_6MaUU.chunk.mjs";import"./NcUserStatusIcon-DsviB2Cr-CpKCZ3VO.chunk.mjs";import"./NcDateTime.vue_vue_type_script_setup_true_lang-BJuPH7S7-B1iF5g9H.chunk.mjs";import"./NcEmptyContent-CGAPqk4S-6l5cDfPe.chunk.mjs";import"./NcBreadcrumbs-5gl8Syfa-DEY8F3C7.chunk.mjs";import"./NcPasswordField-Be5_qcfm-ZLEgTVOQ.chunk.mjs";import"./NcTextField.vue_vue_type_script_setup_true_lang-BQHjkK8r-BU5OWoch.chunk.mjs";/* empty css */import"./NcCheckboxRadioSwitch-D8Dfv4iw-ChIm2mK6.chunk.mjs";import"./Plus-DYmK9QaT.chunk.mjs";import"./index-BoBLp2fu.chunk.mjs";import"./index-CMXcwXc6.chunk.mjs";import"./NcEmojiPicker-Bpw-68QP-D7y9NGJt.chunk.mjs";import"./emoji-C8k9NUlo-rFKNlNNR.chunk.mjs";import"./index-C_wPY1fR.chunk.mjs";/* empty css */import"./index-xEyWukTf.chunk.mjs";import"./NcSelectTags-D7qWNjXa-DQjEDMdI.chunk.mjs";import"./ContentCopy-BF1gBM5z.chunk.mjs";import"./NcUserBubble-CDQa0hGy-BM5qrjQl.chunk.mjs";import"./modulepreload-polyfill-BxzAKjcf.chunk.mjs";import"./index-DL1yHC1K-DnBG6QLJ.chunk.mjs";import"./index-BU6wm4Hd.chunk.mjs";const J=["aria-roledescription","aria-labelledby"],K=["id"],L={class:"app-discover-carousel__wrapper"},O={class:"app-discover-carousel__button-wrapper"},Q={class:"app-discover-carousel__button-wrapper"},R=["aria-label"],U=w({__name:"DiscoverTypeCarousel",props:{...S,content:{type:Array,required:!0}},setup(m){const t=m,$=E(s(()=>t.headline)),e=h(Math.min(1,t.content.length-1)),c=h(t.content[e.value]),C=s(()=>e.value<t.content.length-1),x=s(()=>e.value>0),l=s(()=>t.id??(Math.random()+1).toString(36).substring(7)),v=s(()=>`${l.value}-h`),b=h("slide-in");return I(()=>e.value,(_,i)=>{_<i?b.value="slide-in":b.value="slide-out",A(()=>{c.value=t.content[e.value]})}),(_,i)=>(p(),y("section",{"aria-roledescription":a(n)("appstore","Carousel"),"aria-labelledby":v.value?`${v.value}`:void 0},[_.headline?(p(),y("h3",{key:0,id:v.value},N(a($)),9,K)):D("",!0),u("div",L,[u("div",O,[r(a(f),{class:"app-discover-carousel__button app-discover-carousel__button--previous",variant:"tertiary-no-background","aria-label":a(n)("appstore","Previous slide"),disabled:!x.value,onClick:i[0]||(i[0]=o=>e.value-=1)},{icon:d(()=>[r(a(g),{path:a(B)},null,8,["path"])]),_:1},8,["aria-label","disabled"])]),r(T,{name:b.value,mode:"out-in"},{default:d(()=>[(p(),k(j,M(c.value,{key:c.value.id??e.value,"aria-labelledby":`${l.value}-tab-${e.value}`,domId:`${l.value}-tabpanel-${e.value}`,inline:"",role:"tabpanel"}),null,16,["aria-labelledby","domId"]))]),_:1},8,["name"]),u("div",Q,[r(a(f),{class:"app-discover-carousel__button app-discover-carousel__button--next",variant:"tertiary-no-background","aria-label":a(n)("appstore","Next slide"),disabled:!C.value,onClick:i[1]||(i[1]=o=>e.value+=1)},{icon:d(()=>[r(a(g),{path:a(F)},null,8,["path"])]),_:1},8,["aria-label","disabled"])])]),u("div",{class:"app-discover-carousel__tabs",role:"tablist","aria-label":a(n)("appstore","Choose slide to display")},[(p(!0),y(q,null,z(m.content.length,o=>(p(),k(a(f),{id:`${l.value}-tab-${o}`,key:o,"aria-label":a(n)("appstore","{index} of {total}",{index:o,total:m.content.length}),"aria-controls":`${l.value}-tabpanel-${o}`,"aria-selected":`${e.value===o-1}`,role:"tab",variant:"tertiary-no-background",onClick:V=>e.value=o-1},{icon:d(()=>[r(a(g),{path:e.value===o-1?a(G):a(P)},null,8,["path"])]),_:2},1032,["id","aria-label","aria-controls","aria-selected","onClick"]))),128))],8,R)],8,J))}}),Ka=H(U,[["__scopeId","data-v-89f194e4"]]);export{Ka as default};
//# sourceMappingURL=DiscoverTypeCarousel-BKROD9d-.chunk.mjs.map
Loading
Loading