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) {
const fileName = _.last(page.path.split('/')) + '.' + pageHelper.getFileExtension(page.contentType)
res.attachment(fileName)
if (versionId > 0) {
const pageVersion = await WIKI.db.pageHistory.getVersion({ pageId: page.id, versionId })
res.send(pageHelper.injectPageMetadata(pageVersion))
} else {
res.send(pageHelper.injectPageMetadata(page))
}
} else {
res.status(404).end()
}
})
/**
* Create/Edit document
*/
router.get(['/_edit', '/_edit/*'], async (req, res, next) => {
const pageArgs = pageHelper.parsePath(req.path, { stripExt: true })
const site = await WIKI.db.sites.getSiteByHostname({ hostname: req.hostname })
if (!site) {
throw new Error('INVALID_SITE')
}
if (pageArgs.path === '') {
return res.redirect(`/_edit/home`)
}
// if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
// return res.redirect(`/_edit/${pageArgs.locale}/${pageArgs.path}`)
// }
// req.i18n.changeLanguage(pageArgs.locale) // if (page) {
// const fileName = _.last(page.path.split('/')) + '.' + pageHelper.getFileExtension(page.contentType)
// res.attachment(fileName)
// if (versionId > 0) {
// const pageVersion = await WIKI.db.pageHistory.getVersion({ pageId: page.id, versionId })
// res.send(pageHelper.injectPageMetadata(pageVersion))
// } else {
// res.send(pageHelper.injectPageMetadata(page))
// }
// } else {
// res.status(404).end()
// }
// })
// -> Set Editor Lang // /**
_.set(res, 'locals.siteConfig.lang', pageArgs.locale) // * Create/Edit document
// _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl') // */
// router.get(['/_edit', '/_edit/*'], async (req, res, next) => {
// const pageArgs = pageHelper.parsePath(req.path, { stripExt: true })
// const site = await WIKI.db.sites.getSiteByHostname({ hostname: req.hostname })
// -> Check for reserved path // if (!site) {
if (pageHelper.isReservedPath(pageArgs.path)) { // throw new Error('INVALID_SITE')
return next(new Error('Cannot create this page because it starts with a system reserved path.')) // }
}
// -> Get page data from DB // if (pageArgs.path === '') {
let page = await WIKI.db.pages.getPageFromDb({ // return res.redirect(`/_edit/home`)
siteId: site.id, // }
path: pageArgs.path,
locale: pageArgs.locale,
userId: req.user.id
})
pageArgs.tags = _.get(page, 'tags', []) // // if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
// // return res.redirect(`/_edit/${pageArgs.locale}/${pageArgs.path}`)
// // }
// -> Effective Permissions // // req.i18n.changeLanguage(pageArgs.locale)
const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs)
const injectCode = { // // -> Set Editor Lang
css: '', // WIKI.config.theming.injectCSS, // _.set(res, 'locals.siteConfig.lang', pageArgs.locale)
head: '', // WIKI.config.theming.injectHead, // // _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl')
body: '' // WIKI.config.theming.injectBody
}
if (page) { // // -> Check for reserved path
// -> EDIT MODE // if (pageHelper.isReservedPath(pageArgs.path)) {
if (!(effectivePermissions.pages.write || effectivePermissions.pages.manage)) { // return next(new Error('Cannot create this page because it starts with a system reserved path.'))
_.set(res.locals, 'pageMeta.title', 'Unauthorized') // }
return res.render('unauthorized', { action: 'edit' })
}
// -> Get page tags // // -> Get page data from DB
await page.$relatedQuery('tags') // let page = await WIKI.db.pages.getPageFromDb({
page.tags = _.map(page.tags, 'tag') // siteId: site.id,
// path: pageArgs.path,
// locale: pageArgs.locale,
// userId: req.user.id
// })
// Handle missing extra field // pageArgs.tags = _.get(page, 'tags', [])
page.extra = page.extra || { css: '', js: '' }
// -> Beautify Script CSS // // -> Effective Permissions
if (!_.isEmpty(page.extra.css)) { // const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs)
page.extra.css = new CleanCSS({ format: 'beautify' }).minify(page.extra.css).styles
}
_.set(res.locals, 'pageMeta.title', `Edit ${page.title}`) // const injectCode = {
_.set(res.locals, 'pageMeta.description', page.description) // css: '', // WIKI.config.theming.injectCSS,
page.mode = 'update' // head: '', // WIKI.config.theming.injectHead,
page.isPublished = (page.isPublished === true || page.isPublished === 1) ? 'true' : 'false' // body: '' // WIKI.config.theming.injectBody
page.content = Buffer.from(page.content).toString('base64') // }
} else {
// -> CREATE MODE
if (!effectivePermissions.pages.write) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'create' })
}
_.set(res.locals, 'pageMeta.title', `New Page`)
page = {
path: pageArgs.path,
localeCode: pageArgs.locale,
editorKey: null,
mode: 'create',
content: null,
title: null,
description: null,
updatedAt: new Date().toISOString(),
extra: {
css: '',
js: ''
}
}
}
res.render('editor', { page, injectCode, effectivePermissions }) // if (page) {
}) // // -> EDIT MODE
// if (!(effectivePermissions.pages.write || effectivePermissions.pages.manage)) {
// _.set(res.locals, 'pageMeta.title', 'Unauthorized')
// return res.render('unauthorized', { action: 'edit' })
// }
// // -> Get page tags
// await page.$relatedQuery('tags')
// page.tags = _.map(page.tags, 'tag')
// // Handle missing extra field
// page.extra = page.extra || { css: '', js: '' }
// // -> Beautify Script CSS
// if (!_.isEmpty(page.extra.css)) {
// page.extra.css = new CleanCSS({ format: 'beautify' }).minify(page.extra.css).styles
// }
// _.set(res.locals, 'pageMeta.title', `Edit ${page.title}`)
// _.set(res.locals, 'pageMeta.description', page.description)
// page.mode = 'update'
// page.isPublished = (page.isPublished === true || page.isPublished === 1) ? 'true' : 'false'
// page.content = Buffer.from(page.content).toString('base64')
// } else {
// // -> CREATE MODE
// if (!effectivePermissions.pages.write) {
// _.set(res.locals, 'pageMeta.title', 'Unauthorized')
// return res.render('unauthorized', { action: 'create' })
// }
// _.set(res.locals, 'pageMeta.title', `New Page`)
// page = {
// path: pageArgs.path,
// localeCode: pageArgs.locale,
// editorKey: null,
// mode: 'create',
// content: null,
// title: null,
// description: null,
// updatedAt: new Date().toISOString(),
// extra: {
// css: '',
// js: ''
// }
// }
// }
/** // res.render('editor', { page, injectCode, effectivePermissions })
* History // })
*/
router.get(['/h', '/h/*'], async (req, res, next) => {
const pageArgs = pageHelper.parsePath(req.path, { stripExt: true })
if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) { // /**
return res.redirect(`/h/${pageArgs.locale}/${pageArgs.path}`) // * History
} // */
// router.get(['/h', '/h/*'], async (req, res, next) => {
// const pageArgs = pageHelper.parsePath(req.path, { stripExt: true })
req.i18n.changeLanguage(pageArgs.locale) // if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
// return res.redirect(`/h/${pageArgs.locale}/${pageArgs.path}`)
// }
_.set(res, 'locals.siteConfig.lang', pageArgs.locale) // req.i18n.changeLanguage(pageArgs.locale)
_.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl')
const page = await WIKI.db.pages.getPageFromDb({ // _.set(res, 'locals.siteConfig.lang', pageArgs.locale)
path: pageArgs.path, // _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl')
locale: pageArgs.locale,
userId: req.user.id,
isPrivate: false
})
if (!page) { // const page = await WIKI.db.pages.getPageFromDb({
_.set(res.locals, 'pageMeta.title', 'Page Not Found') // path: pageArgs.path,
return res.status(404).render('notfound', { action: 'history' }) // locale: pageArgs.locale,
} // userId: req.user.id,
// isPrivate: false
// })
pageArgs.tags = _.get(page, 'tags', []) // if (!page) {
// _.set(res.locals, 'pageMeta.title', 'Page Not Found')
// return res.status(404).render('notfound', { action: 'history' })
// }
const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs) // pageArgs.tags = _.get(page, 'tags', [])
if (!effectivePermissions.history.read) { // const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs)
_.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'history' })
}
if (page) { // if (!effectivePermissions.history.read) {
_.set(res.locals, 'pageMeta.title', page.title) // _.set(res.locals, 'pageMeta.title', 'Unauthorized')
_.set(res.locals, 'pageMeta.description', page.description) // return res.render('unauthorized', { action: 'history' })
// }
res.render('history', { page, effectivePermissions }) // if (page) {
} else { // _.set(res.locals, 'pageMeta.title', page.title)
res.redirect(`/${pageArgs.path}`) // _.set(res.locals, 'pageMeta.description', page.description)
}
})
/** // res.render('history', { page, effectivePermissions })
* Page ID redirection // } else {
*/ // res.redirect(`/${pageArgs.path}`)
router.get(['/i', '/i/:id'], async (req, res, next) => { // }
const pageId = _.toSafeInteger(req.params.id) // })
if (pageId <= 0) {
return res.redirect('/')
}
const page = await WIKI.db.pages.query().column(['path', 'localeCode', 'isPrivate', 'privateNS']).findById(pageId) // /**
if (!page) { // * Page ID redirection
_.set(res.locals, 'pageMeta.title', 'Page Not Found') // */
return res.status(404).render('notfound', { action: 'view' }) // router.get(['/i', '/i/:id'], async (req, res, next) => {
} // const pageId = _.toSafeInteger(req.params.id)
// if (pageId <= 0) {
// return res.redirect('/')
// }
if (!WIKI.auth.checkAccess(req.user, ['read:pages'], { // const page = await WIKI.db.pages.query().column(['path', 'localeCode', 'isPrivate', 'privateNS']).findById(pageId)
locale: page.localeCode, // if (!page) {
path: page.path, // _.set(res.locals, 'pageMeta.title', 'Page Not Found')
private: page.isPrivate, // return res.status(404).render('notfound', { action: 'view' })
privateNS: page.privateNS, // }
explicitLocale: false,
tags: page.tags
})) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'view' })
}
if (WIKI.config.lang.namespacing) { // if (!WIKI.auth.checkAccess(req.user, ['read:pages'], {
return res.redirect(`/${page.localeCode}/${page.path}`) // locale: page.localeCode,
} else { // path: page.path,
return res.redirect(`/${page.path}`) // private: page.isPrivate,
} // privateNS: page.privateNS,
}) // explicitLocale: false,
// tags: page.tags
// })) {
// _.set(res.locals, 'pageMeta.title', 'Unauthorized')
// return res.render('unauthorized', { action: 'view' })
// }
/** // if (WIKI.config.lang.namespacing) {
* Source // return res.redirect(`/${page.localeCode}/${page.path}`)
*/ // } else {
router.get(['/s', '/s/*'], async (req, res, next) => { // return res.redirect(`/${page.path}`)
const pageArgs = pageHelper.parsePath(req.path, { stripExt: true }) // }
const versionId = (req.query.v) ? _.toSafeInteger(req.query.v) : 0 // })
const page = await WIKI.db.pages.getPageFromDb({
path: pageArgs.path,
locale: pageArgs.locale,
userId: req.user.id,
isPrivate: false
})
pageArgs.tags = _.get(page, 'tags', []) // /**
// * Source
// */
// router.get(['/s', '/s/*'], async (req, res, next) => {
// const pageArgs = pageHelper.parsePath(req.path, { stripExt: true })
// const versionId = (req.query.v) ? _.toSafeInteger(req.query.v) : 0
if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) { // const page = await WIKI.db.pages.getPageFromDb({
return res.redirect(`/s/${pageArgs.locale}/${pageArgs.path}`) // path: pageArgs.path,
} // locale: pageArgs.locale,
// userId: req.user.id,
// isPrivate: false
// })
// -> Effective Permissions // pageArgs.tags = _.get(page, 'tags', [])
const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs)
_.set(res, 'locals.siteConfig.lang', pageArgs.locale) // if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
_.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl') // return res.redirect(`/s/${pageArgs.locale}/${pageArgs.path}`)
// }
if (versionId > 0) { // // -> Effective Permissions
if (!effectivePermissions.history.read) { // const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs)
_.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'sourceVersion' }) // _.set(res, 'locals.siteConfig.lang', pageArgs.locale)
} // _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl')
} else {
if (!effectivePermissions.source.read) { // if (versionId > 0) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized') // if (!effectivePermissions.history.read) {
return res.render('unauthorized', { action: 'source' }) // _.set(res.locals, 'pageMeta.title', 'Unauthorized')
} // return res.render('unauthorized', { action: 'sourceVersion' })
} // }
// } else {
// if (!effectivePermissions.source.read) {
// _.set(res.locals, 'pageMeta.title', 'Unauthorized')
// 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) { // if (!site) {
throw new Error('INVALID_SITE') // throw new Error('INVALID_SITE')
} // }
if (isPage) {
// 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', [])
// -> Effective Permissions
const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs)
// -> Check User Access
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}`)
}
_.set(res, 'locals.siteConfig.lang', pageArgs.locale) // if (isPage) {
// _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl') // // if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
// // return res.redirect(`/${pageArgs.locale}/${pageArgs.path}`)
if (page) { // // }
_.set(res.locals, 'pageMeta.title', page.title)
_.set(res.locals, 'pageMeta.description', page.description) // // req.i18n.changeLanguage(pageArgs.locale)
// -> Check Publishing State // try {
let pageIsPublished = page.isPublished // // -> Get Page from cache
if (pageIsPublished && !_.isEmpty(page.publishStartDate)) { // const page = await WIKI.db.pages.getPage({
pageIsPublished = moment(page.publishStartDate).isSameOrBefore() // siteId: site.id,
} // path: pageArgs.path,
if (pageIsPublished && !_.isEmpty(page.publishEndDate)) { // locale: pageArgs.locale,
pageIsPublished = moment(page.publishEndDate).isSameOrAfter() // userId: req.user.id
} // })
if (!pageIsPublished && !effectivePermissions.pages.write) { // pageArgs.tags = _.get(page, 'tags', [])
_.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.status(403).render('unauthorized', { // // -> Effective Permissions
action: 'view' // const effectivePermissions = WIKI.auth.getEffectivePermissions(req, pageArgs)
})
} // // -> Check User Access
// if (!effectivePermissions.pages.read) {
// -> Render view // if (req.user.id === WIKI.auth.guest.id) {
res.sendFile(path.join(WIKI.ROOTPATH, 'assets/index.html')) // res.cookie('loginRedirect', req.path, {
} else if (pageArgs.path === 'home') { // maxAge: 15 * 60 * 1000
res.redirect('/_welcome') // })
} else { // }
_.set(res.locals, 'pageMeta.title', 'Page Not Found') // if (pageArgs.path === 'home' && req.user.id === WIKI.auth.guest.id) {
if (effectivePermissions.pages.write) { // return res.redirect('/login')
res.status(404).render('new', { path: pageArgs.path, locale: pageArgs.locale }) // }
} else { // return res.redirect(`/_error/unauthorized?from=${req.path}`)
res.status(404).render('notfound', { action: 'view' }) // }
}
} // _.set(res, 'locals.siteConfig.lang', pageArgs.locale)
} catch (err) { // // _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl')
next(err)
} // if (page) {
} else { // _.set(res.locals, 'pageMeta.title', page.title)
if (!WIKI.auth.checkAccess(req.user, ['read:assets'], pageArgs)) { // _.set(res.locals, 'pageMeta.description', page.description)
return res.sendStatus(403)
} // // -> Check Publishing State
// let pageIsPublished = page.isPublished
// 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'
// })
// }
// // -> Render view
// 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)
// }
// })
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,56 +256,157 @@ export const usePageStore = defineStore('page', { ...@@ -221,56 +256,157 @@ export const usePageStore = defineStore('page', {
*/ */
async pageSave () { async pageSave () {
const editorStore = useEditorStore() const editorStore = useEditorStore()
const siteStore = useSiteStore()
try { try {
const resp = await APOLLO_CLIENT.mutate({ if (editorStore.mode === 'create') {
mutation: gql` const resp = await APOLLO_CLIENT.mutate({
mutation savePage ( mutation: gql`
$id: UUID! mutation createPage (
$patch: PageUpdateInput! $allowComments: Boolean
) { $allowContributions: Boolean
updatePage ( $allowRatings: Boolean
id: $id $content: String!
patch: $patch $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
) { ) {
operation { createPage (
succeeded allowComments: $allowComments
message 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
} }
`, })
variables: { const result = resp?.data?.createPage?.operation ?? {}
id: this.id, if (!result.succeeded) {
patch: pick(this, [ throw new Error(result.message)
'allowComments', }
'allowContributions', this.id = resp.data.createPage.page.id
'allowRatings', this.editor = editorStore.editor
// 'content', } else {
'description', const resp = await APOLLO_CLIENT.mutate({
'icon', mutation: gql`
'isBrowsable', mutation savePage (
'locale', $id: UUID!
'password', $patch: PageUpdateInput!
'path', ) {
'publishEndDate', updatePage (
'publishStartDate', id: $id
'publishState', patch: $patch
'relations', ) {
'scriptJsLoad', operation {
'scriptJsUnload', succeeded
'scriptCss', message
'showSidebar', }
'showTags', }
'showToc', }
'tags', `,
'title', variables: {
'tocDepth' id: this.id,
]) patch: 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'
])
}
})
const result = resp?.data?.updatePage?.operation ?? {}
if (!result.succeeded) {
throw new Error(result.message)
} }
})
const result = resp?.data?.updatePage?.operation ?? {}
if (!result.succeeded) {
throw new Error(result.message)
} }
// Update editor state timestamps // Update editor state timestamps
const curDate = DateTime.utc() const curDate = DateTime.utc()
......
...@@ -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