From d590ae0179eecbb43e461863855f29f734fcf9fd Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Mon, 27 Dec 2021 18:48:38 +0200 Subject: [PATCH] Add projects to the system --- server/router/index.js | 2 + server/router/projects/index.js | 278 +++++++++++++++++++++++ server/views/campaign-form.pug | 3 + server/views/project-add-entry.pug | 22 ++ server/views/project-add-translation.pug | 22 ++ server/views/project-form.pug | 18 ++ server/views/project.pug | 25 ++ server/views/projects.pug | 14 ++ server/views/templates/layout.pug | 7 +- 9 files changed, 389 insertions(+), 2 deletions(-) create mode 100644 server/router/projects/index.js create mode 100644 server/views/project-add-entry.pug create mode 100644 server/views/project-add-translation.pug create mode 100644 server/views/project-form.pug create mode 100644 server/views/project.pug create mode 100644 server/views/projects.pug diff --git a/server/router/index.js b/server/router/index.js index 0903ab8..8a92a13 100644 --- a/server/router/index.js +++ b/server/router/index.js @@ -25,6 +25,7 @@ module.exports = function (options) { var translateRouter = require('./translate/')(options); var versionsRouter = require('./versions')(options); var forkRouter = require('./fork')(options); + var projectsRouter = require('./projects')(options); router.use('/library', libraryRouter); router.use('/pledges', pledgesRouter); @@ -34,6 +35,7 @@ module.exports = function (options) { router.use('/translate', translateRouter); router.use('/v', versionsRouter); router.use('/fork', forkRouter); + router.use('/projects', projectsRouter); return router; }; \ No newline at end of file diff --git a/server/router/projects/index.js b/server/router/projects/index.js new file mode 100644 index 0000000..895599f --- /dev/null +++ b/server/router/projects/index.js @@ -0,0 +1,278 @@ +const express = require('express') + +module.exports = function (options) { + const db = options.db; + var router = express.Router(); + + router.route('/') + .get(function(request, response, next) { + db.Project.findAll() + .then(projects => { + response.display("projects", { + user: request.user, + pageTitle: "Projects - Mantra", + projects: projects + }) + }) + }) + + router.route('/:id') + .get(function(request, response, next) { + db.Project.findByPk(request.params.id, { + include: [ + { + association: db.Project.ProjectEntryVersions, + include: [ + { + association: db.ProjectEntryVersion.EntryVersion, + include: [ + { + association: db.EntryVersion.Entry + } + ] + } + ] + }, + { + association: db.Project.ProjectTranslationEntryVersions, + include: [ + { + association: db.ProjectTranslationEntryVersion.TranslationEntryVersion, + include: [ + { + association: db.TranslationEntryVersion.EntryVersion, + include: [ + { + association: db.EntryVersion.Entry + } + ] + } + ] + } + ] + } + ] + }).then(project => { + if (project) { + response.display("project", { + user: request.user, + pageTitle: "Projects - Mantra", + project: project + }) + } else { + next() + } + }).catch(error => { + next(error) + }) + }) + + router.route('/create') + .get(function(request, response, next) { + response.display("project-form", { + user: request.user, + pageTitle: "Projects - Mantra", + project: { + + } + }) + }) + .post(function(request, response, next) { + db.Project.create({ + name: request.body.name, + description: request.body.description + }).then(project => { + if (project) { + response.redirect(`/projects/${project.id}`) + } else { + next() + } + }).catch(error => { + next(error) + }) + }) + + router.route('/:id/add-entry') + .get(function(request, response, next) { + db.Project.findByPk(request.params.id, { + include: [ + { + association: db.Project.ProjectEntryVersions + }, + { + association: db.Project.ProjectTranslationEntryVersions + } + ] + }).then(async (project) => { + if (project) { + const entries = await db.Entry.findAll({ + // Narrow it down to entries this user has admin ownership off..., + include: [ + { + association: db.Entry.EntryVersions, + limit: 1, + required: true + // TODO: Order by version... + } + ] + }) + response.display("project-add-entry", { + user: request.user, + pageTitle: "Projects - Mantra", + project: project, + entries: entries + }) + } else { + next() + } + }).catch(error => { + next(error) + }) + }) + .post(function(request, response, next) { + db.Project.findByPk(request.params.id, { + include: [ + { + association: db.Project.ProjectEntryVersions, + include: [ + { + association: db.ProjectEntryVersion.EntryVersion, + include: [ + { + association: db.EntryVersion.Entry + } + ] + } + ] + }, + { + association: db.Project.ProjectTranslationEntryVersions, + include: [ + { + association: db.ProjectTranslationEntryVersion.TranslationEntryVersion, + include: [ + { + association: db.TranslationEntryVersion.EntryVersion, + include: [ + { + association: db.EntryVersion.Entry + } + ] + } + ] + } + ] + } + ] + }).then(async (project) => { + if (project) { + // TODO: Fi + const entryVersion = await db.EntryVersion.findByPk(request.body.entryVersionId, { + // Narrow it down to entries this user has admin ownership off..., + }) + + if (entryVersion) { + const projectEntryVersion = db.ProjectEntryVersion.create({ + projectId: project.id, + entryVersionId: entryVersion.id + }) + + response.redirect(`/projects/${project.id}`) + } else { + response.redirect(`/projects/${project.id}/add-entry`) + } + + + } else { + next() + } + }).catch(error => { + next(error) + }) + }) + + router.route('/:id/add-translation') + .get(function(request, response, next) { + db.Project.findByPk(request.params.id, { + include: [ + { + association: db.Project.ProjectEntryVersions + }, + { + association: db.Project.ProjectTranslationEntryVersions + } + ] + }).then(async (project) => { + if (project) { + const translationEntryVersions = await db.TranslationEntryVersion.findAll({ + // Narrow it down to entries this user has admin ownership off..., + include: [ + { + association: db.TranslationEntryVersion.EntryVersion, + required: true, + // TODO: Order by version... + include: [ + { + association: db.EntryVersion.Entry + } + ] + } + ] + }) + response.display("project-add-translation", { + user: request.user, + pageTitle: "Projects - Mantra", + project: project, + translationEntryVersions: translationEntryVersions + }) + } else { + next() + } + }).catch(error => { + next(error) + }) + }) + .post(function(request, response, next) { + db.Project.findByPk(request.params.id, { + include: [ + { + association: db.Project.ProjectEntryVersions + }, + { + association: db.Project.ProjectTranslationEntryVersions + } + ] + }).then(async (project) => { + if (project) { + // TODO: Fi + const translationEntryVersion = await db.TranslationEntryVersion.findByPk(request.body.translationEntryVersionId, { + // Narrow it down to entries this user has admin ownership off..., + include: [ + { + association: db.TranslationEntryVersion.EntryVersion, + required: true + // TODO: Order by version... + } + ] + }) + + if (translationEntryVersion) { + const projectTranslationEntryVersion = db.ProjectTranslationEntryVersion.create({ + projectId: project.id, + translationEntryVersionId: translationEntryVersion.id + }) + + response.redirect(`/projects/${project.id}`) + } else { + response.redirect(`/projects/${project.id}/add-translation`) + } + + } else { + next() + } + }).catch(error => { + next(error) + }) + }) + return router; +}; \ No newline at end of file diff --git a/server/views/campaign-form.pug b/server/views/campaign-form.pug index 860c0a6..48e7f51 100644 --- a/server/views/campaign-form.pug +++ b/server/views/campaign-form.pug @@ -11,6 +11,9 @@ block content .col.s12.input-field input#name(type="text", name="name", value=campaign.name) label(for="name") Campaign Name + if project + .col.s12 + span project... each translationEntryVersion in translationEntryVersions input(type="hidden", name="translationEntryVersions", value=translationEntryVersion.id) .col.s12.input-field diff --git a/server/views/project-add-entry.pug b/server/views/project-add-entry.pug new file mode 100644 index 0000000..fe37e24 --- /dev/null +++ b/server/views/project-add-entry.pug @@ -0,0 +1,22 @@ +extend templates/layout.pug + +block content + .container + .center + h1 Add Entry to Project + + table + thead + tr + th Name + th Version + th + tbody + each entry in entries + tr + td= entry.name + td= entry.entryVersions[0].tag + td + form(action=`/projects/${project.id}/add-entry`, method="post") + input(type="hidden", name="entryVersionId", value=entry.entryVersions[0].id) + button.btn.black(type="submit") add to project \ No newline at end of file diff --git a/server/views/project-add-translation.pug b/server/views/project-add-translation.pug new file mode 100644 index 0000000..411d756 --- /dev/null +++ b/server/views/project-add-translation.pug @@ -0,0 +1,22 @@ +extend templates/layout.pug + +block content + .container + .center + h1 Add Translation to #{project.name} + + table + thead + tr + th Name + th Version + th + tbody + each translationEntryVersion in translationEntryVersions + tr + td #{translationEntryVersion.entryVersion.entry.name} - #{translationEntryVersion.name} + td= translationEntryVersion.entryVersion.tag + td + form(action=`/projects/${project.id}/add-translation`, method="post") + input(type="hidden", name="translationEntryVersionId", value=translationEntryVersion.id) + button.btn.black(type="submit") add to project \ No newline at end of file diff --git a/server/views/project-form.pug b/server/views/project-form.pug new file mode 100644 index 0000000..b5a2629 --- /dev/null +++ b/server/views/project-form.pug @@ -0,0 +1,18 @@ +extend templates/layout.pug + +block content + .container + .center + h1 Create Project + + .row + .col.s12 + form.row(action=`/projects/create`, method="post") + .col.s12.input-field + input#name(type="text", name="name", value=project.name) + label(for="name") Project Name + .col.s12.input-field + input#description(type="text", name="description", value=project.description) + label(for="description") Description + .col.s12 + button.btn.black(type="submit") create project \ No newline at end of file diff --git a/server/views/project.pug b/server/views/project.pug new file mode 100644 index 0000000..664ed83 --- /dev/null +++ b/server/views/project.pug @@ -0,0 +1,25 @@ +extend templates/layout.pug + +block content + .container + .center + h1= project.name + + p.flow-text= project.description + + .divider + h2 Entries + each projectEntryVersion in project.projectEntryVersions + p.flow-text= projectEntryVersion.entryVersion.entry.name + .row + .col.s12 + a.btn.black(href=`/projects/${project.id}/add-entry`) add from library + .divider + h2 Translation + each projectTranslationEntryVersion in project.projectTranslationEntryVersions + p.flow-text #{projectTranslationEntryVersion.translationEntryVersion.name} - #{projectTranslationEntryVersion.translationEntryVersion.entryVersion.entry.name} + .row + .col.s12 + a.btn.black(href=`/projects/${project.id}/add-translation`) add translation + //- TODO: Show project translation entry versions + //- TODO: Show project entry versions \ No newline at end of file diff --git a/server/views/projects.pug b/server/views/projects.pug new file mode 100644 index 0000000..cd4d6ce --- /dev/null +++ b/server/views/projects.pug @@ -0,0 +1,14 @@ +extend templates/layout.pug + +block content + .container + .center + h1 Projects + + a.btn.black(href=`/projects/create`) add project + + row + each project in projects + .col.s12 + p.flow-text + a(href=`projects/${project.id}`)= project.name \ No newline at end of file diff --git a/server/views/templates/layout.pug b/server/views/templates/layout.pug index 8e692e0..f8d172d 100644 --- a/server/views/templates/layout.pug +++ b/server/views/templates/layout.pug @@ -39,11 +39,14 @@ html(lang="en" dir="ltr") a(href="/library") i.material-icons.black-text person span library + li + a(href="/projects") + i.material-icons.black-text person + span Projects li a(href="/campaigns") i.material-icons.black-text person - span campaigns - + span campaigns li a(href="/pledges") i.material-icons.black-text person