Closing a file that was left open, working on profiling app for memory leak on Windows
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package engine
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@@ -40,22 +39,22 @@ func MoveAndLeaveSymlink(config FullClientSettings, singleTorrent *torrent.Torre
|
||||
if oldFileInfo.IsDir() {
|
||||
os.Mkdir(newFilePath, 0644)
|
||||
folderCopy.Copy(oldFilePath, newFilePath) //copy the folder to the new location
|
||||
notifyUser(tStorage, config, singleTorrent)
|
||||
notifyUser(tStorage, config, singleTorrent, db)
|
||||
return
|
||||
}
|
||||
|
||||
srcFile, err := os.Open(oldFilePath)
|
||||
defer srcFile.Close()
|
||||
if err != nil {
|
||||
Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "error": err}).Error("Windows: Cannot open old file for copy")
|
||||
return
|
||||
}
|
||||
defer srcFile.Close()
|
||||
destFile, err := os.Create(newFilePath)
|
||||
defer destFile.Close()
|
||||
if err != nil {
|
||||
Logger.WithFields(logrus.Fields{"New File Path": newFilePath, "error": err}).Error("Windows: Cannot open new file for copying into")
|
||||
return
|
||||
}
|
||||
defer destFile.Close()
|
||||
|
||||
bytesWritten, err := io.Copy(destFile, srcFile)
|
||||
if err != nil {
|
||||
Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath, "error": err}).Error("Windows: Cannot copy old file into new")
|
||||
@@ -66,23 +65,23 @@ func MoveAndLeaveSymlink(config FullClientSettings, singleTorrent *torrent.Torre
|
||||
Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath, "error": err}).Error("Windows: Error syncing new file to disk")
|
||||
}
|
||||
Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath, "bytesWritten": bytesWritten}).Info("Windows Torrent Copy Completed")
|
||||
notifyUser(tStorage, config, singleTorrent)
|
||||
notifyUser(tStorage, config, singleTorrent, db)
|
||||
} else {
|
||||
err := os.Symlink(oldFilePath, newFilePath) //For all other OS's create a symlink
|
||||
if err != nil {
|
||||
Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath, "error": err}).Error("Error creating symlink")
|
||||
return
|
||||
}
|
||||
notifyUser(tStorage, config, singleTorrent)
|
||||
notifyUser(tStorage, config, singleTorrent, db)
|
||||
Logger.WithFields(logrus.Fields{"Old File Path": oldFilePath, "New File Path": newFilePath}).Info("Moving completed torrent")
|
||||
}
|
||||
}
|
||||
tStorage.TorrentMoved = true
|
||||
Storage.AddTorrentLocalStorage(db, tStorage) //Updating the fact that we moved the torrent
|
||||
|
||||
}
|
||||
|
||||
func notifyUser(tStorage Storage.TorrentLocal, config FullClientSettings, singleTorrent *torrent.Torrent) {
|
||||
fmt.Println("Pushbullet token", config.PushBulletToken)
|
||||
func notifyUser(tStorage Storage.TorrentLocal, config FullClientSettings, singleTorrent *torrent.Torrent, db *storm.DB) {
|
||||
tStorage.TorrentMoved = true
|
||||
Storage.AddTorrentLocalStorage(db, tStorage) //Updating the fact that we moved the torrent
|
||||
if config.PushBulletToken != "" {
|
||||
pb := pushbullet.New(config.PushBulletToken)
|
||||
n := requests.NewNote()
|
||||
|
@@ -85,6 +85,7 @@ func readTorrentFileFromDB(element *Storage.TorrentLocal, tclient *torrent.Clien
|
||||
if err != nil {
|
||||
Logger.WithFields(logrus.Fields{"tempfile": tempFile, "err": err}).Error("Unable to create tempfile")
|
||||
}
|
||||
defer tempFile.Close() //Todo.. if we remove this do we need to close it?
|
||||
defer os.Remove(tempFile.Name())
|
||||
if _, err := tempFile.Write(element.TorrentFile); err != nil { //writing out out the entire file back into the temp dir from boltdb
|
||||
Logger.WithFields(logrus.Fields{"tempfile": tempFile, "err": err}).Error("Unable to write to tempfile")
|
||||
|
334
goTorrentWebUI/lib/BackendComm/backendWebsocket.js
Normal file
334
goTorrentWebUI/lib/BackendComm/backendWebsocket.js
Normal file
@@ -0,0 +1,334 @@
|
||||
'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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
var _reactTooltip = require('react-tooltip');
|
||||
|
||||
var _reactTooltip2 = _interopRequireDefault(_reactTooltip);
|
||||
|
||||
var _InfoOutline = require('material-ui-icons/InfoOutline');
|
||||
|
||||
var _InfoOutline2 = _interopRequireDefault(_InfoOutline);
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
var _Select = require('material-ui/Select/Select');
|
||||
|
||||
var _Select2 = _interopRequireDefault(_Select);
|
||||
|
||||
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 }; }
|
||||
|
||||
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; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
var title = document.title; //Set the number of active torrents in the title
|
||||
var torrents = [];
|
||||
var peerList = [];
|
||||
var fileList = [];
|
||||
var RSSList = [];
|
||||
var RSSTorrentList = [];
|
||||
|
||||
var torrentListRequest = {
|
||||
messageType: "torrentListRequest"
|
||||
|
||||
//websocket is started in kickwebsocket.js and is picked up here so "ws" is already defined 22
|
||||
};ws.onmessage = function (evt) {
|
||||
//When we recieve a message from the websocket
|
||||
var serverMessage = JSON.parse(evt.data);
|
||||
//console.log("message", serverMessage.MessageType)
|
||||
switch (serverMessage.MessageType) {
|
||||
|
||||
case "torrentList":
|
||||
//console.log("Recieved Client Update...", serverMessage)
|
||||
//var serverMessage = JSON.parse(evt.data);
|
||||
|
||||
torrents = []; //clearing out the torrent array to make room for new (so that it does keep adding)
|
||||
for (var i = 0; i < serverMessage.total; i++) {
|
||||
var _torrents$push;
|
||||
|
||||
torrents.push((_torrents$push = {
|
||||
TorrentHashString: serverMessage.data[i].TorrentHashString,
|
||||
TorrentName: serverMessage.data[i].TorrentName,
|
||||
DownloadedSize: serverMessage.data[i].DownloadedSize,
|
||||
Size: serverMessage.data[i].Size,
|
||||
DownloadSpeed: serverMessage.data[i].DownloadSpeed,
|
||||
UploadSpeed: serverMessage.data[i].UploadSpeed,
|
||||
PercentDone: serverMessage.data[i].PercentDone,
|
||||
StoragePath: serverMessage.data[i].StoragePath,
|
||||
DateAdded: serverMessage.data[i].DateAdded,
|
||||
SourceType: serverMessage.data[i].SourceType,
|
||||
Status: serverMessage.data[i].Status,
|
||||
BytesCompleted: serverMessage.data[i].BytesCompleted,
|
||||
ActivePeers: serverMessage.data[i].ActivePeers,
|
||||
ETA: serverMessage.data[i].ETA,
|
||||
TotalUploadedSize: serverMessage.data[i].TotalUploadedSize,
|
||||
Ratio: serverMessage.data[i].UploadRatio
|
||||
}, _defineProperty(_torrents$push, 'DateAdded', serverMessage.data[i].DateAdded), _defineProperty(_torrents$push, 'FileNumber', serverMessage.data[i].NumberofFiles), _defineProperty(_torrents$push, 'PieceNumber', serverMessage.data[i].NumberofPieces), _defineProperty(_torrents$push, 'MaxConnections', serverMessage.data[i].MaxConnections), _torrents$push));
|
||||
}
|
||||
var newTitle = '(' + serverMessage.total + ')' + title; //updating the title
|
||||
document.title = newTitle;
|
||||
break;
|
||||
|
||||
case "torrentPeerList":
|
||||
peerList = []; //clearing out the peerlist array to make room for new (so that it does keep adding)
|
||||
|
||||
for (var i = 0; i < serverMessage.TotalPeers; i++) {
|
||||
peerList.push({
|
||||
PeerID: serverMessage.PeerList[i].Id.toString(),
|
||||
IP: serverMessage.PeerList[i].IP,
|
||||
Port: serverMessage.PeerList[i].Port,
|
||||
Source: serverMessage.PeerList[i].Source,
|
||||
SupportsEncryption: serverMessage.PeerList[i].SupportsEncryption.toString()
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
||||
case "torrentFileList":
|
||||
fileList = [];
|
||||
for (var i = 0; i < serverMessage.TotalFiles; i++) {
|
||||
fileList.push({
|
||||
FileName: serverMessage.FileList[i].FileName,
|
||||
FilePath: serverMessage.FileList[i].FilePath,
|
||||
FileSize: serverMessage.FileList[i].FileSize,
|
||||
FilePercent: serverMessage.FileList[i].FilePercent,
|
||||
FilePriority: serverMessage.FileList[i].FilePriority
|
||||
});
|
||||
}
|
||||
console.log("filelist", fileList);
|
||||
break;
|
||||
|
||||
case "speedTab":
|
||||
console.log("Speedtab data requested");
|
||||
break;
|
||||
|
||||
case "loggerData":
|
||||
console.log("Logger data requested");
|
||||
break;
|
||||
|
||||
case "rssListRequest":
|
||||
console.log("RSSListRequest recieved", evt.data);
|
||||
RSSList = [];
|
||||
for (var i = 0; i < serverMessage.TotalRSSFeeds; i++) {
|
||||
RSSList.push({
|
||||
RSSURL: serverMessage.RSSFeeds[i].RSSFeedURL,
|
||||
RSSName: serverMessage.RSSFeeds[i].RSSName
|
||||
});
|
||||
}
|
||||
console.log("RSSURLS", RSSList);
|
||||
console.log("FIRSTURL", RSSList[1]);
|
||||
console.log("FULLURL", RSSList[1].RSSURL);
|
||||
break;
|
||||
|
||||
case "rssTorrentList":
|
||||
//console.log("RSSTorrentList recieved", evt.data)
|
||||
RSSTorrentList = [];
|
||||
for (var i = 0; i < serverMessage.TotalTorrents; i++) {
|
||||
RSSTorrentList.push({
|
||||
TorrentName: serverMessage.Torrents[i].Title,
|
||||
TorrentLink: serverMessage.Torrents[i].Link,
|
||||
PublishDate: serverMessage.Torrents[i].PubDate
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ws.onclose = function () {
|
||||
console.log('Closing connection');
|
||||
};
|
||||
|
||||
var divStyle = {
|
||||
display: 'inline-block',
|
||||
paddingTop: '10px',
|
||||
paddingLeft: '10px'
|
||||
};
|
||||
|
||||
var buttonStyle = {
|
||||
fontSize: '60px'
|
||||
};
|
||||
|
||||
var BackendSocket = function (_React$Component) {
|
||||
_inherits(BackendSocket, _React$Component);
|
||||
|
||||
function BackendSocket() {
|
||||
var _ref;
|
||||
|
||||
var _temp, _this, _ret;
|
||||
|
||||
_classCallCheck(this, BackendSocket);
|
||||
|
||||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
||||
args[_key] = arguments[_key];
|
||||
}
|
||||
|
||||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = BackendSocket.__proto__ || Object.getPrototypeOf(BackendSocket)).call.apply(_ref, [this].concat(args))), _this), _this.selectionHandler = function (selectionHashes, selectedTab) {
|
||||
switch (selectedTab) {
|
||||
case 0:
|
||||
console.log("general tab information requested");
|
||||
break;
|
||||
case 1:
|
||||
var peerListHashes = {
|
||||
MessageType: "torrentPeerListRequest",
|
||||
Payload: selectionHashes
|
||||
};
|
||||
console.log("Peers tab information requested", peerListHashes);
|
||||
ws.send(JSON.stringify(peerListHashes));
|
||||
break;
|
||||
case 2:
|
||||
var fileListHashes = {
|
||||
MessageType: "torrentFileListRequest",
|
||||
Payload: selectionHashes
|
||||
};
|
||||
console.log("Files tab information requested", fileListHashes);
|
||||
ws.send(JSON.stringify(fileListHashes));
|
||||
break;
|
||||
case 3:
|
||||
console.log("Speed tab information requested");
|
||||
break;
|
||||
case 4:
|
||||
console.log("Logger tab information requested");
|
||||
break;
|
||||
default:
|
||||
console.log("default tab");
|
||||
break;
|
||||
}
|
||||
}, _this.testSelectionLength = function (selection) {
|
||||
if (nextProps.selectionHashes.length > 1) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}, _temp), _possibleConstructorReturn(_this, _ret);
|
||||
}
|
||||
|
||||
_createClass(BackendSocket, [{
|
||||
key: 'componentDidMount',
|
||||
value: function componentDidMount() {
|
||||
var _this2 = this;
|
||||
|
||||
this.timerID = setInterval(function () {
|
||||
return _this2.tick();
|
||||
}, 2000);
|
||||
}
|
||||
}, {
|
||||
key: 'componentWillUnmount',
|
||||
value: function componentWillUnmount() {
|
||||
clearInterval(this.timerID);
|
||||
}
|
||||
}, {
|
||||
key: 'tick',
|
||||
value: function tick() {
|
||||
// this tick is the main tick that updates ALL of the components that update on tick... which is a lot
|
||||
if (this.props.RSSList != RSSList & this.props.RSSModalOpen == true) {
|
||||
this.props.newRSSFeedStore(RSSList); //pushing the new RSSList to Redux
|
||||
}
|
||||
if (this.props.RSSTorrentList != RSSTorrentList & this.props.RSSModalOpen == true) {
|
||||
this.props.RSSTorrentList(RSSTorrentList); //pushing the new RSSTorrentList to Redux
|
||||
}
|
||||
|
||||
ws.send(JSON.stringify(torrentListRequest)); //talking to the server to get the torrent list
|
||||
//console.log("Torrentlist", torrents)
|
||||
this.props.setButtonState(this.props.selection); //forcing an update to the buttons
|
||||
this.props.newTorrentList(torrents); //sending the list of torrents to torrentlist.js
|
||||
if (this.props.selectionHashes.length === 1) {
|
||||
switch (this.props.selectedTab) {
|
||||
case 1:
|
||||
var peerListHashes = {
|
||||
MessageType: "torrentPeerListRequest",
|
||||
Payload: this.props.selectionHashes
|
||||
};
|
||||
ws.send(JSON.stringify(peerListHashes));
|
||||
this.props.newPeerList(peerList);
|
||||
break;
|
||||
case 2:
|
||||
var fileListHashes = {
|
||||
MessageType: "torrentFileListRequest",
|
||||
Payload: this.props.selectionHashes
|
||||
};
|
||||
ws.send(JSON.stringify(fileListHashes));
|
||||
this.props.newFileList(fileList);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}, {
|
||||
key: 'componentWillReceiveProps',
|
||||
value: function componentWillReceiveProps(nextProps) {
|
||||
console.log("Lenght", nextProps.selectionHashes.length, "value", nextProps.selectionHashes);
|
||||
if (nextProps.selectionHashes.length === 1) {
|
||||
//if we have a selection pass it on for the tabs to verify
|
||||
this.selectionHandler(nextProps.selectionHashes, nextProps.selectedTab);
|
||||
}
|
||||
}
|
||||
}, {
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ style: divStyle },
|
||||
_react2.default.createElement(_InfoOutline2.default, { styles: buttonStyle, color: 'primary', 'data-tip': 'BackendStatus: Green=Good', 'aria-label': 'Settings' })
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return BackendSocket;
|
||||
}(_react2.default.Component);
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
selectionHashes: state.selectionHashes,
|
||||
selectedTab: state.selectedTab,
|
||||
selection: state.selection,
|
||||
RSSModalOpen: state.RSSModalOpen,
|
||||
RSSTorrentList: state.RSSTorrentList
|
||||
};
|
||||
};
|
||||
|
||||
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
||||
return {
|
||||
newTorrentList: function newTorrentList(torrentList) {
|
||||
return dispatch({ type: actionTypes.TORRENT_LIST, torrentList: torrentList });
|
||||
},
|
||||
newPeerList: function newPeerList(peerList) {
|
||||
return dispatch({ type: actionTypes.PEER_LIST, peerList: peerList });
|
||||
},
|
||||
newFileList: function newFileList(fileList) {
|
||||
return dispatch({ type: actionTypes.FILE_LIST, fileList: fileList });
|
||||
},
|
||||
setButtonState: function setButtonState(buttonState) {
|
||||
return dispatch({ type: actionTypes.SET_BUTTON_STATE, buttonState: buttonState });
|
||||
},
|
||||
newRSSFeedStore: function newRSSFeedStore(RSSList) {
|
||||
return dispatch({ type: actionTypes.NEW_RSS_FEED_STORE, RSSList: RSSList });
|
||||
},
|
||||
RSSTorrentList: function RSSTorrentList(_RSSTorrentList) {
|
||||
return dispatch({ type: actionTypes.RSS_TORRENT_LIST, RSSTorrentList: _RSSTorrentList });
|
||||
}
|
||||
//changeSelection: (selection) => dispatch({type: actionTypes.CHANGE_SELECTION, selection}),//forcing an update to the buttons
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(BackendSocket);
|
193
goTorrentWebUI/lib/BottomMenu/Tabs/fileTab.js
Normal file
193
goTorrentWebUI/lib/BottomMenu/Tabs/fileTab.js
Normal file
@@ -0,0 +1,193 @@
|
||||
'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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
var _Button = require('material-ui/Button');
|
||||
|
||||
var _Button2 = _interopRequireDefault(_Button);
|
||||
|
||||
var _progressBarCell = require('../../CustomCells/progressBarCell');
|
||||
|
||||
var _dxReactGrid = require('@devexpress/dx-react-grid');
|
||||
|
||||
var _dxReactGridMaterialUi = require('@devexpress/dx-react-grid-material-ui');
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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 }; }
|
||||
|
||||
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 FileTab = function (_React$Component) {
|
||||
_inherits(FileTab, _React$Component);
|
||||
|
||||
function FileTab(props) {
|
||||
_classCallCheck(this, FileTab);
|
||||
|
||||
var _this = _possibleConstructorReturn(this, (FileTab.__proto__ || Object.getPrototypeOf(FileTab)).call(this, props));
|
||||
|
||||
_this.changeSelection = function (selection) {
|
||||
console.log("Filelist is changing selection now", selection);
|
||||
_this.setState({ selected: selection });
|
||||
if (selection.length > 0) {
|
||||
//if selection is empty buttons will be default and selectionHashes will be blanked out and pushed to redux
|
||||
console.log("Getting the selected Rows");
|
||||
var selectedRows = []; //array of all the selected Rows
|
||||
selection.forEach(function (element) {
|
||||
selectedRows.push(_this.props.fileList[element]); //pushing the selected rows out of torrentlist
|
||||
});
|
||||
_this.setState({ fileSelection: selectedRows });
|
||||
}
|
||||
};
|
||||
|
||||
_this.sendPriorityRequest = function (priority, sendfileNames) {
|
||||
_this.state.fileSelection.forEach(function (element) {
|
||||
console.log("element", element);
|
||||
sendFileNames.push(element.FilePath);
|
||||
});
|
||||
var setFilePriority = {
|
||||
MessageType: "setFilePriority",
|
||||
Payload: sendFileNames
|
||||
};
|
||||
console.log(JSON.stringify(setFilePriority));
|
||||
ws.send(JSON.stringify(setFilePriority));
|
||||
};
|
||||
|
||||
_this.setHighPriority = function () {
|
||||
var priorty = "High";
|
||||
var selectionHash = _this.props.selectionHashes[0]; //getting the first element (should be the only one)
|
||||
var sendFileNames = [selectionHash, "High"]; // adding the selection hash as the first element will be stripped out by the server, second element is the prioty request
|
||||
};
|
||||
|
||||
_this.setNormalPriority = function () {
|
||||
var priorty = "Normal";
|
||||
var selectionHash = _this.props.selectionHashes[0]; //getting the first element (should be the only one)
|
||||
var sendFileNames = [selectionHash, "Normal"]; // adding the selection hash as the first element will be stripped out by the server, second element is the prioty request
|
||||
};
|
||||
|
||||
_this.setCancelPriority = function () {
|
||||
var priorty = "Cancel";
|
||||
var selectionHash = _this.props.selectionHashes[0]; //getting the first element (should be the only one)
|
||||
var sendFileNames = [selectionHash, "Cancel"]; // adding the selection hash as the first element will be stripped out by the server, second element is the prioty request
|
||||
};
|
||||
|
||||
_this.state = { //rows are stored in redux they are sent over from the server
|
||||
columns: [{ name: 'FileName', title: 'File Name' }, { name: 'FilePath', title: 'File Path' }, { name: 'FileSize', title: 'File Size' }, { name: 'FilePercent', title: 'File Percent' }, { name: 'FilePriority', title: 'File Priority' }],
|
||||
sorting: [],
|
||||
columnOrder: ['FileName', 'FilePath', 'FileSize', 'FilePercent', 'FilePriority'],
|
||||
columnWidths: { FileName: 450, FilePath: 650, FileSize: 100, FilePercent: 100, FilePriority: 75 },
|
||||
fileSelection: [],
|
||||
selected: []
|
||||
|
||||
};
|
||||
|
||||
_this.changeColumnOrder = function (columnOrder) {
|
||||
return _this.setState({ columnOrder: columnOrder });
|
||||
};
|
||||
_this.changeColumnWidths = function (columnWidths) {
|
||||
return _this.setState({ columnWidths: columnWidths });
|
||||
};
|
||||
_this.changeSorting = function (sorting) {
|
||||
return _this.setState({ sorting: sorting });
|
||||
};
|
||||
|
||||
return _this;
|
||||
}
|
||||
|
||||
_createClass(FileTab, [{
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
return (
|
||||
//Buttons here
|
||||
_react2.default.createElement(
|
||||
'div',
|
||||
null,
|
||||
'Set File Priority:',
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ raised: true, color: 'primary', onClick: this.setHighPriority },
|
||||
'High'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ raised: true, color: 'primary', onClick: this.setNormalPriority },
|
||||
'Normal'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ raised: true, color: 'accent', onClick: this.setCancelPriority },
|
||||
'Do Not Download'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_dxReactGridMaterialUi.Grid,
|
||||
{ rows: this.props.fileList, columns: this.state.columns },
|
||||
_react2.default.createElement(_dxReactGrid.SortingState, { sorting: this.state.sorting, onSortingChange: this.changeSorting }),
|
||||
_react2.default.createElement(_dxReactGrid.LocalSorting, null),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.DragDropContext, null),
|
||||
_react2.default.createElement(_dxReactGrid.SelectionState, { onSelectionChange: this.changeSelection, selection: this.state.selection }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.VirtualTableView, { height: 300, tableCellTemplate: function tableCellTemplate(_ref) {
|
||||
var row = _ref.row,
|
||||
column = _ref.column,
|
||||
style = _ref.style;
|
||||
|
||||
if (column.name === 'FilePercent') {
|
||||
return _react2.default.createElement(_progressBarCell.ProgressBarCell, { value: row.FilePercent * 100, style: style });
|
||||
}
|
||||
return undefined;
|
||||
} }),
|
||||
'/>',
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableColumnResizing, { columnWidths: this.state.columnWidths, onColumnWidthsChange: this.changeColumnWidths }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableColumnReordering, { order: this.state.columnOrder, onOrderChange: this.changeColumnOrder }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableSelection, { selectByRowClick: true, highlightSelected: true }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableHeaderRow, { allowSorting: true, allowResizing: true, allowDragging: true })
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return FileTab;
|
||||
}(_react2.default.Component);
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
selectionHashes: state.selectionHashes,
|
||||
fileList: state.fileList
|
||||
//fileSelectionNames: state.fileSelectionNames,
|
||||
};
|
||||
};
|
||||
|
||||
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
||||
return {
|
||||
|
||||
//changeFileSelection: (fileSelection) => dispatch({type: actionTypes.CHANGE_FILE_SELECTION, fileSelection}),
|
||||
|
||||
sendSelectionHashes: function sendSelectionHashes(selectionHashes) {
|
||||
return dispatch({ type: actionTypes.SELECTION_HASHES, selectionHashes: selectionHashes });
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(FileTab);
|
325
goTorrentWebUI/lib/BottomMenu/Tabs/generalTab.js
Normal file
325
goTorrentWebUI/lib/BottomMenu/Tabs/generalTab.js
Normal file
@@ -0,0 +1,325 @@
|
||||
'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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
var _styles = require('material-ui/styles');
|
||||
|
||||
var _Paper = require('material-ui/Paper');
|
||||
|
||||
var _Paper2 = _interopRequireDefault(_Paper);
|
||||
|
||||
var _Grid = require('material-ui/Grid');
|
||||
|
||||
var _Grid2 = _interopRequireDefault(_Grid);
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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 }; }
|
||||
|
||||
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 styles = function styles(theme) {
|
||||
return {
|
||||
root: {
|
||||
flexGrow: 1,
|
||||
marginTop: 0
|
||||
},
|
||||
paper: {
|
||||
padding: 16,
|
||||
textAlign: 'left',
|
||||
color: theme.palette.text.primary
|
||||
},
|
||||
floatRight: {
|
||||
float: 'right'
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var GeneralTab = function (_React$Component) {
|
||||
_inherits(GeneralTab, _React$Component);
|
||||
|
||||
function GeneralTab(props) {
|
||||
_classCallCheck(this, GeneralTab);
|
||||
|
||||
var _this = _possibleConstructorReturn(this, (GeneralTab.__proto__ || Object.getPrototypeOf(GeneralTab)).call(this, props));
|
||||
|
||||
_this.componentWillReceiveProps = function () {
|
||||
//console.log("recieving props in generaltab", "TYPE", this.props.selectionHashes[Object.keys(this.props.selectionHashes)[0]])
|
||||
if (_this.props.selectionHashes.length === 1) {
|
||||
//if one torrent is selected
|
||||
var selectionHashTemp = _this.props.selectionHashes[Object.keys(_this.props.selectionHashes)[0]]; // extract out the hash of the single selection
|
||||
var selectedTorrentTemp = [];
|
||||
_this.props.torrentList.forEach(function (singleTorrent) {
|
||||
if (singleTorrent.TorrentHashString === selectionHashTemp) {
|
||||
selectedTorrentTemp = singleTorrent;
|
||||
}
|
||||
});
|
||||
//selectedTorrentTemp = this.props.torrentList.filter(torrent => torrent.TorrentHashString === this.props.selectionHashes)
|
||||
//console.log("SelectedTorrentTemp", selectedTorrentTemp)
|
||||
_this.setState({ selectedTorrent: selectedTorrentTemp });
|
||||
} else {
|
||||
_this.setState({ selectedTorrent: [] });
|
||||
}
|
||||
};
|
||||
|
||||
_this.state = {
|
||||
selectedTorrent: []
|
||||
};
|
||||
|
||||
return _this;
|
||||
}
|
||||
|
||||
_createClass(GeneralTab, [{
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
var classes = this.props.classes;
|
||||
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ className: classes.root },
|
||||
_react2.default.createElement(
|
||||
_Grid2.default,
|
||||
{ container: true, spacing: 8 },
|
||||
_react2.default.createElement(
|
||||
_Grid2.default,
|
||||
{ item: true, xs: 12, sm: 4 },
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Torrent Name: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["TorrentName"],
|
||||
' '
|
||||
)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Torrent Size: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["Size"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Storage Path: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["StoragePath"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Date Added: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
' ',
|
||||
this.state.selectedTorrent["DateAdded"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Source Type: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
' ',
|
||||
this.state.selectedTorrent["SourceType"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Label: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
' None '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Torrent Hash: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
' ',
|
||||
this.state.selectedTorrent["TorrentHashString"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Grid2.default,
|
||||
{ item: true, xs: 12, sm: 4 },
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Status: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["Status"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Percent Done: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["PercentDone"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Torrent DL Amount: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["DownloadedSize"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Total Upload Amount: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["TotalUploadedSize"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Seeding Ratio: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["Ratio"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'ETA: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["ETA"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Max Connections: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["MaxConnections"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Grid2.default,
|
||||
{ item: true, xs: 12, sm: 4 },
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Number of Files: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["FileNumber"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Paper2.default,
|
||||
{ className: classes.paper },
|
||||
'Number of Pieces: ',
|
||||
_react2.default.createElement(
|
||||
'span',
|
||||
{ className: classes.floatRight },
|
||||
this.state.selectedTorrent["PieceNumber"],
|
||||
' '
|
||||
),
|
||||
' '
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return GeneralTab;
|
||||
}(_react2.default.Component);
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
selectionHashes: state.selectionHashes,
|
||||
torrentList: state.torrentList
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _styles.withStyles)(styles)((0, _reactRedux.connect)(mapStateToProps)(GeneralTab));
|
96
goTorrentWebUI/lib/BottomMenu/Tabs/peerTab.js
Normal file
96
goTorrentWebUI/lib/BottomMenu/Tabs/peerTab.js
Normal file
@@ -0,0 +1,96 @@
|
||||
'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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
var _reactBootstrapTable = require('react-bootstrap-table');
|
||||
|
||||
var _dxReactGrid = require('@devexpress/dx-react-grid');
|
||||
|
||||
var _dxReactGridMaterialUi = require('@devexpress/dx-react-grid-material-ui');
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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 }; }
|
||||
|
||||
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 PeerTab = function (_React$Component) {
|
||||
_inherits(PeerTab, _React$Component);
|
||||
|
||||
function PeerTab(props) {
|
||||
_classCallCheck(this, PeerTab);
|
||||
|
||||
var _this = _possibleConstructorReturn(this, (PeerTab.__proto__ || Object.getPrototypeOf(PeerTab)).call(this, props));
|
||||
|
||||
_this.state = { //rows are stored in redux they are sent over from the server
|
||||
columns: [{ name: 'PeerID', title: 'Peer ID' }, { name: 'IP', title: 'IP Address' },
|
||||
//{ name: 'Country', title: 'Country of Origin'}, //TODO map IP to country
|
||||
{ name: 'Port', title: 'Port' }, { name: 'Source', title: 'Source' }, //T=Tracker, I=Incoming, Hg=DHTGetPeers, Ha=DHTAnnouncePeer, X=PEX
|
||||
{ name: 'SupportsEncryption', title: 'Supports Encryption' }],
|
||||
sorting: [],
|
||||
columnOrder: ['PeerID', 'IP', 'Port', 'Source', 'SupportsEncryption'],
|
||||
columnWidths: { PeerID: 250, IP: 150, Port: 100, Source: 150, SupportsEncryption: 150 }
|
||||
};
|
||||
|
||||
_this.changeColumnOrder = function (columnOrder) {
|
||||
return _this.setState({ columnOrder: columnOrder });
|
||||
};
|
||||
_this.changeColumnWidths = function (columnWidths) {
|
||||
return _this.setState({ columnWidths: columnWidths });
|
||||
};
|
||||
_this.changeSorting = function (sorting) {
|
||||
return _this.setState({ sorting: sorting });
|
||||
};
|
||||
return _this;
|
||||
}
|
||||
|
||||
_createClass(PeerTab, [{
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
return _react2.default.createElement(
|
||||
_dxReactGridMaterialUi.Grid,
|
||||
{ rows: this.props.peerList, columns: this.state.columns },
|
||||
_react2.default.createElement(_dxReactGrid.SortingState, { sorting: this.state.sorting, onSortingChange: this.changeSorting }),
|
||||
_react2.default.createElement(_dxReactGrid.LocalSorting, null),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.DragDropContext, null),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.VirtualTableView, { height: 350 }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableColumnResizing, { columnWidths: this.state.columnWidths, onColumnWidthsChange: this.changeColumnWidths }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableColumnReordering, { order: this.state.columnOrder, onOrderChange: this.changeColumnOrder }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableHeaderRow, { allowSorting: true, allowResizing: true, allowDragging: true })
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return PeerTab;
|
||||
}(_react2.default.Component);
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
selectionHashes: state.selectionHashes,
|
||||
peerList: state.peerList
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _reactRedux.connect)(mapStateToProps)(PeerTab);
|
183
goTorrentWebUI/lib/BottomMenu/bottomMenu.js
Normal file
183
goTorrentWebUI/lib/BottomMenu/bottomMenu.js
Normal file
@@ -0,0 +1,183 @@
|
||||
'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 _propTypes = require('prop-types');
|
||||
|
||||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||||
|
||||
require('typeface-roboto');
|
||||
|
||||
var _styles = require('material-ui/styles');
|
||||
|
||||
var _AppBar = require('material-ui/AppBar');
|
||||
|
||||
var _AppBar2 = _interopRequireDefault(_AppBar);
|
||||
|
||||
var _Tabs = require('material-ui/Tabs');
|
||||
|
||||
var _Tabs2 = _interopRequireDefault(_Tabs);
|
||||
|
||||
var _generalTab = require('./Tabs/generalTab');
|
||||
|
||||
var _generalTab2 = _interopRequireDefault(_generalTab);
|
||||
|
||||
var _peerTab = require('./Tabs/peerTab');
|
||||
|
||||
var _peerTab2 = _interopRequireDefault(_peerTab);
|
||||
|
||||
var _fileTab = require('./Tabs/fileTab');
|
||||
|
||||
var _fileTab2 = _interopRequireDefault(_fileTab);
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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 }; }
|
||||
|
||||
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; } // contains the font for material UI
|
||||
|
||||
|
||||
//Redux
|
||||
|
||||
|
||||
function TabContainer(props) {
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ style: { padding: 8 * 3 } },
|
||||
props.children
|
||||
);
|
||||
}
|
||||
|
||||
TabContainer.propTypes = {
|
||||
children: _propTypes2.default.node.isRequired
|
||||
};
|
||||
|
||||
var styles = function styles(theme) {
|
||||
return {
|
||||
root: {
|
||||
// flexGrow: 1,
|
||||
// marginTop: theme.spacing.unit * 3,
|
||||
//backgroundColor: theme.palette.background.paper,
|
||||
backgroundColor: '#e5e5e5',
|
||||
height: '100%',
|
||||
boxShadow: '0 0 20px #000'
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var BasicTabs = function (_React$Component) {
|
||||
_inherits(BasicTabs, _React$Component);
|
||||
|
||||
function BasicTabs() {
|
||||
var _ref;
|
||||
|
||||
var _temp, _this, _ret;
|
||||
|
||||
_classCallCheck(this, BasicTabs);
|
||||
|
||||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
||||
args[_key] = arguments[_key];
|
||||
}
|
||||
|
||||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = BasicTabs.__proto__ || Object.getPrototypeOf(BasicTabs)).call.apply(_ref, [this].concat(args))), _this), _this.handleChange = function (event, value) {
|
||||
//this.setState({ value });
|
||||
_this.props.changeTab(value);
|
||||
}, _temp), _possibleConstructorReturn(_this, _ret);
|
||||
}
|
||||
|
||||
_createClass(BasicTabs, [{
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
var classes = this.props.classes;
|
||||
|
||||
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ className: classes.root },
|
||||
_react2.default.createElement(
|
||||
'div',
|
||||
{ className: 'DragHandle' },
|
||||
' ',
|
||||
_react2.default.createElement(
|
||||
_AppBar2.default,
|
||||
{ position: 'static' },
|
||||
_react2.default.createElement(
|
||||
_Tabs2.default,
|
||||
{ value: this.props.selectedTab, onChange: this.handleChange },
|
||||
_react2.default.createElement(_Tabs.Tab, { label: 'General' }),
|
||||
_react2.default.createElement(_Tabs.Tab, { label: 'Peers' }),
|
||||
_react2.default.createElement(_Tabs.Tab, { label: 'Files' }),
|
||||
_react2.default.createElement(_Tabs.Tab, { label: 'Speed' }),
|
||||
_react2.default.createElement(_Tabs.Tab, { label: 'Logger', href: '#basic-tabs' })
|
||||
)
|
||||
)
|
||||
),
|
||||
this.props.selectedTab === 0 && _react2.default.createElement(
|
||||
TabContainer,
|
||||
null,
|
||||
_react2.default.createElement(_generalTab2.default, null)
|
||||
),
|
||||
this.props.selectedTab === 1 && _react2.default.createElement(
|
||||
TabContainer,
|
||||
null,
|
||||
_react2.default.createElement(_peerTab2.default, null)
|
||||
),
|
||||
this.props.selectedTab === 2 && _react2.default.createElement(
|
||||
TabContainer,
|
||||
null,
|
||||
_react2.default.createElement(_fileTab2.default, null)
|
||||
),
|
||||
this.props.selectedTab === 3 && _react2.default.createElement(
|
||||
TabContainer,
|
||||
null,
|
||||
'Speed'
|
||||
),
|
||||
this.props.selectedTab === 4 && _react2.default.createElement(
|
||||
TabContainer,
|
||||
null,
|
||||
'Logger'
|
||||
)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return BasicTabs;
|
||||
}(_react2.default.Component);
|
||||
|
||||
BasicTabs.propTypes = {
|
||||
classes: _propTypes2.default.object.isRequired
|
||||
};
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
selectedTab: state.selectedTab
|
||||
};
|
||||
};
|
||||
|
||||
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
||||
return {
|
||||
changeTab: function changeTab(selectedTab) {
|
||||
return dispatch({ type: actionTypes.SELECTED_TAB, selectedTab: selectedTab });
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _styles.withStyles)(styles)((0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(BasicTabs));
|
80
goTorrentWebUI/lib/CustomCells/progressBarCell.js
Normal file
80
goTorrentWebUI/lib/CustomCells/progressBarCell.js
Normal file
@@ -0,0 +1,80 @@
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.ProgressBarCell = exports.ProgressBarCellBase = undefined;
|
||||
|
||||
var _react = require('react');
|
||||
|
||||
var _react2 = _interopRequireDefault(_react);
|
||||
|
||||
var _propTypes = require('prop-types');
|
||||
|
||||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||||
|
||||
var _materialUi = require('material-ui');
|
||||
|
||||
var _styles = require('material-ui/styles');
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
var styles = function styles(theme) {
|
||||
var _progressText;
|
||||
|
||||
return {
|
||||
progressBarCell: {
|
||||
paddingLeft: theme.spacing.unit,
|
||||
paddingRight: theme.spacing.unit,
|
||||
borderBottom: '1px solid ' + theme.palette.text.lightDivider
|
||||
},
|
||||
progressBar: {
|
||||
backgroundColor: theme.palette.primary[300],
|
||||
float: 'left',
|
||||
height: theme.spacing.unit,
|
||||
whiteSpace: 'nowrap'
|
||||
},
|
||||
progressText: (_progressText = {
|
||||
display: 'inline-block',
|
||||
fontSize: '1em',
|
||||
textAlign: 'right',
|
||||
verticalAlign: 'text-top'
|
||||
}, _defineProperty(_progressText, 'fontSize', '12px'), _defineProperty(_progressText, 'fontWeight', 'bold'), _defineProperty(_progressText, 'margin', '5px'), _defineProperty(_progressText, 'whiteSpace', 'nowrap'), _progressText)
|
||||
};
|
||||
};
|
||||
|
||||
var ProgressBarCellBase = exports.ProgressBarCellBase = function ProgressBarCellBase(_ref) {
|
||||
var value = _ref.value,
|
||||
classes = _ref.classes,
|
||||
style = _ref.style;
|
||||
return _react2.default.createElement(
|
||||
_materialUi.TableCell,
|
||||
{
|
||||
className: classes.progressBarCell,
|
||||
style: style
|
||||
|
||||
},
|
||||
_react2.default.createElement('div', {
|
||||
className: classes.progressBar,
|
||||
style: { width: value + '%' },
|
||||
title: value.toFixed(1) + '%'
|
||||
}),
|
||||
_react2.default.createElement(
|
||||
'div',
|
||||
{ className: classes.progressText },
|
||||
value
|
||||
)
|
||||
);
|
||||
};
|
||||
ProgressBarCellBase.propTypes = {
|
||||
value: _propTypes2.default.number.isRequired,
|
||||
classes: _propTypes2.default.object.isRequired,
|
||||
style: _propTypes2.default.object
|
||||
};
|
||||
ProgressBarCellBase.defaultProps = {
|
||||
style: {}
|
||||
};
|
||||
|
||||
var ProgressBarCell = exports.ProgressBarCell = (0, _styles.withStyles)(styles, { name: 'ProgressBarCell' })(ProgressBarCellBase);
|
215
goTorrentWebUI/lib/TopMenu/Modals/RSSModal/RSSFeedList.js
Normal file
215
goTorrentWebUI/lib/TopMenu/Modals/RSSModal/RSSFeedList.js
Normal file
@@ -0,0 +1,215 @@
|
||||
'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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
var _Button = require('material-ui/Button');
|
||||
|
||||
var _Button2 = _interopRequireDefault(_Button);
|
||||
|
||||
var _TextField = require('material-ui/TextField');
|
||||
|
||||
var _TextField2 = _interopRequireDefault(_TextField);
|
||||
|
||||
var _styles = require('material-ui/styles');
|
||||
|
||||
var _propTypes = require('prop-types');
|
||||
|
||||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||||
|
||||
var _List = require('material-ui/List');
|
||||
|
||||
var _List2 = _interopRequireDefault(_List);
|
||||
|
||||
var _Dialog = require('material-ui/Dialog');
|
||||
|
||||
var _Dialog2 = _interopRequireDefault(_Dialog);
|
||||
|
||||
var _Link = require('material-ui-icons/Link');
|
||||
|
||||
var _Link2 = _interopRequireDefault(_Link);
|
||||
|
||||
var _reactTooltip = require('react-tooltip');
|
||||
|
||||
var _reactTooltip2 = _interopRequireDefault(_reactTooltip);
|
||||
|
||||
var _Icon = require('material-ui/Icon');
|
||||
|
||||
var _Icon2 = _interopRequireDefault(_Icon);
|
||||
|
||||
var _IconButton = require('material-ui/IconButton');
|
||||
|
||||
var _IconButton2 = _interopRequireDefault(_IconButton);
|
||||
|
||||
var _RssFeed = require('material-ui-icons/RssFeed');
|
||||
|
||||
var _RssFeed2 = _interopRequireDefault(_RssFeed);
|
||||
|
||||
var _AddCircle = require('material-ui-icons/AddCircle');
|
||||
|
||||
var _AddCircle2 = _interopRequireDefault(_AddCircle);
|
||||
|
||||
var _Delete = require('material-ui-icons/Delete');
|
||||
|
||||
var _Delete2 = _interopRequireDefault(_Delete);
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../../../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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 }; }
|
||||
|
||||
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; }
|
||||
|
||||
//Redux
|
||||
|
||||
|
||||
var button = {
|
||||
fontSize: '60px',
|
||||
paddingRight: '20px',
|
||||
paddingLeft: '20px'
|
||||
};
|
||||
|
||||
var smallButton = {
|
||||
width: '36px',
|
||||
height: '36px',
|
||||
padding: '5px'
|
||||
};
|
||||
|
||||
var rssInput = {
|
||||
width: '90%',
|
||||
paddingRight: '10px'
|
||||
};
|
||||
|
||||
var inlineStyle = {
|
||||
display: 'inline-block',
|
||||
backdrop: 'static'
|
||||
};
|
||||
|
||||
var RSSFeedList = function (_React$Component) {
|
||||
_inherits(RSSFeedList, _React$Component);
|
||||
|
||||
function RSSFeedList() {
|
||||
var _ref;
|
||||
|
||||
var _temp, _this, _ret;
|
||||
|
||||
_classCallCheck(this, RSSFeedList);
|
||||
|
||||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
||||
args[_key] = arguments[_key];
|
||||
}
|
||||
|
||||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = RSSFeedList.__proto__ || Object.getPrototypeOf(RSSFeedList)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
|
||||
testRSSFeeds: [],
|
||||
showList: false,
|
||||
selectedIndex: 0
|
||||
}, _this.showRSSFiles = function (key) {
|
||||
var RSSTorrentsRequest = {
|
||||
messageType: "rssTorrentsRequest",
|
||||
Payload: [_this.props.RSSList[key].RSSURL]
|
||||
};
|
||||
ws.send(JSON.stringify(RSSTorrentsRequest));
|
||||
|
||||
_this.setState({ selectedIndex: key }); //setting our selected index for styling
|
||||
console.log("RSSFEED", key, "sending message", JSON.stringify(RSSTorrentsRequest));
|
||||
}, _this.getStyle = function (index) {
|
||||
console.log("SettingStye", selectedIndex, index);
|
||||
if (selectedIndex == index) {
|
||||
console.log("Returning activestyle");
|
||||
style = "{{backgroundColor: '#80b3ff'}}";
|
||||
return style;
|
||||
}
|
||||
style = "{{backgroundColor: '#f44295'}}";
|
||||
return style;
|
||||
}, _this.deleteRSSFeed = function (key) {
|
||||
var RSSURLDelete = {
|
||||
messageType: "deleteRSSFeed",
|
||||
Payload: [_this.props.RSSList[key]]
|
||||
};
|
||||
console.log("Deleting THIS", _this.props.RSSList[key]);
|
||||
//ws.send(JSON.stringify(RSSURLDelete));
|
||||
}, _temp), _possibleConstructorReturn(_this, _ret);
|
||||
}
|
||||
|
||||
_createClass(RSSFeedList, [{
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
var _this2 = this;
|
||||
|
||||
//const { classes, onRequestClose, handleRequestClose, handleSubmit } = this.props;
|
||||
if (this.props.RSSList.length > 0 && this.state.showList == false) {
|
||||
console.log("Setting list to show....");
|
||||
this.setState({ showList: true });
|
||||
}
|
||||
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ style: inlineStyle },
|
||||
this.state.showList == true && //if we have any rss torrent feeds then display them in list }
|
||||
_react2.default.createElement(
|
||||
_List2.default,
|
||||
{ dense: true },
|
||||
this.props.RSSList.map(function (RSSFeed, index) {
|
||||
return _react2.default.createElement(
|
||||
_List.ListItem,
|
||||
{ button: true, onClick: function onClick() {
|
||||
return _this2.showRSSFiles(index);
|
||||
}, key: index },
|
||||
_react2.default.createElement(_List.ListItemText, { primary: RSSFeed.RSSName }),
|
||||
_react2.default.createElement(
|
||||
_List.ListItemSecondaryAction,
|
||||
null,
|
||||
_react2.default.createElement(
|
||||
_IconButton2.default,
|
||||
{ key: index, onClick: function onClick() {
|
||||
return _this2.deleteRSSFeed(index);
|
||||
}, 'aria-label': 'Delete' },
|
||||
_react2.default.createElement(_Delete2.default, null)
|
||||
)
|
||||
)
|
||||
);
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return RSSFeedList;
|
||||
}(_react2.default.Component);
|
||||
|
||||
;
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
RSSList: state.RSSList
|
||||
};
|
||||
};
|
||||
|
||||
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
||||
return {
|
||||
rssModalOpenState: function rssModalOpenState(RSSModalOpen) {
|
||||
return dispatch({ type: actionTypes.RSS_MODAL_OPEN_STATE, RSSModalOpen: RSSModalOpen });
|
||||
} //sending modal state to backendwebsocket so we can update RSS lists
|
||||
};
|
||||
};
|
||||
exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(RSSFeedList);
|
272
goTorrentWebUI/lib/TopMenu/Modals/RSSModal/RSSModalLayout.js
Normal file
272
goTorrentWebUI/lib/TopMenu/Modals/RSSModal/RSSModalLayout.js
Normal file
@@ -0,0 +1,272 @@
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
|
||||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||||
|
||||
var _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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
require('../../../../node_modules/react-grid-layout/css/styles.css');
|
||||
|
||||
require('../../../../node_modules/react-resizable/css/styles.css');
|
||||
|
||||
var _reactGridLayout = require('react-grid-layout');
|
||||
|
||||
var _reactGridLayout2 = _interopRequireDefault(_reactGridLayout);
|
||||
|
||||
var _propTypes = require('prop-types');
|
||||
|
||||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||||
|
||||
var _lodash = require('lodash');
|
||||
|
||||
var _lodash2 = _interopRequireDefault(_lodash);
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../../../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
var _TextField = require('material-ui/TextField');
|
||||
|
||||
var _TextField2 = _interopRequireDefault(_TextField);
|
||||
|
||||
var _styles = require('material-ui/styles');
|
||||
|
||||
var _Dialog = require('material-ui/Dialog');
|
||||
|
||||
var _Dialog2 = _interopRequireDefault(_Dialog);
|
||||
|
||||
var _reactTooltip = require('react-tooltip');
|
||||
|
||||
var _reactTooltip2 = _interopRequireDefault(_reactTooltip);
|
||||
|
||||
var _Icon = require('material-ui/Icon');
|
||||
|
||||
var _Icon2 = _interopRequireDefault(_Icon);
|
||||
|
||||
var _RssFeed = require('material-ui-icons/RssFeed');
|
||||
|
||||
var _RssFeed2 = _interopRequireDefault(_RssFeed);
|
||||
|
||||
var _AddCircle = require('material-ui-icons/AddCircle');
|
||||
|
||||
var _AddCircle2 = _interopRequireDefault(_AddCircle);
|
||||
|
||||
var _RSSFeedList = require('./RSSFeedList');
|
||||
|
||||
var _RSSFeedList2 = _interopRequireDefault(_RSSFeedList);
|
||||
|
||||
var _RSSTorrentList = require('./RSSTorrentList');
|
||||
|
||||
var _RSSTorrentList2 = _interopRequireDefault(_RSSTorrentList);
|
||||
|
||||
var _IconButton = require('material-ui/IconButton');
|
||||
|
||||
var _IconButton2 = _interopRequireDefault(_IconButton);
|
||||
|
||||
var _Button = require('material-ui/Button');
|
||||
|
||||
var _Button2 = _interopRequireDefault(_Button);
|
||||
|
||||
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 }; }
|
||||
|
||||
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; }
|
||||
//css for react grid
|
||||
|
||||
//react-grid for layout
|
||||
|
||||
//Redux
|
||||
|
||||
//interior items
|
||||
|
||||
var ReactGridLayout = (0, _reactGridLayout.WidthProvider)(_reactGridLayout2.default);
|
||||
|
||||
var background = {
|
||||
backgroundColor: '#e5e5e5',
|
||||
boxShadow: '0 0 20px #000'
|
||||
};
|
||||
|
||||
var button = {
|
||||
fontSize: '60px',
|
||||
paddingRight: '20px',
|
||||
paddingLeft: '20px'
|
||||
};
|
||||
|
||||
var smallButton = {
|
||||
width: '36px',
|
||||
height: '36px',
|
||||
padding: '5px'
|
||||
};
|
||||
|
||||
var rssInput = {
|
||||
width: '90%',
|
||||
paddingRight: '10px'
|
||||
};
|
||||
|
||||
var inlineStyle = {
|
||||
display: 'inline-block',
|
||||
backdrop: 'static'
|
||||
};
|
||||
|
||||
var RSSModalLayout = function (_React$Component) {
|
||||
_inherits(RSSModalLayout, _React$Component);
|
||||
|
||||
function RSSModalLayout(props) {
|
||||
_classCallCheck(this, RSSModalLayout);
|
||||
|
||||
var _this = _possibleConstructorReturn(this, (RSSModalLayout.__proto__ || Object.getPrototypeOf(RSSModalLayout)).call(this, props));
|
||||
|
||||
_this.handleRSSModalClose = function () {
|
||||
var closeState = false;
|
||||
_this.props.rssModalOpenState(closeState);
|
||||
};
|
||||
|
||||
_this.handleAddRSSFeed = function () {
|
||||
_this.setState({ textValue: "Clear" }); //clearing out the text submitted
|
||||
var RSSURLSubmit = {
|
||||
messageType: "addRSSFeed",
|
||||
Payload: [_this.state.textValue]
|
||||
};
|
||||
ws.send(JSON.stringify(RSSURLSubmit));
|
||||
var RSSRequest = {
|
||||
messageType: "rssFeedRequest"
|
||||
};
|
||||
ws.send(JSON.stringify(RSSRequest)); //Immediatly request an update of the feed when you add a new URL
|
||||
};
|
||||
|
||||
_this.setTextValue = function (event) {
|
||||
_this.setState({ textValue: event.target.value });
|
||||
};
|
||||
|
||||
var layout = [{ i: 'a', x: 0, y: 0, w: 6, h: 1, static: true }, { i: 'b', x: 0, y: 1, w: 1, h: 5, static: true }, { i: 'c', x: 1, y: 1, w: 5, h: 5, minW: 5, minH: 3, static: true }];
|
||||
_this.state = { layout: layout };
|
||||
|
||||
return _this;
|
||||
}
|
||||
|
||||
_createClass(RSSModalLayout, [{
|
||||
key: 'onLayoutChange',
|
||||
value: function onLayoutChange(layout) {
|
||||
this.props.onLayoutChange(layout);
|
||||
}
|
||||
}, {
|
||||
key: 'componentWillReceiveProps',
|
||||
value: function componentWillReceiveProps(nextProps) {
|
||||
console.log("nextprops", nextProps, "Modal", nextProps.RSSModalOpen);
|
||||
}
|
||||
}, {
|
||||
key: 'componentWillMount',
|
||||
value: function componentWillMount() {
|
||||
console.log("Mounting grid");
|
||||
}
|
||||
}, {
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ style: inlineStyle },
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogContent,
|
||||
null,
|
||||
_react2.default.createElement(
|
||||
ReactGridLayout,
|
||||
_extends({ layout: this.state.layout, onLayoutChange: this.onLayoutChange
|
||||
}, this.props),
|
||||
_react2.default.createElement(
|
||||
'div',
|
||||
{ key: 'a', sytle: background, className: 'DragHandle' },
|
||||
_react2.default.createElement(_TextField2.default, {
|
||||
style: rssInput,
|
||||
autoFocus: true,
|
||||
margin: 'dense',
|
||||
id: 'name',
|
||||
label: 'Add New RSS URL',
|
||||
type: 'text',
|
||||
placeholder: 'Enter RSS URL Here..',
|
||||
onChange: this.setTextValue
|
||||
}),
|
||||
_react2.default.createElement(
|
||||
_IconButton2.default,
|
||||
{ onClick: this.handleAddRSSFeed, color: 'primary', 'data-tip': 'Add RSS Feed', style: smallButton, 'aria-label': 'Add RSS Feeds' },
|
||||
_react2.default.createElement(_reactTooltip2.default, { place: 'top', type: 'light', effect: 'float' }),
|
||||
_react2.default.createElement(_AddCircle2.default, null)
|
||||
)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
'div',
|
||||
{ key: 'b', style: background, className: 'DragHandle' },
|
||||
_react2.default.createElement(_RSSFeedList2.default, null)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
'div',
|
||||
{ key: 'c', style: background, className: 'DragHandle' },
|
||||
_react2.default.createElement(_RSSTorrentList2.default, null)
|
||||
)
|
||||
)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogActions,
|
||||
null,
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ onClick: this.handleRSSModalClose, color: 'primary' },
|
||||
'Close'
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return RSSModalLayout;
|
||||
}(_react2.default.Component);
|
||||
|
||||
RSSModalLayout.propTypes = {
|
||||
onLayoutChange: _propTypes2.default.func.isRequired
|
||||
};
|
||||
RSSModalLayout.defaultProps = {
|
||||
className: "layout",
|
||||
items: 4,
|
||||
rowHeight: 100,
|
||||
onLayoutChange: function onLayoutChange() {},
|
||||
cols: 6,
|
||||
draggableCancel: '.NoDrag',
|
||||
draggableHandle: '.DragHandle'
|
||||
};
|
||||
;
|
||||
|
||||
//module.exports = RSSModalLayout;
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
RSSList: state.RSSList,
|
||||
RSSModalOpen: state.RSSModalOpen
|
||||
};
|
||||
};
|
||||
|
||||
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
||||
return {
|
||||
rssModalOpenState: function rssModalOpenState(RSSModalOpen) {
|
||||
return dispatch({ type: actionTypes.RSS_MODAL_OPEN_STATE, RSSModalOpen: RSSModalOpen });
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(RSSModalLayout);
|
149
goTorrentWebUI/lib/TopMenu/Modals/RSSModal/RSSTorrentList.js
Normal file
149
goTorrentWebUI/lib/TopMenu/Modals/RSSModal/RSSTorrentList.js
Normal file
@@ -0,0 +1,149 @@
|
||||
'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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
var _Button = require('material-ui/Button');
|
||||
|
||||
var _Button2 = _interopRequireDefault(_Button);
|
||||
|
||||
var _dxReactGrid = require('@devexpress/dx-react-grid');
|
||||
|
||||
var _dxReactGridMaterialUi = require('@devexpress/dx-react-grid-material-ui');
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../../../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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 }; }
|
||||
|
||||
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 tableStyle = {};
|
||||
|
||||
var RSSTorrentList = function (_React$Component) {
|
||||
_inherits(RSSTorrentList, _React$Component);
|
||||
|
||||
function RSSTorrentList(props) {
|
||||
_classCallCheck(this, RSSTorrentList);
|
||||
|
||||
var _this = _possibleConstructorReturn(this, (RSSTorrentList.__proto__ || Object.getPrototypeOf(RSSTorrentList)).call(this, props));
|
||||
|
||||
_this.changeSelection = function (selection) {
|
||||
console.log("TorrentList is changing selection now", selection);
|
||||
_this.setState({ selected: selection });
|
||||
if (selection.length > 0) {
|
||||
//if selection is empty buttons will be default and selectionHashes will be blanked out and pushed to redux
|
||||
console.log("Getting the selected Rows");
|
||||
var selectedRows = []; //array of all the selected Rows
|
||||
selection.forEach(function (element) {
|
||||
selectedRows.push(_this.props.RSSTorrentList[element]); //pushing the selected rows out of torrentlist
|
||||
});
|
||||
_this.setState({ fileSelection: selectedRows });
|
||||
}
|
||||
};
|
||||
|
||||
_this.sendMagnetLinks = function () {
|
||||
var sendMagnetLinks = [];
|
||||
_this.state.fileSelection.forEach(function (element) {
|
||||
//fileselection contains the currently selected rows
|
||||
console.log("element", element);
|
||||
sendMagnetLinks.push(element.TorrentLink);
|
||||
});
|
||||
var magnetLinkSubmit = {
|
||||
MessageType: "magnetLinkSubmit",
|
||||
Payload: sendMagnetLinks
|
||||
};
|
||||
console.log(JSON.stringify(magnetLinkSubmit));
|
||||
ws.send(JSON.stringify(magnetLinkSubmit));
|
||||
};
|
||||
|
||||
_this.state = { //rows are stored in redux they are sent over from the server
|
||||
columns: [{ name: 'TorrentName', title: 'Title' }, { name: 'TorrentLink', title: 'Magnet Link' }, { name: 'PublishDate', title: 'Date Published' }],
|
||||
sorting: [],
|
||||
columnOrder: ['TorrentName', 'TorrentLink', 'PublishDate'],
|
||||
columnWidths: { TorrentName: 450, TorrentLink: 650, PublishDate: 200 },
|
||||
fileSelection: [],
|
||||
selected: []
|
||||
|
||||
};
|
||||
|
||||
_this.changeColumnOrder = function (columnOrder) {
|
||||
return _this.setState({ columnOrder: columnOrder });
|
||||
};
|
||||
_this.changeColumnWidths = function (columnWidths) {
|
||||
return _this.setState({ columnWidths: columnWidths });
|
||||
};
|
||||
_this.changeSorting = function (sorting) {
|
||||
return _this.setState({ sorting: sorting });
|
||||
};
|
||||
|
||||
return _this;
|
||||
}
|
||||
|
||||
_createClass(RSSTorrentList, [{
|
||||
key: 'componentWillReceiveProps',
|
||||
value: function componentWillReceiveProps() {
|
||||
console.log("New torrentlist", this.props.RSSTorrentList);
|
||||
}
|
||||
}, {
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
return (
|
||||
//Buttons here
|
||||
_react2.default.createElement(
|
||||
'div',
|
||||
null,
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ raised: true, color: 'primary', onClick: this.sendMagnetLinks },
|
||||
'Download Torrents'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_dxReactGridMaterialUi.Grid,
|
||||
{ rows: this.props.RSSTorrentList, columns: this.state.columns },
|
||||
_react2.default.createElement(_dxReactGrid.SortingState, { sorting: this.state.sorting, onSortingChange: this.changeSorting }),
|
||||
_react2.default.createElement(_dxReactGrid.LocalSorting, null),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.DragDropContext, null),
|
||||
_react2.default.createElement(_dxReactGrid.SelectionState, { onSelectionChange: this.changeSelection, selection: this.state.selection }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.VirtualTableView, { height: 500 }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableColumnResizing, { columnWidths: this.state.columnWidths, onColumnWidthsChange: this.changeColumnWidths }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableColumnReordering, { order: this.state.columnOrder, onOrderChange: this.changeColumnOrder }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableSelection, { selectByRowClick: true, highlightSelected: true }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableHeaderRow, { allowSorting: true, allowResizing: true, allowDragging: true })
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return RSSTorrentList;
|
||||
}(_react2.default.Component);
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
selectionHashes: state.selectionHashes,
|
||||
RSSTorrentList: state.RSSTorrentList
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _reactRedux.connect)(mapStateToProps)(RSSTorrentList);
|
177
goTorrentWebUI/lib/TopMenu/Modals/RSSModal/addRSSModal.js
Normal file
177
goTorrentWebUI/lib/TopMenu/Modals/RSSModal/addRSSModal.js
Normal file
@@ -0,0 +1,177 @@
|
||||
'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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
var _Button = require('material-ui/Button');
|
||||
|
||||
var _Button2 = _interopRequireDefault(_Button);
|
||||
|
||||
var _TextField = require('material-ui/TextField');
|
||||
|
||||
var _TextField2 = _interopRequireDefault(_TextField);
|
||||
|
||||
var _styles = require('material-ui/styles');
|
||||
|
||||
var _propTypes = require('prop-types');
|
||||
|
||||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||||
|
||||
var _List = require('material-ui/List');
|
||||
|
||||
var _List2 = _interopRequireDefault(_List);
|
||||
|
||||
var _Dialog = require('material-ui/Dialog');
|
||||
|
||||
var _Dialog2 = _interopRequireDefault(_Dialog);
|
||||
|
||||
var _Link = require('material-ui-icons/Link');
|
||||
|
||||
var _Link2 = _interopRequireDefault(_Link);
|
||||
|
||||
var _reactTooltip = require('react-tooltip');
|
||||
|
||||
var _reactTooltip2 = _interopRequireDefault(_reactTooltip);
|
||||
|
||||
var _Icon = require('material-ui/Icon');
|
||||
|
||||
var _Icon2 = _interopRequireDefault(_Icon);
|
||||
|
||||
var _IconButton = require('material-ui/IconButton');
|
||||
|
||||
var _IconButton2 = _interopRequireDefault(_IconButton);
|
||||
|
||||
var _RssFeed = require('material-ui-icons/RssFeed');
|
||||
|
||||
var _RssFeed2 = _interopRequireDefault(_RssFeed);
|
||||
|
||||
var _AddCircle = require('material-ui-icons/AddCircle');
|
||||
|
||||
var _AddCircle2 = _interopRequireDefault(_AddCircle);
|
||||
|
||||
var _RSSModalLayout = require('./RSSModalLayout');
|
||||
|
||||
var _RSSModalLayout2 = _interopRequireDefault(_RSSModalLayout);
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../../../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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 }; }
|
||||
|
||||
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; }
|
||||
|
||||
//Redux
|
||||
|
||||
|
||||
var button = {
|
||||
fontSize: '60px',
|
||||
paddingRight: '20px',
|
||||
paddingLeft: '20px'
|
||||
};
|
||||
|
||||
var inlineStyle = {
|
||||
display: 'inline-block',
|
||||
backdrop: 'static'
|
||||
};
|
||||
|
||||
var AddRSSModal = function (_React$Component) {
|
||||
_inherits(AddRSSModal, _React$Component);
|
||||
|
||||
function AddRSSModal() {
|
||||
var _ref;
|
||||
|
||||
var _temp, _this, _ret;
|
||||
|
||||
_classCallCheck(this, AddRSSModal);
|
||||
|
||||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
||||
args[_key] = arguments[_key];
|
||||
}
|
||||
|
||||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = AddRSSModal.__proto__ || Object.getPrototypeOf(AddRSSModal)).call.apply(_ref, [this].concat(args))), _this), _this.rssModalOpenState = function () {
|
||||
console.log("Opening RSS Modal");
|
||||
_this.props.rssModalOpenState(true);
|
||||
}, _temp), _possibleConstructorReturn(_this, _ret);
|
||||
}
|
||||
|
||||
_createClass(AddRSSModal, [{
|
||||
key: 'componentDidMount',
|
||||
value: function componentDidMount() {
|
||||
//Immediatly request an update of the feed when loading app
|
||||
var RSSRequest = {
|
||||
messageType: "rssFeedRequest"
|
||||
};
|
||||
ws.send(JSON.stringify(RSSRequest));
|
||||
}
|
||||
}, {
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
var _props = this.props,
|
||||
classes = _props.classes,
|
||||
onRequestClose = _props.onRequestClose,
|
||||
handleRequestClose = _props.handleRequestClose,
|
||||
handleSubmit = _props.handleSubmit;
|
||||
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ style: inlineStyle },
|
||||
_react2.default.createElement(
|
||||
_IconButton2.default,
|
||||
{ onClick: this.rssModalOpenState, color: 'primary', 'data-tip': 'Add RSS URL', style: button, 'aria-label': 'RSS Feeds' },
|
||||
_react2.default.createElement(_reactTooltip2.default, { place: 'top', type: 'light', effect: 'float' }),
|
||||
_react2.default.createElement(_RssFeed2.default, null)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Dialog2.default,
|
||||
{ fullScreen: true, open: this.props.RSSModalOpen, onRequestClose: this.handleRequestClose },
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogTitle,
|
||||
null,
|
||||
'Manage RSS Feeds'
|
||||
),
|
||||
_react2.default.createElement(_RSSModalLayout2.default, null)
|
||||
)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return AddRSSModal;
|
||||
}(_react2.default.Component);
|
||||
|
||||
;
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
RSSModalOpen: state.RSSModalOpen
|
||||
};
|
||||
};
|
||||
|
||||
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
||||
return {
|
||||
rssModalOpenState: function rssModalOpenState(RSSModalOpen) {
|
||||
return dispatch({ type: actionTypes.RSS_MODAL_OPEN_STATE, RSSModalOpen: RSSModalOpen });
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(AddRSSModal);
|
198
goTorrentWebUI/lib/TopMenu/Modals/addTorrentFileModal.js
Normal file
198
goTorrentWebUI/lib/TopMenu/Modals/addTorrentFileModal.js
Normal file
@@ -0,0 +1,198 @@
|
||||
'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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
var _Button = require('material-ui/Button');
|
||||
|
||||
var _Button2 = _interopRequireDefault(_Button);
|
||||
|
||||
var _TextField = require('material-ui/TextField');
|
||||
|
||||
var _TextField2 = _interopRequireDefault(_TextField);
|
||||
|
||||
var _styles = require('material-ui/styles');
|
||||
|
||||
var _propTypes = require('prop-types');
|
||||
|
||||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||||
|
||||
var _Dialog = require('material-ui/Dialog');
|
||||
|
||||
var _Dialog2 = _interopRequireDefault(_Dialog);
|
||||
|
||||
var _reactTooltip = require('react-tooltip');
|
||||
|
||||
var _reactTooltip2 = _interopRequireDefault(_reactTooltip);
|
||||
|
||||
var _AddBox = require('material-ui-icons/AddBox');
|
||||
|
||||
var _AddBox2 = _interopRequireDefault(_AddBox);
|
||||
|
||||
var _IconButton = require('material-ui/IconButton');
|
||||
|
||||
var _IconButton2 = _interopRequireDefault(_IconButton);
|
||||
|
||||
var _reactDropzone = require('react-dropzone');
|
||||
|
||||
var _reactDropzone2 = _interopRequireDefault(_reactDropzone);
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||||
|
||||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||||
|
||||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
||||
//import InsertLinkIcon from 'material-ui-icons/Link';
|
||||
|
||||
//import Icon from 'material-ui/Icon';
|
||||
|
||||
|
||||
var button = {
|
||||
fontSize: '60px',
|
||||
paddingRight: '20px',
|
||||
paddingLeft: '20px'
|
||||
};
|
||||
|
||||
var uploadButton = {
|
||||
fontSize: '35px',
|
||||
paddingLeft: '0px'
|
||||
};
|
||||
|
||||
var inlineStyle = {
|
||||
display: 'inline-block'
|
||||
};
|
||||
|
||||
var input = {
|
||||
display: 'none'
|
||||
};
|
||||
|
||||
var addTorrentFilePopup = function (_React$Component) {
|
||||
_inherits(addTorrentFilePopup, _React$Component);
|
||||
|
||||
function addTorrentFilePopup() {
|
||||
var _ref;
|
||||
|
||||
var _temp, _this, _ret;
|
||||
|
||||
_classCallCheck(this, addTorrentFilePopup);
|
||||
|
||||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
||||
args[_key] = arguments[_key];
|
||||
}
|
||||
|
||||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = addTorrentFilePopup.__proto__ || Object.getPrototypeOf(addTorrentFilePopup)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
|
||||
open: false,
|
||||
torrentFileName: "",
|
||||
torrentFileValue: [],
|
||||
storageValue: "",
|
||||
showDrop: true
|
||||
}, _this.handleClickOpen = function () {
|
||||
_this.setState({ open: true });
|
||||
}, _this.handleRequestClose = function () {
|
||||
_this.setState({ open: false });
|
||||
}, _this.handleSubmit = function () {
|
||||
_this.setState({ open: false });
|
||||
//let magnetLinkSubmit = this.state.textValue;
|
||||
console.log("File", _this.state.torrentFileValue);
|
||||
var reader = new FileReader();
|
||||
var torrentFileBlob = new Blob(_this.state.torrentFileValue);
|
||||
console.log("Blob", torrentFileBlob);
|
||||
reader.readAsDataURL(torrentFileBlob);
|
||||
reader.onloadend = function () {
|
||||
var base64data = reader.result;
|
||||
console.log("Base64", base64data);
|
||||
|
||||
var torrentFileMessage = {
|
||||
messageType: "torrentFileSubmit",
|
||||
messageDetail: _this.state.torrentFileName,
|
||||
messageDetailTwo: _this.state.storageValue,
|
||||
Payload: [base64data]
|
||||
};
|
||||
console.log("Sending magnet link: ", torrentFileMessage);
|
||||
ws.send(JSON.stringify(torrentFileMessage));
|
||||
};
|
||||
}, _this.onFileLoad = function (file) {
|
||||
_this.setState({ torrentFileName: file[0].name });
|
||||
_this.setState({ showDrop: false });
|
||||
_this.setState({ torrentFileValue: file });
|
||||
console.log("File Name", file[0].name);
|
||||
}, _this.setStorageValue = function (event) {
|
||||
_this.setState({ storageValue: event.target.value });
|
||||
}, _temp), _possibleConstructorReturn(_this, _ret);
|
||||
}
|
||||
|
||||
_createClass(addTorrentFilePopup, [{
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
var _props = this.props,
|
||||
classes = _props.classes,
|
||||
onRequestClose = _props.onRequestClose,
|
||||
handleRequestClose = _props.handleRequestClose,
|
||||
handleSubmit = _props.handleSubmit;
|
||||
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ style: inlineStyle },
|
||||
_react2.default.createElement(
|
||||
_IconButton2.default,
|
||||
{ onClick: this.handleClickOpen, color: 'primary', 'data-tip': 'Add Torrent File', style: button, centerRipple: true, 'aria-label': 'Add Torrent File' },
|
||||
_react2.default.createElement(_reactTooltip2.default, { place: 'top', type: 'light', effect: 'float' }),
|
||||
_react2.default.createElement(_AddBox2.default, null)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Dialog2.default,
|
||||
{ open: this.state.open, onRequestClose: this.handleRequestClose, onEscapeKeyUp: this.handleRequestClose, maxWidth: 'md' },
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogTitle,
|
||||
null,
|
||||
'Add Torrent File'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogContent,
|
||||
null,
|
||||
_react2.default.createElement(_Dialog.DialogContentText, null),
|
||||
this.state.showDrop && _react2.default.createElement(
|
||||
_reactDropzone2.default,
|
||||
{ disablePreview: true, multiple: false, onDrop: this.onFileLoad },
|
||||
'Upload Torrent Here and Add Storage Path'
|
||||
),
|
||||
this.state.torrentFileName != "" && this.state.torrentFileName,
|
||||
_react2.default.createElement(_TextField2.default, { id: 'storagePath', type: 'text', label: 'Storage Path', placeholder: 'Empty will be default torrent storage path', fullWidth: true, onChange: this.setStorageValue })
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogActions,
|
||||
null,
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ onClick: this.handleRequestClose, color: 'primary' },
|
||||
'Cancel'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ onClick: this.handleSubmit, color: 'primary' },
|
||||
'Submit'
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return addTorrentFilePopup;
|
||||
}(_react2.default.Component);
|
||||
|
||||
exports.default = addTorrentFilePopup;
|
||||
;
|
179
goTorrentWebUI/lib/TopMenu/Modals/addTorrentLinkModal.js
Normal file
179
goTorrentWebUI/lib/TopMenu/Modals/addTorrentLinkModal.js
Normal file
@@ -0,0 +1,179 @@
|
||||
'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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
var _Button = require('material-ui/Button');
|
||||
|
||||
var _Button2 = _interopRequireDefault(_Button);
|
||||
|
||||
var _TextField = require('material-ui/TextField');
|
||||
|
||||
var _TextField2 = _interopRequireDefault(_TextField);
|
||||
|
||||
var _styles = require('material-ui/styles');
|
||||
|
||||
var _propTypes = require('prop-types');
|
||||
|
||||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||||
|
||||
var _Dialog = require('material-ui/Dialog');
|
||||
|
||||
var _Dialog2 = _interopRequireDefault(_Dialog);
|
||||
|
||||
var _Link = require('material-ui-icons/Link');
|
||||
|
||||
var _Link2 = _interopRequireDefault(_Link);
|
||||
|
||||
var _reactTooltip = require('react-tooltip');
|
||||
|
||||
var _reactTooltip2 = _interopRequireDefault(_reactTooltip);
|
||||
|
||||
var _Icon = require('material-ui/Icon');
|
||||
|
||||
var _Icon2 = _interopRequireDefault(_Icon);
|
||||
|
||||
var _IconButton = require('material-ui/IconButton');
|
||||
|
||||
var _IconButton2 = _interopRequireDefault(_IconButton);
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
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 button = {
|
||||
fontSize: '60px',
|
||||
paddingRight: '20px',
|
||||
paddingLeft: '20px'
|
||||
};
|
||||
|
||||
var inlineStyle = {
|
||||
display: 'inline-block',
|
||||
backdrop: 'static'
|
||||
};
|
||||
|
||||
var addTorrentPopup = function (_React$Component) {
|
||||
_inherits(addTorrentPopup, _React$Component);
|
||||
|
||||
function addTorrentPopup() {
|
||||
var _ref;
|
||||
|
||||
var _temp, _this, _ret;
|
||||
|
||||
_classCallCheck(this, addTorrentPopup);
|
||||
|
||||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
||||
args[_key] = arguments[_key];
|
||||
}
|
||||
|
||||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = addTorrentPopup.__proto__ || Object.getPrototypeOf(addTorrentPopup)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
|
||||
open: false,
|
||||
magnetLinkValue: "",
|
||||
storageValue: ""
|
||||
|
||||
}, _this.handleClickOpen = function () {
|
||||
_this.setState({ open: true });
|
||||
}, _this.handleRequestClose = function () {
|
||||
_this.setState({ open: false });
|
||||
}, _this.handleSubmit = function () {
|
||||
_this.setState({ open: false });
|
||||
//let magnetLinkSubmit = this.state.textValue;
|
||||
var magnetLinkMessage = {
|
||||
messageType: "magnetLinkSubmit",
|
||||
messageDetail: _this.state.storageValue,
|
||||
Payload: [_this.state.magnetLinkValue]
|
||||
};
|
||||
console.log("Sending magnet link: ", magnetLinkMessage);
|
||||
ws.send(JSON.stringify(magnetLinkMessage));
|
||||
}, _this.setMagnetLinkValue = function (event) {
|
||||
_this.setState({ magnetLinkValue: event.target.value });
|
||||
}, _this.setStorageValue = function (event) {
|
||||
_this.setState({ storageValue: event.target.value });
|
||||
}, _temp), _possibleConstructorReturn(_this, _ret);
|
||||
}
|
||||
|
||||
_createClass(addTorrentPopup, [{
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
var _props = this.props,
|
||||
classes = _props.classes,
|
||||
onRequestClose = _props.onRequestClose,
|
||||
handleRequestClose = _props.handleRequestClose,
|
||||
handleSubmit = _props.handleSubmit;
|
||||
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ style: inlineStyle },
|
||||
_react2.default.createElement(
|
||||
_IconButton2.default,
|
||||
{ onClick: this.handleClickOpen, color: 'primary', 'data-tip': 'Add Magnet Link', style: button, centerRipple: true, 'aria-label': 'Add Magnet Link' },
|
||||
_react2.default.createElement(_reactTooltip2.default, { place: 'top', type: 'light', effect: 'float' }),
|
||||
_react2.default.createElement(_Link2.default, null)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Dialog2.default,
|
||||
{ open: this.state.open, onRequestClose: this.handleRequestClose },
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogTitle,
|
||||
null,
|
||||
'Add Magnet Link'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogContent,
|
||||
null,
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogContentText,
|
||||
null,
|
||||
'Add a Magnet Link here and hit submit to add torrent...'
|
||||
),
|
||||
_react2.default.createElement(_TextField2.default, {
|
||||
autoFocus: true,
|
||||
margin: 'dense',
|
||||
id: 'name',
|
||||
label: 'Magnet Link',
|
||||
type: 'text',
|
||||
placeholder: 'Enter Magnet Link Here',
|
||||
fullWidth: true,
|
||||
onChange: this.setMagnetLinkValue
|
||||
}),
|
||||
_react2.default.createElement(_TextField2.default, { id: 'storagePath', type: 'text', label: 'Storage Path', placeholder: 'Empty will be default torrent storage path', fullWidth: true, onChange: this.setStorageValue })
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogActions,
|
||||
null,
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ onClick: this.handleRequestClose, color: 'primary' },
|
||||
'Cancel'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ onClick: this.handleSubmit, color: 'primary' },
|
||||
'Submit'
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return addTorrentPopup;
|
||||
}(_react2.default.Component);
|
||||
|
||||
exports.default = addTorrentPopup;
|
||||
;
|
216
goTorrentWebUI/lib/TopMenu/Modals/deleteTorrentModal.js
Normal file
216
goTorrentWebUI/lib/TopMenu/Modals/deleteTorrentModal.js
Normal file
@@ -0,0 +1,216 @@
|
||||
'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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
var _Button = require('material-ui/Button');
|
||||
|
||||
var _Button2 = _interopRequireDefault(_Button);
|
||||
|
||||
var _TextField = require('material-ui/TextField');
|
||||
|
||||
var _TextField2 = _interopRequireDefault(_TextField);
|
||||
|
||||
var _styles = require('material-ui/styles');
|
||||
|
||||
var _propTypes = require('prop-types');
|
||||
|
||||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||||
|
||||
var _Dialog = require('material-ui/Dialog');
|
||||
|
||||
var _Dialog2 = _interopRequireDefault(_Dialog);
|
||||
|
||||
var _reactTooltip = require('react-tooltip');
|
||||
|
||||
var _reactTooltip2 = _interopRequireDefault(_reactTooltip);
|
||||
|
||||
var _AddBox = require('material-ui-icons/AddBox');
|
||||
|
||||
var _AddBox2 = _interopRequireDefault(_AddBox);
|
||||
|
||||
var _IconButton = require('material-ui/IconButton');
|
||||
|
||||
var _IconButton2 = _interopRequireDefault(_IconButton);
|
||||
|
||||
var _Delete = require('material-ui-icons/Delete');
|
||||
|
||||
var _Delete2 = _interopRequireDefault(_Delete);
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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 }; }
|
||||
|
||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||||
|
||||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||||
|
||||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
||||
//import InsertLinkIcon from 'material-ui-icons/Link';
|
||||
|
||||
//import Icon from 'material-ui/Icon';
|
||||
|
||||
|
||||
//Redux
|
||||
|
||||
|
||||
var button = {
|
||||
fontSize: '60px',
|
||||
paddingRight: '20px',
|
||||
paddingLeft: '20px'
|
||||
};
|
||||
|
||||
var inlineStyle = {
|
||||
display: 'inline-block'
|
||||
};
|
||||
|
||||
var DeleteTorrentModal = function (_React$Component) {
|
||||
_inherits(DeleteTorrentModal, _React$Component);
|
||||
|
||||
function DeleteTorrentModal() {
|
||||
var _ref;
|
||||
|
||||
var _temp, _this, _ret;
|
||||
|
||||
_classCallCheck(this, DeleteTorrentModal);
|
||||
|
||||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
||||
args[_key] = arguments[_key];
|
||||
}
|
||||
|
||||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = DeleteTorrentModal.__proto__ || Object.getPrototypeOf(DeleteTorrentModal)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
|
||||
open: false
|
||||
}, _this.handleDeleteTorrent = function () {
|
||||
var selection = [];
|
||||
var deleteTorrentHashes = {
|
||||
MessageType: "deleteTorrents",
|
||||
MessageDetail: "true",
|
||||
Payload: _this.props.selectionHashes
|
||||
};
|
||||
console.log("Deleting Torrents", deleteTorrentHashes);
|
||||
ws.send(JSON.stringify(deleteTorrentHashes));
|
||||
_this.props.setButtonState(_this.props.selection); //TODO this currently just forces a button refresh, should be a better way to do this
|
||||
_this.props.changeSelection(selection); //purging out our selection after deleting a torent
|
||||
_this.setState({ open: false });
|
||||
}, _this.handleDeleteData = function () {
|
||||
var selection = [];
|
||||
|
||||
var deleteTorrentHashes = {
|
||||
MessageType: "deleteTorrents",
|
||||
MessageDetail: "true",
|
||||
Payload: _this.props.selectionHashes
|
||||
};
|
||||
console.log("Deleting Torrents and Data", deleteTorrentHashes);
|
||||
ws.send(JSON.stringify(deleteTorrentHashes));
|
||||
_this.props.setButtonState(_this.props.selection); //TODO this currently just forces a button refresh, should be a better way to do this
|
||||
_this.props.changeSelection(selection); //purging out our selection after deleting a torent
|
||||
_this.setState({ open: false });
|
||||
}, _this.handleClickOpen = function () {
|
||||
if (_this.props.selection.length > 0) {
|
||||
_this.setState({ open: true });
|
||||
} else {
|
||||
console.log("Select a torrent to delete..");
|
||||
}
|
||||
}, _this.handleRequestClose = function () {
|
||||
_this.setState({ open: false });
|
||||
}, _this.setTextValue = function (event) {
|
||||
_this.setState({ textValue: event.target.value });
|
||||
}, _temp), _possibleConstructorReturn(_this, _ret);
|
||||
}
|
||||
|
||||
_createClass(DeleteTorrentModal, [{
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
var _props = this.props,
|
||||
onRequestClose = _props.onRequestClose,
|
||||
handleRequestClose = _props.handleRequestClose,
|
||||
handleSubmit = _props.handleSubmit;
|
||||
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ style: inlineStyle },
|
||||
_react2.default.createElement(
|
||||
_IconButton2.default,
|
||||
{ color: this.props.buttonState[0].deleteButton, 'data-tip': 'Delete Torrent', style: button, onClick: this.handleClickOpen, 'aria-label': 'Delete Torrent' },
|
||||
_react2.default.createElement(_reactTooltip2.default, { place: 'top', type: 'error', effect: 'float' }),
|
||||
_react2.default.createElement(_Delete2.default, null)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Dialog2.default,
|
||||
{ open: this.state.open, onRequestClose: this.handleRequestClose, onEscapeKeyUp: this.handleRequestClose, maxWidth: 'md' },
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogTitle,
|
||||
null,
|
||||
'Delete Torrent'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogContent,
|
||||
null,
|
||||
'Are you sure you want to delete Torrent?'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Dialog.DialogActions,
|
||||
null,
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ onClick: this.handleRequestClose, color: 'primary' },
|
||||
'Cancel'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ onClick: this.handleDeleteData, color: 'primary' },
|
||||
'Delete with Data'
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_Button2.default,
|
||||
{ onClick: this.handleDeleteTorrent, color: 'primary' },
|
||||
'Delete just Torrent'
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return DeleteTorrentModal;
|
||||
}(_react2.default.Component);
|
||||
|
||||
;
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
buttonState: state.buttonState,
|
||||
selection: state.selection,
|
||||
selectionHashes: state.selectionHashes
|
||||
};
|
||||
};
|
||||
|
||||
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
||||
return {
|
||||
setButtonState: function setButtonState(buttonState) {
|
||||
return dispatch({ type: actionTypes.SET_BUTTON_STATE, buttonState: buttonState });
|
||||
},
|
||||
changeSelection: function changeSelection(selection) {
|
||||
return dispatch({ type: actionTypes.CHANGE_SELECTION, selection: selection });
|
||||
} //used to force a selection empty after deleting torrent
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(DeleteTorrentModal);
|
226
goTorrentWebUI/lib/TopMenu/topMenu.js
Normal file
226
goTorrentWebUI/lib/TopMenu/topMenu.js
Normal file
@@ -0,0 +1,226 @@
|
||||
'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 _propTypes = require('prop-types');
|
||||
|
||||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||||
|
||||
require('typeface-roboto');
|
||||
|
||||
var _styles = require('material-ui/styles');
|
||||
|
||||
var _Icon = require('material-ui/Icon');
|
||||
|
||||
var _Icon2 = _interopRequireDefault(_Icon);
|
||||
|
||||
var _IconButton = require('material-ui/IconButton');
|
||||
|
||||
var _IconButton2 = _interopRequireDefault(_IconButton);
|
||||
|
||||
var _addTorrentLinkModal = require('./Modals/addTorrentLinkModal');
|
||||
|
||||
var _addTorrentLinkModal2 = _interopRequireDefault(_addTorrentLinkModal);
|
||||
|
||||
var _addTorrentFileModal = require('./Modals/addTorrentFileModal');
|
||||
|
||||
var _addTorrentFileModal2 = _interopRequireDefault(_addTorrentFileModal);
|
||||
|
||||
var _addRSSModal = require('./Modals/RSSModal/addRSSModal');
|
||||
|
||||
var _addRSSModal2 = _interopRequireDefault(_addRSSModal);
|
||||
|
||||
var _deleteTorrentModal = require('./Modals/deleteTorrentModal');
|
||||
|
||||
var _deleteTorrentModal2 = _interopRequireDefault(_deleteTorrentModal);
|
||||
|
||||
var _PlayArrow = require('material-ui-icons/PlayArrow');
|
||||
|
||||
var _PlayArrow2 = _interopRequireDefault(_PlayArrow);
|
||||
|
||||
var _Stop = require('material-ui-icons/Stop');
|
||||
|
||||
var _Stop2 = _interopRequireDefault(_Stop);
|
||||
|
||||
var _RssFeed = require('material-ui-icons/RssFeed');
|
||||
|
||||
var _RssFeed2 = _interopRequireDefault(_RssFeed);
|
||||
|
||||
var _Settings = require('material-ui-icons/Settings');
|
||||
|
||||
var _Settings2 = _interopRequireDefault(_Settings);
|
||||
|
||||
var _reactTooltip = require('react-tooltip');
|
||||
|
||||
var _reactTooltip2 = _interopRequireDefault(_reactTooltip);
|
||||
|
||||
var _Delete = require('material-ui-icons/Delete');
|
||||
|
||||
var _Delete2 = _interopRequireDefault(_Delete);
|
||||
|
||||
var _AddShoppingCart = require('material-ui-icons/AddShoppingCart');
|
||||
|
||||
var _AddShoppingCart2 = _interopRequireDefault(_AddShoppingCart);
|
||||
|
||||
var _backendWebsocket = require('../BackendComm/backendWebsocket');
|
||||
|
||||
var _backendWebsocket2 = _interopRequireDefault(_backendWebsocket);
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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 }; }
|
||||
|
||||
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; } // contains the font for material UI
|
||||
|
||||
//import PauseTorrentIcon from 'material-ui-icons/Pause';
|
||||
|
||||
|
||||
//Redux
|
||||
|
||||
|
||||
var styles = function styles(theme) {
|
||||
return {
|
||||
button: {
|
||||
margin: theme.spacing.unit,
|
||||
fontSize: '60px'
|
||||
},
|
||||
input: {
|
||||
display: 'none'
|
||||
},
|
||||
paddingTest: {
|
||||
display: 'inline-block'
|
||||
},
|
||||
padding: {
|
||||
paddingTop: '10px',
|
||||
paddingLeft: '10px'
|
||||
},
|
||||
verticalDivider: {
|
||||
borderLeft: '2px solid grey',
|
||||
padding: '20px',
|
||||
height: '40px',
|
||||
position: 'absolute',
|
||||
display: 'inline-block',
|
||||
paddingRight: '30px',
|
||||
paddingLeft: '30px'
|
||||
},
|
||||
background: {
|
||||
backgroundColor: theme.palette.background.paper
|
||||
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var IconButtons = function (_React$Component) {
|
||||
_inherits(IconButtons, _React$Component);
|
||||
|
||||
function IconButtons(props) {
|
||||
_classCallCheck(this, IconButtons);
|
||||
|
||||
var _this = _possibleConstructorReturn(this, (IconButtons.__proto__ || Object.getPrototypeOf(IconButtons)).call(this, props));
|
||||
|
||||
_this.startTorrent = function () {
|
||||
console.log("Starting Torrents", _this.props.selectionHashes);
|
||||
var startTorrentHashes = {
|
||||
MessageType: "startTorrents",
|
||||
Payload: _this.props.selectionHashes
|
||||
//console.log("Peers tab information requested", peerListHashes)
|
||||
};ws.send(JSON.stringify(startTorrentHashes));
|
||||
_this.props.setButtonState(_this.props.selection); //TODO this currently just forces a button refresh, should be a better way to do this
|
||||
};
|
||||
|
||||
_this.stopTorrent = function () {
|
||||
var stopTorrentHashes = {
|
||||
MessageType: "stopTorrents",
|
||||
Payload: _this.props.selectionHashes
|
||||
};
|
||||
console.log("Stopping Torrents", stopTorrentHashes);
|
||||
ws.send(JSON.stringify(stopTorrentHashes));
|
||||
_this.props.setButtonState(_this.props.selection); //TODO this currently just forces a button refresh, should be a better way to do this
|
||||
};
|
||||
|
||||
return _this;
|
||||
}
|
||||
|
||||
_createClass(IconButtons, [{
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
var classes = this.props.classes;
|
||||
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ className: classes.padding },
|
||||
_react2.default.createElement(_addTorrentFileModal2.default, null),
|
||||
_react2.default.createElement(_addTorrentLinkModal2.default, null),
|
||||
_react2.default.createElement('div', { className: classes.verticalDivider }),
|
||||
_react2.default.createElement(
|
||||
_IconButton2.default,
|
||||
{ color: this.props.buttonState[0].startButton, 'data-tip': 'Start Torrent', className: classes.button, 'aria-label': 'Start Torrent', onClick: this.startTorrent },
|
||||
_react2.default.createElement(_reactTooltip2.default, { place: 'top', type: 'light', effect: 'float' }),
|
||||
_react2.default.createElement(_PlayArrow2.default, null)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_IconButton2.default,
|
||||
{ color: this.props.buttonState[0].stopButton, 'data-tip': 'Stop Torrent', className: classes.button, onClick: this.stopTorrent, 'aria-label': 'Stop Torrent' },
|
||||
_react2.default.createElement(_reactTooltip2.default, { place: 'top', type: 'light', effect: 'float' }),
|
||||
_react2.default.createElement(_Stop2.default, null)
|
||||
),
|
||||
_react2.default.createElement(_deleteTorrentModal2.default, null),
|
||||
_react2.default.createElement('div', { className: classes.verticalDivider }),
|
||||
_react2.default.createElement(_addRSSModal2.default, null),
|
||||
_react2.default.createElement(
|
||||
_IconButton2.default,
|
||||
{ color: 'primary', 'data-tip': 'Settings', className: classes.button, 'aria-label': 'Settings' },
|
||||
_react2.default.createElement(_reactTooltip2.default, { place: 'top', type: 'light', effect: 'float' }),
|
||||
_react2.default.createElement(_Settings2.default, null)
|
||||
),
|
||||
_react2.default.createElement('div', { className: classes.verticalDivider }),
|
||||
_react2.default.createElement(_backendWebsocket2.default, null)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return IconButtons;
|
||||
}(_react2.default.Component);
|
||||
|
||||
IconButtons.propTypes = {
|
||||
classes: _propTypes2.default.object.isRequired
|
||||
};
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
buttonState: state.buttonState,
|
||||
selection: state.selection,
|
||||
selectionHashes: state.selectionHashes
|
||||
};
|
||||
};
|
||||
|
||||
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
||||
return {
|
||||
setButtonState: function setButtonState(buttonState) {
|
||||
return dispatch({ type: actionTypes.SET_BUTTON_STATE, buttonState: buttonState });
|
||||
},
|
||||
changeSelection: function changeSelection(selection) {
|
||||
return dispatch({ type: actionTypes.CHANGE_SELECTION, selection: selection });
|
||||
} //used to force a selection empty after deleting torrent
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _styles.withStyles)(styles)((0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(IconButtons));
|
159
goTorrentWebUI/lib/app.js
Normal file
159
goTorrentWebUI/lib/app.js
Normal file
@@ -0,0 +1,159 @@
|
||||
'use strict';
|
||||
|
||||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||||
|
||||
var _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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
require('../node_modules/react-grid-layout/css/styles.css');
|
||||
|
||||
require('../node_modules/react-resizable/css/styles.css');
|
||||
|
||||
var _reactGridLayout = require('react-grid-layout');
|
||||
|
||||
var _reactGridLayout2 = _interopRequireDefault(_reactGridLayout);
|
||||
|
||||
var _propTypes = require('prop-types');
|
||||
|
||||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||||
|
||||
var _lodash = require('lodash');
|
||||
|
||||
var _lodash2 = _interopRequireDefault(_lodash);
|
||||
|
||||
var _redux = require('redux');
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _reducer = require('./store/reducer');
|
||||
|
||||
var _reducer2 = _interopRequireDefault(_reducer);
|
||||
|
||||
var _topMenu = require('./TopMenu/topMenu');
|
||||
|
||||
var _topMenu2 = _interopRequireDefault(_topMenu);
|
||||
|
||||
var _bottomMenu = require('./BottomMenu/bottomMenu');
|
||||
|
||||
var _bottomMenu2 = _interopRequireDefault(_bottomMenu);
|
||||
|
||||
var _leftMenu = require('./leftMenu/leftMenu');
|
||||
|
||||
var _leftMenu2 = _interopRequireDefault(_leftMenu);
|
||||
|
||||
var _torrentlist = require('./torrentlist');
|
||||
|
||||
var _torrentlist2 = _interopRequireDefault(_torrentlist);
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
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; }
|
||||
//css for react grid
|
||||
|
||||
//react-grid for layout
|
||||
|
||||
//Redux
|
||||
|
||||
//Menu and torrentlist imports
|
||||
|
||||
|
||||
var reduxStore = (0, _redux.createStore)(_reducer2.default);
|
||||
|
||||
var ReactGridLayout = (0, _reactGridLayout.WidthProvider)(_reactGridLayout2.default);
|
||||
|
||||
var background = {
|
||||
backgroundColor: '#e5e5e5',
|
||||
boxShadow: '0 0 20px #000'
|
||||
};
|
||||
|
||||
var BasicLayout = function (_React$PureComponent) {
|
||||
_inherits(BasicLayout, _React$PureComponent);
|
||||
|
||||
function BasicLayout(props) {
|
||||
_classCallCheck(this, BasicLayout);
|
||||
|
||||
var _this = _possibleConstructorReturn(this, (BasicLayout.__proto__ || Object.getPrototypeOf(BasicLayout)).call(this, props));
|
||||
|
||||
var layout = [{ i: 'a', x: 0, y: 0, w: 6, h: 1, static: true }, { i: 'b', x: 0, y: 1, w: 1, h: 9, static: true }, { i: 'c', x: 1, y: 1, w: 5, h: 5, minW: 5, minH: 3, static: true }, { i: 'd', x: 1, y: 6, w: 5, h: 4, minW: 5, minH: 1, static: true }];
|
||||
_this.state = { layout: layout };
|
||||
return _this;
|
||||
}
|
||||
|
||||
_createClass(BasicLayout, [{
|
||||
key: 'onLayoutChange',
|
||||
value: function onLayoutChange(layout) {
|
||||
this.props.onLayoutChange(layout);
|
||||
}
|
||||
}, {
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
return _react2.default.createElement(
|
||||
ReactGridLayout,
|
||||
_extends({ layout: this.state.layout, onLayoutChange: this.onLayoutChange
|
||||
}, this.props),
|
||||
_react2.default.createElement(
|
||||
'div',
|
||||
{ key: 'a', style: background, className: 'DragHandle' },
|
||||
_react2.default.createElement(_topMenu2.default, null)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
'div',
|
||||
{ key: 'b', style: background, className: 'DragHandle' },
|
||||
_react2.default.createElement(_leftMenu2.default, null)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
'div',
|
||||
{ key: 'c', style: background, className: 'DragHandle' },
|
||||
_react2.default.createElement(_torrentlist2.default, null)
|
||||
),
|
||||
_react2.default.createElement(
|
||||
'div',
|
||||
{ key: 'd' },
|
||||
_react2.default.createElement(_bottomMenu2.default, null)
|
||||
)
|
||||
) //returning our 4 grids
|
||||
|
||||
;
|
||||
}
|
||||
}]);
|
||||
|
||||
return BasicLayout;
|
||||
}(_react2.default.PureComponent);
|
||||
|
||||
BasicLayout.propTypes = {
|
||||
onLayoutChange: _propTypes2.default.func.isRequired
|
||||
};
|
||||
BasicLayout.defaultProps = {
|
||||
className: "layout",
|
||||
items: 4,
|
||||
rowHeight: 100,
|
||||
onLayoutChange: function onLayoutChange() {},
|
||||
cols: 6,
|
||||
draggableCancel: '.NoDrag',
|
||||
draggableHandle: '.DragHandle'
|
||||
};
|
||||
;
|
||||
|
||||
module.exports = BasicLayout;
|
||||
|
||||
//if (require.main === module) {
|
||||
// require('../test-hook.jsx')(module.exports);
|
||||
//}
|
||||
|
||||
_reactDom2.default.render(_react2.default.createElement(
|
||||
_reactRedux.Provider,
|
||||
{ store: reduxStore },
|
||||
_react2.default.createElement(BasicLayout, null)
|
||||
), //wrapping redux around our app
|
||||
document.getElementById('app'));
|
257
goTorrentWebUI/lib/leftMenu/leftMenu.js
Normal file
257
goTorrentWebUI/lib/leftMenu/leftMenu.js
Normal file
@@ -0,0 +1,257 @@
|
||||
'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 _propTypes = require('prop-types');
|
||||
|
||||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||||
|
||||
require('typeface-roboto');
|
||||
|
||||
var _styles = require('material-ui/styles');
|
||||
|
||||
var _List = require('material-ui/List');
|
||||
|
||||
var _List2 = _interopRequireDefault(_List);
|
||||
|
||||
var _Divider = require('material-ui/Divider');
|
||||
|
||||
var _Divider2 = _interopRequireDefault(_Divider);
|
||||
|
||||
var _FileDownload = require('material-ui-icons/FileDownload');
|
||||
|
||||
var _FileDownload2 = _interopRequireDefault(_FileDownload);
|
||||
|
||||
var _FileUpload = require('material-ui-icons/FileUpload');
|
||||
|
||||
var _FileUpload2 = _interopRequireDefault(_FileUpload);
|
||||
|
||||
var _SwapVert = require('material-ui-icons/SwapVert');
|
||||
|
||||
var _SwapVert2 = _interopRequireDefault(_SwapVert);
|
||||
|
||||
var _AllInclusive = require('material-ui-icons/AllInclusive');
|
||||
|
||||
var _AllInclusive2 = _interopRequireDefault(_AllInclusive);
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('../store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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 }; }
|
||||
|
||||
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; } // contains the font for material UI
|
||||
|
||||
|
||||
//react redux
|
||||
|
||||
|
||||
//TODO, clean up the goddamn variable names you are all over the place
|
||||
var styles = function styles(theme) {
|
||||
return {
|
||||
root: {
|
||||
width: '100%',
|
||||
maxWidth: 360,
|
||||
backgroundColor: '#e5e5e5'
|
||||
},
|
||||
icons: {
|
||||
width: '40px',
|
||||
height: '40px'
|
||||
},
|
||||
inactiveIcon: {
|
||||
width: '40px',
|
||||
height: '40px',
|
||||
color: 'red'
|
||||
},
|
||||
active: {
|
||||
backgroundColor: '#80b3ff'
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var SimpleList = function (_React$Component) {
|
||||
_inherits(SimpleList, _React$Component);
|
||||
|
||||
function SimpleList(props) {
|
||||
_classCallCheck(this, SimpleList);
|
||||
|
||||
var _this = _possibleConstructorReturn(this, (SimpleList.__proto__ || Object.getPrototypeOf(SimpleList)).call(this, props));
|
||||
|
||||
_initialiseProps.call(_this);
|
||||
|
||||
var classes = _this.props.classes;
|
||||
|
||||
_this.state = {
|
||||
allTorrentsClass: classes.active,
|
||||
downloadingClass: '',
|
||||
seedingClass: '',
|
||||
activeTorrentsClass: '',
|
||||
completedTorrentsClass: '',
|
||||
allID: "All",
|
||||
downloadingID: "Downloading",
|
||||
seedingID: "Seeding",
|
||||
activeID: "Active",
|
||||
completedID: "Completed"
|
||||
|
||||
};
|
||||
return _this;
|
||||
}
|
||||
|
||||
_createClass(SimpleList, [{
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
var _this2 = this;
|
||||
|
||||
var classes = this.props.classes;
|
||||
|
||||
return _react2.default.createElement(
|
||||
'div',
|
||||
{ className: classes.root },
|
||||
_react2.default.createElement(
|
||||
_List2.default,
|
||||
{ dense: true },
|
||||
_react2.default.createElement(
|
||||
_List.ListItem,
|
||||
{ dense: true, className: this.state.allTorrentsClass, button: true, onClick: function onClick() {
|
||||
return _this2.setFilter('', _this2.state.allID);
|
||||
} },
|
||||
_react2.default.createElement(
|
||||
_List.ListItemIcon,
|
||||
{ className: classes.icons },
|
||||
_react2.default.createElement(_AllInclusive2.default, null)
|
||||
),
|
||||
_react2.default.createElement(_List.ListItemText, { primary: 'All Torrents' })
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_List.ListItem,
|
||||
{ className: this.state.downloadingClass, button: true, onClick: function onClick() {
|
||||
return _this2.setFilter('Downloading', _this2.state.downloadingID);
|
||||
} },
|
||||
_react2.default.createElement(
|
||||
_List.ListItemIcon,
|
||||
{ className: classes.icons },
|
||||
_react2.default.createElement(_FileDownload2.default, null)
|
||||
),
|
||||
_react2.default.createElement(_List.ListItemText, { primary: 'Downloading Torrents' })
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_List.ListItem,
|
||||
{ className: this.state.seedingClass, button: true, onClick: function onClick() {
|
||||
return _this2.setFilter('Seeding', _this2.state.seedingID);
|
||||
} },
|
||||
_react2.default.createElement(
|
||||
_List.ListItemIcon,
|
||||
{ className: classes.icons },
|
||||
_react2.default.createElement(_FileUpload2.default, null)
|
||||
),
|
||||
_react2.default.createElement(_List.ListItemText, { primary: 'Seeding Torrents' })
|
||||
),
|
||||
_react2.default.createElement(
|
||||
_List.ListItem,
|
||||
{ className: this.state.completedTorrentsClass, button: true, onClick: function onClick() {
|
||||
return _this2.setFilter('Completed', _this2.state.completedID);
|
||||
} },
|
||||
_react2.default.createElement(
|
||||
_List.ListItemIcon,
|
||||
{ className: classes.inactiveIcon },
|
||||
_react2.default.createElement(_SwapVert2.default, null)
|
||||
),
|
||||
_react2.default.createElement(_List.ListItemText, { primary: 'Completed Torrents' })
|
||||
)
|
||||
),
|
||||
_react2.default.createElement(_Divider2.default, null)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return SimpleList;
|
||||
}(_react2.default.Component);
|
||||
|
||||
var _initialiseProps = function _initialiseProps() {
|
||||
var _this3 = this;
|
||||
|
||||
this.setActiveElement = function (listItem) {};
|
||||
|
||||
this.setFilter = function (filterState, id) {
|
||||
var classes = _this3.props.classes;
|
||||
|
||||
filterState = [{ columnName: 'Status', value: filterState }];
|
||||
_this3.props.changeFilter(filterState); //dispatch to redux
|
||||
console.log("Switching filters classes", id);
|
||||
switch (id) {//TODO.. there has to be a better fucking way to do this
|
||||
case "All":
|
||||
_this3.state.allTorrentsClass = classes.active;
|
||||
_this3.state.downloadingClass = '';
|
||||
_this3.state.seedingClass = '';
|
||||
_this3.state.activeTorrentsClass = '';
|
||||
_this3.state.completedTorrentsClass = '';
|
||||
break;
|
||||
case "Downloading":
|
||||
console.log("Downloading...");
|
||||
_this3.state.downloadingClass = classes.active;
|
||||
_this3.state.allTorrentsClass = '';
|
||||
_this3.state.seedingClass = '';
|
||||
_this3.state.activeTorrentsClass = '';
|
||||
_this3.state.completedTorrentsClass = '';
|
||||
break;
|
||||
case "Seeding":
|
||||
_this3.state.seedingClass = classes.active;
|
||||
_this3.state.allTorrentsClass = '';
|
||||
_this3.state.downloadingClass = '';
|
||||
_this3.state.activeTorrentsClass = '';
|
||||
_this3.state.completedTorrentsClass = '';
|
||||
break;
|
||||
case "Active":
|
||||
_this3.state.activeTorrentsClass = classes.active;
|
||||
_this3.state.allTorrentsClass = '';
|
||||
_this3.state.downloadingClass = '';
|
||||
_this3.state.seedingClass = '';
|
||||
_this3.state.completedTorrentsClass = '';
|
||||
break;
|
||||
case "Completed":
|
||||
_this3.state.completedTorrentsClass = classes.active;
|
||||
_this3.state.allTorrentsClass = '';
|
||||
_this3.state.downloadingClass = '';
|
||||
_this3.state.seedingClass = '';
|
||||
_this3.state.activeTorrentsClass = '';
|
||||
break;
|
||||
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
SimpleList.propTypes = {
|
||||
classes: _propTypes2.default.object.isRequired
|
||||
};
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
filter: state.filter
|
||||
};
|
||||
};
|
||||
|
||||
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
||||
return {
|
||||
changeFilter: function changeFilter(filter) {
|
||||
return dispatch({ type: actionTypes.CHANGE_FILTER, filter: filter });
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _styles.withStyles)(styles)((0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(SimpleList));
|
18
goTorrentWebUI/lib/store/actions.js
Normal file
18
goTorrentWebUI/lib/store/actions.js
Normal file
@@ -0,0 +1,18 @@
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
var SORTLIST = exports.SORTLIST = 'SORTLIST';
|
||||
var CHANGE_SELECTION = exports.CHANGE_SELECTION = 'CHANGE_SELECTION';
|
||||
var CHANGE_FILTER = exports.CHANGE_FILTER = 'CHANGE_FILTER';
|
||||
var TORRENT_LIST = exports.TORRENT_LIST = 'TORRENT_LIST';
|
||||
var SET_BUTTON_STATE = exports.SET_BUTTON_STATE = 'BUTTON_STATE';
|
||||
var SELECTION_HASHES = exports.SELECTION_HASHES = 'SELECTION_HASHES';
|
||||
var SELECTED_TAB = exports.SELECTED_TAB = 'SELECTED_TAB';
|
||||
var PEER_LIST = exports.PEER_LIST = 'PEER_LIST';
|
||||
var FILE_LIST = exports.FILE_LIST = 'FILE_LIST';
|
||||
var CHANGE_FILE_SELECTION = exports.CHANGE_FILE_SELECTION = 'CHANGE_FILE_SELECTION';
|
||||
var NEW_RSS_FEED_STORE = exports.NEW_RSS_FEED_STORE = 'NEW_RSS_FEED_STORE';
|
||||
var RSS_MODAL_OPEN_STATE = exports.RSS_MODAL_OPEN_STATE = 'RSS_MODAL_OPEN_STATE';
|
||||
var RSS_TORRENT_LIST = exports.RSS_TORRENT_LIST = 'RSS_TORRENT_LIST';
|
159
goTorrentWebUI/lib/store/reducer.js
Normal file
159
goTorrentWebUI/lib/store/reducer.js
Normal file
@@ -0,0 +1,159 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
|
||||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||||
|
||||
var _actions = require("./actions");
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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; } }
|
||||
|
||||
var initialState = {
|
||||
buttonStateDefault: [{ startButton: "default", stopButton: "default", deleteButton: "default", fSeedButton: "default", fRecheckButton: "default" }],
|
||||
buttonState: [{ startButton: "default", stopButton: "default", deleteButton: "default", fSeedButton: "default", fRecheckButton: "default" }],
|
||||
sorting: [],
|
||||
selection: [],
|
||||
selectionHashes: [],
|
||||
filter: ["Status", ""],
|
||||
columnName: "Status",
|
||||
torrentList: [],
|
||||
peerList: [],
|
||||
fileList: [],
|
||||
torrentDetailInfo: [],
|
||||
selectedTab: 0,
|
||||
RSSList: [],
|
||||
RSSTorrentList: [],
|
||||
RSSModalOpen: false
|
||||
};
|
||||
|
||||
var reducer = function reducer() {
|
||||
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
|
||||
var action = arguments[1];
|
||||
|
||||
switch (action.type) {
|
||||
|
||||
case actionTypes.CHANGE_SELECTION:
|
||||
console.log("Change Selection", action.selection);
|
||||
return _extends({}, state, {
|
||||
peerList: [], //changing selection will purge out all of the old data
|
||||
fileList: [],
|
||||
selectionHashes: [],
|
||||
selection: action.selection
|
||||
});
|
||||
|
||||
case actionTypes.NEW_RSS_FEED_STORE:
|
||||
console.log("New RSS Feed Store", action.RSSList);
|
||||
return _extends({}, state, {
|
||||
RSSList: action.RSSList
|
||||
});
|
||||
|
||||
case actionTypes.RSS_TORRENT_LIST:
|
||||
console.log("New RSS Torrent List IN REDUCER", action.RSSTorrentList);
|
||||
return _extends({}, state, {
|
||||
RSSTorrentList: action.RSSTorrentList
|
||||
});
|
||||
|
||||
case actionTypes.SELECTION_HASHES:
|
||||
console.log("Selection hashes REDUX", action.selectionHashes);
|
||||
return _extends({}, state, {
|
||||
selectionHashes: action.selectionHashes
|
||||
});
|
||||
|
||||
case actionTypes.SORTLIST:
|
||||
//TODO do I even need this in redux?
|
||||
console.log("List Sort", action.sorting);
|
||||
return state;
|
||||
|
||||
case actionTypes.CHANGE_FILTER:
|
||||
return _extends({}, state, {
|
||||
filter: action.filter
|
||||
});
|
||||
|
||||
case actionTypes.TORRENT_LIST:
|
||||
return _extends({}, state, {
|
||||
torrentList: action.torrentList
|
||||
});
|
||||
|
||||
case actionTypes.PEER_LIST:
|
||||
return _extends({}, state, {
|
||||
peerList: action.peerList
|
||||
});
|
||||
|
||||
case actionTypes.FILE_LIST:
|
||||
return _extends({}, state, {
|
||||
fileList: action.fileList
|
||||
});
|
||||
|
||||
case actionTypes.SELECTED_TAB:
|
||||
return _extends({}, state, {
|
||||
selectedTab: action.selectedTab
|
||||
});
|
||||
|
||||
case actionTypes.RSS_MODAL_OPEN_STATE:
|
||||
console.log("Setting RSS Modal State...", action.RSSModalOpen);
|
||||
return _extends({}, state, {
|
||||
RSSModalOpen: action.RSSModalOpen
|
||||
});
|
||||
|
||||
case actionTypes.SET_BUTTON_STATE:
|
||||
if (action.buttonState.length === 0) {
|
||||
//if selection is empty buttons will be default and selectionHashes will be blanked out and pushed to redux
|
||||
var _buttonStateFinal = state.buttonStateDefault; //if no selection dispatch that to redux
|
||||
return _extends({}, state, {
|
||||
buttonState: _buttonStateFinal
|
||||
});
|
||||
} else {
|
||||
// if we have selection continue on with logic to determine button state
|
||||
var selectedRows = []; //array of all the selected Rows
|
||||
action.buttonState.forEach(function (element) {
|
||||
selectedRows.push(state.torrentList[element]); //pushing the selected rows out of torrentlist
|
||||
});
|
||||
|
||||
var buttonStateTest = selectedRows.filter(function (element) {
|
||||
//TODO fix this bad mess... we literally just need to filter for stopped and go from there
|
||||
var result = [];
|
||||
if (element.Status === "Downloading" || element.Status === "Awaiting Peers" || element.Status === "Seeding" || element.Status === "Completed") {
|
||||
result.push(element.Status);
|
||||
return result;
|
||||
}
|
||||
});
|
||||
var buttonStateTest2 = selectedRows.filter(function (element) {
|
||||
return element.Status === "Stopped";
|
||||
});
|
||||
|
||||
if (buttonStateTest.length > 0 && buttonStateTest2.length === 0) {
|
||||
|
||||
var _buttonStateFinal2 = [{ startButton: "default", stopButton: "primary", deleteButton: "accent", fSeedButton: "default", fRecheckButton: "primary" }];
|
||||
return _extends({}, state, {
|
||||
buttonState: _buttonStateFinal2
|
||||
});
|
||||
}
|
||||
if (buttonStateTest.length === 0 && buttonStateTest2.length > 0) {
|
||||
var _buttonStateFinal3 = [{ startButton: "primary", stopButton: "default", deleteButton: "accent", fSeedButton: "default", fRecheckButton: "primary" }];
|
||||
return _extends({}, state, {
|
||||
buttonState: _buttonStateFinal3
|
||||
});
|
||||
}
|
||||
if (buttonStateTest.length > 0 && buttonStateTest2.length > 0) {
|
||||
var _buttonStateFinal4 = [{ startButton: "primary", stopButton: "primary", deleteButton: "accent", fSeedButton: "default", fRecheckButton: "primary" }];
|
||||
return _extends({}, state, {
|
||||
buttonState: _buttonStateFinal4
|
||||
});
|
||||
}
|
||||
}
|
||||
return _extends({}, state, {
|
||||
buttonState: buttonStateFinal
|
||||
});
|
||||
|
||||
default:
|
||||
return state;
|
||||
};
|
||||
|
||||
console.log("no actiontypes found", action);
|
||||
return state;
|
||||
};
|
||||
exports.default = reducer;
|
212
goTorrentWebUI/lib/torrentlist.js
Normal file
212
goTorrentWebUI/lib/torrentlist.js
Normal file
@@ -0,0 +1,212 @@
|
||||
'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 _reactDom = require('react-dom');
|
||||
|
||||
var _reactDom2 = _interopRequireDefault(_reactDom);
|
||||
|
||||
var _reactBootstrapTableAllMin = require('../node_modules/react-bootstrap-table/dist/react-bootstrap-table-all.min.css');
|
||||
|
||||
var _reactBootstrapTableAllMin2 = _interopRequireDefault(_reactBootstrapTableAllMin);
|
||||
|
||||
var _reactBootstrapTable = require('react-bootstrap-table');
|
||||
|
||||
var _Paper = require('material-ui/Paper');
|
||||
|
||||
var _Paper2 = _interopRequireDefault(_Paper);
|
||||
|
||||
var _dxReactGrid = require('@devexpress/dx-react-grid');
|
||||
|
||||
var _dxReactGridMaterialUi = require('@devexpress/dx-react-grid-material-ui');
|
||||
|
||||
var _progressBarCell = require('./CustomCells/progressBarCell');
|
||||
|
||||
var _reactRedux = require('react-redux');
|
||||
|
||||
var _actions = require('./store/actions');
|
||||
|
||||
var actionTypes = _interopRequireWildcard(_actions);
|
||||
|
||||
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 }; }
|
||||
|
||||
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; }
|
||||
//react redux
|
||||
|
||||
|
||||
/* var torrentLinkSubmit = document.getElementById('torrentLinkSubmit');
|
||||
var magnetLink = document.getElementById('magnetLink');
|
||||
var myTextArea = document.getElementById("loggerData");
|
||||
var torrentHash = document.getElementById("hash");
|
||||
initialize an empty torrents field before update.
|
||||
var torrentLinkSubmit = document.getElementById('torrentLinkSubmit');
|
||||
var magnetLink = document.getElementById('magnetLink');
|
||||
var myTextArea = document.getElementById("loggerData");
|
||||
var torrentHash = document.getElementById("hash");
|
||||
var torrentLinkSubmit = document.getElementById('torrentLinkSubmit');
|
||||
var torrentLinkModal = document.getElementById('addTorrentLinkModal');
|
||||
var btnTorrentLink = document.getElementById("addTorrentLink");
|
||||
*/
|
||||
|
||||
function sendEvent(message) {
|
||||
ws.send(message);
|
||||
console.log('Sending message... ', message);
|
||||
}
|
||||
|
||||
var TorrentListTable = function (_React$Component) {
|
||||
_inherits(TorrentListTable, _React$Component);
|
||||
|
||||
function TorrentListTable(props) {
|
||||
_classCallCheck(this, TorrentListTable);
|
||||
|
||||
var _this = _possibleConstructorReturn(this, (TorrentListTable.__proto__ || Object.getPrototypeOf(TorrentListTable)).call(this, props));
|
||||
|
||||
_this.determineSelectionHashes = function (selectedRows) {
|
||||
//console.log("CurrentSelectionHashes", this.props.selectionHashes)
|
||||
var selectionHashes = []; //rebuilding our selection hashes from our currently selected rows
|
||||
selectedRows.forEach(function (element) {
|
||||
selectionHashes.push(element.TorrentHashString); //push the selection hash to the temp array
|
||||
});
|
||||
_this.props.sendSelectionHashes(selectionHashes); //push the result to redux
|
||||
};
|
||||
|
||||
_this.changeSelection = function (selection) {
|
||||
//console.log("TOrrentlist is changing selection now", selection)
|
||||
_this.props.changeSelection(selection); //dispatch selection to redux, also clear out anything tied to the old selection (peerlists, filelists, etc)
|
||||
|
||||
if (selection.length === 0) {
|
||||
//if selection is empty buttons will be default and selectionHashes will be blanked out and pushed to redux
|
||||
_this.props.setButtonState(selection); //if no selection dispatch that to redux
|
||||
} else {
|
||||
// if we have selection continue on with logic to determine button state
|
||||
var selectedRows = []; //array of all the selected Rows
|
||||
selection.forEach(function (element) {
|
||||
selectedRows.push(_this.props.torrentList[element]); //pushing the selected rows out of torrentlist
|
||||
});
|
||||
//console.log("Determining selection hashses")
|
||||
_this.determineSelectionHashes(selectedRows); //pulling the torrent hashes for the selcted rows
|
||||
_this.props.setButtonState(selection);
|
||||
}
|
||||
};
|
||||
|
||||
_this.filterHandler = function (filter) {
|
||||
//TODO, figure out how to do multiple filter
|
||||
//console.log("Changing FIlter", filter)
|
||||
if (filter.value === "Active") {
|
||||
console.log("This filter doesn't fucking work");
|
||||
}
|
||||
};
|
||||
|
||||
_this.state = { //rows are stored in redux they are sent over from the server
|
||||
columns: [{ name: 'TorrentName', title: 'Torrent Name' }, { name: 'DownloadedSize', title: 'Dl Size' }, { name: 'Size', title: 'Size' }, { name: 'PercentDone', title: 'Percent Done' }, { name: 'Status', title: 'Status' }, { name: 'DownloadSpeed', title: 'DL Speed' }, { name: 'UploadSpeed', title: 'UL Speed' }, { name: 'ActivePeers', title: 'Active Peers' }, { name: 'ETA', title: 'ETA' }, { name: 'Ratio', title: 'Ratio' }, { name: 'DateAdded', title: 'Date Added' }, { name: 'Availability', title: 'Availability' }],
|
||||
columnOrder: ['TorrentName', 'DownloadedSize', 'Size', 'PercentDone', 'Status', 'DownloadSpeed', 'UploadSpeed', 'ActivePeers', 'ETA', 'Ratio', 'DateAdded', 'Availability'],
|
||||
columnWidths: { TorrentName: 250, DownloadedSize: 100, Size: 100, PercentDone: 175, Status: 150, DownloadSpeed: 100, UploadSpeed: 100, ActivePeers: 100, ETA: 100, Ratio: 75, DateAdded: 100, Availability: 75 },
|
||||
prevSelection: [], //just used to pull data from cell (temp Prevcell holder), real selection is in Redux
|
||||
pageSizes: [5, 10, 15, 0],
|
||||
currentPage: 0
|
||||
};
|
||||
|
||||
_this.changeColumnOrder = function (columnOrder) {
|
||||
return _this.setState({ columnOrder: columnOrder });
|
||||
};
|
||||
_this.changeColumnWidths = function (columnWidths) {
|
||||
return _this.setState({ columnWidths: columnWidths });
|
||||
};
|
||||
_this.changePageSize = function (pageSize) {
|
||||
return _this.setState({ pageSize: pageSize });
|
||||
};
|
||||
_this.changeCurrentPage = function (currentPage) {
|
||||
return _this.setState({ currentPage: currentPage });
|
||||
};
|
||||
return _this;
|
||||
}
|
||||
|
||||
_createClass(TorrentListTable, [{
|
||||
key: 'componentWillReceiveProps',
|
||||
value: function componentWillReceiveProps(nextProps) {
|
||||
//this is for setting the filter when the left menu activates a new filter
|
||||
if (this.props.filter != nextProps.filter) {
|
||||
this.filterHandler(nextProps.filter);
|
||||
}
|
||||
//console.log("Recieving new props", nextProps.selection)
|
||||
}
|
||||
}, {
|
||||
key: 'render',
|
||||
value: function render() {
|
||||
return _react2.default.createElement(
|
||||
_Paper2.default,
|
||||
null,
|
||||
_react2.default.createElement(
|
||||
_dxReactGridMaterialUi.Grid,
|
||||
{ rows: this.props.torrentList, columns: this.state.columns },
|
||||
_react2.default.createElement(_dxReactGrid.FilteringState, { filters: this.props.filter }),
|
||||
_react2.default.createElement(_dxReactGrid.SortingState, { sorting: this.props.sorting, onSortingChange: this.props.changeSorting }),
|
||||
_react2.default.createElement(_dxReactGrid.SelectionState, { onSelectionChange: this.changeSelection, selection: this.props.selection }),
|
||||
_react2.default.createElement(_dxReactGrid.LocalFiltering, null),
|
||||
_react2.default.createElement(_dxReactGrid.LocalSorting, null),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.VirtualTableView, { height: 530, tableCellTemplate: function tableCellTemplate(_ref) {
|
||||
var row = _ref.row,
|
||||
column = _ref.column,
|
||||
style = _ref.style;
|
||||
|
||||
if (column.name === 'PercentDone') {
|
||||
return _react2.default.createElement(_progressBarCell.ProgressBarCell, { value: row.PercentDone * 100, style: style });
|
||||
}
|
||||
return undefined;
|
||||
} }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.DragDropContext, null),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableColumnResizing, { columnWidths: this.state.columnWidths, onColumnWidthsChange: this.changeColumnWidths }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableColumnReordering, { order: this.state.columnOrder, onOrderChange: this.changeColumnOrder }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableSelection, { selectByRowClick: true, highlightSelected: true }),
|
||||
_react2.default.createElement(_dxReactGridMaterialUi.TableHeaderRow, { allowSorting: true, allowResizing: true, allowDragging: true })
|
||||
)
|
||||
);
|
||||
}
|
||||
}]);
|
||||
|
||||
return TorrentListTable;
|
||||
}(_react2.default.Component);
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state) {
|
||||
return {
|
||||
filter: state.filter,
|
||||
torrentList: state.torrentList,
|
||||
buttonState: state.buttonState,
|
||||
buttonStateDefault: state.buttonStateDefault, //all default
|
||||
selectionHashes: state.selectionHashes,
|
||||
selection: state.selection
|
||||
};
|
||||
};
|
||||
|
||||
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
||||
return {
|
||||
changeSorting: function changeSorting(sorting) {
|
||||
return dispatch({ type: actionTypes.SORTLIST, sorting: sorting });
|
||||
},
|
||||
changeSelection: function changeSelection(selection) {
|
||||
return dispatch({ type: actionTypes.CHANGE_SELECTION, selection: selection });
|
||||
},
|
||||
setButtonState: function setButtonState(buttonState) {
|
||||
return dispatch({ type: actionTypes.SET_BUTTON_STATE, buttonState: buttonState });
|
||||
},
|
||||
sendSelectionHashes: function sendSelectionHashes(selectionHashes) {
|
||||
return dispatch({ type: actionTypes.SELECTION_HASHES, selectionHashes: selectionHashes });
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(TorrentListTable);
|
12
main.go
12
main.go
@@ -6,11 +6,14 @@ import (
|
||||
"fmt"
|
||||
"html/template"
|
||||
"io/ioutil"
|
||||
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
_ "net/http/pprof"
|
||||
|
||||
"github.com/anacrolix/torrent"
|
||||
"github.com/asdine/storm"
|
||||
Engine "github.com/deranjer/goTorrent/engine"
|
||||
@@ -59,6 +62,7 @@ func main() {
|
||||
if Config.LoggingOutput == "file" {
|
||||
os.Remove("logs/server.log") //cleanup the old log on every restart
|
||||
file, err := os.OpenFile("logs/server.log", os.O_CREATE|os.O_WRONLY, 0666) //creating the log file
|
||||
defer file.Close() //TODO.. since we write to this constantly how does close work?
|
||||
if err != nil {
|
||||
fmt.Println("Unable to create file for logging.... please check permissions.. forcing output to stdout")
|
||||
Logger.Out = os.Stdout
|
||||
@@ -95,9 +99,9 @@ func main() {
|
||||
TorrentLocalArray = Storage.FetchAllStoredTorrents(db) //pulling in all the already added torrents
|
||||
|
||||
if TorrentLocalArray != nil { //the first creation of the running torrent array //since we are adding all of them in we use a coroutine... just allows the web ui to load then it will load in the torrents
|
||||
go func() { //TODO instead of running all torrent fetches in coroutine see if possible to run each single one in a routine so we don't wait for ALL of them to be verified
|
||||
RunningTorrentArray = Engine.CreateRunningTorrentArray(tclient, TorrentLocalArray, PreviousTorrentArray, Config, db)
|
||||
}()
|
||||
//go func() { //TODO instead of running all torrent fetches in coroutine see if possible to run each single one in a routine so we don't wait for ALL of them to be verified
|
||||
RunningTorrentArray = Engine.CreateRunningTorrentArray(tclient, TorrentLocalArray, PreviousTorrentArray, Config, db)
|
||||
//}()
|
||||
} else {
|
||||
Logger.Info("Database is empty, no torrents loaded")
|
||||
}
|
||||
@@ -122,7 +126,7 @@ func main() {
|
||||
})
|
||||
http.HandleFunc("/websocket", func(w http.ResponseWriter, r *http.Request) { //websocket is the main data pipe to the frontend
|
||||
conn, err := upgrader.Upgrade(w, r, nil)
|
||||
|
||||
defer conn.Close() //defer closing the websocket until done.
|
||||
if err != nil {
|
||||
Logger.WithFields(logrus.Fields{"error": err}).Fatal("Unable to create websocket!")
|
||||
return
|
||||
|
Reference in New Issue
Block a user