@sanity/language-filter 4.1.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +358 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -75
- package/lib/index.d.mts +0 -108
- package/lib/index.d.ts +0 -108
- package/lib/index.esm.js +0 -13
- package/lib/index.esm.js.map +0 -1
- package/lib/index.js +0 -13
- package/lib/index.js.map +0 -1
- package/lib/index.mjs +0 -13
- package/lib/index.mjs.map +0 -1
- package/sanity.json +0 -8
- package/src/LanguageFilterMenuButton.tsx +0 -194
- package/src/LanguageFilterObjectInput.tsx +0 -54
- package/src/LanguageFilterStudioContext.tsx +0 -92
- package/src/filterField.test.ts +0 -110
- package/src/filterField.ts +0 -35
- package/src/index.ts +0 -13
- package/src/languageSubscription.ts +0 -32
- package/src/plugin.tsx +0 -86
- package/src/types.ts +0 -42
- package/src/usePaneLanguages.ts +0 -65
- package/src/useSelectedLanguageIds.ts +0 -43
- package/v2-incompatible.js +0 -11
package/src/plugin.tsx
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
definePlugin,
|
|
3
|
-
type DocumentLanguageFilterComponent,
|
|
4
|
-
isObjectSchemaType,
|
|
5
|
-
type ObjectInputProps,
|
|
6
|
-
} from 'sanity'
|
|
7
|
-
|
|
8
|
-
import {isLanguageFilterEnabled} from './filterField'
|
|
9
|
-
import {LanguageFilterMenuButton} from './LanguageFilterMenuButton'
|
|
10
|
-
import {FilteredObjectWrapper} from './LanguageFilterObjectInput'
|
|
11
|
-
import {defaultContextValue, LanguageFilterStudioProvider} from './LanguageFilterStudioContext'
|
|
12
|
-
import type {LanguageFilterConfig} from './types'
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* ## Usage in sanity.config.ts (or .js)
|
|
16
|
-
*
|
|
17
|
-
* ```
|
|
18
|
-
* import {defineConfig} from 'sanity'
|
|
19
|
-
* import {languageFilter} from '@sanity/language-filter'
|
|
20
|
-
*
|
|
21
|
-
* export const defineConfig({
|
|
22
|
-
* /...
|
|
23
|
-
* plugins: [
|
|
24
|
-
* languageFilter({
|
|
25
|
-
* supportedLanguages: [
|
|
26
|
-
* {id: 'nb', title: 'Norwegian (Bokmål)'},
|
|
27
|
-
* {id: 'nn', title: 'Norwegian (Nynorsk)'},
|
|
28
|
-
* {id: 'en', title: 'English'},
|
|
29
|
-
* {id: 'es', title: 'Spanish'},
|
|
30
|
-
* {id: 'arb', title: 'Arabic'},
|
|
31
|
-
* {id: 'pt', title: 'Portuguese'},
|
|
32
|
-
* //...
|
|
33
|
-
* ],
|
|
34
|
-
* // Select Norwegian (Bokmål) by default
|
|
35
|
-
* defaultLanguages: ['nb'],
|
|
36
|
-
* // Only show language filter for document type `page` (schemaType.name)
|
|
37
|
-
* // Can also enable via document-options: options.languageFilter: true
|
|
38
|
-
* documentTypes: ['page'],
|
|
39
|
-
* // default filter function shown
|
|
40
|
-
* filterField: (enclosingType, field, selectedLanguageIds) =>
|
|
41
|
-
* !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name),
|
|
42
|
-
* })
|
|
43
|
-
* ]
|
|
44
|
-
* })
|
|
45
|
-
* ```
|
|
46
|
-
*/
|
|
47
|
-
export const languageFilter = definePlugin<LanguageFilterConfig>((options) => {
|
|
48
|
-
const RenderLanguageFilter: DocumentLanguageFilterComponent = () => {
|
|
49
|
-
return <LanguageFilterMenuButton />
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const pluginOptions = {
|
|
53
|
-
...defaultContextValue.options,
|
|
54
|
-
...options,
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return {
|
|
58
|
-
name: '@sanity/language-filter',
|
|
59
|
-
studio: {
|
|
60
|
-
components: {
|
|
61
|
-
layout: (props) => LanguageFilterStudioProvider({...props, options: pluginOptions}),
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
|
|
65
|
-
document: {
|
|
66
|
-
unstable_languageFilter: (prev, {schemaType, schema}) => {
|
|
67
|
-
if (isLanguageFilterEnabled(schema.get(schemaType), options)) {
|
|
68
|
-
return [...prev, RenderLanguageFilter]
|
|
69
|
-
}
|
|
70
|
-
return prev
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
|
|
74
|
-
form: {
|
|
75
|
-
components: {
|
|
76
|
-
input: (props) => {
|
|
77
|
-
if (props.id !== 'root' && isObjectSchemaType(props.schemaType)) {
|
|
78
|
-
return FilteredObjectWrapper(props as ObjectInputProps)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return props.renderDefault(props)
|
|
82
|
-
},
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
}
|
|
86
|
-
})
|
package/src/types.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import type {FieldMember, FieldsetState, ObjectSchemaType, SanityClient} from 'sanity'
|
|
2
|
-
|
|
3
|
-
export interface LanguageFilterOptions {
|
|
4
|
-
languageFilter?: boolean
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export interface LanguageFilterSchema extends ObjectSchemaType {
|
|
8
|
-
options?: LanguageFilterOptions
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export type Language = {
|
|
12
|
-
id: Intl.UnicodeBCP47LocaleIdentifier
|
|
13
|
-
title: string
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export type LanguageCallback = (
|
|
17
|
-
client: SanityClient,
|
|
18
|
-
selectedValue: Record<string, unknown>,
|
|
19
|
-
) => Promise<Language[]>
|
|
20
|
-
|
|
21
|
-
export type FilterFieldFunction = (
|
|
22
|
-
enclosingType: ObjectSchemaType,
|
|
23
|
-
field: FieldMember | FieldsetState,
|
|
24
|
-
selectedLanguageIds: string[],
|
|
25
|
-
parentValue: Record<string, unknown> | undefined,
|
|
26
|
-
) => boolean
|
|
27
|
-
|
|
28
|
-
export interface LanguageFilterConfig {
|
|
29
|
-
supportedLanguages: Language[] | LanguageCallback
|
|
30
|
-
defaultLanguages?: string[]
|
|
31
|
-
documentTypes?: string[]
|
|
32
|
-
filterField?: FilterFieldFunction
|
|
33
|
-
/**
|
|
34
|
-
* https://www.sanity.io/docs/api-versioning
|
|
35
|
-
* @defaultValue '2022-11-27'
|
|
36
|
-
*/
|
|
37
|
-
apiVersion?: string
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface LanguageFilterConfigProcessed extends LanguageFilterConfig {
|
|
41
|
-
supportedLanguages: Language[]
|
|
42
|
-
}
|
package/src/usePaneLanguages.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import {useCallback, useMemo} from 'react'
|
|
2
|
-
|
|
3
|
-
import {useLanguageFilterStudioContext} from './LanguageFilterStudioContext'
|
|
4
|
-
import {getSelectableLanguages, persistLanguageIds} from './useSelectedLanguageIds'
|
|
5
|
-
|
|
6
|
-
const unique = (arr: string[]) => Array.from(new Set(arr))
|
|
7
|
-
|
|
8
|
-
export function usePaneLanguages(): {
|
|
9
|
-
activeLanguages: string[]
|
|
10
|
-
allSelected: boolean
|
|
11
|
-
selectAll: () => void
|
|
12
|
-
selectNone: () => void
|
|
13
|
-
toggleLanguage: (languageId: string) => void
|
|
14
|
-
} {
|
|
15
|
-
const {selectedLanguageIds, setSelectedLanguageIds, options} = useLanguageFilterStudioContext()
|
|
16
|
-
const {defaultLanguages = []} = options
|
|
17
|
-
|
|
18
|
-
const selectableLanguages = useMemo(() => getSelectableLanguages(options), [options])
|
|
19
|
-
|
|
20
|
-
const updateSelectedIds = useCallback(
|
|
21
|
-
(ids: string[]) => {
|
|
22
|
-
setSelectedLanguageIds(unique([...defaultLanguages, ...ids]))
|
|
23
|
-
persistLanguageIds(unique([...defaultLanguages, ...ids]))
|
|
24
|
-
},
|
|
25
|
-
[defaultLanguages, setSelectedLanguageIds],
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
const selectAll = useCallback(
|
|
29
|
-
() => updateSelectedIds(selectableLanguages.map((l) => l.id)),
|
|
30
|
-
[updateSelectedIds, selectableLanguages],
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
const selectNone = useCallback(() => {
|
|
34
|
-
updateSelectedIds(defaultLanguages)
|
|
35
|
-
}, [defaultLanguages, updateSelectedIds])
|
|
36
|
-
|
|
37
|
-
const toggleLanguage = useCallback(
|
|
38
|
-
(languageId: string) => {
|
|
39
|
-
let lang = selectedLanguageIds
|
|
40
|
-
|
|
41
|
-
if (lang.includes(languageId)) {
|
|
42
|
-
lang = lang.filter((l) => l !== languageId)
|
|
43
|
-
} else {
|
|
44
|
-
lang = unique([...lang, languageId])
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
updateSelectedIds(lang)
|
|
48
|
-
},
|
|
49
|
-
[updateSelectedIds, selectedLanguageIds],
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
const activeLanguages = useMemo(
|
|
53
|
-
() => unique([...(defaultLanguages ?? []), ...selectedLanguageIds]),
|
|
54
|
-
[defaultLanguages, selectedLanguageIds],
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
return {
|
|
58
|
-
activeLanguages,
|
|
59
|
-
allSelected:
|
|
60
|
-
selectedLanguageIds.length === selectableLanguages.length + defaultLanguages.length,
|
|
61
|
-
selectAll,
|
|
62
|
-
selectNone,
|
|
63
|
-
toggleLanguage,
|
|
64
|
-
}
|
|
65
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import {useState} from 'react'
|
|
2
|
-
|
|
3
|
-
import type {Language, LanguageFilterConfig} from './types'
|
|
4
|
-
const storageKey = '@sanity/plugin/language-filter/selected-languages'
|
|
5
|
-
|
|
6
|
-
export function getPersistedLanguageIds(options: LanguageFilterConfig): string[] {
|
|
7
|
-
const selectableLangs = getSelectableLanguages(options).map((l) => l.id)
|
|
8
|
-
|
|
9
|
-
let selected: string[] = selectableLangs
|
|
10
|
-
try {
|
|
11
|
-
const persistedValue = window.localStorage.getItem(storageKey)
|
|
12
|
-
if (persistedValue) {
|
|
13
|
-
selected = JSON.parse(persistedValue)
|
|
14
|
-
}
|
|
15
|
-
} catch (err) {} // eslint-disable-line no-empty
|
|
16
|
-
|
|
17
|
-
// constrain persisted/selected languages to the ones currently supported
|
|
18
|
-
selected = intersection(selected, selectableLangs)
|
|
19
|
-
return selected
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function persistLanguageIds(languageIds: string[]): void {
|
|
23
|
-
window.localStorage.setItem(storageKey, JSON.stringify(languageIds))
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function intersection(array1: string[], array2: string[]) {
|
|
27
|
-
return array1.filter((value) => array2.includes(value))
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function getSelectableLanguages({
|
|
31
|
-
supportedLanguages,
|
|
32
|
-
defaultLanguages,
|
|
33
|
-
}: LanguageFilterConfig): Language[] {
|
|
34
|
-
return Array.isArray(supportedLanguages)
|
|
35
|
-
? supportedLanguages.filter((lang) => !defaultLanguages?.includes(lang.id))
|
|
36
|
-
: []
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function useSelectedLanguageIds(
|
|
40
|
-
options: LanguageFilterConfig,
|
|
41
|
-
): [string[], (ids: string[]) => void] {
|
|
42
|
-
return useState(() => [...(options.defaultLanguages ?? []), ...getPersistedLanguageIds(options)])
|
|
43
|
-
}
|
package/v2-incompatible.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
const {showIncompatiblePluginDialog} = require('@sanity/incompatible-plugin')
|
|
2
|
-
const {name, version, sanityExchangeUrl} = require('./package.json')
|
|
3
|
-
|
|
4
|
-
export default showIncompatiblePluginDialog({
|
|
5
|
-
name: name,
|
|
6
|
-
versions: {
|
|
7
|
-
v3: version,
|
|
8
|
-
v2: '^2.35.0',
|
|
9
|
-
},
|
|
10
|
-
sanityExchangeUrl,
|
|
11
|
-
})
|