@sanity/language-filter 3.0.0-v3-studio.5 → 3.0.0-v3-studio.7
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 +4 -9
- package/lib/index.esm.js +2 -0
- package/lib/index.esm.js.map +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/{types → src}/index.d.ts +42 -23
- package/package.json +27 -26
- package/src/filterField.test.ts +6 -0
- package/src/plugin.tsx +4 -4
- package/lib/cjs/index.js +0 -435
- package/lib/cjs/index.js.map +0 -1
- package/lib/esm/index.js +0 -429
- package/lib/esm/index.js.map +0 -1
- package/lib/types/index.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -51,10 +51,10 @@ yarn add @sanity/language-filter@studio-v3
|
|
|
51
51
|
Add it as a plugin in sanity.config.ts (or .js), and configure it:
|
|
52
52
|
|
|
53
53
|
```
|
|
54
|
-
import {
|
|
54
|
+
import {defineConfig} from 'sanity'
|
|
55
55
|
import {languageFilter} from '@sanity/language-filter'
|
|
56
56
|
|
|
57
|
-
export const
|
|
57
|
+
export const defineConfig({
|
|
58
58
|
//...
|
|
59
59
|
plugins: [
|
|
60
60
|
languageFilter({
|
|
@@ -115,10 +115,9 @@ Previously this state was stored in localstorage.
|
|
|
115
115
|
|
|
116
116
|
## License
|
|
117
117
|
|
|
118
|
-
MIT
|
|
119
|
-
See LICENSE
|
|
118
|
+
MIT-licensed. See LICENSE.
|
|
120
119
|
|
|
121
|
-
## Develop
|
|
120
|
+
## Develop & test
|
|
122
121
|
|
|
123
122
|
This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)
|
|
124
123
|
with default configuration for build & watch scripts.
|
|
@@ -132,7 +131,3 @@ Run ["CI & Release" workflow](https://github.com/sanity-io/language-filter/actio
|
|
|
132
131
|
Make sure to select the main branch and check "Release new version".
|
|
133
132
|
|
|
134
133
|
Semantic release will only release on configured branches, so it is safe to run release on any branch.
|
|
135
|
-
|
|
136
|
-
Note: main branch is configured to release a studio-v3 tagged version of the plugin.
|
|
137
|
-
To make semantic-release happy, the branch "semver-main-placeholder" is regarded as the non-prerelease branch,
|
|
138
|
-
but it is unused. The v2 version lives in the sanity mono-repo.
|
package/lib/index.esm.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=["subscribeSelectedIds"],n=["members","options","schemaType","renderDefault","subscribeSelectedIds"];function t(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function r(e){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?t(Object(r),!0).forEach((function(n){l(e,n,r[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):t(Object(r)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}))}return e}function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){if(null==e)return{};var t,r,l=function(e,n){if(null==e)return{};var t,r,l={},i=Object.keys(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}import{jsx as c,jsxs as o,Fragment as a}from"react/jsx-runtime";import{definePlugin as s}from"sanity";import{createContext as d,useMemo as u,useContext as g,useState as f,useEffect as p,useCallback as h}from"react";import{useClickOutside as m,Box as b,Card as y,Stack as S,Text as O,Flex as v,Checkbox as j,Popover as w,Button as I}from"@sanity/ui";const L=(e,n,t)=>!e.name.startsWith("locale")||t.includes(n.name);function T(e,n){var t,r;const l=function(e){return"object"===(null==e?void 0:e.jsonType)&&"document"===P(e).name}(e)&&(null==(t=null==e?void 0:e.options)?void 0:t.languageFilter),i=!n.documentTypes;return!!(i&&!1!==l||!i&&l||e&&(null==(r=n.documentTypes)?void 0:r.includes(e.name)))}function P(e){return e.type?P(e.type):e}const D=d(void 0);function k(e){let{options:n,enabled:t,children:r}=e;const l=u((()=>({options:n,enabled:t})),[n,t]);return c(D.Provider,{value:l,children:r})}const x="@sanity/plugin/language-filter/selected-languages";function C(e){let{supportedLanguages:n,defaultLanguages:t}=e;return n.filter((e=>!(null==t?void 0:t.includes(e.id))))}function E(e){return f((()=>function(e){const n=C(e).map((e=>e.id));let t=n;try{const e=window.localStorage.getItem(x);e&&(t=JSON.parse(e))}catch(e){}var r;return r=n,t=t.filter((e=>r.includes(e))),t}(e)))}function F(n){const t=g(D),{options:l,enabled:o}=t||{},{subscribeSelectedIds:a}=n,s=i(n,e);return o&&l?c(N,r(r({},s),{},{options:l,subscribeSelectedIds:a})):n.renderDefault(s)}function N(e){var t;const{members:l,options:c,schemaType:o,renderDefault:a,subscribeSelectedIds:s}=e,d=i(e,n),[g,f]=E(c);p((()=>{const e=s(f);return()=>e()}),[s,f]);const h=u((()=>{var e;return[...null!=(e=c.defaultLanguages)?e:[],...g]}),[c.defaultLanguages,g]),m=null!=(t=c.filterField)?t:L,b=u((()=>l.filter((e=>"field"===e.kind&&m(o,e,h)||"fieldSet"===e.kind)).map((e=>"fieldSet"===e.kind?r(r({},e),{},{fieldSet:r(r({},e.fieldSet),{},{members:e.fieldSet.members.filter((e=>"field"===e.kind&&m(o,e,h)))})}):e))),[o,l,m,h]);return a(r(r({},d),{},{members:b,schemaType:o,renderDefault:a}))}function A(e){const{options:n,onSelectedIdsChange:t}=e,{defaultLanguages:r}=n,[l,i]=E(n),c=u((()=>C(n)),[n]),o=h((e=>{var n;i(e),n=e,window.localStorage.setItem(x,JSON.stringify(n)),t(e)}),[t,i]),a=h((()=>o(c.map((e=>e.id)))),[o,c]),s=h((()=>{o([])}),[o]),d=h((e=>{let n=l;n=n.includes(e)?n.filter((n=>n!==e)):[...n,e],o(n)}),[o,l]);return{activeLanguages:u((()=>[...null!=r?r:[],...l]),[r,l]),allSelected:l.length===c.length,selectAll:a,selectNone:s,toggleLanguage:d}}function z(e){const{options:n,onSelectedIdsChange:t}=e,r=n.supportedLanguages.filter((e=>{var t;return null==(t=n.defaultLanguages)?void 0:t.includes(e.id)})),l=n.supportedLanguages.filter((e=>{var t;return!(null==(t=n.defaultLanguages)?void 0:t.includes(e.id))})),[i,s]=f(!1),{activeLanguages:d,allSelected:u,selectAll:g,selectNone:p,toggleLanguage:L}=A({options:n,onSelectedIdsChange:t}),[T,P]=f(null),[D,k]=f(null),x=h((e=>{e.currentTarget.checked?g():p()}),[g,p]),C=h((()=>s((e=>!e))),[]),E=h((()=>s(!1)),[]);m(E,[T,D]);const F=o(b,{overflow:"auto",padding:1,children:[r.length>0&&c(y,{radius:2,children:o(S,{padding:2,space:3,children:[c(b,{paddingBottom:2,children:o(O,{size:1,weight:"semibold",children:["Default language",r.length>1&&c(a,{children:"s"})]})}),r.map((e=>c(O,{children:e.title},e.id)))]})}),o(S,{marginTop:3,padding:2,space:2,children:[c(b,{paddingBottom:2,children:c(O,{size:1,weight:"semibold",children:"Show translations"})}),c(y,{as:"label",children:o(v,{align:"center",gap:2,children:[c(j,{checked:u,name:"_allSelected",onChange:x}),c(b,{flex:1,children:c(O,{muted:!u,weight:"semibold",children:"All translations"})})]})}),l.map((e=>c(B,{id:e.id,onToggle:L,selected:d.includes(e.id),title:e.title},e.id)))]})]}),N=n.supportedLanguages.length;return c(w,{content:F,open:i,portal:!0,ref:k,children:c(I,{text:o(v,{gap:1,children:[c(b,{children:"Filter languages:"}),o(v,{gap:1,justify:"space-around",children:[c(v,{style:{width:"".concat(Math.floor(Math.log10(N)+1),"ch")},justify:"flex-end",children:d.length}),c(b,{children:"/"}),c(b,{children:N})]})]}),mode:"bleed",onClick:C,ref:P,selected:i})})}function B(e){const{id:n,onToggle:t,selected:r,title:l}=e,i=h((()=>{t(n)}),[n,t]);return c(y,{as:"label",children:o(v,{align:"center",gap:2,children:[c(j,{checked:r,name:"language-".concat(n),onChange:i}),c(b,{flex:1,children:c(O,{muted:!r,children:l})})]})})}const J=s((e=>{const{onSelectedIdsChange:n,subscribeSelectedIds:t}=function(){const e=[];return{onSelectedIdsChange:n=>{e.forEach((e=>e(n)))},subscribeSelectedIds:n=>(e.push(n),()=>{e.splice(e.indexOf(n),1)})}}(),l=()=>c(z,{options:e,onSelectedIdsChange:n});return{name:"@sanity/language-filter",document:{unstable_languageFilter:(n,t)=>{let{schemaType:r,schema:i}=t;return T(i.get(r),e)?[...n,l]:n}},form:{components:{input:function(n){const l=T(n.schemaType,e);return l?c(k,{enabled:l,options:e,children:n.renderDefault(n)}):"object"===n.schemaType.jsonType?c(F,r(r({},n),{},{subscribeSelectedIds:t})):n.renderDefault(n)}}}}}));export{L as defaultFilterField,T as isLanguageFilterEnabled,J as languageFilter};
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/filterField.ts","../src/LanguageFilterContext.tsx","../src/useSelectedLanguageIds.ts","../src/LanguageFilterObjectInput.tsx","../src/usePaneLanguages.ts","../src/LanguageFilterMenuButton.tsx","../src/plugin.tsx","../src/languageSubscription.ts"],"sourcesContent":["import type {SchemaType} from 'sanity'\nimport {FilterFieldFunction, LanguageFilterConfig, LanguageFilterSchema} from './types'\n\nexport const defaultFilterField: FilterFieldFunction = (\n enclosingType,\n field,\n selectedLanguageIds\n) => !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name)\n\nexport function isLanguageFilterEnabled(\n schemaType: SchemaType | undefined,\n options: LanguageFilterConfig\n): boolean {\n const schemaFilter =\n isDocument(schemaType) && (schemaType as LanguageFilterSchema)?.options?.languageFilter\n const defaultEnabled = !options.documentTypes\n\n return !!(\n (defaultEnabled && schemaFilter !== false) ||\n (!defaultEnabled && schemaFilter) ||\n (schemaType && options.documentTypes?.includes(schemaType.name))\n )\n}\n\nfunction isDocument(schemaType?: SchemaType) {\n return schemaType?.jsonType === 'object' && getRootType(schemaType).name === 'document'\n}\n\nfunction getRootType(schema: SchemaType): SchemaType {\n if (schema.type) {\n return getRootType(schema.type)\n }\n return schema\n}\n","import React, {createContext, PropsWithChildren, useContext, useMemo} from 'react'\nimport {LanguageFilterConfig} from './types'\n\nexport interface LanguageFilterContextValue {\n // eslint-disable-next-line react/require-default-props\n options: LanguageFilterConfig\n // eslint-disable-next-line react/require-default-props\n enabled: boolean\n}\n\nconst LanguageFilterContext = createContext<LanguageFilterContextValue | undefined>(undefined)\n\nexport function LanguageFilterProvider({\n options,\n enabled,\n children,\n}: PropsWithChildren<\n Omit<LanguageFilterContextValue, 'selectedLanguageIds' | 'setSelectedLanguageIds'>\n>) {\n const value = useMemo(() => ({options, enabled}), [options, enabled])\n return <LanguageFilterContext.Provider value={value}>{children}</LanguageFilterContext.Provider>\n}\n\nexport function useLanguageFilterContext() {\n return useContext(LanguageFilterContext)\n}\n","import {Language, LanguageFilterConfig} from './types'\nimport {useState} from 'react'\nconst storageKey = '@sanity/plugin/language-filter/selected-languages'\n\nexport function getPersistedLanguageIds(options: LanguageFilterConfig): string[] {\n const selectableLangs = getSelectableLanguages(options).map((l) => l.id)\n\n let selected: string[] = selectableLangs\n try {\n const persistedValue = window.localStorage.getItem(storageKey)\n if (persistedValue) {\n selected = JSON.parse(persistedValue)\n }\n } catch (err) {} // eslint-disable-line no-empty\n\n // constrain persisted/selected languages to the ones currently supported\n selected = intersection(selected, selectableLangs)\n return selected\n}\n\nexport function persistLanguageIds(languageIds: string[]): void {\n window.localStorage.setItem(storageKey, JSON.stringify(languageIds))\n}\n\nfunction intersection(array1: string[], array2: string[]) {\n return array1.filter((value) => array2.includes(value))\n}\n\nexport function getSelectableLanguages({\n supportedLanguages,\n defaultLanguages,\n}: LanguageFilterConfig): Language[] {\n return supportedLanguages.filter((lang) => !defaultLanguages?.includes(lang.id))\n}\n\nexport function useSelectedLanguageIds(\n options: LanguageFilterConfig\n): [string[], (ids: string[]) => void] {\n return useState(() => getPersistedLanguageIds(options))\n}\n","import React, {useEffect, useMemo} from 'react'\nimport {ObjectInputProps, ObjectMember} from 'sanity'\nimport {LanguageFilterConfig} from './types'\nimport {defaultFilterField} from './filterField'\nimport {useLanguageFilterContext} from './LanguageFilterContext'\nimport {useSelectedLanguageIds} from './useSelectedLanguageIds'\n\nexport type LanguageFilterObjectInputProps = {\n options: LanguageFilterConfig\n /**\n * We need a way to communicate state changes between the pane menu and input components.\n * LanguageFilter button lives outside the input-render tree, so Context is out.\n * This is a workaround for that.\n */\n subscribeSelectedIds: (callback: (ids: string[]) => void) => () => void\n} & ObjectInputProps\n\nexport function LanguageFilterObjectInput(\n props: ObjectInputProps & {\n subscribeSelectedIds: (callback: (ids: string[]) => void) => () => void\n }\n) {\n const context = useLanguageFilterContext()\n const {options, enabled} = context || {}\n const {subscribeSelectedIds, ...restProps} = props\n if (!enabled || !options) {\n return props.renderDefault(restProps)\n }\n return (\n <FilteredObjectInput\n {...restProps}\n options={options}\n subscribeSelectedIds={subscribeSelectedIds}\n />\n )\n}\n\nfunction FilteredObjectInput(props: LanguageFilterObjectInputProps) {\n const {\n members: membersProp,\n options,\n schemaType,\n renderDefault,\n subscribeSelectedIds,\n ...restProps\n } = props\n const [selectedIds, setSelectedIds] = useSelectedLanguageIds(options)\n\n useEffect(() => {\n const unsubscribe = subscribeSelectedIds(setSelectedIds)\n return () => unsubscribe()\n }, [subscribeSelectedIds, setSelectedIds])\n\n const activeLanguages = useMemo(\n () => [...(options.defaultLanguages ?? []), ...selectedIds],\n [options.defaultLanguages, selectedIds]\n )\n\n const filterField = options.filterField ?? defaultFilterField\n\n const members: ObjectMember[] = useMemo(() => {\n return membersProp\n .filter((member) => {\n return (\n (member.kind === 'field' && filterField(schemaType, member, activeLanguages)) ||\n member.kind === 'fieldSet'\n )\n })\n .map((member) => {\n if (member.kind === 'fieldSet') {\n return {\n ...member,\n fieldSet: {\n ...member.fieldSet,\n members: member.fieldSet.members.filter((fieldsetMember) => {\n return (\n fieldsetMember.kind === 'field' &&\n filterField(schemaType, fieldsetMember, activeLanguages)\n )\n }),\n },\n }\n }\n return member\n })\n }, [schemaType, membersProp, filterField, activeLanguages])\n\n return renderDefault({...restProps, members, schemaType, renderDefault})\n}\n","import {useCallback, useMemo} from 'react'\nimport {LanguageFilterConfig} from './types'\nimport {\n getSelectableLanguages,\n persistLanguageIds,\n useSelectedLanguageIds,\n} from './useSelectedLanguageIds'\n\nexport interface UsePaneLanguagesParams {\n options: LanguageFilterConfig\n /**\n * We need a way to communicate state changes between the pane menu and input components.\n * LanguageFilter button lives outside the input-render tree, so Context is out.\n * This is a workaround for that.\n */\n onSelectedIdsChange: (ids: string[]) => void\n}\n\nexport function usePaneLanguages(props: UsePaneLanguagesParams): {\n activeLanguages: string[]\n allSelected: boolean\n selectAll: () => void\n selectNone: () => void\n toggleLanguage: (languageId: string) => void\n} {\n const {options, onSelectedIdsChange} = props\n const {defaultLanguages} = options\n\n const [selectedIds, setSelectedIds] = useSelectedLanguageIds(options)\n\n const selectableLanguages = useMemo(() => getSelectableLanguages(options), [options])\n\n const updateSelectedIds = useCallback(\n (ids: string[]) => {\n setSelectedIds(ids)\n persistLanguageIds(ids)\n onSelectedIdsChange(ids)\n },\n [onSelectedIdsChange, setSelectedIds]\n )\n\n const selectAll = useCallback(\n () => updateSelectedIds(selectableLanguages.map((l) => l.id)),\n [updateSelectedIds, selectableLanguages]\n )\n\n const selectNone = useCallback(() => {\n updateSelectedIds([])\n }, [updateSelectedIds])\n\n const toggleLanguage = useCallback(\n (languageId: string) => {\n let lang = selectedIds\n\n if (lang.includes(languageId)) {\n lang = lang.filter((l) => l !== languageId)\n } else {\n lang = [...lang, languageId]\n }\n\n updateSelectedIds(lang)\n },\n [updateSelectedIds, selectedIds]\n )\n\n const activeLanguages = useMemo(\n () => [...(defaultLanguages ?? []), ...selectedIds],\n [defaultLanguages, selectedIds]\n )\n\n return {\n activeLanguages,\n allSelected: selectedIds.length === selectableLanguages.length,\n selectAll,\n selectNone,\n toggleLanguage,\n }\n}\n","import {Box, Button, Card, Checkbox, Flex, Popover, Stack, Text, useClickOutside} from '@sanity/ui'\nimport React, {FormEvent, useCallback, useState} from 'react'\nimport {usePaneLanguages} from './usePaneLanguages'\nimport {LanguageFilterConfig} from './types'\n\nexport interface LanguageFilterMenuButtonProps {\n options: LanguageFilterConfig\n onSelectedIdsChange: (ids: string[]) => void\n}\n\nexport function LanguageFilterMenuButton(props: LanguageFilterMenuButtonProps) {\n const {options, onSelectedIdsChange} = props\n\n const defaultLanguages = options.supportedLanguages.filter((l) =>\n options.defaultLanguages?.includes(l.id)\n )\n\n const languageOptions = options.supportedLanguages.filter(\n (l) => !options.defaultLanguages?.includes(l.id)\n )\n const [open, setOpen] = useState(false)\n const {activeLanguages, allSelected, selectAll, selectNone, toggleLanguage} = usePaneLanguages({\n options,\n onSelectedIdsChange,\n })\n const [button, setButton] = useState<HTMLElement | null>(null)\n const [popover, setPopover] = useState<HTMLElement | null>(null)\n\n const handleToggleAll = useCallback(\n (event: FormEvent<HTMLInputElement>) => {\n const checked = event.currentTarget.checked\n\n if (checked) {\n selectAll()\n } else {\n selectNone()\n }\n },\n [selectAll, selectNone]\n )\n\n const handleClick = useCallback(() => setOpen((o) => !o), [])\n\n const handleClickOutside = useCallback(() => setOpen(false), [])\n\n useClickOutside(handleClickOutside, [button, popover])\n\n const content = (\n <Box overflow=\"auto\" padding={1}>\n {defaultLanguages.length > 0 && (\n <Card radius={2}>\n <Stack padding={2} space={3}>\n <Box paddingBottom={2}>\n <Text size={1} weight=\"semibold\">\n Default language{defaultLanguages.length > 1 && <>s</>}\n </Text>\n </Box>\n\n {defaultLanguages.map((l) => (\n <Text key={l.id}>{l.title}</Text>\n ))}\n </Stack>\n </Card>\n )}\n\n <Stack marginTop={3} padding={2} space={2}>\n <Box paddingBottom={2}>\n <Text size={1} weight=\"semibold\">\n Show translations\n </Text>\n </Box>\n\n <Card as=\"label\">\n <Flex align=\"center\" gap={2}>\n <Checkbox checked={allSelected} name=\"_allSelected\" onChange={handleToggleAll} />\n <Box flex={1}>\n <Text muted={!allSelected} weight=\"semibold\">\n All translations\n </Text>\n </Box>\n </Flex>\n </Card>\n\n {languageOptions.map((lang) => (\n <LanguageFilterOption\n id={lang.id}\n key={lang.id}\n onToggle={toggleLanguage}\n selected={activeLanguages.includes(lang.id)}\n title={lang.title}\n />\n ))}\n </Stack>\n </Box>\n )\n\n const langCount = options.supportedLanguages.length\n return (\n <Popover content={content} open={open} portal ref={setPopover}>\n <Button\n text={\n <Flex gap={1}>\n <Box>Filter languages:</Box>\n <Flex gap={1} justify=\"space-around\">\n <Flex\n style={{width: `${Math.floor(Math.log10(langCount) + 1)}ch`}}\n justify=\"flex-end\"\n >\n {activeLanguages.length}\n </Flex>\n <Box>/</Box>\n <Box>{langCount}</Box>\n </Flex>\n </Flex>\n }\n mode=\"bleed\"\n onClick={handleClick}\n ref={setButton}\n selected={open}\n />\n </Popover>\n )\n}\n\nfunction LanguageFilterOption(props: {\n id: string\n onToggle: (id: string) => void\n selected: boolean\n title: string\n}) {\n const {id, onToggle, selected, title} = props\n\n const handleChange = useCallback(() => {\n onToggle(id)\n }, [id, onToggle])\n\n return (\n <Card as=\"label\">\n <Flex align=\"center\" gap={2}>\n <Checkbox checked={selected} name={`language-${id}`} onChange={handleChange} />\n <Box flex={1}>\n <Text muted={!selected}>{title}</Text>\n </Box>\n </Flex>\n </Card>\n )\n}\n","import React from 'react'\nimport {definePlugin, DocumentLanguageFilterComponent, ObjectInputProps} from 'sanity'\nimport {LanguageFilterObjectInput} from './LanguageFilterObjectInput'\nimport {LanguageFilterMenuButton} from './LanguageFilterMenuButton'\nimport {LanguageFilterConfig} from './types'\nimport {isLanguageFilterEnabled} from './filterField'\nimport {LanguageFilterProvider} from './LanguageFilterContext'\nimport {createSelectedLanguageIdsBus} from './languageSubscription'\n\n/**\n * ## Usage in sanity.config.ts (or .js)\n *\n * ```\n * import {defineConfig} from 'sanity'\n * import {languageFilter} from '@sanity/language-filter'\n *\n * export const defineConfig({\n * /...\n * plugins: [\n * languageFilter({\n * supportedLanguages: [\n * {id: 'nb', title: 'Norwegian (Bokmål)'},\n * {id: 'nn', title: 'Norwegian (Nynorsk)'},\n * {id: 'en', title: 'English'},\n * {id: 'es', title: 'Spanish'},\n * {id: 'arb', title: 'Arabic'},\n * {id: 'pt', title: 'Portuguese'},\n * //...\n * ],\n * // Select Norwegian (Bokmål) by default\n * defaultLanguages: ['nb'],\n * // Only show language filter for document type `page` (schemaType.name)\n * // Can also enable via document-options: options.languageFilter: true\n * documentTypes: ['page'],\n * // default filter function shown\n * filterField: (enclosingType, field, selectedLanguageIds) =>\n * !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name),\n * })\n * ]\n * })\n * ```\n */\nexport const languageFilter = definePlugin<LanguageFilterConfig>((options) => {\n const {onSelectedIdsChange, subscribeSelectedIds} = createSelectedLanguageIdsBus()\n\n const RenderLanguageFilter: DocumentLanguageFilterComponent = () => {\n return <LanguageFilterMenuButton options={options} onSelectedIdsChange={onSelectedIdsChange} />\n }\n\n return {\n name: '@sanity/language-filter',\n document: {\n unstable_languageFilter: (prev, {schemaType, schema}) => {\n if (isLanguageFilterEnabled(schema.get(schemaType), options)) {\n return [...prev, RenderLanguageFilter]\n }\n return prev\n },\n },\n\n form: {\n components: {\n // eslint-disable-next-line func-name-matching\n input: function LanguageFilterWrapper(props) {\n const enabled = isLanguageFilterEnabled(props.schemaType, options)\n // will only be considered enabled for document, so this is only done once\n if (enabled) {\n return (\n <LanguageFilterProvider enabled={enabled} options={options}>\n {props.renderDefault(props)}\n </LanguageFilterProvider>\n )\n }\n if (props.schemaType.jsonType === 'object') {\n return (\n <LanguageFilterObjectInput\n {...(props as ObjectInputProps)}\n subscribeSelectedIds={subscribeSelectedIds}\n />\n )\n }\n\n return props.renderDefault(props)\n },\n },\n },\n }\n})\n","export type LanguageSubscription = (ids: string[]) => void\nexport type Unsubscribe = () => void\nexport type LanguageSubscribe = (subscription: LanguageSubscription) => Unsubscribe\n\nexport interface SelectedLanguageIdsBus {\n onSelectedIdsChange: (ids: string[]) => void\n subscribeSelectedIds: LanguageSubscribe\n}\n\n/**\n * We need a way to communicate state changes between the pane menu and input components.\n * LanguageFilter button lives outside the input-render tree, so Context is out.\n * This is a workaround for that.\n */\nexport function createSelectedLanguageIdsBus(): SelectedLanguageIdsBus {\n const subs: LanguageSubscription[] = []\n\n const onSelectedIdsChange = (ids: string[]) => {\n subs.forEach((s) => s(ids))\n }\n const subscribeSelectedIds = (subscription: LanguageSubscription) => {\n subs.push(subscription)\n return () => {\n subs.splice(subs.indexOf(subscription), 1)\n }\n }\n\n return {\n onSelectedIdsChange,\n subscribeSelectedIds,\n }\n}\n"],"names":["defaultFilterField","enclosingType","field","selectedLanguageIds","name","startsWith","includes","isLanguageFilterEnabled","schemaType","options","_a","_b","schemaFilter","jsonType","getRootType","isDocument","languageFilter","defaultEnabled","documentTypes","schema","type","LanguageFilterContext","createContext","LanguageFilterProvider","_ref","enabled","children","value","useMemo","jsx","Provider","storageKey","getSelectableLanguages","_ref2","supportedLanguages","defaultLanguages","filter","lang","id","useSelectedLanguageIds","useState","selectableLangs","map","l","selected","persistedValue","window","localStorage","getItem","JSON","parse","err","array2","getPersistedLanguageIds","LanguageFilterObjectInput","props","context","useContext","subscribeSelectedIds","restProps","_excluded","FilteredObjectInput","renderDefault","members","membersProp","_excluded2","selectedIds","setSelectedIds","useEffect","unsubscribe","activeLanguages","filterField","member","kind","_objectSpread","fieldSet","fieldsetMember","usePaneLanguages","onSelectedIdsChange","selectableLanguages","updateSelectedIds","useCallback","ids","languageIds","setItem","stringify","selectAll","selectNone","toggleLanguage","languageId","allSelected","length","LanguageFilterMenuButton","languageOptions","open","setOpen","button","setButton","popover","setPopover","handleToggleAll","event","currentTarget","checked","handleClick","o","handleClickOutside","useClickOutside","content","jsxs","Box","overflow","padding","Card","radius","Stack","space","paddingBottom","Text","size","weight","Fragment","title","marginTop","as","Flex","align","gap","Checkbox","onChange","flex","muted","LanguageFilterOption","onToggle","langCount","Popover","portal","ref","Button","text","justify","style","width","Math","floor","log10","mode","onClick","handleChange","definePlugin","subs","forEach","s","subscription","push","splice","indexOf","createSelectedLanguageIdsBus","RenderLanguageFilter","document","unstable_languageFilter","prev","_ref3","get","form","components","input"],"mappings":"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"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const e=["subscribeSelectedIds"],t=["members","options","schemaType","renderDefault","subscribeSelectedIds"];function n(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function l(e){for(var t=1;t<arguments.length;t++){var l=null!=arguments[t]?arguments[t]:{};t%2?n(Object(l),!0).forEach((function(t){r(e,t,l[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(l)):n(Object(l)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(l,t))}))}return e}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){if(null==e)return{};var n,l,r=function(e,t){if(null==e)return{};var n,l,r={},s=Object.keys(e);for(l=0;l<s.length;l++)n=s[l],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(l=0;l<s.length;l++)n=s[l],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}Object.defineProperty(exports,"__esModule",{value:!0});var a=require("react/jsx-runtime"),i=require("sanity"),c=require("react"),o=require("@sanity/ui");const u=(e,t,n)=>!e.name.startsWith("locale")||n.includes(t.name);function d(e,t){var n,l;const r=function(e){return"object"===(null==e?void 0:e.jsonType)&&"document"===g(e).name}(e)&&(null==(n=null==e?void 0:e.options)?void 0:n.languageFilter),s=!t.documentTypes;return!!(s&&!1!==r||!s&&r||e&&(null==(l=t.documentTypes)?void 0:l.includes(e.name)))}function g(e){return e.type?g(e.type):e}const f=c.createContext(void 0);function p(e){let{options:t,enabled:n,children:l}=e;const r=c.useMemo((()=>({options:t,enabled:n})),[t,n]);return a.jsx(f.Provider,{value:r,children:l})}const h="@sanity/plugin/language-filter/selected-languages";function b(e){let{supportedLanguages:t,defaultLanguages:n}=e;return t.filter((e=>!(null==n?void 0:n.includes(e.id))))}function x(e){return c.useState((()=>function(e){const t=b(e).map((e=>e.id));let n=t;try{const e=window.localStorage.getItem(h);e&&(n=JSON.parse(e))}catch(e){}var l;return l=t,n=n.filter((e=>l.includes(e))),n}(e)))}function m(t){const n=c.useContext(f),{options:r,enabled:i}=n||{},{subscribeSelectedIds:o}=t,u=s(t,e);return i&&r?a.jsx(j,l(l({},u),{},{options:r,subscribeSelectedIds:o})):t.renderDefault(u)}function j(e){var n;const{members:r,options:a,schemaType:i,renderDefault:o,subscribeSelectedIds:d}=e,g=s(e,t),[f,p]=x(a);c.useEffect((()=>{const e=d(p);return()=>e()}),[d,p]);const h=c.useMemo((()=>{var e;return[...null!=(e=a.defaultLanguages)?e:[],...f]}),[a.defaultLanguages,f]),b=null!=(n=a.filterField)?n:u,m=c.useMemo((()=>r.filter((e=>"field"===e.kind&&b(i,e,h)||"fieldSet"===e.kind)).map((e=>"fieldSet"===e.kind?l(l({},e),{},{fieldSet:l(l({},e.fieldSet),{},{members:e.fieldSet.members.filter((e=>"field"===e.kind&&b(i,e,h)))})}):e))),[i,r,b,h]);return o(l(l({},g),{},{members:m,schemaType:i,renderDefault:o}))}function y(e){const{options:t,onSelectedIdsChange:n}=e,{defaultLanguages:l}=t,[r,s]=x(t),a=c.useMemo((()=>b(t)),[t]),i=c.useCallback((e=>{var t;s(e),t=e,window.localStorage.setItem(h,JSON.stringify(t)),n(e)}),[n,s]),o=c.useCallback((()=>i(a.map((e=>e.id)))),[i,a]),u=c.useCallback((()=>{i([])}),[i]),d=c.useCallback((e=>{let t=r;t=t.includes(e)?t.filter((t=>t!==e)):[...t,e],i(t)}),[i,r]);return{activeLanguages:c.useMemo((()=>[...null!=l?l:[],...r]),[l,r]),allSelected:r.length===a.length,selectAll:o,selectNone:u,toggleLanguage:d}}function S(e){const{options:t,onSelectedIdsChange:n}=e,l=t.supportedLanguages.filter((e=>{var n;return null==(n=t.defaultLanguages)?void 0:n.includes(e.id)})),r=t.supportedLanguages.filter((e=>{var n;return!(null==(n=t.defaultLanguages)?void 0:n.includes(e.id))})),[s,i]=c.useState(!1),{activeLanguages:u,allSelected:d,selectAll:g,selectNone:f,toggleLanguage:p}=y({options:t,onSelectedIdsChange:n}),[h,b]=c.useState(null),[x,m]=c.useState(null),j=c.useCallback((e=>{e.currentTarget.checked?g():f()}),[g,f]),S=c.useCallback((()=>i((e=>!e))),[]),O=c.useCallback((()=>i(!1)),[]);o.useClickOutside(O,[h,x]);const C=a.jsxs(o.Box,{overflow:"auto",padding:1,children:[l.length>0&&a.jsx(o.Card,{radius:2,children:a.jsxs(o.Stack,{padding:2,space:3,children:[a.jsx(o.Box,{paddingBottom:2,children:a.jsxs(o.Text,{size:1,weight:"semibold",children:["Default language",l.length>1&&a.jsx(a.Fragment,{children:"s"})]})}),l.map((e=>a.jsx(o.Text,{children:e.title},e.id)))]})}),a.jsxs(o.Stack,{marginTop:3,padding:2,space:2,children:[a.jsx(o.Box,{paddingBottom:2,children:a.jsx(o.Text,{size:1,weight:"semibold",children:"Show translations"})}),a.jsx(o.Card,{as:"label",children:a.jsxs(o.Flex,{align:"center",gap:2,children:[a.jsx(o.Checkbox,{checked:d,name:"_allSelected",onChange:j}),a.jsx(o.Box,{flex:1,children:a.jsx(o.Text,{muted:!d,weight:"semibold",children:"All translations"})})]})}),r.map((e=>a.jsx(v,{id:e.id,onToggle:p,selected:u.includes(e.id),title:e.title},e.id)))]})]}),k=t.supportedLanguages.length;return a.jsx(o.Popover,{content:C,open:s,portal:!0,ref:m,children:a.jsx(o.Button,{text:a.jsxs(o.Flex,{gap:1,children:[a.jsx(o.Box,{children:"Filter languages:"}),a.jsxs(o.Flex,{gap:1,justify:"space-around",children:[a.jsx(o.Flex,{style:{width:"".concat(Math.floor(Math.log10(k)+1),"ch")},justify:"flex-end",children:u.length}),a.jsx(o.Box,{children:"/"}),a.jsx(o.Box,{children:k})]})]}),mode:"bleed",onClick:S,ref:b,selected:s})})}function v(e){const{id:t,onToggle:n,selected:l,title:r}=e,s=c.useCallback((()=>{n(t)}),[t,n]);return a.jsx(o.Card,{as:"label",children:a.jsxs(o.Flex,{align:"center",gap:2,children:[a.jsx(o.Checkbox,{checked:l,name:"language-".concat(t),onChange:s}),a.jsx(o.Box,{flex:1,children:a.jsx(o.Text,{muted:!l,children:r})})]})})}const O=i.definePlugin((e=>{const{onSelectedIdsChange:t,subscribeSelectedIds:n}=function(){const e=[];return{onSelectedIdsChange:t=>{e.forEach((e=>e(t)))},subscribeSelectedIds:t=>(e.push(t),()=>{e.splice(e.indexOf(t),1)})}}(),r=()=>a.jsx(S,{options:e,onSelectedIdsChange:t});return{name:"@sanity/language-filter",document:{unstable_languageFilter:(t,n)=>{let{schemaType:l,schema:s}=n;return d(s.get(l),e)?[...t,r]:t}},form:{components:{input:function(t){const r=d(t.schemaType,e);return r?a.jsx(p,{enabled:r,options:e,children:t.renderDefault(t)}):"object"===t.schemaType.jsonType?a.jsx(m,l(l({},t),{},{subscribeSelectedIds:n})):t.renderDefault(t)}}}}}));exports.defaultFilterField=u,exports.isLanguageFilterEnabled=d,exports.languageFilter=O;
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/filterField.ts","../src/LanguageFilterContext.tsx","../src/useSelectedLanguageIds.ts","../src/LanguageFilterObjectInput.tsx","../src/usePaneLanguages.ts","../src/LanguageFilterMenuButton.tsx","../src/plugin.tsx","../src/languageSubscription.ts"],"sourcesContent":["import type {SchemaType} from 'sanity'\nimport {FilterFieldFunction, LanguageFilterConfig, LanguageFilterSchema} from './types'\n\nexport const defaultFilterField: FilterFieldFunction = (\n enclosingType,\n field,\n selectedLanguageIds\n) => !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name)\n\nexport function isLanguageFilterEnabled(\n schemaType: SchemaType | undefined,\n options: LanguageFilterConfig\n): boolean {\n const schemaFilter =\n isDocument(schemaType) && (schemaType as LanguageFilterSchema)?.options?.languageFilter\n const defaultEnabled = !options.documentTypes\n\n return !!(\n (defaultEnabled && schemaFilter !== false) ||\n (!defaultEnabled && schemaFilter) ||\n (schemaType && options.documentTypes?.includes(schemaType.name))\n )\n}\n\nfunction isDocument(schemaType?: SchemaType) {\n return schemaType?.jsonType === 'object' && getRootType(schemaType).name === 'document'\n}\n\nfunction getRootType(schema: SchemaType): SchemaType {\n if (schema.type) {\n return getRootType(schema.type)\n }\n return schema\n}\n","import React, {createContext, PropsWithChildren, useContext, useMemo} from 'react'\nimport {LanguageFilterConfig} from './types'\n\nexport interface LanguageFilterContextValue {\n // eslint-disable-next-line react/require-default-props\n options: LanguageFilterConfig\n // eslint-disable-next-line react/require-default-props\n enabled: boolean\n}\n\nconst LanguageFilterContext = createContext<LanguageFilterContextValue | undefined>(undefined)\n\nexport function LanguageFilterProvider({\n options,\n enabled,\n children,\n}: PropsWithChildren<\n Omit<LanguageFilterContextValue, 'selectedLanguageIds' | 'setSelectedLanguageIds'>\n>) {\n const value = useMemo(() => ({options, enabled}), [options, enabled])\n return <LanguageFilterContext.Provider value={value}>{children}</LanguageFilterContext.Provider>\n}\n\nexport function useLanguageFilterContext() {\n return useContext(LanguageFilterContext)\n}\n","import {Language, LanguageFilterConfig} from './types'\nimport {useState} from 'react'\nconst storageKey = '@sanity/plugin/language-filter/selected-languages'\n\nexport function getPersistedLanguageIds(options: LanguageFilterConfig): string[] {\n const selectableLangs = getSelectableLanguages(options).map((l) => l.id)\n\n let selected: string[] = selectableLangs\n try {\n const persistedValue = window.localStorage.getItem(storageKey)\n if (persistedValue) {\n selected = JSON.parse(persistedValue)\n }\n } catch (err) {} // eslint-disable-line no-empty\n\n // constrain persisted/selected languages to the ones currently supported\n selected = intersection(selected, selectableLangs)\n return selected\n}\n\nexport function persistLanguageIds(languageIds: string[]): void {\n window.localStorage.setItem(storageKey, JSON.stringify(languageIds))\n}\n\nfunction intersection(array1: string[], array2: string[]) {\n return array1.filter((value) => array2.includes(value))\n}\n\nexport function getSelectableLanguages({\n supportedLanguages,\n defaultLanguages,\n}: LanguageFilterConfig): Language[] {\n return supportedLanguages.filter((lang) => !defaultLanguages?.includes(lang.id))\n}\n\nexport function useSelectedLanguageIds(\n options: LanguageFilterConfig\n): [string[], (ids: string[]) => void] {\n return useState(() => getPersistedLanguageIds(options))\n}\n","import React, {useEffect, useMemo} from 'react'\nimport {ObjectInputProps, ObjectMember} from 'sanity'\nimport {LanguageFilterConfig} from './types'\nimport {defaultFilterField} from './filterField'\nimport {useLanguageFilterContext} from './LanguageFilterContext'\nimport {useSelectedLanguageIds} from './useSelectedLanguageIds'\n\nexport type LanguageFilterObjectInputProps = {\n options: LanguageFilterConfig\n /**\n * We need a way to communicate state changes between the pane menu and input components.\n * LanguageFilter button lives outside the input-render tree, so Context is out.\n * This is a workaround for that.\n */\n subscribeSelectedIds: (callback: (ids: string[]) => void) => () => void\n} & ObjectInputProps\n\nexport function LanguageFilterObjectInput(\n props: ObjectInputProps & {\n subscribeSelectedIds: (callback: (ids: string[]) => void) => () => void\n }\n) {\n const context = useLanguageFilterContext()\n const {options, enabled} = context || {}\n const {subscribeSelectedIds, ...restProps} = props\n if (!enabled || !options) {\n return props.renderDefault(restProps)\n }\n return (\n <FilteredObjectInput\n {...restProps}\n options={options}\n subscribeSelectedIds={subscribeSelectedIds}\n />\n )\n}\n\nfunction FilteredObjectInput(props: LanguageFilterObjectInputProps) {\n const {\n members: membersProp,\n options,\n schemaType,\n renderDefault,\n subscribeSelectedIds,\n ...restProps\n } = props\n const [selectedIds, setSelectedIds] = useSelectedLanguageIds(options)\n\n useEffect(() => {\n const unsubscribe = subscribeSelectedIds(setSelectedIds)\n return () => unsubscribe()\n }, [subscribeSelectedIds, setSelectedIds])\n\n const activeLanguages = useMemo(\n () => [...(options.defaultLanguages ?? []), ...selectedIds],\n [options.defaultLanguages, selectedIds]\n )\n\n const filterField = options.filterField ?? defaultFilterField\n\n const members: ObjectMember[] = useMemo(() => {\n return membersProp\n .filter((member) => {\n return (\n (member.kind === 'field' && filterField(schemaType, member, activeLanguages)) ||\n member.kind === 'fieldSet'\n )\n })\n .map((member) => {\n if (member.kind === 'fieldSet') {\n return {\n ...member,\n fieldSet: {\n ...member.fieldSet,\n members: member.fieldSet.members.filter((fieldsetMember) => {\n return (\n fieldsetMember.kind === 'field' &&\n filterField(schemaType, fieldsetMember, activeLanguages)\n )\n }),\n },\n }\n }\n return member\n })\n }, [schemaType, membersProp, filterField, activeLanguages])\n\n return renderDefault({...restProps, members, schemaType, renderDefault})\n}\n","import {useCallback, useMemo} from 'react'\nimport {LanguageFilterConfig} from './types'\nimport {\n getSelectableLanguages,\n persistLanguageIds,\n useSelectedLanguageIds,\n} from './useSelectedLanguageIds'\n\nexport interface UsePaneLanguagesParams {\n options: LanguageFilterConfig\n /**\n * We need a way to communicate state changes between the pane menu and input components.\n * LanguageFilter button lives outside the input-render tree, so Context is out.\n * This is a workaround for that.\n */\n onSelectedIdsChange: (ids: string[]) => void\n}\n\nexport function usePaneLanguages(props: UsePaneLanguagesParams): {\n activeLanguages: string[]\n allSelected: boolean\n selectAll: () => void\n selectNone: () => void\n toggleLanguage: (languageId: string) => void\n} {\n const {options, onSelectedIdsChange} = props\n const {defaultLanguages} = options\n\n const [selectedIds, setSelectedIds] = useSelectedLanguageIds(options)\n\n const selectableLanguages = useMemo(() => getSelectableLanguages(options), [options])\n\n const updateSelectedIds = useCallback(\n (ids: string[]) => {\n setSelectedIds(ids)\n persistLanguageIds(ids)\n onSelectedIdsChange(ids)\n },\n [onSelectedIdsChange, setSelectedIds]\n )\n\n const selectAll = useCallback(\n () => updateSelectedIds(selectableLanguages.map((l) => l.id)),\n [updateSelectedIds, selectableLanguages]\n )\n\n const selectNone = useCallback(() => {\n updateSelectedIds([])\n }, [updateSelectedIds])\n\n const toggleLanguage = useCallback(\n (languageId: string) => {\n let lang = selectedIds\n\n if (lang.includes(languageId)) {\n lang = lang.filter((l) => l !== languageId)\n } else {\n lang = [...lang, languageId]\n }\n\n updateSelectedIds(lang)\n },\n [updateSelectedIds, selectedIds]\n )\n\n const activeLanguages = useMemo(\n () => [...(defaultLanguages ?? []), ...selectedIds],\n [defaultLanguages, selectedIds]\n )\n\n return {\n activeLanguages,\n allSelected: selectedIds.length === selectableLanguages.length,\n selectAll,\n selectNone,\n toggleLanguage,\n }\n}\n","import {Box, Button, Card, Checkbox, Flex, Popover, Stack, Text, useClickOutside} from '@sanity/ui'\nimport React, {FormEvent, useCallback, useState} from 'react'\nimport {usePaneLanguages} from './usePaneLanguages'\nimport {LanguageFilterConfig} from './types'\n\nexport interface LanguageFilterMenuButtonProps {\n options: LanguageFilterConfig\n onSelectedIdsChange: (ids: string[]) => void\n}\n\nexport function LanguageFilterMenuButton(props: LanguageFilterMenuButtonProps) {\n const {options, onSelectedIdsChange} = props\n\n const defaultLanguages = options.supportedLanguages.filter((l) =>\n options.defaultLanguages?.includes(l.id)\n )\n\n const languageOptions = options.supportedLanguages.filter(\n (l) => !options.defaultLanguages?.includes(l.id)\n )\n const [open, setOpen] = useState(false)\n const {activeLanguages, allSelected, selectAll, selectNone, toggleLanguage} = usePaneLanguages({\n options,\n onSelectedIdsChange,\n })\n const [button, setButton] = useState<HTMLElement | null>(null)\n const [popover, setPopover] = useState<HTMLElement | null>(null)\n\n const handleToggleAll = useCallback(\n (event: FormEvent<HTMLInputElement>) => {\n const checked = event.currentTarget.checked\n\n if (checked) {\n selectAll()\n } else {\n selectNone()\n }\n },\n [selectAll, selectNone]\n )\n\n const handleClick = useCallback(() => setOpen((o) => !o), [])\n\n const handleClickOutside = useCallback(() => setOpen(false), [])\n\n useClickOutside(handleClickOutside, [button, popover])\n\n const content = (\n <Box overflow=\"auto\" padding={1}>\n {defaultLanguages.length > 0 && (\n <Card radius={2}>\n <Stack padding={2} space={3}>\n <Box paddingBottom={2}>\n <Text size={1} weight=\"semibold\">\n Default language{defaultLanguages.length > 1 && <>s</>}\n </Text>\n </Box>\n\n {defaultLanguages.map((l) => (\n <Text key={l.id}>{l.title}</Text>\n ))}\n </Stack>\n </Card>\n )}\n\n <Stack marginTop={3} padding={2} space={2}>\n <Box paddingBottom={2}>\n <Text size={1} weight=\"semibold\">\n Show translations\n </Text>\n </Box>\n\n <Card as=\"label\">\n <Flex align=\"center\" gap={2}>\n <Checkbox checked={allSelected} name=\"_allSelected\" onChange={handleToggleAll} />\n <Box flex={1}>\n <Text muted={!allSelected} weight=\"semibold\">\n All translations\n </Text>\n </Box>\n </Flex>\n </Card>\n\n {languageOptions.map((lang) => (\n <LanguageFilterOption\n id={lang.id}\n key={lang.id}\n onToggle={toggleLanguage}\n selected={activeLanguages.includes(lang.id)}\n title={lang.title}\n />\n ))}\n </Stack>\n </Box>\n )\n\n const langCount = options.supportedLanguages.length\n return (\n <Popover content={content} open={open} portal ref={setPopover}>\n <Button\n text={\n <Flex gap={1}>\n <Box>Filter languages:</Box>\n <Flex gap={1} justify=\"space-around\">\n <Flex\n style={{width: `${Math.floor(Math.log10(langCount) + 1)}ch`}}\n justify=\"flex-end\"\n >\n {activeLanguages.length}\n </Flex>\n <Box>/</Box>\n <Box>{langCount}</Box>\n </Flex>\n </Flex>\n }\n mode=\"bleed\"\n onClick={handleClick}\n ref={setButton}\n selected={open}\n />\n </Popover>\n )\n}\n\nfunction LanguageFilterOption(props: {\n id: string\n onToggle: (id: string) => void\n selected: boolean\n title: string\n}) {\n const {id, onToggle, selected, title} = props\n\n const handleChange = useCallback(() => {\n onToggle(id)\n }, [id, onToggle])\n\n return (\n <Card as=\"label\">\n <Flex align=\"center\" gap={2}>\n <Checkbox checked={selected} name={`language-${id}`} onChange={handleChange} />\n <Box flex={1}>\n <Text muted={!selected}>{title}</Text>\n </Box>\n </Flex>\n </Card>\n )\n}\n","import React from 'react'\nimport {definePlugin, DocumentLanguageFilterComponent, ObjectInputProps} from 'sanity'\nimport {LanguageFilterObjectInput} from './LanguageFilterObjectInput'\nimport {LanguageFilterMenuButton} from './LanguageFilterMenuButton'\nimport {LanguageFilterConfig} from './types'\nimport {isLanguageFilterEnabled} from './filterField'\nimport {LanguageFilterProvider} from './LanguageFilterContext'\nimport {createSelectedLanguageIdsBus} from './languageSubscription'\n\n/**\n * ## Usage in sanity.config.ts (or .js)\n *\n * ```\n * import {defineConfig} from 'sanity'\n * import {languageFilter} from '@sanity/language-filter'\n *\n * export const defineConfig({\n * /...\n * plugins: [\n * languageFilter({\n * supportedLanguages: [\n * {id: 'nb', title: 'Norwegian (Bokmål)'},\n * {id: 'nn', title: 'Norwegian (Nynorsk)'},\n * {id: 'en', title: 'English'},\n * {id: 'es', title: 'Spanish'},\n * {id: 'arb', title: 'Arabic'},\n * {id: 'pt', title: 'Portuguese'},\n * //...\n * ],\n * // Select Norwegian (Bokmål) by default\n * defaultLanguages: ['nb'],\n * // Only show language filter for document type `page` (schemaType.name)\n * // Can also enable via document-options: options.languageFilter: true\n * documentTypes: ['page'],\n * // default filter function shown\n * filterField: (enclosingType, field, selectedLanguageIds) =>\n * !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name),\n * })\n * ]\n * })\n * ```\n */\nexport const languageFilter = definePlugin<LanguageFilterConfig>((options) => {\n const {onSelectedIdsChange, subscribeSelectedIds} = createSelectedLanguageIdsBus()\n\n const RenderLanguageFilter: DocumentLanguageFilterComponent = () => {\n return <LanguageFilterMenuButton options={options} onSelectedIdsChange={onSelectedIdsChange} />\n }\n\n return {\n name: '@sanity/language-filter',\n document: {\n unstable_languageFilter: (prev, {schemaType, schema}) => {\n if (isLanguageFilterEnabled(schema.get(schemaType), options)) {\n return [...prev, RenderLanguageFilter]\n }\n return prev\n },\n },\n\n form: {\n components: {\n // eslint-disable-next-line func-name-matching\n input: function LanguageFilterWrapper(props) {\n const enabled = isLanguageFilterEnabled(props.schemaType, options)\n // will only be considered enabled for document, so this is only done once\n if (enabled) {\n return (\n <LanguageFilterProvider enabled={enabled} options={options}>\n {props.renderDefault(props)}\n </LanguageFilterProvider>\n )\n }\n if (props.schemaType.jsonType === 'object') {\n return (\n <LanguageFilterObjectInput\n {...(props as ObjectInputProps)}\n subscribeSelectedIds={subscribeSelectedIds}\n />\n )\n }\n\n return props.renderDefault(props)\n },\n },\n },\n }\n})\n","export type LanguageSubscription = (ids: string[]) => void\nexport type Unsubscribe = () => void\nexport type LanguageSubscribe = (subscription: LanguageSubscription) => Unsubscribe\n\nexport interface SelectedLanguageIdsBus {\n onSelectedIdsChange: (ids: string[]) => void\n subscribeSelectedIds: LanguageSubscribe\n}\n\n/**\n * We need a way to communicate state changes between the pane menu and input components.\n * LanguageFilter button lives outside the input-render tree, so Context is out.\n * This is a workaround for that.\n */\nexport function createSelectedLanguageIdsBus(): SelectedLanguageIdsBus {\n const subs: LanguageSubscription[] = []\n\n const onSelectedIdsChange = (ids: string[]) => {\n subs.forEach((s) => s(ids))\n }\n const subscribeSelectedIds = (subscription: LanguageSubscription) => {\n subs.push(subscription)\n return () => {\n subs.splice(subs.indexOf(subscription), 1)\n }\n }\n\n return {\n onSelectedIdsChange,\n subscribeSelectedIds,\n }\n}\n"],"names":["defaultFilterField","enclosingType","field","selectedLanguageIds","name","startsWith","includes","isLanguageFilterEnabled","schemaType","options","_a","_b","schemaFilter","jsonType","getRootType","isDocument","languageFilter","defaultEnabled","documentTypes","schema","type","LanguageFilterContext","createContext","LanguageFilterProvider","_ref","enabled","children","value","useMemo","jsx","Provider","storageKey","getSelectableLanguages","_ref2","supportedLanguages","defaultLanguages","filter","lang","id","useSelectedLanguageIds","useState","selectableLangs","map","l","selected","persistedValue","window","localStorage","getItem","JSON","parse","err","array2","getPersistedLanguageIds","LanguageFilterObjectInput","props","context","useContext","subscribeSelectedIds","restProps","_excluded","FilteredObjectInput","renderDefault","members","membersProp","_excluded2","selectedIds","setSelectedIds","useEffect","unsubscribe","activeLanguages","filterField","member","kind","_objectSpread","fieldSet","fieldsetMember","usePaneLanguages","onSelectedIdsChange","selectableLanguages","updateSelectedIds","useCallback","ids","languageIds","setItem","stringify","selectAll","selectNone","toggleLanguage","languageId","allSelected","length","LanguageFilterMenuButton","languageOptions","open","setOpen","button","setButton","popover","setPopover","handleToggleAll","event","currentTarget","checked","handleClick","o","handleClickOutside","useClickOutside","content","jsxs","Box","overflow","padding","Card","radius","Stack","space","paddingBottom","Text","size","weight","Fragment","title","marginTop","as","Flex","align","gap","Checkbox","onChange","flex","muted","LanguageFilterOption","onToggle","langCount","Popover","portal","ref","Button","text","justify","style","width","Math","floor","log10","mode","onClick","handleChange","definePlugin","subs","forEach","s","subscription","push","splice","indexOf","createSelectedLanguageIdsBus","RenderLanguageFilter","document","unstable_languageFilter","prev","_ref3","get","form","components","input"],"mappings":"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"}
|
|
@@ -1,31 +1,35 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import {FieldMember} from 'sanity'
|
|
2
|
+
import {FieldsetState} from 'sanity'
|
|
3
|
+
import {ObjectSchemaType} from 'sanity'
|
|
4
|
+
import {Plugin as Plugin_2} from 'sanity'
|
|
5
|
+
import type {SchemaType} from 'sanity'
|
|
6
|
+
|
|
7
|
+
export declare const defaultFilterField: FilterFieldFunction
|
|
8
|
+
|
|
9
|
+
export declare type FilterFieldFunction = (
|
|
10
|
+
enclosingType: ObjectSchemaType,
|
|
11
|
+
field: FieldMember | FieldsetState,
|
|
12
|
+
selectedLanguageIds: string[]
|
|
13
|
+
) => boolean
|
|
14
|
+
|
|
15
|
+
export declare function isLanguageFilterEnabled(
|
|
16
|
+
schemaType: SchemaType | undefined,
|
|
17
|
+
options: LanguageFilterConfig
|
|
18
|
+
): boolean
|
|
19
|
+
|
|
20
|
+
export declare interface Language {
|
|
21
|
+
id: string
|
|
22
|
+
title: string
|
|
18
23
|
}
|
|
19
|
-
|
|
20
|
-
export function isLanguageFilterEnabled(schemaType: SchemaType | undefined, options: LanguageFilterConfig): boolean;
|
|
24
|
+
|
|
21
25
|
/**
|
|
22
26
|
* ## Usage in sanity.config.ts (or .js)
|
|
23
27
|
*
|
|
24
28
|
* ```
|
|
25
|
-
* import {
|
|
29
|
+
* import {defineConfig} from 'sanity'
|
|
26
30
|
* import {languageFilter} from '@sanity/language-filter'
|
|
27
31
|
*
|
|
28
|
-
* export const
|
|
32
|
+
* export const defineConfig({
|
|
29
33
|
* /...
|
|
30
34
|
* plugins: [
|
|
31
35
|
* languageFilter({
|
|
@@ -51,6 +55,21 @@ export function isLanguageFilterEnabled(schemaType: SchemaType | undefined, opti
|
|
|
51
55
|
* })
|
|
52
56
|
* ```
|
|
53
57
|
*/
|
|
54
|
-
export const languageFilter:
|
|
58
|
+
export declare const languageFilter: Plugin_2<LanguageFilterConfig>
|
|
59
|
+
|
|
60
|
+
export declare interface LanguageFilterConfig {
|
|
61
|
+
supportedLanguages: Language[]
|
|
62
|
+
defaultLanguages?: string[]
|
|
63
|
+
documentTypes?: string[]
|
|
64
|
+
filterField?: FilterFieldFunction
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export declare interface LanguageFilterOptions {
|
|
68
|
+
languageFilter?: boolean
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export declare interface LanguageFilterSchema extends ObjectSchemaType {
|
|
72
|
+
options?: LanguageFilterOptions
|
|
73
|
+
}
|
|
55
74
|
|
|
56
|
-
|
|
75
|
+
export {}
|
package/package.json
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/language-filter",
|
|
3
|
-
"version": "3.0.0-v3-studio.
|
|
3
|
+
"version": "3.0.0-v3-studio.7",
|
|
4
4
|
"description": "A Sanity plugin that supports filtering localized fields by language",
|
|
5
5
|
"author": "Sanity.io <hello@sanity.io>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"source": "./src/index.ts",
|
|
8
|
-
"main": "./lib/
|
|
9
|
-
"module": "./lib/
|
|
10
|
-
"types": "./lib/
|
|
8
|
+
"main": "./lib/index.js",
|
|
9
|
+
"module": "./lib/index.esm.js",
|
|
10
|
+
"types": "./lib/src/index.d.ts",
|
|
11
11
|
"exports": {
|
|
12
12
|
".": {
|
|
13
|
-
"
|
|
14
|
-
"
|
|
13
|
+
"types": "./lib/src/index.d.ts",
|
|
14
|
+
"source": "./src/index.ts",
|
|
15
|
+
"import": "./lib/index.esm.js",
|
|
16
|
+
"require": "./lib/index.js",
|
|
17
|
+
"default": "./lib/index.esm.js"
|
|
15
18
|
}
|
|
16
19
|
},
|
|
17
20
|
"files": [
|
|
@@ -23,9 +26,9 @@
|
|
|
23
26
|
"scripts": {
|
|
24
27
|
"clean": "rimraf lib",
|
|
25
28
|
"lint": "eslint .",
|
|
26
|
-
"prebuild": "npm run clean && plugin-kit verify-package --silent",
|
|
27
|
-
"build": "
|
|
28
|
-
"watch": "
|
|
29
|
+
"prebuild": "npm run clean && plugin-kit verify-package --silent && pkg-utils",
|
|
30
|
+
"build": "pkg-utils build",
|
|
31
|
+
"watch": "pkg-utils watch",
|
|
29
32
|
"test": "jest",
|
|
30
33
|
"link-watch": "plugin-kit link-watch",
|
|
31
34
|
"prepublishOnly": "npm run build",
|
|
@@ -33,7 +36,7 @@
|
|
|
33
36
|
},
|
|
34
37
|
"repository": {
|
|
35
38
|
"type": "git",
|
|
36
|
-
"url": "git
|
|
39
|
+
"url": "git@github.com:sanity-io/language-filter.git"
|
|
37
40
|
},
|
|
38
41
|
"engines": {
|
|
39
42
|
"node": ">=14.0.0"
|
|
@@ -41,41 +44,39 @@
|
|
|
41
44
|
"dependencies": {
|
|
42
45
|
"@sanity/icons": "^1.3.4",
|
|
43
46
|
"@sanity/incompatible-plugin": "^1.0.4",
|
|
44
|
-
"@sanity/ui": "^0.
|
|
45
|
-
"@sanity/util": "3.0.0-dev-preview.
|
|
47
|
+
"@sanity/ui": "^1.0.0-beta.31",
|
|
48
|
+
"@sanity/util": "3.0.0-dev-preview.22"
|
|
46
49
|
},
|
|
47
50
|
"devDependencies": {
|
|
48
51
|
"@babel/preset-env": "^7.18.10",
|
|
49
52
|
"@babel/preset-react": "^7.18.6",
|
|
50
|
-
"@commitlint/cli": "^17.
|
|
51
|
-
"@commitlint/config-conventional": "^17.
|
|
52
|
-
"@
|
|
53
|
-
"@
|
|
54
|
-
"@sanity/
|
|
55
|
-
"@sanity/semantic-release-preset": "^2.0.1",
|
|
53
|
+
"@commitlint/cli": "^17.2.0",
|
|
54
|
+
"@commitlint/config-conventional": "^17.2.0",
|
|
55
|
+
"@sanity/pkg-utils": "^1.16.2",
|
|
56
|
+
"@sanity/plugin-kit": "^2.0.7",
|
|
57
|
+
"@sanity/semantic-release-preset": "^2.0.2",
|
|
56
58
|
"@types/jest": "^28.1.8",
|
|
57
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
58
|
-
"@typescript-eslint/parser": "^5.
|
|
59
|
-
"eslint": "8.
|
|
59
|
+
"@typescript-eslint/eslint-plugin": "^5.42.0",
|
|
60
|
+
"@typescript-eslint/parser": "^5.42.0",
|
|
61
|
+
"eslint": "^8.26.0",
|
|
60
62
|
"eslint-config-prettier": "^8.5.0",
|
|
61
63
|
"eslint-config-sanity": "^6.0.0",
|
|
62
64
|
"eslint-plugin-prettier": "^4.2.1",
|
|
63
|
-
"eslint-plugin-react": "^7.31.
|
|
65
|
+
"eslint-plugin-react": "^7.31.10",
|
|
64
66
|
"eslint-plugin-react-hooks": "^4.6.0",
|
|
65
67
|
"husky": "^8.0.1",
|
|
66
68
|
"jest": "^28.1.3",
|
|
67
69
|
"lint-staged": "^13.0.3",
|
|
68
|
-
"parcel": "^2.7.0",
|
|
69
70
|
"prettier": "^2.7.1",
|
|
70
71
|
"react": "^18.0.0",
|
|
71
72
|
"rimraf": "^3.0.2",
|
|
72
|
-
"sanity": "3.0.0-
|
|
73
|
+
"sanity": "dev-preview || 3.0.0-rc.0",
|
|
73
74
|
"ts-jest": "^28.0.8",
|
|
74
|
-
"typescript": "4.
|
|
75
|
+
"typescript": "^4.8.4"
|
|
75
76
|
},
|
|
76
77
|
"peerDependencies": {
|
|
77
78
|
"react": "^18.0.0",
|
|
78
|
-
"sanity": "dev-preview"
|
|
79
|
+
"sanity": "dev-preview || 3.0.0-rc.0"
|
|
79
80
|
},
|
|
80
81
|
"bugs": {
|
|
81
82
|
"url": "https://github.com/sanity-io/language-filter/issues"
|
package/src/filterField.test.ts
CHANGED
|
@@ -7,10 +7,14 @@ describe('filterField', () => {
|
|
|
7
7
|
name: 'some-doc',
|
|
8
8
|
jsonType: 'object',
|
|
9
9
|
fields: [],
|
|
10
|
+
// eslint-disable-next-line camelcase
|
|
11
|
+
__experimental_search: [],
|
|
10
12
|
type: {
|
|
11
13
|
name: 'document',
|
|
12
14
|
jsonType: 'object',
|
|
13
15
|
fields: [],
|
|
16
|
+
// eslint-disable-next-line camelcase
|
|
17
|
+
__experimental_search: [],
|
|
14
18
|
},
|
|
15
19
|
}
|
|
16
20
|
it('should be enabled when documentTypes is missing', () => {
|
|
@@ -48,6 +52,8 @@ describe('filterField', () => {
|
|
|
48
52
|
name: 'locale_parent',
|
|
49
53
|
jsonType: 'object',
|
|
50
54
|
fields: [],
|
|
55
|
+
// eslint-disable-next-line camelcase
|
|
56
|
+
__experimental_search: [],
|
|
51
57
|
}
|
|
52
58
|
const member: FieldMember = {
|
|
53
59
|
name: 'nb',
|
package/src/plugin.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
|
-
import {
|
|
2
|
+
import {definePlugin, DocumentLanguageFilterComponent, ObjectInputProps} from 'sanity'
|
|
3
3
|
import {LanguageFilterObjectInput} from './LanguageFilterObjectInput'
|
|
4
4
|
import {LanguageFilterMenuButton} from './LanguageFilterMenuButton'
|
|
5
5
|
import {LanguageFilterConfig} from './types'
|
|
@@ -11,10 +11,10 @@ import {createSelectedLanguageIdsBus} from './languageSubscription'
|
|
|
11
11
|
* ## Usage in sanity.config.ts (or .js)
|
|
12
12
|
*
|
|
13
13
|
* ```
|
|
14
|
-
* import {
|
|
14
|
+
* import {defineConfig} from 'sanity'
|
|
15
15
|
* import {languageFilter} from '@sanity/language-filter'
|
|
16
16
|
*
|
|
17
|
-
* export const
|
|
17
|
+
* export const defineConfig({
|
|
18
18
|
* /...
|
|
19
19
|
* plugins: [
|
|
20
20
|
* languageFilter({
|
|
@@ -40,7 +40,7 @@ import {createSelectedLanguageIdsBus} from './languageSubscription'
|
|
|
40
40
|
* })
|
|
41
41
|
* ```
|
|
42
42
|
*/
|
|
43
|
-
export const languageFilter =
|
|
43
|
+
export const languageFilter = definePlugin<LanguageFilterConfig>((options) => {
|
|
44
44
|
const {onSelectedIdsChange, subscribeSelectedIds} = createSelectedLanguageIdsBus()
|
|
45
45
|
|
|
46
46
|
const RenderLanguageFilter: DocumentLanguageFilterComponent = () => {
|