From 5a1c3823caf203f32eede7118ce57775cf46ba9d Mon Sep 17 00:00:00 2001 From: Jaco Date: Sun, 4 Dec 2022 20:40:49 +0200 Subject: [PATCH] Allow selection of origin for track (when multiples) (#8473) --- packages/apps-config/src/api/params/tracks.ts | 19 ++++++++-- .../page-referenda/src/Referenda/Submit.tsx | 38 ++++++++++++++++++- packages/page-referenda/src/util.ts | 4 +- 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/packages/apps-config/src/api/params/tracks.ts b/packages/apps-config/src/api/params/tracks.ts index 07edbb2a15..3e9922d157 100644 --- a/packages/apps-config/src/api/params/tracks.ts +++ b/packages/apps-config/src/api/params/tracks.ts @@ -5,10 +5,12 @@ import type { ApiPromise } from '@polkadot/api'; import { KUSAMA_GENESIS } from '../constants'; +type Origin = { system: string } | { Origins: string }; + interface TrackInfo { id: number; name: string; - origin: { system: string } | { Origins: string }; + origin: Origin | Origin[]; text?: string; } @@ -36,7 +38,10 @@ const KUSAMA: Record = { { id: 3, name: 'fellows', - origin: { Origins: 'Fellowship3Dan' }, + origin: [ + { Origins: 'Fellowship3Dan' }, + { Origins: 'Fellows' } + ], text: 'Origin commanded by Polkadot Fellows (3rd Dan fellows or greater)' }, { @@ -48,7 +53,10 @@ const KUSAMA: Record = { { id: 5, name: 'experts', - origin: { Origins: 'Fellowship5Dan' }, + origin: [ + { Origins: 'Fellowship5Dan' }, + { Origins: 'FellowshipExperts' } + ], text: 'Origin commanded by Polkadot Experts (5th Dan fellows or greater)' }, { @@ -60,7 +68,10 @@ const KUSAMA: Record = { { id: 7, name: 'masters', - origin: { Origins: 'Fellowship7Dan' }, + origin: [ + { Origins: 'Fellowship7Dan' }, + { Origins: 'FellowshipMasters' } + ], text: 'Origin commanded by Polkadot Masters (7th Dan fellows of greater)' }, { diff --git a/packages/page-referenda/src/Referenda/Submit.tsx b/packages/page-referenda/src/Referenda/Submit.tsx index bb9abd2035..3d54a88f00 100644 --- a/packages/page-referenda/src/Referenda/Submit.tsx +++ b/packages/page-referenda/src/Referenda/Submit.tsx @@ -110,6 +110,23 @@ function Submit ({ className = '', isMember, members, palletReferenda, tracks }: [api, palletReferenda] ); + const originOptions = useMemo( + () => trackInfo && Array.isArray(trackInfo.origin) + ? trackInfo.origin.map((records, index) => ({ + text: Object.values(records)[0], + value: index + 1 + })) + : null, + [trackInfo] + ); + + const selectedOrigin = useMemo( + () => !trackInfo?.origin || Array.isArray(trackInfo?.origin) + ? origin + : trackInfo.origin, + [origin, trackInfo] + ); + const trackOpts = useMemo( () => tracks && tracks.map(([id, track]) => ({ text: getTrackName(id, track), @@ -118,6 +135,15 @@ function Submit ({ className = '', isMember, members, palletReferenda, tracks }: [tracks] ); + const _onChangeOriginMulti = useCallback( + (value: number) => setOrigin( + trackInfo && Array.isArray(trackInfo.origin) + ? trackInfo.origin[value - 1] + : null + ), + [trackInfo] + ); + const _onChangeOrigin = useCallback( ([{ isValid, value }]: RawParam[]) => setOrigin(isValid ? value : null), @@ -192,6 +218,14 @@ function Submit ({ className = '', isMember, members, palletReferenda, tracks }: params={originType} /> )} + {originOptions && ( + ('track origin')} + onChange={_onChangeOriginMulti} + options={originOptions} + /> + )} {bestNumber && defaultAtAfter && ( ('The moment of enactment, either at a specific block, or after a specific block. Currently at #{{bestNumber}}, the selected block should be after the current best.', { replace: { bestNumber: formatNumber(bestNumber) } })}> @@ -217,10 +251,10 @@ function Submit ({ className = '', isMember, members, palletReferenda, tracks }: ('Submit proposal')} onStart={toggleSubmit} - params={[trackInfo?.origin || origin, { Lookup: { hash: preimage?.proposalHash, len: preimage?.proposalLength } }, atAfter]} + params={[selectedOrigin, { Lookup: { hash: preimage?.proposalHash, len: preimage?.proposalLength } }, atAfter]} tx={api.tx[palletReferenda as 'referenda'].submit} /> diff --git a/packages/page-referenda/src/util.ts b/packages/page-referenda/src/util.ts index 9e14f2c12f..1a36cf31ab 100644 --- a/packages/page-referenda/src/util.ts +++ b/packages/page-referenda/src/util.ts @@ -20,8 +20,8 @@ export function getTrackName (trackId: BN, { name }: PalletReferendaTrackInfo): }`; } -export function getTrackInfo (api: ApiPromise, specName: string, palletReferenda: string, tracks?: [BN, PalletReferendaTrackInfo][], trackId?: number): { origin: Record, text?: string } | undefined { - let info: { origin: Record, text?: string } | undefined; +export function getTrackInfo (api: ApiPromise, specName: string, palletReferenda: string, tracks?: [BN, PalletReferendaTrackInfo][], trackId?: number): { origin: Record | Record[], text?: string } | undefined { + let info: { origin: Record | Record[], text?: string } | undefined; if (tracks && trackId !== undefined) { const originMap = getGovernanceTracks(api, specName, palletReferenda);