Unlock seamless workflows and faster delivery with our latest releases - Join the deep dive

How to hide a document from the Sanity Studio left nav using code snippets.

9 replies
Last updated: Feb 4, 2021
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
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
Thank you Peter! I will definitely look into that. πŸ’•
Jan 24, 2021, 4:54 PM
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
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
Hi Karin, could you share one of your imported schemas?
Feb 4, 2021, 7:56 PM
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
That explains: the structure builder expects a list item here, not a document. A list item looks as follows, for example:
S.listItem()
  .title('Completed projects')
  .child(
    S.documentTypeList('project')
      .title('Projects')
      .filter('_type == $type && completed == true')
      .params({ type: 'project' })
  ),
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
schema.js
file):
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),
    ]);
Hope that helps
πŸ™‚ Here's some additional info on the structure builder: https://www.sanity.io/docs/overview-structure-builder
Feb 4, 2021, 8:03 PM
Ohh, OK. I'll try that πŸ™‚ Thank you so much!
Feb 4, 2021, 8:06 PM
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.

Was this answer helpful?