diff --git a/packages/apps/public/locales/en/app-accounts.json b/packages/apps/public/locales/en/app-accounts.json
index c5458b3896..9d7470f305 100644
--- a/packages/apps/public/locales/en/app-accounts.json
+++ b/packages/apps/public/locales/en/app-accounts.json
@@ -30,6 +30,7 @@
"Any account set as proxy will be able to perform actions in place of the proxied account": "Any account set as proxy will be able to perform actions in place of the proxied account",
"Any democracy vote performed by the delegated account will result in an additional vote from the delegating account": "Any democracy vote performed by the delegated account will result in an additional vote from the delegating account",
"Approve this call hash": "Approve this call hash",
+ "Backup": "Backup",
"Backup account": "Backup account",
"Cancel this call hash": "Cancel this call hash",
"Change": "Change",
@@ -48,6 +49,7 @@
"Delegate": "Delegate",
"Delegate democracy votes": "Delegate democracy votes",
"Derivation for Ledger-type accounts are only available on mnemonic seeds.": "Derivation for Ledger-type accounts are only available on mnemonic seeds.",
+ "Derive": "Derive",
"Derive account from pair": "Derive account from pair",
"Derive account via derivation path": "Derive account via derivation path",
"Determines what cryptography will be used to create this account. Note that to validate on Polkadot, the session account must use \"ed25519\".": "Determines what cryptography will be used to create this account. Note that to validate on Polkadot, the session account must use \"ed25519\".",
@@ -68,6 +70,7 @@
"Full Legal Name": "Full Legal Name",
"Future versions of the web-only interface will drop support for non-external accounts, much like the IPFS version.": "Future versions of the web-only interface will drop support for non-external accounts, much like the IPFS version.",
"I have saved my mnemonic seed safely": "I have saved my mnemonic seed safely",
+ "Identity": "Identity",
"If the delegated account is currently voting in a referendum, the delegating vote and conviction will be added.": "If the delegated account is currently voting in a referendum, the delegating vote and conviction will be added.",
"If the recipient account is new, the balance needs to be more than the existential deposit. Likewise if the sending account balance drops below the same value, the account will be removed from the state.": "If the recipient account is new, the balance needs to be more than the existential deposit. Likewise if the sending account balance drops below the same value, the account will be removed from the state.",
"If you add several proxy accounts for the same proxy type (e.g 2 accounts set as proxy for Governance), then any of those 2 accounts will be able to perfom governance actions on behalf of the proxied account": "If you add several proxy accounts for the same proxy type (e.g 2 accounts set as proxy for Governance), then any of those 2 accounts will be able to perfom governance actions on behalf of the proxied account",
@@ -117,6 +120,7 @@
"Proxy overview": "Proxy overview",
"Raw seed": "Raw seed",
"Reasonable": "Reasonable",
+ "Recovery": "Recovery",
"Register identity": "Register identity",
"Register sub-identities": "Register sub-identities",
"Remove": "Remove",
diff --git a/packages/apps/public/locales/en/translation.json b/packages/apps/public/locales/en/translation.json
index eda186d200..f2cd001879 100644
--- a/packages/apps/public/locales/en/translation.json
+++ b/packages/apps/public/locales/en/translation.json
@@ -18,6 +18,7 @@
"Authorize transaction": "",
"Aye": "",
"Aye: {{count}}": "",
+ "Backup": "",
"Blocks nominations": "",
"Bond": "",
"Bounty approval under voting": "",
@@ -42,9 +43,11 @@
"Curator's fee": "",
"Dark theme (experimental, work-in-progress)": "",
"Defender": "",
+ "Delegate": "",
"Delegate democracy votes": "",
"Deploy": "",
"Deploy a contract": "",
+ "Derive": "",
"Derive account via derivation path": "",
"Developer": "",
"Distinct stash and controller accounts are recommended to ensure fund security. You will be allowed to make the transaction, but take care to not tie up all funds, only use a portion of the available funds during this period.": "",
@@ -56,6 +59,7 @@
"Forget this account": "",
"Full Legal Name": "",
"Governance": "",
+ "Identity": "",
"If the motion is approved, Curator's deposit will be slashed and Curator will be unassigned. Bounty will return to the Funded state.": "",
"If the motion is approved, the current Curator will be unassigned and the Bounty will return to the Funded state.": "",
"If you have not claimed rewards straight after the end of the era, the validator is in the active set and you are seeing no rewards, this would mean that the reward payout transaction was made by another account on your behalf. Always check your favorite explorer to see any historic payouts made to your accounts.": "",
@@ -66,6 +70,7 @@
"Locked funds (e.g. for staking) are counted.": "",
"Make recoverable": "",
"Manage proxies": "",
+ "Multisig": "",
"Multisig approvals": "",
"My On-Chain Name": "",
"Nay": "",
@@ -92,6 +97,7 @@
"Prior locked voting": "",
"Produced blocks": "",
"Proposer": "",
+ "Recovery": "",
"Retrieving data": "",
"Retrieving nominators": "",
"Retrieving validators": "",
diff --git a/packages/page-accounts/src/Accounts/Account.tsx b/packages/page-accounts/src/Accounts/Account.tsx
index 2b2f535d6b..551d140f9f 100644
--- a/packages/page-accounts/src/Accounts/Account.tsx
+++ b/packages/page-accounts/src/Accounts/Account.tsx
@@ -233,6 +233,7 @@ function Account ({ account: { address, meta }, className = '', delegation, filt
createMenuGroup('identityGroup', [
isFunction(api.api.tx.identity?.setIdentity) && !isHardware && (
@@ -241,6 +242,7 @@ function Account ({ account: { address, meta }, className = '', delegation, filt
),
isFunction(api.api.tx.identity?.setSubs) && identity?.display && !isHardware && (
@@ -249,6 +251,7 @@ function Account ({ account: { address, meta }, className = '', delegation, filt
),
isFunction(api.api.tx.democracy?.unlock) && democracyUnlockTx && (
@@ -257,16 +260,18 @@ function Account ({ account: { address, meta }, className = '', delegation, filt
),
isFunction(api.api.tx.vesting?.vest) && vestingVestTx && (
{t('Unlock vested amount')}
)
- ]),
+ ], t('Identity')),
createMenuGroup('deriveGroup', [
!(isExternal || isHardware || isInjected || isMultisig) && (
@@ -275,16 +280,18 @@ function Account ({ account: { address, meta }, className = '', delegation, filt
),
isHardware && (
{t('Show address on hardware device')}
)
- ]),
+ ], t('Derive')),
createMenuGroup('backupGroup', [
!(isExternal || isHardware || isInjected || isMultisig || isDevelopment) && (
@@ -293,6 +300,7 @@ function Account ({ account: { address, meta }, className = '', delegation, filt
),
!(isExternal || isHardware || isInjected || isMultisig || isDevelopment) && (
@@ -301,16 +309,18 @@ function Account ({ account: { address, meta }, className = '', delegation, filt
),
!(isInjected || isDevelopment) && (
{t('Forget this account')}
)
- ]),
+ ], t('Backup')),
isFunction(api.api.tx.recovery?.createRecovery) && createMenuGroup('reoveryGroup', [
!recoveryInfo && (
@@ -318,54 +328,63 @@ function Account ({ account: { address, meta }, className = '', delegation, filt
),
{t('Initiate recovery for another')}
- ]),
+ ], t('Recovery')),
isFunction(api.api.tx.multisig?.asMulti) && isMultisig && createMenuGroup('multisigGroup', [
{t('Multisig approvals')}
- ]),
+ ], t('Multisig')),
isFunction(api.api.query.democracy?.votingOf) && delegation?.accountDelegated && createMenuGroup('undelegateGroup', [
{t('Change democracy delegation')}
,
{t('Undelegate')}
- ]),
- isFunction(api.api.query.democracy?.votingOf) && !delegation?.accountDelegated && createMenuGroup('delegateGroup', [
-
- {t('Delegate democracy votes')}
-
- ]),
- isFunction(api.api.query.proxy?.proxies) && createMenuGroup('proxyGroup', [
-
- {proxy?.[0].length
- ? t('Manage proxies')
- : t('Add proxy')
- }
-
- ]),
+ ], t('Undelegate')),
+ createMenuGroup('delegateGroup', [
+ isFunction(api.api.query.democracy?.votingOf) && !delegation?.accountDelegated && (
+
+
+ {t('Delegate democracy votes')}
+
+ ),
+ isFunction(api.api.query.proxy?.proxies) && (
+
+ {proxy?.[0].length
+ ? t('Manage proxies')
+ : t('Add proxy')
+ }
+
+ )
+ ], t('Delegate')),
isEditable && !api.isDevelopment && createMenuGroup('genesisGroup', [
+
}
diff --git a/packages/page-accounts/src/util.tsx b/packages/page-accounts/src/util.tsx
index 396ed24582..a782432397 100644
--- a/packages/page-accounts/src/util.tsx
+++ b/packages/page-accounts/src/util.tsx
@@ -9,11 +9,15 @@ import React from 'react';
import { Menu } from '@polkadot/react-components';
import { keyring } from '@polkadot/ui-keyring';
-export function createMenuGroup (key: string, items: (React.ReactNode | false | undefined | null)[]): React.ReactNode | null {
+export function createMenuGroup (key: string, items: (React.ReactNode | false | undefined | null)[], header?: string): React.ReactNode | null {
const filtered = items.filter((item): item is React.ReactNode => !!item);
return filtered.length
- ? {filtered}
+ ?
+
+ {header ? {header} : null}
+ {filtered}
+
: null;
}
diff --git a/packages/page-addresses/src/Contacts/Address.tsx b/packages/page-addresses/src/Contacts/Address.tsx
index be4593223f..7c4dfecc50 100644
--- a/packages/page-addresses/src/Contacts/Address.tsx
+++ b/packages/page-addresses/src/Contacts/Address.tsx
@@ -143,10 +143,7 @@ function Address ({ address, className = '', filter, isFavorite, toggleFavorite
}
const PopupDropdown = (
-