diff --git a/packages/shared/components/Proposals.svelte b/packages/shared/components/Proposals.svelte index 9dcec471e5d..8d1334af29e 100644 --- a/packages/shared/components/Proposals.svelte +++ b/packages/shared/components/Proposals.svelte @@ -3,14 +3,13 @@ import { localize } from '@core/i18n' import { FontWeight } from './enums' import { IProposal } from '@contexts/governance/interfaces' - import { proposalFilter } from '@contexts/governance' - import { isVisibleProposal } from '@contexts/governance/utils/isVisibleProposal' + import { proposalFilter } from '@contexts/governance/stores' + import { isVisibleProposal, sortProposals } from '@contexts/governance/utils' export let proposals: IProposal[] = [] - $: sortedProposals = proposals - .filter((proposal) => isVisibleProposal(proposal, $proposalFilter)) - .sort((a, b) => (a.id < b.id ? -1 : 1)) + $: visibleProposals = proposals.filter((proposal) => isVisibleProposal(proposal, $proposalFilter)) + $: sortedProposals = sortProposals(visibleProposals, $proposalFilter) diff --git a/packages/shared/lib/contexts/governance/enums/index.ts b/packages/shared/lib/contexts/governance/enums/index.ts index ffcf5ed17a2..14f458457a2 100644 --- a/packages/shared/lib/contexts/governance/enums/index.ts +++ b/packages/shared/lib/contexts/governance/enums/index.ts @@ -1,2 +1,3 @@ -export * from './proposal-type.enum' +export * from './proposal-order-option.enum' export * from './proposal-status.enum' +export * from './proposal-type.enum' diff --git a/packages/shared/lib/contexts/governance/enums/proposal-order-option.enum.ts b/packages/shared/lib/contexts/governance/enums/proposal-order-option.enum.ts new file mode 100644 index 00000000000..7e3a7e71f91 --- /dev/null +++ b/packages/shared/lib/contexts/governance/enums/proposal-order-option.enum.ts @@ -0,0 +1,4 @@ +export enum ProposalOrderOption { + Phase = 'phase', + Name = 'name', +} diff --git a/packages/shared/lib/contexts/governance/interfaces/proposal-filter.interface.ts b/packages/shared/lib/contexts/governance/interfaces/proposal-filter.interface.ts index 8b6a5184588..487b2009590 100644 --- a/packages/shared/lib/contexts/governance/interfaces/proposal-filter.interface.ts +++ b/packages/shared/lib/contexts/governance/interfaces/proposal-filter.interface.ts @@ -1,7 +1,8 @@ -import { SelectionFilterUnit } from '@core/utils/interfaces/filter/filter-unit.interface' +import { OrderFilterUnit, SelectionFilterUnit } from '@core/utils/interfaces/filter/filter-unit.interface' export interface ProposalFilter { phase: SelectionFilterUnit type: SelectionFilterUnit participated: SelectionFilterUnit + order: OrderFilterUnit } diff --git a/packages/shared/lib/contexts/governance/stores/proposal-filter.store.ts b/packages/shared/lib/contexts/governance/stores/proposal-filter.store.ts index 86d100834e7..f475e1c44a6 100644 --- a/packages/shared/lib/contexts/governance/stores/proposal-filter.store.ts +++ b/packages/shared/lib/contexts/governance/stores/proposal-filter.store.ts @@ -1,6 +1,6 @@ -import { BooleanFilterOption } from '@core/utils/enums/filters' +import { BooleanFilterOption, OrderOption } from '@core/utils/enums/filters' import { writable, Writable } from 'svelte/store' -import { ProposalFilter, ProposalStatus, ProposalType } from '..' +import { ProposalFilter, ProposalStatus, ProposalType, ProposalOrderOption } from '..' export const proposalFilter: Writable = writable({ phase: { @@ -25,4 +25,12 @@ export const proposalFilter: Writable = writable({ selected: BooleanFilterOption.Yes, choices: [BooleanFilterOption.Yes, BooleanFilterOption.No], }, + order: { + active: false, + type: 'order', + localeKey: 'filters.proposalOrder', + selected: ProposalOrderOption.Name, + ascDesc: OrderOption.Asc, + choices: [ProposalOrderOption.Name, ProposalOrderOption.Phase], + }, }) diff --git a/packages/shared/lib/contexts/governance/utils/index.ts b/packages/shared/lib/contexts/governance/utils/index.ts index 3420c7f2852..b4bd00a5d1b 100644 --- a/packages/shared/lib/contexts/governance/utils/index.ts +++ b/packages/shared/lib/contexts/governance/utils/index.ts @@ -11,5 +11,7 @@ export * from './isProposalActive' export * from './isProposalAlreadyAdded' export * from './isSelectedAccountVoting' export * from './isValidProposalId' +export * from './isVisibleProposal' export * from './isVotingForProposal' export * from './isVotingForSelectedProposal' +export * from './sortProposals' diff --git a/packages/shared/lib/contexts/governance/utils/sortProposals.ts b/packages/shared/lib/contexts/governance/utils/sortProposals.ts new file mode 100644 index 00000000000..9fc4c759e75 --- /dev/null +++ b/packages/shared/lib/contexts/governance/utils/sortProposals.ts @@ -0,0 +1,36 @@ +import { OrderOption } from '@core/utils/enums/filters' +import { ProposalOrderOption, ProposalStatus } from '../enums' +import { IProposal, ProposalFilter } from '../interfaces' + +export function sortProposals(proposals: IProposal[], filter: ProposalFilter): IProposal[] { + let orderFunction = sortByName + let isAscending = true + + if (filter.order.active) { + switch (filter.order.selected) { + case ProposalOrderOption.Name: + orderFunction = sortByName + break + case ProposalOrderOption.Phase: + orderFunction = sortByPhase + break + } + isAscending = filter.order.ascDesc === OrderOption.Asc + } + + return proposals?.sort((proposal1, proposal2) => orderFunction(proposal1, proposal2, isAscending)) ?? [] +} + +function sortByName(proposal1: IProposal, proposal2: IProposal, asc: boolean): number { + return proposal1.title.toLowerCase() > proposal2.title.toLowerCase() ? (asc ? 1 : -1) : asc ? -1 : 1 +} + +function sortByPhase(proposal1: IProposal, proposal2: IProposal, asc: boolean): number { + const phaseOrdering = { + [ProposalStatus.Upcoming]: 0, + [ProposalStatus.Commencing]: 1, + [ProposalStatus.Holding]: 2, + [ProposalStatus.Ended]: 3, + } + return phaseOrdering[proposal1.status] > phaseOrdering[proposal2.status] ? (asc ? 1 : -1) : asc ? -1 : 1 +} diff --git a/packages/shared/locales/en.json b/packages/shared/locales/en.json index 6769545a08e..aa7579fc408 100644 --- a/packages/shared/locales/en.json +++ b/packages/shared/locales/en.json @@ -1589,6 +1589,11 @@ "label": "Participated", "yes": "Yes", "no": "No" + }, + "proposalOrder": { + "label": "Order", + "name": "Name", + "phase": "Phase" } }, "dates": {