diff --git a/client/components/admin/admin-navigation.vue b/client/components/admin/admin-navigation.vue index cacfa600..7e73f125 100644 --- a/client/components/admin/admin-navigation.vue +++ b/client/components/admin/admin-navigation.vue @@ -8,6 +8,8 @@ .headline.primary--text {{$t('navigation.title')}} .subheading.grey--text {{$t('navigation.subtitle')}} v-spacer + v-btn(outline, color='grey', @click='refresh', large) + v-icon refresh v-btn(color='success', depressed, @click='save', large) v-icon(left) check span {{$t('common:actions.apply')}} @@ -185,20 +187,38 @@ export default { async save() { this.$store.commit(`loadingStart`, 'admin-navigation-save') try { - await this.$apollo.mutate({ + const resp = await this.$apollo.mutate({ mutation: treeSaveMutation, variables: { tree: this.navTree } }) + if (_.get(resp, 'data.navigation.updateTree.responseResult.succeeded', false)) { + this.$store.commit('showNotification', { + message: this.$t('navigation.saveSuccess'), + style: 'success', + icon: 'check' + }) + } else { + throw new Error(_.get(resp, 'data.navigation.updateTree.responseResult.message', 'An unexpected error occured.')) + } } catch (err) { this.$store.commit('showNotification', { - message: this.$t('navigation.saveSuccess'), - style: 'success', - icon: 'check' + message: err.message, + style: 'red', + icon: 'warning' }) } this.$store.commit(`loadingStop`, 'admin-navigation-save') + }, + async refresh() { + await this.$apollo.queries.navTree.refetch() + this.current = {} + this.$store.commit('showNotification', { + message: 'Navigation has been refreshed.', + style: 'success', + icon: 'cached' + }) } }, apollo: { diff --git a/server/graph/resolvers/navigation.js b/server/graph/resolvers/navigation.js index a54102e7..f56ab4d9 100644 --- a/server/graph/resolvers/navigation.js +++ b/server/graph/resolvers/navigation.js @@ -12,22 +12,16 @@ module.exports = { }, NavigationQuery: { async tree(obj, args, context, info) { - // let renderers = await WIKI.models.renderers.getRenderers() - return [] + return WIKI.models.navigation.getTree() } }, NavigationMutation: { async updateTree(obj, args, context) { try { - // for (let rdr of args.renderers) { - // await WIKI.models.storage.query().patch({ - // isEnabled: rdr.isEnabled, - // config: _.reduce(rdr.config, (result, value, key) => { - // _.set(result, `${value.key}`, value.value) - // return result - // }, {}) - // }).where('key', rdr.key) - // } + await WIKI.models.navigation.query().patch({ + config: args.tree + }).where('key', 'site') + return { responseResult: graphHelper.generateSuccess('Navigation updated successfully') } diff --git a/server/models/navigation.js b/server/models/navigation.js index f21f123b..a035709a 100644 --- a/server/models/navigation.js +++ b/server/models/navigation.js @@ -16,12 +16,18 @@ module.exports = class Navigation extends Model { properties: { key: {type: 'string'}, - config: {type: 'object'} + config: {type: 'array', items: {type: 'object'}} } } } static async getTree() { - return WIKI.models.navigation.query() + const navTree = await WIKI.models.navigation.query().findOne('key', 'site') + if (navTree) { + return navTree.config + } else { + WIKI.logger.warn('Site Navigation is missing or corrupted.') + return [] + } } } diff --git a/server/setup.js b/server/setup.js index b8442ceb..1c8e10c2 100644 --- a/server/setup.js +++ b/server/setup.js @@ -201,6 +201,23 @@ module.exports = () => { }) await guestUser.$relatedQuery('groups').relate(guestGroup.id) + // Create site nav + + WIKI.logger.info('Creating default site navigation') + await WIKI.models.navigation.query().delete().where({ key: 'site' }) + await WIKI.models.navigation.query().insert({ + key: 'site', + config: JSON.stringify([ + { + icon: 'home', + kind: 'link', + label: 'Home', + target: '/', + targetType: 'home' + } + ]) + }) + WIKI.logger.info('Setup is complete!') res.json({ ok: true,