mirror of
				https://github.com/aclindsa/moneygo.git
				synced 2025-11-03 18:13:27 -05:00 
			
		
		
		
	Add ability to delete accounts to UI
This commit is contained in:
		
							
								
								
									
										19
									
								
								accounts.go
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								accounts.go
									
									
									
									
									
								
							@@ -131,11 +131,20 @@ func DeleteAccount(a *Account) error {
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Re-parent splits to this account's parent account
 | 
						if a.ParentAccountId != -1 {
 | 
				
			||||||
	_, err = transaction.Exec("UPDATE splits SET AccountId=? WHERE AccountId=?", a.ParentAccountId, a.AccountId)
 | 
							// Re-parent splits to this account's parent account if this account isn't a root account
 | 
				
			||||||
	if err != nil {
 | 
							_, err = transaction.Exec("UPDATE splits SET AccountId=? WHERE AccountId=?", a.ParentAccountId, a.AccountId)
 | 
				
			||||||
		transaction.Rollback()
 | 
							if err != nil {
 | 
				
			||||||
		return err
 | 
								transaction.Rollback()
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							// Delete splits if this account is a root account
 | 
				
			||||||
 | 
							_, err = transaction.Exec("DELETE FROM splits WHERE AccountId=?", a.AccountId)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								transaction.Rollback()
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Re-parent child accounts to this account's parent account
 | 
						// Re-parent child accounts to this account's parent account
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,6 +35,12 @@ const getAccountDisplayList = function(account_list, includeRoot, rootName) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const AccountCombobox = React.createClass({
 | 
					const AccountCombobox = React.createClass({
 | 
				
			||||||
 | 
						getDefaultProps: function() {
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								includeRoot: true,
 | 
				
			||||||
 | 
								rootName: "New Root Account"
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	handleAccountChange: function(account) {
 | 
						handleAccountChange: function(account) {
 | 
				
			||||||
		if (this.props.onSelect != null &&
 | 
							if (this.props.onSelect != null &&
 | 
				
			||||||
				account.hasOwnProperty('AccountId') &&
 | 
									account.hasOwnProperty('AccountId') &&
 | 
				
			||||||
@@ -43,7 +49,7 @@ const AccountCombobox = React.createClass({
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	render: function() {
 | 
						render: function() {
 | 
				
			||||||
		var accounts = getAccountDisplayList(this.props.accounts, true, "New Root Account");
 | 
							var accounts = getAccountDisplayList(this.props.accounts, this.props.includeRoot, this.props.rootName);
 | 
				
			||||||
		return (
 | 
							return (
 | 
				
			||||||
			<Combobox
 | 
								<Combobox
 | 
				
			||||||
				data={accounts}
 | 
									data={accounts}
 | 
				
			||||||
@@ -58,10 +64,18 @@ const AccountCombobox = React.createClass({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const NewAccountModal = React.createClass({
 | 
					const NewAccountModal = React.createClass({
 | 
				
			||||||
	getInitialState: function() {
 | 
						getInitialState: function() {
 | 
				
			||||||
 | 
							var security = 1;
 | 
				
			||||||
 | 
							var parentaccountid = -1;
 | 
				
			||||||
 | 
							var type = 1;
 | 
				
			||||||
 | 
							if (this.props.initialParentAccount != null) {
 | 
				
			||||||
 | 
								security = this.props.initialParentAccount.SecurityId;
 | 
				
			||||||
 | 
								parentaccountid = this.props.initialParentAccount.AccountId;
 | 
				
			||||||
 | 
								type = this.props.initialParentAccount.Type;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			security: 1,
 | 
								security: security,
 | 
				
			||||||
			parentaccountid: -1,
 | 
								parentaccountid: parentaccountid,
 | 
				
			||||||
			type: 1,
 | 
								type: type,
 | 
				
			||||||
			name: ""
 | 
								name: ""
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
@@ -105,6 +119,11 @@ const NewAccountModal = React.createClass({
 | 
				
			|||||||
		if (this.props.onSubmit != null)
 | 
							if (this.props.onSubmit != null)
 | 
				
			||||||
			this.props.onSubmit(account);
 | 
								this.props.onSubmit(account);
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						componentWillReceiveProps: function(nextProps) {
 | 
				
			||||||
 | 
							if (nextProps.show && !this.props.show) {
 | 
				
			||||||
 | 
								this.setState(this.getInitialState());
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	render: function() {
 | 
						render: function() {
 | 
				
			||||||
		return (
 | 
							return (
 | 
				
			||||||
			<Modal show={this.props.show} onHide={this.handleCancel}>
 | 
								<Modal show={this.props.show} onHide={this.handleCancel}>
 | 
				
			||||||
@@ -115,46 +134,46 @@ const NewAccountModal = React.createClass({
 | 
				
			|||||||
				<form onSubmit={this.handleSubmit}
 | 
									<form onSubmit={this.handleSubmit}
 | 
				
			||||||
						className="form-horizontal">
 | 
											className="form-horizontal">
 | 
				
			||||||
					<Input type="text"
 | 
										<Input type="text"
 | 
				
			||||||
							label="Name"
 | 
											label="Name"
 | 
				
			||||||
							value={this.state.name}
 | 
											value={this.state.name}
 | 
				
			||||||
							onChange={this.handleChange}
 | 
											onChange={this.handleChange}
 | 
				
			||||||
							ref="name"
 | 
											ref="name"
 | 
				
			||||||
							labelClassName="col-xs-2"
 | 
											labelClassName="col-xs-2"
 | 
				
			||||||
							wrapperClassName="col-xs-10"/>
 | 
											wrapperClassName="col-xs-10"/>
 | 
				
			||||||
					<Input wrapperClassName="wrapper"
 | 
										<Input wrapperClassName="wrapper"
 | 
				
			||||||
							label="Parent Account"
 | 
											label="Parent Account"
 | 
				
			||||||
							labelClassName="col-xs-2"
 | 
											labelClassName="col-xs-2"
 | 
				
			||||||
							wrapperClassName="col-xs-10">
 | 
											wrapperClassName="col-xs-10">
 | 
				
			||||||
					<AccountCombobox
 | 
										<AccountCombobox
 | 
				
			||||||
							accounts={this.props.accounts}
 | 
											accounts={this.props.accounts}
 | 
				
			||||||
							account_map={this.props.account_map}
 | 
											account_map={this.props.account_map}
 | 
				
			||||||
							value={this.state.parentaccountid}
 | 
											value={this.state.parentaccountid}
 | 
				
			||||||
							onSelect={this.handleParentChange}
 | 
											onSelect={this.handleParentChange}
 | 
				
			||||||
							ref="parent" />
 | 
											ref="parent" />
 | 
				
			||||||
					</Input>
 | 
										</Input>
 | 
				
			||||||
					<Input wrapperClassName="wrapper"
 | 
										<Input wrapperClassName="wrapper"
 | 
				
			||||||
							label="Security"
 | 
											label="Security"
 | 
				
			||||||
							labelClassName="col-xs-2"
 | 
											labelClassName="col-xs-2"
 | 
				
			||||||
							wrapperClassName="col-xs-10">
 | 
											wrapperClassName="col-xs-10">
 | 
				
			||||||
					<Combobox
 | 
										<Combobox
 | 
				
			||||||
							data={this.props.securities}
 | 
											data={this.props.securities}
 | 
				
			||||||
							valueField='SecurityId'
 | 
											valueField='SecurityId'
 | 
				
			||||||
							textField='Name'
 | 
											textField='Name'
 | 
				
			||||||
							value={this.state.security}
 | 
											value={this.state.security}
 | 
				
			||||||
							onSelect={this.handleSecurityChange}
 | 
											onSelect={this.handleSecurityChange}
 | 
				
			||||||
							ref="security" />
 | 
											ref="security" />
 | 
				
			||||||
					</Input>
 | 
										</Input>
 | 
				
			||||||
					<Input wrapperClassName="wrapper"
 | 
										<Input wrapperClassName="wrapper"
 | 
				
			||||||
							label="Account Type"
 | 
											label="Account Type"
 | 
				
			||||||
							labelClassName="col-xs-2"
 | 
											labelClassName="col-xs-2"
 | 
				
			||||||
							wrapperClassName="col-xs-10">
 | 
											wrapperClassName="col-xs-10">
 | 
				
			||||||
					<Combobox
 | 
										<Combobox
 | 
				
			||||||
							data={AccountTypeList}
 | 
											data={AccountTypeList}
 | 
				
			||||||
							valueField='TypeId'
 | 
											valueField='TypeId'
 | 
				
			||||||
							textField='Name'
 | 
											textField='Name'
 | 
				
			||||||
							value={this.state.type}
 | 
											value={this.state.type}
 | 
				
			||||||
							onSelect={this.handleTypeChange}
 | 
											onSelect={this.handleTypeChange}
 | 
				
			||||||
							ref="type" />
 | 
											ref="type" />
 | 
				
			||||||
					</Input>
 | 
										</Input>
 | 
				
			||||||
				</form>
 | 
									</form>
 | 
				
			||||||
				</Modal.Body>
 | 
									</Modal.Body>
 | 
				
			||||||
@@ -169,6 +188,106 @@ const NewAccountModal = React.createClass({
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DeleteAccountModal = React.createClass({
 | 
				
			||||||
 | 
						getInitialState: function() {
 | 
				
			||||||
 | 
							if (this.props.initialAccount != null)
 | 
				
			||||||
 | 
								var accountid = this.props.initialAccount.AccountId;
 | 
				
			||||||
 | 
							else if (this.props.accounts.length > 0)
 | 
				
			||||||
 | 
								var accountid = this.props.accounts[0].AccountId;
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								var accountid = -1;
 | 
				
			||||||
 | 
							return {error: "",
 | 
				
			||||||
 | 
								accountid: accountid,
 | 
				
			||||||
 | 
								checked: false,
 | 
				
			||||||
 | 
								show: false};
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						handleCancel: function() {
 | 
				
			||||||
 | 
							if (this.props.onCancel != null)
 | 
				
			||||||
 | 
								this.props.onCancel();
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						handleChange: function(account) {
 | 
				
			||||||
 | 
							this.setState({accountid: account.AccountId});
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						handleCheckboxClick: function() {
 | 
				
			||||||
 | 
							this.setState({checked: !this.state.checked});
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						handleSubmit: function() {
 | 
				
			||||||
 | 
							if (this.props.account_map.hasOwnProperty(this.state.accountid)) {
 | 
				
			||||||
 | 
								if (this.state.checked) {
 | 
				
			||||||
 | 
									if (this.props.onSubmit != null)
 | 
				
			||||||
 | 
										this.props.onSubmit(this.props.account_map[this.state.accountid]);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									this.setState({error: "You must confirm you wish to delete this account."});
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								this.setState({error: "You must select an account."});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						componentWillReceiveProps: function(nextProps) {
 | 
				
			||||||
 | 
							if (nextProps.show && !this.props.show) {
 | 
				
			||||||
 | 
								this.setState(this.getInitialState());
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						render: function() {
 | 
				
			||||||
 | 
							var checkbox = [];
 | 
				
			||||||
 | 
							if (this.props.account_map.hasOwnProperty(this.state.accountid)) {
 | 
				
			||||||
 | 
								var parentAccountId = this.props.account_map[this.state.accountid].ParentAccountId;
 | 
				
			||||||
 | 
								var parentAccount = "will be deleted and any child accounts will become top-level accounts.";
 | 
				
			||||||
 | 
								if (parentAccountId != -1)
 | 
				
			||||||
 | 
									parentAccount = "and any child accounts will be re-parented to: " + this.props.account_map[parentAccountId].Name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								var warningString = "I understand that deleting this account cannot be undone and that all transactions " + parentAccount;
 | 
				
			||||||
 | 
								checkbox = (<Input
 | 
				
			||||||
 | 
									type='checkbox'
 | 
				
			||||||
 | 
									checked={this.state.checked ? "checked" : ""}
 | 
				
			||||||
 | 
									onClick={this.handleCheckboxClick}
 | 
				
			||||||
 | 
									label={warningString}
 | 
				
			||||||
 | 
									wrapperClassName="col-xs-offset-2 col-xs-10"/>);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var warning = [];
 | 
				
			||||||
 | 
							if (this.state.error.length != "") {
 | 
				
			||||||
 | 
								warning = (
 | 
				
			||||||
 | 
									<Alert bsStyle="danger"><strong>Error: </strong>{this.state.error}</Alert>
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return (
 | 
				
			||||||
 | 
								<Modal
 | 
				
			||||||
 | 
										show={this.props.show}
 | 
				
			||||||
 | 
										onHide={this.handleCancel}
 | 
				
			||||||
 | 
										ref="modal">
 | 
				
			||||||
 | 
									<Modal.Header closeButton>
 | 
				
			||||||
 | 
										<Modal.Title>Delete Account</Modal.Title>
 | 
				
			||||||
 | 
									</Modal.Header>
 | 
				
			||||||
 | 
									<Modal.Body>
 | 
				
			||||||
 | 
									{warning}
 | 
				
			||||||
 | 
									<form onSubmit={this.handleSubmit}
 | 
				
			||||||
 | 
											className="form-horizontal">
 | 
				
			||||||
 | 
										<Input wrapperClassName="wrapper"
 | 
				
			||||||
 | 
											label="Delete Account"
 | 
				
			||||||
 | 
											labelClassName="col-xs-2"
 | 
				
			||||||
 | 
											wrapperClassName="col-xs-10">
 | 
				
			||||||
 | 
										<AccountCombobox
 | 
				
			||||||
 | 
											includeRoot={false}
 | 
				
			||||||
 | 
											accounts={this.props.accounts}
 | 
				
			||||||
 | 
											account_map={this.props.account_map}
 | 
				
			||||||
 | 
											value={this.state.accountid}
 | 
				
			||||||
 | 
											onSelect={this.handleChange}/>
 | 
				
			||||||
 | 
										</Input>
 | 
				
			||||||
 | 
										{checkbox}
 | 
				
			||||||
 | 
									</form>
 | 
				
			||||||
 | 
									</Modal.Body>
 | 
				
			||||||
 | 
									<Modal.Footer>
 | 
				
			||||||
 | 
										<ButtonGroup className="pull-right">
 | 
				
			||||||
 | 
											<Button onClick={this.handleCancel} bsStyle="warning">Cancel</Button>
 | 
				
			||||||
 | 
											<Button onClick={this.handleSubmit} bsStyle="success">Delete Account</Button>
 | 
				
			||||||
 | 
										</ButtonGroup>
 | 
				
			||||||
 | 
									</Modal.Footer>
 | 
				
			||||||
 | 
								</Modal>
 | 
				
			||||||
 | 
							);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const AccountTreeNode = React.createClass({
 | 
					const AccountTreeNode = React.createClass({
 | 
				
			||||||
	mixins: [CollapsibleMixin],
 | 
						mixins: [CollapsibleMixin],
 | 
				
			||||||
	getCollapsibleDOMNode: function() {
 | 
						getCollapsibleDOMNode: function() {
 | 
				
			||||||
@@ -268,7 +387,8 @@ const AccountsTab = React.createClass({
 | 
				
			|||||||
	getInitialState: function() {
 | 
						getInitialState: function() {
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			selectedAccount: null,
 | 
								selectedAccount: null,
 | 
				
			||||||
			creatingNewAccount: false
 | 
								creatingNewAccount: false,
 | 
				
			||||||
 | 
								deletingAccount: false
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	handleNewAccount: function() {
 | 
						handleNewAccount: function() {
 | 
				
			||||||
@@ -278,16 +398,24 @@ const AccountsTab = React.createClass({
 | 
				
			|||||||
		console.log("handleEditAccount");
 | 
							console.log("handleEditAccount");
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	handleDeleteAccount: function() {
 | 
						handleDeleteAccount: function() {
 | 
				
			||||||
		console.log("handleDeleteAccount");
 | 
							this.setState({deletingAccount: true});
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	handleCreationCancel: function() {
 | 
						handleCreationCancel: function() {
 | 
				
			||||||
		this.setState({creatingNewAccount: false});
 | 
							this.setState({creatingNewAccount: false});
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						handleDeletionCancel: function() {
 | 
				
			||||||
 | 
							this.setState({deletingAccount: false});
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	handleCreateAccount: function(account) {
 | 
						handleCreateAccount: function(account) {
 | 
				
			||||||
		if (this.props.onCreateAccount != null)
 | 
							if (this.props.onCreateAccount != null)
 | 
				
			||||||
			this.props.onCreateAccount(account);
 | 
								this.props.onCreateAccount(account);
 | 
				
			||||||
		this.setState({creatingNewAccount: false});
 | 
							this.setState({creatingNewAccount: false});
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						handleRemoveAccount: function(account) {
 | 
				
			||||||
 | 
							if (this.props.onDeleteAccount != null)
 | 
				
			||||||
 | 
								this.props.onDeleteAccount(account);
 | 
				
			||||||
 | 
							this.setState({deletingAccount: false});
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	handleAccountSelected: function(account) {
 | 
						handleAccountSelected: function(account) {
 | 
				
			||||||
		this.setState({selectedAccount: account});
 | 
							this.setState({selectedAccount: account});
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
@@ -300,11 +428,19 @@ const AccountsTab = React.createClass({
 | 
				
			|||||||
				<Col xs={2}>
 | 
									<Col xs={2}>
 | 
				
			||||||
					<NewAccountModal
 | 
										<NewAccountModal
 | 
				
			||||||
						show={this.state.creatingNewAccount}
 | 
											show={this.state.creatingNewAccount}
 | 
				
			||||||
 | 
											initialParentAccount={this.state.selectedAccount}
 | 
				
			||||||
						accounts={this.props.accounts}
 | 
											accounts={this.props.accounts}
 | 
				
			||||||
						account_map={this.props.account_map}
 | 
											account_map={this.props.account_map}
 | 
				
			||||||
						onCancel={this.handleCreationCancel}
 | 
											onCancel={this.handleCreationCancel}
 | 
				
			||||||
						onSubmit={this.handleCreateAccount}
 | 
											onSubmit={this.handleCreateAccount}
 | 
				
			||||||
						securities={this.props.securities}/>
 | 
											securities={this.props.securities}/>
 | 
				
			||||||
 | 
										<DeleteAccountModal
 | 
				
			||||||
 | 
											show={this.state.deletingAccount}
 | 
				
			||||||
 | 
											initialAccount={this.state.selectedAccount}
 | 
				
			||||||
 | 
											accounts={this.props.accounts}
 | 
				
			||||||
 | 
											account_map={this.props.account_map}
 | 
				
			||||||
 | 
											onCancel={this.handleDeletionCancel}
 | 
				
			||||||
 | 
											onSubmit={this.handleRemoveAccount}/>
 | 
				
			||||||
					<AccountTree
 | 
										<AccountTree
 | 
				
			||||||
						accounts={accounts}
 | 
											accounts={accounts}
 | 
				
			||||||
						onSelect={this.handleAccountSelected}/>
 | 
											onSelect={this.handleAccountSelected}/>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user