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
E
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
M
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:
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.
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 }) => { // Get the author name from the related post reference const { name } = await client.fetch(`//groq *[_id == $id]{"name": author->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" && name != $name] `, params: { name } } } } } ] }
Dec 2, 2020, 1:07 PM
K
You can return an promise to the filter option, so you can do something like this:
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.
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 }) => { // Get the author name from the related post reference const { name } = await client.fetch(`//groq *[_id == $id]{"name": author->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" && name != $name] `, params: { name } } } } } ] }
Dec 2, 2020, 1:07 PM
P
Thanks
Knut Melvær
Dec 2, 2020, 2:44 PM
P
Knut Melvær
when I make filter as an async function it's not workingDec 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.