Unverified Commit 9a92789d authored by NGPixel's avatar NGPixel

feat: editor create page mode

parent 278a9bef
...@@ -106,20 +106,6 @@ router.get('/_thumb/:id.webp', async (req, res, next) => { ...@@ -106,20 +106,6 @@ router.get('/_thumb/:id.webp', async (req, res, next) => {
} }
}) })
/**
* New v3 vue app
*/
router.get([
'/_admin',
'/_admin/*',
'/_profile',
'/_profile/*',
'/_error',
'/_error/*',
'/_welcome'
], (req, res, next) => {
res.sendFile(path.join(WIKI.ROOTPATH, 'assets/index.html'))
})
// router.get(['/_admin', '/_admin/*'], (req, res, next) => { // router.get(['/_admin', '/_admin/*'], (req, res, next) => {
// if (!WIKI.auth.checkAccess(req.user, [ // if (!WIKI.auth.checkAccess(req.user, [
// 'manage:system', // 'manage:system',
...@@ -140,297 +126,297 @@ router.get([ ...@@ -140,297 +126,297 @@ router.get([
// }) // })
/** // /**
* Download Page / Version // * Download Page / Version
*/ // */
router.get(['/d', '/d/*'], async (req, res, next) => { // router.get(['/d', '/d/*'], async (req, res, next) => {
const pageArgs = pageHelper.parsePath(req.path, { stripExt: true }) // const pageArgs = pageHelper.parsePath(req.path, { stripExt: true })
const versionId = (req.query.v) ? _.toSafeInteger(req.query.v) : 0 // const versionId = (req.query.v) ? _.toSafeInteger(req.query.v) : 0
const page = await WIKI.db.pages.getPageFromDb({ // const page = await WIKI.db.pages.getPageFromDb({
path: pageArgs.path, // path: pageArgs.path,
locale: pageArgs.locale, // locale: pageArgs.locale,
userId: req.user.id, // userId: req.user.id,
isPrivate: false // isPrivate: false
}) // })
pageArgs.tags = _.get(page, 'tags', []) // pageArgs.tags = _.get(page, 'tags', [])
if (versionId > 0) { // if (versionId > 0) {
if (!WIKI.auth.checkAccess(req.user, ['read:history'], pageArgs)) { // if (!WIKI.auth.checkAccess(req.user, ['read:history'], pageArgs)) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized') // _.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'downloadVersion' }) // return res.render('unauthorized', { action: 'downloadVersion' })
} // }
} else { // } else {
if (!WIKI.auth.checkAccess(req.user, ['read:source'], pageArgs)) { // if (!WIKI.auth.checkAccess(req.user, ['read:source'], pageArgs)) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized') // _.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'download' }) // return res.render('unauthorized', { action: 'download' })
} // }
} // }
if (page) { // if (page) {
const fileName = _.last(page.path.split('/')) + '.' + pageHelper.getFileExtension(page.contentType) // const fileName = _.last(page.path.split('/')) + '.' + pageHelper.getFileExtension(page.contentType)
res.attachment(fileName) // res.attachment(fileName)
if (versionId > 0) { // if (versionId > 0) {
const pageVersion = await WIKI.db.pageHistory.getVersion({ pageId: page.id, versionId }) // const pageVersion = await WIKI.db.pageHistory.getVersion({ pageId: page.id, versionId })
res.send(pageHelper.injectPageMetadata(pageVersion)) // res.send(pageHelper.injectPageMetadata(pageVersion))
} else { // } else {
res.send(pageHelper.injectPageMetadata(page)) // res.send(pageHelper.injectPageMetadata(page))
} // }
} else { // } else {
res.status(404).end() // res.status(404).end()
} // }
}) // })
/** // /**
* Create/Edit document // * Create/Edit document
*/ // */
router.get(['/_edit', '/_edit/*'], async (req, res, next) => { // router.get(['/_edit', '/_edit/*'], async (req, res, next) => {
const pageArgs = pageHelper.parsePath(req.path, { stripExt: true }) // const pageArgs = pageHelper.parsePath(req.path, { stripExt: true })
const site = await WIKI.db.sites.getSiteByHostname({ hostname: req.hostname }) // const site = await WIKI.db.sites.getSiteByHostname({ hostname: req.hostname })
if (!site) { // if (!site) {
throw new Error('INVALID_SITE') // throw new Error('INVALID_SITE')
} // }
if (pageArgs.path === '') { // if (pageArgs.path === '') {
return res.redirect(`/_edit/home`) // return res.redirect(`/_edit/home`)
} // }
// if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) { // // if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
// return res.redirect(`/_edit/${pageArgs.locale}/${pageArgs.path}`) // // return res.redirect(`/_edit/${pageArgs.locale}/${pageArgs.path}`)
// } // // }
// req.i18n.changeLanguage(pageArgs.locale) // // req.i18n.changeLanguage(pageArgs.locale)
// -> Set Editor Lang // // -> Set Editor Lang
_.set(res, 'locals.siteConfig.lang', pageArgs.locale) // _.set(res, 'locals.siteConfig.lang', pageArgs.locale)
// _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl') // // _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl')
// -> Check for reserved path // // -> Check for reserved path
if (pageHelper.isReservedPath(pageArgs.path)) { // if (pageHelper.isReservedPath(pageArgs.path)) {
return next(new Error('Cannot create this page because it starts with a system reserved path.')) // return next(new Error('Cannot create this page because it starts with a system reserved path.'))
} // }
// -> Get page data from DB // // -> Get page data from DB
let page = await WIKI.db.pages.getPageFromDb({ // let page = await WIKI.db.pages.getPageFromDb({
siteId: site.id, // siteId: site.id,
path: pageArgs.path, // path: pageArgs.path,
locale: pageArgs.locale, // locale: pageArgs.locale,
userId: req.user.id // userId: req.user.id
}) // })
pageArgs.tags = _.get(page, 'tags', []) // pageArgs.tags = _.get(page, 'tags', [])
// -> Effective Permissions // // -> Effective Permissions
const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs) // const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs)
const injectCode = { // const injectCode = {
css: '', // WIKI.config.theming.injectCSS, // css: '', // WIKI.config.theming.injectCSS,
head: '', // WIKI.config.theming.injectHead, // head: '', // WIKI.config.theming.injectHead,
body: '' // WIKI.config.theming.injectBody // body: '' // WIKI.config.theming.injectBody
} // }
if (page) { // if (page) {
// -> EDIT MODE // // -> EDIT MODE
if (!(effectivePermissions.pages.write || effectivePermissions.pages.manage)) { // if (!(effectivePermissions.pages.write || effectivePermissions.pages.manage)) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized') // _.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'edit' }) // return res.render('unauthorized', { action: 'edit' })
} // }
// -> Get page tags // // -> Get page tags
await page.$relatedQuery('tags') // await page.$relatedQuery('tags')
page.tags = _.map(page.tags, 'tag') // page.tags = _.map(page.tags, 'tag')
// Handle missing extra field // // Handle missing extra field
page.extra = page.extra || { css: '', js: '' } // page.extra = page.extra || { css: '', js: '' }
// -> Beautify Script CSS // // -> Beautify Script CSS
if (!_.isEmpty(page.extra.css)) { // if (!_.isEmpty(page.extra.css)) {
page.extra.css = new CleanCSS({ format: 'beautify' }).minify(page.extra.css).styles // page.extra.css = new CleanCSS({ format: 'beautify' }).minify(page.extra.css).styles
} // }
_.set(res.locals, 'pageMeta.title', `Edit ${page.title}`) // _.set(res.locals, 'pageMeta.title', `Edit ${page.title}`)
_.set(res.locals, 'pageMeta.description', page.description) // _.set(res.locals, 'pageMeta.description', page.description)
page.mode = 'update' // page.mode = 'update'
page.isPublished = (page.isPublished === true || page.isPublished === 1) ? 'true' : 'false' // page.isPublished = (page.isPublished === true || page.isPublished === 1) ? 'true' : 'false'
page.content = Buffer.from(page.content).toString('base64') // page.content = Buffer.from(page.content).toString('base64')
} else { // } else {
// -> CREATE MODE // // -> CREATE MODE
if (!effectivePermissions.pages.write) { // if (!effectivePermissions.pages.write) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized') // _.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'create' }) // return res.render('unauthorized', { action: 'create' })
} // }
_.set(res.locals, 'pageMeta.title', `New Page`) // _.set(res.locals, 'pageMeta.title', `New Page`)
page = { // page = {
path: pageArgs.path, // path: pageArgs.path,
localeCode: pageArgs.locale, // localeCode: pageArgs.locale,
editorKey: null, // editorKey: null,
mode: 'create', // mode: 'create',
content: null, // content: null,
title: null, // title: null,
description: null, // description: null,
updatedAt: new Date().toISOString(), // updatedAt: new Date().toISOString(),
extra: { // extra: {
css: '', // css: '',
js: '' // js: ''
} // }
} // }
} // }
res.render('editor', { page, injectCode, effectivePermissions }) // res.render('editor', { page, injectCode, effectivePermissions })
}) // })
/** // /**
* History // * History
*/ // */
router.get(['/h', '/h/*'], async (req, res, next) => { // router.get(['/h', '/h/*'], async (req, res, next) => {
const pageArgs = pageHelper.parsePath(req.path, { stripExt: true }) // const pageArgs = pageHelper.parsePath(req.path, { stripExt: true })
if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) { // if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
return res.redirect(`/h/${pageArgs.locale}/${pageArgs.path}`) // return res.redirect(`/h/${pageArgs.locale}/${pageArgs.path}`)
} // }
req.i18n.changeLanguage(pageArgs.locale) // req.i18n.changeLanguage(pageArgs.locale)
_.set(res, 'locals.siteConfig.lang', pageArgs.locale) // _.set(res, 'locals.siteConfig.lang', pageArgs.locale)
_.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl') // _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl')
const page = await WIKI.db.pages.getPageFromDb({ // const page = await WIKI.db.pages.getPageFromDb({
path: pageArgs.path, // path: pageArgs.path,
locale: pageArgs.locale, // locale: pageArgs.locale,
userId: req.user.id, // userId: req.user.id,
isPrivate: false // isPrivate: false
}) // })
if (!page) { // if (!page) {
_.set(res.locals, 'pageMeta.title', 'Page Not Found') // _.set(res.locals, 'pageMeta.title', 'Page Not Found')
return res.status(404).render('notfound', { action: 'history' }) // return res.status(404).render('notfound', { action: 'history' })
} // }
pageArgs.tags = _.get(page, 'tags', []) // pageArgs.tags = _.get(page, 'tags', [])
const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs) // const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs)
if (!effectivePermissions.history.read) { // if (!effectivePermissions.history.read) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized') // _.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'history' }) // return res.render('unauthorized', { action: 'history' })
} // }
if (page) { // if (page) {
_.set(res.locals, 'pageMeta.title', page.title) // _.set(res.locals, 'pageMeta.title', page.title)
_.set(res.locals, 'pageMeta.description', page.description) // _.set(res.locals, 'pageMeta.description', page.description)
res.render('history', { page, effectivePermissions }) // res.render('history', { page, effectivePermissions })
} else { // } else {
res.redirect(`/${pageArgs.path}`) // res.redirect(`/${pageArgs.path}`)
} // }
}) // })
/** // /**
* Page ID redirection // * Page ID redirection
*/ // */
router.get(['/i', '/i/:id'], async (req, res, next) => { // router.get(['/i', '/i/:id'], async (req, res, next) => {
const pageId = _.toSafeInteger(req.params.id) // const pageId = _.toSafeInteger(req.params.id)
if (pageId <= 0) { // if (pageId <= 0) {
return res.redirect('/') // return res.redirect('/')
} // }
const page = await WIKI.db.pages.query().column(['path', 'localeCode', 'isPrivate', 'privateNS']).findById(pageId) // const page = await WIKI.db.pages.query().column(['path', 'localeCode', 'isPrivate', 'privateNS']).findById(pageId)
if (!page) { // if (!page) {
_.set(res.locals, 'pageMeta.title', 'Page Not Found') // _.set(res.locals, 'pageMeta.title', 'Page Not Found')
return res.status(404).render('notfound', { action: 'view' }) // return res.status(404).render('notfound', { action: 'view' })
} // }
if (!WIKI.auth.checkAccess(req.user, ['read:pages'], { // if (!WIKI.auth.checkAccess(req.user, ['read:pages'], {
locale: page.localeCode, // locale: page.localeCode,
path: page.path, // path: page.path,
private: page.isPrivate, // private: page.isPrivate,
privateNS: page.privateNS, // privateNS: page.privateNS,
explicitLocale: false, // explicitLocale: false,
tags: page.tags // tags: page.tags
})) { // })) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized') // _.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'view' }) // return res.render('unauthorized', { action: 'view' })
} // }
if (WIKI.config.lang.namespacing) { // if (WIKI.config.lang.namespacing) {
return res.redirect(`/${page.localeCode}/${page.path}`) // return res.redirect(`/${page.localeCode}/${page.path}`)
} else { // } else {
return res.redirect(`/${page.path}`) // return res.redirect(`/${page.path}`)
} // }
}) // })
/** // /**
* Source // * Source
*/ // */
router.get(['/s', '/s/*'], async (req, res, next) => { // router.get(['/s', '/s/*'], async (req, res, next) => {
const pageArgs = pageHelper.parsePath(req.path, { stripExt: true }) // const pageArgs = pageHelper.parsePath(req.path, { stripExt: true })
const versionId = (req.query.v) ? _.toSafeInteger(req.query.v) : 0 // const versionId = (req.query.v) ? _.toSafeInteger(req.query.v) : 0
const page = await WIKI.db.pages.getPageFromDb({ // const page = await WIKI.db.pages.getPageFromDb({
path: pageArgs.path, // path: pageArgs.path,
locale: pageArgs.locale, // locale: pageArgs.locale,
userId: req.user.id, // userId: req.user.id,
isPrivate: false // isPrivate: false
}) // })
pageArgs.tags = _.get(page, 'tags', []) // pageArgs.tags = _.get(page, 'tags', [])
if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) { // if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
return res.redirect(`/s/${pageArgs.locale}/${pageArgs.path}`) // return res.redirect(`/s/${pageArgs.locale}/${pageArgs.path}`)
} // }
// -> Effective Permissions // // -> Effective Permissions
const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs) // const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs)
_.set(res, 'locals.siteConfig.lang', pageArgs.locale) // _.set(res, 'locals.siteConfig.lang', pageArgs.locale)
_.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl') // _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl')
if (versionId > 0) { // if (versionId > 0) {
if (!effectivePermissions.history.read) { // if (!effectivePermissions.history.read) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized') // _.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'sourceVersion' }) // return res.render('unauthorized', { action: 'sourceVersion' })
} // }
} else { // } else {
if (!effectivePermissions.source.read) { // if (!effectivePermissions.source.read) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized') // _.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'source' }) // return res.render('unauthorized', { action: 'source' })
} // }
} // }
if (page) { // if (page) {
if (versionId > 0) { // if (versionId > 0) {
const pageVersion = await WIKI.db.pageHistory.getVersion({ pageId: page.id, versionId }) // const pageVersion = await WIKI.db.pageHistory.getVersion({ pageId: page.id, versionId })
_.set(res.locals, 'pageMeta.title', pageVersion.title) // _.set(res.locals, 'pageMeta.title', pageVersion.title)
_.set(res.locals, 'pageMeta.description', pageVersion.description) // _.set(res.locals, 'pageMeta.description', pageVersion.description)
res.render('source', { // res.render('source', {
page: { // page: {
...page, // ...page,
...pageVersion // ...pageVersion
}, // },
effectivePermissions // effectivePermissions
}) // })
} else { // } else {
_.set(res.locals, 'pageMeta.title', page.title) // _.set(res.locals, 'pageMeta.title', page.title)
_.set(res.locals, 'pageMeta.description', page.description) // _.set(res.locals, 'pageMeta.description', page.description)
res.render('source', { page, effectivePermissions }) // res.render('source', { page, effectivePermissions })
} // }
} else { // } else {
res.redirect(`/${pageArgs.path}`) // res.redirect(`/${pageArgs.path}`)
} // }
}) // })
/** // /**
* Tags // * Tags
*/ // */
router.get(['/t', '/t/*'], (req, res, next) => { // router.get(['/t', '/t/*'], (req, res, next) => {
_.set(res.locals, 'pageMeta.title', 'Tags') // _.set(res.locals, 'pageMeta.title', 'Tags')
res.render('tags') // res.render('tags')
}) // })
/** /**
* User Avatar * User Avatar
...@@ -448,96 +434,100 @@ router.get('/_user/:uid/avatar', async (req, res, next) => { ...@@ -448,96 +434,100 @@ router.get('/_user/:uid/avatar', async (req, res, next) => {
return res.sendStatus(404) return res.sendStatus(404)
}) })
/** // /**
* View document / asset // * View document / asset
*/ // */
router.get('/*', async (req, res, next) => { // router.get('/*', async (req, res, next) => {
const stripExt = _.some(WIKI.data.pageExtensions, ext => _.endsWith(req.path, `.${ext}`)) // const stripExt = _.some(WIKI.data.pageExtensions, ext => _.endsWith(req.path, `.${ext}`))
const pageArgs = pageHelper.parsePath(req.path, { stripExt }) // const pageArgs = pageHelper.parsePath(req.path, { stripExt })
const isPage = (stripExt || pageArgs.path.indexOf('.') === -1) // const isPage = (stripExt || pageArgs.path.indexOf('.') === -1)
const site = await WIKI.db.sites.getSiteByHostname({ hostname: req.hostname }) // const site = await WIKI.db.sites.getSiteByHostname({ hostname: req.hostname })
// if (!site) {
// throw new Error('INVALID_SITE')
// }
if (!site) { // if (isPage) {
throw new Error('INVALID_SITE') // // if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
} // // return res.redirect(`/${pageArgs.locale}/${pageArgs.path}`)
// // }
if (isPage) { // // req.i18n.changeLanguage(pageArgs.locale)
// if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
// return res.redirect(`/${pageArgs.locale}/${pageArgs.path}`)
// }
// req.i18n.changeLanguage(pageArgs.locale) // try {
// // -> Get Page from cache
// const page = await WIKI.db.pages.getPage({
// siteId: site.id,
// path: pageArgs.path,
// locale: pageArgs.locale,
// userId: req.user.id
// })
// pageArgs.tags = _.get(page, 'tags', [])
try { // // -> Effective Permissions
// -> Get Page from cache // const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs)
const page = await WIKI.db.pages.getPage({
siteId: site.id,
path: pageArgs.path,
locale: pageArgs.locale,
userId: req.user.id
})
pageArgs.tags = _.get(page, 'tags', [])
// -> Effective Permissions // // -> Check User Access
const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs) // if (!effectivePermissions.pages.read) {
// if (req.user.id === WIKI.auth.guest.id) {
// res.cookie('loginRedirect', req.path, {
// maxAge: 15 * 60 * 1000
// })
// }
// if (pageArgs.path === 'home' && req.user.id === WIKI.auth.guest.id) {
// return res.redirect('/login')
// }
// return res.redirect(`/_error/unauthorized?from=${req.path}`)
// }
// -> Check User Access // _.set(res, 'locals.siteConfig.lang', pageArgs.locale)
if (!effectivePermissions.pages.read) { // // _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl')
if (req.user.id === WIKI.auth.guest.id) {
res.cookie('loginRedirect', req.path, {
maxAge: 15 * 60 * 1000
})
}
if (pageArgs.path === 'home' && req.user.id === WIKI.auth.guest.id) {
return res.redirect('/login')
}
return res.redirect(`/_error/unauthorized?from=${req.path}`)
}
_.set(res, 'locals.siteConfig.lang', pageArgs.locale) // if (page) {
// _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl') // _.set(res.locals, 'pageMeta.title', page.title)
// _.set(res.locals, 'pageMeta.description', page.description)
if (page) { // // -> Check Publishing State
_.set(res.locals, 'pageMeta.title', page.title) // let pageIsPublished = page.isPublished
_.set(res.locals, 'pageMeta.description', page.description) // if (pageIsPublished && !_.isEmpty(page.publishStartDate)) {
// pageIsPublished = moment(page.publishStartDate).isSameOrBefore()
// }
// if (pageIsPublished && !_.isEmpty(page.publishEndDate)) {
// pageIsPublished = moment(page.publishEndDate).isSameOrAfter()
// }
// if (!pageIsPublished && !effectivePermissions.pages.write) {
// _.set(res.locals, 'pageMeta.title', 'Unauthorized')
// return res.status(403).render('unauthorized', {
// action: 'view'
// })
// }
// -> Check Publishing State // // -> Render view
let pageIsPublished = page.isPublished // res.sendFile(path.join(WIKI.ROOTPATH, 'assets/index.html'))
if (pageIsPublished && !_.isEmpty(page.publishStartDate)) { // } else if (pageArgs.path === 'home') {
pageIsPublished = moment(page.publishStartDate).isSameOrBefore() // res.redirect('/_welcome')
} // } else {
if (pageIsPublished && !_.isEmpty(page.publishEndDate)) { // _.set(res.locals, 'pageMeta.title', 'Page Not Found')
pageIsPublished = moment(page.publishEndDate).isSameOrAfter() // if (effectivePermissions.pages.write) {
} // res.status(404).render('new', { path: pageArgs.path, locale: pageArgs.locale })
if (!pageIsPublished && !effectivePermissions.pages.write) { // } else {
_.set(res.locals, 'pageMeta.title', 'Unauthorized') // res.status(404).render('notfound', { action: 'view' })
return res.status(403).render('unauthorized', { // }
action: 'view' // }
}) // } catch (err) {
} // next(err)
// }
// } else {
// if (!WIKI.auth.checkAccess(req.user, ['read:assets'], pageArgs)) {
// return res.sendStatus(403)
// }
// -> Render view // await WIKI.db.assets.getAsset(pageArgs.path, res)
res.sendFile(path.join(WIKI.ROOTPATH, 'assets/index.html')) // }
} else if (pageArgs.path === 'home') { // })
res.redirect('/_welcome')
} else {
_.set(res.locals, 'pageMeta.title', 'Page Not Found')
if (effectivePermissions.pages.write) {
res.status(404).render('new', { path: pageArgs.path, locale: pageArgs.locale })
} else {
res.status(404).render('notfound', { action: 'view' })
}
}
} catch (err) {
next(err)
}
} else {
if (!WIKI.auth.checkAccess(req.user, ['read:assets'], pageArgs)) {
return res.sendStatus(403)
}
await WIKI.db.assets.getAsset(pageArgs.path, res) router.get('/*', (req, res, next) => {
} res.sendFile(path.join(WIKI.ROOTPATH, 'assets/index.html'))
}) })
module.exports = router module.exports = router
...@@ -74,17 +74,13 @@ module.exports = async () => { ...@@ -74,17 +74,13 @@ module.exports = async () => {
index: false, index: false,
maxAge: '7d' maxAge: '7d'
})) }))
app.use('/_assets-legacy/svg/twemoji', async (req, res, next) => { app.use('/_assets/svg/twemoji', async (req, res, next) => {
try { try {
WIKI.asar.serve('twemoji', req, res, next) WIKI.asar.serve('twemoji', req, res, next)
} catch (err) { } catch (err) {
res.sendStatus(404) res.sendStatus(404)
} }
}) })
app.use('/_assets-legacy', express.static(path.join(WIKI.ROOTPATH, 'assets-legacy'), {
index: false,
maxAge: '7d'
}))
// ---------------------------------------- // ----------------------------------------
// SSL Handlers // SSL Handlers
......
...@@ -27,6 +27,7 @@ q-header.bg-header.text-white.site-header( ...@@ -27,6 +27,7 @@ q-header.bg-header.text-white.site-header(
q-toolbar.gt-sm( q-toolbar.gt-sm(
style='height: 64px;' style='height: 64px;'
dark dark
v-if='siteStore.features.search'
) )
q-input( q-input(
dark dark
......
...@@ -126,6 +126,17 @@ ...@@ -126,6 +126,17 @@
@click='discardChanges' @click='discardChanges'
) )
q-btn.acrylic-btn( q-btn.acrylic-btn(
v-if='editorStore.mode === `create`'
flat
icon='las la-check'
color='positive'
label='Create Page'
aria-label='Create Page'
no-caps
@click='createPage'
)
q-btn.acrylic-btn(
v-else
flat flat
icon='las la-check' icon='las la-check'
color='positive' color='positive'
...@@ -246,10 +257,49 @@ async function saveChanges () { ...@@ -246,10 +257,49 @@ async function saveChanges () {
$q.loading.hide() $q.loading.hide()
} }
function editPage () { async function createPage () {
$q.dialog({
component: defineAsyncComponent(() => import('../components/TreeBrowserDialog.vue')),
componentProps: {
mode: 'createPage',
folderPath: '',
itemTitle: pageStore.title,
itemFileName: pageStore.path
}
}).onOk(async ({ path, title }) => {
$q.loading.show()
try {
pageStore.$patch({
title,
path
})
await pageStore.pageSave()
$q.notify({
type: 'positive',
message: 'Page created successfully.'
})
editorStore.$patch({
isActive: false
})
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to create page.',
caption: err.message
})
}
$q.loading.hide()
})
}
async function editPage () {
$q.loading.show()
await pageStore.pageLoad({ id: pageStore.id, withContent: true })
editorStore.$patch({ editorStore.$patch({
isActive: true, isActive: true,
editor: 'markdown' mode: 'edit',
editor: pageStore.editor
}) })
$q.loading.hide()
} }
</script> </script>
...@@ -230,7 +230,10 @@ const files = computed(() => { ...@@ -230,7 +230,10 @@ const files = computed(() => {
// METHODS // METHODS
async function save () { async function save () {
onDialogOK() onDialogOK({
title: state.title,
path: state.path
})
} }
async function treeLazyLoad (nodeId, { done, fail }) { async function treeLazyLoad (nodeId, { done, fail }) {
......
...@@ -93,7 +93,7 @@ function createHomePage (editor) { ...@@ -93,7 +93,7 @@ function createHomePage (editor) {
pageStore.pageCreate({ pageStore.pageCreate({
editor, editor,
locale: 'en', locale: 'en',
path: '', path: 'home',
title: t('welcome.homeDefault.title'), title: t('welcome.homeDefault.title'),
description: t('welcome.homeDefault.description'), description: t('welcome.homeDefault.description'),
content: t('welcome.homeDefault.content') content: t('welcome.homeDefault.content')
......
...@@ -752,12 +752,7 @@ async function save () { ...@@ -752,12 +752,7 @@ async function save () {
}) })
await adminStore.fetchSites() await adminStore.fetchSites()
if (adminStore.currentSiteId === siteStore.id) { if (adminStore.currentSiteId === siteStore.id) {
siteStore.$patch({ siteStore.loadSite(window.location.hostname)
title: state.config.title,
description: state.config.description,
company: state.config.company,
contentLicense: state.config.contentLicense
})
} }
} catch (err) { } catch (err) {
$q.notify({ $q.notify({
......
...@@ -78,6 +78,34 @@ const gqlQueries = { ...@@ -78,6 +78,34 @@ const gqlQueries = {
} }
} }
${pagePropsFragment} ${pagePropsFragment}
`,
pageByIdWithContent: gql`
query loadPageWithContent (
$id: UUID!
) {
pageById(
id: $id
) {
...PageRead,
content
}
}
${pagePropsFragment}
`,
pageByPathWithContent: gql`
query loadPageWithContent (
$siteId: UUID!
$path: String!
) {
pageByPath(
siteId: $siteId
path: $path
) {
...PageRead,
content
}
}
${pagePropsFragment}
` `
} }
...@@ -92,6 +120,7 @@ export const usePageStore = defineStore('page', { ...@@ -92,6 +120,7 @@ export const usePageStore = defineStore('page', {
content: '', content: '',
createdAt: '', createdAt: '',
description: '', description: '',
editor: '',
icon: 'las la-file-alt', icon: 'las la-file-alt',
id: '', id: '',
isBrowsable: true, isBrowsable: true,
...@@ -140,12 +169,18 @@ export const usePageStore = defineStore('page', { ...@@ -140,12 +169,18 @@ export const usePageStore = defineStore('page', {
/** /**
* PAGE - LOAD * PAGE - LOAD
*/ */
async pageLoad ({ path, id }) { async pageLoad ({ path, id, withContent = false }) {
const editorStore = useEditorStore() const editorStore = useEditorStore()
const siteStore = useSiteStore() const siteStore = useSiteStore()
try { try {
let query
if (withContent) {
query = id ? gqlQueries.pageByIdWithContent : gqlQueries.pageByPathWithContent
} else {
query = id ? gqlQueries.pageById : gqlQueries.pageByPath
}
const resp = await APOLLO_CLIENT.query({ const resp = await APOLLO_CLIENT.query({
query: id ? gqlQueries.pageById : gqlQueries.pageByPath, query,
variables: id ? { id } : { siteId: siteStore.id, path }, variables: id ? { id } : { siteId: siteStore.id, path },
fetchPolicy: 'network-only' fetchPolicy: 'network-only'
}) })
...@@ -221,7 +256,107 @@ export const usePageStore = defineStore('page', { ...@@ -221,7 +256,107 @@ export const usePageStore = defineStore('page', {
*/ */
async pageSave () { async pageSave () {
const editorStore = useEditorStore() const editorStore = useEditorStore()
const siteStore = useSiteStore()
try { try {
if (editorStore.mode === 'create') {
const resp = await APOLLO_CLIENT.mutate({
mutation: gql`
mutation createPage (
$allowComments: Boolean
$allowContributions: Boolean
$allowRatings: Boolean
$content: String!
$description: String!
$editor: String!
$icon: String
$isBrowsable: Boolean
$locale: String!
$path: String!
$publishState: PagePublishState!
$publishEndDate: Date
$publishStartDate: Date
$relations: [PageRelationInput!]
$scriptCss: String
$scriptJsLoad: String
$scriptJsUnload: String
$showSidebar: Boolean
$showTags: Boolean
$showToc: Boolean
$siteId: UUID!
$tags: [String!]
$title: String!
$tocDepth: PageTocDepthInput
) {
createPage (
allowComments: $allowComments
allowContributions: $allowContributions
allowRatings: $allowRatings
content: $content
description: $description
editor: $editor
icon: $icon
isBrowsable: $isBrowsable
locale: $locale
path: $path
publishState: $publishState
publishEndDate: $publishEndDate
publishStartDate: $publishStartDate
relations: $relations
scriptCss: $scriptCss
scriptJsLoad: $scriptJsLoad
scriptJsUnload: $scriptJsUnload
showSidebar: $showSidebar
showTags: $showTags
showToc: $showToc
siteId: $siteId
tags: $tags
title: $title
tocDepth: $tocDepth
) {
operation {
succeeded
message
}
}
}
`,
variables: {
...pick(this, [
'allowComments',
'allowContributions',
'allowRatings',
'content',
'description',
'icon',
'isBrowsable',
'locale',
'password',
'path',
'publishEndDate',
'publishStartDate',
'publishState',
'relations',
'scriptJsLoad',
'scriptJsUnload',
'scriptCss',
'showSidebar',
'showTags',
'showToc',
'tags',
'title',
'tocDepth'
]),
editor: editorStore.editor,
siteId: siteStore.id
}
})
const result = resp?.data?.createPage?.operation ?? {}
if (!result.succeeded) {
throw new Error(result.message)
}
this.id = resp.data.createPage.page.id
this.editor = editorStore.editor
} else {
const resp = await APOLLO_CLIENT.mutate({ const resp = await APOLLO_CLIENT.mutate({
mutation: gql` mutation: gql`
mutation savePage ( mutation savePage (
...@@ -245,7 +380,7 @@ export const usePageStore = defineStore('page', { ...@@ -245,7 +380,7 @@ export const usePageStore = defineStore('page', {
'allowComments', 'allowComments',
'allowContributions', 'allowContributions',
'allowRatings', 'allowRatings',
// 'content', 'content',
'description', 'description',
'icon', 'icon',
'isBrowsable', 'isBrowsable',
...@@ -272,6 +407,7 @@ export const usePageStore = defineStore('page', { ...@@ -272,6 +407,7 @@ export const usePageStore = defineStore('page', {
if (!result.succeeded) { if (!result.succeeded) {
throw new Error(result.message) throw new Error(result.message)
} }
}
// Update editor state timestamps // Update editor state timestamps
const curDate = DateTime.utc() const curDate = DateTime.utc()
editorStore.$patch({ editorStore.$patch({
......
...@@ -26,7 +26,9 @@ export const useSiteStore = defineStore('site', { ...@@ -26,7 +26,9 @@ export const useSiteStore = defineStore('site', {
showSidebar: true, showSidebar: true,
overlay: null, overlay: null,
features: { features: {
ratingsMode: 'off' ratingsMode: 'off',
reasonForChange: 'required',
search: false
}, },
editors: { editors: {
asciidoc: false, asciidoc: false,
...@@ -87,6 +89,8 @@ export const useSiteStore = defineStore('site', { ...@@ -87,6 +89,8 @@ export const useSiteStore = defineStore('site', {
footerExtra footerExtra
features { features {
ratingsMode ratingsMode
reasonForChange
search
} }
editors { editors {
asciidoc { asciidoc {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment