@sanity/language-filter 2.35.0 → 2.36.0
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/LICENSE +1 -1
- package/README.md +12 -3
- package/{dist/dts → dts}/SelectLanguage.d.ts +0 -1
- package/{dist/dts → dts}/SelectLanguageProvider.d.ts +0 -1
- package/{dist/dts → dts}/datastore.d.ts +1 -2
- package/lib/SelectLanguage.js +5 -4
- package/lib/SelectLanguage.js.map +1 -0
- package/lib/SelectLanguageProvider.js +2 -2
- package/lib/SelectLanguageProvider.js.map +1 -0
- package/lib/datastore.js +5 -5
- package/lib/datastore.js.map +1 -0
- package/lib/filter-fields.js +2 -1
- package/lib/filter-fields.js.map +1 -0
- package/package.json +53 -18
- package/src/SelectLanguage.tsx +4 -4
- package/src/SelectLanguageProvider.tsx +0 -1
- package/dist/dts/SelectLanguage.d.ts.map +0 -1
- package/dist/dts/SelectLanguageProvider.d.ts.map +0 -1
- package/dist/dts/datastore.d.ts.map +0 -1
- package/tsconfig.json +0 -13
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Field-level translation filter Plugin for Sanity.io
|
|
2
2
|
|
|
3
|
+
> This is a **Sanity Studio v2** plugin.
|
|
4
|
+
> For the v3 version, please refer to the [v3-branch](https://github.com/sanity-io/language-filter).
|
|
5
|
+
|
|
6
|
+
|
|
3
7
|
A Sanity plugin that supports filtering localized fields by language
|
|
4
8
|
|
|
5
9
|

|
|
@@ -28,11 +32,16 @@ For **document-level translations** you should use the [@sanity/document-interna
|
|
|
28
32
|
|
|
29
33
|
## Installation
|
|
30
34
|
|
|
31
|
-
```
|
|
32
|
-
|
|
35
|
+
```sh
|
|
36
|
+
yarn add @sanity/language-filter@studio-v2
|
|
33
37
|
```
|
|
34
38
|
|
|
35
|
-
|
|
39
|
+
Next, add `"@sanity/language-filter"` to `sanity.json` plugins array:
|
|
40
|
+
```json
|
|
41
|
+
"plugins": [
|
|
42
|
+
"@sanity/language-filter"
|
|
43
|
+
]
|
|
44
|
+
```
|
|
36
45
|
|
|
37
46
|
### Add config file
|
|
38
47
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
2
|
import { ObjectField, SchemaType } from '@sanity/types';
|
|
3
|
-
export
|
|
3
|
+
export type SelectedLanguages = string[];
|
|
4
4
|
export declare const setLangs: (languages: SelectedLanguages) => void;
|
|
5
5
|
export declare const selectedLanguages$: Observable<string[]>;
|
|
6
6
|
export declare const filterFn$: Observable<(enclosingType: SchemaType, field: ObjectField) => boolean>;
|
|
7
|
-
//# sourceMappingURL=datastore.d.ts.map
|
package/lib/SelectLanguage.js
CHANGED
|
@@ -42,6 +42,9 @@ var SelectLanguage = _ref => {
|
|
|
42
42
|
isOpen = _useState2[0],
|
|
43
43
|
setIsOpen = _useState2[1];
|
|
44
44
|
var allIsSelected = languages.length === selected.length;
|
|
45
|
+
var handleClose = () => {
|
|
46
|
+
setIsOpen(false);
|
|
47
|
+
};
|
|
45
48
|
var handleKeyUp = (0, _react.useCallback)(e => {
|
|
46
49
|
if (e.key === 'Escape') {
|
|
47
50
|
handleClose();
|
|
@@ -50,9 +53,6 @@ var SelectLanguage = _ref => {
|
|
|
50
53
|
var handleOpen = () => {
|
|
51
54
|
setIsOpen(prev => !prev);
|
|
52
55
|
};
|
|
53
|
-
var handleClose = () => {
|
|
54
|
-
setIsOpen(false);
|
|
55
|
-
};
|
|
56
56
|
var selectLang = langId => {
|
|
57
57
|
onChange(selected.concat(langId));
|
|
58
58
|
};
|
|
@@ -155,4 +155,5 @@ var SelectLanguage = _ref => {
|
|
|
155
155
|
}));
|
|
156
156
|
};
|
|
157
157
|
var _default = SelectLanguage;
|
|
158
|
-
exports.default = _default;
|
|
158
|
+
exports.default = _default;
|
|
159
|
+
//# sourceMappingURL=SelectLanguage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectLanguage.js","names":["ACTION_LABEL","STYLES_TOGGLE","flex","STYLES_CHECKBOX","display","SelectLanguage","currentDocumentType","selected","languages","defaultLanguages","documentTypes","onChange","React","useState","triggerRef","setTriggerRef","popoverRef","setPopoverRef","isOpen","setIsOpen","allIsSelected","length","handleClose","handleKeyUp","useCallback","e","key","handleOpen","prev","selectLang","langId","concat","unselectLang","filter","id","isDefaultLang","includes","isValidDocumentType","handleSelectAll","map","language","handleSelectNone","handleLangCheckboxChange","event","currentTarget","getAttribute","checked","useClickOutside","content","lang","label","title","languageId","ChevronDownIcon"],"sources":["../src/SelectLanguage.tsx"],"sourcesContent":["import React, {useState, useCallback} from 'react'\nimport {Button, Checkbox, Flex, Box, Text, Stack, Popover, useClickOutside} from '@sanity/ui'\nimport {ChevronDownIcon} from '@sanity/icons'\n\nconst ACTION_LABEL = 'Filter languages'\ninterface LanguageOption {\n title: string\n id: string\n}\n\ninterface Props {\n languages: LanguageOption[]\n currentDocumentType?: string\n defaultLanguages?: string[]\n documentTypes?: string[]\n selected: string[]\n onChange: (ids: string[]) => void\n}\n\nconst STYLES_TOGGLE = {flex: 1}\nconst STYLES_CHECKBOX = {display: 'block'}\n\nconst SelectLanguage = ({\n currentDocumentType,\n selected,\n languages,\n defaultLanguages,\n documentTypes,\n onChange,\n}: Props) => {\n const [triggerRef, setTriggerRef] = React.useState<HTMLButtonElement | null>(null)\n const [popoverRef, setPopoverRef] = React.useState<HTMLElement | null>(null)\n const [isOpen, setIsOpen] = useState(false)\n const allIsSelected = languages.length === selected.length\n\n const handleClose = () => {\n setIsOpen(false)\n }\n\n const handleKeyUp = useCallback((e) => {\n if (e.key === 'Escape') {\n handleClose()\n }\n }, [])\n\n const handleOpen = () => {\n setIsOpen((prev) => !prev)\n }\n\n const selectLang = (langId: string) => {\n onChange(selected.concat(langId))\n }\n\n const unselectLang = (langId: string) => {\n onChange(selected.filter((id) => id !== langId))\n }\n\n const isDefaultLang = (langId: string) => {\n return defaultLanguages && defaultLanguages.includes(langId)\n }\n\n const isValidDocumentType = () => {\n return documentTypes && currentDocumentType ? documentTypes.includes(currentDocumentType) : true\n }\n\n const handleSelectAll = () => {\n onChange(languages.map((language) => language.id))\n }\n const handleSelectNone = () => {\n onChange([])\n }\n\n const handleLangCheckboxChange = (event: React.FormEvent<HTMLInputElement>) => {\n const id = event.currentTarget.getAttribute('data-lang-id')\n const checked = event.currentTarget.checked\n\n if (!id) {\n return\n }\n\n if (checked) {\n selectLang(id)\n } else {\n unselectLang(id)\n }\n }\n\n useClickOutside(() => {\n handleClose()\n }, [popoverRef, triggerRef])\n\n if (!isValidDocumentType()) {\n return <></>\n }\n\n const content = (\n <Box overflow=\"auto\" sizing=\"border\" onKeyUp={handleKeyUp}>\n <Flex padding={2}>\n <Button\n type=\"button\"\n mode=\"ghost\"\n tone=\"default\"\n onClick={allIsSelected ? handleSelectNone : handleSelectAll}\n paddingX={3}\n paddingY={2}\n autoFocus\n style={STYLES_TOGGLE}\n >\n Select {allIsSelected ? 'none' : 'all'}\n </Button>\n </Flex>\n <Box padding={3} paddingX={2}>\n <Stack as=\"ul\" space={3}>\n {languages.map((lang) => {\n const label = lang.title + (isDefaultLang(lang.id) ? ' (Default)' : '')\n const languageId = `language-${lang.id}`\n return (\n <Flex as=\"li\" align=\"center\" key={lang.id}>\n <Checkbox\n id={languageId}\n style={STYLES_CHECKBOX}\n onChange={handleLangCheckboxChange}\n data-lang-id={lang.id}\n checked={selected.includes(lang.id)}\n disabled={isDefaultLang(lang.id)}\n />\n <Box flex={1} paddingLeft={3}>\n <Text>\n <label htmlFor={languageId} style={STYLES_CHECKBOX}>\n {label}\n </label>\n </Text>\n </Box>\n </Flex>\n )\n })}\n </Stack>\n </Box>\n </Box>\n )\n\n return (\n <>\n <Button\n fontSize={1}\n iconRight={ChevronDownIcon}\n mode=\"bleed\"\n ref={setTriggerRef}\n onClick={handleOpen}\n padding={2}\n title={\n allIsSelected\n ? 'Filter language fields'\n : 'Displaying fields only for the selected languages'\n }\n selected={isOpen}\n text={\n <>\n {ACTION_LABEL} ({`${selected.length}/${languages.length}`})\n </>\n }\n />\n <Popover\n content={content}\n open={isOpen}\n placement=\"bottom\"\n ref={setPopoverRef}\n referenceElement={triggerRef}\n tone=\"default\"\n constrainSize\n autoFocus\n portal\n />\n </>\n )\n}\n\nexport default SelectLanguage\n"],"mappings":"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"}
|
|
@@ -66,7 +66,6 @@ var SelectLanguageProvider = _ref => {
|
|
|
66
66
|
if (FallbackImplementation) {
|
|
67
67
|
// This is happening only inside the mono repo because Lerna is hoisting it incorrectly.
|
|
68
68
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
69
|
-
// @ts-expect-error
|
|
70
69
|
return /*#__PURE__*/_react.default.createElement(FallbackImplementation, {
|
|
71
70
|
schemaType: schemaType
|
|
72
71
|
});
|
|
@@ -74,4 +73,5 @@ var SelectLanguageProvider = _ref => {
|
|
|
74
73
|
return null;
|
|
75
74
|
};
|
|
76
75
|
var _default = SelectLanguageProvider;
|
|
77
|
-
exports.default = _default;
|
|
76
|
+
exports.default = _default;
|
|
77
|
+
//# sourceMappingURL=SelectLanguageProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectLanguageProvider.js","names":["SelectLanguageProvider","schemaType","subscriptionRef$","useRef","useState","selected","setSelected","currentDocumentType","setCurrentDocumentType","shouldShow","useMemo","documentTypes","config","name","includes","FallbackImplementation","languageFilterImplementations","Array","isArray","filter","component","useEffect","current","selectedLanguages$","subscribe","selectedLangs","unsubscribe","supportedLanguages","defaultLanguages","setLangs"],"sources":["../src/SelectLanguageProvider.tsx"],"sourcesContent":["// @todo: remove the following line when part imports has been removed from this file\n///<reference types=\"@sanity/types/parts\" />\n\nimport React, {useRef, useEffect, useState, useMemo} from 'react'\nimport config from 'part:@sanity/language-filter/config'\nimport {SchemaType} from '@sanity/types'\nimport {Subscription} from 'rxjs'\nimport languageFilterImplementations from 'all:part:@sanity/desk-tool/language-select-component'\nimport {selectedLanguages$, setLangs} from './datastore'\nimport SelectLanguage from './SelectLanguage'\n\ninterface Props {\n schemaType?: SchemaType\n}\n\nconst SelectLanguageProvider = ({schemaType}: Props) => {\n const subscriptionRef$ = useRef<Subscription | null>(null)\n const [selected, setSelected] = useState<string[]>([])\n const [currentDocumentType, setCurrentDocumentType] = useState<string | undefined>()\n const shouldShow = useMemo(() => {\n const {documentTypes} = config\n return !!(documentTypes && schemaType?.name && documentTypes.includes(schemaType.name))\n }, [schemaType])\n const FallbackImplementation = useMemo(() => {\n if (languageFilterImplementations && Array.isArray(languageFilterImplementations)) {\n return (\n languageFilterImplementations?.filter(\n (component) => SelectLanguageProvider !== component\n )?.[0] ?? null\n )\n }\n return null\n }, [])\n\n useEffect(() => {\n setCurrentDocumentType(schemaType?.name)\n }, [schemaType])\n\n useEffect(() => {\n subscriptionRef$.current = selectedLanguages$.subscribe((selectedLangs: string[]) => {\n setSelected(selectedLangs)\n })\n return () => {\n if (subscriptionRef$.current) {\n subscriptionRef$.current.unsubscribe()\n }\n }\n }, [])\n\n if (shouldShow) {\n return (\n <SelectLanguage\n languages={config.supportedLanguages}\n defaultLanguages={config.defaultLanguages}\n documentTypes={config.documentTypes}\n currentDocumentType={currentDocumentType}\n selected={selected}\n onChange={setLangs}\n />\n )\n }\n\n if (FallbackImplementation) {\n // This is happening only inside the mono repo because Lerna is hoisting it incorrectly.\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n return <FallbackImplementation schemaType={schemaType} />\n }\n\n return null\n}\n\nexport default SelectLanguageProvider\n"],"mappings":";;;;;;AAGA;AACA;AAGA;AACA;AACA;AAA6C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAM7C,IAAMA,sBAAsB,GAAG,QAAyB;EAAA,IAAvBC,UAAU,QAAVA,UAAU;EACzC,IAAMC,gBAAgB,GAAG,IAAAC,aAAM,EAAsB,IAAI,CAAC;EAC1D,gBAAgC,IAAAC,eAAQ,EAAW,EAAE,CAAC;IAAA;IAA/CC,QAAQ;IAAEC,WAAW;EAC5B,iBAAsD,IAAAF,eAAQ,GAAsB;IAAA;IAA7EG,mBAAmB;IAAEC,sBAAsB;EAClD,IAAMC,UAAU,GAAG,IAAAC,cAAO,EAAC,MAAM;IAC/B,IAAOC,aAAa,GAAIC,eAAM,CAAvBD,aAAa;IACpB,OAAO,CAAC,EAAEA,aAAa,IAAIV,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAEY,IAAI,IAAIF,aAAa,CAACG,QAAQ,CAACb,UAAU,CAACY,IAAI,CAAC,CAAC;EACzF,CAAC,EAAE,CAACZ,UAAU,CAAC,CAAC;EAChB,IAAMc,sBAAsB,GAAG,IAAAL,cAAO,EAAC,MAAM;IAC3C,IAAIM,gCAA6B,IAAIC,KAAK,CAACC,OAAO,CAACF,gCAA6B,CAAC,EAAE;MAAA;MACjF,gCACEA,gCAA6B,aAA7BA,gCAA6B,iDAA7BA,gCAA6B,CAAEG,MAAM,CAClCC,SAAS,IAAKpB,sBAAsB,KAAKoB,SAAS,CACpD,2DAFD,uBAEI,CAAC,CAAC,yEAAI,IAAI;IAElB;IACA,OAAO,IAAI;EACb,CAAC,EAAE,EAAE,CAAC;EAEN,IAAAC,gBAAS,EAAC,MAAM;IACdb,sBAAsB,CAACP,UAAU,aAAVA,UAAU,uBAAVA,UAAU,CAAEY,IAAI,CAAC;EAC1C,CAAC,EAAE,CAACZ,UAAU,CAAC,CAAC;EAEhB,IAAAoB,gBAAS,EAAC,MAAM;IACdnB,gBAAgB,CAACoB,OAAO,GAAGC,6BAAkB,CAACC,SAAS,CAAEC,aAAuB,IAAK;MACnFnB,WAAW,CAACmB,aAAa,CAAC;IAC5B,CAAC,CAAC;IACF,OAAO,MAAM;MACX,IAAIvB,gBAAgB,CAACoB,OAAO,EAAE;QAC5BpB,gBAAgB,CAACoB,OAAO,CAACI,WAAW,EAAE;MACxC;IACF,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,IAAIjB,UAAU,EAAE;IACd,oBACE,6BAAC,uBAAc;MACb,SAAS,EAAEG,eAAM,CAACe,kBAAmB;MACrC,gBAAgB,EAAEf,eAAM,CAACgB,gBAAiB;MAC1C,aAAa,EAAEhB,eAAM,CAACD,aAAc;MACpC,mBAAmB,EAAEJ,mBAAoB;MACzC,QAAQ,EAAEF,QAAS;MACnB,QAAQ,EAAEwB;IAAS,EACnB;EAEN;EAEA,IAAId,sBAAsB,EAAE;IAC1B;IACA;IACA,oBAAO,6BAAC,sBAAsB;MAAC,UAAU,EAAEd;IAAW,EAAG;EAC3D;EAEA,OAAO,IAAI;AACb,CAAC;AAAA,eAEcD,sBAAsB;AAAA"}
|
package/lib/datastore.js
CHANGED
|
@@ -4,11 +4,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.setLangs = exports.selectedLanguages$ = exports.filterFn$ = void 0;
|
|
7
|
-
var _union2 = _interopRequireDefault(require("lodash/union"));
|
|
8
|
-
var _intersection2 = _interopRequireDefault(require("lodash/intersection"));
|
|
9
7
|
var _rxjs = require("rxjs");
|
|
10
8
|
var _operators = require("rxjs/operators");
|
|
11
9
|
var _config = _interopRequireDefault(require("part:@sanity/language-filter/config"));
|
|
10
|
+
var _lodash = require("lodash");
|
|
12
11
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
12
|
// @todo: remove the following line when part imports has been removed from this file
|
|
14
13
|
///<reference types="@sanity/types/parts" />
|
|
@@ -33,9 +32,9 @@ var persistOn = (key, defaultValue) => input$ => {
|
|
|
33
32
|
var SUPPORTED_LANG_IDS = _config.default.supportedLanguages.map(lang => lang.id);
|
|
34
33
|
var selectedLanguages$ = onSelect$.pipe(persistOn('@sanity/plugin/language-filter/selected-languages', _config.default.defaultLanguages || SUPPORTED_LANG_IDS),
|
|
35
34
|
// constrain persisted/selected languages to the ones currently supported
|
|
36
|
-
(0, _operators.map)(selectedLangs => (0,
|
|
35
|
+
(0, _operators.map)(selectedLangs => (0, _lodash.intersection)(selectedLangs, SUPPORTED_LANG_IDS)),
|
|
37
36
|
// make sure default languages always gets selected
|
|
38
|
-
Array.isArray(_config.default.defaultLanguages) ? (0, _operators.map)(selectedLangs => (0,
|
|
37
|
+
Array.isArray(_config.default.defaultLanguages) ? (0, _operators.map)(selectedLangs => (0, _lodash.union)(selectedLangs, _config.default.defaultLanguages || [])) : id, (0, _operators.publishReplay)(1), (0, _operators.refCount)());
|
|
39
38
|
exports.selectedLanguages$ = selectedLanguages$;
|
|
40
39
|
var defaultFilterField = (enclosingType, field, selectedLanguages) => !enclosingType.name.startsWith('locale') || selectedLanguages.includes(field.name);
|
|
41
40
|
var filterField = _config.default.filterField || defaultFilterField;
|
|
@@ -44,4 +43,5 @@ var filterFn$ = selectedLanguages$.pipe((0, _operators.map)(langs => {
|
|
|
44
43
|
return filterField(enclosingType, field, langs);
|
|
45
44
|
};
|
|
46
45
|
}));
|
|
47
|
-
exports.filterFn$ = filterFn$;
|
|
46
|
+
exports.filterFn$ = filterFn$;
|
|
47
|
+
//# sourceMappingURL=datastore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datastore.js","names":["onSelect$","Subject","id","v","setLangs","languages","next","persistOn","key","defaultValue","input$","persisted","persistedValue","window","localStorage","getItem","JSON","parse","err","pipe","startWith","tap","value","setItem","stringify","SUPPORTED_LANG_IDS","config","supportedLanguages","map","lang","selectedLanguages$","defaultLanguages","selectedLangs","intersection","Array","isArray","union","publishReplay","refCount","defaultFilterField","enclosingType","field","selectedLanguages","name","startsWith","includes","filterField","filterFn$","langs"],"sources":["../src/datastore.ts"],"sourcesContent":["// @todo: remove the following line when part imports has been removed from this file\n///<reference types=\"@sanity/types/parts\" />\n\nimport {Observable, Subject} from 'rxjs'\nimport {map, publishReplay, refCount, startWith, tap} from 'rxjs/operators'\nimport config from 'part:@sanity/language-filter/config'\nimport {intersection, union} from 'lodash'\nimport {ObjectField, SchemaType} from '@sanity/types'\n\nexport type SelectedLanguages = string[]\ninterface SupportedLanguage {\n id: string\n title: string\n}\n\nconst onSelect$ = new Subject<SelectedLanguages>()\n\nconst id = (v: any) => v\n\nexport const setLangs = (languages: SelectedLanguages) => onSelect$.next(languages)\n\nconst persistOn = (key: string, defaultValue: string[]) => (input$: Observable<string[]>) => {\n let persisted\n try {\n const persistedValue = window.localStorage.getItem(key)\n if (persistedValue) {\n persisted = JSON.parse(persistedValue)\n }\n } catch (err) {} // eslint-disable-line no-empty\n\n return input$.pipe(\n startWith(persisted || defaultValue),\n tap((value) => {\n window.localStorage.setItem(key, JSON.stringify(value))\n })\n )\n}\n\nconst SUPPORTED_LANG_IDS = config.supportedLanguages.map((lang: SupportedLanguage) => lang.id)\n\nexport const selectedLanguages$ = onSelect$.pipe(\n persistOn(\n '@sanity/plugin/language-filter/selected-languages',\n config.defaultLanguages || SUPPORTED_LANG_IDS\n ),\n // constrain persisted/selected languages to the ones currently supported\n map((selectedLangs: SelectedLanguages) => intersection(selectedLangs, SUPPORTED_LANG_IDS)),\n // make sure default languages always gets selected\n Array.isArray(config.defaultLanguages)\n ? map((selectedLangs) => union(selectedLangs, config.defaultLanguages || []))\n : id,\n publishReplay(1),\n refCount()\n)\n\nconst defaultFilterField = (\n enclosingType: SchemaType,\n field: ObjectField,\n selectedLanguages: string[]\n) => !enclosingType.name.startsWith('locale') || selectedLanguages.includes(field.name)\n\nconst filterField = config.filterField || defaultFilterField\n\nexport const filterFn$ = selectedLanguages$.pipe(\n map((langs) => {\n return (enclosingType: SchemaType, field: ObjectField) => {\n return filterField(enclosingType, field, langs)\n }\n })\n)\n"],"mappings":";;;;;;AAGA;AACA;AACA;AACA;AAA0C;AAN1C;AACA;;AAcA,IAAMA,SAAS,GAAG,IAAIC,aAAO,EAAqB;AAElD,IAAMC,EAAE,GAAIC,CAAM,IAAKA,CAAC;AAEjB,IAAMC,QAAQ,GAAIC,SAA4B,IAAKL,SAAS,CAACM,IAAI,CAACD,SAAS,CAAC;AAAA;AAEnF,IAAME,SAAS,GAAG,CAACC,GAAW,EAAEC,YAAsB,KAAMC,MAA4B,IAAK;EAC3F,IAAIC,SAAS;EACb,IAAI;IACF,IAAMC,cAAc,GAAGC,MAAM,CAACC,YAAY,CAACC,OAAO,CAACP,GAAG,CAAC;IACvD,IAAII,cAAc,EAAE;MAClBD,SAAS,GAAGK,IAAI,CAACC,KAAK,CAACL,cAAc,CAAC;IACxC;EACF,CAAC,CAAC,OAAOM,GAAG,EAAE,CAAC,CAAC,CAAC;;EAEjB,OAAOR,MAAM,CAACS,IAAI,CAChB,IAAAC,oBAAS,EAACT,SAAS,IAAIF,YAAY,CAAC,EACpC,IAAAY,cAAG,EAAEC,KAAK,IAAK;IACbT,MAAM,CAACC,YAAY,CAACS,OAAO,CAACf,GAAG,EAAEQ,IAAI,CAACQ,SAAS,CAACF,KAAK,CAAC,CAAC;EACzD,CAAC,CAAC,CACH;AACH,CAAC;AAED,IAAMG,kBAAkB,GAAGC,eAAM,CAACC,kBAAkB,CAACC,GAAG,CAAEC,IAAuB,IAAKA,IAAI,CAAC3B,EAAE,CAAC;AAEvF,IAAM4B,kBAAkB,GAAG9B,SAAS,CAACmB,IAAI,CAC9CZ,SAAS,CACP,mDAAmD,EACnDmB,eAAM,CAACK,gBAAgB,IAAIN,kBAAkB,CAC9C;AACD;AACA,IAAAG,cAAG,EAAEI,aAAgC,IAAK,IAAAC,oBAAY,EAACD,aAAa,EAAEP,kBAAkB,CAAC,CAAC;AAC1F;AACAS,KAAK,CAACC,OAAO,CAACT,eAAM,CAACK,gBAAgB,CAAC,GAClC,IAAAH,cAAG,EAAEI,aAAa,IAAK,IAAAI,aAAK,EAACJ,aAAa,EAAEN,eAAM,CAACK,gBAAgB,IAAI,EAAE,CAAC,CAAC,GAC3E7B,EAAE,EACN,IAAAmC,wBAAa,EAAC,CAAC,CAAC,EAChB,IAAAC,mBAAQ,GAAE,CACX;AAAA;AAED,IAAMC,kBAAkB,GAAG,CACzBC,aAAyB,EACzBC,KAAkB,EAClBC,iBAA2B,KACxB,CAACF,aAAa,CAACG,IAAI,CAACC,UAAU,CAAC,QAAQ,CAAC,IAAIF,iBAAiB,CAACG,QAAQ,CAACJ,KAAK,CAACE,IAAI,CAAC;AAEvF,IAAMG,WAAW,GAAGpB,eAAM,CAACoB,WAAW,IAAIP,kBAAkB;AAErD,IAAMQ,SAAS,GAAGjB,kBAAkB,CAACX,IAAI,CAC9C,IAAAS,cAAG,EAAEoB,KAAK,IAAK;EACb,OAAO,CAACR,aAAyB,EAAEC,KAAkB,KAAK;IACxD,OAAOK,WAAW,CAACN,aAAa,EAAEC,KAAK,EAAEO,KAAK,CAAC;EACjD,CAAC;AACH,CAAC,CAAC,CACH;AAAA"}
|
package/lib/filter-fields.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-fields.js","names":[],"sources":["../src/filter-fields.js"],"sourcesContent":["export {filterFn$ as default} from './datastore'\n"],"mappings":";;;;;;;;;;;AAAA"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/language-filter",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.36.0",
|
|
4
4
|
"description": "A Sanity plugin that supports filtering localized fields by language",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"clean": "rimraf lib dest"
|
|
8
|
-
},
|
|
9
5
|
"keywords": [
|
|
10
6
|
"sanity",
|
|
11
7
|
"cms",
|
|
@@ -14,6 +10,34 @@
|
|
|
14
10
|
"content",
|
|
15
11
|
"language-filter"
|
|
16
12
|
],
|
|
13
|
+
"homepage": "https://www.sanity.io/",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/sanity-io/language-filter/issues"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git@github.com:sanity-io/language-filter.git"
|
|
20
|
+
},
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"author": "Sanity.io <hello@sanity.io>",
|
|
23
|
+
"main": "./lib/filter-fields.js",
|
|
24
|
+
"types": "./dts/SelectLanguage.d.ts",
|
|
25
|
+
"files": [
|
|
26
|
+
"lib",
|
|
27
|
+
"dts",
|
|
28
|
+
"src",
|
|
29
|
+
"sanity.json",
|
|
30
|
+
"config.dist.json"
|
|
31
|
+
],
|
|
32
|
+
"scripts": {
|
|
33
|
+
"prebuild": "npm run clean",
|
|
34
|
+
"build": "tsc --declaration --emitDeclarationOnly && sanipack build",
|
|
35
|
+
"clean": "rimraf lib",
|
|
36
|
+
"lint": "eslint .",
|
|
37
|
+
"prepare": "husky install",
|
|
38
|
+
"prepublishOnly": "npm run build",
|
|
39
|
+
"watch": "sanipack build --watch"
|
|
40
|
+
},
|
|
17
41
|
"dependencies": {
|
|
18
42
|
"@sanity/icons": "^1.3.4",
|
|
19
43
|
"@sanity/types": "2.35.0",
|
|
@@ -21,23 +45,34 @@
|
|
|
21
45
|
"lodash": "^4.17.15",
|
|
22
46
|
"rxjs": "^6.5.3"
|
|
23
47
|
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@commitlint/cli": "^17.3.0",
|
|
50
|
+
"@commitlint/config-conventional": "^17.3.0",
|
|
51
|
+
"@sanity/semantic-release-preset": "^2.0.1",
|
|
52
|
+
"@types/lodash": "^4.14.190",
|
|
53
|
+
"@types/styled-components": "5.1.26",
|
|
54
|
+
"@typescript-eslint/eslint-plugin": "^5.42.0",
|
|
55
|
+
"@typescript-eslint/parser": "^5.42.0",
|
|
56
|
+
"eslint": "^8.27.0",
|
|
57
|
+
"eslint-config-prettier": "^8.5.0",
|
|
58
|
+
"eslint-config-sanity": "^6.0.0",
|
|
59
|
+
"eslint-plugin-prettier": "^4.2.1",
|
|
60
|
+
"eslint-plugin-react": "^7.31.10",
|
|
61
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
62
|
+
"husky": "^8.0.1",
|
|
63
|
+
"lint-staged": "^13.0.3",
|
|
64
|
+
"prettier": "^2.7.1",
|
|
65
|
+
"prettier-plugin-packagejson": "^2.3.0",
|
|
66
|
+
"prop-types": "^15.8.1",
|
|
67
|
+
"react": "17.0.1",
|
|
68
|
+
"rimraf": "^2.7.1",
|
|
69
|
+
"sanipack": "^2.1.0"
|
|
70
|
+
},
|
|
24
71
|
"peerDependencies": {
|
|
25
72
|
"prop-types": "^15.3",
|
|
26
73
|
"react": "^16.9 || ^17"
|
|
27
74
|
},
|
|
28
|
-
"author": "Sanity.io <hello@sanity.io>",
|
|
29
|
-
"license": "MIT",
|
|
30
|
-
"bugs": {
|
|
31
|
-
"url": "https://github.com/sanity-io/sanity/issues"
|
|
32
|
-
},
|
|
33
|
-
"homepage": "https://www.sanity.io/",
|
|
34
|
-
"repository": {
|
|
35
|
-
"type": "git",
|
|
36
|
-
"url": "git+https://github.com/sanity-io/sanity.git",
|
|
37
|
-
"directory": "packages/@sanity/language-filter"
|
|
38
|
-
},
|
|
39
75
|
"publishConfig": {
|
|
40
76
|
"access": "public"
|
|
41
|
-
}
|
|
42
|
-
"gitHead": "3dbbd9eae1ec72f5af60b9126afaabfbb3d97fa2"
|
|
77
|
+
}
|
|
43
78
|
}
|
package/src/SelectLanguage.tsx
CHANGED
|
@@ -33,6 +33,10 @@ const SelectLanguage = ({
|
|
|
33
33
|
const [isOpen, setIsOpen] = useState(false)
|
|
34
34
|
const allIsSelected = languages.length === selected.length
|
|
35
35
|
|
|
36
|
+
const handleClose = () => {
|
|
37
|
+
setIsOpen(false)
|
|
38
|
+
}
|
|
39
|
+
|
|
36
40
|
const handleKeyUp = useCallback((e) => {
|
|
37
41
|
if (e.key === 'Escape') {
|
|
38
42
|
handleClose()
|
|
@@ -43,10 +47,6 @@ const SelectLanguage = ({
|
|
|
43
47
|
setIsOpen((prev) => !prev)
|
|
44
48
|
}
|
|
45
49
|
|
|
46
|
-
const handleClose = () => {
|
|
47
|
-
setIsOpen(false)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
50
|
const selectLang = (langId: string) => {
|
|
51
51
|
onChange(selected.concat(langId))
|
|
52
52
|
}
|
|
@@ -63,7 +63,6 @@ const SelectLanguageProvider = ({schemaType}: Props) => {
|
|
|
63
63
|
if (FallbackImplementation) {
|
|
64
64
|
// This is happening only inside the mono repo because Lerna is hoisting it incorrectly.
|
|
65
65
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
66
|
-
// @ts-expect-error
|
|
67
66
|
return <FallbackImplementation schemaType={schemaType} />
|
|
68
67
|
}
|
|
69
68
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SelectLanguage.d.ts","sourceRoot":"","sources":["../../src/SelectLanguage.tsx"],"names":[],"mappings":";AAKA,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,MAAM,CAAA;CACX;AAED,UAAU,KAAK;IACb,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CAClC;AAKD,QAAA,MAAM,cAAc,6FAOjB,KAAK,gBAkJP,CAAA;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SelectLanguageProvider.d.ts","sourceRoot":"","sources":["../../src/SelectLanguageProvider.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAA;AAMxC,UAAU,KAAK;IACb,UAAU,CAAC,EAAE,UAAU,CAAA;CACxB;AAED,QAAA,MAAM,sBAAsB,mBAAkB,KAAK,uBAuDlD,CAAA;AAED,eAAe,sBAAsB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"datastore.d.ts","sourceRoot":"","sources":["../../src/datastore.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,UAAU,EAAU,MAAM,MAAM,CAAA;AAIxC,OAAO,EAAC,WAAW,EAAE,UAAU,EAAC,MAAM,eAAe,CAAA;AAErD,oBAAY,iBAAiB,GAAG,MAAM,EAAE,CAAA;AAUxC,eAAO,MAAM,QAAQ,wCAA8D,CAAA;AAqBnF,eAAO,MAAM,kBAAkB,sBAa9B,CAAA;AAUD,eAAO,MAAM,SAAS,6BAEK,UAAU,SAAS,WAAW,aAIxD,CAAA"}
|