Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Pi plugin enhancements #2823

Merged
merged 30 commits into from Aug 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
c9396e2
feat(pi): fetch pi summaries on home page
victorgcramos Jul 20, 2022
79876ef
feat(app/pi): status tag from proposals summaries
victorgcramos Jul 20, 2022
4fab453
style: improve readability
victorgcramos Jul 20, 2022
19f664d
style: improve naming
victorgcramos Jul 20, 2022
0bb3770
wip(pi): add proposal billing status changes
victorgcramos Jul 20, 2022
bcdfbb0
feat(pi): add billing slice
victorgcramos Jul 21, 2022
a375745
feat(app/pi): billing status on approved tab
victorgcramos Jul 21, 2022
b5a6c5a
feat(pi): add billing status changes service
victorgcramos Jul 21, 2022
b50a3e6
feat(app/pi): load billing changes on approved tab
victorgcramos Jul 21, 2022
b5c6e41
test(pi): billing slice unit tests
victorgcramos Jul 21, 2022
2b0f3ce
feat(app/pi): load billing changes on Details page
victorgcramos Jul 21, 2022
4dd44a8
feat(app/pi): billing change reason on Details pg
victorgcramos Jul 21, 2022
57c6951
feat: show billing status changes reason
victorgcramos Jul 22, 2022
86b13c0
feat(pi): proposals service initial scope
victorgcramos Jul 22, 2022
a55d30a
feat(app/pi): use utils from pi proposals service
victorgcramos Jul 22, 2022
8484426
wip: proposal status change selector
victorgcramos Jul 25, 2022
4166529
wip: Proposal Status changes
victorgcramos Jul 26, 2022
b9ad534
fix: remove abandonment reason from proposal utils
victorgcramos Jul 27, 2022
f86a622
fix: get proposal status changes from selector
victorgcramos Jul 27, 2022
789492f
style(ticketvote): improve naming on utils
victorgcramos Jul 27, 2022
7e440b4
style: cleanup unused code
victorgcramos Jul 27, 2022
a0ff4e4
fix(ticketvote): vote status changes cleanup
victorgcramos Jul 28, 2022
917e50a
feat: proposal status changes service
victorgcramos Jul 28, 2022
9298bd7
feat(common-ui): improve RecordCard grid
victorgcramos Jul 29, 2022
85c0279
fix(common-ui): Event prop 'event' node
victorgcramos Jul 29, 2022
7c37b78
feat(ticketvote): improve summary status changes
victorgcramos Jul 29, 2022
2796a79
feat: Add proposal status changes timestamps
victorgcramos Jul 29, 2022
19b05a3
fix: record card styles for status tag description
victorgcramos Aug 2, 2022
98550e2
fix(ticketvote): use correct vote status changes
victorgcramos Aug 2, 2022
19dd4e9
fix: use correct timestamps for status changes
victorgcramos Aug 2, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -10,7 +10,11 @@ import {
RecordCard,
ThumbnailGrid,
} from "@politeiagui/common-ui";
import { decodeProposalRecord, getFilesDiff, getImagesByDigest } from "./utils";
import {
decodeProposalRecord,
getFilesDiff,
getImagesByDigest,
} from "../../pi/proposals/utils";
import { ProposalDownloads } from "./common";
import styles from "./ModalProposalDiff.module.css";
import range from "lodash/range";
Expand Down Expand Up @@ -54,7 +58,7 @@ function AttachmentsDiff({ newFiles, oldFiles }) {

function VersionSelector({ maxVersion, onChange, current, minVersion = 1 }) {
const options = range(maxVersion, minVersion - 1, -1).map((v) => ({
label: `version ${v}`,
label: `v${v}`,
value: v,
}));
function getValueOption(value) {
Expand Down Expand Up @@ -250,7 +254,7 @@ function ProposalDiff({
setDiffView={setIsMarkdownView}
/>
}
subtitle={
secondRow={
<VersionsInfo
oldProposal={oldProposal}
newProposal={newProposal}
Expand Down
Expand Up @@ -20,6 +20,7 @@
border-bottom: 0.1rem solid var(--separator-color);
/* Stick on top without extra margin */
top: -3rem;
z-index: 10;
}

.filesDiffWrapper {
Expand Down Expand Up @@ -72,6 +73,7 @@
display: flex;
justify-content: space-between;
width: 100%;
padding-top: 2rem;
}

.versionsInfo > *:last-child {
Expand Down
@@ -1,15 +1,27 @@
import React from "react";
import { Button, StatusTag } from "pi-ui";
import { Button } from "pi-ui";
import { RecordCard } from "@politeiagui/common-ui";
import { CommentsCount } from "@politeiagui/comments/ui";
import { getShortToken } from "@politeiagui/core/records/utils";
import { decodeProposalRecord, getLegacyProposalStatusTagProps } from "./utils";
import { ProposalStatusBar, ProposalSubtitle } from "./common";
import { decodeProposalRecord } from "../../pi/proposals/utils";
import {
ProposalStatusBar,
ProposalStatusLabel,
ProposalStatusTag,
ProposalSubtitle,
} from "./common";

const ProposalCard = ({ record, voteSummary, commentsCount }) => {
const ProposalCard = ({
record,
voteSummary,
commentsCount,
proposalSummary,
proposalStatusChanges,
}) => {
const proposal = decodeProposalRecord(record);
const statusTagProps = getLegacyProposalStatusTagProps(record, voteSummary);
const proposalLink = `/record/${getShortToken(proposal.token)}`;
const currentStatusChange =
proposalSummary && proposalStatusChanges?.[proposalSummary.status];
return (
<div>
<RecordCard
Expand All @@ -25,7 +37,10 @@ const ProposalCard = ({ record, voteSummary, commentsCount }) => {
version={proposal.version}
/>
}
rightHeader={<StatusTag {...statusTagProps} />}
rightHeader={<ProposalStatusTag proposalSummary={proposalSummary} />}
rightHeaderSubtitle={
<ProposalStatusLabel statusChange={currentStatusChange} />
}
secondRow={<ProposalStatusBar voteSummary={voteSummary} />}
footer={
<>
Expand Down
Expand Up @@ -8,11 +8,15 @@ import {
ThumbnailGrid,
useModal,
} from "@politeiagui/common-ui";
import { decodeProposalRecord, getImagesByDigest } from "./utils";
import {
decodeProposalRecord,
getImagesByDigest,
} from "../../pi/proposals/utils";
import {
ProposalDownloads,
ProposalMetadata,
ProposalStatusBar,
ProposalStatusLabel,
ProposalStatusTag,
ProposalSubtitle,
} from "./common";
Expand All @@ -24,8 +28,9 @@ import ModalProposalDiff from "./ModalProposalDiff";
const ProposalDetails = ({
record,
voteSummary,
piSummary,
proposalSummary,
onFetchRecordTimestamps,
proposalStatusChanges,
}) => {
const [open] = useModal();

Expand Down Expand Up @@ -61,11 +66,15 @@ const ProposalDetails = ({

const isAbandoned = proposalDetails.archived || proposalDetails.censored;

const currentStatusChange =
proposalSummary && proposalStatusChanges?.[proposalSummary.status];

return (
<div>
{isAbandoned && (
{currentStatusChange?.reason && (
<Message kind="warning">
Reason: {proposalDetails.abandonmentReason}
<div>Proposal is {currentStatusChange.status}.</div>
<div>Reason: {currentStatusChange.reason}</div>
</Message>
)}
<RecordCard
Expand All @@ -82,7 +91,10 @@ const ProposalDetails = ({
onChangeVersion={handleChangeVersion}
/>
}
rightHeader={<ProposalStatusTag piSummary={piSummary} />}
rightHeader={<ProposalStatusTag proposalSummary={proposalSummary} />}
rightHeaderSubtitle={
<ProposalStatusLabel statusChange={currentStatusChange} />
}
secondRow={
<div className={styles.secondRow}>
<RecordToken token={proposalDetails.token} isCopyable={true} />
Expand Down
@@ -1,6 +1,6 @@
import React from "react";
import { TicketvoteRecordVoteStatusBar } from "@politeiagui/ticketvote/ui";
import { showVoteStatusBar } from "../utils";
import { showVoteStatusBar } from "../../../pi/proposals/utils";

function ProposalStatusBar({ voteSummary }) {
return (
Expand Down
@@ -0,0 +1,36 @@
import React from "react";
import { Event } from "@politeiagui/common-ui";
import { Tooltip } from "pi-ui";
import styles from "./styles.module.css";
import { getProposalStatusDescription } from "../../../pi/proposals/utils";

function ProposalStatusLabel({ statusChange }) {
if (!statusChange) return null;
const { event, description } = getProposalStatusDescription(statusChange);
return (
<div className={styles.statusLabelWrapper}>
{event && (
<Event
event={event}
timestamp={statusChange.timestamp}
className={styles.statusLabel}
/>
)}
{description && (
<div className={styles.statusLabelText}>{description}</div>
)}
{statusChange.blocksCount > 0 && (
<Tooltip
content={`${statusChange.startblockheight} to ${statusChange.endblockheight}`}
placement="bottom"
contentClassName={styles.statusLabelTooltip}
className={styles.statusLabelText}
>
{statusChange.blocksCount} blocks left
</Tooltip>
)}
</div>
);
}

export default ProposalStatusLabel;
@@ -1,10 +1,10 @@
import React from "react";
import { StatusTag } from "pi-ui";
import { getProposalStatusTagProps } from "../utils";
import { getProposalStatusTagProps } from "../../../pi/proposals/utils";

function ProposalStatusTag({ piSummary }) {
const statusTagProps = getProposalStatusTagProps(piSummary);
return <StatusTag {...statusTagProps} />;
function ProposalStatusTag({ proposalSummary }) {
const { text, type } = getProposalStatusTagProps(proposalSummary);
return <StatusTag text={text} type={type} />;
}

export default ProposalStatusTag;
Expand Up @@ -12,14 +12,12 @@ function ProposalSubtitle({
timestamps = {},
onChangeVersion,
}) {
const { publishedat, editedat, abandonedat, censoredat } = timestamps;
const { publishedat, editedat } = timestamps;
return (
<Join>
<Link href={`user/${userid}`}>{username}</Link>
{publishedat && <Event event="published" timestamp={publishedat} />}
{editedat && <Event event="edited" timestamp={editedat} />}
{abandonedat && <Event event="abandoned" timestamp={abandonedat} />}
{censoredat && <Event event="censored" timestamp={censoredat} />}
{version > 1 &&
(onChangeVersion ? (
<Dropdown
Expand Down
@@ -1,5 +1,6 @@
export { default as ProposalDownloads } from "./ProposalDownloads";
export { default as ProposalMetadata } from "./ProposalMetadata";
export { default as ProposalStatusBar } from "./ProposalStatusBar";
export { default as ProposalStatusLabel } from "./ProposalStatusLabel";
export { default as ProposalStatusTag } from "./ProposalStatusTag";
export { default as ProposalSubtitle } from "./ProposalSubtitle";
@@ -1,3 +1,34 @@
.version {
color: var(--text-secondary-color);
}

.statusLabelWrapper {
position: absolute;
right: var(--container-padding-right);
display: flex;
flex-flow: column;
}

.statusLabel {
font-size: var(--font-size-small);
}

.statusLabelTooltip {
width: max-content;
}

.statusLabelText {
font-size: var(--font-size-small);
color: var(--text-secondary-color);
}

@media screen and (max-width: 768px) {
.statusLabelWrapper {
top: 2.3rem;
flex-flow: row;
}
.statusLabelText::before {
content: "•";
padding: 0 0.5rem;
}
}
8 changes: 6 additions & 2 deletions plugins-structure/apps/politeia/src/pages/Details/Details.js
Expand Up @@ -25,12 +25,14 @@ function Details({ token }) {
detailsStatus,
fullToken,
onFetchRecordTimestamps,
piSummary,
proposalSummary,
record,
voteSummary,
recordDetailsError,
voteSummaryError,
commentsError,
billingStatusChange,
proposalStatusChanges,
} = useProposalDetails({ token });
// TODO: this can be moved somewhere else
const params = getURLSearchParams();
Expand All @@ -49,7 +51,9 @@ function Details({ token }) {
<ProposalDetails
record={record}
voteSummary={voteSummary}
piSummary={piSummary}
proposalSummary={proposalSummary}
billingStatusChange={billingStatusChange}
proposalStatusChanges={proposalStatusChanges}
onFetchRecordTimestamps={onFetchRecordTimestamps}
/>
{comments && (
Expand Down
23 changes: 22 additions & 1 deletion plugins-structure/apps/politeia/src/pages/Details/index.js
Expand Up @@ -2,7 +2,11 @@ import App from "../../app";
import { routeCleanup } from "../../utils/routeCleanup";
import { createRouteView } from "../../utils/createRouteView";
import {
fetchBillingStatusChangesListenerCreator,
fetchDetailsListenerCreator,
fetchProposalSummaryListenerCreator,
fetchRecordDetailsListenerCreator,
fetchVoteSummaryListenerCreator,
recordFetchDetailsListenerCreator,
} from "./listeners";
import Details from "./Details";
Expand All @@ -29,9 +33,26 @@ export default App.createRoute({
listenerCreator: fetchDetailsListenerCreator,
},
{
id: "pi/summaries",
id: "pi/summaries/single",
listenerCreator: fetchDetailsListenerCreator,
},
{
id: "pi/billingStatusChanges/single",
listenerCreator: fetchProposalSummaryListenerCreator,
},
// Proposal status changes services
{
id: "pi/proposals/voteStatusChanges",
listenerCreator: fetchVoteSummaryListenerCreator,
},
{
id: "pi/proposals/recordStatusChanges",
listenerCreator: fetchRecordDetailsListenerCreator,
},
{
id: "pi/proposals/billingStatusChanges",
listenerCreator: fetchBillingStatusChangesListenerCreator,
},
],
cleanup: routeCleanup,
view: createRouteView(Details),
Expand Down