Skip to content
Snippets Groups Projects
NavigationFolder.vue 3.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • <!--
      - @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
      -
      - @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
      -
      - @license GNU AGPL version 3 or any later version
      -
      - This program is free software: you can redistribute it and/or modify
      - it under the terms of the GNU Affero General Public License as
      - published by the Free Software Foundation, either version 3 of the
      - License, or (at your option) any later version.
      -
      - This program is distributed in the hope that it will be useful,
      - but WITHOUT ANY WARRANTY; without even the implied warranty of
      - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      - GNU Affero General Public License for more details.
      -
      - You should have received a copy of the GNU Affero General Public License
      - along with this program.  If not, see <http://www.gnu.org/licenses/>.
      -->
    
    <template>
    
    	<AppNavigationItem :item="data" :menu-open.sync="menuOpen" />
    
    </template>
    
    <script>
    import {AppNavigationItem} from 'nextcloud-vue'
    
    import {translate as translateMailboxName} from '../l10n/MailboxTranslator'
    
    import {getFolderStats} from '../service/FolderService'
    
    
    export default {
    	name: 'NavigationFolder',
    	components: {
    		AppNavigationItem,
    	},
    	props: {
    		account: {
    			type: Object,
    			required: true,
    		},
    		folder: {
    			type: Object,
    			required: true,
    		},
    	},
    
    	data() {
    		return {
    			menuOpen: false,
    			loadingFolderStats: true,
    			folderStats: undefined,
    		}
    	},
    
    			return this.folderToEntry(this.folder, true)
    		},
    	},
    	watch: {
    		menuOpen() {
    			// Fetch current stats when the menu is opened
    			if (this.menuOpen) {
    				this.fetchFolderStats()
    			}
    
    		folderToEntry(folder, top) {
    
    			let icon = 'folder'
    			if (folder.specialRole) {
    				icon = folder.specialRole
    			}
    
    
    			const actions = []
    			if (top) {
    				if (this.loadingFolderStats) {
    					actions.push({
    						icon: 'icon-info',
    						text: atob(this.folder.id),
    						longtext: t('mail', 'Loading …'),
    					})
    				} else {
    					actions.push({
    						icon: 'icon-info',
    						text: atob(this.folder.id),
    						longtext: t('mail', '{total} messages ({unread} unread)', {
    							total: this.folderStats.total,
    							unread: this.folderStats.unread,
    						}),
    					})
    				}
    
    				actions.push({
    					icon: 'icon-add',
    					text: t('mail', 'Add subfolder'),
    					input: 'text',
    					action: this.createFolder,
    				})
    			}
    
    
    			return {
    				id: 'account' + this.account.id + '_' + folder.id,
    				key: 'account' + this.account.id + '_' + folder.id,
    				text: translateMailboxName(folder),
    				icon: 'icon-' + icon,
    				router: {
    					name: 'folder',
    					params: {
    						accountId: this.account.id,
    						folderId: folder.id,
    					},
    					exact: false,
    				},
    				utils: {
    
    					counter: folder.unread,
    				},
    				collapsible: true,
    				opened: folder.opened,
    
    				children: folder.folders.map(folder => this.folderToEntry(folder, false)),
    
    		fetchFolderStats() {
    			this.loadingFolderStats = true
    
    			getFolderStats(this.account.id, this.folder.id)
    				.then(stats => {
    					console.debug('loaded folder stats', stats)
    					this.folderStats = stats
    
    					this.loadingFolderStats = false
    				})
    				.catch(console.error.bind(this))
    		},
    		createFolder(e) {
    			const name = e.target.elements[0].value
    			const withPrefix = atob(this.folder.id) + this.folder.delimiter + name
    			console.info(`creating folder ${withPrefix} as subfolder of ${this.folder.id}`)
    			this.menuOpen = false
    			this.$store
    				.dispatch('createFolder', {account: this.account, name: withPrefix})
    				.then(() => console.info(`folder ${withPrefix} created`))
    				.catch(e => {
    					console.error(`could not create folder ${withPrefix}`, e)
    					throw e
    				})
    		},