How to hide a document from the Sanity Studio left nav using code snippets.
9 replies
Last updated: Feb 4, 2021
K
Is there any way of hiding a document (that you call from another document) from the sanity studio left nav?
Jan 24, 2021, 4:01 PM
P
Hi Karin, there is! Something like this should work:
// deskStructure.js const hiddenDocTypes = listItem => ![ 'myHiddenDocType1', 'myHiddenDocType2' ].includes(listItem.getId()) export default () => S.list() .title('Content') .items([ // Your custom list items go here // Followed by an array of all remaining document types defined in // schema.js, with the hidden ones filtered out ...S.documentTypeListItems().filter(hiddenDocTypes) ])
Jan 24, 2021, 4:44 PM
K
Thank you Peter! I will definitely look into that. π
Jan 24, 2021, 4:54 PM
K
Hi again,
user M
! I've been trying to implement above code into my project, but I get an error message saying "ReferenceError: S is not defined".. Am I missing something here? π¬βΊοΈFeb 4, 2021, 7:36 PM
K
Now I have this code, but my error message says "List items must be of type "listItem", got "document"."
import S from '@sanity/desk-tool/structure-builder';
import grid from './schemas/grid';
import home from './schemas/home';
import creator from './schemas/creator';
import project from './schemas/project';
import recipe from './schemas/recipe';
import contact from './schemas/contact';
const hiddenDocTypes = (_listItem_) => ![grid].includes(_listItem_.getId());
export default () =>
S.list()
.title('Content')
.items([
home,
project,
recipe,
creator,
contact,
// Your custom list items go here
// Followed by an array of all remaining document types defined in
// schema.js, with the hidden ones filtered out
...S.documentTypeListItems().filter(hiddenDocTypes),
]);
Feb 4, 2021, 7:43 PM
P
Hi Karin, could you share one of your imported schemas?
Feb 4, 2021, 7:56 PM
K
Of course. Home looks like this:
import { string } from 'prop-types';
export default {
name: 'home',
title: 'Home',
type: 'document',
fields: [
{
name: 'hero_image',
title: 'Hero Image',
type: 'image',
},
{
name: 'hero_title',
title: 'Hero Title',
type: 'string',
},
{
name: 'hero_text',
title: 'Hero Text',
type: 'text',
},
{
name: 'intro_text',
title: 'Intro',
type: 'text',
},
],
};
Feb 4, 2021, 7:57 PM
P
That explains: the structure builder expects a list item here, not a document. A list item looks as follows, for example:
Please note that you'll only have to manually set these up if you want to have variations of what's shown by default, i.e. if you want to set up a custom desk structure.
If not, you could simply hide the one you want to hide and that's it (no need to import the document type either as that's already done in your
Hope that helps
π Here's some additional info on the structure builder: https://www.sanity.io/docs/overview-structure-builder
S.listItem() .title('Completed projects') .child( S.documentTypeList('project') .title('Projects') .filter('_type == $type && completed == true') .params({ type: 'project' }) ),
If not, you could simply hide the one you want to hide and that's it (no need to import the document type either as that's already done in your
schema.jsfile):
import S from '@sanity/desk-tool/structure-builder'; const hiddenDocTypes = (listItem) => !['grid'].includes(listItem.getId()); export default () => S.list() .title('Content') .items([ ...S.documentTypeListItems().filter(hiddenDocTypes), ]);
π Here's some additional info on the structure builder: https://www.sanity.io/docs/overview-structure-builder
Feb 4, 2021, 8:03 PM
K
Ohh, OK. I'll try that π Thank you so much!
Feb 4, 2021, 8:06 PM
K
Yay! It worked. Thanks again! π
Feb 4, 2021, 8:09 PM
Sanityβ build remarkable experiences at scale
Sanity is a modern headless CMS that treats content as data to power your digital business. Free to get started, and pay-as-you-go on all plans.