Plugins settings working

Former-commit-id: bf510f9474baf82d86f56447595f11df8bab37af [formerly f66ec9d1e271bf7167086986e82002bf7007f184] [formerly 6df52279a22f6d91503b74e7c6f18f2c6a825207 [formerly b86d9b16b9]]
Former-commit-id: 3d2b4d2c4e7004c8e704044d669eec07418825a5 [formerly 18ee8c63b9b50dc26c36e0acdb9bda8cc7069d1e]
Former-commit-id: b9d487d62ea901fc627e74a50b98666f6831fd4e
pull/726/head
Henrique Dias 2017-07-18 14:43:16 +01:00
parent 66382a7f6b
commit 9c205c928e
6 changed files with 142 additions and 11 deletions

View File

@ -117,7 +117,7 @@ export default {
mounted () { mounted () {
window.addEventListener('keydown', this.keyEvent) window.addEventListener('keydown', this.keyEvent)
window.addEventListener('scroll', event => { window.addEventListener('scroll', event => {
if (this.req.kind !== 'listing') return if (this.req.kind !== 'listing' || this.$store.state.req.display === 'mosaic') return
let top = 112 - window.scrollY let top = 112 - window.scrollY

View File

@ -7,6 +7,21 @@
<li><router-link to="/users">Go to User Management</router-link></li> <li><router-link to="/users">Go to User Management</router-link></li>
</ul> </ul>
<form @submit="savePlugin">
<template v-for="plugin in plugins">
<h2>{{ capitalize(plugin.name) }}</h2>
<p v-for="field in plugin.fields" :key="field.name">
<label v-if="field.type !== 'checkbox'">{{ field.name }}</label>
<input v-if="field.type === 'text'" type="text" v-model.trim="field.value">
<input v-else-if="field.type === 'checkbox'" type="checkbox" v-model.trim="field.value">
<template v-if="field.type === 'checkbox'">{{ capitalize(field.name, 'caps') }}</template>
</p>
</template>
<p><input type="submit" value="Save"></p>
</form>
<form @submit="saveCommands"> <form @submit="saveCommands">
<h2>Commands</h2> <h2>Commands</h2>
@ -34,8 +49,7 @@ export default {
data: function () { data: function () {
return { return {
commands: [], commands: [],
beforeSave: '', plugins: []
afterSave: ''
} }
}, },
computed: { computed: {
@ -56,13 +70,55 @@ export default {
api.getPlugins() api.getPlugins()
.then(plugins => { .then(plugins => {
console.log(plugins) console.log(plugins)
let plugin = {}
for (let key in plugins) {
plugin.name = key
plugin.fields = []
for (let field in plugins[key]) {
let value = plugins[key][field]
if (Array.isArray(value)) {
plugin.fields.push({
name: field,
type: 'text',
original: 'array',
value: value.join(' ')
})
continue
}
switch (typeof value) {
case 'boolean':
plugin.fields.push({
name: field,
type: 'checkbox',
original: 'boolean',
value: value
})
break
default:
plugin.fields.push({
name: field,
type: 'text',
original: 'text',
value: value
})
}
}
this.plugins.push(plugin)
}
}) })
.catch(error => { this.showError(error) }) .catch(error => { this.showError(error) })
}, },
methods: { methods: {
...mapMutations([ 'showSuccess', 'showError' ]), ...mapMutations([ 'showSuccess', 'showError' ]),
capitalize (name) { capitalize (name, where = '_') {
let splitted = name.split('_') if (where === 'caps') where = /(?=[A-Z])/
let splitted = name.split(where)
name = '' name = ''
for (let i = 0; i < splitted.length; i++) { for (let i = 0; i < splitted.length; i++) {
@ -88,6 +144,35 @@ export default {
api.updateCommands(commands) api.updateCommands(commands)
.then(() => { this.showSuccess('Commands updated!') }) .then(() => { this.showSuccess('Commands updated!') })
.catch(error => { this.showError(error) }) .catch(error => { this.showError(error) })
},
savePlugin (event) {
event.preventDefault()
let plugins = {}
for (let plugin of this.plugins) {
let p = {}
for (let field of plugin.fields) {
p[field.name] = field.value
if (field.original === 'array') {
let val = field.value.split(' ')
if (val[0] === '') {
val.shift()
}
p[field.name] = val
}
}
plugins[plugin.name] = p
}
console.log(plugins)
api.updatePlugins(plugins)
.then(() => { this.showSuccess('Plugins settings updated!') })
.catch(error => { this.showError(error) })
} }
} }
} }

View File

@ -101,6 +101,9 @@ nav .action {
border-radius: 0; border-radius: 0;
font-size: 1.1em; font-size: 1.1em;
padding: .5em; padding: .5em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
} }
nav>div { nav>div {

View File

@ -379,6 +379,27 @@ function getPlugins () {
}) })
} }
function updatePlugins (data) {
return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest()
request.open('PUT', `${store.state.baseURL}/api/plugins/`, true)
request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
request.onload = () => {
switch (request.status) {
case 200:
resolve()
break
default:
reject(request.responseText)
break
}
}
request.onerror = (error) => reject(error)
request.send(JSON.stringify(data))
})
}
export default { export default {
delete: rm, delete: rm,
fetch, fetch,
@ -398,5 +419,6 @@ export default {
getCommands, getCommands,
updateCommands, updateCommands,
removePrefix, removePrefix,
getPlugins getPlugins,
updatePlugins
} }

View File

@ -132,7 +132,7 @@
data.router.push({ path: '/files/settings' }) data.router.push({ path: '/files/settings' })
}, },
icon: 'settings', icon: 'settings',
name: 'Hugo settings' name: 'Hugo Settings'
}, },
{ {
click: function (event, data, route) { click: function (event, data, route) {
@ -142,7 +142,7 @@
return data.store.state.user.allowNew return data.store.state.user.allowNew
}, },
icon: 'merge_type', icon: 'merge_type',
name: 'Hugo new' name: 'Hugo New'
} /* , } /* ,
{ {
click: function (event, data, route) { click: function (event, data, route) {

View File

@ -4,6 +4,8 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"net/http" "net/http"
"github.com/mitchellh/mapstructure"
) )
func commandsHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) { func commandsHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) {
@ -78,6 +80,25 @@ func pluginsPutHandler(c *RequestContext, w http.ResponseWriter, r *http.Request
return http.StatusBadGateway, errors.New("Empty request body") return http.StatusBadGateway, errors.New("Empty request body")
} }
// TODO var raw map[string]map[string]interface{}
// Parses the user and checks for error.
err := json.NewDecoder(r.Body).Decode(&raw)
if err != nil {
return http.StatusBadRequest, err
}
for name, plugin := range raw {
err = mapstructure.Decode(plugin, c.FM.Plugins[name])
if err != nil {
return http.StatusInternalServerError, err
}
err = c.FM.db.Set("plugins", name, c.FM.Plugins[name])
if err != nil {
return http.StatusInternalServerError, err
}
}
return http.StatusOK, nil return http.StatusOK, nil
} }