feat: page css + scripts

This commit is contained in:
NGPixel 2020-06-20 16:39:36 -04:00
parent 53ddb50b51
commit 83b83a7510
6 changed files with 55 additions and 16 deletions

View File

@ -111,6 +111,14 @@ export default {
type: Boolean, type: Boolean,
default: true default: true
}, },
scriptCss: {
type: String,
default: ''
},
scriptJs: {
type: String,
default: ''
},
initEditor: { initEditor: {
type: String, type: String,
default: null default: null
@ -185,15 +193,17 @@ export default {
} }
}, },
created() { created() {
this.$store.commit('page/SET_ID', this.pageId) this.$store.set('page/id', this.pageId)
this.$store.commit('page/SET_DESCRIPTION', this.description) this.$store.set('page/description', this.description)
this.$store.commit('page/SET_IS_PUBLISHED', this.isPublished) this.$store.set('page/isPublished', this.isPublished)
this.$store.commit('page/SET_LOCALE', this.locale) this.$store.set('page/locale', this.locale)
this.$store.commit('page/SET_PATH', this.path) this.$store.set('page/path', this.path)
this.$store.commit('page/SET_TAGS', this.tags) this.$store.set('page/tags', this.tags)
this.$store.commit('page/SET_TITLE', this.title) this.$store.set('page/title', this.title)
this.$store.set('page/scriptCss', this.scriptCss)
this.$store.set('page/scriptJs', this.scriptJs)
this.$store.commit('page/SET_MODE', 'edit') this.$store.set('page/mode', 'edit')
this.setCurrentSavedState() this.setCurrentSavedState()

View File

@ -189,11 +189,11 @@
v-tab-item(:transition='false', :reverse-transition='false') v-tab-item(:transition='false', :reverse-transition='false')
.editor-props-codeeditor-title .editor-props-codeeditor-title
.overline {{$t('editor:props.js')}} .overline {{$t('editor:props.html')}}
.editor-props-codeeditor .editor-props-codeeditor
textarea(ref='codejs') textarea(ref='codejs')
.editor-props-codeeditor-hint .editor-props-codeeditor-hint
.caption {{$t('editor:props.jsHint')}} .caption {{$t('editor:props.htmlHint')}}
v-tab-item(transition='fade-transition', reverse-transition='fade-transition') v-tab-item(transition='fade-transition', reverse-transition='fade-transition')
v-card-text v-card-text
@ -250,7 +250,7 @@ import gql from 'graphql-tag'
import CodeMirror from 'codemirror' import CodeMirror from 'codemirror'
import 'codemirror/lib/codemirror.css' import 'codemirror/lib/codemirror.css'
import 'codemirror/mode/javascript/javascript.js' import 'codemirror/mode/htmlmixed/htmlmixed.js'
import 'codemirror/mode/css/css.js' import 'codemirror/mode/css/css.js'
/* global siteLangs, siteConfig */ /* global siteLangs, siteConfig */
@ -323,7 +323,7 @@ export default {
if (newValue === 2) { if (newValue === 2) {
this.$nextTick(() => { this.$nextTick(() => {
setTimeout(() => { setTimeout(() => {
this.loadEditor(this.$refs.codejs, 'javascript') this.loadEditor(this.$refs.codejs, 'html')
}, 100) }, 100)
}) })
} else if (newValue === 4) { } else if (newValue === 4) {
@ -363,7 +363,7 @@ export default {
direction: 'ltr' direction: 'ltr'
}) })
switch (mode) { switch (mode) {
case 'javascript': case 'html':
this.cm.setValue(this.scriptJs) this.cm.setValue(this.scriptJs)
this.cm.on('change', c => { this.cm.on('change', c => {
this.scriptJs = c.getValue() this.scriptJs = c.getValue()

View File

@ -2,6 +2,7 @@ const express = require('express')
const router = express.Router() const router = express.Router()
const pageHelper = require('../helpers/page') const pageHelper = require('../helpers/page')
const _ = require('lodash') const _ = require('lodash')
const CleanCSS = require('clean-css')
/* global WIKI */ /* global WIKI */
@ -153,6 +154,11 @@ router.get(['/e', '/e/*'], async (req, res, next) => {
await page.$relatedQuery('tags') await page.$relatedQuery('tags')
page.tags = _.map(page.tags, 'tag') page.tags = _.map(page.tags, 'tag')
// -> 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.title', `Edit ${page.title}`)
_.set(res.locals, 'pageMeta.description', page.description) _.set(res.locals, 'pageMeta.description', page.description)
page.mode = 'update' page.mode = 'update'
@ -454,6 +460,14 @@ router.get('/*', async (req, res, next) => {
body: WIKI.config.theming.injectBody body: WIKI.config.theming.injectBody
} }
if (!_.isEmpty(page.extra.css)) {
injectCode.css = `${injectCode.css}\n${page.extra.css}`
}
if (!_.isEmpty(page.extra.js)) {
injectCode.body = `${injectCode.body}\n${page.extra.js}`
}
if (req.query.legacy || req.get('user-agent').indexOf('Trident') >= 0) { if (req.query.legacy || req.get('user-agent').indexOf('Trident') >= 0) {
// -> Convert page TOC // -> Convert page TOC
if (_.isString(page.toc)) { if (_.isString(page.toc)) {

View File

@ -51,6 +51,10 @@ module.exports = class Page extends Model {
} }
} }
static get jsonAttributes() {
return ['extra']
}
static get relationMappings() { static get relationMappings() {
return { return {
tags: { tags: {
@ -139,6 +143,10 @@ module.exports = class Page extends Model {
title: 'string' title: 'string'
} }
], ],
extra: {
js: 'string',
css: 'string'
},
title: 'string', title: 'string',
toc: 'string', toc: 'string',
updatedAt: 'string' updatedAt: 'string'
@ -248,7 +256,7 @@ module.exports = class Page extends Model {
throw new WIKI.Error.PageEmptyContent() throw new WIKI.Error.PageEmptyContent()
} }
// -> Format JS Scripts // -> Format CSS Scripts
let scriptCss = '' let scriptCss = ''
if (WIKI.auth.checkAccess(opts.user, ['write:styles'], { if (WIKI.auth.checkAccess(opts.user, ['write:styles'], {
locale: opts.locale, locale: opts.locale,
@ -375,7 +383,7 @@ module.exports = class Page extends Model {
ogPage.extra = {} ogPage.extra = {}
} }
// -> Format JS Scripts // -> Format CSS Scripts
let scriptCss = _.get(ogPage, 'extra.css', '') let scriptCss = _.get(ogPage, 'extra.css', '')
if (WIKI.auth.checkAccess(opts.user, ['write:styles'], { if (WIKI.auth.checkAccess(opts.user, ['write:styles'], {
locale: opts.locale, locale: opts.locale,
@ -787,6 +795,7 @@ module.exports = class Page extends Model {
'pages.localeCode', 'pages.localeCode',
'pages.authorId', 'pages.authorId',
'pages.creatorId', 'pages.creatorId',
'pages.extra',
{ {
authorName: 'author.name', authorName: 'author.name',
authorEmail: 'author.email', authorEmail: 'author.email',
@ -846,6 +855,10 @@ module.exports = class Page extends Model {
creatorId: page.creatorId, creatorId: page.creatorId,
creatorName: page.creatorName, creatorName: page.creatorName,
description: page.description, description: page.description,
extra: {
css: page.extra ? page.extra.css : '',
js: page.extra ? page.extra.js : ''
},
isPrivate: page.isPrivate === 1 || page.isPrivate === true, isPrivate: page.isPrivate === 1 || page.isPrivate === true,
isPublished: page.isPublished === 1 || page.isPublished === true, isPublished: page.isPublished === 1 || page.isPublished === true,
publishEndDate: page.publishEndDate, publishEndDate: page.publishEndDate,

View File

@ -14,6 +14,8 @@ block body
description=page.description description=page.description
:tags=page.tags :tags=page.tags
:is-published=page.isPublished :is-published=page.isPublished
script-css=page.extra.css
script-js=page.extra.js
init-mode=page.mode init-mode=page.mode
init-editor=page.editorKey init-editor=page.editorKey
init-content=page.content init-content=page.content

View File

@ -4,7 +4,7 @@ block body
#root.is-fullscreen #root.is-fullscreen
.app-error .app-error
a(href='/') a(href='/')
img(src='/svg/logo-wikijs.svg') img(src='/_assets/svg/logo-wikijs.svg')
strong Oops, something went wrong... strong Oops, something went wrong...
span= message span= message