500 lines
20 KiB
JavaScript
500 lines
20 KiB
JavaScript
const express = require('express')
|
|
const XL = require('excel4node');
|
|
|
|
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)
|
|
})
|
|
})
|
|
|
|
router.route('/:id/campaign')
|
|
.get(function(request, response, next) {
|
|
db.Project.findByPk(request.params.id, {
|
|
include: [
|
|
{
|
|
association: db.Project.Campaign,
|
|
required: true
|
|
},
|
|
{
|
|
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.redirect(`/campaigns/${project.campaign.id}`)
|
|
} else {
|
|
response.redirect(`/projects/${request.params.id}/campaign/create`)
|
|
}
|
|
})
|
|
})
|
|
|
|
router.route('/:id/campaign/create')
|
|
.get(function(request, response, next) {
|
|
db.Project.findByPk(request.params.id, {
|
|
include: [
|
|
{
|
|
association: db.Project.Campaign,
|
|
}
|
|
]
|
|
}).then(project => {
|
|
if (project) {
|
|
if (project.campaign) {
|
|
response.redirect(`/campaigns/${project.campaign.id}`)
|
|
} else {
|
|
response.display("campaign-form", {
|
|
user: request.user,
|
|
pageTitle: "Campaign - Mantra",
|
|
campaign: {
|
|
name: `Campaign for ${project.name} project`
|
|
},
|
|
project: project,
|
|
})
|
|
}
|
|
|
|
} else {
|
|
next()
|
|
}
|
|
}).catch(error => {
|
|
next(error)
|
|
})
|
|
})
|
|
|
|
router.route('/:id/spreadsheet')
|
|
.post(function(request, response, next) {
|
|
db.Project.findByPk(request.params.id, {
|
|
|
|
}).then(async (project) => {
|
|
if (project) {
|
|
db.TranslationEntryVersion.findAll({
|
|
include: [
|
|
// TODO: require translationEntryVersions in ProjectEntryVersion
|
|
{
|
|
association: db.TranslationEntryVersion.ProjectTranslationEntryVersions,
|
|
where: {
|
|
projectId: request.params.id
|
|
},
|
|
required: true
|
|
},
|
|
{
|
|
association: db.TranslationEntryVersion.EntryVersion,
|
|
include: [
|
|
{
|
|
association: db.EntryVersion.Entry,
|
|
include: [
|
|
{
|
|
association: db.Entry.Dialect
|
|
}
|
|
]
|
|
},
|
|
{
|
|
association: db.EntryVersion.Chapters,
|
|
include: [
|
|
{
|
|
association: db.Chapter.Chunks,
|
|
include: [
|
|
{
|
|
association: db.Chunk.Translation
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
association: db.TranslationEntryVersion.Dialect
|
|
}
|
|
]
|
|
}).then(translationEntryVersions => {
|
|
console.log("Translation Entry: ", translationEntryVersions.length)
|
|
const workbook = new XL.Workbook();
|
|
const cellWidth = 45
|
|
const cellHeight = 25
|
|
|
|
translationEntryVersions.forEach((translationEntryVersion, index) => {
|
|
const worksheet_name = `${index+1}-${translationEntryVersion.dialect.countryId}-${translationEntryVersion.dialect.languageId} - ${translationEntryVersion.entryVersion.entry.name}`.substring(0, 30);
|
|
|
|
// Don't have [ ] * ? : / \
|
|
const worksheet = workbook.addWorksheet(worksheet_name.replace(/[`*?:'\[\]\\\/]/gi, ""))
|
|
|
|
worksheet.cell(2,2,2,3,true)
|
|
.string(translationEntryVersion.entryVersion.entry.name)
|
|
.style({
|
|
font: {
|
|
bold: true,
|
|
},
|
|
alignment: {
|
|
wrapText: true
|
|
}
|
|
})
|
|
|
|
worksheet.cell(4,2)
|
|
.string(translationEntryVersion.entryVersion.entry.dialect.name)
|
|
.style({
|
|
font: {
|
|
bold: true,
|
|
},
|
|
alignment: {
|
|
wrapText: true
|
|
}
|
|
})
|
|
|
|
worksheet.cell(4,3)
|
|
.string(translationEntryVersion.dialect.name)
|
|
.style({
|
|
font: {
|
|
bold: true,
|
|
},
|
|
alignment: {
|
|
wrapText: true
|
|
}
|
|
})
|
|
|
|
var cellIndex = 6
|
|
for (const i in translationEntryVersion.entryVersion.chapters) {
|
|
const chapter = translationEntryVersion.entryVersion.chapters[i]
|
|
const chunks = chapter.chunks.sort((a,b) => a.index - b.index)
|
|
for (const j in chunks) {
|
|
const chunk = chunks[j]
|
|
|
|
worksheet.cell(cellIndex,2)
|
|
.string(chunk.text)
|
|
.style({
|
|
alignment: {
|
|
wrapText: true,
|
|
vertical: 'top'
|
|
}
|
|
})
|
|
|
|
worksheet.cell(cellIndex,3)
|
|
.string(chunk.translation?.text ?? "")
|
|
.style({
|
|
alignment: {
|
|
wrapText: true,
|
|
vertical: 'top'
|
|
}
|
|
})
|
|
|
|
const textLength = chunk.text.length
|
|
worksheet.row(cellIndex).setHeight(
|
|
Math.ceil(Math.max(textLength/cellWidth, 1)*cellHeight)
|
|
)
|
|
cellIndex++
|
|
}
|
|
cellIndex++
|
|
}
|
|
|
|
// Format
|
|
worksheet.column(2).setWidth(cellWidth);
|
|
worksheet.column(3).setWidth(cellWidth);
|
|
})
|
|
workbook.write(`${project.name}.xlsx`, response);
|
|
}).catch(error => {
|
|
next(error)
|
|
})
|
|
} else {
|
|
next()
|
|
}
|
|
})
|
|
|
|
})
|
|
|
|
return router;
|
|
}; |