feat: sidebar item permissions + admin nav edit
This commit is contained in:
@@ -118,6 +118,8 @@
|
||||
:items='locales'
|
||||
v-model='rule.locales'
|
||||
placeholder='Any Locale'
|
||||
item-value='code'
|
||||
item-text='name'
|
||||
multiple
|
||||
hide-details
|
||||
height='48px'
|
||||
@@ -126,7 +128,7 @@
|
||||
style='flex: 0 1 150px;'
|
||||
)
|
||||
template(slot='selection', slot-scope='{ item, index }')
|
||||
v-chip.white--text.ml-0(v-if='rule.locales.length === 1', small, label, :color='rule.deny ? `red` : `green`').caption {{ item.value.toUpperCase() }}
|
||||
v-chip.white--text.ml-0(v-if='rule.locales.length === 1', small, label, :color='rule.deny ? `red` : `green`').caption {{ item.code.toUpperCase() }}
|
||||
v-chip.white--text.ml-0(v-else-if='index === 0', small, label, :color='rule.deny ? `red` : `green`').caption {{ rule.locales.length }} locales
|
||||
v-list-item(slot='prepend-item', @click='rule.locales = []')
|
||||
v-list-item-action(style='min-width: 30px;')
|
||||
@@ -149,8 +151,8 @@
|
||||
)
|
||||
v-icon.mr-2(:color='rule.deny ? `red` : `green`') mdi-web
|
||||
v-list-item-content
|
||||
v-list-item-title.body-2 {{props.item.text}}
|
||||
v-chip.mr-2.grey--text(label, small, :color='$vuetify.theme.dark ? `grey darken-4` : `grey lighten-4`').caption {{props.item.value.toUpperCase()}}
|
||||
v-list-item-title.body-2 {{props.item.name}}
|
||||
v-chip.mr-2.grey--text(label, small, :color='$vuetify.theme.dark ? `grey darken-4` : `grey lighten-4`').caption {{props.item.code.toUpperCase()}}
|
||||
|
||||
//- Path
|
||||
v-text-field(
|
||||
@@ -197,6 +199,8 @@
|
||||
import _ from 'lodash'
|
||||
import { customAlphabet } from 'nanoid/non-secure'
|
||||
|
||||
/* global siteLangs */
|
||||
|
||||
const nanoid = customAlphabet('1234567890abcdef', 10)
|
||||
|
||||
export default {
|
||||
@@ -209,10 +213,10 @@ export default {
|
||||
data() {
|
||||
return {
|
||||
roles: [
|
||||
{ text: 'Read Pages', value: 'read:pages', icon: 'mdi-file-document-box-search-outline' },
|
||||
{ text: 'Create Pages', value: 'write:pages', icon: 'mdi-file-document-box-plus-outline' },
|
||||
{ text: 'Read Pages', value: 'read:pages', icon: 'mdi-file-eye-outline' },
|
||||
{ text: 'Create Pages', value: 'write:pages', icon: 'mdi-file-plus-outline' },
|
||||
{ text: 'Edit + Move Pages', value: 'manage:pages', icon: 'mdi-file-document-edit-outline' },
|
||||
{ text: 'Delete Pages', value: 'delete:pages', icon: 'mdi-file-document-box-remove-outline' },
|
||||
{ text: 'Delete Pages', value: 'delete:pages', icon: 'mdi-file-remove-outline' },
|
||||
{ text: 'View Pages Source', value: 'read:source', icon: 'mdi-code-tags' },
|
||||
{ text: 'View Pages History', value: 'read:history', icon: 'mdi-history' },
|
||||
{ text: 'Read / Use Assets', value: 'read:assets', icon: 'mdi-image-search-outline' },
|
||||
@@ -228,9 +232,6 @@ export default {
|
||||
{ text: 'Path Ends With...', value: 'END', icon: '.../' },
|
||||
{ text: 'Path Matches Regex...', value: 'REGEX', icon: '$.*' },
|
||||
{ text: 'Tag Matches...', value: 'TAG', icon: 'T' }
|
||||
],
|
||||
locales: [
|
||||
{ text: 'English', value: 'en' }
|
||||
]
|
||||
}
|
||||
},
|
||||
@@ -238,7 +239,8 @@ export default {
|
||||
group: {
|
||||
get() { return this.value },
|
||||
set(val) { this.$set('input', val) }
|
||||
}
|
||||
},
|
||||
locales() { return siteLangs }
|
||||
},
|
||||
methods: {
|
||||
addRule(group) {
|
||||
|
@@ -69,12 +69,12 @@
|
||||
item-value='code'
|
||||
)
|
||||
v-list.py-2(dense, nav, dark, class='blue darken-2', style='border-radius: 0;')
|
||||
v-list-item(v-if='navTree.length < 1')
|
||||
v-list-item(v-if='currentTree.length < 1')
|
||||
v-list-item-avatar(size='24'): v-icon(color='blue lighten-3') mdi-alert
|
||||
v-list-item-content
|
||||
em.caption.blue--text.text--lighten-4 {{$t('navigation.emptyList')}}
|
||||
draggable(v-model='navTree')
|
||||
template(v-for='navItem in navTree')
|
||||
draggable(v-model='currentTree')
|
||||
template(v-for='navItem in currentTree')
|
||||
v-list-item(
|
||||
v-if='navItem.kind === "link"'
|
||||
:key='navItem.id'
|
||||
@@ -223,7 +223,7 @@
|
||||
)
|
||||
template(v-else)
|
||||
v-toolbar(height='56', color='teal lighten-1', flat, dark)
|
||||
v-card-text.grey--text(v-if='navTree.length > 0') {{$t('navigation.noSelectionText')}}
|
||||
v-card-text.grey--text(v-if='currentTree.length > 0') {{$t('navigation.noSelectionText')}}
|
||||
v-card-text.grey--text(v-else) {{$t('navigation.noItemsText')}}
|
||||
|
||||
page-selector(mode='select', v-model='selectPageModal', :open-handler='selectPageHandle', path='home', :locale='currentLang')
|
||||
@@ -247,9 +247,9 @@ export default {
|
||||
data() {
|
||||
return {
|
||||
selectPageModal: false,
|
||||
navTree: [],
|
||||
trees: [],
|
||||
current: {},
|
||||
currentLang: 'en',
|
||||
currentLang: siteConfig.lang,
|
||||
groups: [],
|
||||
config: {
|
||||
mode: 'NONE'
|
||||
@@ -267,6 +267,33 @@ export default {
|
||||
},
|
||||
locales () {
|
||||
return siteLangs
|
||||
},
|
||||
currentTree: {
|
||||
get () {
|
||||
return _.get(_.find(this.trees, ['locale', this.currentLang]), 'items', null) || []
|
||||
},
|
||||
set (val) {
|
||||
const tree = _.find(this.trees, ['locale', this.currentLang])
|
||||
if (tree) {
|
||||
tree.items = val
|
||||
} else {
|
||||
this.trees = [...this.trees, {
|
||||
locale: this.currentLang,
|
||||
items: val
|
||||
}]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
currentLang (newValue, oldValue) {
|
||||
this.$nextTick(() => {
|
||||
if (this.currentTree.length > 0) {
|
||||
this.current = this.currentTree[0]
|
||||
} else {
|
||||
this.current = {}
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -291,11 +318,11 @@ export default {
|
||||
newItem.label = this.$t('navigation.untitled', { kind: this.$t(`navigation.header`) })
|
||||
break
|
||||
}
|
||||
this.navTree.push(newItem)
|
||||
this.currentTree = [...this.currentTree, newItem]
|
||||
this.current = newItem
|
||||
},
|
||||
deleteItem(item) {
|
||||
this.navTree = _.pull(this.navTree, item)
|
||||
this.currentTree = _.pull(this.currentTree, item)
|
||||
this.current = {}
|
||||
},
|
||||
selectItem(item) {
|
||||
@@ -326,7 +353,7 @@ export default {
|
||||
}
|
||||
`,
|
||||
variables: {
|
||||
tree: this.navTree
|
||||
tree: this.trees
|
||||
}
|
||||
})
|
||||
if (_.get(resp, 'data.navigation.updateTree.responseResult.succeeded', false)) {
|
||||
@@ -344,7 +371,7 @@ export default {
|
||||
this.$store.commit(`loadingStop`, 'admin-navigation-save')
|
||||
},
|
||||
async refresh() {
|
||||
await this.$apollo.queries.navTree.refetch()
|
||||
await this.$apollo.queries.trees.refetch()
|
||||
this.current = {}
|
||||
this.$store.commit('showNotification', {
|
||||
message: 'Navigation has been refreshed.',
|
||||
@@ -353,9 +380,6 @@ export default {
|
||||
})
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
this.currentLang = siteConfig.lang
|
||||
},
|
||||
apollo: {
|
||||
config: {
|
||||
query: gql`
|
||||
@@ -373,7 +397,7 @@ export default {
|
||||
this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-navigation-config')
|
||||
}
|
||||
},
|
||||
navTree: {
|
||||
trees: {
|
||||
query: gql`
|
||||
{
|
||||
navigation {
|
||||
@@ -386,6 +410,8 @@ export default {
|
||||
icon
|
||||
targetType
|
||||
target
|
||||
visibilityMode
|
||||
visibilityGroups
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user