+
+
+
{!election.restricted && !isClosed(election) && (
)}
@@ -185,7 +184,7 @@ const HeaderRubbon = ({token}) => {
style={{border: '2px solid rgba(255, 255, 255, 0.4)'}}
position="right"
>
- {t('admin.go-to-result')}
+ {t('common.results')}
)}
@@ -205,6 +204,17 @@ const HeaderRubbon = ({token}) => {
);
};
+
+const HeaderRubbonMobile = () => {
+ const {t} = useTranslation();
+ return (
+
+
{t('admin.admin-title')}
+
+ )
+}
+
const CreateElection = ({context, token}) => {
const {t} = useTranslation();
const [election, dispatch] = useElection();
@@ -313,6 +323,68 @@ const CreateElection = ({context, token}) => {
}
};
+ /**
+ * Close an election
+ */
+ const handleClosing = async () => {
+ setWaiting(true);
+ dispatch({
+ type: ElectionTypes.SET,
+ field: 'forceClose',
+ value: true,
+ });
+
+ const candidates = election.candidates
+ .filter((c) => c.active)
+ .map((c: CandidateItem) => ({
+ name: c.name,
+ description: c.description,
+ image: c.image,
+ id: c.id,
+ }));
+ const grades = election.grades
+ .filter((c) => c.active)
+ .map((g: GradeItem, i: number) => ({name: g.name, value: g.value, id: g.id}));
+
+ const response = await updateElection(
+ election.ref,
+ election.name,
+ candidates,
+ grades,
+ election.description,
+ election.emails.length,
+ election.hideResults,
+ true,
+ election.restricted,
+ election.randomOrder,
+ token
+ );
+ if (response.status === 200 && 'ref' in response) {
+ if (election.restricted && election.emails.length > 0) {
+ if (election.emails.length !== response.invites.length) {
+ throw new Error('Unexpected number of invites!');
+ }
+ const urlVotes = response.invites.map((token: string) =>
+ getUrl(RouteTypes.VOTE, router, response.ref, token)
+ );
+ const urlResult = getUrl(RouteTypes.RESULTS, router, response.ref);
+ await sendInviteMails(
+ election.emails,
+ election.name,
+ urlVotes,
+ urlResult,
+ router
+ );
+ }
+ setWaiting(false);
+ dispatchApp({
+ type: AppTypes.TOAST_ADD,
+ status: 'success',
+ message: t('success.election-closed'),
+ });
+ }
+ };
+
const numCandidates = election.candidates.filter(
(c) => c.active && c.name != ''
).length;
@@ -328,7 +400,12 @@ const CreateElection = ({context, token}) => {
return (
<>
-
+
+
+
+
+
+
{
>
{waiting ? : t('admin.confirm-edit')}
+
+
+
>
diff --git a/public/locales/en/resource.json b/public/locales/en/resource.json
index 959cce6..7eb4a1f 100644
--- a/public/locales/en/resource.json
+++ b/public/locales/en/resource.json
@@ -48,6 +48,7 @@
"common.days": "days",
"common.send": "Send",
"common.vote": "Vote",
+ "common.results": "Results",
"common.the-vote": "The vote",
"common.the-params": "The parameters",
"common.welcome": "Welcome!",
diff --git a/public/locales/fr/resource.json b/public/locales/fr/resource.json
index c03793b..1446beb 100644
--- a/public/locales/fr/resource.json
+++ b/public/locales/fr/resource.json
@@ -51,6 +51,7 @@
"common.the-params": "Les paramètres",
"common.vote": "Voter",
"common.welcome": "Bienvenue !",
+ "common.results": "Résultats",
"error.help": "Besoin d'aide ?",
"error.cant-set-ongoing": "Vous ne pouvez pas modifier ce paramètre pour une élection déjà démarrée.",
"error.at-least-2-candidates": "Ajoutez au moins deux candidats.",