frontend/src/components/teamsAndOrgs/campaigns.js (120 lines of code) (raw):
import React from 'react';
import { Link } from '@reach/router';
import { FormattedMessage } from 'react-intl';
import { Form, Field } from 'react-final-form';
import messages from './messages';
import { Management } from './management';
import { Button } from '../button';
import { HashtagIcon } from '../svgIcons';
export function CampaignsManagement({ campaigns, userDetails }: Object) {
return (
<Management
title={
<FormattedMessage
{...messages.manage}
values={{ entity: <FormattedMessage {...messages.campaigns} /> }}
/>
}
showAddButton={userDetails.role === 'ADMIN'}
managementView
>
{campaigns.length ? (
campaigns.map((campaign, n) => <CampaignCard campaign={campaign} key={n} />)
) : (
<div>
<FormattedMessage {...messages.noCampaigns} />
</div>
)}
</Management>
);
}
export function CampaignCard({ campaign }: Object) {
return (
<Link to={`${campaign.id}/`} className="w-50-ns w-100 fl pr3">
<div className="cf bg-white blue-dark br1 mv2 pv4 ph3 ba br1 b--grey-light shadow-hover">
<div className="dib v-mid pr3">
<div className="z-1 fl br-100 tc h2 w2 bg-blue-light white">
<span className="relative w-50 dib">
<HashtagIcon style={{ paddingTop: '0.4175rem' }} />
</span>
</div>
</div>
<h3 className="f3 mv0 dib v-mid">{campaign.name}</h3>
</div>
</Link>
);
}
export function CampaignInformation(props) {
const labelClasses = 'db pt3 pb2';
const fieldClasses = 'blue-grey w-100 pv3 ph2 input-reset ba b--grey-light bg-transparent';
return (
<>
<div className="cf">
<label className={labelClasses}>
<FormattedMessage {...messages.name} />
</label>
<Field name="name" component="input" type="text" className={fieldClasses} required />
</div>
</>
);
}
export function CampaignForm({
userDetails,
campaign,
updateCampaignAsync,
disabled,
disableErrorAlert,
}) {
return (
<Form
onSubmit={(values) => updateCampaignAsync.execute(values)}
initialValues={campaign}
render={({
handleSubmit,
dirty,
submitSucceeded,
dirtySinceLastSubmit,
form,
submitting,
values,
}) => {
const dirtyForm = submitSucceeded ? dirtySinceLastSubmit && dirty : dirty;
if (dirtySinceLastSubmit) {
disableErrorAlert();
}
return (
<div className="blue-grey mb3">
<div className={`bg-white b--grey-light pa4 ${dirtyForm ? 'bt bl br' : 'ba'}`}>
<h3 className="f3 fw6 dib blue-dark mv0">
<FormattedMessage {...messages.campaignInfo} />
</h3>
<form id="campaign-form" onSubmit={handleSubmit}>
<fieldset className="bn pa0" disabled={submitting || disabled}>
<CampaignInformation />
</fieldset>
</form>
</div>
{dirtyForm && (
<div className="cf pt0 h3">
<div className="w-70-l w-50 fl tr dib bg-grey-light">
<Button className="blue-dark bg-grey-light h3" onClick={() => form.restart()}>
<FormattedMessage {...messages.cancel} />
</Button>
</div>
<div className="w-30-l w-50 h-100 fr dib">
<Button
onClick={() => handleSubmit()}
className="w-100 h-100 bg-primary white"
disabledClassName="bg-primary o-50 white w-100 h-100"
loading={updateCampaignAsync.status === 'pending'}
disabled={updateCampaignAsync.status === 'pending'}
>
<FormattedMessage {...messages.save} />
</Button>
</div>
</div>
)}
</div>
);
}}
></Form>
);
}