feat: save rendering configuration

This commit is contained in:
NGPixel 2019-12-21 16:41:03 -05:00
parent 9166e27e87
commit 3b347f262c
8 changed files with 34 additions and 121 deletions

View File

@ -20,7 +20,6 @@
flat flat
dark dark
) )
v-icon.mr-2 mdi-creation
.subtitle-1 Pipeline .subtitle-1 Pipeline
v-expansion-panels.adm-rendering-pipeline( v-expansion-panels.adm-rendering-pipeline(
v-model='selectedCore' v-model='selectedCore'
@ -132,6 +131,7 @@ import { get } from 'vuex-pathify'
import { StatusIndicator } from 'vue-status-indicator' import { StatusIndicator } from 'vue-status-indicator'
import renderersQuery from 'gql/admin/rendering/rendering-query-renderers.gql' import renderersQuery from 'gql/admin/rendering/rendering-query-renderers.gql'
import renderersSaveMutation from 'gql/admin/rendering/rendering-mutation-save-renderers.gql'
export default { export default {
components: { components: {
@ -164,18 +164,34 @@ export default {
}) })
}, },
async refresh () { async refresh () {
await this.$apollo.queries.renderers.refetch()
this.$store.commit('showNotification', { this.$store.commit('showNotification', {
style: 'indigo', message: 'Rendering active configuration has been reloaded.',
message: `Coming soon...`, style: 'success',
icon: 'directions_boat' icon: 'cached'
}) })
}, },
async save () { async save () {
this.$store.commit('showNotification', { this.$store.commit(`loadingStart`, 'admin-rendering-saverenderers')
style: 'indigo', await this.$apollo.mutate({
message: `Coming soon...`, mutation: renderersSaveMutation,
icon: 'directions_boat' variables: {
renderers: _.reduce(this.renderers, (result, core) => {
result = _.concat(result, core.children.map(rd => ({
key: rd.key,
isEnabled: rd.isEnabled,
config: rd.config.map(cfg => ({ key: cfg.key, value: JSON.stringify({ v: cfg.value.value }) }))
})))
return result
}, [])
}
}) })
this.$store.commit('showNotification', {
message: 'Rendering configuration saved successfully.',
style: 'success',
icon: 'check'
})
this.$store.commit(`loadingStop`, 'admin-rendering-saverenderers')
} }
}, },
apollo: { apollo: {

View File

@ -41,10 +41,10 @@ module.exports = {
async updateRenderers(obj, args, context) { async updateRenderers(obj, args, context) {
try { try {
for (let rdr of args.renderers) { for (let rdr of args.renderers) {
await WIKI.models.storage.query().patch({ await WIKI.models.renderers.query().patch({
isEnabled: rdr.isEnabled, isEnabled: rdr.isEnabled,
config: _.reduce(rdr.config, (result, value, key) => { config: _.reduce(rdr.config, (result, value, key) => {
_.set(result, `${value.key}`, value.value) _.set(result, `${value.key}`, _.get(JSON.parse(value.value), 'v', null))
return result return result
}, {}) }, {})
}).where('key', rdr.key) }).where('key', rdr.key)

View File

@ -50,6 +50,5 @@ type Renderer {
input RendererInput { input RendererInput {
isEnabled: Boolean! isEnabled: Boolean!
key: String! key: String!
mode: String!
config: [KeyValuePairInput] config: [KeyValuePairInput]
} }

View File

@ -90,6 +90,14 @@ module.exports = class Renderer extends Model {
} else { } else {
WIKI.logger.info(`No new renderers found: [ SKIPPED ]`) WIKI.logger.info(`No new renderers found: [ SKIPPED ]`)
} }
// -> Delete removed Renderers
for (const renderer of dbRenderers) {
if (!_.some(WIKI.data.renderers, ['key', renderer.key])) {
await WIKI.models.renderers.query().where('key', renderer.key).del()
WIKI.logger.info(`Removed renderer ${renderer.key} because it is no longer present in the modules folder: [ OK ]`)
}
}
} catch (err) { } catch (err) {
WIKI.logger.error(`Failed to scan or load new renderers: [ FAILED ]`) WIKI.logger.error(`Failed to scan or load new renderers: [ FAILED ]`)
WIKI.logger.error(err) WIKI.logger.error(err)

View File

@ -1,9 +0,0 @@
key: htmlMathjax
title: Mathjax Processor
description: TeX/MathML Math Equations Parser
author: requarks.io
icon: mdi-function-variant
enabledDefault: false
dependsOn: htmlCore
step: pre
props: {}

View File

@ -1,82 +0,0 @@
const mathjax = require('mathjax-node')
const _ = require('lodash')
// ------------------------------------
// Mathjax
// ------------------------------------
/* global WIKI */
const mathRegex = [
{
format: 'TeX',
regex: /\\\[([\s\S]*?)\\\]/g
},
{
format: 'inline-TeX',
regex: /\\\((.*?)\\\)/g
},
{
format: 'MathML',
regex: /<math([\s\S]*?)<\/math>/g
}
]
module.exports = {
init ($, config) {
mathjax.config({
MathJax: {
jax: ['input/TeX', 'input/MathML', 'output/SVG'],
extensions: ['tex2jax.js', 'mml2jax.js'],
TeX: {
extensions: ['AMSmath.js', 'AMSsymbols.js', 'noErrors.js', 'noUndefined.js']
},
SVG: {
scale: 120,
font: 'STIX-Web'
}
}
})
},
async render (content) {
let matchStack = []
let replaceStack = []
let currentMatch
let mathjaxState = {}
_.forEach(mathRegex, mode => {
do {
currentMatch = mode.regex.exec(content)
if (currentMatch) {
matchStack.push(currentMatch[0])
replaceStack.push(
new Promise((resolve, reject) => {
mathjax.typeset({
math: (mode.format === 'MathML') ? currentMatch[0] : currentMatch[1],
format: mode.format,
speakText: false,
svg: true,
state: mathjaxState,
timeout: 30 * 1000
}, result => {
if (!result.errors) {
resolve(result.svg)
} else {
resolve(currentMatch[0])
WIKI.logger.warn(result.errors.join(', '))
}
})
})
)
}
} while (currentMatch)
})
return (matchStack.length > 0) ? Promise.all(replaceStack).then(results => {
_.forEach(matchStack, (repMatch, idx) => {
content = content.replace(repMatch, results[idx])
})
return content
}) : Promise.resolve(content)
}
}

View File

@ -1,8 +0,0 @@
key: markdownMathjax
title: Mathjax Preprocessor
description: Prepare TeX blocks for Mathjax
author: requarks.io
icon: mdi-function-variant
enabledDefault: false
dependsOn: markdownCore
props: {}

View File

@ -1,11 +0,0 @@
const mdMathjax = require('markdown-it-mathjax')()
// ------------------------------------
// Markdown - Mathjax Preprocessor
// ------------------------------------
module.exports = {
init (md, conf) {
md.use(mdMathjax)
}
}