From 224a92c907cb3a799ea4464e705fdcb8a2e26cf6 Mon Sep 17 00:00:00 2001 From: Alex Barnsley <8069294+alexbarnsley@users.noreply.github.com> Date: Wed, 11 Sep 2019 13:57:40 +0100 Subject: [PATCH 01/15] refactor: remove redundant properties from transaction forms (#1439) * refactor: rename error variable * refactor: move stuff to mixin * refactor: move validation to mixin * fix: build vote transaction * fix: when to call postSubmit * fix: delegate username validation --- .../TransactionFormDelegateRegistration.vue | 158 +++++----------- .../TransactionFormSecondSignature.vue | 136 +++----------- .../TransactionFormTransfer.vue | 157 ++++++---------- .../TransactionForm/TransactionFormVote.vue | 160 ++++------------- .../TransactionForm/mixin-on-submit.js | 35 ---- .../Transaction/TransactionForm/mixin.js | 170 ++++++++++++++++++ 6 files changed, 326 insertions(+), 490 deletions(-) delete mode 100644 src/renderer/components/Transaction/TransactionForm/mixin-on-submit.js create mode 100644 src/renderer/components/Transaction/TransactionForm/mixin.js diff --git a/src/renderer/components/Transaction/TransactionForm/TransactionFormDelegateRegistration.vue b/src/renderer/components/Transaction/TransactionForm/TransactionFormDelegateRegistration.vue index 13d742c982..de1f05dde7 100644 --- a/src/renderer/components/Transaction/TransactionForm/TransactionFormDelegateRegistration.vue +++ b/src/renderer/components/Transaction/TransactionForm/TransactionFormDelegateRegistration.vue @@ -18,9 +18,9 @@ @@ -95,15 +95,13 @@ + + diff --git a/src/renderer/components/Button/ButtonModal.vue b/src/renderer/components/Button/ButtonModal.vue index a7391eb930..6e2274a9fd 100644 --- a/src/renderer/components/Button/ButtonModal.vue +++ b/src/renderer/components/Button/ButtonModal.vue @@ -51,6 +51,12 @@ export default { label: { type: String, required: true + }, + + disabled: { + type: Boolean, + required: false, + default: false } }, @@ -62,7 +68,12 @@ export default { emitToggle () { this.$emit('toggle', this.isOpen) }, + toggle () { + if (this.disabled) { + return + } + this.isOpen = !this.isOpen this.emitToggle() } diff --git a/src/renderer/components/Button/index.js b/src/renderer/components/Button/index.js index f755aed50a..1c2b4cf6f0 100644 --- a/src/renderer/components/Button/index.js +++ b/src/renderer/components/Button/index.js @@ -8,9 +8,13 @@ import ButtonReload from './ButtonReload' import ButtonSwitch from './ButtonSwitch' import ButtonLayout from './ButtonLayout' +// Last because of order +import ButtonDropdown from './ButtonDropdown' + export { ButtonClipboard, ButtonClose, + ButtonDropdown, ButtonGeneric, ButtonIconGeneric, ButtonLetter, diff --git a/src/renderer/components/Input/InputAddress.vue b/src/renderer/components/Input/InputAddress.vue index 06507377cd..7518952c60 100644 --- a/src/renderer/components/Input/InputAddress.vue +++ b/src/renderer/components/Input/InputAddress.vue @@ -16,6 +16,7 @@ :is-disabled="isDisabled" :is-focused="isFocused" :is-invalid="invalid" + :warning-text="warningText" class="InputAddress text-left" >
wallet && !!wallet.address) const addresses = map(source, (wallet) => { const address = { @@ -197,7 +208,7 @@ export default { }) const results = orderBy(addresses, (object) => { - return object.name || object.address.toLowerCase() + return (object.name || object.address).toLowerCase() }) return results.reduce((wallets, wallet, index) => { @@ -370,13 +381,27 @@ export default { this.$nextTick(() => { this.$refs.input.setSelectionRange(this.inputValue.length, this.dropdownValue.length) }) + }, + + reset () { + this.model = '' + this.$nextTick(() => { + this.$v.$reset() + }) } }, validations: { model: { - required, + required (value) { + return this.isRequired ? required(value) : true + }, + isValid (value) { + if (!this.isRequired && value.replace(/\s+/, '') === '') { + return true + } + return WalletService.validateAddress(value, this.pubKeyHash) } } diff --git a/src/renderer/components/Input/InputCurrency.vue b/src/renderer/components/Input/InputCurrency.vue index 9fbee70291..4b7b94a152 100644 --- a/src/renderer/components/Input/InputCurrency.vue +++ b/src/renderer/components/Input/InputCurrency.vue @@ -40,7 +40,6 @@ import { includes, isString } from 'lodash' import { required } from 'vuelidate/lib/validators' import { MARKET } from '@config' -import store from '@/store' import InputField from './InputField' import BigNumber from '@/plugins/bignumber' @@ -365,7 +364,7 @@ export default { * @return {Boolean} */ currencyValidator (currency) { - const currentNetwork = this.walletNetwork || store.getters['session/network'] + const currentNetwork = this.walletNetwork || this.$store.getters['session/network'] const currencies = [ currentNetwork.token, currentNetwork.subunit, @@ -374,6 +373,13 @@ export default { ...Object.values(MARKET.currencies).map(currency => currency.symbol) ] return includes(currencies, currency) + }, + + reset () { + this.inputValue = '' + this.$nextTick(() => { + this.$v.model.$reset() + }) } }, diff --git a/src/renderer/components/Input/InputDelegate.vue b/src/renderer/components/Input/InputDelegate.vue index 91a60ac2b8..76aeafd227 100644 --- a/src/renderer/components/Input/InputDelegate.vue +++ b/src/renderer/components/Input/InputDelegate.vue @@ -66,7 +66,7 @@ import { MenuDropdown } from '@/components/Menu' import Cycled from 'cycled' import InputField from './InputField' import truncate from '@/filters/truncate' -import { includes, isEmpty, map, orderBy } from 'lodash' +import { isEmpty, orderBy } from 'lodash' export default { name: 'InputDelegate', @@ -120,7 +120,7 @@ export default { }, delegates () { - return this.$store.getters['delegate/bySessionNetwork'] + return Object.values(this.$store.getters['delegate/bySessionNetwork'] || {}).filter(delegate => !delegate.isResigned) }, error () { @@ -168,7 +168,7 @@ export default { return [] } - const delegates = map(this.delegates, (object) => { + const delegates = this.delegates.map(object => { const delegate = { name: null, username: object.username, @@ -187,7 +187,7 @@ export default { return results.reduce((delegates, delegate, index) => { Object.values(delegate).forEach(prop => { - if (includes(prop.toLowerCase(), this.inputValue.toLowerCase())) { + if (prop.toLowerCase().includes(this.inputValue.toLowerCase())) { delegates[delegate.username] = delegate.name } }) @@ -243,7 +243,7 @@ export default { // Verifies that the element that generated the blur was a dropdown item if (evt.relatedTarget) { const classList = evt.relatedTarget.classList || [] - const isDropdownItem = includes(classList, 'MenuDropdownItem__button') + const isDropdownItem = classList.includes('MenuDropdownItem__button') if (!isDropdownItem) { this.closeDropdown() diff --git a/src/renderer/components/Input/InputEditableList.vue b/src/renderer/components/Input/InputEditableList.vue new file mode 100644 index 0000000000..13361c9be6 --- /dev/null +++ b/src/renderer/components/Input/InputEditableList.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/src/renderer/components/Input/InputFee.vue b/src/renderer/components/Input/InputFee.vue index 585cb2b9d8..b77446af3a 100644 --- a/src/renderer/components/Input/InputFee.vue +++ b/src/renderer/components/Input/InputFee.vue @@ -92,6 +92,12 @@ export default { required: true }, + transactionGroup: { + type: Number, + required: false, + default: 1 + }, + showInsufficientFunds: { type: Boolean, required: false, @@ -145,8 +151,8 @@ export default { return this.$t('INPUT_FEE.ERROR.NOT_VALID') }, maxV1fee () { - const defaultMaxV1Fee = V1.fees[this.transactionType] - const staticFee = this.$store.getters['transaction/staticFee'](this.transactionType) + const defaultMaxV1Fee = V1.fees[`GROUP_${this.transactionGroup}`][this.transactionType] + const staticFee = this.$store.getters['transaction/staticFee'](this.transactionType, this.transactionGroup) return staticFee || defaultMaxV1Fee }, isStaticFee () { @@ -167,9 +173,19 @@ export default { } const { feeStatistics } = this.feeNetwork - const transactionStatistics = feeStatistics.find(feeConfig => feeConfig.type === this.transactionType) - if (transactionStatistics) { - return transactionStatistics.fees + if (feeStatistics) { + let transactionStatistics + if (feeStatistics[0]) { + transactionStatistics = Object.values(feeStatistics).find(feeConfig => feeConfig.type === this.transactionType) + } else if (feeStatistics[this.transactionGroup]) { + transactionStatistics = Object.values(feeStatistics[this.transactionGroup]).find(feeConfig => { + return feeConfig.type === this.transactionType + }) + } + + if (transactionStatistics) { + return transactionStatistics.fees + } } return { diff --git a/src/renderer/components/Input/InputPublicKey.vue b/src/renderer/components/Input/InputPublicKey.vue new file mode 100644 index 0000000000..c8a87a25f5 --- /dev/null +++ b/src/renderer/components/Input/InputPublicKey.vue @@ -0,0 +1,111 @@ + + + diff --git a/src/renderer/components/Input/InputText.vue b/src/renderer/components/Input/InputText.vue index 93da552198..9f640d47e1 100644 --- a/src/renderer/components/Input/InputText.vue +++ b/src/renderer/components/Input/InputText.vue @@ -171,6 +171,13 @@ export default { blur () { this.$refs.input.blur() + }, + + reset () { + this.model = '' + this.$nextTick(() => { + this.$v.$reset() + }) } }, diff --git a/src/renderer/components/Input/index.js b/src/renderer/components/Input/index.js index 8d202da211..c02e0a6ce9 100644 --- a/src/renderer/components/Input/index.js +++ b/src/renderer/components/Input/index.js @@ -1,10 +1,12 @@ import InputAddress from './InputAddress' import InputCurrency from './InputCurrency' import InputDelegate from './InputDelegate' +import InputEditableList from './InputEditableList' import InputFee from './InputFee' import InputField from './InputField' import InputLanguage from './InputLanguage' import InputPassword from './InputPassword' +import InputPublicKey from './InputPublicKey' import InputSelect from './InputSelect' import InputSwitch from './InputSwitch' import InputText from './InputText' @@ -16,10 +18,12 @@ export { InputAddress, InputCurrency, InputDelegate, + InputEditableList, InputFee, InputField, InputLanguage, InputPassword, + InputPublicKey, InputSelect, InputSwitch, InputText diff --git a/src/renderer/components/Menu/MenuDropdown/MenuDropdownAlternativeHandler.vue b/src/renderer/components/Menu/MenuDropdown/MenuDropdownAlternativeHandler.vue index 96e2a803f6..0ea4f1e1b0 100644 --- a/src/renderer/components/Menu/MenuDropdown/MenuDropdownAlternativeHandler.vue +++ b/src/renderer/components/Menu/MenuDropdown/MenuDropdownAlternativeHandler.vue @@ -8,7 +8,7 @@ 'rotate-vertical': isOpen }" name="arrow-dropdown" - view-box="0 0 18 18" + view-box="0 0 8 8" class="transition align-middle" /> diff --git a/src/renderer/components/Menu/MenuDropdown/MenuDropdownHandler.vue b/src/renderer/components/Menu/MenuDropdown/MenuDropdownHandler.vue index e19b732d83..0688e42f7b 100644 --- a/src/renderer/components/Menu/MenuDropdown/MenuDropdownHandler.vue +++ b/src/renderer/components/Menu/MenuDropdown/MenuDropdownHandler.vue @@ -19,7 +19,7 @@ diff --git a/src/renderer/components/Menu/MenuTab/MenuTab.vue b/src/renderer/components/Menu/MenuTab/MenuTab.vue index 9418f6f520..0aeba59dfb 100644 --- a/src/renderer/components/Menu/MenuTab/MenuTab.vue +++ b/src/renderer/components/Menu/MenuTab/MenuTab.vue @@ -1,7 +1,7 @@