Hi, I found this link for dynamic filters for reference <https://www.sanity.io/docs/reference-type#additional-dynamic-filter-8118f73f6758> Where we can access the properties...

5 replies
Last updated: Dec 3, 2020

Hi, I found this link for dynamic filters for reference https://www.sanity.io/docs/reference-type#additional-dynamic-filter-8118f73f6758 Where we can access the properties from surrounding document to apply the dynamic filter to reference type but what if when the document property itself is a reference ? Is there any way that we could resolve that reference and then pass it to the params for filter?

Dec 2, 2020, 7:17 AM

I think,

user Y
or
user J
can help you out with this..

Dec 2, 2020, 9:08 AM

You can return an promise to the filter option, so you can do something like this:

import client from 'part:@sanity/base/client'

export default {
  name: 'post',
  title: 'post',
  type: 'document',
  fields: [
    {
      name: 'title',
      title: 'Title',
      type: 'string'
    },
    {
      name: 'relatedPost',
      title: 'Related post',
      type: 'reference',
      to: [{ type: 'post' }]
    },
    {
      name: 'author',
      title: 'Author',
      type: 'reference',
      to: [{ type: 'author' }],
      options: {
        filter: async ({ document }) =&gt; {
          // Get the author name from the related post reference
          const { name } = await client.fetch(`//groq
            *[_id == $id]{"name": author-&gt;name}
            `, {id: document._id}
          )
          // Filter the results with only authors that don't
          // have the same name as the one in the related post
          return {
            filter: `//groq
            *[_type == "author" &amp;&amp; name != $name]
            `,
            params: {
              name
            }
          }
        }
      }
    }
  ]
}
The example is a bit silly, but hopefully you get the gist. Note that the results in the field isn't real-time here, so if someone published a new document while you see the results, it won't come up before you start searching again.

Dec 2, 2020, 1:07 PM

You can return an promise to the filter option, so you can do something like this:

import client from 'part:@sanity/base/client'

export default {
  name: 'post',
  title: 'post',
  type: 'document',
  fields: [
    {
      name: 'title',
      title: 'Title',
      type: 'string'
    },
    {
      name: 'relatedPost',
      title: 'Related post',
      type: 'reference',
      to: [{ type: 'post' }]
    },
    {
      name: 'author',
      title: 'Author',
      type: 'reference',
      to: [{ type: 'author' }],
      options: {
        filter: async ({ document }) =&gt; {
          // Get the author name from the related post reference
          const { name } = await client.fetch(`//groq
            *[_id == $id]{"name": author-&gt;name}
            `, {id: document._id}
          )
          // Filter the results with only authors that don't
          // have the same name as the one in the related post
          return {
            filter: `//groq
            *[_type == "author" &amp;&amp; name != $name]
            `,
            params: {
              name
            }
          }
        }
      }
    }
  ]
}
The example is a bit silly, but hopefully you get the gist. Note that the results in the field isn't real-time here, so if someone published a new document while you see the results, it won't come up before you start searching again.

Dec 2, 2020, 1:07 PM

Thanks

user Y

Dec 2, 2020, 2:44 PM

user Y
when I make filter as an async function it's not working

Dec 3, 2020, 2:08 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.