Your search did not match any results.
File Manager

Toolbar and Context Menu

The FileManager widget provides the following UI customization options:

  • The toolbar option specifies the toolbar's visibility and available commands.
  • The contextMenu option specifies the context menu's availability and its commands.

The toolbar and context menu support context-invariant and context-sensitive items that can be visible or hidden depending on user action.

Copy to CodeSandBox
Apply
Reset
<template> <DxFileManager ref="fileManager" :file-system-provider="fileItems" @context-menu-item-click="onItemClick" :height="450" > <DxPermissions :create="true" :copy="true" :move="true" :delete="true" :rename="true" /> <DxItemView :show-parent-folder="false" > <DxDetails> <DxColumn data-field="thumbnail"/> <DxColumn data-field="name"/> <DxColumn data-field="category" caption="Category" :width="95" /> <DxColumn data-field="dateModified"/> <DxColumn data-field="size"/> </DxDetails> </DxItemView> <DxToolbar> <DxItem name="showNavPane" :visible="true" /> <DxItem name="separator"/> <DxItem name="create"/> <DxItem widget="dxMenu" location="before" :options="newFileMenuOptions" /> <DxItem name="refresh"/> <DxItem name="separator" location="after" /> <DxItem name="switchView"/> <DxFileSelectionItem name="rename"/> <DxFileSelectionItem name="separator"/> <DxFileSelectionItem name="delete"/> <DxFileSelectionItem name="separator"/> <DxFileSelectionItem widget="dxMenu" location="before" :options="changeCategoryMenuOptions" /> <DxFileSelectionItem name="refresh"/> <DxFileSelectionItem name="clearSelection"/> </DxToolbar> <DxContextMenu> <DxItem name="create"/> <DxItem text="Create new file" icon="plus" > <DxItem text="Text Document" :options="{ extension: '.txt' }" /> <DxItem text="RTF Document" :options="{ extension: '.rtf' }" /> <DxItem text="Spreadsheet" :options="{ extension: '.xls' }" /> </DxItem> <DxItem name="rename" :begin-group="true" /> <DxItem name="delete"/> <DxItem text="Category" icon="tags" :begin-group="true" > <DxItem text="Work" :options="{ category: 'Work' }" /> <DxItem text="Important" :options="{ category: 'Important' }" /> <DxItem text="Home" :options="{ category: 'Home' }" /> <DxItem text="None" :options="{ category: '' }" /> </DxItem> </DxContextMenu> </DxFileManager> </template> <script> import { DxFileManager, DxPermissions, DxToolbar, DxContextMenu, DxItem, DxFileSelectionItem, DxItemView, DxDetails, DxColumn } from 'devextreme-vue/file-manager'; import { fileItems } from './data.js'; export default { components: { DxFileManager, DxPermissions, DxToolbar, DxContextMenu, DxItem, DxFileSelectionItem, DxItemView, DxDetails, DxColumn }, data() { return { fileItems, newFileMenuOptions: this.getNewFileMenuOptions(), changeCategoryMenuOptions: this.getChangeCategoryMenuOptions() }; }, methods: { onItemClick({ itemData, viewArea, fileSystemItem }) { let updated = false; const extension = itemData.options ? itemData.options.extension : undefined; const category = itemData.options ? itemData.options.category : undefined; if(extension) { updated = this.createFile(extension, fileSystemItem); } else if(category !== undefined) { updated = this.updateCategory(category, fileSystemItem, viewArea); } if(updated) { this.$refs.fileManager.instance.refresh(); } }, createFile(fileExtension, directory) { var newItem = { __KEY__: Date.now(), name: `New file${ fileExtension}`, isDirectory: false, size: 0 }; directory = directory || this.$refs.fileManager.instance.getCurrentDirectory(); if(!directory.isDirectory) { return false; } var array = null; if(!directory.dataItem) { array = this.fileItems; } else { array = directory.dataItem.items; if(!array) { directory.dataItem.items = array = []; } } array.push(newItem); return true; }, updateCategory(newCategory, directory, viewArea) { var items = null; if(viewArea === 'navPane') { items = [ directory ]; } else { items = this.$refs.fileManager.instance.getSelectedItems(); } items.forEach(function(item) { if(item.dataItem) { item.dataItem.category = newCategory; } }); return items.length > 0; }, getNewFileMenuOptions: function() { return { items: [ { text: 'Create new file', icon: 'plus', items: [ { text: 'Text Document', options: { extension: '.txt', } }, { text: 'RTF Document', options: { extension: '.rtf', } }, { text: 'Spreadsheet', options: { extension: '.xls', } } ] } ], onItemClick: this.onItemClick }; }, getChangeCategoryMenuOptions: function() { return { items: [ { text: 'Category', icon: 'tags', items: [ { text: 'Work', options: { category: 'Work' } }, { text: 'Important', options: { category: 'Important' } }, { text: 'Home', options: { category: 'Home' } }, { text: 'None', options: { category: '' } } ] } ], onItemClick: this.onItemClick }; } } }; </script>
import Vue from 'vue'; import App from './App.vue'; new Vue({ el: '#app', components: { App }, template: '<App/>' });
<!DOCTYPE html> <html> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/20.1.8/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/20.1.8/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import('./index.js'); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"> <span v-if="false">Loading...</span> </div> </div> </body> </html>
export const fileItems = [{ 'name': 'Documents', 'isDirectory': true, 'category': 'Work', 'items': [{ 'name': 'Projects', 'isDirectory': true, 'category': 'Work', 'items': [{ 'name': 'About.rtf', 'isDirectory': false, 'size': 1024 }, { 'name': 'Passwords.rtf', 'isDirectory': false, 'category': 'Important', 'size': 2048 }] }, { 'name': 'About.xml', 'isDirectory': false, 'size': 1024 }, { 'name': 'Managers.rtf', 'isDirectory': false, 'size': 2048 }, { 'name': 'ToDo.txt', 'isDirectory': false, 'size': 3072 }], }, { 'name': 'Images', 'isDirectory': true, 'category': 'Home', 'items': [{ 'name': 'logo.png', 'isDirectory': false, 'size': 20480 }, { 'name': 'banner.gif', 'isDirectory': false, 'size': 10240 }] }, { 'name': 'System', 'isDirectory': true, 'category': 'Important', 'items': [{ 'name': 'Employees.txt', 'isDirectory': false, 'category': 'Important', 'size': 3072 }, { 'name': 'PasswordList.txt', 'isDirectory': false, 'category': 'Important', 'size': 5120 }] }, { 'name': 'Description.rtf', 'isDirectory': false, 'size': 1024 }, { 'name': 'Description.txt', 'isDirectory': false, 'size': 2048 }];
System.config({ transpiler: 'plugin-babel', meta: { '*.vue': { loader: 'vue-loader' }, }, paths: { 'npm:': 'https://unpkg.com/' }, map: { 'vue': 'npm:vue@2.6.3/dist/vue.esm.browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@latest/index.js', 'devextreme': 'npm:devextreme@20.1', 'devextreme-vue': 'npm:devextreme-vue@20.1', 'jszip': 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram@1.0.17', 'devexpress-gantt': 'npm:devexpress-gantt@1.0.10', 'plugin-babel': 'npm:systemjs-plugin-babel@0/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0/systemjs-babel-browser.js' }, packages: { 'devextreme-vue': { main: 'index.js' }, 'devextreme': { defaultExtension: 'js' }, 'devextreme/events/utils': { main: 'index' }, 'devextreme/events': { main: 'index' }, }, babelOptions: { sourceMaps: false, stage0: true } });