metadata-based-explorer1
Version:
Box UI Elements
129 lines (115 loc) • 4.16 kB
JavaScript
/**
*
* @file Item list component
* @author Box
*/
import React from 'react';
import classNames from 'classnames';
import { injectIntl } from 'react-intl';
import MultiGrid from 'react-virtualized/dist/es/MultiGrid/MultiGrid';
import AutoSizer from 'react-virtualized/dist/es/AutoSizer';
import { getFileExtension } from '../../utils/file';
import FileIcon from '../../icons/file-icon';
import '../../elements/content-explorer/ItemList.scss';
import './MetadataBasedItemList.scss';
var FILENAME_COLUMN_WIDTH = 350;
var METADATA_MIN_COLUMN_WIDTH = 250;
var itemCollection;
var metadataColumns;
var getFileIcon = function getFileIcon() {
var filename = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
var ext = getFileExtension(filename);
return ext ? React.createElement(FileIcon, {
dimension: 32,
extension: ext
}) : React.createElement(FileIcon, {
dimension: 32
});
};
var getColumnWidth = function getColumnWidth(width) {
var availableWidth = width - FILENAME_COLUMN_WIDTH; // Maintain min column width, else occupy the rest of the space equally
var mdColumnWidth = Math.max(availableWidth / metadataColumns.length, METADATA_MIN_COLUMN_WIDTH);
return function (_ref) {
var index = _ref.index;
return index === 0 ? 350 : mdColumnWidth;
};
};
var getGridHeader = function getGridHeader(columnIndex) {
if (columnIndex === 0) {
// fixed column filename header
return React.createElement("span", null, "Name");
}
return React.createElement("span", null, metadataColumns[columnIndex - 1]);
};
var getGridCell = function getGridCell(columnIndex, rowIndex) {
var items = itemCollection.items;
var item = items[rowIndex];
if (columnIndex === 0) {
// fixed column for filename
return React.createElement("div", {
className: "mv-grid-cell-fileinfo"
}, getFileIcon(item.name), React.createElement("span", null, item.name));
}
var _items$rowIndex$metad = items[rowIndex].metadata,
metadata = _items$rowIndex$metad === void 0 ? {} : _items$rowIndex$metad;
var data = metadata.data;
var mdFieldName = metadataColumns[columnIndex - 1];
return React.createElement("div", null, data[mdFieldName]);
};
var cellRenderer = function cellRenderer(_ref2) {
var columnIndex = _ref2.columnIndex,
key = _ref2.key,
rowIndex = _ref2.rowIndex,
style = _ref2.style;
if (rowIndex === 0) {
// Render Header
var displayName = getGridHeader(columnIndex);
var headerClass = classNames('mv-column-header', {
'mv-column-header-filename': columnIndex === 0
});
return React.createElement("button", {
className: headerClass,
type: "button",
style: style
}, displayName);
} // Render data
var cellData = getGridCell(columnIndex, rowIndex - 1);
return React.createElement("div", {
key: key,
className: "mv-grid-cell",
style: style
}, cellData);
};
var MetadataBasedItemList = function MetadataBasedItemList(_ref3) {
var currentCollection = _ref3.currentCollection,
metadataColumnsToShow = _ref3.metadataColumnsToShow;
var rowCount = currentCollection.items ? currentCollection.items.length : 0;
itemCollection = currentCollection;
metadataColumns = metadataColumnsToShow;
return React.createElement(AutoSizer, null, function (_ref4) {
var width = _ref4.width,
height = _ref4.height;
return React.createElement("div", {
className: "mv-item-grid"
}, React.createElement(MultiGrid, {
cellRenderer: cellRenderer,
classNameBottomLeftGrid: "mv-bottom-left-grid",
classNameTopLeftGrid: "mv-top-left-grid",
classNameTopRightGrid: "mv-top-right-grid",
columnCount: metadataColumnsToShow.length + 1,
columnWidth: getColumnWidth(width),
enableFixedColumnScroll: true,
fixedColumnCount: 1,
fixedRowCount: 1,
height: height,
hideBottomLeftGridScrollbar: true,
hideTopRightGridScrollbar: true,
rowCount: rowCount + 1,
rowHeight: 50,
scrollToColumn: 0,
scrollToRow: 0,
width: width
}));
});
};
export default injectIntl(MetadataBasedItemList);