sanity-plugin-taxonomy-manager
Version:
Create and manage SKOS compliant taxonomies, thesauri, and classification schemes in Sanity Studio.
86 lines (80 loc) • 2.67 kB
text/typescript
import type {useClient} from 'sanity'
type SchemeOptions = {
schemeId: string
expanded?: boolean
}
type SchemeFilterResult = {
filter: string
params: {
schemeId: string
concepts: string[]
topConcepts: string[]
}
expanded?: boolean
}
/**
* #### Reference Field Scheme Filter
* Pluggable Function for Filtering to a Single SKOS Concept Scheme.
* @param {string} schemeId - The unique six character concept identifier for
* the Concept Scheme to which you wish to filter.
* @param {boolean} [expanded] - Set to `true` to display open hierarchy trees for
* input components. Input component trees load closed by default.
* @returns A reference type filter for Concepts and Top Concepts in
* the selected Concept Scheme test
* @example
* ```ts
* import { schemeFilter } from 'sanity-plugin-taxonomy-manager'
* ...
* {
* name: 'test',
* type: 'array',
* of: [
* {
* type: 'reference',
* to: {type: 'skosConcept'},
* options: {
* filter: schemeFilter({
* schemeId: 'a1b2c3',
* expanded: true, // optional; defaults to false (closed tree)
* }),
* disableNew: true,
* },
* },
* ],
* }
* ```
*/
export const schemeFilter = (
options: SchemeOptions
): (({
getClient,
}: {
getClient: (clientOptions: {apiVersion: string}) => ReturnType<typeof useClient>
}) => Promise<SchemeFilterResult>) => {
// Get and validate the schemeId from options
const {schemeId} = options || {}
if (!schemeId || typeof schemeId !== 'string') {
throw new Error('Invalid or missing schemeId: scheme Id must be a string')
}
return async (props) => {
const client = props?.getClient({apiVersion: '2025-02-19'})
if (!client) {
throw new Error('Client not available')
}
// Fetch concepts and topConcepts for the given schemeId
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unnecessary-type-assertion
const {concepts, topConcepts} = (await client.fetch(
`{
"concepts": *[_type=="skosConceptScheme" && schemeId == "${schemeId}"].concepts[]._ref,
"topConcepts": *[_type=="skosConceptScheme" && schemeId == "${schemeId}"].topConcepts[]._ref
}`
)) as {concepts: string[]; topConcepts: string[]}
// schemeId is included in params for use by the ArrayHierarchyInput component
return {
filter: `(_id in $concepts
|| _id in $topConcepts)`,
params: {concepts, topConcepts, schemeId},
expanded: options?.expanded,
}
}
}