var _ = require('underscore'); var vent = require('vent'); var Marionette = require('marionette'); var Backgrid = require('backgrid'); var FileBrowserCollection = require('./FileBrowserCollection'); var EmptyView = require('./EmptyView'); var FileBrowserRow = require('./FileBrowserRow'); var FileBrowserTypeCell = require('./FileBrowserTypeCell'); var FileBrowserNameCell = require('./FileBrowserNameCell'); var RelativeDateCell = require('../../Cells/RelativeDateCell'); var FileSizeCell = require('../../Cells/FileSizeCell'); var LoadingView = require('../LoadingView'); require('../../Mixins/DirectoryAutoComplete'); module.exports = Marionette.Layout.extend({ template : 'Shared/FileBrowser/FileBrowserLayoutTemplate', regions : { browser : '#x-browser' }, ui : { path : '.x-path', indicator : '.x-indicator' }, events : { 'typeahead:selected .x-path' : '_pathChanged', 'typeahead:autocompleted .x-path' : '_pathChanged', 'keyup .x-path' : '_inputChanged', 'click .x-ok' : '_selectPath' }, initialize : function(options) { this.collection = new FileBrowserCollection(); this.collection.showFiles = options.showFiles || false; this.collection.showLastModified = options.showLastModified || false; this.input = options.input; this._setColumns(); this.listenTo(this.collection, "sync", this._showGrid); this.listenTo(this.collection, "filebrowser:folderselected", this._rowSelected); }, onRender : function() { this.browser.show(new LoadingView()); this.ui.path.directoryAutoComplete(); this._fetchCollection(this.input.val()); this._updatePath(this.input.val()); }, _setColumns : function() { this.columns = [ { name : "type", label : "", sortable : false, cell : FileBrowserTypeCell }, { name : "name", label : "Name", sortable : false, cell : FileBrowserNameCell } ]; if (this.collection.showLastModified) { this.columns.push({ name : "lastModified", label : "Last Modified", sortable : false, cell : RelativeDateCell }); } if (this.collection.showFiles) { this.columns.push({ name : "size", label : "Size", sortable : false, cell : FileSizeCell }); } }, _fetchCollection : function(path) { this.ui.indicator.show(); var data = { includeFiles : this.collection.showFiles }; if (path) { data.path = path; } this.collection.fetch({ data : data }); }, _showGrid : function() { this.ui.indicator.hide(); if (this.collection.models.length === 0) { this.browser.show(new EmptyView()); return; } var grid = new Backgrid.Grid({ row : FileBrowserRow, collection : this.collection, columns : this.columns, className : "table table-hover" }); this.browser.show(grid); }, _rowSelected : function(model) { var path = model.get("path"); this._updatePath(path); this._fetchCollection(path); }, _pathChanged : function(e, path) { this._fetchCollection(path.value); this._updatePath(path.value); }, _inputChanged : function() { var path = this.ui.path.val(); if (path === "" || path.endsWith("\\") || path.endsWith("/")) { this._fetchCollection(path); } }, _updatePath : function(path) { if (path !== undefined || path !== null) { this.ui.path.val(path); } }, _selectPath : function() { this.input.val(this.ui.path.val()); this.input.trigger("change"); vent.trigger(vent.Commands.CloseFileBrowser); } });