@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/README.md
CHANGED
|
@@ -135,3 +135,7 @@ Run ["CI & Release" workflow](https://github.com/sanity-io/language-filter/actio
|
|
|
135
135
|
Make sure to select the main branch and check "Release new version".
|
|
136
136
|
|
|
137
137
|
Semantic release will only release on configured branches, so it is safe to run release on any branch.
|
|
138
|
+
|
|
139
|
+
Note: main branch is configured to release a studio-v3 tagged version of the plugin.
|
|
140
|
+
To make semantic-release happy, the branch "semver-main-placeholder" is regarded as the non-prerelease branch,
|
|
141
|
+
but it is unused. The v2 version lives in the sanity mono-repo.
|
package/lib/cjs/index.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
var $k7rGe$reactjsxruntime = require("react/jsx-runtime");
|
|
2
2
|
var $k7rGe$react = require("react");
|
|
3
3
|
var $k7rGe$sanity = require("sanity");
|
|
4
|
-
var $k7rGe$sanityform = require("sanity/form");
|
|
5
|
-
var $k7rGe$sanitydesk = require("sanity/desk");
|
|
6
|
-
var $k7rGe$sanityicons = require("@sanity/icons");
|
|
7
4
|
var $k7rGe$sanityui = require("@sanity/ui");
|
|
8
5
|
|
|
9
6
|
function $parcel$export(e, n, v, s) {
|
|
@@ -21,94 +18,6 @@ $parcel$export(module.exports, "usePaneLanguages", () => $b7317e67f107ab55$expor
|
|
|
21
18
|
|
|
22
19
|
|
|
23
20
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
// NOTE: use `+` instead of `,` since the desk tool URL format already uses comma
|
|
28
|
-
const $b7317e67f107ab55$var$LANG_ID_SEPARATOR = "+";
|
|
29
|
-
function $b7317e67f107ab55$export$cd56401a2a088ead(props) {
|
|
30
|
-
const { options: options } = props;
|
|
31
|
-
const { params: params , setParams: setParams } = (0, $k7rGe$sanitydesk.usePaneRouter)();
|
|
32
|
-
const { supportedLanguages: supportedLanguages , defaultLanguages: defaultLanguages } = options;
|
|
33
|
-
const selectableLanguages = (0, $k7rGe$react.useMemo)(()=>supportedLanguages.filter((lang)=>!defaultLanguages?.includes(lang.id)), [
|
|
34
|
-
supportedLanguages,
|
|
35
|
-
defaultLanguages
|
|
36
|
-
]);
|
|
37
|
-
const selectedLanguages = (0, $k7rGe$react.useMemo)(()=>{
|
|
38
|
-
if (params?.langs === "$none") return [];
|
|
39
|
-
if (params?.langs === "$all") return selectableLanguages.map((lang)=>lang.id);
|
|
40
|
-
return params?.langs?.split($b7317e67f107ab55$var$LANG_ID_SEPARATOR) || selectableLanguages.map((lang)=>lang.id);
|
|
41
|
-
}, [
|
|
42
|
-
params,
|
|
43
|
-
selectableLanguages
|
|
44
|
-
]);
|
|
45
|
-
const selectAll = (0, $k7rGe$react.useCallback)(()=>{
|
|
46
|
-
setParams({
|
|
47
|
-
...params,
|
|
48
|
-
langs: "$all"
|
|
49
|
-
});
|
|
50
|
-
}, [
|
|
51
|
-
params,
|
|
52
|
-
setParams
|
|
53
|
-
]);
|
|
54
|
-
const selectNone = (0, $k7rGe$react.useCallback)(()=>{
|
|
55
|
-
setParams({
|
|
56
|
-
...params,
|
|
57
|
-
langs: "$none"
|
|
58
|
-
});
|
|
59
|
-
}, [
|
|
60
|
-
params,
|
|
61
|
-
setParams
|
|
62
|
-
]);
|
|
63
|
-
const toggleLanguage = (0, $k7rGe$react.useCallback)((languageId)=>{
|
|
64
|
-
let lang = selectedLanguages;
|
|
65
|
-
if (lang.includes(languageId)) lang = lang.filter((l)=>l !== languageId);
|
|
66
|
-
else lang = [
|
|
67
|
-
...lang,
|
|
68
|
-
languageId
|
|
69
|
-
];
|
|
70
|
-
if (lang.length === 0) {
|
|
71
|
-
setParams({
|
|
72
|
-
...params,
|
|
73
|
-
langs: "$none"
|
|
74
|
-
}) // none
|
|
75
|
-
;
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
if (lang.length === selectableLanguages.length) {
|
|
79
|
-
setParams({
|
|
80
|
-
...params,
|
|
81
|
-
langs: "$all"
|
|
82
|
-
});
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
setParams({
|
|
86
|
-
...params,
|
|
87
|
-
langs: lang.join($b7317e67f107ab55$var$LANG_ID_SEPARATOR)
|
|
88
|
-
});
|
|
89
|
-
}, [
|
|
90
|
-
params,
|
|
91
|
-
selectableLanguages,
|
|
92
|
-
selectedLanguages,
|
|
93
|
-
setParams
|
|
94
|
-
]);
|
|
95
|
-
const visibleLanguages = (0, $k7rGe$react.useMemo)(()=>[
|
|
96
|
-
...defaultLanguages ?? [],
|
|
97
|
-
...selectedLanguages
|
|
98
|
-
], [
|
|
99
|
-
defaultLanguages,
|
|
100
|
-
selectedLanguages
|
|
101
|
-
]);
|
|
102
|
-
return {
|
|
103
|
-
visibleLanguages: visibleLanguages,
|
|
104
|
-
allSelected: selectedLanguages.length === selectableLanguages.length,
|
|
105
|
-
selectAll: selectAll,
|
|
106
|
-
selectNone: selectNone,
|
|
107
|
-
toggleLanguage: toggleLanguage
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
|
|
112
21
|
const $f29012bc04d39674$export$373781be62a9896e = (enclosingType, field, selectedLanguageIds)=>!enclosingType.name.startsWith("locale") || selectedLanguageIds.includes(field.name);
|
|
113
22
|
function $f29012bc04d39674$export$fe9baa09973dbf22(schemaType, options) {
|
|
114
23
|
const schemaFilter = $f29012bc04d39674$var$isDocument(schemaType) && schemaType?.options?.languageFilter;
|
|
@@ -124,26 +33,101 @@ function $f29012bc04d39674$var$getRootType(schema) {
|
|
|
124
33
|
}
|
|
125
34
|
|
|
126
35
|
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
const $bb26db9356030deb$var$LanguageFilterContext = /*#__PURE__*/ (0, $k7rGe$react.createContext)(undefined);
|
|
39
|
+
function $bb26db9356030deb$export$f00537e9911d9516({ options: options , enabled: enabled , children: children }) {
|
|
40
|
+
const value = (0, $k7rGe$react.useMemo)(()=>({
|
|
41
|
+
options: options,
|
|
42
|
+
enabled: enabled
|
|
43
|
+
}), [
|
|
44
|
+
options,
|
|
45
|
+
enabled
|
|
46
|
+
]);
|
|
47
|
+
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($bb26db9356030deb$var$LanguageFilterContext.Provider, {
|
|
48
|
+
value: value,
|
|
49
|
+
children: children
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function $bb26db9356030deb$export$d5c74ca916607f46() {
|
|
53
|
+
const value = (0, $k7rGe$react.useContext)($bb26db9356030deb$var$LanguageFilterContext);
|
|
54
|
+
if (!value) throw new Error("LanguageFilterContext is missing");
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
const $fe597f02a0bccb26$var$storageKey = "@sanity/plugin/language-filter/selected-languages";
|
|
61
|
+
function $fe597f02a0bccb26$export$f21c039050fb95eb(options) {
|
|
62
|
+
const selectableLangs = $fe597f02a0bccb26$export$76676750ed98bafe(options).map((l)=>l.id);
|
|
63
|
+
let selected = selectableLangs;
|
|
64
|
+
try {
|
|
65
|
+
const persistedValue = window.localStorage.getItem($fe597f02a0bccb26$var$storageKey);
|
|
66
|
+
if (persistedValue) selected = JSON.parse(persistedValue);
|
|
67
|
+
} catch (err) {} // eslint-disable-line no-empty
|
|
68
|
+
// constrain persisted/selected languages to the ones currently supported
|
|
69
|
+
selected = $fe597f02a0bccb26$var$intersection(selected, selectableLangs);
|
|
70
|
+
return selected;
|
|
71
|
+
}
|
|
72
|
+
function $fe597f02a0bccb26$export$833b55f5102c4e70(languageIds) {
|
|
73
|
+
window.localStorage.setItem($fe597f02a0bccb26$var$storageKey, JSON.stringify(languageIds));
|
|
74
|
+
}
|
|
75
|
+
function $fe597f02a0bccb26$var$intersection(array1, array2) {
|
|
76
|
+
return array1.filter((value)=>array2.includes(value));
|
|
77
|
+
}
|
|
78
|
+
function $fe597f02a0bccb26$export$76676750ed98bafe({ supportedLanguages: supportedLanguages , defaultLanguages: defaultLanguages }) {
|
|
79
|
+
return supportedLanguages.filter((lang)=>!defaultLanguages?.includes(lang.id));
|
|
80
|
+
}
|
|
81
|
+
function $fe597f02a0bccb26$export$b484a630b97f9ca3(options) {
|
|
82
|
+
return (0, $k7rGe$react.useState)(()=>$fe597f02a0bccb26$export$f21c039050fb95eb(options));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
127
86
|
function $a0f4109b367c6ff0$export$7f9ce1f19dc34df5(props) {
|
|
128
|
-
const {
|
|
129
|
-
const {
|
|
130
|
-
|
|
87
|
+
const { options: options , enabled: enabled } = (0, $bb26db9356030deb$export$d5c74ca916607f46)();
|
|
88
|
+
const { next: next , subscribeSelectedIds: subscribeSelectedIds , ...restProps } = props;
|
|
89
|
+
if (!enabled || !options) return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$reactjsxruntime.Fragment), {
|
|
90
|
+
children: next(restProps)
|
|
131
91
|
});
|
|
92
|
+
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($a0f4109b367c6ff0$var$FilteredObjectInput, {
|
|
93
|
+
...restProps,
|
|
94
|
+
next: next,
|
|
95
|
+
options: options,
|
|
96
|
+
subscribeSelectedIds: subscribeSelectedIds
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function $a0f4109b367c6ff0$var$FilteredObjectInput(props) {
|
|
100
|
+
const { members: membersProp , options: options , schemaType: schemaType , next: next , subscribeSelectedIds: subscribeSelectedIds , ...restProps } = props;
|
|
101
|
+
const [selectedIds, setSelectedIds] = (0, $fe597f02a0bccb26$export$b484a630b97f9ca3)(options);
|
|
102
|
+
(0, $k7rGe$react.useEffect)(()=>{
|
|
103
|
+
const unsubscribe = subscribeSelectedIds(setSelectedIds);
|
|
104
|
+
return ()=>unsubscribe();
|
|
105
|
+
}, [
|
|
106
|
+
subscribeSelectedIds,
|
|
107
|
+
setSelectedIds
|
|
108
|
+
]);
|
|
109
|
+
const activeLanguages = (0, $k7rGe$react.useMemo)(()=>[
|
|
110
|
+
...options.defaultLanguages ?? [],
|
|
111
|
+
...selectedIds
|
|
112
|
+
], [
|
|
113
|
+
options.defaultLanguages,
|
|
114
|
+
selectedIds
|
|
115
|
+
]);
|
|
132
116
|
const filterField = options.filterField ?? (0, $f29012bc04d39674$export$373781be62a9896e);
|
|
133
117
|
const members = (0, $k7rGe$react.useMemo)(()=>{
|
|
134
|
-
return membersProp.filter((member)=>member.kind === "field" && filterField(schemaType, member,
|
|
118
|
+
return membersProp.filter((member)=>member.kind === "field" && filterField(schemaType, member, activeLanguages) || member.kind === "fieldSet" && filterField(schemaType, member.fieldSet, activeLanguages));
|
|
135
119
|
}, [
|
|
136
120
|
schemaType,
|
|
137
121
|
membersProp,
|
|
138
122
|
filterField,
|
|
139
|
-
|
|
123
|
+
activeLanguages
|
|
140
124
|
]);
|
|
141
|
-
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
125
|
+
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$reactjsxruntime.Fragment), {
|
|
126
|
+
children: next({
|
|
127
|
+
...restProps,
|
|
128
|
+
members: members,
|
|
129
|
+
schemaType: schemaType
|
|
130
|
+
})
|
|
147
131
|
});
|
|
148
132
|
}
|
|
149
133
|
|
|
@@ -153,13 +137,67 @@ function $a0f4109b367c6ff0$export$7f9ce1f19dc34df5(props) {
|
|
|
153
137
|
|
|
154
138
|
|
|
155
139
|
|
|
140
|
+
function $b7317e67f107ab55$export$cd56401a2a088ead(props) {
|
|
141
|
+
const { options: options , onSelectedIdsChange: onSelectedIdsChange } = props;
|
|
142
|
+
const { defaultLanguages: defaultLanguages } = options;
|
|
143
|
+
const [selectedIds, setSelectedIds] = (0, $fe597f02a0bccb26$export$b484a630b97f9ca3)(options);
|
|
144
|
+
const selectableLanguages = (0, $k7rGe$react.useMemo)(()=>(0, $fe597f02a0bccb26$export$76676750ed98bafe)(options), [
|
|
145
|
+
options
|
|
146
|
+
]);
|
|
147
|
+
const updateSelectedIds = (0, $k7rGe$react.useCallback)((ids)=>{
|
|
148
|
+
setSelectedIds(ids);
|
|
149
|
+
(0, $fe597f02a0bccb26$export$833b55f5102c4e70)(ids);
|
|
150
|
+
onSelectedIdsChange(ids);
|
|
151
|
+
}, [
|
|
152
|
+
onSelectedIdsChange,
|
|
153
|
+
setSelectedIds
|
|
154
|
+
]);
|
|
155
|
+
const selectAll = (0, $k7rGe$react.useCallback)(()=>updateSelectedIds(selectableLanguages.map((l)=>l.id)), [
|
|
156
|
+
updateSelectedIds,
|
|
157
|
+
selectableLanguages
|
|
158
|
+
]);
|
|
159
|
+
const selectNone = (0, $k7rGe$react.useCallback)(()=>{
|
|
160
|
+
updateSelectedIds([]);
|
|
161
|
+
}, [
|
|
162
|
+
updateSelectedIds
|
|
163
|
+
]);
|
|
164
|
+
const toggleLanguage = (0, $k7rGe$react.useCallback)((languageId)=>{
|
|
165
|
+
let lang = selectedIds;
|
|
166
|
+
if (lang.includes(languageId)) lang = lang.filter((l)=>l !== languageId);
|
|
167
|
+
else lang = [
|
|
168
|
+
...lang,
|
|
169
|
+
languageId
|
|
170
|
+
];
|
|
171
|
+
updateSelectedIds(lang);
|
|
172
|
+
}, [
|
|
173
|
+
updateSelectedIds,
|
|
174
|
+
selectedIds
|
|
175
|
+
]);
|
|
176
|
+
const activeLanguages = (0, $k7rGe$react.useMemo)(()=>[
|
|
177
|
+
...defaultLanguages ?? [],
|
|
178
|
+
...selectedIds
|
|
179
|
+
], [
|
|
180
|
+
defaultLanguages,
|
|
181
|
+
selectedIds
|
|
182
|
+
]);
|
|
183
|
+
return {
|
|
184
|
+
activeLanguages: activeLanguages,
|
|
185
|
+
allSelected: selectedIds.length === selectableLanguages.length,
|
|
186
|
+
selectAll: selectAll,
|
|
187
|
+
selectNone: selectNone,
|
|
188
|
+
toggleLanguage: toggleLanguage
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
|
|
156
193
|
function $4de932c0c6553dd2$export$85fc605f11895007(props) {
|
|
157
|
-
const { options: options } = props;
|
|
194
|
+
const { options: options , onSelectedIdsChange: onSelectedIdsChange } = props;
|
|
158
195
|
const defaultLanguages = options.supportedLanguages.filter((l)=>options.defaultLanguages?.includes(l.id));
|
|
159
196
|
const languageOptions = options.supportedLanguages.filter((l)=>!options.defaultLanguages?.includes(l.id));
|
|
160
197
|
const [open, setOpen] = (0, $k7rGe$react.useState)(false);
|
|
161
|
-
const {
|
|
162
|
-
options: options
|
|
198
|
+
const { activeLanguages: activeLanguages , allSelected: allSelected , selectAll: selectAll , selectNone: selectNone , toggleLanguage: toggleLanguage } = (0, $b7317e67f107ab55$export$cd56401a2a088ead)({
|
|
199
|
+
options: options,
|
|
200
|
+
onSelectedIdsChange: onSelectedIdsChange
|
|
163
201
|
});
|
|
164
202
|
const [button, setButton] = (0, $k7rGe$react.useState)(null);
|
|
165
203
|
const [popover, setPopover] = (0, $k7rGe$react.useState)(null);
|
|
@@ -183,20 +221,22 @@ function $4de932c0c6553dd2$export$85fc605f11895007(props) {
|
|
|
183
221
|
children: [
|
|
184
222
|
defaultLanguages.length > 0 && /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Card), {
|
|
185
223
|
radius: 2,
|
|
186
|
-
tone: "primary",
|
|
187
224
|
children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Stack), {
|
|
188
225
|
padding: 2,
|
|
189
226
|
space: 3,
|
|
190
227
|
children: [
|
|
191
|
-
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
228
|
+
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
|
|
229
|
+
paddingBottom: 2,
|
|
230
|
+
children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Text), {
|
|
231
|
+
size: 1,
|
|
232
|
+
weight: "semibold",
|
|
233
|
+
children: [
|
|
234
|
+
"Default language",
|
|
235
|
+
defaultLanguages.length > 1 && /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$reactjsxruntime.Fragment), {
|
|
236
|
+
children: "s"
|
|
237
|
+
})
|
|
238
|
+
]
|
|
239
|
+
})
|
|
200
240
|
}),
|
|
201
241
|
defaultLanguages.map((l)=>/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
|
|
202
242
|
children: l.title
|
|
@@ -210,7 +250,7 @@ function $4de932c0c6553dd2$export$85fc605f11895007(props) {
|
|
|
210
250
|
space: 2,
|
|
211
251
|
children: [
|
|
212
252
|
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
|
|
213
|
-
paddingBottom:
|
|
253
|
+
paddingBottom: 2,
|
|
214
254
|
children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
|
|
215
255
|
size: 1,
|
|
216
256
|
weight: "semibold",
|
|
@@ -242,22 +282,47 @@ function $4de932c0c6553dd2$export$85fc605f11895007(props) {
|
|
|
242
282
|
languageOptions.map((lang)=>/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($4de932c0c6553dd2$var$LanguageFilterOption, {
|
|
243
283
|
id: lang.id,
|
|
244
284
|
onToggle: toggleLanguage,
|
|
245
|
-
selected:
|
|
285
|
+
selected: activeLanguages.includes(lang.id),
|
|
246
286
|
title: lang.title
|
|
247
287
|
}, lang.id))
|
|
248
288
|
]
|
|
249
289
|
})
|
|
250
290
|
]
|
|
251
291
|
});
|
|
292
|
+
const langCount = options.supportedLanguages.length;
|
|
252
293
|
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Popover), {
|
|
253
|
-
constrainSize: true,
|
|
254
294
|
content: content,
|
|
255
295
|
open: open,
|
|
256
296
|
portal: true,
|
|
257
297
|
ref: setPopover,
|
|
258
298
|
children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Button), {
|
|
259
|
-
|
|
260
|
-
|
|
299
|
+
text: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Flex), {
|
|
300
|
+
gap: 1,
|
|
301
|
+
children: [
|
|
302
|
+
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
|
|
303
|
+
children: "Filter languages:"
|
|
304
|
+
}),
|
|
305
|
+
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Flex), {
|
|
306
|
+
gap: 1,
|
|
307
|
+
justify: "space-around",
|
|
308
|
+
children: [
|
|
309
|
+
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Flex), {
|
|
310
|
+
style: {
|
|
311
|
+
width: `${Math.floor(Math.log10(langCount) + 1)}ch`
|
|
312
|
+
},
|
|
313
|
+
justify: "flex-end",
|
|
314
|
+
children: activeLanguages.length
|
|
315
|
+
}),
|
|
316
|
+
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
|
|
317
|
+
children: "/"
|
|
318
|
+
}),
|
|
319
|
+
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
|
|
320
|
+
children: langCount
|
|
321
|
+
})
|
|
322
|
+
]
|
|
323
|
+
})
|
|
324
|
+
]
|
|
325
|
+
}),
|
|
261
326
|
mode: "bleed",
|
|
262
327
|
onClick: handleClick,
|
|
263
328
|
ref: setButton,
|
|
@@ -298,10 +363,31 @@ function $4de932c0c6553dd2$var$LanguageFilterOption(props) {
|
|
|
298
363
|
|
|
299
364
|
|
|
300
365
|
|
|
366
|
+
|
|
367
|
+
function $a3222324b33f4bdf$export$de189c01fb1f896d() {
|
|
368
|
+
const subs = [];
|
|
369
|
+
const onSelectedIdsChange = (ids)=>{
|
|
370
|
+
subs.forEach((s)=>s(ids));
|
|
371
|
+
};
|
|
372
|
+
const subscribeSelectedIds = (subscription)=>{
|
|
373
|
+
subs.push(subscription);
|
|
374
|
+
return ()=>{
|
|
375
|
+
subs.splice(subs.indexOf(subscription), 1);
|
|
376
|
+
};
|
|
377
|
+
};
|
|
378
|
+
return {
|
|
379
|
+
onSelectedIdsChange: onSelectedIdsChange,
|
|
380
|
+
subscribeSelectedIds: subscribeSelectedIds
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
|
|
301
385
|
const $45e3093e7de8dca2$export$bae498c4212cce68 = (0, $k7rGe$sanity.createPlugin)((options)=>{
|
|
386
|
+
const { onSelectedIdsChange: onSelectedIdsChange , subscribeSelectedIds: subscribeSelectedIds } = (0, $a3222324b33f4bdf$export$de189c01fb1f896d)();
|
|
302
387
|
const RenderLanguageFilter = ()=>{
|
|
303
388
|
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $4de932c0c6553dd2$export$85fc605f11895007), {
|
|
304
|
-
options: options
|
|
389
|
+
options: options,
|
|
390
|
+
onSelectedIdsChange: onSelectedIdsChange
|
|
305
391
|
});
|
|
306
392
|
};
|
|
307
393
|
return {
|
|
@@ -318,11 +404,18 @@ const $45e3093e7de8dca2$export$bae498c4212cce68 = (0, $k7rGe$sanity.createPlugin
|
|
|
318
404
|
form: {
|
|
319
405
|
renderInput (props, next) {
|
|
320
406
|
const enabled = (0, $f29012bc04d39674$export$fe9baa09973dbf22)(props.schemaType, options);
|
|
321
|
-
|
|
407
|
+
// will only be considered enabled for document, so this is only done once
|
|
408
|
+
if (enabled) return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $bb26db9356030deb$export$f00537e9911d9516), {
|
|
409
|
+
enabled: enabled,
|
|
410
|
+
options: options,
|
|
411
|
+
children: next(props)
|
|
412
|
+
});
|
|
413
|
+
if (props.schemaType.jsonType === "object") return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $a0f4109b367c6ff0$export$7f9ce1f19dc34df5), {
|
|
322
414
|
...props,
|
|
323
|
-
|
|
415
|
+
next: next,
|
|
416
|
+
subscribeSelectedIds: subscribeSelectedIds
|
|
324
417
|
});
|
|
325
|
-
return
|
|
418
|
+
return undefined;
|
|
326
419
|
}
|
|
327
420
|
}
|
|
328
421
|
};
|
package/lib/cjs/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":"../../"}
|