【发布时间】:2021-07-27 11:40:23
【问题描述】:
我遇到以下问题。我创建了 2 个数组,名为:editorDesk 和 adminDesk,实际上唯一的区别是,adminDesk 有菜单项 => 路线、导航和朋友。
问题是我有重复的代码来完成这项工作。但我想用一张桌子让它变得简单,像这样:defaultDesk 并检查管理员用户是否显示这个,否则什么都不做。
我怎样才能做到这一点?
我的代码:
import S from '@sanity/desk-tool/structure-builder'
import sanityClient from 'part:@sanity/base/client'
import PagePreview from '../studio/src/components/preview/page/PagePreview'
import {
FiPaperclip,
FiUser,
FiUsers,
FiEdit,
FiSettings,
FiMessageSquare,
FiHeart,
FiInfo,
FiNavigation,
FiFileText,
FiFile,
FiTag,
FiCheckSquare
} from 'react-icons/fi'
const client = sanityClient.withConfig({ apiVersion: 'v1' })
const groupQuery = '* [_type == "system.group" && $identity in members] {_id}'
const hiddenDocTypes = (listItem) =>
![
'author',
'post',
'page',
'category',
'theme',
'comment',
'friends',
'route',
'navigation',
'general',
'featured',
'cookie'
].includes(listItem.getId())
const siteMenu = () =>
client
.fetch(groupQuery)
.then((docs) => docs.map((doc) => doc._id.split('.').pop()))
.then((groupNames) => {
const defaultDesk = [
S.listItem()
.title('Posts')
.child(S.documentTypeList('post').title('Posts overview'))
.schemaType('post')
.icon(FiEdit),
S.divider(),
S.listItem()
.title('Pages')
.child(S.documentTypeList('page').title('Pages overview'))
.schemaType('page')
.icon(FiFile),
S.divider(),
S.listItem()
.title('Authors')
.child(S.documentTypeList('author').title('Authors overview'))
.schemaType('author')
.icon(FiUser),
S.divider(),
S.listItem()
.title('Themes')
.child(S.documentTypeList('theme').title('Themes overview'))
.schemaType('theme')
.icon(FiHeart),
S.divider(),
S.listItem()
.title('Categories')
.child(
S.documentTypeList('category').title('Categories overview')
)
.schemaType('category')
.icon(FiTag),
S.divider(),
S.listItem()
.title('Comments')
.child(S.documentTypeList('comment').title('Comments overview'))
.schemaType('comment')
.icon(FiMessageSquare),
S.divider()
]
const editorDesk = [
// Settings menu with sub-menu's.
S.listItem()
.title('Settings')
.child(
S.list()
.title('Settings')
.items([
S.listItem()
.title('General')
.icon(FiInfo)
.child(
S.document()
.schemaType('general')
.documentId('generalSettings')
.title('General Settings')
),
S.divider(),
S.listItem()
.title('Featured articles')
.icon(FiFileText)
.child(
S.document()
.schemaType('featured')
.documentId('featuredArticlesSettings')
.title('Featured Articles Settings')
),
S.divider()
])
)
.icon(FiSettings),
...S.documentTypeListItems().filter(hiddenDocTypes)
]
const adminDesk = [
// Settings menu with sub-menu's.
S.listItem()
.title('Settings')
.child(
S.list()
.title('Settings')
.items([
S.listItem()
.title('General')
.icon(FiInfo)
.child(
S.document()
.schemaType('general')
.documentId('generalSettings')
.title('General Settings')
),
S.divider(),
S.listItem()
.title('Navigation')
.icon(FiNavigation)
.child(
S.document()
.schemaType('navigation')
.documentId('navigationSettings')
.title('Navigation Settings')
),
S.divider(),
S.listItem()
.title('Featured articles')
.icon(FiFileText)
.child(
S.document()
.schemaType('featured')
.documentId('featuredArticlesSettings')
.title('Featured Articles Settings')
),
S.divider(),
S.listItem()
.title('Cookie Consent')
.icon(FiCheckSquare)
.child(
S.document()
.schemaType('cookie')
.documentId('cookieSettings')
.title('Cookie Consent Settings')
),
S.divider(),
S.listItem()
.title('Friends team')
.icon(FiUsers)
.child(
S.document()
.schemaType('friends')
.documentId('settingsFriends')
.title('Friends Settings')
)
])
)
.icon(FiSettings),
...S.documentTypeListItems().filter(hiddenDocTypes)
]
if (groupNames.includes('editors')) {
return S.list()
.title('Website (editor)')
.items([...defaultDesk, ...editorDesk])
}
if (groupNames.includes('administrator')) {
return S.list()
.title('Website (admin)')
.items([...defaultDesk, ...adminDesk])
}
return S.list().title('Website').items(deskItems)
})
.catch(() => {
// In case of any errors fetching the groups, just return some standard
// structure. This will only happen if the query cannot be performed for
// some reason.
return S.list().title('Website').items([])
})
export default siteMenu
export const getDefaultDocumentNode = (props) => {
/**
* Here you can define fallback views for document types without
* a structure definition for the document node. If you want different
* fallbacks for different types, or document values (e.g. if there is a slug present)
* you can set up that logic in here too.
* https://www.sanity.io/docs/structure-builder-reference#getdefaultdocumentnode-97e44ce262c9
*/
const { schemaType } = props
if (schemaType === 'page') {
return S.document().views([
S.view.form(),
S.view.component(PagePreview).title('Preview Page')
])
}
return S.document().views([S.view.form()])
}
【问题讨论】:
标签: javascript sanity