@sanity/language-filter 1.0.0-firstpass-v3-impl.1 → 1.0.0-v3-studio.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 +4 -0
- package/lib/cjs/index.js +217 -124
- package/lib/cjs/index.js.map +1 -1
- package/lib/esm/index.js +219 -126
- package/lib/esm/index.js.map +1 -1
- package/lib/types/index.d.ts +28 -10
- package/lib/types/index.d.ts.map +1 -1
- package/package.json +9 -8
- package/src/LanguageFilterContext.tsx +30 -0
- package/src/LanguageFilterMenuButton.tsx +31 -12
- package/src/LanguageFilterObjectInput.tsx +59 -20
- package/src/languageSubscription.ts +32 -0
- package/src/plugin.tsx +23 -4
- package/src/usePaneLanguages.ts +42 -45
- package/src/useSelectedLanguageIds.ts +40 -0
package/lib/esm/index.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {jsx as $gGrEF$jsx,
|
|
2
|
-
import {useMemo as $gGrEF$useMemo,
|
|
1
|
+
import {jsx as $gGrEF$jsx, Fragment as $gGrEF$Fragment, jsxs as $gGrEF$jsxs} from "react/jsx-runtime";
|
|
2
|
+
import {useEffect as $gGrEF$useEffect, useMemo as $gGrEF$useMemo, createContext as $gGrEF$createContext, useContext as $gGrEF$useContext, useState as $gGrEF$useState, useCallback as $gGrEF$useCallback} from "react";
|
|
3
3
|
import {createPlugin as $gGrEF$createPlugin} from "sanity";
|
|
4
|
-
import {ObjectInput as $gGrEF$ObjectInput} from "sanity/form";
|
|
5
|
-
import {usePaneRouter as $gGrEF$usePaneRouter} from "sanity/desk";
|
|
6
|
-
import {TranslateIcon as $gGrEF$TranslateIcon} from "@sanity/icons";
|
|
7
4
|
import {useClickOutside as $gGrEF$useClickOutside, Box as $gGrEF$Box, Card as $gGrEF$Card, Stack as $gGrEF$Stack, Text as $gGrEF$Text, Flex as $gGrEF$Flex, Checkbox as $gGrEF$Checkbox, Popover as $gGrEF$Popover, Button as $gGrEF$Button} from "@sanity/ui";
|
|
8
5
|
|
|
9
6
|
|
|
@@ -11,94 +8,6 @@ import {useClickOutside as $gGrEF$useClickOutside, Box as $gGrEF$Box, Card as $g
|
|
|
11
8
|
|
|
12
9
|
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
// NOTE: use `+` instead of `,` since the desk tool URL format already uses comma
|
|
18
|
-
const $8ca77f8ec29d117e$var$LANG_ID_SEPARATOR = "+";
|
|
19
|
-
function $8ca77f8ec29d117e$export$cd56401a2a088ead(props) {
|
|
20
|
-
const { options: options } = props;
|
|
21
|
-
const { params: params , setParams: setParams } = (0, $gGrEF$usePaneRouter)();
|
|
22
|
-
const { supportedLanguages: supportedLanguages , defaultLanguages: defaultLanguages } = options;
|
|
23
|
-
const selectableLanguages = (0, $gGrEF$useMemo)(()=>supportedLanguages.filter((lang)=>!defaultLanguages?.includes(lang.id)), [
|
|
24
|
-
supportedLanguages,
|
|
25
|
-
defaultLanguages
|
|
26
|
-
]);
|
|
27
|
-
const selectedLanguages = (0, $gGrEF$useMemo)(()=>{
|
|
28
|
-
if (params?.langs === "$none") return [];
|
|
29
|
-
if (params?.langs === "$all") return selectableLanguages.map((lang)=>lang.id);
|
|
30
|
-
return params?.langs?.split($8ca77f8ec29d117e$var$LANG_ID_SEPARATOR) || selectableLanguages.map((lang)=>lang.id);
|
|
31
|
-
}, [
|
|
32
|
-
params,
|
|
33
|
-
selectableLanguages
|
|
34
|
-
]);
|
|
35
|
-
const selectAll = (0, $gGrEF$useCallback)(()=>{
|
|
36
|
-
setParams({
|
|
37
|
-
...params,
|
|
38
|
-
langs: "$all"
|
|
39
|
-
});
|
|
40
|
-
}, [
|
|
41
|
-
params,
|
|
42
|
-
setParams
|
|
43
|
-
]);
|
|
44
|
-
const selectNone = (0, $gGrEF$useCallback)(()=>{
|
|
45
|
-
setParams({
|
|
46
|
-
...params,
|
|
47
|
-
langs: "$none"
|
|
48
|
-
});
|
|
49
|
-
}, [
|
|
50
|
-
params,
|
|
51
|
-
setParams
|
|
52
|
-
]);
|
|
53
|
-
const toggleLanguage = (0, $gGrEF$useCallback)((languageId)=>{
|
|
54
|
-
let lang = selectedLanguages;
|
|
55
|
-
if (lang.includes(languageId)) lang = lang.filter((l)=>l !== languageId);
|
|
56
|
-
else lang = [
|
|
57
|
-
...lang,
|
|
58
|
-
languageId
|
|
59
|
-
];
|
|
60
|
-
if (lang.length === 0) {
|
|
61
|
-
setParams({
|
|
62
|
-
...params,
|
|
63
|
-
langs: "$none"
|
|
64
|
-
}) // none
|
|
65
|
-
;
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
if (lang.length === selectableLanguages.length) {
|
|
69
|
-
setParams({
|
|
70
|
-
...params,
|
|
71
|
-
langs: "$all"
|
|
72
|
-
});
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
setParams({
|
|
76
|
-
...params,
|
|
77
|
-
langs: lang.join($8ca77f8ec29d117e$var$LANG_ID_SEPARATOR)
|
|
78
|
-
});
|
|
79
|
-
}, [
|
|
80
|
-
params,
|
|
81
|
-
selectableLanguages,
|
|
82
|
-
selectedLanguages,
|
|
83
|
-
setParams
|
|
84
|
-
]);
|
|
85
|
-
const visibleLanguages = (0, $gGrEF$useMemo)(()=>[
|
|
86
|
-
...defaultLanguages ?? [],
|
|
87
|
-
...selectedLanguages
|
|
88
|
-
], [
|
|
89
|
-
defaultLanguages,
|
|
90
|
-
selectedLanguages
|
|
91
|
-
]);
|
|
92
|
-
return {
|
|
93
|
-
visibleLanguages: visibleLanguages,
|
|
94
|
-
allSelected: selectedLanguages.length === selectableLanguages.length,
|
|
95
|
-
selectAll: selectAll,
|
|
96
|
-
selectNone: selectNone,
|
|
97
|
-
toggleLanguage: toggleLanguage
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
|
|
102
11
|
const $40fa05cab0bde0d4$export$373781be62a9896e = (enclosingType, field, selectedLanguageIds)=>!enclosingType.name.startsWith("locale") || selectedLanguageIds.includes(field.name);
|
|
103
12
|
function $40fa05cab0bde0d4$export$fe9baa09973dbf22(schemaType, options) {
|
|
104
13
|
const schemaFilter = $40fa05cab0bde0d4$var$isDocument(schemaType) && schemaType?.options?.languageFilter;
|
|
@@ -114,26 +23,101 @@ function $40fa05cab0bde0d4$var$getRootType(schema) {
|
|
|
114
23
|
}
|
|
115
24
|
|
|
116
25
|
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
const $8e787dd57b4fe32f$var$LanguageFilterContext = /*#__PURE__*/ (0, $gGrEF$createContext)(undefined);
|
|
29
|
+
function $8e787dd57b4fe32f$export$f00537e9911d9516({ options: options , enabled: enabled , children: children }) {
|
|
30
|
+
const value = (0, $gGrEF$useMemo)(()=>({
|
|
31
|
+
options: options,
|
|
32
|
+
enabled: enabled
|
|
33
|
+
}), [
|
|
34
|
+
options,
|
|
35
|
+
enabled
|
|
36
|
+
]);
|
|
37
|
+
return /*#__PURE__*/ (0, $gGrEF$jsx)($8e787dd57b4fe32f$var$LanguageFilterContext.Provider, {
|
|
38
|
+
value: value,
|
|
39
|
+
children: children
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function $8e787dd57b4fe32f$export$d5c74ca916607f46() {
|
|
43
|
+
const value = (0, $gGrEF$useContext)($8e787dd57b4fe32f$var$LanguageFilterContext);
|
|
44
|
+
if (!value) throw new Error("LanguageFilterContext is missing");
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
const $90af43ca884ccacd$var$storageKey = "@sanity/plugin/language-filter/selected-languages";
|
|
51
|
+
function $90af43ca884ccacd$export$f21c039050fb95eb(options) {
|
|
52
|
+
const selectableLangs = $90af43ca884ccacd$export$76676750ed98bafe(options).map((l)=>l.id);
|
|
53
|
+
let selected = selectableLangs;
|
|
54
|
+
try {
|
|
55
|
+
const persistedValue = window.localStorage.getItem($90af43ca884ccacd$var$storageKey);
|
|
56
|
+
if (persistedValue) selected = JSON.parse(persistedValue);
|
|
57
|
+
} catch (err) {} // eslint-disable-line no-empty
|
|
58
|
+
// constrain persisted/selected languages to the ones currently supported
|
|
59
|
+
selected = $90af43ca884ccacd$var$intersection(selected, selectableLangs);
|
|
60
|
+
return selected;
|
|
61
|
+
}
|
|
62
|
+
function $90af43ca884ccacd$export$833b55f5102c4e70(languageIds) {
|
|
63
|
+
window.localStorage.setItem($90af43ca884ccacd$var$storageKey, JSON.stringify(languageIds));
|
|
64
|
+
}
|
|
65
|
+
function $90af43ca884ccacd$var$intersection(array1, array2) {
|
|
66
|
+
return array1.filter((value)=>array2.includes(value));
|
|
67
|
+
}
|
|
68
|
+
function $90af43ca884ccacd$export$76676750ed98bafe({ supportedLanguages: supportedLanguages , defaultLanguages: defaultLanguages }) {
|
|
69
|
+
return supportedLanguages.filter((lang)=>!defaultLanguages?.includes(lang.id));
|
|
70
|
+
}
|
|
71
|
+
function $90af43ca884ccacd$export$b484a630b97f9ca3(options) {
|
|
72
|
+
return (0, $gGrEF$useState)(()=>$90af43ca884ccacd$export$f21c039050fb95eb(options));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
117
76
|
function $f69da2f7cb45fe3f$export$7f9ce1f19dc34df5(props) {
|
|
118
|
-
const {
|
|
119
|
-
const {
|
|
120
|
-
|
|
77
|
+
const { options: options , enabled: enabled } = (0, $8e787dd57b4fe32f$export$d5c74ca916607f46)();
|
|
78
|
+
const { next: next , subscribeSelectedIds: subscribeSelectedIds , ...restProps } = props;
|
|
79
|
+
if (!enabled || !options) return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Fragment), {
|
|
80
|
+
children: next(restProps)
|
|
121
81
|
});
|
|
82
|
+
return /*#__PURE__*/ (0, $gGrEF$jsx)($f69da2f7cb45fe3f$var$FilteredObjectInput, {
|
|
83
|
+
...restProps,
|
|
84
|
+
next: next,
|
|
85
|
+
options: options,
|
|
86
|
+
subscribeSelectedIds: subscribeSelectedIds
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function $f69da2f7cb45fe3f$var$FilteredObjectInput(props) {
|
|
90
|
+
const { members: membersProp , options: options , schemaType: schemaType , next: next , subscribeSelectedIds: subscribeSelectedIds , ...restProps } = props;
|
|
91
|
+
const [selectedIds, setSelectedIds] = (0, $90af43ca884ccacd$export$b484a630b97f9ca3)(options);
|
|
92
|
+
(0, $gGrEF$useEffect)(()=>{
|
|
93
|
+
const unsubscribe = subscribeSelectedIds(setSelectedIds);
|
|
94
|
+
return ()=>unsubscribe();
|
|
95
|
+
}, [
|
|
96
|
+
subscribeSelectedIds,
|
|
97
|
+
setSelectedIds
|
|
98
|
+
]);
|
|
99
|
+
const activeLanguages = (0, $gGrEF$useMemo)(()=>[
|
|
100
|
+
...options.defaultLanguages ?? [],
|
|
101
|
+
...selectedIds
|
|
102
|
+
], [
|
|
103
|
+
options.defaultLanguages,
|
|
104
|
+
selectedIds
|
|
105
|
+
]);
|
|
122
106
|
const filterField = options.filterField ?? (0, $40fa05cab0bde0d4$export$373781be62a9896e);
|
|
123
107
|
const members = (0, $gGrEF$useMemo)(()=>{
|
|
124
|
-
return membersProp.filter((member)=>member.kind === "field" && filterField(schemaType, member,
|
|
108
|
+
return membersProp.filter((member)=>member.kind === "field" && filterField(schemaType, member, activeLanguages) || member.kind === "fieldSet" && filterField(schemaType, member.fieldSet, activeLanguages));
|
|
125
109
|
}, [
|
|
126
110
|
schemaType,
|
|
127
111
|
membersProp,
|
|
128
112
|
filterField,
|
|
129
|
-
|
|
113
|
+
activeLanguages
|
|
130
114
|
]);
|
|
131
|
-
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
115
|
+
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Fragment), {
|
|
116
|
+
children: next({
|
|
117
|
+
...restProps,
|
|
118
|
+
members: members,
|
|
119
|
+
schemaType: schemaType
|
|
120
|
+
})
|
|
137
121
|
});
|
|
138
122
|
}
|
|
139
123
|
|
|
@@ -143,13 +127,67 @@ function $f69da2f7cb45fe3f$export$7f9ce1f19dc34df5(props) {
|
|
|
143
127
|
|
|
144
128
|
|
|
145
129
|
|
|
130
|
+
function $8ca77f8ec29d117e$export$cd56401a2a088ead(props) {
|
|
131
|
+
const { options: options , onSelectedIdsChange: onSelectedIdsChange } = props;
|
|
132
|
+
const { defaultLanguages: defaultLanguages } = options;
|
|
133
|
+
const [selectedIds, setSelectedIds] = (0, $90af43ca884ccacd$export$b484a630b97f9ca3)(options);
|
|
134
|
+
const selectableLanguages = (0, $gGrEF$useMemo)(()=>(0, $90af43ca884ccacd$export$76676750ed98bafe)(options), [
|
|
135
|
+
options
|
|
136
|
+
]);
|
|
137
|
+
const updateSelectedIds = (0, $gGrEF$useCallback)((ids)=>{
|
|
138
|
+
setSelectedIds(ids);
|
|
139
|
+
(0, $90af43ca884ccacd$export$833b55f5102c4e70)(ids);
|
|
140
|
+
onSelectedIdsChange(ids);
|
|
141
|
+
}, [
|
|
142
|
+
onSelectedIdsChange,
|
|
143
|
+
setSelectedIds
|
|
144
|
+
]);
|
|
145
|
+
const selectAll = (0, $gGrEF$useCallback)(()=>updateSelectedIds(selectableLanguages.map((l)=>l.id)), [
|
|
146
|
+
updateSelectedIds,
|
|
147
|
+
selectableLanguages
|
|
148
|
+
]);
|
|
149
|
+
const selectNone = (0, $gGrEF$useCallback)(()=>{
|
|
150
|
+
updateSelectedIds([]);
|
|
151
|
+
}, [
|
|
152
|
+
updateSelectedIds
|
|
153
|
+
]);
|
|
154
|
+
const toggleLanguage = (0, $gGrEF$useCallback)((languageId)=>{
|
|
155
|
+
let lang = selectedIds;
|
|
156
|
+
if (lang.includes(languageId)) lang = lang.filter((l)=>l !== languageId);
|
|
157
|
+
else lang = [
|
|
158
|
+
...lang,
|
|
159
|
+
languageId
|
|
160
|
+
];
|
|
161
|
+
updateSelectedIds(lang);
|
|
162
|
+
}, [
|
|
163
|
+
updateSelectedIds,
|
|
164
|
+
selectedIds
|
|
165
|
+
]);
|
|
166
|
+
const activeLanguages = (0, $gGrEF$useMemo)(()=>[
|
|
167
|
+
...defaultLanguages ?? [],
|
|
168
|
+
...selectedIds
|
|
169
|
+
], [
|
|
170
|
+
defaultLanguages,
|
|
171
|
+
selectedIds
|
|
172
|
+
]);
|
|
173
|
+
return {
|
|
174
|
+
activeLanguages: activeLanguages,
|
|
175
|
+
allSelected: selectedIds.length === selectableLanguages.length,
|
|
176
|
+
selectAll: selectAll,
|
|
177
|
+
selectNone: selectNone,
|
|
178
|
+
toggleLanguage: toggleLanguage
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
|
|
146
183
|
function $4566079f8642bc3e$export$85fc605f11895007(props) {
|
|
147
|
-
const { options: options } = props;
|
|
184
|
+
const { options: options , onSelectedIdsChange: onSelectedIdsChange } = props;
|
|
148
185
|
const defaultLanguages = options.supportedLanguages.filter((l)=>options.defaultLanguages?.includes(l.id));
|
|
149
186
|
const languageOptions = options.supportedLanguages.filter((l)=>!options.defaultLanguages?.includes(l.id));
|
|
150
187
|
const [open, setOpen] = (0, $gGrEF$useState)(false);
|
|
151
|
-
const {
|
|
152
|
-
options: options
|
|
188
|
+
const { activeLanguages: activeLanguages , allSelected: allSelected , selectAll: selectAll , selectNone: selectNone , toggleLanguage: toggleLanguage } = (0, $8ca77f8ec29d117e$export$cd56401a2a088ead)({
|
|
189
|
+
options: options,
|
|
190
|
+
onSelectedIdsChange: onSelectedIdsChange
|
|
153
191
|
});
|
|
154
192
|
const [button, setButton] = (0, $gGrEF$useState)(null);
|
|
155
193
|
const [popover, setPopover] = (0, $gGrEF$useState)(null);
|
|
@@ -173,20 +211,22 @@ function $4566079f8642bc3e$export$85fc605f11895007(props) {
|
|
|
173
211
|
children: [
|
|
174
212
|
defaultLanguages.length > 0 && /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
|
|
175
213
|
radius: 2,
|
|
176
|
-
tone: "primary",
|
|
177
214
|
children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Stack), {
|
|
178
215
|
padding: 2,
|
|
179
216
|
space: 3,
|
|
180
217
|
children: [
|
|
181
|
-
/*#__PURE__*/ (0, $gGrEF$
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
218
|
+
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
|
|
219
|
+
paddingBottom: 2,
|
|
220
|
+
children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Text), {
|
|
221
|
+
size: 1,
|
|
222
|
+
weight: "semibold",
|
|
223
|
+
children: [
|
|
224
|
+
"Default language",
|
|
225
|
+
defaultLanguages.length > 1 && /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Fragment), {
|
|
226
|
+
children: "s"
|
|
227
|
+
})
|
|
228
|
+
]
|
|
229
|
+
})
|
|
190
230
|
}),
|
|
191
231
|
defaultLanguages.map((l)=>/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
|
|
192
232
|
children: l.title
|
|
@@ -200,7 +240,7 @@ function $4566079f8642bc3e$export$85fc605f11895007(props) {
|
|
|
200
240
|
space: 2,
|
|
201
241
|
children: [
|
|
202
242
|
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
|
|
203
|
-
paddingBottom:
|
|
243
|
+
paddingBottom: 2,
|
|
204
244
|
children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
|
|
205
245
|
size: 1,
|
|
206
246
|
weight: "semibold",
|
|
@@ -232,22 +272,47 @@ function $4566079f8642bc3e$export$85fc605f11895007(props) {
|
|
|
232
272
|
languageOptions.map((lang)=>/*#__PURE__*/ (0, $gGrEF$jsx)($4566079f8642bc3e$var$LanguageFilterOption, {
|
|
233
273
|
id: lang.id,
|
|
234
274
|
onToggle: toggleLanguage,
|
|
235
|
-
selected:
|
|
275
|
+
selected: activeLanguages.includes(lang.id),
|
|
236
276
|
title: lang.title
|
|
237
277
|
}, lang.id))
|
|
238
278
|
]
|
|
239
279
|
})
|
|
240
280
|
]
|
|
241
281
|
});
|
|
282
|
+
const langCount = options.supportedLanguages.length;
|
|
242
283
|
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Popover), {
|
|
243
|
-
constrainSize: true,
|
|
244
284
|
content: content,
|
|
245
285
|
open: open,
|
|
246
286
|
portal: true,
|
|
247
287
|
ref: setPopover,
|
|
248
288
|
children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Button), {
|
|
249
|
-
|
|
250
|
-
|
|
289
|
+
text: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
|
|
290
|
+
gap: 1,
|
|
291
|
+
children: [
|
|
292
|
+
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
|
|
293
|
+
children: "Filter languages:"
|
|
294
|
+
}),
|
|
295
|
+
/*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
|
|
296
|
+
gap: 1,
|
|
297
|
+
justify: "space-around",
|
|
298
|
+
children: [
|
|
299
|
+
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Flex), {
|
|
300
|
+
style: {
|
|
301
|
+
width: `${Math.floor(Math.log10(langCount) + 1)}ch`
|
|
302
|
+
},
|
|
303
|
+
justify: "flex-end",
|
|
304
|
+
children: activeLanguages.length
|
|
305
|
+
}),
|
|
306
|
+
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
|
|
307
|
+
children: "/"
|
|
308
|
+
}),
|
|
309
|
+
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
|
|
310
|
+
children: langCount
|
|
311
|
+
})
|
|
312
|
+
]
|
|
313
|
+
})
|
|
314
|
+
]
|
|
315
|
+
}),
|
|
251
316
|
mode: "bleed",
|
|
252
317
|
onClick: handleClick,
|
|
253
318
|
ref: setButton,
|
|
@@ -288,10 +353,31 @@ function $4566079f8642bc3e$var$LanguageFilterOption(props) {
|
|
|
288
353
|
|
|
289
354
|
|
|
290
355
|
|
|
356
|
+
|
|
357
|
+
function $b5718ee7178ba592$export$de189c01fb1f896d() {
|
|
358
|
+
const subs = [];
|
|
359
|
+
const onSelectedIdsChange = (ids)=>{
|
|
360
|
+
subs.forEach((s)=>s(ids));
|
|
361
|
+
};
|
|
362
|
+
const subscribeSelectedIds = (subscription)=>{
|
|
363
|
+
subs.push(subscription);
|
|
364
|
+
return ()=>{
|
|
365
|
+
subs.splice(subs.indexOf(subscription), 1);
|
|
366
|
+
};
|
|
367
|
+
};
|
|
368
|
+
return {
|
|
369
|
+
onSelectedIdsChange: onSelectedIdsChange,
|
|
370
|
+
subscribeSelectedIds: subscribeSelectedIds
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
|
|
291
375
|
const $91a08798d183e77b$export$bae498c4212cce68 = (0, $gGrEF$createPlugin)((options)=>{
|
|
376
|
+
const { onSelectedIdsChange: onSelectedIdsChange , subscribeSelectedIds: subscribeSelectedIds } = (0, $b5718ee7178ba592$export$de189c01fb1f896d)();
|
|
292
377
|
const RenderLanguageFilter = ()=>{
|
|
293
378
|
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $4566079f8642bc3e$export$85fc605f11895007), {
|
|
294
|
-
options: options
|
|
379
|
+
options: options,
|
|
380
|
+
onSelectedIdsChange: onSelectedIdsChange
|
|
295
381
|
});
|
|
296
382
|
};
|
|
297
383
|
return {
|
|
@@ -308,11 +394,18 @@ const $91a08798d183e77b$export$bae498c4212cce68 = (0, $gGrEF$createPlugin)((opti
|
|
|
308
394
|
form: {
|
|
309
395
|
renderInput (props, next) {
|
|
310
396
|
const enabled = (0, $40fa05cab0bde0d4$export$fe9baa09973dbf22)(props.schemaType, options);
|
|
311
|
-
|
|
397
|
+
// will only be considered enabled for document, so this is only done once
|
|
398
|
+
if (enabled) return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $8e787dd57b4fe32f$export$f00537e9911d9516), {
|
|
399
|
+
enabled: enabled,
|
|
400
|
+
options: options,
|
|
401
|
+
children: next(props)
|
|
402
|
+
});
|
|
403
|
+
if (props.schemaType.jsonType === "object") return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $f69da2f7cb45fe3f$export$7f9ce1f19dc34df5), {
|
|
312
404
|
...props,
|
|
313
|
-
|
|
405
|
+
next: next,
|
|
406
|
+
subscribeSelectedIds: subscribeSelectedIds
|
|
314
407
|
});
|
|
315
|
-
return
|
|
408
|
+
return undefined;
|
|
316
409
|
}
|
|
317
410
|
}
|
|
318
411
|
};
|
package/lib/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/index.ts","src/plugin.tsx","src/LanguageFilterObjectInput.tsx","src/usePaneLanguages.ts","src/filterField.ts","src/LanguageFilterMenuButton.tsx"],"sourcesContent":["/**\n * Plugin function\n */\nexport {languageFilter} from './plugin'\n\nexport {defaultFilterField, isLanguageFilterEnabled} from './filterField'\n\nexport type {\n LanguageFilterConfig,\n LanguageFilterSchema,\n LanguageFilterOptions,\n FilterFieldFunction,\n Language,\n} from './types'\n\nexport {\n LanguageFilterObjectInput,\n type LanguageFilterObjectInputProps,\n} from './LanguageFilterObjectInput'\n\nexport {\n LanguageFilterMenuButton,\n type LanguageFilterMenuButtonProps,\n} from './LanguageFilterMenuButton'\n\nexport {usePaneLanguages} from './usePaneLanguages'\n","import React from 'react'\nimport {_DocumentLanguageFilterComponent, createPlugin, ObjectInputProps} from 'sanity'\nimport {LanguageFilterObjectInput} from './LanguageFilterObjectInput'\nimport {LanguageFilterMenuButton} from './LanguageFilterMenuButton'\nimport {LanguageFilterConfig} from './types'\nimport {isLanguageFilterEnabled} from './filterField'\n\n/**\n * ## Usage in sanity.config.ts (or .js)\n *\n * ```\n * import {createConfig} from 'sanity'\n * import {languageFilter} from '@sanity/language-filter'\n *\n * export const createConfig({\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 = createPlugin<LanguageFilterConfig>((options) => {\n const RenderLanguageFilter: _DocumentLanguageFilterComponent = () => {\n return <LanguageFilterMenuButton options={options} />\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 renderInput(props, next) {\n const enabled = isLanguageFilterEnabled(props.schemaType, options)\n if (enabled && props.schemaType.jsonType === 'object') {\n return <LanguageFilterObjectInput {...(props as ObjectInputProps)} options={options} />\n }\n return next(props)\n },\n },\n }\n})\n","import React, {useMemo} from 'react'\nimport {ObjectInputProps, ObjectMember} from 'sanity'\nimport {ObjectInput} from 'sanity/form'\nimport {usePaneLanguages} from './usePaneLanguages'\nimport {LanguageFilterConfig} from './types'\nimport {defaultFilterField} from './filterField'\n\nexport type LanguageFilterObjectInputProps = {options: LanguageFilterConfig} & ObjectInputProps\n\nexport function LanguageFilterObjectInput(props: LanguageFilterObjectInputProps) {\n const {members: membersProp, level, options, path, schemaType, ...restProps} = props\n const {visibleLanguages} = usePaneLanguages({options})\n\n const filterField = options.filterField ?? defaultFilterField\n\n const members: ObjectMember[] = useMemo(() => {\n return membersProp.filter(\n (member) =>\n (member.kind === 'field' && filterField(schemaType, member, visibleLanguages)) ||\n (member.kind === 'fieldSet' && filterField(schemaType, member.fieldSet, visibleLanguages))\n )\n }, [schemaType, membersProp, filterField, visibleLanguages])\n\n return (\n <ObjectInput\n {...restProps}\n level={level}\n members={members}\n path={path}\n schemaType={schemaType}\n />\n )\n}\n","import {useCallback, useMemo} from 'react'\nimport {usePaneRouter} from 'sanity/desk'\nimport {LanguageFilterConfig} from './types'\n\n// NOTE: use `+` instead of `,` since the desk tool URL format already uses comma\nconst LANG_ID_SEPARATOR = '+'\n\nexport function usePaneLanguages(props: {options: LanguageFilterConfig}): {\n visibleLanguages: string[]\n allSelected: boolean\n selectAll: () => void\n selectNone: () => void\n toggleLanguage: (languageId: string) => void\n} {\n const {options} = props\n const {params, setParams} = usePaneRouter()\n const {supportedLanguages, defaultLanguages} = options\n\n const selectableLanguages = useMemo(\n () => supportedLanguages.filter((lang) => !defaultLanguages?.includes(lang.id)),\n [supportedLanguages, defaultLanguages]\n )\n\n const selectedLanguages = useMemo(() => {\n if (params?.langs === '$none') {\n return []\n }\n\n if (params?.langs === '$all') {\n return selectableLanguages.map((lang) => lang.id)\n }\n\n return params?.langs?.split(LANG_ID_SEPARATOR) || selectableLanguages.map((lang) => lang.id)\n }, [params, selectableLanguages])\n\n const selectAll = useCallback(() => {\n setParams({...params, langs: '$all'})\n }, [params, setParams])\n\n const selectNone = useCallback(() => {\n setParams({...params, langs: '$none'})\n }, [params, setParams])\n\n const toggleLanguage = useCallback(\n (languageId: string) => {\n let lang = selectedLanguages\n\n if (lang.includes(languageId)) {\n lang = lang.filter((l) => l !== languageId)\n } else {\n lang = [...lang, languageId]\n }\n\n if (lang.length === 0) {\n setParams({...params, langs: '$none'}) // none\n return\n }\n\n if (lang.length === selectableLanguages.length) {\n setParams({...params, langs: '$all'})\n return\n }\n\n setParams({...params, langs: lang.join(LANG_ID_SEPARATOR)})\n },\n [params, selectableLanguages, selectedLanguages, setParams]\n )\n\n const visibleLanguages = useMemo(\n () => [...(defaultLanguages ?? []), ...selectedLanguages],\n [defaultLanguages, selectedLanguages]\n )\n\n return {\n visibleLanguages,\n allSelected: selectedLanguages.length === selectableLanguages.length,\n selectAll,\n selectNone,\n toggleLanguage,\n }\n}\n","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 {TranslateIcon} from '@sanity/icons'\nimport {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}\n\nexport function LanguageFilterMenuButton(props: LanguageFilterMenuButtonProps) {\n const {options} = props\n const defaultLanguages = options.supportedLanguages.filter((l) =>\n options.defaultLanguages?.includes(l.id)\n )\n const languageOptions = options.supportedLanguages.filter(\n (l) => !options.defaultLanguages?.includes(l.id)\n )\n const [open, setOpen] = useState(false)\n const {visibleLanguages, allSelected, selectAll, selectNone, toggleLanguage} = usePaneLanguages({\n options,\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} tone=\"primary\">\n <Stack padding={2} space={3}>\n <Text size={1} weight=\"semibold\">\n Default language{defaultLanguages.length > 1 && <>s</>}\n </Text>\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={1}>\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={visibleLanguages.includes(lang.id)}\n title={lang.title}\n />\n ))}\n </Stack>\n </Box>\n )\n\n return (\n <Popover constrainSize content={content} open={open} portal ref={setPopover}>\n <Button\n icon={TranslateIcon}\n text={`Filter languages (${visibleLanguages.length}/${options.supportedLanguages.length})`}\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"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}
|
|
1
|
+
{"mappings":"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","sources":["src/index.ts","src/plugin.tsx","src/LanguageFilterObjectInput.tsx","src/filterField.ts","src/LanguageFilterContext.tsx","src/useSelectedLanguageIds.ts","src/LanguageFilterMenuButton.tsx","src/usePaneLanguages.ts","src/languageSubscription.ts"],"sourcesContent":["/**\n * Plugin function\n */\nexport {languageFilter} from './plugin'\n\nexport {defaultFilterField, isLanguageFilterEnabled} from './filterField'\n\nexport type {\n LanguageFilterConfig,\n LanguageFilterSchema,\n LanguageFilterOptions,\n FilterFieldFunction,\n Language,\n} from './types'\n\nexport {\n LanguageFilterObjectInput,\n type LanguageFilterObjectInputProps,\n} from './LanguageFilterObjectInput'\n\nexport {\n LanguageFilterMenuButton,\n type LanguageFilterMenuButtonProps,\n} from './LanguageFilterMenuButton'\n\nexport {usePaneLanguages} from './usePaneLanguages'\n","import React from 'react'\nimport {_DocumentLanguageFilterComponent, createPlugin, 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 {createConfig} from 'sanity'\n * import {languageFilter} from '@sanity/language-filter'\n *\n * export const createConfig({\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 = createPlugin<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 renderInput(props, next) {\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 {next(props)}\n </LanguageFilterProvider>\n )\n }\n if (props.schemaType.jsonType === 'object') {\n return (\n <LanguageFilterObjectInput\n {...(props as ObjectInputProps)}\n next={next}\n subscribeSelectedIds={subscribeSelectedIds}\n />\n )\n }\n\n return undefined\n },\n },\n }\n})\n","import React, {useEffect, useMemo} from 'react'\nimport {ObjectInputProps, ObjectMember, RenderInputCallback} 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 next: RenderInputCallback\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 next: RenderInputCallback\n subscribeSelectedIds: (callback: (ids: string[]) => void) => () => void\n }\n) {\n const {options, enabled} = useLanguageFilterContext()\n const {next, subscribeSelectedIds, ...restProps} = props\n if (!enabled || !options) {\n return <>{next(restProps)}</>\n }\n return (\n <FilteredObjectInput\n {...restProps}\n next={next}\n options={options}\n subscribeSelectedIds={subscribeSelectedIds}\n />\n )\n}\n\nfunction FilteredObjectInput(props: LanguageFilterObjectInputProps) {\n const {\n members: membersProp,\n options,\n schemaType,\n next,\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.filter(\n (member) =>\n (member.kind === 'field' && filterField(schemaType, member, activeLanguages)) ||\n (member.kind === 'fieldSet' && filterField(schemaType, member.fieldSet, activeLanguages))\n )\n }, [schemaType, membersProp, filterField, activeLanguages])\n\n return <>{next({...restProps, members, schemaType})}</>\n}\n","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 const value = useContext(LanguageFilterContext)\n if (!value) {\n throw new Error('LanguageFilterContext is missing')\n }\n return value\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 {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 {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","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":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}
|
package/lib/types/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FieldMember, FieldsetState, ObjectSchemaType, SchemaType, ObjectInputProps } from "sanity";
|
|
1
|
+
import { FieldMember, FieldsetState, ObjectSchemaType, SchemaType, ObjectInputProps, RenderInputCallback } from "sanity";
|
|
2
2
|
export interface LanguageFilterOptions {
|
|
3
3
|
languageFilter?: boolean;
|
|
4
4
|
}
|
|
@@ -16,23 +16,41 @@ export interface LanguageFilterConfig {
|
|
|
16
16
|
documentTypes?: string[];
|
|
17
17
|
filterField?: FilterFieldFunction;
|
|
18
18
|
}
|
|
19
|
-
export
|
|
19
|
+
export const defaultFilterField: FilterFieldFunction;
|
|
20
|
+
export function isLanguageFilterEnabled(schemaType: SchemaType | undefined, options: LanguageFilterConfig): boolean;
|
|
21
|
+
export type LanguageFilterObjectInputProps = {
|
|
20
22
|
options: LanguageFilterConfig;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
next: RenderInputCallback;
|
|
24
|
+
/**
|
|
25
|
+
* We need a way to communicate state changes between the pane menu and input components.
|
|
26
|
+
* LanguageFilter button lives outside the input-render tree, so Context is out.
|
|
27
|
+
* This is a workaround for that.
|
|
28
|
+
*/
|
|
29
|
+
subscribeSelectedIds: (callback: (ids: string[]) => void) => () => void;
|
|
30
|
+
} & ObjectInputProps;
|
|
31
|
+
export function LanguageFilterObjectInput(props: ObjectInputProps & {
|
|
32
|
+
next: RenderInputCallback;
|
|
33
|
+
subscribeSelectedIds: (callback: (ids: string[]) => void) => () => void;
|
|
34
|
+
}): JSX.Element;
|
|
35
|
+
interface UsePaneLanguagesParams {
|
|
36
|
+
options: LanguageFilterConfig;
|
|
37
|
+
/**
|
|
38
|
+
* We need a way to communicate state changes between the pane menu and input components.
|
|
39
|
+
* LanguageFilter button lives outside the input-render tree, so Context is out.
|
|
40
|
+
* This is a workaround for that.
|
|
41
|
+
*/
|
|
42
|
+
onSelectedIdsChange: (ids: string[]) => void;
|
|
43
|
+
}
|
|
44
|
+
export function usePaneLanguages(props: UsePaneLanguagesParams): {
|
|
45
|
+
activeLanguages: string[];
|
|
23
46
|
allSelected: boolean;
|
|
24
47
|
selectAll: () => void;
|
|
25
48
|
selectNone: () => void;
|
|
26
49
|
toggleLanguage: (languageId: string) => void;
|
|
27
50
|
};
|
|
28
|
-
export const defaultFilterField: FilterFieldFunction;
|
|
29
|
-
export function isLanguageFilterEnabled(schemaType: SchemaType | undefined, options: LanguageFilterConfig): boolean;
|
|
30
|
-
export type LanguageFilterObjectInputProps = {
|
|
31
|
-
options: LanguageFilterConfig;
|
|
32
|
-
} & ObjectInputProps;
|
|
33
|
-
export function LanguageFilterObjectInput(props: LanguageFilterObjectInputProps): JSX.Element;
|
|
34
51
|
export interface LanguageFilterMenuButtonProps {
|
|
35
52
|
options: LanguageFilterConfig;
|
|
53
|
+
onSelectedIdsChange: (ids: string[]) => void;
|
|
36
54
|
}
|
|
37
55
|
export function LanguageFilterMenuButton(props: LanguageFilterMenuButtonProps): JSX.Element;
|
|
38
56
|
/**
|
package/lib/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";AAEA;IACE,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,qCAAsC,SAAQ,gBAAgB;IAC5D,OAAO,CAAC,EAAE,qBAAqB,CAAA;CAChC;AAED;IACE,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd;AAED,kCAAkC,CAChC,aAAa,EAAE,gBAAgB,EAC/B,KAAK,EAAE,WAAW,GAAG,aAAa,EAClC,mBAAmB,EAAE,MAAM,EAAE,KAC1B,OAAO,CAAA;AAEZ;IACE,kBAAkB,EAAE,QAAQ,EAAE,CAAA;IAC9B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,WAAW,CAAC,EAAE,mBAAmB,CAAA;CAClC;
|
|
1
|
+
{"mappings":";AAEA;IACE,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,qCAAsC,SAAQ,gBAAgB;IAC5D,OAAO,CAAC,EAAE,qBAAqB,CAAA;CAChC;AAED;IACE,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd;AAED,kCAAkC,CAChC,aAAa,EAAE,gBAAgB,EAC/B,KAAK,EAAE,WAAW,GAAG,aAAa,EAClC,mBAAmB,EAAE,MAAM,EAAE,KAC1B,OAAO,CAAA;AAEZ;IACE,kBAAkB,EAAE,QAAQ,EAAE,CAAA;IAC9B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,WAAW,CAAC,EAAE,mBAAmB,CAAA;CAClC;ACvBD,OAAO,MAAM,oBAAoB,mBAIwD,CAAA;AAEzF,wCACE,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAUT;AGfD,6CAA6C;IAC3C,OAAO,EAAE,oBAAoB,CAAA;IAC7B,IAAI,EAAE,mBAAmB,CAAA;IACzB;;;;OAIG;IACH,oBAAoB,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;CACxE,GAAG,gBAAgB,CAAA;AAEpB,0CACE,KAAK,EAAE,gBAAgB,GAAG;IACxB,IAAI,EAAE,mBAAmB,CAAA;IACzB,oBAAoB,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;CACxE,eAeF;AC7BD;IACE,OAAO,EAAE,oBAAoB,CAAA;IAC7B;;;;OAIG;IACH,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CAC7C;AAED,iCAAiC,KAAK,EAAE,sBAAsB,GAAG;IAC/D,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7C,CAqDA;ACxED;IACE,OAAO,EAAE,oBAAoB,CAAA;IAC7B,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CAC7C;AAED,yCAAyC,KAAK,EAAE,6BAA6B,eAgH5E;AEjHD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,MAAM,6DA2CX,CAAA","sources":["src/src/types.ts","src/src/filterField.ts","src/src/LanguageFilterContext.tsx","src/src/useSelectedLanguageIds.ts","src/src/LanguageFilterObjectInput.tsx","src/src/usePaneLanguages.ts","src/src/LanguageFilterMenuButton.tsx","src/src/languageSubscription.ts","src/src/plugin.tsx","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,"/**\n * Plugin function\n */\nexport {languageFilter} from './plugin'\n\nexport {defaultFilterField, isLanguageFilterEnabled} from './filterField'\n\nexport type {\n LanguageFilterConfig,\n LanguageFilterSchema,\n LanguageFilterOptions,\n FilterFieldFunction,\n Language,\n} from './types'\n\nexport {\n LanguageFilterObjectInput,\n type LanguageFilterObjectInputProps,\n} from './LanguageFilterObjectInput'\n\nexport {\n LanguageFilterMenuButton,\n type LanguageFilterMenuButtonProps,\n} from './LanguageFilterMenuButton'\n\nexport {usePaneLanguages} from './usePaneLanguages'\n"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../../"}
|