mirror of
				https://github.com/aclindsa/moneygo.git
				synced 2025-10-30 17:33:26 -04:00 
			
		
		
		
	Add AccountTree to select accounts
This commit is contained in:
		| @@ -12,6 +12,8 @@ var Glyphicon = ReactBootstrap.Glyphicon; | ||||
|  | ||||
| var Modal = ReactBootstrap.Modal; | ||||
|  | ||||
| var CollapsibleMixin = ReactBootstrap.CollapsibleMixin; | ||||
|  | ||||
| var Combobox = ReactWidgets.Combobox; | ||||
|  | ||||
| const recursiveAccountDisplayInfo = function(account, prefix) { | ||||
| @@ -26,7 +28,7 @@ const getAccountDisplayList = function(account_list, includeRoot, rootName) { | ||||
| 	if (includeRoot) | ||||
| 		accounts.push({AccountId: -1, Name: rootName}); | ||||
| 	for (var i = 0; i < account_list.length; i++) { | ||||
| 		if (account_list[i].ParentAccountId == -1) | ||||
| 		if (account_list[i].isRootAccount()) | ||||
| 			accounts = accounts.concat(recursiveAccountDisplayInfo(account_list[i], "")); | ||||
| 	} | ||||
| 	return accounts; | ||||
| @@ -167,9 +169,105 @@ const NewAccountModal = React.createClass({ | ||||
| 	} | ||||
| }); | ||||
|  | ||||
| const AccountTreeNode = React.createClass({ | ||||
| 	mixins: [CollapsibleMixin], | ||||
| 	getCollapsibleDOMNode: function() { | ||||
| 		return React.findDOMNode(this.refs.children); | ||||
| 	}, | ||||
| 	getCollapsibleDimensionValue: function() { | ||||
| 		return React.findDOMNode(this.refs.children).scrollHeight; | ||||
| 	}, | ||||
| 	handleToggle: function(e) { | ||||
| 		e.preventDefault(); | ||||
| 		this.setState({expanded:!this.state.expanded}); | ||||
| 	}, | ||||
| 	handleChildSelect: function(account) { | ||||
| 		if (this.props.onSelect != null) | ||||
| 			this.props.onSelect(account); | ||||
| 	}, | ||||
| 	handleSelect: function() { | ||||
| 		if (this.props.onSelect != null) | ||||
| 			this.props.onSelect(this.props.account); | ||||
| 	}, | ||||
| 	render: function() { | ||||
| 		var styles = this.getCollapsibleClassSet(); | ||||
| 		var glyph = this.isExpanded() ? 'minus' : 'plus'; | ||||
| 		var active = (this.props.selectedAccount != null && | ||||
| 			this.props.account.AccountId == this.props.selectedAccount.AccountId); | ||||
| 		var buttonStyle = active ? "info" : "link"; | ||||
|  | ||||
| 		var self = this; | ||||
| 		var children = this.props.account.Children.map(function(account) { | ||||
| 			return ( | ||||
| 				<AccountTreeNode | ||||
| 					account={account} | ||||
| 					selectedAccount={self.props.selectedAccount} | ||||
| 					onSelect={self.handleChildSelect}/> | ||||
| 		   ); | ||||
| 		}); | ||||
| 		var accounttreeClasses = "accounttree" | ||||
| 		var expandButton = []; | ||||
| 		if (children.length > 0) | ||||
| 			expandButton.push(( | ||||
| 				<Button onClick={this.handleToggle} | ||||
| 						bsSize="xsmall" | ||||
| 						bsStyle="link" | ||||
| 						className="accounttree-expandbutton"> | ||||
| 					<Glyphicon glyph={glyph} bsSize="xsmall"/> | ||||
| 				</Button> | ||||
| 			)); | ||||
| 		else | ||||
| 			accounttreeClasses += "-nochildren"; | ||||
| 		return ( | ||||
| 			<div className={accounttreeClasses}> | ||||
| 				{expandButton} | ||||
| 				<Button onClick={this.handleSelect} | ||||
| 						bsStyle={buttonStyle} | ||||
| 						className="accounttree-name"> | ||||
| 					{this.props.account.Name} | ||||
| 				</Button> | ||||
| 				<div ref='children' className={classNames(styles)}> | ||||
| 					{children} | ||||
| 				</div> | ||||
| 			</div> | ||||
| 		); | ||||
| 	} | ||||
| }); | ||||
|  | ||||
| const AccountTree = React.createClass({ | ||||
| 	getInitialState: function() { | ||||
| 		return {selectedAccount: null}; | ||||
| 	}, | ||||
| 	handleSelect: function(account) { | ||||
| 		this.setState({selectedAccount: account}); | ||||
| 		if (this.props.onSelect != null) { | ||||
| 			this.props.onSelect(account); | ||||
| 		} | ||||
| 	}, | ||||
| 	render: function() { | ||||
| 		var accounts = this.props.accounts; | ||||
|  | ||||
| 		var children = []; | ||||
| 		for (var i = 0; i < accounts.length; i++) { | ||||
| 			if (accounts[i].isRootAccount()) | ||||
| 				children.push((<AccountTreeNode | ||||
| 					account={accounts[i]} | ||||
| 					selectedAccount={this.state.selectedAccount} | ||||
| 					onSelect={this.handleSelect}/>)); | ||||
| 		} | ||||
|  | ||||
| 		return ( | ||||
| 			<div className="accounttree-root"> | ||||
| 				{children} | ||||
| 			</div> | ||||
| 		); | ||||
| 	} | ||||
| }); | ||||
|  | ||||
| const AccountsTab = React.createClass({ | ||||
| 	getInitialState: function() { | ||||
| 		return { | ||||
| 			selectedAccount: null, | ||||
| 			creatingNewAccount: false | ||||
| 		}; | ||||
| 	}, | ||||
| @@ -190,16 +288,13 @@ const AccountsTab = React.createClass({ | ||||
| 			this.props.onCreateAccount(account); | ||||
| 		this.setState({creatingNewAccount: false}); | ||||
| 	}, | ||||
| 	handleAccountSelected: function(account) { | ||||
| 		this.setState({selectedAccount: account}); | ||||
| 	}, | ||||
| 	render: function() { | ||||
| 		var accounts = this.props.accounts; | ||||
| 		var account_map = this.props.account_map; | ||||
|  | ||||
| 		var listGroupItems = accounts.map(function(account) { | ||||
| 			return ( | ||||
| 				<ListGroupItem>{account.Name}</ListGroupItem> | ||||
| 		   ); | ||||
| 		}); | ||||
|  | ||||
| 		return ( | ||||
| 			<Grid fluid><Row> | ||||
| 				<Col xs={2}> | ||||
| @@ -210,9 +305,9 @@ const AccountsTab = React.createClass({ | ||||
| 						onCancel={this.handleCreationCancel} | ||||
| 						onSubmit={this.handleCreateAccount} | ||||
| 						securities={this.props.securities}/> | ||||
| 					<ListGroup> | ||||
| 						{listGroupItems} | ||||
| 					</ListGroup> | ||||
| 					<AccountTree | ||||
| 						accounts={accounts} | ||||
| 						onSelect={this.handleAccountSelected}/> | ||||
| 					<ButtonGroup className="pull-right"> | ||||
| 						<Button onClick={this.handleNewAccount} bsStyle="success"> | ||||
| 							<Glyphicon glyph='plus-sign' /></Button> | ||||
|   | ||||
							
								
								
									
										49
									
								
								static/external/classnames/index.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								static/external/classnames/index.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| /*! | ||||
|   Copyright (c) 2015 Jed Watson. | ||||
|   Licensed under the MIT License (MIT), see | ||||
|   http://jedwatson.github.io/classnames | ||||
| */ | ||||
|  | ||||
| (function () { | ||||
| 	'use strict'; | ||||
|  | ||||
| 	function classNames () { | ||||
|  | ||||
| 		var classes = ''; | ||||
|  | ||||
| 		for (var i = 0; i < arguments.length; i++) { | ||||
| 			var arg = arguments[i]; | ||||
| 			if (!arg) continue; | ||||
|  | ||||
| 			var argType = typeof arg; | ||||
|  | ||||
| 			if ('string' === argType || 'number' === argType) { | ||||
| 				classes += ' ' + arg; | ||||
|  | ||||
| 			} else if (Array.isArray(arg)) { | ||||
| 				classes += ' ' + classNames.apply(null, arg); | ||||
|  | ||||
| 			} else if ('object' === argType) { | ||||
| 				for (var key in arg) { | ||||
| 					if (arg.hasOwnProperty(key) && arg[key]) { | ||||
| 						classes += ' ' + key; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return classes.substr(1); | ||||
| 	} | ||||
|  | ||||
| 	if (typeof module !== 'undefined' && module.exports) { | ||||
| 		module.exports = classNames; | ||||
| 	} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd){ | ||||
| 		// AMD. Register as an anonymous module. | ||||
| 		define(function () { | ||||
| 			return classNames; | ||||
| 		}); | ||||
| 	} else { | ||||
| 		window.classNames = classNames; | ||||
| 	} | ||||
|  | ||||
| }()); | ||||
| @@ -15,6 +15,7 @@ | ||||
| <script src="static/external/react-bootstrap/react-bootstrap.min.js"></script> | ||||
| <script src="static/external/react-widgets/react-widgets.js"></script> | ||||
| <script src="static/external/big/big.min.js"></script> | ||||
| <script src="static/external/classnames/index.js"></script> | ||||
|  | ||||
| <script type="text/javascript" src="static/utils.js"></script> | ||||
| <script type="text/javascript" src="static/models.js"></script> | ||||
|   | ||||
| @@ -7,3 +7,26 @@ div#content { | ||||
|     margin-left: auto; | ||||
|     margin-right: auto; | ||||
| } | ||||
|  | ||||
| div.accounttree-root-nochildren { | ||||
| 	position: relative; | ||||
| 	left: 24px; | ||||
| } | ||||
| div.accounttree { | ||||
| 	position: relative; | ||||
| 	left: -24px; | ||||
| } | ||||
| div.accounttree-nochildren { | ||||
| 	position: relative; | ||||
| 	left: 0px; | ||||
| } | ||||
|  | ||||
| div.accounttree div { | ||||
| 	padding-left: 24px; | ||||
| } | ||||
| div.accounttree-root div { | ||||
| 	padding-left: 24px; | ||||
| } | ||||
| .accounttree-name { | ||||
| 	padding: 3px; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user