Skip to content

Commit

Permalink
Contribution Required Fields Policy: Fix disabled state (#10994)
Browse files Browse the repository at this point in the history
* fix: Required Fields policy to be available only for fiscal hosts

* fix: allow fiscal host to disable requried fields
  • Loading branch information
kewitz authored Feb 7, 2025
1 parent b6bf010 commit 20ed886
Show file tree
Hide file tree
Showing 2 changed files with 116 additions and 109 deletions.
7 changes: 5 additions & 2 deletions components/contribution-flow/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -346,8 +346,11 @@ export const getRequiredInformation = (stepProfile, stepDetails, collective, pro
}
const thresholds = collective?.policies?.CONTRIBUTOR_INFO_THRESHOLDS;
return {
legalName: tier?.requireAddress || tier?.type === TierTypes.TICKET || totalAmount >= thresholds?.legalName,
address: tier?.requireAddress || totalAmount >= thresholds?.address,
legalName:
tier?.requireAddress || tier?.type === TierTypes.TICKET || thresholds?.legalName
? totalAmount >= thresholds?.legalName
: false,
address: tier?.requireAddress || thresholds?.address ? totalAmount >= thresholds?.address : false,
};
};

Expand Down
218 changes: 111 additions & 107 deletions components/edit-collective/sections/Policies.js
Original file line number Diff line number Diff line change
Expand Up @@ -351,118 +351,122 @@ const Policies = ({ collective }) => {
/>
</P>

<div className="mt-4 mb-2 font-bold">
<FormattedMessage defaultMessage="Required Fields" id="Uh5tDl" />
</div>
<div className="flex flex-col gap-2">
<div className="flex flex-col gap-2 rounded-2xl border p-4">
<div className="flex items-center justify-between gap-2">
<div>
<h1 className="text-sm/6 font-bold">
<FormattedMessage defaultMessage="Legal Name" id="LegalName" />
</h1>
<p className="mt-1 text-sm">
<FormattedMessage
defaultMessage="Require the contributor to provide their legal name after a defined amount"
id="/IW5Qr"
{collective.isHost && (
<React.Fragment>
<div className="mt-4 mb-2 font-bold">
<FormattedMessage defaultMessage="Required Fields" id="Uh5tDl" />
</div>
<div className="flex flex-col gap-2">
<div className="flex flex-col gap-2 rounded-2xl border p-4">
<div className="flex items-center justify-between gap-2">
<div>
<h1 className="text-sm/6 font-bold">
<FormattedMessage defaultMessage="Legal Name" id="LegalName" />
</h1>
<p className="mt-1 text-sm">
<FormattedMessage
defaultMessage="Require the contributor to provide their legal name after a defined amount"
id="/IW5Qr"
/>
</p>
</div>
<Switch
name={`checkbox-CONTRIBUTOR_INFO_THRESHOLDS-legalName`}
checked={!isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.legalName)}
onCheckedChange={checked => {
const newPolicies = cloneDeep(formik.values.policies);
if (checked) {
set(newPolicies, 'CONTRIBUTOR_INFO_THRESHOLDS.legalName', 0);
} else if (!isNil(newPolicies.CONTRIBUTOR_INFO_THRESHOLDS?.legalName)) {
delete newPolicies.CONTRIBUTOR_INFO_THRESHOLDS?.legalName;
}
formik.setFieldValue('policies', newPolicies);
}}
/>
</div>
{!isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.legalName) && (
<StyledInputAmount
className="mt-2 sm:max-w-1/3"
maxWidth="11em"
placeholder="0"
suffix={<FormattedMessage defaultMessage="/ year" id="8hNOud" />}
disabled={
isSettingPolicies ||
authorCannotApproveExpenseEnforcedByHost ||
isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.legalName)
}
currency={data?.account?.currency}
currencyDisplay="CODE"
value={formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.legalName || 0}
onChange={value =>
!isNil(value) &&
formik.setFieldValue('policies', {
...formik.values.policies,
['CONTRIBUTOR_INFO_THRESHOLDS']: {
...formik.values.policies?.['CONTRIBUTOR_INFO_THRESHOLDS'],
legalName: value || 0,
},
})
}
/>
</p>
)}
</div>
<Switch
name={`checkbox-CONTRIBUTOR_INFO_THRESHOLDS-legalName`}
checked={!isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.legalName)}
onCheckedChange={checked => {
const newPolicies = cloneDeep(formik.values.policies);
if (checked) {
set(newPolicies, 'CONTRIBUTOR_INFO_THRESHOLDS.legalName', 0);
} else if (!isNil(newPolicies.CONTRIBUTOR_INFO_THRESHOLDS?.legalName)) {
delete newPolicies.CONTRIBUTOR_INFO_THRESHOLDS?.legalName;
}
formik.setFieldValue('policies', newPolicies);
}}
/>
</div>
{!isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.legalName) && (
<StyledInputAmount
className="mt-2 sm:max-w-1/3"
maxWidth="11em"
placeholder="0"
suffix={<FormattedMessage defaultMessage="/ year" id="8hNOud" />}
disabled={
isSettingPolicies ||
authorCannotApproveExpenseEnforcedByHost ||
isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.legalName)
}
currency={data?.account?.currency}
currencyDisplay="CODE"
value={formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.legalName || 0}
onChange={value =>
!isNil(value) &&
formik.setFieldValue('policies', {
...formik.values.policies,
['CONTRIBUTOR_INFO_THRESHOLDS']: {
...formik.values.policies?.['CONTRIBUTOR_INFO_THRESHOLDS'],
legalName: value || 0,
},
})
}
/>
)}
</div>
<div className="flex flex-col gap-2 rounded-2xl border p-4">
<div className="flex items-center justify-between gap-2">
<div>
<h1 className="text-sm/6 font-bold">
<FormattedMessage defaultMessage="Physical Address" id="OQhu3R" />
</h1>
<p className="mt-1 text-sm">
<FormattedMessage
defaultMessage="Require the contributor to provide their registered address after a defined amount"
id="kyyHU5"
<div className="flex flex-col gap-2 rounded-2xl border p-4">
<div className="flex items-center justify-between gap-2">
<div>
<h1 className="text-sm/6 font-bold">
<FormattedMessage defaultMessage="Physical Address" id="OQhu3R" />
</h1>
<p className="mt-1 text-sm">
<FormattedMessage
defaultMessage="Require the contributor to provide their registered address after a defined amount"
id="kyyHU5"
/>
</p>
</div>
<Switch
name={`checkbox-CONTRIBUTOR_INFO_THRESHOLDS-address`}
checked={!isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.address)}
onCheckedChange={checked => {
const newPolicies = cloneDeep(formik.values.policies);
if (checked) {
set(newPolicies, 'CONTRIBUTOR_INFO_THRESHOLDS.address', 0);
} else if (!isNil(newPolicies.CONTRIBUTOR_INFO_THRESHOLDS?.address)) {
delete newPolicies.CONTRIBUTOR_INFO_THRESHOLDS?.address;
}
formik.setFieldValue('policies', newPolicies);
}}
/>
</p>
</div>
{!isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.address) && (
<StyledInputAmount
className="mt-2 sm:max-w-1/3"
placeholder="0"
suffix={<FormattedMessage defaultMessage="/ year" id="8hNOud" />}
maxWidth="11em"
disabled={
isSettingPolicies ||
authorCannotApproveExpenseEnforcedByHost ||
isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.address)
}
currency={data?.account?.currency}
currencyDisplay="CODE"
value={formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.address || 0}
onChange={value =>
formik.setFieldValue('policies', {
...formik.values.policies,
['CONTRIBUTOR_INFO_THRESHOLDS']: {
...formik.values.policies?.['CONTRIBUTOR_INFO_THRESHOLDS'],
address: value || 0,
},
})
}
/>
)}
</div>
<Switch
name={`checkbox-CONTRIBUTOR_INFO_THRESHOLDS-address`}
checked={!isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.address)}
onCheckedChange={checked => {
const newPolicies = cloneDeep(formik.values.policies);
if (checked) {
set(newPolicies, 'CONTRIBUTOR_INFO_THRESHOLDS.address', 0);
} else if (!isNil(newPolicies.CONTRIBUTOR_INFO_THRESHOLDS?.address)) {
delete newPolicies.CONTRIBUTOR_INFO_THRESHOLDS?.address;
}
formik.setFieldValue('policies', newPolicies);
}}
/>
</div>
{!isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.address) && (
<StyledInputAmount
className="mt-2 sm:max-w-1/3"
placeholder="0"
suffix={<FormattedMessage defaultMessage="/ year" id="8hNOud" />}
maxWidth="11em"
disabled={
isSettingPolicies ||
authorCannotApproveExpenseEnforcedByHost ||
isNil(formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.address)
}
currency={data?.account?.currency}
currencyDisplay="CODE"
value={formik.values.policies?.CONTRIBUTOR_INFO_THRESHOLDS?.address || 0}
onChange={value =>
formik.setFieldValue('policies', {
...formik.values.policies,
['CONTRIBUTOR_INFO_THRESHOLDS']: {
...formik.values.policies?.['CONTRIBUTOR_INFO_THRESHOLDS'],
address: value || 0,
},
})
}
/>
)}
</div>
</div>
</React.Fragment>
)}
</Container>

<SettingsSectionTitle>{formatMessage(messages['expensePolicy.label'])}</SettingsSectionTitle>
Expand Down

0 comments on commit 20ed886

Please sign in to comment.