Files
DiceCloud/app/imports/client/ui/library/LibraryList.vue
2022-11-22 21:21:53 +02:00

189 lines
5.9 KiB
Vue

<template>
<v-list
expand
class="library-list"
>
<library-list-tile
v-for="library in librariesWithoutCollection"
:key="library._id"
:model="library"
:to="{ name: 'singleLibrary', params: { id: library._id }}"
:selection="selection"
:is-selected="librariesSelected && librariesSelected.includes(library._id)"
:selected-by-collection="librariesSelectedByCollections && librariesSelectedByCollections.includes(library._id)"
:disabled="disabled"
@select="val => $emit('select-library', library._id, val)"
/>
<v-list-group
v-for="libraryCollection in libraryCollections"
:key="libraryCollection._id"
v-model="openCollections[libraryCollection._id]"
group="library-collection"
:data-id="`library-collection-${libraryCollection._id}`"
>
<template #activator>
<library-collection-header
:open="openCollections[libraryCollection._id]"
:model="libraryCollection"
:selection="selection"
:is-selected="libraryCollectionsSelected && libraryCollectionsSelected.includes(libraryCollection._id)"
:disabled="disabled"
@select="val => $emit('select-library-collection', libraryCollection._id, val)"
/>
</template>
<library-list-tile
v-for="library in libraryCollection.libraryDocuments"
:key="library._id"
:model="library"
:to="{ name: 'singleLibrary', params: { id: library._id }}"
:selection="selection"
:is-selected="librariesSelected && librariesSelected.includes(library._id)"
:selected-by-collection="librariesSelectedByCollections && librariesSelectedByCollections.includes(library._id)"
:disabled="disabled"
class="ml-4"
@select="val => $emit('select-library', library._id, val)"
/>
</v-list-group>
</v-list>
</template>
<script lang="js">
import { union } from 'lodash';
import { snackbar } from '/imports/client/ui/components/snackbars/SnackbarQueue.js';
import LibraryCollections, { insertLibraryCollection } from '/imports/api/library/LibraryCollections.js';
import Libraries, { insertLibrary } from '/imports/api/library/Libraries.js';
import LibraryListTile from '/imports/client/ui/library/LibraryListTile.vue'
import LibraryCollectionHeader from '/imports/client/ui/library/LibraryCollectionHeader.vue';
export default {
components: {
LibraryListTile,
LibraryCollectionHeader,
},
props: {
selection: Boolean,
disabled: Boolean,
librariesSelected: {
type: Array,
default: undefined,
},
libraryCollectionsSelected: {
type: Array,
default: undefined,
},
librariesSelectedByCollections: {
type: Array,
default: undefined,
},
},
data(){ return{
loadingInsertLibraryCollection: false,
openCollections: [],
}},
meteor: {
$subscribe: {
'libraries': [],
},
libraryCollections(){
const userId = Meteor.userId();
if (!userId) return;
const subCollections = Meteor.user().subscribedLibraryCollections || [];
return LibraryCollections.find({
$or: [
{ owner: userId },
{ writers: userId },
{ readers: userId },
{ _id: { $in: subCollections }, public: true },
]
}, {
sort: { name: 1 }
}).map(libCollection => {
libCollection.libraryDocuments = Libraries.find({
_id: {$in: libCollection.libraries},
$or: [
{ owner: userId },
{ writers: userId },
{ readers: userId },
{ public: true },
]
}, {
sort: { name: 1 }
}).fetch();
return libCollection;
});
},
librariesWithoutCollection() {
const userId = Meteor.userId();
if (!this.libraryCollections) return;
// Collate the IDs of all the libraries in collections
let collectedLibraries = [];
this.libraryCollections.forEach(libCollection => {
collectedLibraries = union(collectedLibraries, libCollection.libraries);
});
// return the libraries with IDs not in that list
return Libraries.find(
{
_id: {$nin: collectedLibraries},
$or: [
{ owner: userId },
{ writers: userId },
{ readers: userId },
{ public: true },
]
},
{sort: {name: 1}}
);
},
},
methods: {
insertLibrary() {
const self = this;
if (this.paidBenefits){
this.$store.commit('pushDialogStack', {
component: 'library-creation-dialog',
elementId: 'insert-library-button',
callback(library){
if (!library) return;
return insertLibrary.call(library, (error, libraryId) => {
if (error){
console.error(error);
snackbar({
text: error.reason,
});
} else {
self.$router.push({
name: 'singleLibrary',
params: { id: libraryId }
});
}
});
}
});
} else {
this.$store.commit('pushDialogStack', {
component: 'tier-too-low-dialog',
elementId: 'insert-library-button',
});
}
},
insertLibraryCollection() {
this.$store.commit('pushDialogStack', {
component: 'library-collection-creation-dialog',
elementId: 'insert-library-collection-button',
callback(libraryCollection){
if (!libraryCollection) return;
const id = insertLibraryCollection.call(libraryCollection, error => {
if (!error) return;
console.error(error);
snackbar({
text: error.reason,
});
});
return `library-collection-${id}`
}
});
},
},
};
</script>