import { Component, OnInit, ViewEncapsulation, AfterViewInit, ChangeDetectorRef } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import Web3 from 'web3'; import { ScriptLoaderService } from '../../../../../_services/script-loader.service'; import { ToastrService } from 'ngx-toastr'; import { DetailsService } from '../../details.service'; import { GlobalsComponent } from '../../globals/globals.component'; declare var $: any; @Component({ selector: '.m-grid__item.m-grid__item--fluid.m-wrapper', templateUrl: './member-roles.component.html', styleUrls: ['./member-roles.component.css'], encapsulation: ViewEncapsulation.None }) export class MemberRolesComponent implements OnInit, AfterViewInit { // router:any; loadingAddMember = false; loadingAddRole = false; loadingRemove = false; public userObj; public authMember; public web3; public roles = []; public members = []; public memberRoles = []; public memberAddresses = []; public noOfRoles; public valueRoleName; public showRoles: false; public selectedMember; public selectedRole; public selectedRoleName; public SummerNoteText; public showRemovePopup: boolean = false; public roleName; public newRole; public categoryId = 1; public memberAddress; public length; // public name; public optionsDescHash; public shortDescription; public proposalId; public stakeAmount; public result; public incompleteDetails: boolean; public AllRoleShow = false; public masterAddress; public message; public roleDescription; public paramDetails = []; public inputParamValue = []; public metamaskLogin = true; public userAddress; public iframeURl = ''; constructor( private _script: ScriptLoaderService, private toastr: ToastrService, private detailService: DetailsService, private router: Router, private route: ActivatedRoute, private globals: GlobalsComponent ) { if (window.location.href.indexOf('iframe') >= 0) { this.iframeURl = '/iframe'; } } openSlide(event) { var data_target = event.target.getAttribute('data-target'); $('.sidebar-overlay').each(function() { $(this).removeClass('open'); if ($(this).attr('id') == data_target) { $(this).addClass('open'); } }); } closeSlide(event) { // var data_dismiss = event.target.getAttribute('data-dismiss'); $('.sidebar-overlay').each(function() { $(this).removeClass('open'); }); } ngOnInit() { this.detailService.setTitle('Member Roles'); let user = localStorage.getItem('currentUser'); this.userObj = JSON.parse(user); this.authMember = this.userObj.authorized; this.web3 = new Web3(window['web3'].currentProvider); this.web3.eth.defaultAccount = this.web3.eth.coinbase; if (this.web3.eth.accounts[0] == undefined) { this.userAddress = '0x0000000000000000000000000000000000000000'; this.metamaskLogin = false; } else { this.userAddress = this.web3.eth.accounts[0]; } this.indexInitiate(); } indexInitiate() { var urlPath = window.location.href; var index = urlPath.lastIndexOf('/'); var urlCompanyName = urlPath.substring(index + 1, urlPath.length); if (this.userObj.companyName != urlCompanyName) { var data = { masterAddress: '', userName: this.userObj.userName, companyName: urlCompanyName, GBMasterAddress: this.userObj.GBMasterAddress, allAbis: this.userObj.allAbis, email: this.userObj.email, token: 'token', authorized: true }; localStorage.setItem('currentUser', JSON.stringify(data)); let user1 = localStorage.getItem('currentUser'); this.userObj = JSON.parse(user1); import('../../globals/globals.component').then(module => { module.generator(); }); GlobalsComponent.gbmaster.getdAppDetails( this.userObj.companyName, function(error, result) { this.versionNum = result[5].toNumber(); this.masterAbi = this.userObj.allAbis[0]; this.companyMasterAddress = result[1]; this.userObj.masterAddress = this.companyMasterAddress; var version; var mrAbi = this.userObj.allAbis[2]; GlobalsComponent.gbmaster.isMemberAuthorized( this.userObj.companyName, this.userAddress, function(errorMR1, resultMR1) { var authorized = false; if (resultMR1.authorized) { authorized = true; } this.userObj.authorized = authorized; this.authMember = this.userObj.authorized; var timeoutVar1 = setInterval( function() { let user = localStorage.getItem('currentUser'); this.userObj = JSON.parse(user); if (this.userObj.companyName in GlobalsComponent.governance) { user = localStorage.getItem('currentUser'); this.userObj = JSON.parse(user); var data = { masterAddress: this.companyMasterAddress, userName: this.userObj.userName, companyName: urlCompanyName, GBMasterAddress: this.userObj.GBMasterAddress, allAbis: this.userObj.allAbis, email: this.userObj.email, token: 'token', authorized: authorized }; localStorage.setItem('currentUser', JSON.stringify(data)); user = localStorage.getItem('currentUser'); this.userObj = JSON.parse(user); this.getInitialAddress(); clearInterval(timeoutVar1); } }.bind(this), 500 ); }.bind(this) ); }.bind(this) ); } else { import('../../globals/globals.component').then(module => { module.generator(); }); var timeoutVar1 = setInterval( function() { if (this.userObj.companyName in GlobalsComponent.governance) { this.getInitialAddress(); clearInterval(timeoutVar1); } }.bind(this), 500 ); } } truncate(fullStr, strLen, separator) { if (fullStr.length <= strLen) return fullStr; separator = separator || '...'; var sepLen = separator.length, charsToShow = strLen - sepLen, frontChars = Math.ceil(charsToShow / 2), backChars = Math.floor(charsToShow / 2); return ( fullStr.substr(0, frontChars) + separator + fullStr.substr(fullStr.length - backChars) ); } public gbtSTAbi; public gbtSTAddress; public poolAddress; public canCreateProposal = {}; public reason = {}; public tokensToLock = {}; public dAppTokenName; getInitialAddress() { this.getProposalLength(); this.initialCalls(); this.detailService.setdAppName(this.userObj.companyName); } public proposalLength; getProposalLength() { GlobalsComponent.proposalData[this.userObj.companyName].getProposalLength( function(errPropoLen, resPropLen) { this.proposalLength = resPropLen; }.bind(this) ); } //Initial Calls initialCalls() { GlobalsComponent.governance[this.userObj.companyName].canCreateProposal( this.userAddress, 1, function(reason, resCanCreate) { this.canCreateProposal[1] = resCanCreate; this.reason[1] = reason[0]; this.tokensToLock[1] = reason[1]; }.bind(this) ); GlobalsComponent.gbmaster.getdAppTokenName( this.userObj.companyName, function(errTokenName, resTokenName) { this.dAppTokenName = resTokenName; }.bind(this) ); GlobalsComponent.governance[this.userObj.companyName].canCreateProposal( this.userAddress, 2, function(reason, resCanCreate) { this.canCreateProposal[2] = resCanCreate; this.reason[2] = reason[0]; this.tokensToLock[2] = reason[1]; }.bind(this) ); GlobalsComponent.memberData[this.userObj.companyName].getRoles_MemberCount( function(error1, result1) { this.noOfRoles = result1[1].length; this.getMemberRoleDesc(result1); }.bind(this) ); var balance; GlobalsComponent.gbmaster.getdAppTokenDecimals( this.userObj.companyName, function(errTokendecimals, resTokendecimals) { GlobalsComponent.gbmaster.getPooldAppTokenBalance( this.userObj.companyName, function(error2, result2) { this.poolGBTbalance = result2 / Math.pow(10, resTokendecimals); }.bind(this) ); }.bind(this) ); } public poolGBTbalance; public roleHash; public roleDescArray = []; public memberRoleResult; getMemberRoleDesc(resultRole) { let rolename = {}; GlobalsComponent.memberData[ this.userObj.companyName ].getMemberRoleIdByAddress( this.web3.eth.defaultAccount, function(errMRRoleId, resMRRoleId) { if (!errMRRoleId) { var mrRoleId; if (resMRRoleId.length == 0) { mrRoleId = 0; } else { mrRoleId = resMRRoleId[0]; } for (let i = 1; i < this.noOfRoles; i++) { rolename[i] = this.hex_to_ascii(resultRole[0][i]); // GlobalsComponent.memberData[this.userObj.companyName].getMemberRoleNameById(mrRoleId,function(errRoleName,resRoleName){ // if(!errRoleName) // { // var mrRoleName = resRoleName; // var roleStatus = (mrRoleName == rolename) ? true : false; // var role={id:i,name:rolename,desc:"",memberCount:resultRole[1][i],currentRole:roleStatus}; // this.roles.push(role); // if(this.roles.length>0)this.showRoles=true; // } // else // { // console.log("Error in getMemberRoleNameById"); // } // }.bind(this)); GlobalsComponent.memberData[this.userObj.companyName].getRoleData( i, function(errResult, resResult) { if (!errResult) { var mrRoleName = GlobalsComponent.gbmaster.hex_to_ascii( resResult.roleName ); var roleStatus = mrRoleId == i ? true : false; //(mrRoleName == rolename[i]) ? true : false; var role = { id: i, name: rolename[i], desc: resResult.roleDescription, memberCount: resultRole[1][i], currentRole: roleStatus, limitedValidity: resResult.limitedValidity }; this.roles.push(role); if (this.roles.length > 0) this.showRoles = true; } }.bind(this) ); } } else { console.log('Error in getMemberRoleIdByAddress'); } }.bind(this) ); } // let rolename = {}; // for(let i=1;i0)this.showRoles=true; // } // }.bind(this)); // } public limitedValidity; //Called when no of members is clicked in All Roles table showMembers(i) { this.AllRoleShow = true; this.selectedMember = null; this.selectedRole = this.roles[i].id; this.selectedRoleName = this.roles[i].name; this.limitedValidity = this.roles[i].limitedValidity; this.memberAddresses.length = 0; GlobalsComponent.memberData[ this.userObj.companyName ].getMemberAddressByRoleId( this.selectedRole, function(error1, result1) { this.length = result1[1].length; this.members.length = 0; this.memberAddresses.length = 0; for (let j = 0; j < this.length; j++) { this.memberAddresses.push(result1[1][j]); this.setMemberDetails(result1[1][j], j); } }.bind(this) ); } //called from showMembers functions setMemberDetails(memberAddress, j) { let m_address = memberAddress; GlobalsComponent.memberData[this.userObj.companyName].getMemberDetails( memberAddress, function(error1, result1) { let id = j; let address = memberAddress; let memberReputation = result1[0].toNumber(); let totalProposal = result1[1].toNumber(); let option = result1[2].toNumber(); let totalVotes = result1[3].toNumber(); if (this.memberAddresses.length == 1) { this.members.length = 0; } var memberDetails = { id: j, adress: address, reputation: memberReputation, proposal: totalProposal, option: option, votes: totalVotes, stake: 0 }; this.members.push(memberDetails); }.bind(this) ); } //Called when an address is selected in All members Table onSelectMember(address) { this.selectedMember = address; } //on Click submit option for creating a proposal public GBTPurchase = false; oncreateProposal(proposalwithOptionsHash, categoryId) { var user = localStorage.getItem('currentUser'); this.userObj = JSON.parse(user); if (this.userObj.email == 'govblocks@govblocks.io') { this.message = 'Please login to your google account in order to create proposal
'; $('#modal-add-role').modal('hide'); $('#modal-add-member').modal('hide'); $('#modal-remove-member').modal('hide'); $('#loginModal').modal('show'); this.loadingAddRole = false; this.loadingAddMember = false; this.loadingRemove = false; } else { var categoryIncentive; var closingTime; if (this.paramDetails.length == this.inputParamValue.length) { var optionAreDetails = { paramValues: this.inputParamValue, apiParamValues: [] }; this.GBTPurchase = false; this.createProposal( proposalwithOptionsHash, optionAreDetails, this.categoryId ); } } } createProposal(proposaDeschash, optionHash, categoryId) { if (this.canCreateProposal[categoryId]) { var data = { proposalData: proposaDeschash, optionData: optionHash, votingType: 0, cId: categoryId }; GlobalsComponent.governance[ this.userObj.companyName ].createProposalwithOption( data, function(error1, result1) { if (!error1) { this.toastr.info( 'Proposal submitted to ethereum(' + GlobalsComponent.network + '). Awaiting confirmation!' ); this.timeout(result1, proposaDeschash); } else { this.toastr.error('Error executing the operation'); this.loadingAddMember = false; this.loadingAddRole = false; this.loadingRemove = false; $('#btn1').trigger('click'); } }.bind(this) ); } else { this.loadingAddMember = false; this.loadingAddRole = false; this.loadingRemove = false; if (this.reason[categoryId] == 'Not Allowed') this.toastr.warning( 'You are not authorized to create proposal under this category' ); else if (this.reason[categoryId] == 'Less Tokens') this.toastr.warning( 'Lock ' + this.tokensToLock[categoryId] + ' token(s) to create a proposal under this category' ); } } convertPoolETHtoGBT() { $('#buyGBTPool').modal('show'); } public showModal = 0; //called when Add new Role button is clicked onClickAddnewRole() { this.inputParamValue.length = 0; this.shortDescription = ''; this.roleName = null; this.newRole = ''; this.roleDescription = null; // this.stakeAmount = this.minStakeAddMR; this.incompleteDetails = false; this.categoryId = 1; var user = localStorage.getItem('currentUser'); this.userObj = JSON.parse(user); if (this.userObj.email == 'govblocks@govblocks.io') { this.message = 'Please login to your google account in order to create proposal
'; $('#modal-add-role').modal('hide'); $('#loginModal').modal('show'); this.loadingAddRole = false; } else { GlobalsComponent.categoryData[ this.userObj.companyName ].getCategoryDataBySubCategoryId( this.categoryId, function(error1, result2: any) { if (!error1) { var categoryData = result2; this.incentiveCategory = categoryData.incentives; if (this.incentiveCategory > this.poolGBTbalance) this.purchaseGBTpool = true; else { this.purchaseGBTpool = false; this.getParamHashDetails(0); // $('#modal-add-role').modal('show'); } } }.bind(this) ); } } setAddress() { if (this.memberAddress == '') { this.shortDescription = ''; } else this.shortDescription = 'Add New Member - ' + this.memberAddress; for (let i = 0; i < this.paramDetails.length; i++) { if (this.paramDetails[i].name == 'Member Address') { this.inputParamValue[i] = this.memberAddress; } } } public externalAuthorization = false; public externalAddress = '0x0000000000000000000000000000000000000000'; switchIt() { this.externalAuthorization = !this.externalAuthorization; if (this.externalAuthorization == false) { this.externalAddress = '0x0000000000000000000000000000000000000000'; } else { this.externalAddress = null; } } //called when Remove member button is clicked removememberModal() { this.now = this.getFormattedDate(); this.shortDescription = ''; this.SummerNoteText = null; this.incompleteDetails = false; this.categoryId = 2; var user = localStorage.getItem('currentUser'); this.userObj = JSON.parse(user); if (this.userObj.email == 'govblocks@govblocks.io') { this.message = 'Please login to your google account in order to create proposal
'; $('#modal-remove-member').modal('hide'); $('#loginModal').modal('show'); this.loadingRemove = false; } else { GlobalsComponent.categoryData[ this.userObj.companyName ].getCategoryDataBySubCategoryId( this.categoryId, function(error1, result2: any) { if (!error1) { var categoryData = result2; this.incentiveCategory = categoryData.incentives; if (this.incentiveCategory > this.poolGBTbalance) this.purchaseGBTpool = true; else { this.purchaseGBTpool = false; this.getParamHashDetails(0); // $('#modal-remove-member').modal('show'); } } }.bind(this) ); } } public validity; public now; getFormattedDate() { var todayTime = new Date(); var mm = todayTime.getMonth() + 1; var month; if (mm < 10) month = '0' + mm; else month = mm; var dd = todayTime.getDate() + 1; var date; if (dd < 10) date = '0' + dd; else date = dd; var year = todayTime.getFullYear(); return year + '-' + month + '-' + date; } public incentiveCategory = 0; //called when Add member buttom is clicked addmemberModal() { this.now = this.getFormattedDate(); this.shortDescription = ''; this.SummerNoteText = null; this.memberAddress = null; this.incompleteDetails = false; var id: number = 2; this.categoryId = 2; var user = localStorage.getItem('currentUser'); this.userObj = JSON.parse(user); if (this.userObj.email == 'govblocks@govblocks.io') { this.message = 'Please login to your google account in order to create proposal
'; $('#modal-add-member').modal('hide'); $('#loginModal').modal('show'); this.loadingAddMember = false; } else { GlobalsComponent.categoryData[ this.userObj.companyName ].getCategoryDataBySubCategoryId( this.categoryId, function(error1, result2: any) { if (!error1) { var categoryData = result2; this.incentiveCategory = categoryData.incentives; if (this.incentiveCategory > this.poolGBTbalance) this.purchaseGBTpool = true; else { this.purchaseGBTpool = false; // this.showModal=1; this.getParamHashDetails(1); // $('#modal-add-member').modal('show'); } } }.bind(this) ); } } public purchaseGBTpool = false; //get parameter Details of category-MemberRoles getParamHashDetails(typeOfAction) { var id = this.categoryId; this.paramDetails.length = 0; this.inputParamValue.length = 0; GlobalsComponent.categoryData[this.userObj.companyName].getSubCategoryData( this.categoryId, function(error1, result2: any) { if (!error1) { var categoryDetails = result2; for ( let i = 0; i < categoryDetails.parameterDescriptions.length; i++ ) { var paramDetails1 = { name: categoryDetails.parameterNames[i], type: categoryDetails.parameterTypes[i], desc: categoryDetails.parameterDescriptions[i] }; if (paramDetails1.name == 'Type of action') { this.inputParamValue[i] = typeOfAction == 1 ? true : false; } if (paramDetails1.name == 'Role Id') { this.inputParamValue[i] = this.selectedRole; } if (paramDetails1.name == 'Member Address' && typeOfAction == 0) { this.inputParamValue[i] = this.selectedMember; } this.paramDetails.push(paramDetails1); } } else { console.log(error1); } }.bind(this) ); } //Get Details From IPFS getDataFromHash(hash) { if (hash == '') { return hash; } else { var XMLHttp = new XMLHttpRequest(); XMLHttp.open('GET', 'https://ipfs.govblocks.io/ipfs/' + hash, false); XMLHttp.send(null); // // // this gives the json containing the details - title, description, voting type var hashDetails = JSON.parse(XMLHttp.responseText); return hashDetails; } } //Called ehen Submut Button is clicked for adding new member role addNewRole() { this.loadingAddRole = true; if (this.roleName != '') { this.shortDescription = 'Add New Member Role - ' + this.roleName; var quoteArdetails = [ { title: this.shortDescription, rolename: this.roleName, shortDescription: this.shortDescription, description: this.roleDescription } ]; var roleHash = [{ description: this.roleDescription }]; for (let i = 0; i < this.paramDetails.length; i++) { if (this.paramDetails[i].name == 'Role Name') { this.inputParamValue[i] = this.roleName; } if (this.paramDetails[i].name == 'Role Description') { this.inputParamValue[i] = this.roleDescription; } if (this.paramDetails[i].name == 'Authorized Address') { this.inputParamValue[i] = this.externalAddress; } if (this.paramDetails[i].name == 'LimitedValidity') { this.limitedValidity = this.limitedValidity == 'true' ? true : false; this.inputParamValue[i] = this.limitedValidity; } } this.oncreateProposal(quoteArdetails, 1); } else { this.toastr.warning('Please Enter all the details'); this.loadingAddRole = false; } } public validityUpto; //Called when submit button is clicked for adding new member addMember() { this.loadingAddMember = true; if (!this.limitedValidity) { this.validity = 0; } var d = new Date(this.validity); var date = new Date(); var timeStamp = d.getTime(); this.validityUpto = Math.round(timeStamp / 1000); this.shortDescription = 'Add Member - ' + this.memberAddress + ' to ' + this.selectedRoleName; if (this.memberAddress != null && this.SummerNoteText != '') { var quoteArdetails = [ { title: this.shortDescription, address: this.memberAddress, roleId: this.selectedRole, shortDescription: this.shortDescription, description: this.SummerNoteText } ]; for (let i = 0; i < this.paramDetails.length; i++) { if (this.paramDetails[i].name == 'Validity') { this.inputParamValue[i] = this.validityUpto; } } if (this.web3.isAddress(this.memberAddress)) { this.oncreateProposal(quoteArdetails, 2); } else { this.toastr.warning('Please Enter a valid address'); this.loadingAddMember = false; } } else { this.toastr.warning('Please Enter all the details'); this.loadingAddMember = false; } } //called when submit buutton is pressed for Removing member removeMember() { this.loadingRemove = true; this.validityUpto = 0; this.shortDescription = 'Remove Member - ' + this.selectedMember + ' from ' + this.selectedRoleName; if (this.SummerNoteText != '') { var quoteArdetails = [ { title: this.shortDescription, Address: this.selectedMember, RoleId: this.selectedRole, shortDescription: this.shortDescription, description: this.SummerNoteText } ]; for (let i = 0; i < this.paramDetails.length; i++) { if (this.paramDetails[i].name == 'Validity') { this.inputParamValue[i] = this.validityUpto; } } this.oncreateProposal(quoteArdetails, 2); } else { this.toastr.warning('Please Enter all the details'); this.loadingRemove = false; } } //called when Add new role button is clicked newRoleName() { this.newRole = this.roleName; } //Timeout function for getting transaction confirmation from blockchain timeout(hash, optionHash) { setTimeout(() => { var boundFunction = this.web3.eth.getTransactionReceipt( hash, function(error, result) { if (result != null) { setTimeout(() => { var proposalId = result.logs[0].topics[2]; proposalId = this.web3.toDecimal(proposalId); this.toastr.success('Proposal Added Succesfully!'); this.closeSlide(); if (this.loadingAddRole) { $('#modal-add-role').modal('hide'); this.loadingAddRole = false; } if (this.loadingAddMember) { $('#modal-add-member').modal('hide'); this.loadingAddMember = false; } if (this.loadingRemove) { $('#modal-remove-member').modal('hide'); this.loadingRemove = false; } this.router.navigate([ this.iframeURl + '/components/proposals/' + this.userObj.companyName + '/' + proposalId ]); }, 4000); } else this.timeout(hash, optionHash); }.bind(this) ); }, 5 * 1000); } //Clear text in summerNote clearSummerNote() { $('#addnewRoleSummerNote').code('reset'); } //method to convert hexadecimal to ASCII hex_to_ascii(str1) { var hex = str1.toString(); var str = ''; for (var n = 0; n < hex.length; n += 2) { str += String.fromCharCode(parseInt(hex.substr(n, 2), 16)); } str1 = ''; for (var i = 0; i < str.length; i++) { if (str.charCodeAt(i) != 0) { str1 += str[i]; } } return str1; } ngAfterViewInit() { this.memberRole(); $('.summernote').summernote(); this._script.load( '.m-grid__item.m-grid__item--fluid.m-wrapper', 'assets/demo/default/custom/components/portlets/tools.js', 'assets/demo/default/custom/components/forms/widgets/summernote.js' ); } memberRole() { $('#formNewMember').validate({ rules: { memberAddress: { required: true }, description: { required: true } } }); $('#formNewRole').validate({ rules: { name: { required: true }, input: { required: true } } }); $('#formRemoveMember').validate({ rules: { message_text: { required: true } } }); } Reset() { $('div').removeClass('has-success'); $('div').removeClass('has-danger'); $('.form-control-feedback').remove(); } } export class MemberRolesIframeComponent extends MemberRolesComponent {}