Skip to content
Snippets Groups Projects
Commit 46b41216 authored by Marcus Eibrink-Lunzenauer's avatar Marcus Eibrink-Lunzenauer Committed by Elmar Ludwig
Browse files

Fixes #1130.

Closes #1130

Merge request studip/studip!821
parent 0959bf9c
No related branches found
No related tags found
No related merge requests found
...@@ -17,6 +17,56 @@ ...@@ -17,6 +17,56 @@
<script> <script>
import { mapActions, mapGetters } from 'vuex'; import { mapActions, mapGetters } from 'vuex';
function filterCourseFolders(folders, { allowHomeworkFolders }) {
const validatedParents = new Map();
return folders.filter((folder) => {
if (validateParentFolder(folder)) {
switch (folder.attributes['folder-type']) {
case 'HiddenFolder':
if (folder.attributes['data-content']['download_allowed'] === 1) {
return true;
}
break;
case 'HomeworkFolder':
if (allowHomeworkFolders) {
return true;
}
break;
default:
return true;
}
}
});
function validateParentFolder(folder) {
let isValid = true;
if (folder?.relationships?.parent) {
let parentId = folder.relationships.parent.data.id;
if (validatedParents.has(parentId)) {
isValid = validatedParents.get(parentId);
} else {
let parent = folders.find((f) => f.id === parentId);
if (parent) {
isValid = hiddenParentFolderValidation(parent);
validatedParents.set(parentId, isValid);
}
}
}
return isValid;
}
function hiddenParentFolderValidation(parentFolder) {
if (parentFolder.attributes['folder-type'] === 'HiddenFolder') {
return false;
} else if (parentFolder?.relationships?.parent) {
// Recursively validating the parents.
return validateParentFolder(parentFolder);
} else {
return true;
}
}
}
export default { export default {
name: 'courseware-folder-chooser', name: 'courseware-folder-chooser',
props: { props: {
...@@ -45,32 +95,17 @@ export default { ...@@ -45,32 +95,17 @@ export default {
return { type: 'users', id: `${this.userId}` }; return { type: 'users', id: `${this.userId}` };
}, },
loadedCourseFolders() { loadedCourseFolders() {
let loadedCourseFolders = []; return filterCourseFolders(
let CourseFolders = this.relatedFolders({ parent: this.courseObject, relationship: 'folders' }) ?? []; this.relatedFolders({ parent: this.courseObject, relationship: 'folders' }) ?? [],
CourseFolders.forEach(folder => { {
if (this.validateParentFolder(folder)) { allowHomeworkFolders: this.allowHomeworkFolders,
switch (folder.attributes['folder-type']) {
case 'HiddenFolder':
if (folder.attributes['data-content']['download_allowed'] === 1) {
loadedCourseFolders.push(folder);
}
break;
case 'HomeworkFolder':
if(this.allowHomeworkFolders) {
loadedCourseFolders.push(folder);
}
break;
default:
loadedCourseFolders.push(folder);
}
} }
}); );
return loadedCourseFolders;
}, },
loadedUserFolders() { loadedUserFolders() {
let loadedUserFolders = []; let loadedUserFolders = [];
let UserFolders = this.relatedFolders({ parent: this.userObject, relationship: 'folders' }) ?? []; let UserFolders = this.relatedFolders({ parent: this.userObject, relationship: 'folders' }) ?? [];
UserFolders.forEach(folder => { UserFolders.forEach((folder) => {
if (folder.attributes['folder-type'] === 'PublicFolder') { if (folder.attributes['folder-type'] === 'PublicFolder') {
loadedUserFolders.push(folder); loadedUserFolders.push(folder);
} }
...@@ -81,7 +116,7 @@ export default { ...@@ -81,7 +116,7 @@ export default {
}, },
methods: { methods: {
...mapActions({ ...mapActions({
loadRelatedFolders: 'folders/loadRelated' loadRelatedFolders: 'folders/loadRelated',
}), }),
changeSelection() { changeSelection() {
...@@ -103,30 +138,6 @@ export default { ...@@ -103,30 +138,6 @@ export default {
return this.loadRelatedFolders({ parent, relationship, options }); return this.loadRelatedFolders({ parent, relationship, options });
}, },
validateParentFolder(folder) {
let courseFolders = this.relatedFolders({ parent: this.courseObject, relationship: 'folders' }) ?? [];
let validation = true;
if (courseFolders.length > 0 && folder?.relationships?.parent) {
let parentId = folder.relationships.parent.data.id;
let parent = courseFolders.find(f => f.id === parentId);
if (parent) {
validation = this.hiddenParentFolderValidation(parent);
}
}
return validation;
},
hiddenParentFolderValidation(parentFolder) {
if (parentFolder.attributes['folder-type'] === 'HiddenFolder') {
return false;
} else if (parentFolder?.relationships?.parent) {
// Recursively validating the parents.
return this.validateParentFolder(parentFolder);
} else {
return true;
}
}
}, },
mounted() { mounted() {
this.currentValue = this.value; this.currentValue = this.value;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment