diff --git a/renderer/addressBook.js b/renderer/addressBook.js
new file mode 100644
index 0000000..52b057a
--- /dev/null
+++ b/renderer/addressBook.js
@@ -0,0 +1,159 @@
+const {ipcRenderer} = require('electron');
+
+class AddressBook {
+ constructor() {
+ }
+
+ setAddressName(address, name) {
+ console.log(address);
+ console.log(name);
+ var addressBook = ipcRenderer.sendSync('getJSONFile', 'addresses.json');
+
+ if (!addressBook) {
+ addressBook = { names: {} };
+ }
+
+ // set the wallet name from the dialog box
+ addressBook.names[address] = name;
+ ipcRenderer.sendSync('setJSONFile',
+ {
+ file: 'addresses.json',
+ data: addressBook
+ });
+ }
+
+ getAddressName(address) {
+ var addressBook = ipcRenderer.sendSync('getJSONFile', 'addresses.json');
+
+ if (!addressBook) {
+ addressBook = { names: {} };
+ }
+
+ // set the wallet name from the dialog box
+ return addressBook.names[address] || "";
+ }
+
+ getAddressList() {
+ var addressBook = ipcRenderer.sendSync('getJSONFile', 'addresses.json');
+
+ if (!addressBook) {
+ addressBook = { names: {} };
+ }
+
+ return addressBook.names;
+ }
+
+ deleteAddress(address) {
+ var addressBook = ipcRenderer.sendSync('getJSONFile', 'addresses.json');
+
+ if (!addressBook) {
+ addressBook = { names: {} };
+ } else {
+ delete addressBook.names[address];
+ }
+
+ ipcRenderer.sendSync('setJSONFile',
+ {
+ file: 'addresses.json',
+ data: addressBook
+ });
+ }
+
+ enableButtonTooltips() {
+ }
+
+ renderAddressBook() {
+ var addressObject = EthoAddressBook.getAddressList();
+ var renderData = { addressData: [] };
+
+ for (var key in addressObject) {
+ if (addressObject.hasOwnProperty(key)) {
+ var addressEntry = {};
+ addressEntry.name = addressObject[key];
+ addressEntry.address = key;
+ renderData.addressData.push(addressEntry);
+ }
+ }
+
+ // render the wallets current state
+ EthoMainGUI.renderTemplate("addressBook.html", renderData);
+ $(document).trigger("render_addressBook");
+ EthoAddressBook.enableButtonTooltips();
+ }
+}
+
+// the event to tell us that the wallets are rendered
+$(document).on("render_addressBook", function() {
+ $("#btnNewAddress").off('click').on('click', function() {
+ $("#dlgCreateAddressAndName").iziModal();
+ $("#addressName").val("");
+ $("#addressHash").val("");
+ $('#dlgCreateAddressAndName').iziModal('open');
+
+ function doCreateNewWallet() {
+ $('#dlgCreateAddressAndName').iziModal('close');
+
+ EthoAddressBook.setAddressName($("#addressHash").val(), $("#addressName").val());
+ EthoAddressBook.renderAddressBook();
+
+ iziToast.success({
+ title: 'Created',
+ message: 'New address was successfully created',
+ position: 'topRight',
+ timeout: 5000
+ });
+ }
+
+ $("#btnCreateAddressConfirm").off('click').on('click', function() {
+ doCreateNewWallet();
+ });
+
+ $("#dlgCreateAddressAndName").off('keypress').on('keypress', function(e) {
+ if(e.which == 13) {
+ doCreateNewWallet();
+ }
+ });
+ });
+
+ $(".btnChangAddressName").off('click').on('click', function() {
+ var walletAddress = $(this).attr('data-address');
+ var walletName = $(this).attr('data-name');
+
+ $("#dlgChangeAddressName").iziModal();
+ $("#inputAddressName").val(walletName);
+ $('#dlgChangeAddressName').iziModal('open');
+
+ function doChangeAddressName() {
+ EthoAddressBook.setAddressName(walletAddress, $("#inputAddressName").val());
+ $('#dlgChangeAddressName').iziModal('close');
+ EthoAddressBook.renderAddressBook();
+ }
+
+ $("#btnChangeAddressNameConfirm").off('click').on('click', function() {
+ doChangeAddressName();
+ });
+
+ $("#dlgChangeAddressName").off('keypress').on('keypress', function(e) {
+ if(e.which == 13) {
+ doChangeAddressName();
+ }
+ });
+ });
+
+ $(".btnDeleteAddress").off('click').on('click', function() {
+ $("#dlgDeleteAddressConfirm").iziModal();
+ $('#dlgDeleteAddressConfirm').iziModal('open');
+
+ $("#btnDeleteAddressCancel").off('click').on('click', function() {
+ $('#dlgDeleteAddressConfirm').iziModal('close');
+ });
+
+ $("#btnDeleteAddressConfirm").off('click').on('click', function() {
+ EthoAddressBook.deleteAddress($(this).attr('data-address'));
+ $('#dlgDeleteAddressConfirm').iziModal('close');
+ EthoAddressBook.renderAddressBook();
+ });
+ });
+});
+
+EthoAddressBook = new AddressBook();
\ No newline at end of file
diff --git a/renderer/maingui.js b/renderer/maingui.js
index d33ee19..1ce0efa 100644
--- a/renderer/maingui.js
+++ b/renderer/maingui.js
@@ -14,7 +14,10 @@ class MainGUI {
case "account":
$("#mainNavBtnWalletsWrapper").addClass("iconSelected");
break;
- case "send":
+ case "addressBook":
+ $("#mainNavBtnAddressBoookWrapper").addClass("iconSelected");
+ break;
+ case "send":
$("#mainNavBtnSendWrapper").addClass("iconSelected");
break;
case "transactions":
@@ -69,6 +72,11 @@ $("#mainNavBtnTransactions").click(function() {
EthoTransactions.renderTransactions();
});
+$("#mainNavBtnAddressBoook").click(function() {
+ EthoMainGUI.changeAppState("addressBook");
+ EthoAddressBook.renderAddressBook();
+});
+
$("#mainNavBtnSend").click(function() {
EthoMainGUI.changeAppState("send");
EthoSend.renderSendState();
diff --git a/renderer/send.js b/renderer/send.js
index 77e6e73..5b700c0 100644
--- a/renderer/send.js
+++ b/renderer/send.js
@@ -79,7 +79,7 @@ $(document).on("render_send", function() {
},
function(data) {
$("#dlgAddressList").iziModal({ width: "800px" });
- EthoMainGUI.renderTemplate("addresslist.html", data, $("#dlgAddressListBody"));
+ EthoMainGUI.renderTemplate("addressList.html", data, $("#dlgAddressListBody"));
$('#dlgAddressList').iziModal('open');
$(".btnSelectToAddress").off('click').on('click', function() {
diff --git a/renderer/tableTransactions.js b/renderer/tableTransactions.js
index eace89f..6b1862e 100644
--- a/renderer/tableTransactions.js
+++ b/renderer/tableTransactions.js
@@ -7,12 +7,13 @@ class tableTransactions {
// register the sort datetime format
$.fn.dataTable.moment('MMM Do YYYY HH:mm:ss');
- var namesType = $.fn.dataTable.absoluteOrder(
+ var namesType = $.fn.dataTable.absoluteOrderNumber(
[
{ value: null, position: 'top' }
]);
// render the transactions
$(id).DataTable({
+ "dom": 'Bfrtip',
"paging": false,
"scrollY": "calc(100vh - 115px)",
"responsive": true,
@@ -20,6 +21,15 @@ class tableTransactions {
"order": [[ 1, "desc" ]],
"data": data,
"oSearch": {"sSearch": EthoTransactions.getFilter() },
+ "buttons":
+ [
+ {
+ text: 'Refresh',
+ action: function ( e, dt, node, config ) {
+ EthoTransactions.renderTransactions();
+ }
+ }
+ ],
"columnDefs": [
{
"targets": 0,
diff --git a/renderer/transactions.js b/renderer/transactions.js
index 760d848..1e10884 100644
--- a/renderer/transactions.js
+++ b/renderer/transactions.js
@@ -119,22 +119,33 @@ $(document).on("onSyncInterval", function() {
counters = {};
}
+ function finalizeCounters(lastBlock) {
+ counters.transactions = lastBlock;
+
+ ipcRenderer.sendSync('setJSONFile',
+ {
+ file: 'counters.json',
+ data: counters
+ });
+ }
+
function doSyncRemainingBlocks() {
EthoBlockchain.getBlock("latest", false,
function(error) {
EthoMainGUI.showGeneralError(error);
},
function(block) {
- var lastBlock = counters.transactions || 0;
+ var lastBlock = counters.transactions || 1;
if (lastBlock < block.number) {
function getNextBlockTransactions(blockNumber, maxBlock) {
- EthoBlockchain.getBlock(blockNumber, true,
- function(error) {
- EthoMainGUI.showGeneralError(error);
- },
- function(data) {
- if (blockNumber < maxBlock) {
+ if (blockNumber < maxBlock) {
+ EthoBlockchain.getBlock(blockNumber, true,
+ function(error) {
+ EthoMainGUI.showGeneralError(error);
+ getNextBlockTransactions(blockNumber + 1 , maxBlock);
+ },
+ function(data) {
if (data.transactions) {
data.transactions.forEach(element => {
if ((EthoWallets.getAddressExists(element.from)) || (EthoWallets.getAddressExists(element.to))) {
@@ -151,34 +162,33 @@ $(document).on("onSyncInterval", function() {
ipcRenderer.send('storeTransaction', Transaction);
$(document).trigger("onNewAccountTransaction");
- if (EthoMainGUI.getAppState() == "transactions") {
- //$('#tableTransactionsForAll').DataTable().ajax.reload();
- }
+ iziToast.info({
+ title: 'New Transaction',
+ message: vsprintf('Transaction from address %s to address %s was just processed', [Transaction.fromaddr, Transaction.toaddr]),
+ position: 'topRight',
+ timeout: 10000
+ });
}
- });
+ });
}
// call the next iteration for the next block
- getNextBlockTransactions(blockNumber + 1 , maxBlock)
- } else {
- setTimeout(function() {
- doSyncRemainingBlocks();
- }, 10000);
+ getNextBlockTransactions(blockNumber + 1 , maxBlock);
}
-
- }
- );
+ );
+ } else {
+ finalizeCounters(blockNumber);
+
+ setTimeout(function() {
+ doSyncRemainingBlocks();
+ }, 10000);
+ }
}
// call initial call of function
getNextBlockTransactions(lastBlock, block.number);
} else {
- counters.transactions = block.number;
- ipcRenderer.sendSync('setJSONFile',
- {
- file: 'counters.json',
- data: counters
- });
+ finalizeCounters(lastBlock);
setTimeout(function() {
doSyncRemainingBlocks();