Structured Content 2022: Join our conference to explore fresh perspectives on content and digital experiences β†’

Is there any way of hiding a document (that you call from another document) from the sanity studio left nav?

11 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

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

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.io: Get the most out of your content

Sanity.io is a platform to build websites and applications. It comes with great APIs that let you treat content like data. Give your team exactly what they need to edit and publish their content with the customizable Sanity Studio. Get real-time collaboration out of the box. Sanity.io comes with a hosted datastore for JSON documents, query languages like GROQ and GraphQL, CDNs, on-demand asset transformations, presentation agnostic rich text, plugins, and much more.

Don't compromise on developer experience. Join thousands of developers and trusted companies and power your content with Sanity.io. Free to get started, pay-as-you-go on all plans.