diff --git a/routes/adminTranslationsAwaiting.vue b/routes/adminTranslationsAwaiting.vue index 41d7e972d..599b6993c 100644 --- a/routes/adminTranslationsAwaiting.vue +++ b/routes/adminTranslationsAwaiting.vue @@ -76,6 +76,46 @@ + +
+ + Contributors + +
+
+ + + + + + + + + + + + + + + + + + +
ContributorApproved translations
+ @{{username}} + + + contact.team.member + + + {{ count }} +
+ This overview only considers translations submitted via the web interface, got gitlab/gdocs. + Let's use it to consider inviting people to the team. +
+
+
+
@@ -94,6 +134,7 @@ export default { async asyncData({ app }) { return { translationProposals: await app.$axios.$get(`/translations/proposals`), + contributors: await app.$axios.$get(`/translations/contributors`), }; }, methods: { diff --git a/server/routes/translations.js b/server/routes/translations.js index 2a032a4af..e86b4477c 100644 --- a/server/routes/translations.js +++ b/server/routes/translations.js @@ -98,4 +98,25 @@ router.post('/translations/proposals-done', handleErrorAsync(async (req, res) => return res.json('OK'); })); +router.get('/translations/contributors', handleErrorAsync(async (req, res) => { + if (!req.isGranted('translations')) { + return res.status(401).json({error: 'Unauthorised'}); + } + + const contributors = []; + for (let {author_id, c} of await req.db.all(SQL`SELECT author_id, count(*) AS c FROM translations + WHERE locale = ${global.config.locale} AND status >= ${TRANSLATION_STATUS.APPROVED} + GROUP BY author_id + `)) { + const { username, roles } = await req.db.get(SQL`SELECT username, roles FROM users WHERE id=${author_id}`); + contributors.push({ + username, + isMember: !!roles, + count: c, + }); + } + + return res.json(contributors); +})); + export default router;