@bigfishtv/cockpit
Version:
890 lines (798 loc) • 29.9 kB
JavaScript
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _dec, _class, _class2, _temp, _class2$propTypes;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { createValue } from '@bigfishtv/react-forms';
import { connect } from 'react-redux';
import { Cell } from 'fixed-data-table';
import { get, post } from '../../api/xhrUtils';
import debounce from 'lodash/debounce';
import isEqual from 'lodash/isEqual';
import throttle from 'lodash/throttle';
import { Grid, AutoSizer } from 'react-virtualized';
import { addFile, getUploader } from '../../api/tankUpload';
import { stringContains } from '../../utils/stringUtils';
import { showPrompt } from '../../utils/promptUtils';
import { modalHandler } from '../modal/ModalHost';
import { isCtrlKeyPressed, isShiftKeyPressed } from '../../utils/selectKeyUtils';
import { openImageEditModal } from '../../utils/imageEditUtils';
import Spinner from '../Spinner';
import FileDropzone from '../container/FileDropzone';
import AssetFinderSidebarTree from '../asset/AssetFinderSidebarTree';
import AssetsToolbar from '../asset/AssetFinderToolbar';
import FilterInput from '../input/SearchInput';
import Panel from '../container/panel/Panel';
import AssetAutoCell from '../asset/AssetAutoCell';
import FixedDataTable from '../table/FixedDataTable';
import FixedDataTableDateCell from '../table/cell/FixedDataTableDateCell';
import AssetEditModal from '../asset/AssetEditModal';
import MediaPreviewModal from '../asset/MediaPreviewModal';
import Checkbox from '../input/Checkbox';
import Button from '../button/Button';
var TableCellImage = function TableCellImage(props) {
var asset = props.data[props.rowIndex];
return React.createElement(AssetAutoCell, { asset: asset, toolbar: false, size: 'cockpit-tiny', cellSize: 'small' });
};
var TableCellUrl = function TableCellUrl(props) {
var url = '/uploads/' + props.data[props.rowIndex]['filename'];
return React.createElement(
Cell,
props,
React.createElement(
'a',
{ href: url, target: '_blank' },
url
)
);
};
var fields = [{
key: 'preview',
Cell: TableCellImage,
fixed: true,
width: 66
}, {
key: 'title',
width: 350
}, {
key: 'title',
value: 'URL',
Cell: TableCellUrl,
width: 350
}, {
key: 'kind',
value: 'File Type',
width: 100
}, {
key: 'credit',
value: 'Credit',
width: 200
}, {
key: 'reference_count',
value: 'Usage',
width: 110,
sortType: 'numeric'
}, {
key: 'modified',
value: 'Date Modified',
width: 160,
Cell: FixedDataTableDateCell
}, {
key: 'created',
value: 'Date Created',
width: 160,
Cell: FixedDataTableDateCell
}];
var minCellWidth = 150;
var minCellHeight = 150;
var gridSpacing = 10; // should be evenly divisible by 2
/**
* This is a monster component that is basically the media gallery.
* It contains a tree sidebar for folder selection and has a grid/list view mode for display assets, along with basic filtering of file type and query string.
*/
var AssetFinder = (_dec = connect(function (state) {
return _extends({}, state.route.props);
}), _dec(_class = (_temp = _class2 = function (_Component) {
_inherits(AssetFinder, _Component);
function AssetFinder(props) {
_classCallCheck(this, AssetFinder);
var _this = _possibleConstructorReturn(this, _Component.call(this));
_this.handleResize = function () {
var boundingRect = ReactDOM.findDOMNode(_this.refs.finderContent).getBoundingClientRect();
var contentWidth = boundingRect.width;
var contentHeight = window.innerHeight - _this.props.negativeHeight;
_this.setState({ contentWidth: contentWidth, contentHeight: contentHeight });
};
_this.doGlobalSearch = throttle(_this._doGlobalSearch, 500, { leading: false });
_this.handleGlobalSearchToggle = function (checked) {
if (_this.props.onGlobalSearchToggle) {
_this.props.onGlobalSearchToggle(checked);
}
console.log('handle', checked);
_this.setState({ globalSearch: checked, allAssets: [], assets: [] }, function () {
// if(this.props.uncontrolled) {
// }else{
// }
});
};
_this.handleFolderChange = function (currentFolder) {
if (!_this.props.uncontrolled) {
_this.props.onFolderChange(currentFolder);
}
_this.setState({
currentFolder: currentFolder,
currentFolderId: currentFolder ? currentFolder.id : null,
selectedAssets: []
}, function () {
if (_this.props.uncontrolled) {
_this.getAssetsByFolderId();
} else {
_this.buildFilters(_this.state.filters);
}
});
};
_this.handleMoveAssetsToFolder = function (folderId, assetIds) {
var _this$state = _this.state,
selectedAssets = _this$state.selectedAssets,
currentFolderId = _this$state.currentFolderId;
var selectedAssetIds = selectedAssets.map(function (asset) {
return asset.id;
});
if (assetIds.length === 1 && selectedAssetIds.indexOf(assetIds[0]) >= 0) assetIds = selectedAssetIds;
var affectedAssets = _this.state.allAssets.filter(function (asset) {
return assetIds.indexOf(asset.id) >= 0;
});
var allAssets = _this.state.allAssets.map(function (asset) {
if (assetIds.indexOf(asset.id) >= 0) asset.folder_id = folderId;
return asset;
});
_this.setState({ allAssets: allAssets }, function () {
_this.filterAssets();
});
var changes = affectedAssets.map(function (asset) {
return { id: asset.id, folder_id: folderId };
});
post({
url: _this.props.assetMoveUrl,
successMessage: 'Moved asset(s) successfully',
failureMessage: 'Failed to move asset(s)',
data: { assets: changes, folder_id: currentFolderId },
callback: function callback(allAssets) {
return _this.setState({ allAssets: allAssets }, function () {
_this.filterAssets();
});
}
});
};
_this.handleAssetSelect = function (asset) {
var _this$props = _this.props,
multiple = _this$props.multiple,
allowSelection = _this$props.allowSelection,
stickySelect = _this$props.stickySelect;
if (!allowSelection) return;
var selectedAssets = _this.state.selectedAssets;
if (!multiple || !isCtrlKeyPressed() && !isShiftKeyPressed()) {
selectedAssets = selectedAssets.length === 1 && selectedAssets[0].id === asset.id && !stickySelect ? [] : [asset];
} else if (isCtrlKeyPressed()) {
var exists = selectedAssets.filter(function (item) {
return item.id === asset.id;
}).length > 0;
selectedAssets = exists ? selectedAssets.filter(function (item) {
return item.id !== asset.id;
}) : [].concat(selectedAssets, [asset]);
} else if (isShiftKeyPressed()) {
var assets = _this.state.assets;
var lastIndex = assets.indexOf(_this.lastSelectedAsset);
var nextIndex = assets.indexOf(asset);
var lower = Math.min(lastIndex, nextIndex);
var upper = Math.max(lastIndex, nextIndex);
var lastSelectedListIds = _this.lastSelectedList.map(function (item) {
return item.id;
});
selectedAssets = [].concat(_this.lastSelectedList, assets.filter(function (item, i) {
return i >= lower && i <= upper && lastSelectedListIds.indexOf(item.id) < 0;
}));
}
_this.lastSelectedAsset = asset;
_this.lastSelectedList = selectedAssets.slice();
if (!_this.props.uncontrolled) {
_this.props.onSelectionChange(selectedAssets);
} else {
_this.setState({ selectedAssets: selectedAssets });
}
};
_this.handleAssetSelection = function (asset) {
var selectedAssets = _this.state.selectedAssets;
if (_this.props.onSelected) {
if (selectedAssets.length) _this.props.onSelected(selectedAssets);
} else {
_this.handleAssetDetailsEdit(asset);
}
};
_this.handleAssetUpdate = function (asset) {
var found = false;
var allAssets = _this.state.allAssets;
for (var i = i; i < allAssets.length; i++) {
if (allAssets[i].id === asset.id) {
allAssets = allAssets.splice(i, 1, [asset]);
found = true;
break;
}
}
if (!found) {
allAssets = [].concat(allAssets, [asset]);
}
_this.setState({ allAssets: allAssets }, function () {
_this.filterAssets();
});
};
_this.deleteSelectedAssets = function () {
showPrompt({
title: 'Delete Asset',
message: React.createElement(
'div',
null,
React.createElement(
'p',
null,
'Are you sure you want to delete selected asset(s)?'
)
),
callback: function callback(response) {
if (response === true) {
var selectedIds = _this.state.selectedAssets.map(function (asset) {
return asset.id;
});
var allAssets = _this.state.allAssets.filter(function (item) {
return selectedIds.indexOf(item.id) < 0;
});
_this.setState({ allAssets: allAssets }, function () {
_this.filterAssets();
});
_this.deleteAssets(selectedIds);
}
}
});
};
_this.handleReceivedFiles = function (files) {
var currentFolderId = _this.state.currentFolderId;
for (var _iterator = files, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var file = _ref;
var fileId = addFile(file, currentFolderId);
var allAssets = [].concat(_this.state.allAssets, [{
id: fileId,
pending: true,
folder_id: currentFolderId
}]);
_this.setState({ allAssets: allAssets }, function () {
_this.filterAssets();
});
}
};
_this.handleFileUploaded = function (uploader, file, response) {
if (response.status !== 200) return;
var returnedAsset = JSON.parse(response.response);
var allAssets = _this.state.allAssets.map(function (asset) {
if (asset.pending && asset.id === file.id) {
return _extends({}, returnedAsset, {
folder_id: asset.folder_id
});
}
return asset;
});
_this.setState({ allAssets: allAssets }, function () {
_this.filterAssets();
});
};
_this.state = {
viewMode: props.viewMode,
filters: props.filters,
assetType: props.assetType,
finalFilters: [],
query: props.query,
queryFields: props.queryFields,
globalSearch: props.globalSearch,
currentFolderId: props.currentFolderId,
currentFolder: null,
allAssets: [],
assets: [],
selectedAssets: [],
contentWidth: 600,
loadingAssets: false,
errorLoadingAssets: false
};
_this.lastSelectedAsset = null;
_this.lastSelectedList = [];
_this.handleResize = debounce(_this.handleResize, 200);
return _this;
}
AssetFinder.prototype.componentDidMount = function componentDidMount() {
window.addEventListener('resize', this.handleResize);
this.handleResize();
if (getUploader()) getUploader().bind('FileUploaded', this.handleFileUploaded, this);
if (this.props.globalSearch) {
this.doGlobalSearch();
} else if (this.props.currentFolderId) {
this.getAssetsByFolderId();
}
};
AssetFinder.prototype.componentWillUnmount = function componentWillUnmount() {
window.removeEventListener('resize', this.handleResize);
};
AssetFinder.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
var _this2 = this;
Object.keys(nextProps).map(function (key) {
if (key in _this2.state && !isEqual(nextProps[key], _this2.state[key])) {
var _this2$setState;
if (key === 'currentFolderId') _this2.setState({ allAssets: [], assets: [] });
_this2.setState((_this2$setState = {}, _this2$setState[key] = nextProps[key], _this2$setState), function () {
if (key == 'filters') {
_this2.buildFilters(nextProps[key]);
} else if (key == 'query') {
if (_this2.state.globalSearch) {
_this2.doGlobalSearch();
} else {
_this2.filterAssets();
}
} else if (key == 'currentFolderId') {
_this2.getAssetsByFolderId();
} else if (key === 'globalSearch') {
if (_this2.state.globalSearch) {
_this2.doGlobalSearch();
} else {
_this2.getAssetsByFolderId();
}
}
});
} else if (key == 'receivedFiles' && !isEqual(nextProps[key], _this2.props[key])) {
_this2.handleReceivedFiles(nextProps[key]);
}
});
};
AssetFinder.prototype.getAssetsByFolderId = function getAssetsByFolderId() {
var _this3 = this;
this.setState({ loadingAssets: true, errorLoadingAssets: false, allAssets: [], assets: [] });
var currentFolderId = this.props.currentFolderId || null;
get({
url: this.props.assetGetUrl + '?folder_id=' + (currentFolderId !== null ? currentFolderId : ''),
subject: 'assets',
callback: function callback(allAssets) {
return _this3.setState({ allAssets: allAssets, loadingAssets: false, errorLoadingAssets: false }, function () {
_this3.buildFilters(_this3.state.filters);
});
},
callbackError: function callbackError() {
_this3.setState({ loadingAssets: false, errorLoadingAssets: true });
console.warn('Failed to load assets');
}
});
};
AssetFinder.prototype._doGlobalSearch = function _doGlobalSearch() {
var _this4 = this;
var query = this.state.query;
if (query.length <= 3) return;
this.setState({ loadingAssets: true, errorLoadingAssets: false, allAssets: [], assets: [] });
get({
url: this.props.assetGetUrl + '?q=' + query,
subject: 'assets',
callback: function callback(allAssets) {
return _this4.setState({ allAssets: allAssets, loadingAssets: false, errorLoadingAssets: false }, function () {
// this.buildFilters(this.state.filters)
_this4.filterAssets();
});
},
callbackError: function callbackError() {
_this4.setState({ loadingAssets: false, errorLoadingAssets: true });
console.warn('Failed to load assets');
}
});
};
AssetFinder.prototype.filterAssets = function filterAssets() {
var _this5 = this;
var assets = this.state.allAssets.filter(function (asset) {
var filterPass = true;
for (var _iterator2 = _this5.state.finalFilters, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
var _ref2;
if (_isArray2) {
if (_i2 >= _iterator2.length) break;
_ref2 = _iterator2[_i2++];
} else {
_i2 = _iterator2.next();
if (_i2.done) break;
_ref2 = _i2.value;
}
var filter = _ref2;
if (filter.value !== null && filter.property in asset && asset[filter.property] !== filter.value) filterPass = false;
}
var queryPass = false;
if (!_this5.state.globalSearch && _this5.state.query !== null && _this5.state.query !== '') {
for (var _iterator3 = _this5.state.queryFields, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
var _ref3;
if (_isArray3) {
if (_i3 >= _iterator3.length) break;
_ref3 = _iterator3[_i3++];
} else {
_i3 = _iterator3.next();
if (_i3.done) break;
_ref3 = _i3.value;
}
var queryField = _ref3;
if (queryField in asset && asset[queryField] !== null && stringContains(asset[queryField], _this5.state.query)) queryPass = true;
}
} else {
queryPass = true;
}
return filterPass && queryPass;
});
this.setState({ assets: assets });
};
AssetFinder.prototype.buildFilters = function buildFilters(prevFilters) {
var _this6 = this;
var finalFilters = [].concat(prevFilters);
this.setState({ finalFilters: finalFilters }, function () {
_this6.filterAssets();
});
};
// triggered on asset click
AssetFinder.prototype.handleAssetEdit = function handleAssetEdit(asset) {
openImageEditModal(asset, this.handleAssetUpdate);
};
AssetFinder.prototype.handleAssetPlay = function handleAssetPlay(asset) {
modalHandler.add({ Component: MediaPreviewModal, props: { asset: asset } });
};
AssetFinder.prototype.handleAssetDetailsEdit = function handleAssetDetailsEdit(asset) {
var _this7 = this;
modalHandler.add({
Component: AssetEditModal,
props: {
formValue: createValue({
schema: null,
value: { asset: asset }
}),
onSave: function onSave(formValue) {
return _this7.handleAssetSave(formValue.select('asset').value);
},
onClose: function onClose() {},
// onEdit: () => this.handleAssetEdit(asset),
onDelete: function onDelete(callback) {
return _this7.handleAssetDelete(asset, callback);
},
onUpdate: function onUpdate(asset) {
return _this7.handleAssetUpdate(asset);
}
}
});
};
AssetFinder.prototype.handleAssetSave = function handleAssetSave(asset) {
var _this8 = this;
post({
url: this.props.assetUpdateUrl + '/' + asset.id + '.json',
data: asset,
subject: 'asset',
callback: function callback(newAsset) {
return _this8.handleAssetUpdate(newAsset);
}
});
};
AssetFinder.prototype.handleAssetDelete = function handleAssetDelete(asset) {
var _this9 = this;
var additionalCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
return false;
};
showPrompt({
title: 'Delete Asset',
message: React.createElement(
'div',
null,
React.createElement(
'p',
null,
'Are you sure you want to delete this asset?'
)
),
callback: function callback(response) {
if (response) {
var allAssets = _this9.state.allAssets.filter(function (item) {
return item.id !== asset.id;
});
_this9.setState({ allAssets: allAssets }, function () {
_this9.filterAssets();
});
_this9.deleteAssets([asset.id]);
additionalCallback();
}
}
});
};
AssetFinder.prototype.deleteAssets = function deleteAssets(assetIds) {
post({
url: this.props.assetDeleteUrl,
data: assetIds,
successMessage: 'Successfully deleted asset(s)',
failureMessage: 'Failed to delete asset(s)',
callback: function callback() {}
});
};
AssetFinder.prototype.render = function render() {
var _this10 = this;
var _props = this.props,
showUnsortedFolder = _props.showUnsortedFolder,
folderGetUrl = _props.folderGetUrl,
folderAddUrl = _props.folderAddUrl,
folderUpdateUrl = _props.folderUpdateUrl,
folderDeleteUrl = _props.folderDeleteUrl,
onViewModeChange = _props.onViewModeChange,
onAssetTypeChange = _props.onAssetTypeChange;
var _state = this.state,
assets = _state.assets,
selectedAssets = _state.selectedAssets,
viewMode = _state.viewMode,
contentWidth = _state.contentWidth,
contentHeight = _state.contentHeight,
loadingAssets = _state.loadingAssets,
errorLoadingAssets = _state.errorLoadingAssets,
assetType = _state.assetType,
currentFolderId = _state.currentFolderId,
globalSearch = _state.globalSearch;
var sidebarProps = { showUnsortedFolder: showUnsortedFolder, folderGetUrl: folderGetUrl, folderAddUrl: folderAddUrl, folderUpdateUrl: folderUpdateUrl, folderDeleteUrl: folderDeleteUrl };
var selectedIds = selectedAssets.map(function (asset) {
return asset.id;
});
var panelToolbarProps = {
viewMode: viewMode,
assetType: assetType,
selectedIds: selectedIds,
onViewModeChange: onViewModeChange,
onAssetTypeChange: onAssetTypeChange,
onAssetDelete: this.deleteSelectedAssets
};
return React.createElement(
'div',
{ className: 'finder' },
React.createElement(
'div',
{ className: 'finder-menu relative' },
React.createElement(AssetFinderSidebarTree, _extends({
defaultSelectedId: this.props.currentFolderId || this.props.defaultFolderId,
onFolderChange: this.handleFolderChange,
onMoveAssetsToFolder: this.handleMoveAssetsToFolder
}, sidebarProps)),
globalSearch && React.createElement('div', { className: 'cover', style: { backgroundColor: 'rgba(255,255,255,0.8)' } })
),
React.createElement(
'div',
{ className: 'finder-content', ref: 'finderContent' },
React.createElement(FileDropzone, { multiple: true, onReceivedFiles: this.handleReceivedFiles }),
React.createElement(
Panel,
_extends({
title: React.createElement(
'div',
{ className: 'flex align-items-center margin-right-xsmall' },
React.createElement(
'div',
{ style: { paddingRight: 10 } },
React.createElement(Checkbox, { value: this.state.globalSearch, onChange: this.handleGlobalSearchToggle, text: 'Global' })
),
React.createElement(FilterInput, { value: this.props.query, onChange: this.props.onQueryChange })
)
}, panelToolbarProps, {
PanelToolbar: AssetsToolbar }),
loadingAssets && React.createElement(
'div',
{ className: 'loader-center' },
React.createElement(Spinner, { spinnerName: 'circle' })
),
!loadingAssets && errorLoadingAssets && React.createElement(
'div',
{ className: 'center' },
React.createElement(
'p',
{ className: 'text-warning' },
'An error occurred while loading assets!'
),
React.createElement(
Button,
{ onClick: function onClick() {
return _this10.getAssetsByFolderId();
} },
'Try again?'
)
),
!loadingAssets && !errorLoadingAssets && !assets.length && React.createElement(
'div',
{ className: 'center' },
globalSearch ? !!this.state.query ? this.state.query.length <= 3 ? React.createElement(
'p',
null,
'Please type more than 3 characters'
) : React.createElement(
'p',
null,
'No results found.'
) : React.createElement(
'p',
null,
'Type in the search box'
) : !!currentFolderId ? React.createElement(
'p',
null,
'Folder is empty.'
) : React.createElement(
'p',
null,
'You\'re all organized. Nice one!'
)
),
!loadingAssets && viewMode == 'grid' && React.createElement(
AutoSizer,
null,
function (_ref4) {
var width = _ref4.width,
height = _ref4.height;
var innerWidth = width - gridSpacing * 2;
var columnCount = Math.floor(innerWidth / minCellWidth);
var cellWidth = Math.floor(innerWidth / columnCount);
var cellHeight = Math.round(cellWidth / minCellWidth * minCellHeight);
var rowCount = Math.ceil(assets.length / columnCount);
if (!rowCount) {
return React.createElement('div', null);
}
return React.createElement(Grid, {
width: width,
height: height,
columnWidth: function columnWidth(_ref5) {
var index = _ref5.index;
return index === 0 || index === columnCount - 1 ? cellWidth + gridSpacing / 2 : cellWidth;
},
rowHeight: function rowHeight(_ref6) {
var index = _ref6.index;
return index === 0 || index === rowCount - 1 ? cellHeight + gridSpacing / 2 : cellHeight;
},
columnCount: columnCount,
rowCount: rowCount,
overscanRowCount: 0,
cellRenderer: function cellRenderer(_ref7) {
var key = _ref7.key,
columnIndex = _ref7.columnIndex,
rowIndex = _ref7.rowIndex,
style = _ref7.style;
var asset = assets[rowIndex * columnCount + columnIndex];
if (!asset) return React.createElement('div', { key: key });
var selected = selectedAssets.indexOf(asset) >= 0;
var innerStyle = {
position: 'relative',
width: '100%',
height: '100%',
paddingTop: rowIndex === 0 ? gridSpacing : gridSpacing / 2,
paddingBottom: rowIndex === rowCount - 1 ? gridSpacing : gridSpacing / 2,
paddingLeft: columnIndex === 0 ? gridSpacing : gridSpacing / 2,
paddingRight: columnIndex === columnCount - 1 ? gridSpacing : gridSpacing / 2
};
return React.createElement(
'div',
{ key: asset.id, style: style },
React.createElement(
'div',
{ style: innerStyle },
React.createElement(AssetAutoCell, {
toolbar: false,
asset: asset,
cellSize: 'auto',
selected: selected,
onEdit: function onEdit() {
return _this10.handleAssetEdit(asset);
},
onPlay: function onPlay() {
return _this10.handleAssetPlay(asset);
},
onDetails: function onDetails() {
return _this10.handleAssetDetailsEdit(asset);
},
onRemove: function onRemove() {
return _this10.handleAssetDelete(asset);
},
onClick: function onClick() {
return _this10.handleAssetSelect(asset);
},
onDoubleClick: function onDoubleClick() {
return _this10.handleAssetSelection(asset);
}
})
)
);
}
});
}
),
!loadingAssets && viewMode == 'list' && React.createElement(FixedDataTable, {
data: assets,
rowHeight: 65,
fields: fields,
tableWidth: contentWidth,
tableHeight: contentHeight,
selectedIds: selectedIds,
onSelect: this.handleAssetSelect,
onSelected: this.handleAssetSelection
})
)
)
);
};
return AssetFinder;
}(Component), _class2.propTypes = (_class2$propTypes = {
/** This defines whether or not the component should use its own logic or rely on callback props for basic functionality */
uncontrolled: PropTypes.bool,
/** View mode -- only used if controlled */
viewMode: PropTypes.oneOf(['grid', 'list']),
/** Filters array -- only used if controlled */
filters: PropTypes.array,
/** Query string -- only used if controlled */
query: PropTypes.string,
/** Fields that query string should search */
queryFields: PropTypes.array,
/** Called when asset is selected, typically onDoubleClick */
onSelected: PropTypes.func,
/** Whether or not uploads are allowed */
allowUploads: PropTypes.bool,
/** Whether or not assets are allowed to be selected */
allowSelection: PropTypes.bool,
/** Whether or not multiple assets are allowed to be selected */
multiple: PropTypes.bool,
/** Whether or not to use sticky selection (sticky being ctrl/shift keys don't need to be held down) */
stickySelect: PropTypes.bool,
/** The height to negate for the FixedDataTable list view */
negativeHeight: PropTypes.number,
/** Array of asset objects if parent component has newly added/uploaded assets to display */
receivedFiles: PropTypes.array
}, _class2$propTypes['onSelected'] = PropTypes.func, _class2$propTypes.onFolderChange = PropTypes.func, _class2$propTypes.onSelectionChange = PropTypes.func, _class2$propTypes.onViewModeChange = PropTypes.func, _class2$propTypes.onAssetTypeChange = PropTypes.func, _class2$propTypes.defaultFolderId = PropTypes.number, _class2$propTypes.assetGetUrl = PropTypes.string, _class2$propTypes.assetUpdateUrl = PropTypes.string, _class2$propTypes.assetMoveUrl = PropTypes.string, _class2$propTypes.assetDeleteUrl = PropTypes.string, _class2$propTypes.folderGetUrl = PropTypes.string, _class2$propTypes.folderAddUrl = PropTypes.string, _class2$propTypes.folderUpdateUrl = PropTypes.string, _class2$propTypes.folderDeleteUrl = PropTypes.string, _class2$propTypes.showUnsortedFolder = PropTypes.bool, _class2$propTypes), _class2.defaultProps = {
uncontrolled: true,
allowUploads: true,
allowSelection: false,
multiple: true,
stickySelect: false,
viewMode: 'grid',
filters: [],
assetType: null,
query: null,
queryFields: ['filename', 'title', 'caption', 'credit'],
globalSearch: false,
negativeHeight: 225,
receivedFiles: [],
onSelected: null,
onFolderChange: function onFolderChange() {
return console.warn('[AssetFinder] no onFolderChange prop');
},
onSelectionChange: function onSelectionChange() {
return console.warn('[AssetFinder] no onSelectionChange prop');
},
onViewModeChange: function onViewModeChange() {
return console.warn('[AssetFinder] no onViewModeChange prop');
},
onAssetTypeChange: function onAssetTypeChange() {
return console.warn('[AssetFinder] no onAssetTypeChange prop');
},
defaultFolderId: null,
assetGetUrl: '/tank/assets.json',
assetUpdateUrl: '/tank/assets/edit',
assetMoveUrl: '/tank/assets/move.json',
assetDeleteUrl: '/tank/assets/delete.json',
folderGetUrl: '/admin/tank/asset_folders/tree.json',
folderAddUrl: '/tank/asset_folders/add.json',
folderUpdateUrl: '/tank/asset_folders/edit',
folderDeleteUrl: '/tank/asset_folders/delete.json',
showUnsortedFolder: true
}, _temp)) || _class);
export { AssetFinder as default };