UNPKG

ucsc-xena-client

Version:

UCSC Xena Client. Functional genomics visualizations.

354 lines (296 loc) 12.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _dialog = require('react-toolbox/lib/dialog'); var _dialog2 = _interopRequireDefault(_dialog); var _PureComponent2 = require('./PureComponent'); var _PureComponent3 = _interopRequireDefault(_PureComponent2); var _link = require('react-toolbox/lib/link'); var _link2 = _interopRequireDefault(_link); var _LaunchHelperModule = require('./LaunchHelper.module.css'); var _LaunchHelperModule2 = _interopRequireDefault(_LaunchHelperModule); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } 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; } var _require = require('../underscore_ext'), map = _require.map, pick = _require.pick, mapObject = _require.mapObject, getIn = _require.getIn, get = _require.get; var _require2 = require('./defaultServers'), localHub = _require2.servers.localHub; var platform = require('platform'); var _require3 = require('./xenaQuery'), testStatus = _require3.testStatus; var Rx = require('./rx'); var osFiles = { osxJre: { pattern: "ucsc_xena_macos_[_0-9]*_with_jre.dmg", description: "OSX installer, bundled JRE", help: "Recommended for OSX 10.7 and above" }, osxNoJre: { pattern: "ucsc_xena_macos_[_0-9]*.dmg", description: "OSX installer, no JRE", help: "Recommended for OSX 10.6" }, win32: { pattern: "ucsc_xena_windows_[_0-9]*.exe", description: "Windows 32 bit installer, bundled JRE", help: "Recommended for all 32 bit versions of Windows" }, win64: { pattern: "ucsc_xena_windows-x64_[_0-9]*.exe", description: "Windows 64 bit installer, bundled JRE", help: "Recommended for all 64 bit versions of Windows" }, tar: { pattern: "ucsc_xena_[_0-9]*.tar.gz", description: "Tar archive, no updater or JRE", help: "Recommended for linux server deployments" } }, defaults = { 'OS X': { 32: 'osxNoJre', 64: 'osxJre' }, 'Windows': { 32: 'win32', 64: 'win64' }, 'Linux': { 32: 'tar', 64: 'tar' } }; function findMatch(pattern, list) { var matches = list.filter(function (s) { return s.match(pattern); }); return matches.length > 0 ? matches[0] : undefined; } var matchPaths = function matchPaths(serverFiles) { return mapObject(osFiles, function (_ref, key) { var pattern = _ref.pattern; return findMatch(osFiles[key].pattern, serverFiles); }); }; var parseInt10 = function parseInt10(s) { return parseInt(s, 10); }; function osxArch() { var version = getIn(platform, ['os', 'version']), parts = version && version.match(/(\d*)\.(\d*)/).slice(1).map(parseInt10); // [maj, min, patch] return parts && parts[0] === 10 && parts[1] <= 6 ? 32 : 64; } function getOs() { var family = getIn(platform, ['os', 'family']); if (family) { if (family.indexOf('Windows') !== -1) { return 'Windows'; } if (family.indexOf('OS X') !== -1) { return 'OS X'; } if (family.indexOf('Linux') !== -1) { return 'Linux'; } } } var downloadDir = 'https://genome-cancer.ucsc.edu/download/public/get-xena'; var i4jLogo = downloadDir + '/install4j_small.png'; var updatesPath = downloadDir + '/updates.xml'; var downloadPath = function downloadPath(name) { return downloadDir + '/' + name; }; var getFileName = function getFileName(e) { return downloadPath(e.getAttribute('fileName')); }; var XenaDownload = function (_React$Component) { _inherits(XenaDownload, _React$Component); function XenaDownload() { var _ref2; var _temp, _this, _ret; _classCallCheck(this, XenaDownload); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref2 = XenaDownload.__proto__ || Object.getPrototypeOf(XenaDownload)).call.apply(_ref2, [this].concat(args))), _this), _this.state = {}, _temp), _possibleConstructorReturn(_this, _ret); } _createClass(XenaDownload, [{ key: 'componentDidMount', value: function componentDidMount() { var _this2 = this; this.sub = Rx.Observable.ajax({ method: 'GET', responseType: 'xml', url: updatesPath, crossDomain: true }).subscribe(function (xml) { var files = matchPaths([].concat(_toConsumableArray(xml.response.getElementsByTagName('entry'))).map(getFileName)); _this2.setState({ files: files }); //eslint-disable-line react/no-did-mount-set-state }); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.sub.unsubscribe(); } }, { key: 'onShowAdvanced', value: function onShowAdvanced() { this.props.onShowAdvanced(!this.props.advanced); } }, { key: 'render', value: function render() { var files = this.state.files, advanced = this.props.advanced, os = getOs(), arch = os === 'OS X' ? osxArch() : getIn(platform, ['os', 'architecture']), defaultTarget = getIn(defaults, [os, arch]), defaultInstall = get(files, defaultTarget); return _react2.default.createElement( 'div', { className: _LaunchHelperModule2.default.download }, defaultInstall ? _react2.default.createElement(_link2.default, { className: _LaunchHelperModule2.default.downloadLink, href: defaultInstall, label: 'Install UCSC Xena hub' }) : null, defaultInstall ? _react2.default.createElement(_link2.default, { className: _LaunchHelperModule2.default.advancedLink, onClick: this.onShowAdvanced, label: 'Show ' + (advanced ? 'Basic' : 'Advanced') }) : null, defaultInstall ? _react2.default.createElement('br', null) : null, defaultInstall || advanced ? 'Other installers' : 'Please download an installer', files && (advanced || !defaultInstall) ? map(pick(osFiles, function (_, k) { return files[k]; }), function (info, key) { return _react2.default.createElement(_link2.default, { className: _LaunchHelperModule2.default.downloadLink, href: files[key], title: info.help, label: info.description }); }) : null, _react2.default.createElement('br', null), _react2.default.createElement('img', { src: i4jLogo }) ); } }]); return XenaDownload; }(_react2.default.Component); var statusHelp = { down: _react2.default.createElement( 'div', null, _react2.default.createElement( 'p', null, 'Attempting to start the Xena Hub on your computer...' ), _react2.default.createElement( 'p', null, 'The Xena Hub needs to be running for you to import or visualize data from your own computer.' ) ), failed: _react2.default.createElement( 'div', null, _react2.default.createElement( 'p', null, 'We were not able to start up the Xena Hub for you. Please open the application from your Applications Folder, or download a local hub if you have not previously installed one.' ), _react2.default.createElement( 'p', null, 'The Xena Hub needs to be running for you to import or visualize data from your own computer.' ) ), up: _react2.default.createElement( 'div', null, _react2.default.createElement( 'p', null, 'Your local Xena Hub is running.' ), _react2.default.createElement( 'p', null, 'To view your data, use the "Visualize" button' ) ) }; var refresh = 2000; var localTimeout = 500; // use a short timeout for localhost var LaunchHelper = function (_PureComponent) { _inherits(LaunchHelper, _PureComponent); function LaunchHelper() { var _ref3; var _temp2, _this3, _ret2; _classCallCheck(this, LaunchHelper); for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } return _ret2 = (_temp2 = (_this3 = _possibleConstructorReturn(this, (_ref3 = LaunchHelper.__proto__ || Object.getPrototypeOf(LaunchHelper)).call.apply(_ref3, [this].concat(args))), _this3), _this3.state = { status: undefined, launched: undefined, advanced: false }, _this3.launch = function () { var i = document.getElementById('xenaLauncher'); if (i) { document.body.removeChild(i); } i = document.createElement('iframe'); i.id = 'xenaLauncher'; document.body.appendChild(i); i.src = 'ucscxena://'; _this3.setState({ launched: true }); }, _this3.onRaise = function () { Rx.Observable.ajax({ method: 'GET', url: localHub + '/raise/', crossDomain: true }).subscribe(function () {}); }, _this3.updatePing = function (resp) { if (resp.status === 'up' && _this3.state.status !== 'up') { _this3.props.callback(['cohort-summary-clear', { server: localHub }]); } _this3.setState(resp); }, _this3.onShowAdvanced = function (advanced) { _this3.setState({ advanced: advanced }); }, _this3.actions = [{ label: 'Help', onClick: _this3.onHelp }, { label: 'Contact Us', onClick: _this3.onContact }, { label: 'Close', onClick: _this3.onClose }], _temp2), _possibleConstructorReturn(_this3, _ret2); } // status: // undefined: waiting on first ping // down: pings have failed // starting: server is up but not yet able to service requests // up: server is up _createClass(LaunchHelper, [{ key: 'componentDidMount', value: function componentDidMount() { var _this4 = this; this.sub = Rx.Observable.of(true).merge(Rx.Observable.interval(refresh)).flatMap(function () { return testStatus(localHub, localTimeout); }).takeWhile(function (_ref4) { var status = _ref4.status; return status !== 'up'; }).concat(Rx.Observable.of({ status: 'up' })).subscribe(this.updatePing); // Try to launch if we don't get a response. this.timeoutID = setTimeout(function () { if (_this4.state.status !== 'up' && !_this4.state.launched) { _this4.launch(); } }, 2000); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { if (this.timeoutID) { clearTimeout(this.timeoutID); } if (this.sub) { this.sub.unsubscribe(); } } }, { key: 'render', value: function render() { var _state = this.state, status = _state.status, advanced = _state.advanced; return _react2.default.createElement( _dialog2.default, { active: status !== undefined && status !== 'up', actions: this.actions }, _react2.default.createElement( 'h2', null, 'Welcome' ), statusHelp[status], status === 'failed' ? _react2.default.createElement(XenaDownload, { advanced: advanced, onShowAdvanced: this.onShowAdvanced }) : null ); } }]); return LaunchHelper; }(_PureComponent3.default); exports.default = LaunchHelper;