Add projects to the system
This commit is contained in:
@@ -25,6 +25,7 @@ module.exports = function (options) {
|
|||||||
var translateRouter = require('./translate/')(options);
|
var translateRouter = require('./translate/')(options);
|
||||||
var versionsRouter = require('./versions')(options);
|
var versionsRouter = require('./versions')(options);
|
||||||
var forkRouter = require('./fork')(options);
|
var forkRouter = require('./fork')(options);
|
||||||
|
var projectsRouter = require('./projects')(options);
|
||||||
|
|
||||||
router.use('/library', libraryRouter);
|
router.use('/library', libraryRouter);
|
||||||
router.use('/pledges', pledgesRouter);
|
router.use('/pledges', pledgesRouter);
|
||||||
@@ -34,6 +35,7 @@ module.exports = function (options) {
|
|||||||
router.use('/translate', translateRouter);
|
router.use('/translate', translateRouter);
|
||||||
router.use('/v', versionsRouter);
|
router.use('/v', versionsRouter);
|
||||||
router.use('/fork', forkRouter);
|
router.use('/fork', forkRouter);
|
||||||
|
router.use('/projects', projectsRouter);
|
||||||
|
|
||||||
return router;
|
return router;
|
||||||
};
|
};
|
||||||
278
server/router/projects/index.js
Normal file
278
server/router/projects/index.js
Normal file
@@ -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;
|
||||||
|
};
|
||||||
@@ -11,6 +11,9 @@ block content
|
|||||||
.col.s12.input-field
|
.col.s12.input-field
|
||||||
input#name(type="text", name="name", value=campaign.name)
|
input#name(type="text", name="name", value=campaign.name)
|
||||||
label(for="name") Campaign Name
|
label(for="name") Campaign Name
|
||||||
|
if project
|
||||||
|
.col.s12
|
||||||
|
span project...
|
||||||
each translationEntryVersion in translationEntryVersions
|
each translationEntryVersion in translationEntryVersions
|
||||||
input(type="hidden", name="translationEntryVersions", value=translationEntryVersion.id)
|
input(type="hidden", name="translationEntryVersions", value=translationEntryVersion.id)
|
||||||
.col.s12.input-field
|
.col.s12.input-field
|
||||||
|
|||||||
22
server/views/project-add-entry.pug
Normal file
22
server/views/project-add-entry.pug
Normal file
@@ -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
|
||||||
22
server/views/project-add-translation.pug
Normal file
22
server/views/project-add-translation.pug
Normal file
@@ -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
|
||||||
18
server/views/project-form.pug
Normal file
18
server/views/project-form.pug
Normal file
@@ -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
|
||||||
25
server/views/project.pug
Normal file
25
server/views/project.pug
Normal file
@@ -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
|
||||||
14
server/views/projects.pug
Normal file
14
server/views/projects.pug
Normal file
@@ -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
|
||||||
@@ -39,11 +39,14 @@ html(lang="en" dir="ltr")
|
|||||||
a(href="/library")
|
a(href="/library")
|
||||||
i.material-icons.black-text person
|
i.material-icons.black-text person
|
||||||
span library
|
span library
|
||||||
|
li
|
||||||
|
a(href="/projects")
|
||||||
|
i.material-icons.black-text person
|
||||||
|
span Projects
|
||||||
li
|
li
|
||||||
a(href="/campaigns")
|
a(href="/campaigns")
|
||||||
i.material-icons.black-text person
|
i.material-icons.black-text person
|
||||||
span campaigns
|
span campaigns
|
||||||
|
|
||||||
li
|
li
|
||||||
a(href="/pledges")
|
a(href="/pledges")
|
||||||
i.material-icons.black-text person
|
i.material-icons.black-text person
|
||||||
|
|||||||
Reference in New Issue
Block a user