Archived
1
0
This repository has been archived on 2024-05-04. You can view files and clone it, but cannot push or open issues or pull requests.
cyca/resources/js/app.js
2022-01-12 00:35:37 +01:00

251 lines
7.6 KiB
JavaScript
Executable File

require("./modules/bootstrap");
require("./modules/websockets");
import { createApp } from "vue";
import mixins from "./mixins";
import store from "./store";
import { mapGetters, mapActions } from "vuex";
import DetailsDocument from "./components/Details/DetailsDocument.vue";
import DetailsDocuments from "./components/Details/DetailsDocuments.vue";
import DetailsFeedItem from "./components/Details/DetailsFeedItem.vue";
import DetailsFolder from "./components/Details/DetailsFolder.vue";
import DocumentsList from "./components/DocumentsList.vue";
import FeedItemsList from "./components/FeedItemsList.vue";
import FoldersTree from "./components/FoldersTree.vue";
import { collect } from "collect.js";
createApp({
components: {
DetailsDocument,
DetailsDocuments,
DetailsFeedItem,
DetailsFolder,
DocumentsList,
FeedItemsList,
FoldersTree,
},
data: function () {
return {
detailsViewComponent: null,
showFeedItemsList: false,
};
},
mounted: function () {
const self = this;
self.listenToBroadcast();
},
computed: {
...mapGetters({
selectedFolder: "folders/selectedFolder",
documents: "documents/documents",
selectedDocuments: "documents/selectedDocuments",
feedItems: "feedItems/feedItems",
selectedFeedItems: "feedItems/selectedFeedItems",
getUnreadItemsFolder: "folders/getUnreadItemsFolder",
selectedGroup: "groups/selectedGroup",
}),
},
watch: {
selectedFolder: function (oldFolder, newFolder) {
const self = this;
if (newFolder) {
self.detailsViewComponent = "details-folder";
}
},
selectedDocuments: function (documents) {
const self = this;
if (documents && documents.length > 0) {
if (documents.length === 1) {
self.detailsViewComponent = "details-document";
} else {
self.detailsViewComponent = "details-documents";
}
} else {
self.detailsViewComponent = "details-folder";
}
},
selectedFeedItems: function (feedItems) {
const self = this;
if (feedItems && feedItems.length > 0) {
if (feedItems.length === 1) {
self.detailsViewComponent = "details-feed-item";
} else {
//TODO: Handle multiple selected feed items ?
self.detailsViewComponent = null;
}
} else {
if (
self.selectedDocuments &&
self.selectedDocuments.length > 0
) {
self.detailsViewComponent = "details-document";
} else {
self.detailsViewComponent = "details-folder";
}
}
},
feedItems: function (value) {
this.showFeedItemsList = value && collect(value).count() > 0;
},
},
methods: {
...mapActions({
showFolder: "folders/show",
indexFolders: "folders/index",
selectDocuments: "documents/selectDocuments",
indexDocuments: "documents/index",
dropIntoFolder: "folders/dropIntoFolder",
selectFeedItems: "feedItems/selectFeedItems",
markFeedItemsAsRead: "feedItems/markAsRead",
updateDocument: "documents/update",
deleteDocuments: "documents/destroy",
updateFolder: "folders/updateProperties",
showGroup: "groups/show",
updateGroup: "groups/updateProperties",
resetUnreadCount: "folders/resetUnreadCount",
updateUnreadFeedItemsCount: "feedItems/updateUnreadFeedItemsCount",
}),
/**
* Listen to broadcast events
*/
listenToBroadcast: function () {
const self = this;
const userId = document
.querySelector('meta[name="user-id"]')
.getAttribute("content");
window.Echo.private("App.Models.User." + userId).notification(
(notification) => {
switch (notification.type) {
case "App\\Notifications\\UnreadItemsChanged":
self.updateUnreadFeedItemsCount(notification);
self.showFolder({
deselectDocuments: false,
updateFeedItems: true,
});
break;
case "App\\Notifications\\DocumentUpdated":
self.updateDocument({
documentId: notification.document.id,
newProperties: notification.document,
});
break;
}
}
);
},
/**
* User-action - Selected group has changed
* @param {*} group
*/
onSelectedGroupChanged: function (group) {
const self = this;
self.showGroup({ group: group, folder: "unread_items" });
},
/**
* Groups have been loaded
*/
onGroupsLoaded: function () {
//
},
/**
* Folders tree has been loaded
*/
onFoldersLoaded: function () {
//
},
/**
* User-action - Selected folder has changed
* @param {*} folder
*/
onSelectedFolderChanged: function (folder, group) {
const self = this;
if (!folder) {
return;
}
if (group && group != self.selectedGroup.id) {
self.showGroup({ group, folder });
} else {
self.showFolder({ folder });
}
self.detailsViewComponent = "details-folder";
},
/**
* User-action - Something has been dropped into a folder
*/
onItemDropped: function (folder) {
const self = this;
self.dropIntoFolder(folder);
},
/**
* User-action - Selected documents has changed
*/
onSelectedDocumentsChanged: function (documents) {
const self = this;
self.selectDocuments({ documents: documents });
if (self.feedItems.length > 0) {
document.getElementById("feed-items-list").scrollTop = 0;
}
},
/**
* User-action - Refresh documents list after adding one
*/
onDocumentAdded: function () {
//
},
/**
* User-action - Refresh documents list after deleting one (or more)
*/
onDocumentsDeleted: function ({ folder, documents }) {
const self = this;
self.deleteDocuments({
documents: documents,
folder: folder,
});
},
/**
* User-action - Selected feed items has changed
*/
onSelectedFeedItemsChanged: function (feedItems) {
const self = this;
self.selectFeedItems(feedItems);
},
/**
* User-action - Feed items marked as read
*/
onFeedItemsRead: function (data) {
const self = this;
self.markFeedItemsAsRead(data);
},
},
})
.mixin(mixins)
.use(store)
.mount("#app");