@sanity/language-filter 0.147.10-next.22 → 1.0.0-firstpass-v3-impl.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/LICENSE +1 -1
- package/README.md +122 -28
- package/lib/cjs/index.js +338 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/esm/index.js +329 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/types/index.d.ts +73 -0
- package/lib/types/index.d.ts.map +1 -0
- package/package.json +77 -27
- package/sanity.json +2 -10
- package/src/LanguageFilterMenuButton.tsx +128 -0
- package/src/LanguageFilterObjectInput.tsx +33 -0
- package/src/filterField.test.ts +91 -0
- package/src/filterField.ts +34 -0
- package/src/index.ts +26 -0
- package/src/plugin.tsx +67 -0
- package/src/types.ts +27 -0
- package/src/usePaneLanguages.ts +81 -0
- package/v2-incompatible.js +11 -0
- package/lib/SelectLanguage.js +0 -139
- package/lib/SelectLanguageProvider.js +0 -52
- package/lib/datastore.js +0 -48
- package/lib/filter-fields.js +0 -13
- package/lib/styles/SelectLanguage.css +0 -50
- package/src/SelectLanguage.js +0 -106
- package/src/SelectLanguageProvider.js +0 -28
- package/src/datastore.js +0 -42
- package/src/filter-fields.js +0 -1
- package/src/styles/SelectLanguage.css +0 -50
package/lib/esm/index.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import {jsx as $gGrEF$jsx, jsxs as $gGrEF$jsxs, Fragment as $gGrEF$Fragment} from "react/jsx-runtime";
|
|
2
|
+
import {useMemo as $gGrEF$useMemo, useCallback as $gGrEF$useCallback, useState as $gGrEF$useState} from "react";
|
|
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
|
+
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
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
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
|
+
const $40fa05cab0bde0d4$export$373781be62a9896e = (enclosingType, field, selectedLanguageIds)=>!enclosingType.name.startsWith("locale") || selectedLanguageIds.includes(field.name);
|
|
103
|
+
function $40fa05cab0bde0d4$export$fe9baa09973dbf22(schemaType, options) {
|
|
104
|
+
const schemaFilter = $40fa05cab0bde0d4$var$isDocument(schemaType) && schemaType?.options?.languageFilter;
|
|
105
|
+
const defaultEnabled = !options.documentTypes;
|
|
106
|
+
return !!(defaultEnabled && schemaFilter !== false || !defaultEnabled && schemaFilter || schemaType && options.documentTypes?.includes(schemaType.name));
|
|
107
|
+
}
|
|
108
|
+
function $40fa05cab0bde0d4$var$isDocument(schemaType) {
|
|
109
|
+
return schemaType?.jsonType === "object" && $40fa05cab0bde0d4$var$getRootType(schemaType).name === "document";
|
|
110
|
+
}
|
|
111
|
+
function $40fa05cab0bde0d4$var$getRootType(schema) {
|
|
112
|
+
if (schema.type) return $40fa05cab0bde0d4$var$getRootType(schema.type);
|
|
113
|
+
return schema;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
function $f69da2f7cb45fe3f$export$7f9ce1f19dc34df5(props) {
|
|
118
|
+
const { members: membersProp , level: level , options: options , path: path , schemaType: schemaType , ...restProps } = props;
|
|
119
|
+
const { visibleLanguages: visibleLanguages } = (0, $8ca77f8ec29d117e$export$cd56401a2a088ead)({
|
|
120
|
+
options: options
|
|
121
|
+
});
|
|
122
|
+
const filterField = options.filterField ?? (0, $40fa05cab0bde0d4$export$373781be62a9896e);
|
|
123
|
+
const members = (0, $gGrEF$useMemo)(()=>{
|
|
124
|
+
return membersProp.filter((member)=>member.kind === "field" && filterField(schemaType, member, visibleLanguages) || member.kind === "fieldSet" && filterField(schemaType, member.fieldSet, visibleLanguages));
|
|
125
|
+
}, [
|
|
126
|
+
schemaType,
|
|
127
|
+
membersProp,
|
|
128
|
+
filterField,
|
|
129
|
+
visibleLanguages
|
|
130
|
+
]);
|
|
131
|
+
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$ObjectInput), {
|
|
132
|
+
...restProps,
|
|
133
|
+
level: level,
|
|
134
|
+
members: members,
|
|
135
|
+
path: path,
|
|
136
|
+
schemaType: schemaType
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
function $4566079f8642bc3e$export$85fc605f11895007(props) {
|
|
147
|
+
const { options: options } = props;
|
|
148
|
+
const defaultLanguages = options.supportedLanguages.filter((l)=>options.defaultLanguages?.includes(l.id));
|
|
149
|
+
const languageOptions = options.supportedLanguages.filter((l)=>!options.defaultLanguages?.includes(l.id));
|
|
150
|
+
const [open, setOpen] = (0, $gGrEF$useState)(false);
|
|
151
|
+
const { visibleLanguages: visibleLanguages , allSelected: allSelected , selectAll: selectAll , selectNone: selectNone , toggleLanguage: toggleLanguage } = (0, $8ca77f8ec29d117e$export$cd56401a2a088ead)({
|
|
152
|
+
options: options
|
|
153
|
+
});
|
|
154
|
+
const [button, setButton] = (0, $gGrEF$useState)(null);
|
|
155
|
+
const [popover, setPopover] = (0, $gGrEF$useState)(null);
|
|
156
|
+
const handleToggleAll = (0, $gGrEF$useCallback)((event)=>{
|
|
157
|
+
const checked = event.currentTarget.checked;
|
|
158
|
+
if (checked) selectAll();
|
|
159
|
+
else selectNone();
|
|
160
|
+
}, [
|
|
161
|
+
selectAll,
|
|
162
|
+
selectNone
|
|
163
|
+
]);
|
|
164
|
+
const handleClick = (0, $gGrEF$useCallback)(()=>setOpen((o)=>!o), []);
|
|
165
|
+
const handleClickOutside = (0, $gGrEF$useCallback)(()=>setOpen(false), []);
|
|
166
|
+
(0, $gGrEF$useClickOutside)(handleClickOutside, [
|
|
167
|
+
button,
|
|
168
|
+
popover
|
|
169
|
+
]);
|
|
170
|
+
const content = /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Box), {
|
|
171
|
+
overflow: "auto",
|
|
172
|
+
padding: 1,
|
|
173
|
+
children: [
|
|
174
|
+
defaultLanguages.length > 0 && /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
|
|
175
|
+
radius: 2,
|
|
176
|
+
tone: "primary",
|
|
177
|
+
children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Stack), {
|
|
178
|
+
padding: 2,
|
|
179
|
+
space: 3,
|
|
180
|
+
children: [
|
|
181
|
+
/*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Text), {
|
|
182
|
+
size: 1,
|
|
183
|
+
weight: "semibold",
|
|
184
|
+
children: [
|
|
185
|
+
"Default language",
|
|
186
|
+
defaultLanguages.length > 1 && /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Fragment), {
|
|
187
|
+
children: "s"
|
|
188
|
+
})
|
|
189
|
+
]
|
|
190
|
+
}),
|
|
191
|
+
defaultLanguages.map((l)=>/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
|
|
192
|
+
children: l.title
|
|
193
|
+
}, l.id))
|
|
194
|
+
]
|
|
195
|
+
})
|
|
196
|
+
}),
|
|
197
|
+
/*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Stack), {
|
|
198
|
+
marginTop: 3,
|
|
199
|
+
padding: 2,
|
|
200
|
+
space: 2,
|
|
201
|
+
children: [
|
|
202
|
+
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
|
|
203
|
+
paddingBottom: 1,
|
|
204
|
+
children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
|
|
205
|
+
size: 1,
|
|
206
|
+
weight: "semibold",
|
|
207
|
+
children: "Show translations"
|
|
208
|
+
})
|
|
209
|
+
}),
|
|
210
|
+
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
|
|
211
|
+
as: "label",
|
|
212
|
+
children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
|
|
213
|
+
align: "center",
|
|
214
|
+
gap: 2,
|
|
215
|
+
children: [
|
|
216
|
+
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Checkbox), {
|
|
217
|
+
checked: allSelected,
|
|
218
|
+
name: "_allSelected",
|
|
219
|
+
onChange: handleToggleAll
|
|
220
|
+
}),
|
|
221
|
+
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
|
|
222
|
+
flex: 1,
|
|
223
|
+
children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
|
|
224
|
+
muted: !allSelected,
|
|
225
|
+
weight: "semibold",
|
|
226
|
+
children: "All translations"
|
|
227
|
+
})
|
|
228
|
+
})
|
|
229
|
+
]
|
|
230
|
+
})
|
|
231
|
+
}),
|
|
232
|
+
languageOptions.map((lang)=>/*#__PURE__*/ (0, $gGrEF$jsx)($4566079f8642bc3e$var$LanguageFilterOption, {
|
|
233
|
+
id: lang.id,
|
|
234
|
+
onToggle: toggleLanguage,
|
|
235
|
+
selected: visibleLanguages.includes(lang.id),
|
|
236
|
+
title: lang.title
|
|
237
|
+
}, lang.id))
|
|
238
|
+
]
|
|
239
|
+
})
|
|
240
|
+
]
|
|
241
|
+
});
|
|
242
|
+
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Popover), {
|
|
243
|
+
constrainSize: true,
|
|
244
|
+
content: content,
|
|
245
|
+
open: open,
|
|
246
|
+
portal: true,
|
|
247
|
+
ref: setPopover,
|
|
248
|
+
children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Button), {
|
|
249
|
+
icon: (0, $gGrEF$TranslateIcon),
|
|
250
|
+
text: `Filter languages (${visibleLanguages.length}/${options.supportedLanguages.length})`,
|
|
251
|
+
mode: "bleed",
|
|
252
|
+
onClick: handleClick,
|
|
253
|
+
ref: setButton,
|
|
254
|
+
selected: open
|
|
255
|
+
})
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
function $4566079f8642bc3e$var$LanguageFilterOption(props) {
|
|
259
|
+
const { id: id , onToggle: onToggle , selected: selected , title: title } = props;
|
|
260
|
+
const handleChange = (0, $gGrEF$useCallback)(()=>{
|
|
261
|
+
onToggle(id);
|
|
262
|
+
}, [
|
|
263
|
+
id,
|
|
264
|
+
onToggle
|
|
265
|
+
]);
|
|
266
|
+
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
|
|
267
|
+
as: "label",
|
|
268
|
+
children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
|
|
269
|
+
align: "center",
|
|
270
|
+
gap: 2,
|
|
271
|
+
children: [
|
|
272
|
+
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Checkbox), {
|
|
273
|
+
checked: selected,
|
|
274
|
+
name: `language-${id}`,
|
|
275
|
+
onChange: handleChange
|
|
276
|
+
}),
|
|
277
|
+
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
|
|
278
|
+
flex: 1,
|
|
279
|
+
children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
|
|
280
|
+
muted: !selected,
|
|
281
|
+
children: title
|
|
282
|
+
})
|
|
283
|
+
})
|
|
284
|
+
]
|
|
285
|
+
})
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
const $91a08798d183e77b$export$bae498c4212cce68 = (0, $gGrEF$createPlugin)((options)=>{
|
|
292
|
+
const RenderLanguageFilter = ()=>{
|
|
293
|
+
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $4566079f8642bc3e$export$85fc605f11895007), {
|
|
294
|
+
options: options
|
|
295
|
+
});
|
|
296
|
+
};
|
|
297
|
+
return {
|
|
298
|
+
name: "@sanity/language-filter",
|
|
299
|
+
document: {
|
|
300
|
+
unstable_languageFilter: (prev, { schemaType: schemaType , schema: schema })=>{
|
|
301
|
+
if ((0, $40fa05cab0bde0d4$export$fe9baa09973dbf22)(schema.get(schemaType), options)) return [
|
|
302
|
+
...prev,
|
|
303
|
+
RenderLanguageFilter
|
|
304
|
+
];
|
|
305
|
+
return prev;
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
form: {
|
|
309
|
+
renderInput (props, next) {
|
|
310
|
+
const enabled = (0, $40fa05cab0bde0d4$export$fe9baa09973dbf22)(props.schemaType, options);
|
|
311
|
+
if (enabled && props.schemaType.jsonType === "object") return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $f69da2f7cb45fe3f$export$7f9ce1f19dc34df5), {
|
|
312
|
+
...props,
|
|
313
|
+
options: options
|
|
314
|
+
});
|
|
315
|
+
return next(props);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
export {$91a08798d183e77b$export$bae498c4212cce68 as languageFilter, $40fa05cab0bde0d4$export$373781be62a9896e as defaultFilterField, $40fa05cab0bde0d4$export$fe9baa09973dbf22 as isLanguageFilterEnabled, $f69da2f7cb45fe3f$export$7f9ce1f19dc34df5 as LanguageFilterObjectInput, $4566079f8642bc3e$export$85fc605f11895007 as LanguageFilterMenuButton, $8ca77f8ec29d117e$export$cd56401a2a088ead as usePaneLanguages};
|
|
329
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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":"../../"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { FieldMember, FieldsetState, ObjectSchemaType, SchemaType, ObjectInputProps } from "sanity";
|
|
2
|
+
export interface LanguageFilterOptions {
|
|
3
|
+
languageFilter?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface LanguageFilterSchema extends ObjectSchemaType {
|
|
6
|
+
options?: LanguageFilterOptions;
|
|
7
|
+
}
|
|
8
|
+
export interface Language {
|
|
9
|
+
id: string;
|
|
10
|
+
title: string;
|
|
11
|
+
}
|
|
12
|
+
export type FilterFieldFunction = (enclosingType: ObjectSchemaType, field: FieldMember | FieldsetState, selectedLanguageIds: string[]) => boolean;
|
|
13
|
+
export interface LanguageFilterConfig {
|
|
14
|
+
supportedLanguages: Language[];
|
|
15
|
+
defaultLanguages?: string[];
|
|
16
|
+
documentTypes?: string[];
|
|
17
|
+
filterField?: FilterFieldFunction;
|
|
18
|
+
}
|
|
19
|
+
export function usePaneLanguages(props: {
|
|
20
|
+
options: LanguageFilterConfig;
|
|
21
|
+
}): {
|
|
22
|
+
visibleLanguages: string[];
|
|
23
|
+
allSelected: boolean;
|
|
24
|
+
selectAll: () => void;
|
|
25
|
+
selectNone: () => void;
|
|
26
|
+
toggleLanguage: (languageId: string) => void;
|
|
27
|
+
};
|
|
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
|
+
export interface LanguageFilterMenuButtonProps {
|
|
35
|
+
options: LanguageFilterConfig;
|
|
36
|
+
}
|
|
37
|
+
export function LanguageFilterMenuButton(props: LanguageFilterMenuButtonProps): JSX.Element;
|
|
38
|
+
/**
|
|
39
|
+
* ## Usage in sanity.config.ts (or .js)
|
|
40
|
+
*
|
|
41
|
+
* ```
|
|
42
|
+
* import {createConfig} from 'sanity'
|
|
43
|
+
* import {languageFilter} from '@sanity/language-filter'
|
|
44
|
+
*
|
|
45
|
+
* export const createConfig({
|
|
46
|
+
* /...
|
|
47
|
+
* plugins: [
|
|
48
|
+
* languageFilter({
|
|
49
|
+
* supportedLanguages: [
|
|
50
|
+
* {id: 'nb', title: 'Norwegian (Bokmål)'},
|
|
51
|
+
* {id: 'nn', title: 'Norwegian (Nynorsk)'},
|
|
52
|
+
* {id: 'en', title: 'English'},
|
|
53
|
+
* {id: 'es', title: 'Spanish'},
|
|
54
|
+
* {id: 'arb', title: 'Arabic'},
|
|
55
|
+
* {id: 'pt', title: 'Portuguese'},
|
|
56
|
+
* //...
|
|
57
|
+
* ],
|
|
58
|
+
* // Select Norwegian (Bokmål) by default
|
|
59
|
+
* defaultLanguages: ['nb'],
|
|
60
|
+
* // Only show language filter for document type `page` (schemaType.name)
|
|
61
|
+
* // Can also enable via document-options: options.languageFilter: true
|
|
62
|
+
* documentTypes: ['page'],
|
|
63
|
+
* // default filter function shown
|
|
64
|
+
* filterField: (enclosingType, field, selectedLanguageIds) =>
|
|
65
|
+
* !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name),
|
|
66
|
+
* })
|
|
67
|
+
* ]
|
|
68
|
+
* })
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export const languageFilter: import("sanity").Plugin<LanguageFilterConfig>;
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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;ACnBD,iCAAiC,KAAK,EAAE;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAC,GAAG;IACxE,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,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,CAmEA;AC7ED,OAAO,MAAM,oBAAoB,mBAIwD,CAAA;AAEzF,wCACE,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAUT;ACfD,6CAA6C;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAC,GAAG,gBAAgB,CAAA;AAE/F,0CAA0C,KAAK,EAAE,8BAA8B,eAuB9E;AC1BD;IACE,OAAO,EAAE,oBAAoB,CAAA;CAC9B;AAED,yCAAyC,KAAK,EAAE,6BAA6B,eA6F5E;AChGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,MAAM,6DA0BX,CAAA","sources":["src/src/types.ts","src/src/usePaneLanguages.ts","src/src/filterField.ts","src/src/LanguageFilterObjectInput.tsx","src/src/LanguageFilterMenuButton.tsx","src/src/plugin.tsx","src/src/index.ts","src/index.ts"],"sourcesContent":[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":"../../"}
|
package/package.json
CHANGED
|
@@ -1,38 +1,88 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/language-filter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0-firstpass-v3-impl.1",
|
|
4
4
|
"description": "A Sanity plugin that supports filtering localized fields by language",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"clean": "rimraf lib"
|
|
8
|
-
},
|
|
9
|
-
"keywords": [
|
|
10
|
-
"sanity",
|
|
11
|
-
"cms",
|
|
12
|
-
"headless",
|
|
13
|
-
"realtime",
|
|
14
|
-
"content",
|
|
15
|
-
"language-filter"
|
|
16
|
-
],
|
|
17
|
-
"dependencies": {
|
|
18
|
-
"rxjs": "^6.5.3"
|
|
19
|
-
},
|
|
20
|
-
"peerDependencies": {
|
|
21
|
-
"prop-types": "^15.3",
|
|
22
|
-
"react": "^16.9"
|
|
23
|
-
},
|
|
24
5
|
"author": "Sanity.io <hello@sanity.io>",
|
|
25
6
|
"license": "MIT",
|
|
26
|
-
"
|
|
27
|
-
|
|
7
|
+
"source": "./src/index.ts",
|
|
8
|
+
"main": "./lib/cjs/index.js",
|
|
9
|
+
"module": "./lib/esm/index.js",
|
|
10
|
+
"types": "./lib/types/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"require": "./lib/cjs/index.js",
|
|
14
|
+
"default": "./lib/esm/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"src",
|
|
19
|
+
"lib",
|
|
20
|
+
"v2-incompatible.js",
|
|
21
|
+
"sanity.json"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"clean": "rimraf lib",
|
|
25
|
+
"lint": "eslint .",
|
|
26
|
+
"prebuild": "npm run clean && plugin-kit verify-package --silent",
|
|
27
|
+
"build": "parcel build --no-cache",
|
|
28
|
+
"watch": "parcel watch",
|
|
29
|
+
"test": "jest",
|
|
30
|
+
"link-watch": "plugin-kit link-watch",
|
|
31
|
+
"prepublishOnly": "npm run build"
|
|
28
32
|
},
|
|
29
|
-
"homepage": "https://www.sanity.io/",
|
|
30
33
|
"repository": {
|
|
31
34
|
"type": "git",
|
|
32
|
-
"url": "git+
|
|
35
|
+
"url": "git+ssh://git@github.com/sanity-io/language-filter.git"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=14.0.0"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@sanity/icons": "^1.3.4",
|
|
42
|
+
"@sanity/incompatible-plugin": "^1.0.0",
|
|
43
|
+
"@sanity/ui": "^0.37.20",
|
|
44
|
+
"@sanity/util": "3.0.0-dev-preview.15"
|
|
33
45
|
},
|
|
34
|
-
"
|
|
35
|
-
"
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@babel/preset-env": "^7.18.10",
|
|
48
|
+
"@babel/preset-react": "^7.18.6",
|
|
49
|
+
"@commitlint/cli": "^17.0.3",
|
|
50
|
+
"@commitlint/config-conventional": "^17.0.3",
|
|
51
|
+
"@parcel/packager-ts": "^2.7.0",
|
|
52
|
+
"@parcel/transformer-typescript-types": "^2.7.0",
|
|
53
|
+
"@sanity/plugin-kit": "^1.0.1",
|
|
54
|
+
"@sanity/semantic-release-preset": "^2.0.1",
|
|
55
|
+
"@types/jest": "^28.1.8",
|
|
56
|
+
"@typescript-eslint/eslint-plugin": "^5.35.1",
|
|
57
|
+
"@typescript-eslint/parser": "^5.35.1",
|
|
58
|
+
"eslint": "^8.22.0",
|
|
59
|
+
"eslint-config-prettier": "^8.5.0",
|
|
60
|
+
"eslint-config-sanity": "^6.0.0",
|
|
61
|
+
"eslint-plugin-prettier": "^4.2.1",
|
|
62
|
+
"eslint-plugin-react": "^7.31.0",
|
|
63
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
64
|
+
"husky": "^8.0.1",
|
|
65
|
+
"jest": "^28.1.3",
|
|
66
|
+
"lint-staged": "^13.0.3",
|
|
67
|
+
"parcel": "^2.7.0",
|
|
68
|
+
"prettier": "^2.7.1",
|
|
69
|
+
"react": "^17.0.0 || ^18.0.0",
|
|
70
|
+
"rimraf": "^3.0.2",
|
|
71
|
+
"sanity": "3.0.0-dev-preview.15",
|
|
72
|
+
"ts-jest": "^28.0.8",
|
|
73
|
+
"typescript": "^4.7.4"
|
|
74
|
+
},
|
|
75
|
+
"peerDependencies": {
|
|
76
|
+
"react": "^17.0.0 || ^18.0.0",
|
|
77
|
+
"sanity": "dev-preview"
|
|
78
|
+
},
|
|
79
|
+
"bugs": {
|
|
80
|
+
"url": "https://github.com/sanity-io/language-filter/issues"
|
|
36
81
|
},
|
|
37
|
-
"
|
|
82
|
+
"homepage": "https://github.com/sanity-io/language-filter#readme",
|
|
83
|
+
"sanityPlugin": {
|
|
84
|
+
"verifyPackage": {
|
|
85
|
+
"babelConfig": false
|
|
86
|
+
}
|
|
87
|
+
}
|
|
38
88
|
}
|
package/sanity.json
CHANGED
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"paths": {
|
|
3
|
-
"source": "./src",
|
|
4
|
-
"compiled": "./lib"
|
|
5
|
-
},
|
|
6
2
|
"parts": [
|
|
7
3
|
{
|
|
8
|
-
"implements": "part:@sanity/
|
|
9
|
-
"path": "
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"implements": "part:@sanity/desk-tool/language-select-component",
|
|
13
|
-
"path": "SelectLanguageProvider.js"
|
|
4
|
+
"implements": "part:@sanity/base/sanity-root",
|
|
5
|
+
"path": "./v2-incompatible.js"
|
|
14
6
|
}
|
|
15
7
|
]
|
|
16
8
|
}
|