@iobroker/adapter-react
Version:
React classes to develop admin interfaces for ioBroker with react.
1,429 lines (1,264 loc) • 75.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof3 = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _withWidth = _interopRequireDefault(require("@material-ui/core/withWidth"));
var _styles = require("@material-ui/core/styles");
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _reactDropzone = _interopRequireDefault(require("react-dropzone"));
var _LinearProgress = _interopRequireDefault(require("@material-ui/core/LinearProgress"));
var _CircularProgress = _interopRequireDefault(require("@material-ui/core/CircularProgress"));
var _Toolbar = _interopRequireDefault(require("@material-ui/core/Toolbar"));
var _IconButton = _interopRequireDefault(require("@material-ui/core/IconButton"));
var _Fab = _interopRequireDefault(require("@material-ui/core/Fab"));
var _Dialog = _interopRequireDefault(require("@material-ui/core/Dialog"));
var _DialogTitle = _interopRequireDefault(require("@material-ui/core/DialogTitle"));
var _DialogContent = _interopRequireDefault(require("@material-ui/core/DialogContent"));
var _DialogContentText = _interopRequireDefault(require("@material-ui/core/DialogContentText"));
var _DialogActions = _interopRequireDefault(require("@material-ui/core/DialogActions"));
var _Button = _interopRequireDefault(require("@material-ui/core/Button"));
var _Input = _interopRequireDefault(require("@material-ui/core/Input"));
var _core = require("@material-ui/core");
var _Error = _interopRequireDefault(require("../Dialogs/Error"));
var _Utils = _interopRequireDefault(require("./Utils"));
var _TextInput = _interopRequireDefault(require("../Dialogs/TextInput"));
var _FileViewer = _interopRequireWildcard(require("./FileViewer"));
var _Refresh = _interopRequireDefault(require("@material-ui/icons/Refresh"));
var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
var _Bookmark = _interopRequireDefault(require("@material-ui/icons/Bookmark"));
var _BookmarkBorder = _interopRequireDefault(require("@material-ui/icons/BookmarkBorder"));
var _Description = _interopRequireDefault(require("@material-ui/icons/Description"));
var _Edit = _interopRequireDefault(require("@material-ui/icons/Edit"));
var _Code = _interopRequireDefault(require("@material-ui/icons/Code"));
var _InsertDriveFile = _interopRequireDefault(require("@material-ui/icons/InsertDriveFile"));
var _Publish = _interopRequireDefault(require("@material-ui/icons/Publish"));
var _MusicNote = _interopRequireDefault(require("@material-ui/icons/MusicNote"));
var _SaveAlt = _interopRequireDefault(require("@material-ui/icons/SaveAlt"));
var _CreateNewFolder = _interopRequireDefault(require("@material-ui/icons/CreateNewFolder"));
var _FolderOpen = _interopRequireDefault(require("@material-ui/icons/FolderOpen"));
var _List = _interopRequireDefault(require("@material-ui/icons/List"));
var _ViewModule = _interopRequireDefault(require("@material-ui/icons/ViewModule"));
var _ArrowBack = _interopRequireDefault(require("@material-ui/icons/ArrowBack"));
var _Delete = _interopRequireDefault(require("@material-ui/icons/Delete"));
var _Brightness = _interopRequireDefault(require("@material-ui/icons/Brightness6"));
var _IconExpert = _interopRequireDefault(require("../icons/IconExpert"));
var _no_icon = _interopRequireDefault(require("../assets/no_icon.svg"));
var _IconClosed = _interopRequireDefault(require("../icons/IconClosed"));
var _IconOpen = _interopRequireDefault(require("../icons/IconOpen"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var ROW_HEIGHT = 32;
var BUTTON_WIDTH = 32;
var TILE_HEIGHT = 120;
var TILE_WIDTH = 64;
var NOT_FOUND = 'Not found';
var styles = function styles(theme) {
return {
dialog: {
height: "calc(100% - ".concat(theme.mixins.toolbar.minHeight, "px)")
},
root: {
width: '100%',
overflow: 'hidden',
height: '100%',
position: 'relative'
},
filesDiv: {
width: "calc(100% - ".concat(theme.spacing(2), "px)"),
overflowX: 'hidden',
overflowY: 'auto',
padding: theme.spacing(1)
},
filesDivTable: {
height: "calc(100% - ".concat(48 + theme.spacing(1), "px)")
},
filesDivTile: {
height: "calc(100% - ".concat(48 * 2 + theme.spacing(1), "px)"),
display: 'flex',
alignContent: 'flex-start',
alignItems: 'stretch',
flexWrap: 'wrap',
flex: "0 0 ".concat(TILE_WIDTH, "px")
},
itemTile: {
position: 'relative',
userSelect: 'none',
cursor: 'pointer',
height: TILE_HEIGHT,
width: TILE_WIDTH,
display: 'inline-block',
textAlign: 'center',
opacity: 0.1,
transition: 'opacity 1s',
margin: 4,
'&:hover': {
background: theme.palette.secondary.light,
color: _Utils["default"].invertColor(theme.palette.secondary.main, true)
}
},
itemNameFolderTile: {
fontWeight: 'bold'
},
itemNameTile: {
width: '100%',
height: 32,
overflow: 'hidden',
textOverflow: 'ellipsis',
fontSize: 12,
textAlign: 'center',
wordBreak: 'break-all'
},
itemFolderIconTile: {
width: '100%',
height: TILE_HEIGHT - 32 - 16 - 8,
// name + size
display: 'block',
paddingLeft: 8,
color: theme.palette.secondary.main || '#fbff7d'
},
itemFolderIconBack: {
position: 'absolute',
top: 22,
left: 18,
zIndex: 1,
color: theme.palette.type === 'dark' ? '#FFF' : '#000'
},
itemSizeTile: {
width: '100%',
height: 16,
textAlign: 'center',
fontSize: 10
},
itemImageTile: {
width: 'calc(100% - 8px)',
height: TILE_HEIGHT - 32 - 16 - 8,
// name + size
margin: 4,
display: 'block',
textAlign: 'center',
objectFit: 'contain'
},
itemIconTile: {
width: '100%',
height: TILE_HEIGHT - 32 - 16 - 8,
// name + size
display: 'block',
objectFit: 'contain'
},
itemSelected: {
background: theme.palette.primary.main,
color: _Utils["default"].invertColor(theme.palette.primary.main, true)
},
itemTable: {
userSelect: 'none',
cursor: 'pointer',
height: ROW_HEIGHT,
display: 'inline-flex',
lineHeight: ROW_HEIGHT + 'px',
'&:hover': {
background: theme.palette.secondary.light,
color: _Utils["default"].invertColor(theme.palette.secondary.main, true)
}
},
itemNameTable: {
display: 'inline-block',
paddingLeft: 10,
fontSize: '1rem',
verticalAlign: 'top',
flexGrow: 1
},
itemNameFolderTable: {
fontWeight: 'bold'
},
itemSizeTable: {
display: 'inline-block',
width: 60,
verticalAlign: 'top',
textAlign: 'right'
},
itemAccessTable: {
// display: 'inline-block',
verticalAlign: 'top',
width: 60,
textAlign: 'right',
paddingRight: 5,
display: 'flex',
justifyContent: 'center'
},
itemImageTable: {
display: 'inline-block',
width: 30,
marginTop: 1,
objectFit: 'contain',
maxHeight: 30
},
itemIconTable: {
display: 'inline-block',
marginTop: 1,
width: 30,
height: 30
},
itemFolderTable: {},
itemFolderTemp: {
opacity: 0.4
},
itemFolderIconTable: {
marginTop: 1,
marginLeft: theme.spacing(1),
display: 'inline-block',
width: 30,
height: 30,
color: theme.palette.secondary.main || '#fbff7d'
},
itemDownloadButtonTable: {
display: 'inline-block',
width: BUTTON_WIDTH,
height: ROW_HEIGHT,
minWidth: BUTTON_WIDTH,
verticalAlign: 'top',
padding: 0,
'& span': {
paddingTop: 9
},
'& svg': {
width: 14,
height: 14,
fontSize: '1rem'
}
},
itemAclButtonTable: {
width: BUTTON_WIDTH,
height: ROW_HEIGHT,
minWidth: BUTTON_WIDTH,
verticalAlign: 'top',
padding: 0,
fontSize: 12,
display: 'flex'
},
itemDeleteButtonTable: {
display: 'inline-block',
width: BUTTON_WIDTH,
height: ROW_HEIGHT,
minWidth: BUTTON_WIDTH,
verticalAlign: 'top',
padding: 0,
'& svg': {
width: 18,
height: 18,
fontSize: '1.5rem'
}
},
uploadDiv: {
top: 0,
zIndex: 1,
bottom: 0,
left: 0,
right: 0,
position: 'absolute',
opacity: 0.9,
textAlign: 'center',
background: '#FFFFFF'
},
uploadDivDragging: {
opacity: 1
},
uploadCenterDiv: {
margin: 20,
border: '3px dashed grey',
borderRadius: 30,
width: 'calc(100% - 40px)',
height: 'calc(100% - 40px)',
position: 'relative',
color: theme.palette.type === 'dark' ? '#222' : '#CCC'
},
uploadCenterIcon: {
width: '25%',
height: '25%'
},
uploadCenterText: {
fontSize: 24,
fontWeight: 'bold'
},
uploadCloseButton: {
zIndex: 2,
position: 'absolute',
top: 30,
right: 30
},
uploadCenterTextAndIcon: {
position: 'absolute',
top: '50%',
left: '50%',
height: '30%',
width: '50%',
margin: '-15% 0 0 -25%'
},
menuButtonExpertActive: {
color: '#c00000'
},
pathDiv: {
display: 'flex',
width: "calc(100% - ".concat(theme.spacing(2), "px)"),
marginLeft: theme.spacing(1),
marginRight: theme.spacing(1),
textOverflow: 'clip',
overflow: 'hidden',
whiteSpace: 'nowrap'
},
pathDivInput: {
width: '100%'
},
pathDivBreadcrumb: {
paddingTop: 3,
paddingBottom: 2,
borderBottom: 'solid 1px'
},
pathDivBreadcrumbDir: {
paddingLeft: 4,
paddingRight: 4,
paddingBottom: 4,
cursor: 'pointer',
'&:hover': {
background: theme.palette.type === 'dark' ? '#333' : '#CCC'
}
},
pathDivBreadcrumbSlash: {
paddingLeft: 4,
paddingRight: 4,
paddingBottom: 4,
opacity: 0.7
},
pathDivBreadcrumbFile: {
cursor: 'pointer',
flexGrow: 1
},
backgroundImageLight: {
background: 'white'
},
backgroundImageDark: {
background: 'black'
},
backgroundImageColored: {
background: 'silver'
},
'@media screen and (max-width: 500px)': {
itemNameTable: {
whiteSpace: 'nowrap',
overflow: 'hidden',
textOverflow: 'ellipsis',
textAlign: 'end',
direction: 'rtl'
}
}
};
};
var USER_DATA = '0_userdata.0';
function sortFolders(a, b) {
if (a.folder && b.folder) {
return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;
} else if (a.folder) {
return -1;
} else if (b.folder) {
return 1;
} else {
return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;
}
}
function getParentDir(dir) {
var parts = (dir || '').split('/');
parts.length && parts.pop();
return parts.join('/');
}
function isFile(path) {
var ext = _Utils["default"].getFileExtension(path);
if (ext && ext.toLowerCase().match(/[a-z]+/) && ext.length < 5) {
return true;
} else {
return false;
}
}
var TABLE = 'Table';
var TILE = 'Tile';
/**
* @extends {React.Component<import('./types').FileBrowserProps>}
*/
var FileBrowser = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(FileBrowser, _Component);
var _super = _createSuper(FileBrowser);
/**
* @param {Readonly<import("./types").FileBrowserProps>} props
*/
function FileBrowser(props) {
var _this;
(0, _classCallCheck2["default"])(this, FileBrowser);
_this = _super.call(this, props);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "setStateBackgroundImage", function () {
var array = ['light', 'dark', 'colored', 'delete'];
_this.setState(function (_ref) {
var backgroundImage = _ref.backgroundImage;
if (array.indexOf(backgroundImage) !== -1 && array.length - 1 !== array.indexOf(backgroundImage)) {
window.localStorage.setItem('files.backgroundImage', array[array.indexOf(backgroundImage) + 1]);
return {
backgroundImage: array[array.indexOf(backgroundImage) + 1]
};
} else {
window.localStorage.setItem('files.backgroundImage', array[0]);
return {
backgroundImage: array[0]
};
}
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getClassBackgroundImage", function () {
//['light', 'dark', 'colored', 'delete']
switch (_this.state.backgroundImage) {
case 'light':
return _this.props.classes.backgroundImageLight;
case 'dark':
return _this.props.classes.backgroundImageDark;
case 'colored':
return _this.props.classes.backgroundImageColored;
case 'delete':
return null;
default:
return null;
}
});
var expanded = window.localStorage.getItem('files.expanded') || '[]';
try {
expanded = JSON.parse(expanded);
} catch (e) {
expanded = [];
}
var viewType;
if (_this.props.showViewTypeButton) {
viewType = window.localStorage.getItem('files.viewType') || TABLE;
} else {
viewType = TABLE;
}
var selected = _this.props.selected || window.localStorage.getItem('files.selected') || USER_DATA;
var currentDir = '';
if (isFile(selected)) {
currentDir = getParentDir(selected);
} else {
currentDir = selected;
}
var _backgroundImage = window.localStorage.getItem('files.backgroundImage') || null;
_this.state = {
viewType: viewType,
folders: {},
filterEmpty: window.localStorage.getItem('files.empty') !== 'false',
expanded: expanded,
currentDir: currentDir,
expertMode: _this.props.expertMode,
addFolder: false,
uploadFile: false,
deleteItem: '',
marked: [],
viewer: '',
formatEditFile: '',
path: selected,
selected: selected,
errorText: '',
modalEditOfAccess: false,
backgroundImage: _backgroundImage,
queueLength: 0,
loadAllFolders: false,
allFoldersLoaded: false
};
_this.imagePrefix = _this.props.imagePrefix || './files/';
_this.levelPadding = _this.props.levelPadding || 20;
_this.mounted = true;
_this.suppressDeleteConfirm = 0;
_this.browseList = [];
_this.browseListRunning = false;
_this.initialReadFinished = false;
return _this;
}
(0, _createClass2["default"])(FileBrowser, [{
key: "loadFolders",
value: function loadFolders() {
var _this2 = this;
this.initialReadFinished = false;
return this.browseFolder('/').then(function (folders) {
return _this2.state.viewType === TABLE ? _this2.browseFolders((0, _toConsumableArray2["default"])(_this2.state.expanded), folders) : _this2.state.currentDir && _this2.state.currentDir !== '/' ? _this2.browseFolder(_this2.state.currentDir, folders) : Promise.resolve(folders);
}).then(function (folders) {
return _this2.setState({
folders: folders
}, function () {
if (_this2.state.viewType === TABLE && !_this2.findItem(_this2.state.selected)) {
var parts = _this2.state.selected.split('/');
while (parts.length && !_this2.findItem(parts.join('/'))) {
parts.pop();
}
var selected;
if (parts.length) {
selected = parts.join('/');
} else {
selected = USER_DATA;
}
_this2.setState({
selected: selected,
path: selected,
pathFocus: false
}, function () {
return _this2.scrollToSelected();
});
} else {
_this2.scrollToSelected();
}
_this2.initialReadFinished = true;
});
});
}
}, {
key: "scrollToSelected",
value: function scrollToSelected() {
if (this.mounted) {
var el = document.getElementById(this.state.selected);
el && el.scrollIntoView();
}
}
}, {
key: "componentDidMount",
value: function componentDidMount() {
this.mounted = true;
this.loadFolders();
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.mounted = false;
this.browseList = null;
this.browseListRunning = false;
}
}, {
key: "browseFolders",
value: function browseFolders(foldersList, _newFolders, _resolve) {
var _this3 = this;
if (!_newFolders) {
_newFolders = {};
Object.keys(this.state.folders).forEach(function (folder) {
return _newFolders[folder] = _this3.state.folders[folder];
});
}
if (!_resolve) {
return new Promise(function (resolve) {
return _this3.browseFolders(foldersList, _newFolders, resolve);
});
}
if (!foldersList || !foldersList.length) {
_resolve(_newFolders);
} else {
this.browseFolder(foldersList.shift(), _newFolders).then(function () {
return setTimeout(function () {
return _this3.browseFolders(foldersList, _newFolders, _resolve);
}, 0);
})["catch"](function () {
return setTimeout(function () {
return _this3.browseFolders(foldersList, _newFolders, _resolve);
}, 0);
});
}
}
}, {
key: "readDirSerial",
value: function readDirSerial(adapter, relPath) {
var _this4 = this;
return new Promise(function (resolve, reject) {
if (_this4.browseList) {
// if component still mounted
_this4.browseList.push({
resolve: resolve,
reject: reject,
adapter: adapter,
relPath: relPath
});
!_this4.browseListRunning && _this4.processBrowseList();
}
});
}
}, {
key: "processBrowseList",
value: function processBrowseList(level) {
var _this5 = this;
if (!this.browseListRunning && this.browseList && this.browseList.length) {
this.browseListRunning = true;
if (this.browseList.length > 10) {
// not too often
if (!(this.browseList.length % 10)) {
this.setState({
queueLength: this.browseList.length
});
}
} else {
this.setState({
queueLength: this.browseList.length
});
}
this.browseList[0].processing = true;
this.props.socket.readDir(this.browseList[0].adapter, this.browseList[0].relPath).then(function (files) {
if (_this5.browseList) {
// if component still mounted
var item = _this5.browseList.shift();
if (item) {
var resolve = item.resolve;
item.resolve = null;
item.reject = null;
item.adapter = null;
item.relPath = null;
resolve(files);
_this5.browseListRunning = false;
if (_this5.browseList.length) {
if (level < 5) {
_this5.processBrowseList(level + 1);
} else {
setTimeout(function () {
return _this5.processBrowseList(0);
}, 0);
}
} else {
_this5.setState({
queueLength: 0
});
}
} else {
_this5.setState({
queueLength: 0
});
}
}
})["catch"](function (e) {
if (_this5.browseList) {
// if component still mounted
var item = _this5.browseList.shift();
if (item) {
var reject = item.reject;
item.resolve = null;
item.reject = null;
item.adapter = null;
item.relPath = null;
reject(e);
_this5.browseListRunning = false;
if (_this5.browseList.length) {
if (level < 5) {
_this5.processBrowseList(level + 1);
} else {
setTimeout(function () {
return _this5.processBrowseList(0);
}, 0);
}
} else {
_this5.setState({
queueLength: 0
});
}
} else {
_this5.setState({
queueLength: 0
});
}
}
});
}
}
}, {
key: "browseFolder",
value: function browseFolder(folderId, _newFolders, _checkEmpty) {
var _this6 = this;
if (!_newFolders) {
_newFolders = {};
Object.keys(this.state.folders).forEach(function (folder) {
return _newFolders[folder] = _this6.state.folders[folder];
});
}
if (_newFolders[folderId]) {
if (!_checkEmpty) {
return new Promise(function (resolve, reject) {
return Promise.all(_newFolders[folderId].filter(function (item) {
return item.folder;
}).map(function (item) {
return _this6.browseFolder(item.id, _newFolders, true)["catch"](function (error) {});
})).then(function () {
return resolve(_newFolders);
})["catch"](function (error) {
return reject(error);
});
});
} else {
return Promise.resolve(_newFolders);
}
}
if (!folderId || folderId === '/') {
return this.props.socket.readMetaItems().then(function (objs) {
var _folders = [];
var userData = null; // load only adapter.admin and not other meta files like hm-rpc.0.devices.blablabla
objs = objs.filter(function (obj) {
if (!_this6.state.expertMode) {
return obj._id === '0_userdata.0' || obj._id === 'vis.0';
} else {
return obj._id.split('.').length <= 2;
}
}); // remember, that all folders are loaded
if (_this6.state.expertMode) {
_this6.setState({
allFoldersLoaded: true,
loadFolders: false
});
}
objs.forEach(function (obj) {
var item = {
id: obj._id,
name: obj._id,
title: obj.common && obj.common.name || obj._id,
meta: true,
from: obj.from,
ts: obj.ts,
color: obj.common && obj.common.color,
icon: obj.common && obj.common.icon,
folder: true,
acl: obj.acl,
level: 0
};
if (item.id === USER_DATA) {
// user data must be first
userData = item;
} else {
_folders.push(item);
}
});
_folders.sort(function (a, b) {
return a.id > b.id ? 1 : a.id < b.id ? -1 : 0;
});
_folders.unshift(userData);
_newFolders[folderId || '/'] = _folders;
if (!_checkEmpty) {
return Promise.all(_folders.filter(function (item) {
return item.folder;
}).map(function (item) {
return _this6.browseFolder(item.id, _newFolders, true)["catch"](function (error) {});
})).then(function () {
return _newFolders;
});
} else {
return _newFolders;
}
})["catch"](function (e) {
return _this6.initialReadFinished && window.alert('Cannot read meta items: ' + e);
});
} else {
var parts = folderId.split('/');
var level = parts.length;
var adapter = parts.shift();
var relPath = parts.join('/'); // make all requests here serial
return this.readDirSerial(adapter, relPath).then(function (files) {
var _folders = [];
files.forEach(function (file) {
var item = {
id: folderId + '/' + file.file,
ext: _Utils["default"].getFileExtension(file.file),
folder: file.isDir,
name: file.file,
size: file.stats && file.stats.size,
modified: file.modifiedAt,
acl: file.acl,
level: level
};
_folders.push(item);
});
_folders.sort(sortFolders);
_newFolders[folderId] = _folders;
if (!_checkEmpty) {
return Promise.all(_folders.filter(function (item) {
return item.folder;
}).map(function (item) {
return _this6.browseFolder(item.id, _newFolders, true);
})).then(function () {
return _newFolders;
});
} else {
return _newFolders;
}
})["catch"](function (e) {
_this6.initialReadFinished && window.alert("Cannot read ".concat(adapter).concat(relPath ? '/' + relPath : '', ": ").concat(e));
_newFolders[folderId] = [];
return _newFolders;
});
}
}
}, {
key: "toggleFolder",
value: function toggleFolder(item, e) {
var _this7 = this;
e && e.stopPropagation();
var expanded = (0, _toConsumableArray2["default"])(this.state.expanded);
var pos = expanded.indexOf(item.id);
if (pos === -1) {
expanded.push(item.id);
expanded.sort();
window.localStorage.setItem('files.expanded', JSON.stringify(expanded));
if (!item.temp) {
return this.browseFolder(item.id).then(function (folders) {
return _this7.setState({
expanded: expanded,
folders: folders
});
})["catch"](function (err) {
return window.alert(err === NOT_FOUND ? _this7.props.t('ra_Cannot find "%s"', item.id) : _this7.props.t('ra_Cannot read "%s"', item.id));
});
} else {
this.setState({
expanded: expanded
});
}
} else {
expanded.splice(pos, 1);
window.localStorage.setItem('files.expanded', JSON.stringify(expanded));
this.setState({
expanded: expanded
});
}
}
}, {
key: "changeFolder",
value: function changeFolder(e, folder) {
var _this8 = this;
e && e.stopPropagation();
this.lastSelect = Date.now();
folder = folder || getParentDir(this.state.currentDir);
if (folder === '/') {
folder = '';
}
window.localStorage.setItem('files.currentDir', folder);
if (folder && !this.state.folders[folder]) {
return this.browseFolder(folder).then(function (folders) {
return _this8.setState({
folders: folders,
path: folder,
currentDir: folder,
selected: folder,
pathFocus: false
}, function () {
return _this8.props.onSelect && _this8.props.onSelect('');
});
});
} else {
this.setState({
currentDir: folder,
selected: folder,
path: folder,
pathFocus: false
}, function () {
return _this8.props.onSelect && _this8.props.onSelect('');
});
}
}
}, {
key: "select",
value: function select(id, e, cb) {
var _this9 = this;
if (typeof e === 'function') {
cb = e;
e = null;
}
e && e.stopPropagation();
this.lastSelect = Date.now();
window.localStorage.setItem('files.selected', id);
this.setState({
selected: id,
path: id,
pathFocus: false
}, function () {
if (_this9.props.onSelect) {
var ext = _Utils["default"].getFileExtension(id);
if ((!_this9.props.filterFiles || _this9.props.filterFiles.includes(ext)) && (!_this9.props.filterByType || _FileViewer.EXTENSIONS[_this9.props.filterByType].includes(ext))) {
_this9.props.onSelect(id);
} else {
_this9.props.onSelect('');
}
}
cb && cb();
});
}
}, {
key: "renderFolder",
value: function renderFolder(item, expanded) {
var _this10 = this;
if (this.state.filterEmpty && (!this.state.folders[item.id] || !this.state.folders[item.id].length) && item.id !== USER_DATA && !item.temp) {
return null;
}
var Icon = expanded ? _IconOpen["default"] : _IconClosed["default"];
var padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;
return /*#__PURE__*/_react["default"].createElement("div", {
key: item.id,
id: item.id,
style: this.state.viewType === TABLE ? {
marginLeft: padding,
width: 'calc(100% - ' + padding + 'px'
} : {},
onClick: function onClick(e) {
return _this10.state.viewType === TABLE ? _this10.select(item.id, e) : _this10.changeFolder(e, item.id);
},
onDoubleClick: function onDoubleClick(e) {
return _this10.state.viewType === TABLE && _this10.toggleFolder(item, e);
},
title: item.title && (0, _typeof2["default"])(item.title) === 'object' ? item.title[this.props.lang] || item.title.end || '' : item.title || null,
className: _Utils["default"].clsx('browserItem', this.props.classes['item' + this.state.viewType], this.props.classes['itemFolder' + this.state.viewType], this.state.selected === item.id && this.props.classes.itemSelected, item.temp && this.props.classes['itemFolderTemp'])
}, /*#__PURE__*/_react["default"].createElement(Icon, {
className: this.props.classes['itemFolderIcon' + this.state.viewType],
onClick: this.state.viewType === TABLE ? function (e) {
return _this10.toggleFolder(item, e);
} : undefined
}), /*#__PURE__*/_react["default"].createElement("div", {
className: _Utils["default"].clsx(this.props.classes['itemName' + this.state.viewType], this.props.classes['itemNameFolder' + this.state.viewType])
}, item.name === USER_DATA ? this.props.t('ra_User files') : item.name), /*#__PURE__*/_react["default"].createElement(_core.Hidden, {
xsDown: true
}, /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes['itemSize' + this.state.viewType]
}, this.state.viewType === TABLE && this.state.folders[item.id] ? this.state.folders[item.id].length : '')), /*#__PURE__*/_react["default"].createElement(_core.Hidden, {
xsDown: true
}, this.state.viewType === TABLE ? this.formatAcl(item.acl) : null), /*#__PURE__*/_react["default"].createElement(_core.Hidden, {
xsDown: true
}, this.state.viewType === TABLE && this.props.expertMode ? /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes['itemDeleteButton' + this.state.viewType]
}) : null), this.state.viewType === TABLE && this.props.allowDownload ? /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes['itemDownloadButton' + this.state.viewType]
}) : null, this.state.viewType === TABLE && this.props.allowDelete && this.state.folders[item.id] && this.state.folders[item.id].length && (this.state.expertMode || item.id.startsWith(USER_DATA) || item.id.startsWith('vis.0/')) ? /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
"aria-label": "delete",
onClick: function onClick(e) {
e.stopPropagation();
if (_this10.suppressDeleteConfirm > Date.now()) {
_this10.deleteItem(item.id);
} else {
_this10.setState({
deleteItem: item.id
});
}
},
className: this.props.classes['itemDeleteButton' + this.state.viewType]
}, /*#__PURE__*/_react["default"].createElement(_Delete["default"], {
fontSize: "small"
})) : this.state.viewType === TABLE && this.props.allowDelete ? /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes['itemDeleteButton' + this.state.viewType]
}) : null);
}
}, {
key: "renderBackFolder",
value: function renderBackFolder() {
var _this11 = this;
return /*#__PURE__*/_react["default"].createElement("div", {
key: this.state.currentDir,
id: this.state.currentDir,
onClick: function onClick(e) {
return _this11.changeFolder(e);
},
title: this.props.t('ra_Back to %s', getParentDir(this.state.currentDir)),
className: _Utils["default"].clsx('browserItem', this.props.classes['item' + this.state.viewType], this.props.classes['itemFolder' + this.state.viewType])
}, /*#__PURE__*/_react["default"].createElement(_IconClosed["default"], {
className: this.props.classes['itemFolderIcon' + this.state.viewType]
}), /*#__PURE__*/_react["default"].createElement(_ArrowBack["default"], {
className: this.props.classes.itemFolderIconBack
}), /*#__PURE__*/_react["default"].createElement("div", {
className: _Utils["default"].clsx(this.props.classes['itemName' + this.state.viewType], this.props.classes['itemNameFolder' + this.state.viewType])
}, ".."));
}
}, {
key: "formatSize",
value: function formatSize(size) {
return /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes['itemSize' + this.state.viewType]
}, size || size === 0 ? _Utils["default"].formatBytes(size) : '');
}
}, {
key: "formatAcl",
value: function formatAcl(acl) {
var _this12 = this;
var access = acl && (acl.permissions || acl.file);
if (access) {
access = access.toString(16).padStart(3, '0');
}
return /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes['itemAccess' + this.state.viewType]
}, " ", /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
onClick: function onClick() {
return _this12.setState({
modalEditOfAccess: true
});
},
className: this.props.classes['itemAclButton' + this.state.viewType]
}, access || '---'));
}
}, {
key: "getFileIcon",
value: function getFileIcon(ext) {
switch (ext) {
case 'json':
return /*#__PURE__*/_react["default"].createElement(_Bookmark["default"], {
className: this.props.classes['itemIcon' + this.state.viewType]
});
case 'css':
return /*#__PURE__*/_react["default"].createElement(_BookmarkBorder["default"], {
className: this.props.classes['itemIcon' + this.state.viewType]
});
case 'js':
case 'ts':
return /*#__PURE__*/_react["default"].createElement(_Code["default"], {
className: this.props.classes['itemIcon' + this.state.viewType]
});
case 'html':
case 'md':
return /*#__PURE__*/_react["default"].createElement(_Description["default"], {
className: this.props.classes['itemIcon' + this.state.viewType]
});
case 'mp3':
case 'ogg':
case 'wav':
case 'm4a':
case 'mp4':
case 'flac':
return /*#__PURE__*/_react["default"].createElement(_MusicNote["default"], {
className: this.props.classes['itemIcon' + this.state.viewType]
});
default:
return /*#__PURE__*/_react["default"].createElement(_InsertDriveFile["default"], {
className: this.props.classes['itemIcon' + this.state.viewType]
});
}
}
}, {
key: "getEditFile",
value: function getEditFile(ext) {
switch (ext) {
case 'json':
case 'js':
case 'html':
case 'txt':
return true;
default:
return false;
}
}
}, {
key: "renderFile",
value: function renderFile(item) {
var _this13 = this;
var padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;
var ext = _Utils["default"].getFileExtension(item.name);
return /*#__PURE__*/_react["default"].createElement("div", {
key: item.id,
id: item.id,
onDoubleClick: function onDoubleClick() {
if (!_this13.props.onSelect) {
_this13.setState({
viewer: _this13.imagePrefix + item.id
});
} else if ((!_this13.props.filterFiles || _this13.props.filterFiles.includes(item.ext)) && (!_this13.props.filterByType || _FileViewer.EXTENSIONS[_this13.props.filterByType].includes(item.ext))) {
_this13.props.onSelect(item.id, true);
}
},
onClick: function onClick(e) {
return _this13.select(item.id, e);
},
style: this.state.viewType === TABLE ? {
marginLeft: padding,
width: 'calc(100% - ' + padding + 'px)'
} : {},
className: _Utils["default"].clsx('browserItem', this.props.classes['item' + this.state.viewType], this.props.classes['itemFile' + this.state.viewType], this.state.selected === item.id && this.props.classes.itemSelected)
}, _FileViewer.EXTENSIONS.images.includes(ext) ? /*#__PURE__*/_react["default"].createElement("img", {
onError: function onError(e) {
e.target.onerror = null;
e.target.src = _no_icon["default"];
},
className: _Utils["default"].clsx(this.props.classes['itemImage' + this.state.viewType], this.getClassBackgroundImage()),
src: this.imagePrefix + item.id,
alt: item.name
}) : this.getFileIcon(ext), /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes['itemName' + this.state.viewType]
}, item.name), /*#__PURE__*/_react["default"].createElement(_core.Hidden, {
xsDown: true
}, this.formatSize(item.size)), /*#__PURE__*/_react["default"].createElement(_core.Hidden, {
xsDown: true
}, this.state.viewType === TABLE ? this.formatAcl(item.acl) : null), /*#__PURE__*/_react["default"].createElement(_core.Hidden, {
xsDown: true
}, this.state.viewType === TABLE && this.props.expertMode && this.getEditFile(ext) ? /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
"aria-label": "delete",
onClick: function onClick(e) {
e.stopPropagation();
if (!_this13.props.onSelect) {
_this13.setState({
viewer: _this13.imagePrefix + item.id,
formatEditFile: ext
});
} else if ((!_this13.props.filterFiles || _this13.props.filterFiles.includes(item.ext)) && (!_this13.props.filterByType || _FileViewer.EXTENSIONS[_this13.props.filterByType].includes(item.ext))) {
_this13.props.onSelect(item.id, true);
}
},
className: this.props.classes['itemDeleteButton' + this.state.viewType]
}, /*#__PURE__*/_react["default"].createElement(_Edit["default"], {
fontSize: "small"
})) : /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes['itemDeleteButton' + this.state.viewType]
})), this.state.viewType === TABLE && this.props.allowDownload ? /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
download: true,
href: this.imagePrefix + item.id,
className: this.props.classes['itemDownloadButton' + this.state.viewType],
onClick: function onClick(e) {
return e.stopPropagation();
}
}, /*#__PURE__*/_react["default"].createElement(_SaveAlt["default"], null)) : null, this.state.viewType === TABLE && this.props.allowDelete && item.id !== 'vis.0/' && item.id !== USER_DATA && (this.state.expertMode || item.id.startsWith(USER_DATA) || item.id.startsWith('vis.0/')) ? /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
"aria-label": "delete",
onClick: function onClick(e) {
e.stopPropagation();
if (_this13.suppressDeleteConfirm > Date.now()) {
_this13.deleteItem(item.id);
} else {
_this13.setState({
deleteItem: item.id
});
}
},
className: this.props.classes['itemDeleteButton' + this.state.viewType]
}, /*#__PURE__*/_react["default"].createElement(_Delete["default"], {
fontSize: "small"
})) : this.state.viewType === TABLE && this.props.allowDelete ? /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes['itemDeleteButton' + this.state.viewType]
}) : null);
}
}, {
key: "renderItems",
value: function renderItems(folderId) {
var _this14 = this;
if (folderId && folderId !== '/' && !this.state.expertMode && folderId !== USER_DATA && !folderId.startsWith(USER_DATA) && folderId !== 'vis.0' && !folderId.startsWith('vis.0/')) {
return null;
} // tile
if (this.state.folders && this.state.folders[folderId]) {
if (this.state.viewType === TILE) {
var res = [];
if (folderId && folderId !== '/') {
res.push(this.renderBackFolder());
}
this.state.folders[folderId].forEach(function (item) {
if (!_this14.state.expertMode && item.id !== USER_DATA && !item.id.startsWith(USER_DATA) && item.id !== 'vis.0' && !item.id.startsWith('vis.0/')) {
return;
}
if (item.folder) {
res.push(_this14.renderFolder(item));
} else if ((!_this14.props.filterFiles || _this14.props.filterFiles.includes(item.ext)) && (!_this14.props.filterByType || _FileViewer.EXTENSIONS[_this14.props.filterByType].includes(item.ext))) {
res.push(_this14.renderFile(item));
}
});
return res;
} else {
return this.state.folders[folderId].map(function (item) {
var res = [];
if (item.id && item.id !== '/' && !_this14.state.expertMode && item.id !== USER_DATA && !item.id.startsWith(USER_DATA) && item.id !== 'vis.0' && !item.id.startsWith('vis.0/')) {
return null;
}
if (item.folder) {
var expanded = _this14.state.expanded.includes(item.id);
res.push(_this14.renderFolder(item, expanded));
if (_this14.state.folders[item.id] && expanded) {
res.push(_this14.renderItems(item.id));
}
} else if ((!_this14.props.filterFiles || _this14.props.filterFiles.includes(item.ext)) && (!_this14.props.filterByType || _FileViewer.EXTENSIONS[_this14.props.filterByType].includes(item.ext))) {
res.push(_this14.renderFile(item));
} else {
return null;
}
return res;
});
}
} else {
return /*#__PURE__*/_react["default"].createElement("div", {
style: {
position: 'relative'
}
}, /*#__PURE__*/_react["default"].createElement(_CircularProgress["default"], {
key: folderId,
color: "secondary",
size: 24
}), /*#__PURE__*/_react["default"].createElement("div", {
style: {
position: 'absolute',
zIndex: 2,
top: 4,
width: 24,
textAlign: 'center'
}
}, this.state.queueLength));
}
}
}, {
key: "renderToolbar",
value: function renderToolbar() {
var _this15 = this;
return /*#__PURE__*/_react["default"].createElement(_Toolbar["default"], {
key: "toolbar",
variant: "dense"
}, this.props.showExpertButton ? /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
edge: "start",
title: this.props.t('ra_Toggle expert mode'),
className: _Utils["default"].clsx(this.props.classes.menuButton, this.state.expertMode && this.props.classes.menuButtonExpertActive),
"aria-label": "expert mode",
onClick: function onClick() {
return _this15.setState({
expertMode: !_this15.state.expertMode
});
}
}, /*#__PURE__*/_react["default"].createElement(_IconExpert["default"], null)) : null, this.props.showViewTypeButton ? /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
edge: "start",
title: this.props.t('ra_Toggle view mode'),
className: this.props.classes.menuButton,
"aria-label": "view mode",
onClick: function onClick() {
var viewType = _this15.state.viewType === TABLE ? TILE : TABLE;
window.localStorage.setItem('files.viewType', viewType);
var currentDir = _this15.state.selected;
if (isFile(currentDir)) {
currentDir = getParentDir(currentDir);
}
_this15.setState({
viewType: viewType,
currentDir: currentDir
}, function () {
if (_this15.state.viewType === TABLE) {
_this15.scrollToSelected();
}
});
}
}, this.state.viewType !== TABLE ? /*#__PURE__*/_react["default"].createElement(_List["default"], null) : /*#__PURE__*/_react["default"].createElement(_ViewModule["default"], null)) : null, /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
edge: "start",
title: this.props.t('ra_Hide empty folders'),
className: this.props.classes.menuButton,
color: this.state.filterEmpty ? 'secondary' : 'inherit',
"aria-label": "filter empty",
onClick: function onClick() {
window.localStorage.setItem('file.empty', !_this15.state.filterEmpty);
_this15.setState({
filterEmpty: !_this15.state.filterEmpty
});
}
}, /*#__PURE__*/_react["default"].createElement(_FolderOpen["default"], null)), /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
edge: "start",
title: this.props.t('ra_Reload files'),
className: this.props.classes.menuButton,
color: 'inherit',
"aria-label": "reload files",
onClick: function onClick() {
return _th