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,
Knut Melvær
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
Knut Melvær
Dec 2, 2020, 2:44 PM
Knut Melvær
when I make filter as an async function it's not working
Dec 3, 2020, 2:08 PM

Sanity– build remarkable experiences at scale

The Sanity Composable Content Cloud is the 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?