@sanity/language-filter 2.31.2-performance-opts.7 → 3.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.
@@ -0,0 +1,419 @@
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
+ import {createPlugin as $gGrEF$createPlugin} from "sanity";
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";
5
+
6
+
7
+
8
+
9
+
10
+
11
+ const $40fa05cab0bde0d4$export$373781be62a9896e = (enclosingType, field, selectedLanguageIds)=>!enclosingType.name.startsWith("locale") || selectedLanguageIds.includes(field.name);
12
+ function $40fa05cab0bde0d4$export$fe9baa09973dbf22(schemaType, options) {
13
+ const schemaFilter = $40fa05cab0bde0d4$var$isDocument(schemaType) && schemaType?.options?.languageFilter;
14
+ const defaultEnabled = !options.documentTypes;
15
+ return !!(defaultEnabled && schemaFilter !== false || !defaultEnabled && schemaFilter || schemaType && options.documentTypes?.includes(schemaType.name));
16
+ }
17
+ function $40fa05cab0bde0d4$var$isDocument(schemaType) {
18
+ return schemaType?.jsonType === "object" && $40fa05cab0bde0d4$var$getRootType(schemaType).name === "document";
19
+ }
20
+ function $40fa05cab0bde0d4$var$getRootType(schema) {
21
+ if (schema.type) return $40fa05cab0bde0d4$var$getRootType(schema.type);
22
+ return schema;
23
+ }
24
+
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
+
76
+ function $f69da2f7cb45fe3f$export$7f9ce1f19dc34df5(props) {
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)
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
+ ]);
106
+ const filterField = options.filterField ?? (0, $40fa05cab0bde0d4$export$373781be62a9896e);
107
+ const members = (0, $gGrEF$useMemo)(()=>{
108
+ return membersProp.filter((member)=>member.kind === "field" && filterField(schemaType, member, activeLanguages) || member.kind === "fieldSet" && filterField(schemaType, member.fieldSet, activeLanguages));
109
+ }, [
110
+ schemaType,
111
+ membersProp,
112
+ filterField,
113
+ activeLanguages
114
+ ]);
115
+ return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Fragment), {
116
+ children: next({
117
+ ...restProps,
118
+ members: members,
119
+ schemaType: schemaType
120
+ })
121
+ });
122
+ }
123
+
124
+
125
+
126
+
127
+
128
+
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
+
183
+ function $4566079f8642bc3e$export$85fc605f11895007(props) {
184
+ const { options: options , onSelectedIdsChange: onSelectedIdsChange } = props;
185
+ const defaultLanguages = options.supportedLanguages.filter((l)=>options.defaultLanguages?.includes(l.id));
186
+ const languageOptions = options.supportedLanguages.filter((l)=>!options.defaultLanguages?.includes(l.id));
187
+ const [open, setOpen] = (0, $gGrEF$useState)(false);
188
+ const { activeLanguages: activeLanguages , allSelected: allSelected , selectAll: selectAll , selectNone: selectNone , toggleLanguage: toggleLanguage } = (0, $8ca77f8ec29d117e$export$cd56401a2a088ead)({
189
+ options: options,
190
+ onSelectedIdsChange: onSelectedIdsChange
191
+ });
192
+ const [button, setButton] = (0, $gGrEF$useState)(null);
193
+ const [popover, setPopover] = (0, $gGrEF$useState)(null);
194
+ const handleToggleAll = (0, $gGrEF$useCallback)((event)=>{
195
+ const checked = event.currentTarget.checked;
196
+ if (checked) selectAll();
197
+ else selectNone();
198
+ }, [
199
+ selectAll,
200
+ selectNone
201
+ ]);
202
+ const handleClick = (0, $gGrEF$useCallback)(()=>setOpen((o)=>!o), []);
203
+ const handleClickOutside = (0, $gGrEF$useCallback)(()=>setOpen(false), []);
204
+ (0, $gGrEF$useClickOutside)(handleClickOutside, [
205
+ button,
206
+ popover
207
+ ]);
208
+ const content = /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Box), {
209
+ overflow: "auto",
210
+ padding: 1,
211
+ children: [
212
+ defaultLanguages.length > 0 && /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
213
+ radius: 2,
214
+ children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Stack), {
215
+ padding: 2,
216
+ space: 3,
217
+ children: [
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
+ })
230
+ }),
231
+ defaultLanguages.map((l)=>/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
232
+ children: l.title
233
+ }, l.id))
234
+ ]
235
+ })
236
+ }),
237
+ /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Stack), {
238
+ marginTop: 3,
239
+ padding: 2,
240
+ space: 2,
241
+ children: [
242
+ /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
243
+ paddingBottom: 2,
244
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
245
+ size: 1,
246
+ weight: "semibold",
247
+ children: "Show translations"
248
+ })
249
+ }),
250
+ /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
251
+ as: "label",
252
+ children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
253
+ align: "center",
254
+ gap: 2,
255
+ children: [
256
+ /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Checkbox), {
257
+ checked: allSelected,
258
+ name: "_allSelected",
259
+ onChange: handleToggleAll
260
+ }),
261
+ /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
262
+ flex: 1,
263
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
264
+ muted: !allSelected,
265
+ weight: "semibold",
266
+ children: "All translations"
267
+ })
268
+ })
269
+ ]
270
+ })
271
+ }),
272
+ languageOptions.map((lang)=>/*#__PURE__*/ (0, $gGrEF$jsx)($4566079f8642bc3e$var$LanguageFilterOption, {
273
+ id: lang.id,
274
+ onToggle: toggleLanguage,
275
+ selected: activeLanguages.includes(lang.id),
276
+ title: lang.title
277
+ }, lang.id))
278
+ ]
279
+ })
280
+ ]
281
+ });
282
+ const langCount = options.supportedLanguages.length;
283
+ return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Popover), {
284
+ content: content,
285
+ open: open,
286
+ portal: true,
287
+ ref: setPopover,
288
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Button), {
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
+ }),
316
+ mode: "bleed",
317
+ onClick: handleClick,
318
+ ref: setButton,
319
+ selected: open
320
+ })
321
+ });
322
+ }
323
+ function $4566079f8642bc3e$var$LanguageFilterOption(props) {
324
+ const { id: id , onToggle: onToggle , selected: selected , title: title } = props;
325
+ const handleChange = (0, $gGrEF$useCallback)(()=>{
326
+ onToggle(id);
327
+ }, [
328
+ id,
329
+ onToggle
330
+ ]);
331
+ return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
332
+ as: "label",
333
+ children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
334
+ align: "center",
335
+ gap: 2,
336
+ children: [
337
+ /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Checkbox), {
338
+ checked: selected,
339
+ name: `language-${id}`,
340
+ onChange: handleChange
341
+ }),
342
+ /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
343
+ flex: 1,
344
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
345
+ muted: !selected,
346
+ children: title
347
+ })
348
+ })
349
+ ]
350
+ })
351
+ });
352
+ }
353
+
354
+
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
+
375
+ const $91a08798d183e77b$export$bae498c4212cce68 = (0, $gGrEF$createPlugin)((options)=>{
376
+ const { onSelectedIdsChange: onSelectedIdsChange , subscribeSelectedIds: subscribeSelectedIds } = (0, $b5718ee7178ba592$export$de189c01fb1f896d)();
377
+ const RenderLanguageFilter = ()=>{
378
+ return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $4566079f8642bc3e$export$85fc605f11895007), {
379
+ options: options,
380
+ onSelectedIdsChange: onSelectedIdsChange
381
+ });
382
+ };
383
+ return {
384
+ name: "@sanity/language-filter",
385
+ document: {
386
+ unstable_languageFilter: (prev, { schemaType: schemaType , schema: schema })=>{
387
+ if ((0, $40fa05cab0bde0d4$export$fe9baa09973dbf22)(schema.get(schemaType), options)) return [
388
+ ...prev,
389
+ RenderLanguageFilter
390
+ ];
391
+ return prev;
392
+ }
393
+ },
394
+ form: {
395
+ renderInput (props, next) {
396
+ const enabled = (0, $40fa05cab0bde0d4$export$fe9baa09973dbf22)(props.schemaType, options);
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), {
404
+ ...props,
405
+ next: next,
406
+ subscribeSelectedIds: subscribeSelectedIds
407
+ });
408
+ return undefined;
409
+ }
410
+ }
411
+ };
412
+ });
413
+
414
+
415
+
416
+
417
+
418
+ export {$91a08798d183e77b$export$bae498c4212cce68 as languageFilter, $40fa05cab0bde0d4$export$373781be62a9896e as defaultFilterField, $40fa05cab0bde0d4$export$fe9baa09973dbf22 as isLanguageFilterEnabled};
419
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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","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":"../../"}
@@ -0,0 +1,56 @@
1
+ import { FieldMember, FieldsetState, ObjectSchemaType, SchemaType } 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 const defaultFilterField: FilterFieldFunction;
20
+ export function isLanguageFilterEnabled(schemaType: SchemaType | undefined, options: LanguageFilterConfig): boolean;
21
+ /**
22
+ * ## Usage in sanity.config.ts (or .js)
23
+ *
24
+ * ```
25
+ * import {createConfig} from 'sanity'
26
+ * import {languageFilter} from '@sanity/language-filter'
27
+ *
28
+ * export const createConfig({
29
+ * /...
30
+ * plugins: [
31
+ * languageFilter({
32
+ * supportedLanguages: [
33
+ * {id: 'nb', title: 'Norwegian (Bokmål)'},
34
+ * {id: 'nn', title: 'Norwegian (Nynorsk)'},
35
+ * {id: 'en', title: 'English'},
36
+ * {id: 'es', title: 'Spanish'},
37
+ * {id: 'arb', title: 'Arabic'},
38
+ * {id: 'pt', title: 'Portuguese'},
39
+ * //...
40
+ * ],
41
+ * // Select Norwegian (Bokmål) by default
42
+ * defaultLanguages: ['nb'],
43
+ * // Only show language filter for document type `page` (schemaType.name)
44
+ * // Can also enable via document-options: options.languageFilter: true
45
+ * documentTypes: ['page'],
46
+ * // default filter function shown
47
+ * filterField: (enclosingType, field, selectedLanguageIds) =>
48
+ * !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name),
49
+ * })
50
+ * ]
51
+ * })
52
+ * ```
53
+ */
54
+ export const languageFilter: import("sanity").Plugin<LanguageFilterConfig>;
55
+
56
+ //# 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;ACvBD,OAAO,MAAM,oBAAoB,mBAIwD,CAAA;AAEzF,wCACE,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAUT;AObD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../../"}
package/package.json CHANGED
@@ -1,43 +1,89 @@
1
1
  {
2
2
  "name": "@sanity/language-filter",
3
- "version": "2.31.2-performance-opts.7+b32b26d2b5",
3
+ "version": "3.0.0-v3-studio.1",
4
4
  "description": "A Sanity plugin that supports filtering localized fields by language",
5
- "main": "index.js",
6
- "scripts": {
7
- "clean": "rimraf lib dest"
8
- },
9
- "keywords": [
10
- "sanity",
11
- "cms",
12
- "headless",
13
- "realtime",
14
- "content",
15
- "language-filter"
5
+ "author": "Sanity.io <hello@sanity.io>",
6
+ "license": "MIT",
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"
16
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",
32
+ "prepare": "husky install"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+ssh://git@github.com/sanity-io/language-filter.git"
37
+ },
38
+ "engines": {
39
+ "node": ">=14.0.0"
40
+ },
17
41
  "dependencies": {
18
42
  "@sanity/icons": "^1.3.4",
19
- "@sanity/types": "2.31.2-performance-opts.7+b32b26d2b5",
20
- "@sanity/ui": "^0.37.21",
21
- "lodash": "^4.17.15",
22
- "rxjs": "^6.5.3"
43
+ "@sanity/incompatible-plugin": "^1.0.0",
44
+ "@sanity/ui": "^0.38.0",
45
+ "@sanity/util": "3.0.0-dev-preview.15"
46
+ },
47
+ "devDependencies": {
48
+ "@babel/preset-env": "^7.18.10",
49
+ "@babel/preset-react": "^7.18.6",
50
+ "@commitlint/cli": "^17.1.2",
51
+ "@commitlint/config-conventional": "^17.1.0",
52
+ "@parcel/packager-ts": "^2.7.0",
53
+ "@parcel/transformer-typescript-types": "^2.7.0",
54
+ "@sanity/plugin-kit": "^1.0.1",
55
+ "@sanity/semantic-release-preset": "^2.0.1",
56
+ "@types/jest": "^28.1.8",
57
+ "@typescript-eslint/eslint-plugin": "^5.35.1",
58
+ "@typescript-eslint/parser": "^5.35.1",
59
+ "eslint": "8.22.0",
60
+ "eslint-config-prettier": "^8.5.0",
61
+ "eslint-config-sanity": "^6.0.0",
62
+ "eslint-plugin-prettier": "^4.2.1",
63
+ "eslint-plugin-react": "^7.31.1",
64
+ "eslint-plugin-react-hooks": "^4.6.0",
65
+ "husky": "^8.0.1",
66
+ "jest": "^28.1.3",
67
+ "lint-staged": "^13.0.3",
68
+ "parcel": "^2.7.0",
69
+ "prettier": "^2.7.1",
70
+ "react": "^17.0.0 || ^18.0.0",
71
+ "rimraf": "^3.0.2",
72
+ "sanity": "3.0.0-dev-preview.15",
73
+ "ts-jest": "^28.0.8",
74
+ "typescript": "4.7.4"
23
75
  },
24
76
  "peerDependencies": {
25
- "prop-types": "^15.3",
26
- "react": "^16.9 || ^17"
77
+ "react": "^17.0.0 || ^18.0.0",
78
+ "sanity": "dev-preview"
27
79
  },
28
- "author": "Sanity.io <hello@sanity.io>",
29
- "license": "MIT",
30
80
  "bugs": {
31
- "url": "https://github.com/sanity-io/sanity/issues"
32
- },
33
- "homepage": "https://www.sanity.io/",
34
- "repository": {
35
- "type": "git",
36
- "url": "git+https://github.com/sanity-io/sanity.git",
37
- "directory": "packages/@sanity/language-filter"
38
- },
39
- "publishConfig": {
40
- "access": "public"
81
+ "url": "https://github.com/sanity-io/language-filter/issues"
41
82
  },
42
- "gitHead": "b32b26d2b59bba05c2ae163d251c0b9c01aed401"
83
+ "homepage": "https://github.com/sanity-io/language-filter#readme",
84
+ "sanityPlugin": {
85
+ "verifyPackage": {
86
+ "babelConfig": false
87
+ }
88
+ }
43
89
  }