in frontend/src/views/projectEdit.js [55:194]
export default function ProjectEdit({ id }) {
useSetTitleTag(`Edit project #${id}`);
const [errorLanguages, loadingLanguages, languages] = useFetch('system/languages/');
const mandatoryFields = ['name', 'shortDescription', 'description', 'instructions'];
const token = useSelector((state) => state.auth.get('token'));
const [error, setError] = useState(null);
const [success, setSuccess] = useState(false);
const [option, setOption] = useState('description');
const [projectInfo, setProjectInfo] = useState({
mappingTypes: [],
mappingEditors: [],
validationEditors: [],
organisation: '',
teams: [],
projectInfoLocales: [
{
locale: '',
name: '',
shortDescription: '',
description: '',
instructions: '',
perTaskInstructions: '',
},
],
rapidPowerUser: false,
});
const [userCanEditProject] = useEditProjectAllowed(projectInfo);
const supportedLanguages =
!errorLanguages && !loadingLanguages ? languages.supportedLanguages : [];
useLayoutEffect(() => {
setSuccess(false);
setError(null);
}, [projectInfo, option]);
useLayoutEffect(() => {
async function fetchData() {
try {
const res = await fetchLocalJSONAPI(`projects/${id}/`, token, 'GET');
setProjectInfo(res);
} catch (e) {}
}
fetchData();
}, [id, token]);
const saveChanges = (resolve, reject) => {
const [defaultLocaleInfo] = projectInfo.projectInfoLocales.filter(
(l) => l.locale === projectInfo.defaultLocale,
);
// Get data for default locale.
let missingFields = [];
if (defaultLocaleInfo === undefined) {
missingFields.push({
locale: projectInfo.defaultLocale,
fields: mandatoryFields,
});
} else {
const mandatoryFieldsMissing = mandatoryFields.filter(
(m) => Object.keys(defaultLocaleInfo).includes(m) === false || defaultLocaleInfo[m] === '',
);
if (mandatoryFieldsMissing.length) {
missingFields.push({
locale: defaultLocaleInfo.locale,
fields: mandatoryFieldsMissing,
});
}
}
const nonLocaleMissingFields = [];
if (projectInfo.mappingTypes.length === 0) nonLocaleMissingFields.push('mappingTypes');
if (!projectInfo.organisation) nonLocaleMissingFields.push('organisation');
if (nonLocaleMissingFields.length) {
missingFields.push({ locale: null, fields: nonLocaleMissingFields });
}
if (missingFields.length > 0) {
setError(missingFields);
return new Promise((resolve, reject) => reject());
} else {
return pushToLocalJSONAPI(`projects/${id}/`, JSON.stringify(projectInfo), token, 'PATCH')
.then((res) => {
setSuccess(true);
setError(null);
})
.catch((e) => setError('SERVER'));
}
};
const saveChangesAsync = useAsync(saveChanges);
if (!token) {
return <Redirect to={'/login'} noThrow />;
}
if (projectInfo.projectId && !userCanEditProject) {
return (
<div className="cf w-100 pv5">
<div className="tc">
<h3 className="f3 fw8 mb4 barlow-condensed">
<FormattedMessage {...messages.projectEditNotAllowed} />
</h3>
</div>
</div>
);
}
const renderList = () => {
const checkSelected = (optionSelected) => {
let liClass = 'w-90 link barlow-condensed f4 fw5 pv3 pl2 pointer';
if (option === optionSelected) {
liClass = liClass.concat(' fw6 bg-grey-light');
}
return liClass;
};
const elements = [
{ value: 'description', required: true },
{ value: 'instructions', required: true },
{ value: 'metadata', required: true },
{ value: 'priority_areas' },
{ value: 'imagery' },
{ value: 'permissions' },
{ value: 'settings' },
{ value: 'actions' },
{ value: 'custom_editor' },
];
return (
<div>
<ul className="list pl0 mt0 ttu">
{elements.map((elm, n) => (
<li key={n} className={checkSelected(elm.value)} onClick={() => setOption(elm.value)}>
<FormattedMessage {...messages[`projectEditSection_${elm.value}`]} />
{elm.required && ' *'}
</li>
))}
</ul>
</div>
);
};