@iobroker/adapter-react
Version:
React classes to develop admin interfaces for ioBroker with react.
1,010 lines (888 loc) • 36.3 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
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 _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _styles = require("@material-ui/core/styles");
var _reactColorful = require("react-colorful");
var _Fab = _interopRequireDefault(require("@material-ui/core/Fab"));
var _Table = _interopRequireDefault(require("@material-ui/core/Table"));
var _TableBody = _interopRequireDefault(require("@material-ui/core/TableBody"));
var _TableCell = _interopRequireDefault(require("@material-ui/core/TableCell"));
var _TableHead = _interopRequireDefault(require("@material-ui/core/TableHead"));
var _TableRow = _interopRequireDefault(require("@material-ui/core/TableRow"));
var _TableSortLabel = _interopRequireDefault(require("@material-ui/core/TableSortLabel"));
var _IconButton = _interopRequireDefault(require("@material-ui/core/IconButton"));
var _Select = _interopRequireDefault(require("@material-ui/core/Select"));
var _MenuItem = _interopRequireDefault(require("@material-ui/core/MenuItem"));
var _TextField = _interopRequireDefault(require("@material-ui/core/TextField"));
var _Checkbox = _interopRequireDefault(require("@material-ui/core/Checkbox"));
var _Dialog = _interopRequireDefault(require("@material-ui/core/Dialog"));
var _Edit = _interopRequireDefault(require("@material-ui/icons/Edit"));
var _Delete = _interopRequireDefault(require("@material-ui/icons/Delete"));
var _NavigateNext = _interopRequireDefault(require("@material-ui/icons/NavigateNext"));
var _ExpandMore = _interopRequireDefault(require("@material-ui/icons/ExpandMore"));
var _Check = _interopRequireDefault(require("@material-ui/icons/Check"));
var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
var _Add = _interopRequireDefault(require("@material-ui/icons/Add"));
var _ViewHeadline = _interopRequireDefault(require("@material-ui/icons/ViewHeadline"));
var _Colorize = _interopRequireDefault(require("@material-ui/icons/Colorize"));
var _SelectID = _interopRequireDefault(require("../Dialogs/SelectID"));
var _Utils = _interopRequireDefault(require("./Utils"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
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; } }
function getAttr(obj, attr, lookup) {
if (typeof attr === 'string') {
attr = attr.split('.');
}
if (!obj) {
return null;
}
if (attr.length === 1) {
if (lookup && lookup[obj[attr[0]]]) {
return lookup[obj[attr[0]]];
} else {
return obj[attr[0]];
}
} else {
var name = attr.shift();
return getAttr(obj[name], attr);
}
}
function setAttr(obj, attr, value) {
if (typeof attr === 'string') {
attr = attr.split('.');
}
if (attr.length === 1) {
return obj[attr[0]] = value;
} else {
var name = attr.shift();
if (obj[name] === null || obj[name] === undefined) {
obj[name] = {};
}
return setAttr(obj[name], attr, value);
}
}
var styles = function styles(theme) {
return {
tableContainer: {
width: '100%',
height: '100%',
overflow: 'auto'
},
table: {
width: '100%',
minWidth: 800,
maxWidth: 1920
},
cell: {
paddingTop: 0,
paddingBottom: 0,
paddingLeft: 4,
paddingRight: 4
},
rowMainWithChildren: {},
rowMainWithoutChildren: {},
rowNoEdit: {
opacity: 0.3
},
cellExpand: {
width: 30
},
cellButton: {
width: 30
},
cellHeader: {
fontWeight: 'bold',
background: theme.palette.type === 'dark' ? '#888' : '#888',
color: theme.palette.type === 'dark' ? '#EEE' : '#111',
height: 48,
wordBreak: 'break-word',
whiteSpace: 'pre'
},
width_name_nicknames: {
maxWidth: 150
},
width_ioType: {
maxWidth: 100
},
width_type: {
maxWidth: 100
},
width_displayTraits: {
maxWidth: 100
},
width_roomHint: {
maxWidth: 100
},
rowSecondary: {
fontStyle: 'italic'
},
cellSecondary: {
fontSize: 10
},
visuallyHidden: {
border: 0,
clip: 'rect(0 0 0 0)',
height: 1,
margin: -1,
overflow: 'hidden',
padding: 0,
position: 'absolute',
top: 20,
width: 1
},
fieldEditWithButton: {
width: "calc(100% - 33px)",
display: 'inline-block'
},
fieldEdit: {
width: "100%",
display: 'inline-block',
lineHeight: '50px',
verticalAlign: 'middle'
},
fieldButton: {
width: 30,
display: 'inline-block'
},
colorDialog: {
overflow: 'hidden',
padding: 15
},
subText: {
fontSize: 10,
fontStyle: 'italic'
},
glow: {
animation: 'glow 0.2s 2 alternate'
}
};
};
function descendingComparator(a, b, orderBy, lookup) {
var _a = getAttr(a, orderBy, lookup) || '';
var _b = getAttr(b, orderBy, lookup) || '';
if (_b < _a) {
return -1;
} else if (_b > _a) {
return 1;
} else {
return 0;
}
}
function getComparator(order, orderBy, lookup) {
return order === 'desc' ? function (a, b) {
return descendingComparator(a, b, orderBy, lookup);
} : function (a, b) {
return -descendingComparator(a, b, orderBy, lookup);
};
}
function stableSort(array, comparator) {
var stabilizedThis = array.map(function (el, index) {
return [el, index];
});
stabilizedThis.sort(function (a, b) {
var order = comparator(a[0], b[0]);
if (order) {
return order;
} else {
return a[1] - b[1];
}
});
return stabilizedThis.map(function (el) {
return el[0];
});
}
var TreeTable = /*#__PURE__*/function (_React$Component) {
(0, _inherits2["default"])(TreeTable, _React$Component);
var _super = _createSuper(TreeTable);
function TreeTable(props) {
var _this;
(0, _classCallCheck2["default"])(this, TreeTable);
_this = _super.call(this, props);
var opened = window.localStorage.getItem(_this.props.name || 'iob-table') || '[]';
try {
opened = JSON.parse(opened) || [];
} catch (e) {
opened = [];
}
if (!Array.isArray(opened)) {
opened = [];
}
_this.state = {
opened: opened,
editMode: false,
deleteMode: false,
editData: null,
order: 'asc',
update: null,
orderBy: _this.props.columns[0].field,
useTable: false,
showSelectColor: false,
glowOnChange: props.glowOnChange
};
return _this;
}
(0, _createClass2["default"])(TreeTable, [{
key: "renderCellEdit",
value: function renderCellEdit(item, col) {
var val = getAttr(item, col.field);
if (Array.isArray(val)) {
val = val[0];
}
if (col.lookup) {
return this.renderCellEditSelect(item, col, val);
}
if (col.editComponent) {
return this.renderCellEditCustom(item, col, val);
} else {
if (col.type === 'boolean' || !col.type && typeof val === 'boolean') {
return this.renderCellEditBoolean(item, col, val);
} else if (col.type === 'color') {
return this.renderCellEditColor(item, col, val);
} else if (col.type === 'oid') {
return this.renderCellEditObjectID(item, col, val);
} else {
return this.renderCellEditString(item, col, val);
}
}
}
}, {
key: "renderCellEditSelect",
value: function renderCellEditSelect(item, col, val) {
var _this2 = this;
return /*#__PURE__*/_react["default"].createElement(_Select["default"], {
onChange: function onChange(e) {
var editData = _this2.state.editData ? _objectSpread({}, _this2.state.editData) : {};
if (e.target.value === val) {
delete editData[col.field];
} else {
editData[col.field] = e.target.value;
}
_this2.setState({
editData: editData
});
},
value: this.state.editData && this.state.editData[col.field] || val
}, Object.keys(col.lookup).map(function (v) {
return /*#__PURE__*/_react["default"].createElement(_MenuItem["default"], {
value: v
}, col.lookup[v]);
}));
}
}, {
key: "renderCellEditString",
value: function renderCellEditString(item, col, val) {
var _this3 = this;
return /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
className: this.props.classes.fieldEdit,
fullWidth: true,
value: this.state.editData && this.state.editData[col.field] !== undefined ? this.state.editData[col.field] : val,
onChange: function onChange(e) {
var editData = _this3.state.editData ? _objectSpread({}, _this3.state.editData) : {};
if (e.target.value === val) {
delete editData[col.field];
} else {
editData[col.field] = e.target.value;
}
_this3.setState({
editData: editData
});
}
});
}
}, {
key: "renderCellEditCustom",
value: function renderCellEditCustom(item, col, val) {
var _this4 = this;
var EditComponent = col.editComponent; // use new value if exists
if (this.state.editData && this.state.editData[col.field] !== undefined) {
val = this.state.editData[col.field];
item = JSON.parse(JSON.stringify(item));
item[col.field] = val;
}
return /*#__PURE__*/_react["default"].createElement(EditComponent, {
value: val,
rowData: item,
onChange: function onChange(newVal) {
var editData = _this4.state.editData ? _objectSpread({}, _this4.state.editData) : {};
if (newVal === val) {
delete editData[col.field];
} else {
editData[col.field] = newVal;
}
_this4.setState({
editData: editData
});
}
});
}
}, {
key: "renderCellEditBoolean",
value: function renderCellEditBoolean(item, col, val) {
var _this5 = this;
return /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
checked: this.state.editData && this.state.editData[col.field] !== undefined ? !!this.state.editData[col.field] : !!val,
onChange: function onChange(e) {
var editData = _this5.state.editData ? _objectSpread({}, _this5.state.editData) : {};
if (e.target.checked === !!val) {
delete editData[col.field];
} else {
editData[col.field] = e.target.checked;
}
_this5.setState({
editData: editData
});
},
inputProps: {
'aria-label': 'checkbox'
}
});
}
}, {
key: "renderSelectColorDialog",
value: function renderSelectColorDialog() {
var _this6 = this;
return /*#__PURE__*/_react["default"].createElement(_Dialog["default"], {
classes: {
root: this.props.classes.colorDialog,
paper: this.props.classes.colorDialog
},
onClose: function onClose() {
_this6.selectCallback = null;
_this6.setState({
showSelectColor: false
});
},
open: this.state.showSelectColor
}, /*#__PURE__*/_react["default"].createElement(_reactColorful.HexColorPicker, {
color: this.state.selectIdValue,
onChange: function onChange(color) {
_this6.setState({
selectIdValue: color
}, function () {
return _this6.selectCallback && _this6.selectCallback(color);
});
}
}));
}
}, {
key: "renderCellEditColor",
value: function renderCellEditColor(item, col, val) {
var _this7 = this;
var _val = this.state.editData && this.state.editData[col.field] !== undefined ? this.state.editData[col.field] : val;
return /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes.fieldEdit
}, /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
fullWidth: true,
className: this.props.classes.fieldEditWithButton,
value: _val,
inputProps: {
style: {
backgroundColor: _val,
color: _Utils["default"].isUseBright(_val, null) ? '#FFF' : '#000'
}
},
onChange: function onChange(e) {
var editData = _this7.state.editData ? _objectSpread({}, _this7.state.editData) : {};
if (e.target.value === val) {
delete editData[col.field];
} else {
editData[col.field] = e.target.value;
}
_this7.setState({
editData: editData
});
}
}), /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
className: this.props.classes.fieldButton,
contained: true,
onClick: function onClick() {
_this7.selectCallback = function (newColor) {
var editData = _this7.state.editData ? _objectSpread({}, _this7.state.editData) : {};
if (newColor === val) {
delete editData[col.field];
} else {
editData[col.field] = newColor;
}
_this7.setState({
editData: editData
});
};
_this7.setState({
showSelectColor: true,
selectIdValue: val
});
}
}, /*#__PURE__*/_react["default"].createElement(_Colorize["default"], null)));
}
}, {
key: "renderSelectIdDialog",
value: function renderSelectIdDialog() {
var _this8 = this;
if (this.state.showSelectId) {
return /*#__PURE__*/_react["default"].createElement(_SelectID["default"], {
key: "tableSelect",
imagePrefix: "../..",
dialogName: this.props.adapterName,
themeType: this.props.themeType,
socket: this.props.socket,
statesOnly: true,
selected: this.state.selectIdValue,
onClose: function onClose() {
return _this8.setState({
showSelectId: false
});
},
onOk: function onOk(selected, name) {
_this8.setState({
showSelectId: false,
selectIdValue: null
});
_this8.selectCallback && _this8.selectCallback(selected);
_this8.selectCallback = null;
}
});
} else {
return null;
}
}
}, {
key: "renderCellEditObjectID",
value: function renderCellEditObjectID(item, col, val) {
var _this9 = this;
return /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes.fieldEdit
}, /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
fullWidth: true,
className: this.props.classes.fieldEditWithButton,
value: this.state.editData && this.state.editData[col.field] !== undefined ? this.state.editData[col.field] : val,
onChange: function onChange(e) {
var editData = _this9.state.editData ? _objectSpread({}, _this9.state.editData) : {};
if (e.target.value === val) {
delete editData[col.field];
} else {
editData[col.field] = e.target.value;
}
_this9.setState({
editData: editData
});
}
}), /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
className: this.props.classes.fieldButton,
contained: true,
onClick: function onClick() {
_this9.selectCallback = function (selected) {
var editData = _this9.state.editData ? _objectSpread({}, _this9.state.editData) : {};
if (selected === val) {
delete editData[col.field];
} else {
editData[col.field] = selected;
}
_this9.setState({
editData: editData
});
};
_this9.setState({
showSelectId: true,
selectIdValue: val
});
}
}, /*#__PURE__*/_react["default"].createElement(_ViewHeadline["default"], null)));
}
}, {
key: "renderCellNonEdit",
value: function renderCellNonEdit(item, col) {
var val = getAttr(item, col.field, col.lookup);
if (Array.isArray(val)) {
val = val[0];
}
if (col.type === 'boolean') {
return /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
checked: !!val,
disabled: true,
inputProps: {
'aria-label': 'checkbox'
}
});
} else {
return val;
}
}
}, {
key: "renderCell",
value: function renderCell(item, col, level, i) {
if (this.state.editMode === i && col.editable !== 'never' && col.editable !== false) {
return /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
key: col.field,
className: _Utils["default"].clsx(this.props.classes.cell, level && this.props.classes.cellSecondary),
style: col.cellStyle,
component: "th"
}, this.renderCellEdit(item, col));
} else {
return /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
key: col.field,
className: _Utils["default"].clsx(this.props.classes.cell, level && this.props.classes.cellSecondary),
style: col.cellStyle,
component: "th"
}, this.renderCellNonEdit(item, col));
}
}
}, {
key: "renderCellWithSubField",
value: function renderCellWithSubField(item, col) {
var main = getAttr(item, col.field, col.lookup);
var sub = getAttr(item, col.subField, col.subLookup);
return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes.mainText
}, main), /*#__PURE__*/_react["default"].createElement("div", {
className: this.props.classes.subText,
style: col.subStyle || {}
}, sub));
}
}, {
key: "renderLine",
value: function renderLine(item, level) {
var _this10 = this;
var levelShift = this.props.levelShift === undefined ? 24 : this.props.levelShift;
level = level || 0;
var i = this.props.data.indexOf(item);
if (!item) {
return null;
}
if (!level && item.parentId) {
return null;
} else if (level && !item.parentId) {
return null; // should never happen
} else {
// try to find children
var opened = this.state.opened.includes(item.id);
var children = this.props.data.filter(function (it) {
return it.parentId === item.id;
});
return [/*#__PURE__*/_react["default"].createElement(_TableRow["default"], {
key: item.id,
className: _Utils["default"].clsx('table-row-' + (item.id || '').toString().replace(/[.$]/g, '_'), this.state.update && this.state.update.includes(item.id) && this.props.classes.glow, this.props.classes.row, level && this.props.classes.rowSecondary, !level && children.length && this.props.classes.rowMainWithChildren, !level && !children.length && this.props.classes.rowMainWithoutChildren, this.state.editMode !== false && this.state.editMode !== i && this.props.classes.rowNoEdit, this.state.deleteMode !== false && this.state.deleteMode !== i && this.props.classes.rowNoEdit)
}, /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
className: _Utils["default"].clsx(this.props.classes.cell, this.props.classes.cellExpand, level && this.props.classes.cellSecondary)
}, children.length ? /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
onClick: function onClick() {
var opened = (0, _toConsumableArray2["default"])(_this10.state.opened);
var pos = opened.indexOf(item.id);
if (pos === -1) {
opened.push(item.id);
opened.sort();
} else {
opened.splice(pos, 1);
}
window.localStorage.setItem(_this10.props.name || 'iob-table', JSON.stringify(opened));
_this10.setState({
opened: opened
});
}
}, opened ? /*#__PURE__*/_react["default"].createElement(_ExpandMore["default"], null) : /*#__PURE__*/_react["default"].createElement(_NavigateNext["default"], null)) : null), /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
scope: "row",
className: _Utils["default"].clsx(this.props.classes.cell, level && this.props.classes.cellSecondary),
style: Object.assign({}, this.props.columns[0].cellStyle, {
paddingLeft: levelShift * level
})
}, this.props.columns[0].subField ? this.renderCellWithSubField(item, this.props.columns[0]) : getAttr(item, this.props.columns[0].field, this.props.columns[0].lookup)), this.props.columns.map(function (col, ii) {
return !ii && !col.hidden ? null : _this10.renderCell(item, col, level, i);
}), this.props.onUpdate ? /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
className: _Utils["default"].clsx(this.props.classes.cell, this.props.classes.cellButton)
}, this.state.editMode === i || this.state.deleteMode === i ? /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
disabled: this.state.editMode !== false && (!this.state.editData || !Object.keys(this.state.editData).length),
onClick: function onClick() {
if (_this10.state.editMode !== false) {
var newData = JSON.parse(JSON.stringify(item));
Object.keys(_this10.state.editData).forEach(function (attr) {
return setAttr(newData, attr, _this10.state.editData[attr]);
});
_this10.setState({
editMode: false
}, function () {
return _this10.props.onUpdate(newData, item);
});
} else {
_this10.setState({
deleteMode: false
}, function () {
return _this10.props.onDelete(item);
});
}
}
}, /*#__PURE__*/_react["default"].createElement(_Check["default"], null)) : /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
disabled: this.state.editMode !== false,
onClick: function onClick() {
return _this10.setState({
editMode: i,
editData: null
});
}
}, /*#__PURE__*/_react["default"].createElement(_Edit["default"], null))) : null, this.props.onUpdate || this.props.onDelete ? /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
className: _Utils["default"].clsx(this.props.classes.cell, this.props.classes.cellButton)
}, this.state.editMode === i || this.state.deleteMode === i ? /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
onClick: function onClick() {
return _this10.setState({
editMode: false,
deleteMode: false
});
}
}, /*#__PURE__*/_react["default"].createElement(_Close["default"], null)) : this.props.onDelete ? /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
disabled: this.state.deleteMode !== false,
onClick: function onClick() {
return _this10.setState({
deleteMode: i
});
}
}, /*#__PURE__*/_react["default"].createElement(_Delete["default"], null)) : null) : null), !level && opened ? children.map(function (item) {
return _this10.renderLine(item, level + 1);
}) : null];
}
}
}, {
key: "handleRequestSort",
value: function handleRequestSort(property) {
var isAsc = this.state.orderBy === property && this.state.order === 'asc';
this.setState({
order: isAsc ? 'desc' : 'asc',
orderBy: property
});
}
}, {
key: "renderHead",
value: function renderHead() {
var _this11 = this;
return /*#__PURE__*/_react["default"].createElement(_TableHead["default"], null, /*#__PURE__*/_react["default"].createElement(_TableRow["default"], {
key: "headerRow"
}, /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
component: "th",
className: _Utils["default"].clsx(this.props.classes.cell, this.props.classes.cellHeader, this.props.classes.cellExpand)
}), /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
component: "th",
className: _Utils["default"].clsx(this.props.classes.cell, this.props.classes.cellHeader, this.props.classes['width_' + this.props.columns[0].field.replace(/\./g, '_')]),
style: this.props.columns[0].headerStyle || this.props.columns[0].cellStyle,
sortDirection: this.props.noSort ? false : this.state.orderBy === this.props.columns[0].field ? this.state.order : false
}, this.props.noSort ? null : /*#__PURE__*/_react["default"].createElement(_TableSortLabel["default"], {
active: this.state.orderBy === this.props.columns[0].field,
direction: this.state.orderBy === this.props.columns[0].field ? this.state.order : 'asc',
onClick: function onClick() {
return _this11.handleRequestSort(_this11.props.columns[0].field);
}
}, this.props.columns[0].title || this.props.columns[0].field, this.state.orderBy === this.props.columns[0].field ? /*#__PURE__*/_react["default"].createElement("span", {
className: this.props.classes.visuallyHidden
}, this.state.order === 'desc' ? 'sorted descending' : 'sorted ascending') : null)), this.props.columns.map(function (col, i) {
return !i && !col.hidden ? null : /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
key: col.field,
className: _Utils["default"].clsx(_this11.props.classes.cell, _this11.props.classes.cellHeader, _this11.props.classes['width_' + col.field.replace(/\./g, '_')]),
style: col.headerStyle || col.cellStyle,
component: "th"
}, _this11.props.noSort ? null : /*#__PURE__*/_react["default"].createElement(_TableSortLabel["default"], {
active: _this11.state.orderBy === col.field,
direction: _this11.state.orderBy === col.field ? _this11.state.order : 'asc',
onClick: function onClick() {
return _this11.handleRequestSort(col.field);
}
}, col.title || col.field, _this11.state.orderBy === col.field ? /*#__PURE__*/_react["default"].createElement("span", {
className: _this11.props.classes.visuallyHidden
}, _this11.state.order === 'desc' ? 'sorted descending' : 'sorted ascending') : null));
}), this.props.onUpdate ? /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
component: "th",
className: _Utils["default"].clsx(this.props.classes.cell, this.props.classes.cellHeader, this.props.classes.cellButton)
}, !this.props.noAdd ? /*#__PURE__*/_react["default"].createElement(_Fab["default"], {
color: "primary",
size: "small",
disabled: this.state.editMode !== false,
onClick: function onClick() {
return _this11.props.onUpdate(true);
}
}, /*#__PURE__*/_react["default"].createElement(_Add["default"], null)) : null) : null, this.props.onDelete || this.props.onUpdate ? /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
component: "th",
className: _Utils["default"].clsx(this.props.classes.cell, this.props.classes.cellHeader, this.props.classes.cellButton)
}) : null));
}
}, {
key: "render",
value: function render() {
var _this12 = this;
var lookup = this.props.columns.find(function (col) {
return col.field === _this12.state.orderBy;
}).lookup;
var table = stableSort(this.props.data, getComparator(this.state.order, this.state.orderBy, lookup));
if (this.state.update && this.state.update.length) {
this.updateTimeout && clearTimeout(this.updateTimeout);
this.updateTimeout = setTimeout(function () {
_this12.updateTimeout = null;
_this12.setState({
update: null
});
}, 500);
}
return /*#__PURE__*/_react["default"].createElement("div", {
className: _Utils["default"].clsx(this.props.classes.tableContainer, this.props.className)
}, /*#__PURE__*/_react["default"].createElement(_Table["default"], {
className: this.props.classes.table,
"aria-label": "simple table",
size: "small",
stickyHeader: true
}, this.renderHead(), /*#__PURE__*/_react["default"].createElement(_TableBody["default"], null, table.map(function (item) {
return _this12.renderLine(item);
}))), this.renderSelectIdDialog(), this.renderSelectColorDialog());
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(props, state) {
if (props.glowOnChange) {
var update = [];
var count = 0;
if (props.data && state.data) {
props.data.forEach(function (line) {
count++;
var oldLine = state.data.find(function (it) {
return it.id === line.id;
});
if (oldLine) {
if (JSON.stringify(oldLine) !== JSON.stringify(line)) {
update.push(line.id);
}
} else {
update.push(line.id);
}
});
}
if (update.length && update.length !== count) {
return {
data: props.data,
update: update
};
} else {
return {
data: props.data
};
}
} else {
return {
data: props.data
};
}
}
}]);
return TreeTable;
}(_react["default"].Component);
/*
const columns = [
{
title: 'Name of field', // required, else it will be "field"
field: 'fieldIdInData', // required
editable: false, // or true [default - true]
cellStyle: { // CSS style - // optional
maxWidth: '12rem',
overflow: 'hidden',
wordBreak: 'break-word'
},
lookup: { // optional => edit will be automatically "SELECT"
'value1': 'text1',
'value2': 'text2',
}
},
{
title: 'Type', // required, else it will be "field"
field: 'myType', // required
editable: true, // or true [default - true]
lookup: { // optional => edit will be automatically "SELECT"
'number': 'Number',
'string': 'String',
'boolean': 'Boolean',
},
type: 'number/string/color/oid/icon/boolean', // oid=ObjectID,icon=base64-icon
editComponent: props =>
<div>Prefix{ <br/>
<textarea
rows={4}
style={{width: '100%', resize: 'vertical'}}
value={props.value}
onChange={e => props.onChange(e.target.value)}
/>
Suffix
</div>,
},
];
*/
/* const data = [
{
id: 'UniqueID1' // required
fieldIdInData: 'Name1',
myType: 'number',
},
{
id: 'UniqueID2' // required
fieldIdInData: 'Name12',
myType: 'string',
},
];
*/
/*
// STYLES
const styles = theme => ({
tableDiv: {
width: '100%',
overflow: 'hidden',
height: 'calc(100% - 48px)',
},
});
// renderTable
renderTable() {
return <div className={this.props.classes.tableDiv}>
<TreeTable
columns={this.columns}
data={lines}
onUpdate={(newData, oldData) => console.log('Update: ' + JSON.stringify(newData))}
onDelete={oldData => console.log('Delete: ' + JSON.stringify(oldData))}
/>
</div>;
}
*/
TreeTable.propTypes = {
data: _propTypes["default"].array.isRequired,
className: _propTypes["default"].string,
loading: _propTypes["default"].bool,
name: _propTypes["default"].string,
// name of table to save settings in localStorage
columns: _propTypes["default"].arrayOf(_propTypes["default"].shape({
cellStyle: _propTypes["default"].object,
editComponent: _propTypes["default"].func,
field: _propTypes["default"].string,
headerStyle: _propTypes["default"].object,
hidden: _propTypes["default"].bool,
lookup: _propTypes["default"].object,
editable: _propTypes["default"].bool,
title: _propTypes["default"].string,
type: _propTypes["default"].oneOf(['string', 'boolean', 'numeric', 'icon', // todo: not yet implemented
'oid', 'color'])
})).isRequired,
noSort: _propTypes["default"].bool,
onUpdate: _propTypes["default"].func,
onDelete: _propTypes["default"].func,
noAdd: _propTypes["default"].bool,
// hide add button
themeType: _propTypes["default"].string,
glowOnChange: _propTypes["default"].bool,
socket: _propTypes["default"].object,
// only if oid type is used
levelShift: _propTypes["default"].number // Shift in pixels for every level
};
var _default = (0, _styles.withStyles)(styles)(TreeTable);
exports["default"] = _default;
//# sourceMappingURL=TreeTable.js.map