@digifi-los/reactapp
Version:
427 lines (376 loc) • 14.6 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactRouter = require('react-router');
var _querystring = require('querystring');
var _querystring2 = _interopRequireDefault(_querystring);
var _reBulma = require('re-bulma');
var rb = _interopRequireWildcard(_reBulma);
var _debounce = require('debounce');
var _debounce2 = _interopRequireDefault(_debounce);
var _util = require('../../util');
var _util2 = _interopRequireDefault(_util);
var _pluralize = require('pluralize');
var _pluralize2 = _interopRequireDefault(_pluralize);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var propTypes = {
returnProperty: _react.PropTypes.any, //false or string property value
disabled: _react.PropTypes.bool,
returnFormOptionsValue: _react.PropTypes.bool,
selector: _react.PropTypes.string,
displayfield: _react.PropTypes.string,
displayProps: _react.PropTypes.object,
dbname: _react.PropTypes.string,
multi: _react.PropTypes.bool,
createable: _react.PropTypes.bool,
flattenDataList: _react.PropTypes.bool,
flattenDataListOptions: _react.PropTypes.any,
selectedData: _react.PropTypes.any,
resourceUrl: _react.PropTypes.string,
createResourceUrl: _react.PropTypes.string,
data: _react.PropTypes.array,
value: _react.PropTypes.any,
onChange: _react.PropTypes.func,
onFocus: _react.PropTypes.func,
onBlur: _react.PropTypes.func,
limit: _react.PropTypes.number,
datalistdata: _react.PropTypes.array
};
// import flatten from 'flat';
var defaultProps = {
disabled: false,
returnProperty: false,
returnFormOptionsValue: false,
data: false,
createable: false,
value: undefined,
displayProps: {},
selectData: [],
flattenDataList: true,
flattenDataListOptions: {},
selector: '_id',
displayField: 'title',
dbname: 'periodic',
limit: 10,
datalistdata: [],
onChange: function onChange(data) {
console.debug('ResponsiveDatalist onChange', { data: data });
},
onFocus: function onFocus(data) {
console.debug('ResponsiveDatalist onFocus', { data: data });
},
onBlur: function onBlur(data) {
console.debug('ResponsiveDatalist onBlur', { data: data });
}
};
function getDatumValue(datum) {
var returnProperty = this.props.returnFormOptionsValue || (0, _keys2.default)(datum).length === 2 && typeof datum.label !== 'undefined' && typeof datum.value !== 'undefined' ? 'value' : this.props.returnProperty;
return returnProperty ? datum[returnProperty] : datum;
}
var ResponsiveDatalist = function (_Component) {
(0, _inherits3.default)(ResponsiveDatalist, _Component);
function ResponsiveDatalist(props) {
(0, _classCallCheck3.default)(this, ResponsiveDatalist);
var _this = (0, _possibleConstructorReturn3.default)(this, (ResponsiveDatalist.__proto__ || (0, _getPrototypeOf2.default)(ResponsiveDatalist)).call(this, props));
_this.state = {
disabled: props.disabled,
data: props.data,
value: props.value,
selectedData: props.selectedData,
isSearching: false
};
_this.inputProps = (0, _assign2.default)({}, _this.props.passableProps);
_this.searchFunction = (0, _debounce2.default)(_this.updateDataList, 200);
_this.filterStaticData = _this.filterStaticData.bind(_this);
_this.getDatum = getDatumValue.bind(_this);
return _this;
}
(0, _createClass3.default)(ResponsiveDatalist, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
// console.debug({ nextProps });
// this.setState(Object.assign({}, nextProps, this.props.getState()));
// // console.log('this.state', this.state);
}
}, {
key: 'filterStaticData',
value: function filterStaticData(options) {
var _this2 = this;
if (this.props.returnFormOptionsValue) {
return this.props.datalistdata.filter(function (item) {
return item.label.indexOf(options.search) > -1;
});
} else if (options.search) {
return this.props.datalistdata.filter(function (item) {
return item[_this2.props.field].indexOf(options.search) > -1;
});
} else {
return this.props.datalistdata;
}
}
}, {
key: 'updateDataList',
value: function updateDataList(options) {
var _this3 = this;
// console.log('this.props.resourceUrl', this.props.resourceUrl);
if (this.props.resourceUrl) {
this.setState({ isSearching: true });
var stateProps = this.props.getState();
var fetchURL = this.props.resourceUrl + '&' + _querystring2.default.stringify({
limit: this.props.limit,
// sort: (newSortOptions.sortProp)
// ? `${newSortOptions.sortOrder}${newSortOptions.sortProp}`
// : undefined,
query: options.search,
allowSpecialCharacters: true
// pagenum: options.pagenum || 1,
});
var headers = (0, _assign2.default)({
'x-access-token': stateProps.user.jwt_token
}, stateProps.settings.userprofile.options.headers);
_util2.default.fetchComponent(fetchURL, { headers: headers })().then(function (response) {
if (response.data && response.result && response.status) {
response = response.data;
}
// console.debug('this.state.value',this.state.value);
var updatedState = {};
updatedState.selectedData = response[(0, _pluralize2.default)(_this3.props.entity)];
updatedState.isSearching = false;
_this3.setState(updatedState);
}, function (e) {
_this3.props.errorNotification(e);
});
} else if (this.props.staticSearch) {
this.setState({ isSearching: true });
//options.search is the actual content
var updatedState = {};
updatedState.selectedData = this.filterStaticData(options);
updatedState.isSearching = false;
// console.debug({updatedState,response});
this.setState(updatedState);
//value is the array of selected values
//selectedData is the filtered list that changes everytime user types
} else {
console.debug({ options: options });
}
}
}, {
key: 'onChangeHandler',
value: function onChangeHandler(event) {
var search = event && event.target && event.target.value ? event.target.value : '';
this.searchFunction({ search: search });
}
}, {
key: 'onBlurHandler',
value: function onBlurHandler() {
var _this4 = this;
setTimeout(function () {
_this4.setState({ selectedData: [] });
}, 400);
}
}, {
key: 'getDatalistDisplay',
value: function getDatalistDisplay(options) {
var displayField = options.displayField,
selector = options.selector,
datum = options.datum;
// console.debug('getDatalistDisplay', { options });
var displayText = datum[displayField] || datum.title || datum.name || datum.username || datum.email || datum[selector] || (datum && typeof datum === 'string' ? datum : '');
return _react2.default.createElement(
'span',
{ style: {
wordBreak: 'break-all',
textOverflow: 'ellipsis',
overflow: 'hidden',
whiteSpace: 'pre-wrap',
wordWrap: 'break-word'
} },
datum && datum.fileurl && datum.transform && datum.transform.preview ? _react2.default.createElement(rb.Image, { src: datum.transform.preview, size: 'is24X24', style: { float: 'left', marginRight: '5px' } }) : null,
this.props.resourcePreview ? _react2.default.createElement(
_reactRouter.Link,
{ title: datum.title || displayText, to: this.props.resourcePreview + '/' + (datum[selector] || datum) },
displayText
) : displayText,
this.props.resourceDescription ? _react2.default.createElement(
rb.Content,
null,
_react2.default.createElement(
'p',
null,
datum.description
)
) : null
);
}
}, {
key: 'removeDatalistItem',
value: function removeDatalistItem(index) {
var _this5 = this;
// console.debug('clicked datalist',{index});
// console.debug('clicked onclick',this.props);
// console.debug('this.state.value',this.state.value);
if (this.props.multi) {
var newValue = (0, _assign2.default)([], [].concat(this.state.value));
newValue.splice(index, 1);
// let oldValue = this.state.value;
this.setState({
// value: [],
value: newValue,
selectedData: [],
update: new Date()
}, function () {
// this.props.onChange([]);
_this5.props.onChange(newValue);
});
} else {
var datum = undefined;
this.setState({
value: datum,
selectedData: []
});
this.props.onChange(datum);
}
}
}, {
key: 'render',
value: function render() {
var _this6 = this;
var notificationStyle = {
marginBottom: '5px',
padding: '5px',
border: '1px solid lightgrey'
};
var notificationCloseStyle = {
margin: '0px 0px 0px 20px',
borderRadius: '19px'
};
var selectData = this.props.multi ? this.state.value && this.state.value.length ? this.state.value.map(function (selected, k) {
return _react2.default.createElement(
rb.Notification,
{
key: k,
enableCloseButton: true,
closeButtonProps: {
onClick: _this6.removeDatalistItem.bind(_this6, k),
style: notificationCloseStyle
},
style: notificationStyle
},
_this6.getDatalistDisplay({
datum: selected,
displayField: _this6.props.displayField,
selector: _this6.props.selector
})
);
}) : null : this.state.value ? _react2.default.createElement(
rb.Notification,
{
enableCloseButton: true,
closeButtonProps: {
onClick: this.removeDatalistItem.bind(this),
style: notificationCloseStyle
},
style: notificationStyle
},
this.getDatalistDisplay({
datum: this.state.value,
displayField: this.props.displayField,
selector: this.props.selector
})
) : null;
var displayOptions = Array.isArray(this.state.selectedData) && this.state.selectedData && this.state.selectedData.length ? this.state.selectedData.map(function (datum, k) {
return _react2.default.createElement(
rb.Notification,
{
key: k,
color: 'isWhite',
style: notificationStyle
},
_react2.default.createElement(rb.Button, {
icon: 'fa fa-plus',
size: 'isSmall',
style: {
alignSelf: 'flex-end',
borderRadius: '20px',
float: 'right',
paddingRight: '0px'
},
onClick: function onClick() {
// console.debug('clicked onclick',this.props);
if (_this6.props.multi) {
var newValue = _this6.state.value && Array.isArray(_this6.state.value) && _this6.state.value.length ? _this6.state.value.concat([datum]) : [datum];
_this6.setState({
value: newValue,
selectedData: []
});
_this6.props.onChange(newValue);
} else {
_this6.setState({
value: datum,
selectedData: []
});
_this6.props.onChange(datum);
}
} }),
_this6.getDatalistDisplay({
datum: datum,
displayField: _this6.props.displayField,
selector: _this6.props.selector
})
);
}) : null;
return _react2.default.createElement(
'div',
this.props.wrapperProps,
_react2.default.createElement(
'div',
{ style: { width: '100%' } },
_react2.default.createElement(rb.Input, (0, _extends3.default)({}, this.inputProps, {
state: this.state.isSearching || undefined,
onChange: this.onChangeHandler.bind(this),
onBlur: this.onBlurHandler.bind(this),
onFocus: this.onChangeHandler.bind(this),
ref: function ref(input) {
_this6.textInput = input;
}
}))
),
_react2.default.createElement(
'div',
this.props.displayProps,
' ',
displayOptions
),
_react2.default.createElement(
'div',
null,
selectData
)
);
}
}]);
return ResponsiveDatalist;
}(_react.Component);
ResponsiveDatalist.propType = propTypes;
ResponsiveDatalist.defaultProps = defaultProps;
exports.default = ResponsiveDatalist;