@sanity/document-internationalization 2.1.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/index.d.mts +90 -0
  2. package/dist/index.d.ts +3 -1
  3. package/dist/index.esm.js +764 -1167
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +749 -1177
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +1043 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/package.json +28 -32
  10. package/src/actions/DeleteMetadataAction.tsx +5 -5
  11. package/src/actions/DeleteTranslationAction.tsx +6 -2
  12. package/src/badges/index.tsx +1 -1
  13. package/src/components/BulkPublish/DocumentCheck.tsx +1 -1
  14. package/src/components/BulkPublish/InfoIcon.tsx +4 -3
  15. package/src/components/BulkPublish/index.tsx +3 -2
  16. package/src/components/ConstrainedBox.tsx +1 -1
  17. package/src/components/DeleteTranslationDialog/index.tsx +1 -1
  18. package/src/components/DeleteTranslationDialog/separateReferences.ts +1 -1
  19. package/src/components/DocumentInternationalizationContext.tsx +2 -2
  20. package/src/components/DocumentInternationalizationMenu.tsx +3 -2
  21. package/src/components/LanguageManage.tsx +1 -0
  22. package/src/components/LanguageOption.tsx +4 -2
  23. package/src/components/LanguagePatch.tsx +2 -2
  24. package/src/components/OptimisticallyStrengthen/ReferencePatcher.tsx +2 -2
  25. package/src/components/OptimisticallyStrengthen/index.tsx +1 -1
  26. package/src/components/Warning.tsx +1 -1
  27. package/src/constants.ts +1 -1
  28. package/src/hooks/useLanguageMetadata.tsx +1 -1
  29. package/src/hooks/useOpenInNewPane.tsx +2 -2
  30. package/src/plugin.tsx +4 -4
  31. package/src/schema/translation/metadata.ts +2 -4
  32. package/src/utils/createReference.ts +1 -1
  33. package/src/utils/excludePaths.ts +4 -4
  34. package/dist/index.cjs.mjs +0 -7
package/dist/index.esm.js CHANGED
@@ -1,281 +1,180 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { TrashIcon, CogIcon, SplitVerticalIcon, CheckmarkIcon, AddIcon, EditIcon, TranslateIcon, InfoOutlineIcon } from '@sanity/icons';
3
- import { Flex, Spinner, Stack, Text, Card, Grid, Button, useToast, Tooltip, Box, Badge, useClickOutside, TextInput, Popover, Inline, Dialog } from '@sanity/ui';
4
- import { useMemo, useEffect, createContext, useContext, useState, useCallback } from 'react';
5
- import { useSchema, Preview, useClient, useWorkspace, isDocumentSchemaType, pathToString, useEditState, useValidationStatus, TextWithTone, PatchEvent, unset, defineType, defineField, definePlugin, isSanityDocument } from 'sanity';
6
- import { Feedback, useListeningQuery } from 'sanity-plugin-utils';
7
- import { uuid } from '@sanity/uuid';
8
- import { usePaneRouter, useDocumentPane } from 'sanity/desk';
9
- import { RouterContext } from 'sanity/router';
10
- import { Mutation, extractWithPath } from '@sanity/mutator';
11
- import styled from 'styled-components';
12
- import { internationalizedArray } from 'sanity-plugin-internationalized-array';
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { TrashIcon, CogIcon, SplitVerticalIcon, CheckmarkIcon, AddIcon, EditIcon, TranslateIcon, InfoOutlineIcon } from "@sanity/icons";
3
+ import { Flex, Spinner, Stack, Text, Card, Grid, Button, useToast, Tooltip, Box, Badge, useClickOutside, TextInput, Popover, Inline, Dialog } from "@sanity/ui";
4
+ import { useMemo, useEffect, createContext, useContext, useState, useCallback } from "react";
5
+ import { useSchema, Preview, useClient, useWorkspace, isDocumentSchemaType, pathToString, useEditState, useValidationStatus, TextWithTone, PatchEvent, unset, defineType, defineField, definePlugin, isSanityDocument } from "sanity";
6
+ import { Feedback, useListeningQuery } from "sanity-plugin-utils";
7
+ import { uuid } from "@sanity/uuid";
8
+ import { RouterContext } from "sanity/router";
9
+ import { usePaneRouter, useDocumentPane } from "sanity/structure";
10
+ import { Mutation, extractWithPath } from "@sanity/mutator";
11
+ import { styled } from "styled-components";
12
+ import { internationalizedArray } from "sanity-plugin-internationalized-array";
13
13
  function DocumentPreview(props) {
14
- const schema = useSchema();
15
- const schemaType = schema.get(props.type);
16
- if (!schemaType) {
17
- return /* @__PURE__ */jsx(Feedback, {
18
- tone: "critical",
19
- title: "Schema type not found"
20
- });
21
- }
22
- return /* @__PURE__ */jsx(Preview, {
23
- value: props.value,
24
- schemaType
25
- });
14
+ const schemaType = useSchema().get(props.type);
15
+ return schemaType ? /* @__PURE__ */ jsx(Preview, { value: props.value, schemaType }) : /* @__PURE__ */ jsx(Feedback, { tone: "critical", title: "Schema type not found" });
26
16
  }
27
- const METADATA_SCHEMA_NAME = "translation.metadata";
28
- const TRANSLATIONS_ARRAY_NAME = "translations";
29
- const API_VERSION = "2023-05-22";
30
- const DEFAULT_CONFIG = {
17
+ const METADATA_SCHEMA_NAME = "translation.metadata", TRANSLATIONS_ARRAY_NAME = "translations", API_VERSION = "2023-05-22", DEFAULT_CONFIG = {
31
18
  supportedLanguages: [],
32
19
  schemaTypes: [],
33
20
  languageField: "language",
34
- weakReferences: false,
35
- bulkPublish: false,
21
+ weakReferences: !1,
22
+ bulkPublish: !1,
36
23
  metadataFields: [],
37
24
  apiVersion: API_VERSION
38
25
  };
39
- function separateReferences() {
40
- let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
41
- const translations = [];
42
- const otherReferences = [];
43
- if (data && data.length > 0) {
44
- data.forEach(doc => {
45
- if (doc._type === METADATA_SCHEMA_NAME) {
46
- translations.push(doc);
47
- } else {
48
- otherReferences.push(doc);
49
- }
50
- });
51
- }
52
- return {
53
- translations,
54
- otherReferences
55
- };
26
+ function separateReferences(data = []) {
27
+ const translations = [], otherReferences = [];
28
+ return data && data.length > 0 && data.forEach((doc) => {
29
+ doc._type === METADATA_SCHEMA_NAME ? translations.push(doc) : otherReferences.push(doc);
30
+ }), { translations, otherReferences };
56
31
  }
57
32
  function DeleteTranslationDialog(props) {
58
- const {
59
- doc,
60
- documentId,
61
- setTranslations
62
- } = props;
63
- const {
64
- data,
65
- loading
66
- } = useListeningQuery("*[references($id)]{_id, _type}", {
67
- params: {
68
- id: documentId
69
- },
70
- initialValue: []
71
- });
72
- const {
73
- translations,
74
- otherReferences
75
- } = useMemo(() => separateReferences(data), [data]);
76
- useEffect(() => {
33
+ const { doc, documentId, setTranslations } = props, { data, loading } = useListeningQuery(
34
+ "*[references($id)]{_id, _type}",
35
+ { params: { id: documentId }, initialValue: [] }
36
+ ), { translations, otherReferences } = useMemo(
37
+ () => separateReferences(data),
38
+ [data]
39
+ );
40
+ return useEffect(() => {
77
41
  setTranslations(translations);
78
- }, [setTranslations, translations]);
79
- if (loading) {
80
- return /* @__PURE__ */jsx(Flex, {
81
- padding: 4,
82
- align: "center",
83
- justify: "center",
84
- children: /* @__PURE__ */jsx(Spinner, {})
85
- });
86
- }
87
- return /* @__PURE__ */jsxs(Stack, {
88
- space: 4,
89
- children: [translations && translations.length > 0 ? /* @__PURE__ */jsx(Text, {
90
- children: "This document is a language-specific version which other translations depend on."
91
- }) : /* @__PURE__ */jsx(Text, {
92
- children: "This document does not have connected translations."
93
- }), /* @__PURE__ */jsx(Card, {
94
- border: true,
95
- padding: 3,
96
- children: /* @__PURE__ */jsxs(Stack, {
97
- space: 4,
98
- children: [/* @__PURE__ */jsx(Text, {
99
- size: 1,
100
- weight: "semibold",
101
- children: translations && translations.length > 0 ? /* @__PURE__ */jsx(Fragment, {
102
- children: "Before this document can be deleted"
103
- }) : /* @__PURE__ */jsx(Fragment, {
104
- children: "This document can now be deleted"
105
- })
106
- }), /* @__PURE__ */jsx(DocumentPreview, {
107
- value: doc,
108
- type: doc._type
109
- }), translations && translations.length > 0 ? /* @__PURE__ */jsxs(Fragment, {
110
- children: [/* @__PURE__ */jsx(Card, {
111
- borderTop: true
112
- }), /* @__PURE__ */jsxs(Text, {
113
- size: 1,
114
- weight: "semibold",
115
- children: ["The reference in", " ", translations.length === 1 ? "this translations document" : "these translations documents", " ", "must be removed"]
116
- }), translations.map(translation => /* @__PURE__ */jsx(DocumentPreview, {
42
+ }, [setTranslations, translations]), loading ? /* @__PURE__ */ jsx(Flex, { padding: 4, align: "center", justify: "center", children: /* @__PURE__ */ jsx(Spinner, {}) }) : /* @__PURE__ */ jsxs(Stack, { space: 4, children: [
43
+ translations && translations.length > 0 ? /* @__PURE__ */ jsx(Text, { children: "This document is a language-specific version which other translations depend on." }) : /* @__PURE__ */ jsx(Text, { children: "This document does not have connected translations." }),
44
+ /* @__PURE__ */ jsx(Card, { border: !0, padding: 3, children: /* @__PURE__ */ jsxs(Stack, { space: 4, children: [
45
+ /* @__PURE__ */ jsx(Text, { size: 1, weight: "semibold", children: translations && translations.length > 0 ? /* @__PURE__ */ jsx(Fragment, { children: "Before this document can be deleted" }) : /* @__PURE__ */ jsx(Fragment, { children: "This document can now be deleted" }) }),
46
+ /* @__PURE__ */ jsx(DocumentPreview, { value: doc, type: doc._type }),
47
+ translations && translations.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
48
+ /* @__PURE__ */ jsx(Card, { borderTop: !0 }),
49
+ /* @__PURE__ */ jsxs(Text, { size: 1, weight: "semibold", children: [
50
+ "The reference in",
51
+ " ",
52
+ translations.length === 1 ? "this translations document" : "these translations documents",
53
+ " ",
54
+ "must be removed"
55
+ ] }),
56
+ translations.map((translation) => /* @__PURE__ */ jsx(
57
+ DocumentPreview,
58
+ {
117
59
  value: translation,
118
60
  type: translation._type
119
- }, translation._id))]
120
- }) : null, otherReferences && otherReferences.length > 0 ? /* @__PURE__ */jsxs(Fragment, {
121
- children: [/* @__PURE__ */jsx(Card, {
122
- borderTop: true
123
- }), /* @__PURE__ */jsxs(Text, {
124
- size: 1,
125
- weight: "semibold",
126
- children: [otherReferences.length === 1 ? "There is an additional reference" : "There are additional references", " ", "to this document"]
127
- }), otherReferences.map(reference => /* @__PURE__ */jsx(DocumentPreview, {
61
+ },
62
+ translation._id
63
+ ))
64
+ ] }) : null,
65
+ otherReferences && otherReferences.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
66
+ /* @__PURE__ */ jsx(Card, { borderTop: !0 }),
67
+ /* @__PURE__ */ jsxs(Text, { size: 1, weight: "semibold", children: [
68
+ otherReferences.length === 1 ? "There is an additional reference" : "There are additional references",
69
+ " ",
70
+ "to this document"
71
+ ] }),
72
+ otherReferences.map((reference) => /* @__PURE__ */ jsx(
73
+ DocumentPreview,
74
+ {
128
75
  value: reference,
129
76
  type: reference._type
130
- }, reference._id))]
131
- }) : null]
132
- })
133
- }), otherReferences.length === 0 ? /* @__PURE__ */jsx(Text, {
134
- children: "This document has no other references."
135
- }) : /* @__PURE__ */jsx(Text, {
136
- children: "You may not be able to delete this document because other documents refer to it."
137
- })]
138
- });
77
+ },
78
+ reference._id
79
+ ))
80
+ ] }) : null
81
+ ] }) }),
82
+ otherReferences.length === 0 ? /* @__PURE__ */ jsx(Text, { children: "This document has no other references." }) : /* @__PURE__ */ jsx(Text, { children: "You may not be able to delete this document because other documents refer to it." })
83
+ ] });
139
84
  }
140
85
  function DeleteTranslationFooter(props) {
141
- const {
142
- translations,
143
- onClose,
144
- onProceed
145
- } = props;
146
- return /* @__PURE__ */jsxs(Grid, {
147
- columns: 2,
148
- gap: 2,
149
- children: [/* @__PURE__ */jsx(Button, {
150
- text: "Cancel",
151
- onClick: onClose,
152
- mode: "ghost"
153
- }), /* @__PURE__ */jsx(Button, {
154
- text: translations && translations.length > 0 ? "Unset translation reference" : "Delete document",
155
- onClick: onProceed,
156
- tone: "critical"
157
- })]
158
- });
86
+ const { translations, onClose, onProceed } = props;
87
+ return /* @__PURE__ */ jsxs(Grid, { columns: 2, gap: 2, children: [
88
+ /* @__PURE__ */ jsx(Button, { text: "Cancel", onClick: onClose, mode: "ghost" }),
89
+ /* @__PURE__ */ jsx(
90
+ Button,
91
+ {
92
+ text: translations && translations.length > 0 ? "Unset translation reference" : "Delete document",
93
+ onClick: onProceed,
94
+ tone: "critical"
95
+ }
96
+ )
97
+ ] });
159
98
  }
160
- function shallowEqualArrays(arrA, arrB) {
161
- let equal = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : (a, b) => a === b;
162
- if (arrA === arrB) return true;
163
- if (!arrA || !arrB) return false;
99
+ const isPromise = (promise) => typeof promise == "object" && typeof promise.then == "function", globalCache = [];
100
+ function shallowEqualArrays(arrA, arrB, equal = (a, b) => a === b) {
101
+ if (arrA === arrB)
102
+ return !0;
103
+ if (!arrA || !arrB)
104
+ return !1;
164
105
  const len = arrA.length;
165
- if (arrB.length !== len) return false;
166
- for (let i = 0; i < len; i++) if (!equal(arrA[i], arrB[i])) return false;
167
- return true;
106
+ if (arrB.length !== len)
107
+ return !1;
108
+ for (let i = 0; i < len; i++)
109
+ if (!equal(arrA[i], arrB[i]))
110
+ return !1;
111
+ return !0;
168
112
  }
169
- const globalCache = [];
170
- function query$1(fn, keys) {
171
- let preload = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
172
- let config = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
173
- for (const entry of globalCache) {
174
- // Find a match
175
- if (shallowEqualArrays(keys, entry.keys, entry.equal)) {
176
- // If we're pre-loading and the element is present, just return
177
- if (preload) return undefined; // If an error occurred, throw
178
-
179
- if (Object.prototype.hasOwnProperty.call(entry, 'error')) throw entry.error; // If a response was successful, return
180
-
181
- if (Object.prototype.hasOwnProperty.call(entry, 'response')) return entry.response; // If the promise is still unresolved, throw
182
-
183
- if (!preload) throw entry.promise;
113
+ function query$1(fn, keys = null, preload = !1, config = {}) {
114
+ keys === null && (keys = [fn]);
115
+ for (const entry2 of globalCache)
116
+ if (shallowEqualArrays(keys, entry2.keys, entry2.equal)) {
117
+ if (preload)
118
+ return;
119
+ if (Object.prototype.hasOwnProperty.call(entry2, "error"))
120
+ throw entry2.error;
121
+ if (Object.prototype.hasOwnProperty.call(entry2, "response"))
122
+ return config.lifespan && config.lifespan > 0 && (entry2.timeout && clearTimeout(entry2.timeout), entry2.timeout = setTimeout(entry2.remove, config.lifespan)), entry2.response;
123
+ if (!preload)
124
+ throw entry2.promise;
184
125
  }
185
- } // The request is new or has changed.
186
-
187
126
  const entry = {
188
127
  keys,
189
128
  equal: config.equal,
190
- promise:
191
- // Execute the promise
192
- fn(...keys) // When it resolves, store its value
193
- .then(response => entry.response = response) // Remove the entry if a lifespan was given
194
- .then(() => {
195
- if (config.lifespan && config.lifespan > 0) {
196
- setTimeout(() => {
197
- const index = globalCache.indexOf(entry);
198
- if (index !== -1) globalCache.splice(index, 1);
199
- }, config.lifespan);
200
- }
201
- }) // Store caught errors, they will be thrown in the render-phase to bubble into an error-bound
202
- .catch(error => entry.error = error)
203
- }; // Register the entry
204
-
205
- globalCache.push(entry); // And throw the promise, this yields control back to React
206
-
207
- if (!preload) throw entry.promise;
208
- return undefined;
129
+ remove: () => {
130
+ const index = globalCache.indexOf(entry);
131
+ index !== -1 && globalCache.splice(index, 1);
132
+ },
133
+ promise: (
134
+ // Execute the promise
135
+ (isPromise(fn) ? fn : fn(...keys)).then((response) => {
136
+ entry.response = response, config.lifespan && config.lifespan > 0 && (entry.timeout = setTimeout(entry.remove, config.lifespan));
137
+ }).catch((error) => entry.error = error)
138
+ )
139
+ };
140
+ if (globalCache.push(entry), !preload)
141
+ throw entry.promise;
209
142
  }
210
- const suspend = (fn, keys, config) => query$1(fn, keys, false, config);
211
- const DocumentInternationalizationContext = createContext(DEFAULT_CONFIG);
143
+ const suspend = (fn, keys, config) => query$1(fn, keys, !1, config), DocumentInternationalizationContext = createContext(DEFAULT_CONFIG);
212
144
  function useDocumentInternationalizationContext() {
213
145
  return useContext(DocumentInternationalizationContext);
214
146
  }
215
147
  function DocumentInternationalizationProvider(props) {
216
- const {
217
- pluginConfig
218
- } = props;
219
- const client = useClient({
220
- apiVersion: pluginConfig.apiVersion
221
- });
222
- const workspace = useWorkspace();
223
- const supportedLanguages = Array.isArray(pluginConfig.supportedLanguages) ? pluginConfig.supportedLanguages :
224
- // eslint-disable-next-line require-await
225
- suspend(async () => {
226
- if (typeof pluginConfig.supportedLanguages === "function") {
227
- return pluginConfig.supportedLanguages(client);
148
+ const { pluginConfig } = props, client = useClient({ apiVersion: pluginConfig.apiVersion }), workspace = useWorkspace(), supportedLanguages = Array.isArray(pluginConfig.supportedLanguages) ? pluginConfig.supportedLanguages : (
149
+ // eslint-disable-next-line require-await
150
+ suspend(async () => typeof pluginConfig.supportedLanguages == "function" ? pluginConfig.supportedLanguages(client) : pluginConfig.supportedLanguages, [workspace])
151
+ );
152
+ return /* @__PURE__ */ jsx(
153
+ DocumentInternationalizationContext.Provider,
154
+ {
155
+ value: { ...pluginConfig, supportedLanguages },
156
+ children: props.renderDefault(props)
228
157
  }
229
- return pluginConfig.supportedLanguages;
230
- }, [workspace]);
231
- return /* @__PURE__ */jsx(DocumentInternationalizationContext.Provider, {
232
- value: {
233
- ...pluginConfig,
234
- supportedLanguages
235
- },
236
- children: props.renderDefault(props)
237
- });
158
+ );
238
159
  }
239
- const DeleteTranslationAction = props => {
240
- const {
241
- id: documentId,
242
- published,
243
- draft
244
- } = props;
245
- const doc = draft || published;
246
- const {
247
- languageField
248
- } = useDocumentInternationalizationContext();
249
- const [isDialogOpen, setDialogOpen] = useState(false);
250
- const [translations, setTranslations] = useState([]);
251
- const onClose = useCallback(() => setDialogOpen(false), []);
252
- const documentLanguage = doc ? doc[languageField] : null;
253
- const toast = useToast();
254
- const client = useClient({
255
- apiVersion: API_VERSION
256
- });
257
- const onProceed = useCallback(() => {
160
+ const DeleteTranslationAction = (props) => {
161
+ const { id: documentId, published, draft } = props, doc = draft || published, { languageField } = useDocumentInternationalizationContext(), [isDialogOpen, setDialogOpen] = useState(!1), [translations, setTranslations] = useState([]), onClose = useCallback(() => setDialogOpen(!1), []), documentLanguage = doc ? doc[languageField] : null, toast = useToast(), client = useClient({ apiVersion: API_VERSION }), onProceed = useCallback(() => {
258
162
  const tx = client.transaction();
259
163
  let operation = "DELETE";
260
- if (documentLanguage && translations.length > 0) {
261
- operation = "UNSET";
262
- translations.forEach(translation => {
263
- tx.patch(translation._id, patch => patch.unset(["".concat(TRANSLATIONS_ARRAY_NAME, '[_key == "').concat(documentLanguage, '"]')]));
264
- });
265
- } else {
266
- tx.delete(documentId);
267
- tx.delete("drafts.".concat(documentId));
268
- }
269
- tx.commit().then(() => {
270
- if (operation === "DELETE") {
271
- onClose();
272
- }
273
- toast.push({
164
+ documentLanguage && translations.length > 0 ? (operation = "UNSET", translations.forEach((translation) => {
165
+ tx.patch(
166
+ translation._id,
167
+ (patch) => patch.unset([
168
+ `${TRANSLATIONS_ARRAY_NAME}[_key == "${documentLanguage}"]`
169
+ ])
170
+ );
171
+ })) : (tx.delete(documentId), tx.delete(`drafts.${documentId}`)), tx.commit().then(() => {
172
+ operation === "DELETE" && onClose(), toast.push({
274
173
  status: "success",
275
174
  title: operation === "UNSET" ? "Translation reference unset" : "Document deleted",
276
175
  description: operation === "UNSET" ? "The document can now be deleted" : null
277
176
  });
278
- }).catch(err => {
177
+ }).catch((err) => {
279
178
  toast.push({
280
179
  status: "error",
281
180
  title: operation === "unset" ? "Failed to unset translation reference" : "Failed to delete document",
@@ -289,153 +188,123 @@ const DeleteTranslationAction = props => {
289
188
  icon: TrashIcon,
290
189
  tone: "critical",
291
190
  onHandle: () => {
292
- setDialogOpen(true);
191
+ setDialogOpen(!0);
293
192
  },
294
193
  dialog: isDialogOpen && {
295
194
  type: "dialog",
296
195
  onClose,
297
196
  header: "Delete translation",
298
- content: doc ? /* @__PURE__ */jsx(DeleteTranslationDialog, {
299
- doc,
300
- documentId,
301
- setTranslations
302
- }) : null,
303
- footer: /* @__PURE__ */jsx(DeleteTranslationFooter, {
304
- onClose,
305
- onProceed,
306
- translations
307
- })
197
+ content: doc ? /* @__PURE__ */ jsx(
198
+ DeleteTranslationDialog,
199
+ {
200
+ doc,
201
+ documentId,
202
+ setTranslations
203
+ }
204
+ ) : null,
205
+ footer: /* @__PURE__ */ jsx(
206
+ DeleteTranslationFooter,
207
+ {
208
+ onClose,
209
+ onProceed,
210
+ translations
211
+ }
212
+ )
308
213
  }
309
214
  };
310
- };
311
- const query = "*[_type == $translationSchema && $id in translations[].value._ref]{\n _id,\n _createdAt,\n translations\n}";
215
+ }, query = `*[_type == $translationSchema && $id in translations[].value._ref]{
216
+ _id,
217
+ _createdAt,
218
+ translations
219
+ }`;
312
220
  function useTranslationMetadata(id) {
313
- const {
314
- data,
315
- loading,
316
- error
317
- } = useListeningQuery(query, {
318
- params: {
319
- id,
320
- translationSchema: METADATA_SCHEMA_NAME
321
- }
221
+ const { data, loading, error } = useListeningQuery(query, {
222
+ params: { id, translationSchema: METADATA_SCHEMA_NAME }
322
223
  });
323
- return {
324
- data,
325
- loading,
326
- error
327
- };
224
+ return { data, loading, error };
328
225
  }
329
226
  function useOpenInNewPane(id, type) {
330
- const routerContext = useContext(RouterContext);
331
- const {
332
- routerPanesState,
333
- groupIndex
334
- } = usePaneRouter();
335
- const openInNewPane = useCallback(() => {
336
- if (!routerContext || !id || !type) {
227
+ const routerContext = useContext(RouterContext), { routerPanesState, groupIndex } = usePaneRouter();
228
+ return useCallback(() => {
229
+ if (!routerContext || !id || !type)
337
230
  return;
338
- }
339
231
  if (!routerPanesState.length) {
340
- routerContext.navigateIntent("edit", {
341
- id,
342
- type
343
- });
232
+ routerContext.navigateIntent("edit", { id, type });
344
233
  return;
345
234
  }
346
235
  const panes = [...routerPanesState];
347
- panes.splice(groupIndex + 1, 0, [{
348
- id,
349
- params: {
350
- type
236
+ panes.splice(groupIndex + 1, 0, [
237
+ {
238
+ id,
239
+ params: { type }
351
240
  }
352
- }]);
353
- const href = routerContext.resolvePathFromState({
354
- panes
355
- });
356
- routerContext.navigateUrl({
357
- path: href
358
- });
241
+ ]);
242
+ const href = routerContext.resolvePathFromState({ panes });
243
+ routerContext.navigateUrl({ path: href });
359
244
  }, [id, type, routerContext, routerPanesState, groupIndex]);
360
- return openInNewPane;
361
245
  }
362
246
  function LanguageManage(props) {
363
- const {
364
- id
365
- } = props;
366
- const open = useOpenInNewPane(id, METADATA_SCHEMA_NAME);
367
- return /* @__PURE__ */jsx(Tooltip, {
368
- content: id ? null : /* @__PURE__ */jsx(Box, {
369
- padding: 2,
370
- children: /* @__PURE__ */jsx(Text, {
371
- muted: true,
372
- size: 1,
373
- children: "Document has no other translations"
374
- })
375
- }),
376
- fallbackPlacements: ["right", "left"],
377
- placement: "top",
378
- portal: true,
379
- children: /* @__PURE__ */jsx(Stack, {
380
- children: /* @__PURE__ */jsx(Button, {
381
- disabled: !id,
382
- mode: "ghost",
383
- text: "Manage Translations",
384
- icon: CogIcon,
385
- onClick: () => open()
386
- })
387
- })
388
- });
247
+ const { id } = props, open = useOpenInNewPane(id, METADATA_SCHEMA_NAME);
248
+ return /* @__PURE__ */ jsx(
249
+ Tooltip,
250
+ {
251
+ animate: !0,
252
+ content: id ? null : /* @__PURE__ */ jsx(Box, { padding: 2, children: /* @__PURE__ */ jsx(Text, { muted: !0, size: 1, children: "Document has no other translations" }) }),
253
+ fallbackPlacements: ["right", "left"],
254
+ placement: "top",
255
+ portal: !0,
256
+ children: /* @__PURE__ */ jsx(Stack, { children: /* @__PURE__ */ jsx(
257
+ Button,
258
+ {
259
+ disabled: !id,
260
+ mode: "ghost",
261
+ text: "Manage Translations",
262
+ icon: CogIcon,
263
+ onClick: () => open()
264
+ }
265
+ ) })
266
+ }
267
+ );
389
268
  }
390
- function createReference(key, ref, type) {
391
- let strengthenOnPublish = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
269
+ function createReference(key, ref, type, strengthenOnPublish = !0) {
392
270
  return {
393
271
  _key: key,
394
272
  _type: "internationalizedArrayReferenceValue",
395
273
  value: {
396
274
  _type: "reference",
397
275
  _ref: ref,
398
- _weak: true,
276
+ _weak: !0,
399
277
  // If the user has configured weakReferences, we won't want to strengthen them
400
- ...(strengthenOnPublish ? {
401
- _strengthenOnPublish: {
402
- type
403
- }
404
- } : {})
278
+ ...strengthenOnPublish ? { _strengthenOnPublish: { type } } : {}
405
279
  }
406
280
  };
407
281
  }
408
282
  function removeExcludedPaths(doc, schemaType) {
409
- if (!isDocumentSchemaType(schemaType) || !doc) {
283
+ if (!isDocumentSchemaType(schemaType) || !doc)
410
284
  return doc;
411
- }
412
- const pathsToExclude = extractPaths(doc, schemaType, []).filter(field => {
413
- var _a, _b, _c;
414
- return ((_c = (_b = (_a = field.schemaType) == null ? void 0 : _a.options) == null ? void 0 : _b.documentInternationalization) == null ? void 0 : _c.exclude) === true;
415
- }).map(field => {
416
- return pathToString(field.path);
417
- });
418
- const mut = new Mutation({
419
- mutations: [{
420
- patch: {
421
- id: doc._id,
422
- unset: pathsToExclude
285
+ const pathsToExclude = extractPaths(doc, schemaType, []).filter(
286
+ (field) => {
287
+ var _a, _b, _c;
288
+ return ((_c = (_b = (_a = field.schemaType) == null ? void 0 : _a.options) == null ? void 0 : _b.documentInternationalization) == null ? void 0 : _c.exclude) === !0;
289
+ }
290
+ ).map((field) => pathToString(field.path));
291
+ return new Mutation({
292
+ mutations: [
293
+ {
294
+ patch: {
295
+ id: doc._id,
296
+ unset: pathsToExclude
297
+ }
423
298
  }
424
- }]
425
- });
426
- return mut.apply(doc);
299
+ ]
300
+ }).apply(doc);
427
301
  }
428
302
  function extractPaths(doc, schemaType, path) {
429
303
  return schemaType.fields.reduce((acc, field) => {
430
304
  var _a, _b;
431
- const fieldPath = [...path, field.name];
432
- const fieldSchema = field.type;
433
- const {
434
- value
435
- } = (_a = extractWithPath(pathToString(fieldPath), doc)[0]) != null ? _a : {};
436
- if (!value) {
305
+ const fieldPath = [...path, field.name], fieldSchema = field.type, { value } = (_a = extractWithPath(pathToString(fieldPath), doc)[0]) != null ? _a : {};
306
+ if (!value)
437
307
  return acc;
438
- }
439
308
  const thisFieldWithPath = {
440
309
  path: fieldPath,
441
310
  name: field.name,
@@ -445,23 +314,19 @@ function extractPaths(doc, schemaType, path) {
445
314
  if (fieldSchema.jsonType === "object") {
446
315
  const innerFields = extractPaths(doc, fieldSchema, fieldPath);
447
316
  return [...acc, thisFieldWithPath, ...innerFields];
448
- } else if (fieldSchema.jsonType === "array" && fieldSchema.of.length && fieldSchema.of.some(item => "fields" in item)) {
449
- const {
450
- value: arrayValue
451
- } = (_b = extractWithPath(pathToString(fieldPath), doc)[0]) != null ? _b : {};
317
+ } else if (fieldSchema.jsonType === "array" && fieldSchema.of.length && fieldSchema.of.some((item) => "fields" in item)) {
318
+ const { value: arrayValue } = (_b = extractWithPath(pathToString(fieldPath), doc)[0]) != null ? _b : {};
452
319
  let arrayPaths = [];
453
- if (arrayValue == null ? void 0 : arrayValue.length) {
320
+ if (arrayValue != null && arrayValue.length)
454
321
  for (const item of arrayValue) {
455
- const itemPath = [...fieldPath, {
456
- _key: item._key
457
- }];
458
- let itemSchema = fieldSchema.of.find(t => t.name === item._type);
459
- if (!item._type) {
460
- itemSchema = fieldSchema.of[0];
461
- }
462
- if (item._key && itemSchema) {
463
- const innerFields = extractPaths(doc, itemSchema, itemPath);
464
- const arrayMember = {
322
+ const itemPath = [...fieldPath, { _key: item._key }];
323
+ let itemSchema = fieldSchema.of.find((t) => t.name === item._type);
324
+ if (item._type || (itemSchema = fieldSchema.of[0]), item._key && itemSchema) {
325
+ const innerFields = extractPaths(
326
+ doc,
327
+ itemSchema,
328
+ itemPath
329
+ ), arrayMember = {
465
330
  path: itemPath,
466
331
  name: item._key,
467
332
  schemaType: itemSchema,
@@ -470,7 +335,6 @@ function extractPaths(doc, schemaType, path) {
470
335
  arrayPaths = [...arrayPaths, arrayMember, ...innerFields];
471
336
  }
472
337
  }
473
- }
474
338
  return [...acc, thisFieldWithPath, ...arrayPaths];
475
339
  }
476
340
  return [...acc, thisFieldWithPath];
@@ -485,376 +349,253 @@ function LanguageOption(props) {
485
349
  current,
486
350
  source,
487
351
  sourceLanguageId,
488
- metadata,
352
+ metadata: metadata2,
489
353
  metadataId
490
- } = props;
491
- const disabled = props.disabled || current || !source || !sourceLanguageId || !metadataId;
492
- const translation = (metadata == null ? void 0 : metadata.translations.length) ? metadata.translations.find(t => t._key === language.id) : void 0;
493
- const {
494
- apiVersion,
495
- languageField,
496
- weakReferences
497
- } = useDocumentInternationalizationContext();
498
- const client = useClient({
499
- apiVersion
500
- });
501
- const toast = useToast();
502
- const open = useOpenInNewPane((_a = translation == null ? void 0 : translation.value) == null ? void 0 : _a._ref, schemaType.name);
503
- const handleOpen = useCallback(() => open(), [open]);
504
- const handleCreate = useCallback(async () => {
505
- if (!source) {
354
+ } = props, disabled = props.disabled || current || !source || !sourceLanguageId || !metadataId, translation = metadata2 != null && metadata2.translations.length ? metadata2.translations.find((t) => t._key === language.id) : void 0, { apiVersion, languageField, weakReferences } = useDocumentInternationalizationContext(), client = useClient({ apiVersion }), toast = useToast(), open = useOpenInNewPane((_a = translation == null ? void 0 : translation.value) == null ? void 0 : _a._ref, schemaType.name), handleOpen = useCallback(() => open(), [open]), handleCreate = useCallback(async () => {
355
+ if (!source)
506
356
  throw new Error("Cannot create translation without source document");
507
- }
508
- if (!sourceLanguageId) {
357
+ if (!sourceLanguageId)
509
358
  throw new Error("Cannot create translation without source language ID");
510
- }
511
- if (!metadataId) {
359
+ if (!metadataId)
512
360
  throw new Error("Cannot create translation without a metadata ID");
513
- }
514
- const transaction = client.transaction();
515
- const newTranslationDocumentId = uuid();
361
+ const transaction = client.transaction(), newTranslationDocumentId = uuid();
516
362
  let newTranslationDocument = {
517
363
  ...source,
518
- _id: "drafts.".concat(newTranslationDocumentId),
364
+ _id: `drafts.${newTranslationDocumentId}`,
519
365
  // 2. Update language of the translation
520
366
  [languageField]: language.id
521
367
  };
522
- newTranslationDocument = removeExcludedPaths(newTranslationDocument, schemaType);
523
- transaction.create(newTranslationDocument);
524
- const sourceReference = createReference(sourceLanguageId, documentId, schemaType.name, !weakReferences);
525
- const newTranslationReference = createReference(language.id, newTranslationDocumentId, schemaType.name, !weakReferences);
526
- const newMetadataDocument = {
368
+ newTranslationDocument = removeExcludedPaths(
369
+ newTranslationDocument,
370
+ schemaType
371
+ ), transaction.create(newTranslationDocument);
372
+ const sourceReference = createReference(
373
+ sourceLanguageId,
374
+ documentId,
375
+ schemaType.name,
376
+ !weakReferences
377
+ ), newTranslationReference = createReference(
378
+ language.id,
379
+ newTranslationDocumentId,
380
+ schemaType.name,
381
+ !weakReferences
382
+ ), newMetadataDocument = {
527
383
  _id: metadataId,
528
384
  _type: METADATA_SCHEMA_NAME,
529
385
  schemaTypes: [schemaType.name],
530
386
  translations: [sourceReference]
531
387
  };
532
388
  transaction.createIfNotExists(newMetadataDocument);
533
- const metadataPatch = client.patch(metadataId).setIfMissing({
534
- translations: [sourceReference]
535
- }).insert("after", "translations[-1]", [newTranslationReference]);
536
- transaction.patch(metadataPatch);
537
- transaction.commit().then(() => {
538
- const metadataExisted = Boolean(metadata == null ? void 0 : metadata._createdAt);
389
+ const metadataPatch = client.patch(metadataId).setIfMissing({ translations: [sourceReference] }).insert("after", "translations[-1]", [newTranslationReference]);
390
+ transaction.patch(metadataPatch), transaction.commit().then(() => {
391
+ const metadataExisted = !!(metadata2 != null && metadata2._createdAt);
539
392
  return toast.push({
540
393
  status: "success",
541
- title: 'Created "'.concat(language.title, '" translation'),
394
+ title: `Created "${language.title}" translation`,
542
395
  description: metadataExisted ? "Updated Translations Metadata" : "Created Translations Metadata"
543
396
  });
544
- }).catch(err => {
545
- console.error(err);
546
- return toast.push({
547
- status: "error",
548
- title: "Error creating translation",
549
- description: err.message
550
- });
551
- });
552
- }, [client, documentId, language.id, language.title, languageField, metadata == null ? void 0 : metadata._createdAt, metadataId, schemaType, source, sourceLanguageId, toast]);
397
+ }).catch((err) => (console.error(err), toast.push({
398
+ status: "error",
399
+ title: "Error creating translation",
400
+ description: err.message
401
+ })));
402
+ }, [
403
+ client,
404
+ documentId,
405
+ language.id,
406
+ language.title,
407
+ languageField,
408
+ metadata2 == null ? void 0 : metadata2._createdAt,
409
+ metadataId,
410
+ schemaType,
411
+ source,
412
+ sourceLanguageId,
413
+ toast,
414
+ weakReferences
415
+ ]);
553
416
  let message;
554
- if (current) {
555
- message = "Current document";
556
- } else if (translation) {
557
- message = "Open ".concat(language.title, " translation");
558
- } else if (!translation) {
559
- message = "Create new ".concat(language.title, " translation");
560
- }
561
- return /* @__PURE__ */jsx(Tooltip, {
562
- content: /* @__PURE__ */jsx(Box, {
563
- padding: 2,
564
- children: /* @__PURE__ */jsx(Text, {
565
- muted: true,
566
- size: 1,
567
- children: message
568
- })
569
- }),
570
- fallbackPlacements: ["right", "left"],
571
- placement: "top",
572
- portal: true,
573
- children: /* @__PURE__ */jsx(Button, {
574
- onClick: translation ? handleOpen : handleCreate,
575
- mode: current && disabled ? "default" : "bleed",
576
- disabled,
577
- children: /* @__PURE__ */jsxs(Flex, {
578
- gap: 3,
579
- align: "center",
580
- children: [disabled && !current ? /* @__PURE__ */jsx(Spinner, {}) : /* @__PURE__ */jsx(Text, {
581
- size: 2,
582
- children: translation ? /* @__PURE__ */jsx(SplitVerticalIcon, {}) : current ? /* @__PURE__ */jsx(CheckmarkIcon, {}) : /* @__PURE__ */jsx(AddIcon, {})
583
- }), /* @__PURE__ */jsx(Box, {
584
- flex: 1,
585
- children: /* @__PURE__ */jsx(Text, {
586
- children: language.title
587
- })
588
- }), /* @__PURE__ */jsx(Badge, {
589
- tone: disabled || current ? "default" : "primary",
590
- children: language.id
591
- })]
592
- })
593
- })
594
- });
417
+ return current ? message = "Current document" : translation ? message = `Open ${language.title} translation` : translation || (message = `Create new ${language.title} translation`), /* @__PURE__ */ jsx(
418
+ Tooltip,
419
+ {
420
+ animate: !0,
421
+ content: /* @__PURE__ */ jsx(Box, { padding: 2, children: /* @__PURE__ */ jsx(Text, { muted: !0, size: 1, children: message }) }),
422
+ fallbackPlacements: ["right", "left"],
423
+ placement: "top",
424
+ portal: !0,
425
+ children: /* @__PURE__ */ jsx(
426
+ Button,
427
+ {
428
+ onClick: translation ? handleOpen : handleCreate,
429
+ mode: current && disabled ? "default" : "bleed",
430
+ disabled,
431
+ children: /* @__PURE__ */ jsxs(Flex, { gap: 3, align: "center", children: [
432
+ disabled && !current ? /* @__PURE__ */ jsx(Spinner, {}) : /* @__PURE__ */ jsx(Text, { size: 2, children: translation ? /* @__PURE__ */ jsx(SplitVerticalIcon, {}) : current ? /* @__PURE__ */ jsx(CheckmarkIcon, {}) : /* @__PURE__ */ jsx(AddIcon, {}) }),
433
+ /* @__PURE__ */ jsx(Box, { flex: 1, children: /* @__PURE__ */ jsx(Text, { children: language.title }) }),
434
+ /* @__PURE__ */ jsx(Badge, { tone: disabled || current ? "default" : "primary", children: language.id })
435
+ ] })
436
+ }
437
+ )
438
+ }
439
+ );
595
440
  }
596
441
  function LanguagePatch(props) {
597
- const {
598
- language,
599
- source
600
- } = props;
601
- const {
602
- apiVersion,
603
- languageField
604
- } = useDocumentInternationalizationContext();
605
- const disabled = props.disabled || !source;
606
- const client = useClient({
607
- apiVersion
608
- });
609
- const toast = useToast();
610
- const handleClick = useCallback(() => {
611
- if (!source) {
442
+ const { language, source } = props, { apiVersion, languageField } = useDocumentInternationalizationContext(), disabled = props.disabled || !source, client = useClient({ apiVersion }), toast = useToast(), handleClick = useCallback(() => {
443
+ if (!source)
612
444
  throw new Error("Cannot patch missing document");
613
- }
614
445
  const currentId = source._id;
615
- client.patch(currentId).set({
616
- [languageField]: language.id
617
- }).commit().then(() => {
446
+ client.patch(currentId).set({ [languageField]: language.id }).commit().then(() => {
618
447
  toast.push({
619
- title: "Set document language to ".concat(language.title),
448
+ title: `Set document language to ${language.title}`,
620
449
  status: "success"
621
450
  });
622
- }).catch(err => {
623
- console.error(err);
624
- return toast.push({
625
- title: "Failed to set document language to ".concat(language.title),
626
- status: "error"
627
- });
628
- });
451
+ }).catch((err) => (console.error(err), toast.push({
452
+ title: `Failed to set document language to ${language.title}`,
453
+ status: "error"
454
+ })));
629
455
  }, [source, client, languageField, language, toast]);
630
- return /* @__PURE__ */jsx(Button, {
631
- mode: "bleed",
632
- onClick: handleClick,
633
- disabled,
634
- justify: "flex-start",
635
- children: /* @__PURE__ */jsxs(Flex, {
636
- gap: 3,
637
- align: "center",
638
- children: [/* @__PURE__ */jsx(Text, {
639
- size: 2,
640
- children: /* @__PURE__ */jsx(EditIcon, {})
641
- }), /* @__PURE__ */jsx(Box, {
642
- flex: 1,
643
- children: /* @__PURE__ */jsx(Text, {
644
- children: language.title
645
- })
646
- }), /* @__PURE__ */jsx(Badge, {
647
- children: language.id
648
- })]
649
- })
650
- });
456
+ return /* @__PURE__ */ jsx(
457
+ Button,
458
+ {
459
+ mode: "bleed",
460
+ onClick: handleClick,
461
+ disabled,
462
+ justify: "flex-start",
463
+ children: /* @__PURE__ */ jsxs(Flex, { gap: 3, align: "center", children: [
464
+ /* @__PURE__ */ jsx(Text, { size: 2, children: /* @__PURE__ */ jsx(EditIcon, {}) }),
465
+ /* @__PURE__ */ jsx(Box, { flex: 1, children: /* @__PURE__ */ jsx(Text, { children: language.title }) }),
466
+ /* @__PURE__ */ jsx(Badge, { children: language.id })
467
+ ] })
468
+ }
469
+ );
651
470
  }
652
- var __freeze = Object.freeze;
653
- var __defProp = Object.defineProperty;
654
- var __template = (cooked, raw) => __freeze(__defProp(cooked, "raw", {
655
- value: __freeze(raw || cooked.slice())
656
- }));
657
- var _a;
658
- var ConstrainedBox = styled(Box)(_a || (_a = __template(["\n max-width: 280px;\n"])));
659
- function Warning(_ref) {
660
- let {
661
- children
662
- } = _ref;
663
- return /* @__PURE__ */jsx(Card, {
664
- tone: "caution",
665
- padding: 3,
666
- children: /* @__PURE__ */jsx(Flex, {
667
- justify: "center",
668
- children: /* @__PURE__ */jsx(ConstrainedBox, {
669
- children: /* @__PURE__ */jsx(Text, {
670
- size: 1,
671
- align: "center",
672
- children
673
- })
674
- })
675
- })
676
- });
471
+ var ConstrainedBox = styled(Box)`
472
+ max-width: 280px;
473
+ `;
474
+ function Warning({ children }) {
475
+ return /* @__PURE__ */ jsx(Card, { tone: "caution", padding: 3, children: /* @__PURE__ */ jsx(Flex, { justify: "center", children: /* @__PURE__ */ jsx(ConstrainedBox, { children: /* @__PURE__ */ jsx(Text, { size: 1, align: "center", children }) }) }) });
677
476
  }
678
477
  function DocumentInternationalizationMenu(props) {
679
- const {
680
- documentId
681
- } = props;
682
- const schemaType = props.schemaType;
683
- const {
684
- languageField,
685
- supportedLanguages
686
- } = useDocumentInternationalizationContext();
687
- const [query, setQuery] = useState("");
688
- const handleQuery = useCallback(event => {
689
- if (event.currentTarget.value) {
690
- setQuery(event.currentTarget.value);
691
- } else {
692
- setQuery("");
693
- }
694
- }, []);
695
- const [open, setOpen] = useState(false);
696
- const handleClick = useCallback(() => setOpen(o => !o), []);
697
- const [button, setButton] = useState(null);
698
- const [popover, setPopover] = useState(null);
699
- const handleClickOutside = useCallback(() => setOpen(false), []);
478
+ const { documentId } = props, schemaType = props.schemaType, { languageField, supportedLanguages } = useDocumentInternationalizationContext(), [query2, setQuery] = useState(""), handleQuery = useCallback((event) => {
479
+ event.currentTarget.value ? setQuery(event.currentTarget.value) : setQuery("");
480
+ }, []), [open, setOpen] = useState(!1), handleClick = useCallback(() => setOpen((o) => !o), []), [button, setButton] = useState(null), [popover, setPopover] = useState(null), handleClickOutside = useCallback(() => setOpen(!1), []);
700
481
  useClickOutside(handleClickOutside, [button, popover]);
701
- const {
702
- data,
703
- loading,
704
- error
705
- } = useTranslationMetadata(documentId);
706
- const metadata = Array.isArray(data) && data.length ? data[0] : null;
707
- const metadataId = useMemo(() => {
482
+ const { data, loading, error } = useTranslationMetadata(documentId), metadata2 = Array.isArray(data) && data.length ? data[0] : null, metadataId = useMemo(() => {
708
483
  var _a;
709
- if (loading) {
710
- return null;
711
- }
712
- return (_a = metadata == null ? void 0 : metadata._id) != null ? _a : uuid();
713
- }, [loading, metadata == null ? void 0 : metadata._id]);
714
- const {
715
- draft,
716
- published
717
- } = useEditState(documentId, schemaType.name);
718
- const source = draft || published;
719
- const documentIsInOneMetadataDocument = useMemo(() => {
720
- return Array.isArray(data) && data.length <= 1;
721
- }, [data]);
722
- const sourceLanguageId = source == null ? void 0 : source[languageField];
723
- const sourceLanguageIsValid = supportedLanguages.some(l => l.id === sourceLanguageId);
724
- const allLanguagesAreValid = useMemo(() => {
725
- const valid = supportedLanguages.every(l => l.id && l.title);
726
- if (!valid) {
727
- console.warn('Not all languages are valid. It should be an array of objects with an "id" and "title" property. Or a function that returns an array of objects with an "id" and "title" property.', supportedLanguages);
728
- }
729
- return valid;
730
- }, [supportedLanguages]);
731
- const content = /* @__PURE__ */jsx(Box, {
732
- padding: 1,
733
- children: error ? /* @__PURE__ */jsx(Card, {
734
- tone: "critical",
735
- padding: 1,
736
- children: /* @__PURE__ */jsx(Text, {
737
- children: "There was an error returning translations metadata"
738
- })
739
- }) : /* @__PURE__ */jsxs(Stack, {
740
- space: 1,
741
- children: [/* @__PURE__ */jsx(LanguageManage, {
742
- id: metadata == null ? void 0 : metadata._id
743
- }), supportedLanguages.length > 4 ? /* @__PURE__ */jsx(TextInput, {
484
+ return loading ? null : (_a = metadata2 == null ? void 0 : metadata2._id) != null ? _a : uuid();
485
+ }, [loading, metadata2 == null ? void 0 : metadata2._id]), { draft, published } = useEditState(documentId, schemaType.name), source = draft || published, documentIsInOneMetadataDocument = useMemo(() => Array.isArray(data) && data.length <= 1, [data]), sourceLanguageId = source == null ? void 0 : source[languageField], sourceLanguageIsValid = supportedLanguages.some(
486
+ (l) => l.id === sourceLanguageId
487
+ ), allLanguagesAreValid = useMemo(() => {
488
+ const valid = supportedLanguages.every((l) => l.id && l.title);
489
+ return valid || console.warn(
490
+ 'Not all languages are valid. It should be an array of objects with an "id" and "title" property. Or a function that returns an array of objects with an "id" and "title" property.',
491
+ supportedLanguages
492
+ ), valid;
493
+ }, [supportedLanguages]), content = /* @__PURE__ */ jsx(Box, { padding: 1, children: error ? /* @__PURE__ */ jsx(Card, { tone: "critical", padding: 1, children: /* @__PURE__ */ jsx(Text, { children: "There was an error returning translations metadata" }) }) : /* @__PURE__ */ jsxs(Stack, { space: 1, children: [
494
+ /* @__PURE__ */ jsx(LanguageManage, { id: metadata2 == null ? void 0 : metadata2._id }),
495
+ supportedLanguages.length > 4 ? /* @__PURE__ */ jsx(
496
+ TextInput,
497
+ {
744
498
  onChange: handleQuery,
745
- value: query,
499
+ value: query2,
746
500
  placeholder: "Filter languages"
747
- }) : null, supportedLanguages.length > 0 ? /* @__PURE__ */jsxs(Fragment, {
748
- children: [loading ? null : /* @__PURE__ */jsxs(Fragment, {
749
- children: [data && documentIsInOneMetadataDocument ? null : /* @__PURE__ */jsx(Warning, {
750
- children: "This document has been found in more than one Translations Metadata documents"
751
- }), allLanguagesAreValid ? null : /* @__PURE__ */jsx(Warning, {
752
- children: "Not all language objects are valid. See the console."
753
- }), sourceLanguageId ? null : /* @__PURE__ */jsxs(Warning, {
754
- children: ["Choose a language to apply to", " ", /* @__PURE__ */jsx("strong", {
755
- children: "this Document"
756
- })]
757
- }), sourceLanguageId && !sourceLanguageIsValid ? /* @__PURE__ */jsxs(Warning, {
758
- children: ["Select a supported language. Current language value:", " ", /* @__PURE__ */jsx("code", {
759
- children: sourceLanguageId
760
- })]
761
- }) : null]
762
- }), supportedLanguages.filter(language => {
763
- if (query) {
764
- return language.title.toLowerCase().includes(query.toLowerCase());
765
- }
766
- return true;
767
- }).map(language => {
501
+ }
502
+ ) : null,
503
+ supportedLanguages.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
504
+ loading ? null : /* @__PURE__ */ jsxs(Fragment, { children: [
505
+ data && documentIsInOneMetadataDocument ? null : /* @__PURE__ */ jsx(Warning, { children: "This document has been found in more than one Translations Metadata documents" }),
506
+ allLanguagesAreValid ? null : /* @__PURE__ */ jsx(Warning, { children: "Not all language objects are valid. See the console." }),
507
+ sourceLanguageId ? null : /* @__PURE__ */ jsxs(Warning, { children: [
508
+ "Choose a language to apply to",
509
+ " ",
510
+ /* @__PURE__ */ jsx("strong", { children: "this Document" })
511
+ ] }),
512
+ sourceLanguageId && !sourceLanguageIsValid ? /* @__PURE__ */ jsxs(Warning, { children: [
513
+ "Select a supported language. Current language value:",
514
+ " ",
515
+ /* @__PURE__ */ jsx("code", { children: sourceLanguageId })
516
+ ] }) : null
517
+ ] }),
518
+ supportedLanguages.filter((language) => query2 ? language.title.toLowerCase().includes(query2.toLowerCase()) : !0).map(
519
+ (language) => {
768
520
  var _a;
769
- return !loading && sourceLanguageId && sourceLanguageIsValid ?
770
- // Button to duplicate this document to a new translation
771
- // And either create or update the metadata document
772
- /* @__PURE__ */
773
- jsx(LanguageOption, {
774
- language,
775
- schemaType,
776
- documentId,
777
- disabled: loading || !allLanguagesAreValid,
778
- current: language.id === sourceLanguageId,
779
- metadata,
780
- metadataId,
781
- source,
782
- sourceLanguageId
783
- }, language.id) :
784
- // Button to set a language field on *this* document
785
- /* @__PURE__ */
786
- jsx(LanguagePatch, {
787
- source,
788
- language,
789
- disabled: (_a = loading || !allLanguagesAreValid || (metadata == null ? void 0 : metadata.translations.filter(t => {
790
- var _a2;
791
- return ((_a2 = t == null ? void 0 : t.value) == null ? void 0 : _a2._ref) !== documentId;
792
- }).some(t => t._key === language.id))) != null ? _a : false
793
- }, language.id);
794
- })]
795
- }) : null]
796
- })
797
- });
798
- const issueWithTranslations = !loading && sourceLanguageId && !sourceLanguageIsValid;
799
- if (!documentId) {
800
- return null;
801
- }
802
- if (!schemaType || !schemaType.name) {
803
- return null;
804
- }
805
- return /* @__PURE__ */jsx(Popover, {
806
- constrainSize: true,
807
- content,
808
- open,
809
- portal: true,
810
- ref: setPopover,
811
- overflow: "auto",
812
- tone: "default",
813
- children: /* @__PURE__ */jsx(Button, {
814
- text: "Translations",
815
- mode: "bleed",
816
- disabled: !source,
817
- tone: !source || loading || !issueWithTranslations ? void 0 : "caution",
818
- icon: TranslateIcon,
819
- onClick: handleClick,
820
- ref: setButton,
821
- selected: open
822
- })
823
- });
521
+ return !loading && sourceLanguageId && sourceLanguageIsValid ? (
522
+ // Button to duplicate this document to a new translation
523
+ // And either create or update the metadata document
524
+ /* @__PURE__ */ jsx(
525
+ LanguageOption,
526
+ {
527
+ language,
528
+ schemaType,
529
+ documentId,
530
+ disabled: loading || !allLanguagesAreValid,
531
+ current: language.id === sourceLanguageId,
532
+ metadata: metadata2,
533
+ metadataId,
534
+ source,
535
+ sourceLanguageId
536
+ },
537
+ language.id
538
+ )
539
+ ) : (
540
+ // Button to set a language field on *this* document
541
+ /* @__PURE__ */ jsx(
542
+ LanguagePatch,
543
+ {
544
+ source,
545
+ language,
546
+ disabled: (_a = loading || !allLanguagesAreValid || (metadata2 == null ? void 0 : metadata2.translations.filter((t) => {
547
+ var _a2;
548
+ return ((_a2 = t == null ? void 0 : t.value) == null ? void 0 : _a2._ref) !== documentId;
549
+ }).some((t) => t._key === language.id))) != null ? _a : !1
550
+ },
551
+ language.id
552
+ )
553
+ );
554
+ }
555
+ )
556
+ ] }) : null
557
+ ] }) }), issueWithTranslations = !loading && sourceLanguageId && !sourceLanguageIsValid;
558
+ return !documentId || !schemaType || !schemaType.name ? null : /* @__PURE__ */ jsx(
559
+ Popover,
560
+ {
561
+ animate: !0,
562
+ constrainSize: !0,
563
+ content,
564
+ open,
565
+ portal: !0,
566
+ ref: setPopover,
567
+ overflow: "auto",
568
+ tone: "default",
569
+ children: /* @__PURE__ */ jsx(
570
+ Button,
571
+ {
572
+ text: "Translations",
573
+ mode: "bleed",
574
+ disabled: !source,
575
+ tone: !source || loading || !issueWithTranslations ? void 0 : "caution",
576
+ icon: TranslateIcon,
577
+ onClick: handleClick,
578
+ ref: setButton,
579
+ selected: open
580
+ }
581
+ )
582
+ }
583
+ );
824
584
  }
825
- const DeleteMetadataAction = props => {
826
- const {
827
- id: documentId,
828
- published,
829
- draft,
830
- onComplete
831
- } = props;
832
- const doc = draft || published;
833
- const [isDialogOpen, setDialogOpen] = useState(false);
834
- const onClose = useCallback(() => setDialogOpen(false), []);
835
- const translations = useMemo(() => doc && Array.isArray(doc[TRANSLATIONS_ARRAY_NAME]) ? doc[TRANSLATIONS_ARRAY_NAME] : [], [doc]);
836
- const toast = useToast();
837
- const client = useClient({
838
- apiVersion: API_VERSION
839
- });
840
- const onProceed = useCallback(() => {
585
+ const DeleteMetadataAction = (props) => {
586
+ const { id: documentId, published, draft, onComplete } = props, doc = draft || published, [isDialogOpen, setDialogOpen] = useState(!1), onClose = useCallback(() => setDialogOpen(!1), []), translations = useMemo(
587
+ () => doc && Array.isArray(doc[TRANSLATIONS_ARRAY_NAME]) ? doc[TRANSLATIONS_ARRAY_NAME] : [],
588
+ [doc]
589
+ ), toast = useToast(), client = useClient({ apiVersion: API_VERSION }), onProceed = useCallback(() => {
841
590
  const tx = client.transaction();
842
- tx.patch(documentId, patch => patch.unset([TRANSLATIONS_ARRAY_NAME]));
843
- if (translations.length > 0) {
844
- translations.forEach(translation => {
845
- tx.delete(translation.value._ref);
846
- tx.delete("drafts.".concat(translation.value._ref));
847
- });
848
- }
849
- tx.delete(documentId);
850
- tx.delete("drafts.".concat(documentId));
851
- tx.commit().then(() => {
852
- onClose();
853
- toast.push({
591
+ tx.patch(documentId, (patch) => patch.unset([TRANSLATIONS_ARRAY_NAME])), translations.length > 0 && translations.forEach((translation) => {
592
+ tx.delete(translation.value._ref), tx.delete(`drafts.${translation.value._ref}`);
593
+ }), tx.delete(documentId), tx.delete(`drafts.${documentId}`), tx.commit().then(() => {
594
+ onClose(), toast.push({
854
595
  status: "success",
855
596
  title: "Deleted document and translations"
856
597
  });
857
- }).catch(err => {
598
+ }).catch((err) => {
858
599
  toast.push({
859
600
  status: "error",
860
601
  title: "Failed to delete document and translations",
@@ -868,32 +609,25 @@ const DeleteMetadataAction = props => {
868
609
  icon: TrashIcon,
869
610
  tone: "critical",
870
611
  onHandle: () => {
871
- setDialogOpen(true);
612
+ setDialogOpen(!0);
872
613
  },
873
614
  dialog: isDialogOpen && {
874
615
  type: "confirm",
875
616
  onCancel: onComplete,
876
617
  onConfirm: () => {
877
- onProceed();
878
- onComplete();
618
+ onProceed(), onComplete();
879
619
  },
880
620
  tone: "critical",
881
- message: translations.length === 1 ? "Delete 1 translation and this document" : "Delete all ".concat(translations.length, " translations and this document")
621
+ message: translations.length === 1 ? "Delete 1 translation and this document" : `Delete all ${translations.length} translations and this document`
882
622
  }
883
623
  };
884
624
  };
885
625
  function LanguageBadge(props) {
886
626
  var _a, _b;
887
- const source = (props == null ? void 0 : props.draft) || (props == null ? void 0 : props.published);
888
- const {
889
- languageField,
890
- supportedLanguages
891
- } = useDocumentInternationalizationContext();
892
- const languageId = source == null ? void 0 : source[languageField];
893
- if (!languageId) {
627
+ const source = (props == null ? void 0 : props.draft) || (props == null ? void 0 : props.published), { languageField, supportedLanguages } = useDocumentInternationalizationContext(), languageId = source == null ? void 0 : source[languageField];
628
+ if (!languageId)
894
629
  return null;
895
- }
896
- const language = Array.isArray(supportedLanguages) ? supportedLanguages.find(l => l.id === languageId) : null;
630
+ const language = Array.isArray(supportedLanguages) ? supportedLanguages.find((l) => l.id === languageId) : null;
897
631
  return {
898
632
  label: (_a = language == null ? void 0 : language.id) != null ? _a : String(languageId),
899
633
  title: (_b = language == null ? void 0 : language.title) != null ? _b : void 0,
@@ -908,140 +642,75 @@ function DocumentCheck(props) {
908
642
  removeInvalidId,
909
643
  addDraftId,
910
644
  removeDraftId
911
- } = props;
912
- const editState = useEditState(id, "");
913
- const {
645
+ } = props, editState = useEditState(id, ""), { isValidating, validation } = useValidationStatus(id, ""), schema = useSchema(), validationHasErrors = useMemo(() => !isValidating && validation.length > 0 && validation.some((item) => item.level === "error"), [isValidating, validation]);
646
+ if (useEffect(() => {
647
+ validationHasErrors ? addInvalidId(id) : removeInvalidId(id), editState.draft ? addDraftId(id) : removeDraftId(id), isValidating || onCheckComplete(id);
648
+ }, [
649
+ addDraftId,
650
+ addInvalidId,
651
+ editState.draft,
652
+ id,
914
653
  isValidating,
915
- validation
916
- } = useValidationStatus(id, "");
917
- const schema = useSchema();
918
- const validationHasErrors = useMemo(() => {
919
- return !isValidating && validation.length > 0 && validation.some(item => item.level === "error");
920
- }, [isValidating, validation]);
921
- useEffect(() => {
922
- if (validationHasErrors) {
923
- addInvalidId(id);
924
- } else {
925
- removeInvalidId(id);
926
- }
927
- if (editState.draft) {
928
- addDraftId(id);
929
- } else {
930
- removeDraftId(id);
931
- }
932
- if (!isValidating) {
933
- onCheckComplete(id);
934
- }
935
- }, [addDraftId, addInvalidId, editState.draft, id, isValidating, onCheckComplete, removeDraftId, removeInvalidId, validationHasErrors]);
936
- if (!editState.draft) {
654
+ onCheckComplete,
655
+ removeDraftId,
656
+ removeInvalidId,
657
+ validationHasErrors
658
+ ]), !editState.draft)
937
659
  return null;
938
- }
939
660
  const schemaType = schema.get(editState.draft._type);
940
- return /* @__PURE__ */jsx(Card, {
941
- border: true,
942
- padding: 2,
943
- tone: validationHasErrors ? "critical" : "positive",
944
- children: editState.draft && schemaType ? /* @__PURE__ */jsx(Preview, {
945
- layout: "default",
946
- value: editState.draft,
947
- schemaType
948
- }) : /* @__PURE__ */jsx(Spinner, {})
949
- });
661
+ return /* @__PURE__ */ jsx(
662
+ Card,
663
+ {
664
+ border: !0,
665
+ padding: 2,
666
+ tone: validationHasErrors ? "critical" : "positive",
667
+ children: editState.draft && schemaType ? /* @__PURE__ */ jsx(
668
+ Preview,
669
+ {
670
+ layout: "default",
671
+ value: editState.draft,
672
+ schemaType
673
+ }
674
+ ) : /* @__PURE__ */ jsx(Spinner, {})
675
+ }
676
+ );
950
677
  }
951
678
  function InfoIcon(props) {
952
- const {
953
- text,
954
- icon,
955
- tone,
956
- children
957
- } = props;
958
- const Icon = icon;
959
- return /* @__PURE__ */jsx(Tooltip, {
960
- portal: true,
961
- content: children ? /* @__PURE__ */jsx(Fragment, {
962
- children
963
- }) : /* @__PURE__ */jsx(Box, {
964
- padding: 2,
965
- children: /* @__PURE__ */jsx(Text, {
966
- size: 1,
967
- children: text
968
- })
969
- }),
970
- children: /* @__PURE__ */jsx(TextWithTone, {
971
- tone,
972
- size: 1,
973
- children: /* @__PURE__ */jsx(Icon, {})
974
- })
975
- });
679
+ const { text, icon, tone, children } = props;
680
+ return /* @__PURE__ */ jsx(
681
+ Tooltip,
682
+ {
683
+ animate: !0,
684
+ portal: !0,
685
+ content: children ? /* @__PURE__ */ jsx(Fragment, { children }) : /* @__PURE__ */ jsx(Box, { padding: 2, children: /* @__PURE__ */ jsx(Text, { size: 1, children: text }) }),
686
+ children: /* @__PURE__ */ jsx(TextWithTone, { tone, size: 1, children: /* @__PURE__ */ jsx(icon, {}) })
687
+ }
688
+ );
976
689
  }
977
690
  function Info() {
978
- return /* @__PURE__ */jsx(InfoIcon, {
979
- icon: InfoOutlineIcon,
980
- tone: "primary",
981
- children: /* @__PURE__ */jsxs(Stack, {
982
- padding: 3,
983
- space: 4,
984
- style: {
985
- maxWidth: 250
986
- },
987
- children: [/* @__PURE__ */jsx(Box, {
988
- children: /* @__PURE__ */jsx(Text, {
989
- size: 1,
990
- children: "Bulk publishing uses the Scheduling API."
991
- })
992
- }), /* @__PURE__ */jsx(Box, {
993
- children: /* @__PURE__ */jsx(Text, {
994
- size: 1,
995
- children: "Customized Document Actions in the Studio will not execute. Webhooks will execute."
996
- })
997
- }), /* @__PURE__ */jsx(Box, {
998
- children: /* @__PURE__ */jsx(Text, {
999
- size: 1,
1000
- children: "Validation is checked before rendering the button below, but the Scheduling API will not check for \u2013 or enforce \u2013 validation."
1001
- })
1002
- })]
1003
- })
1004
- });
691
+ return /* @__PURE__ */ jsx(InfoIcon, { icon: InfoOutlineIcon, tone: "primary", children: /* @__PURE__ */ jsxs(Stack, { padding: 3, space: 4, style: { maxWidth: 250 }, children: [
692
+ /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { size: 1, children: "Bulk publishing uses the Scheduling API." }) }),
693
+ /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { size: 1, children: "Customized Document Actions in the Studio will not execute. Webhooks will execute." }) }),
694
+ /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { size: 1, children: "Validation is checked before rendering the button below, but the Scheduling API will not check for \u2013 or enforce \u2013 validation." }) })
695
+ ] }) });
1005
696
  }
1006
697
  function BulkPublish(props) {
1007
- const {
1008
- translations
1009
- } = props;
1010
- const client = useClient({
1011
- apiVersion: API_VERSION
1012
- });
1013
- const {
1014
- projectId,
1015
- dataset
1016
- } = useWorkspace();
1017
- const toast = useToast();
1018
- const [invalidIds, setInvalidIds] = useState(null);
1019
- const [checkedIds, setCheckedIds] = useState([]);
1020
- const onCheckComplete = useCallback(id => {
1021
- setCheckedIds(ids => Array.from( /* @__PURE__ */new Set([...ids, id])));
1022
- }, []);
1023
- const [open, setOpen] = useState(false);
1024
- const onOpen = useCallback(() => setOpen(true), []);
1025
- const onClose = useCallback(() => setOpen(false), []);
1026
- const addInvalidId = useCallback(id => {
1027
- setInvalidIds(ids => ids ? Array.from( /* @__PURE__ */new Set([...ids, id])) : [id]);
1028
- }, []);
1029
- const removeInvalidId = useCallback(id => {
1030
- setInvalidIds(ids => ids ? ids.filter(i => i !== id) : []);
1031
- }, []);
1032
- const [draftIds, setDraftIds] = useState([]);
1033
- const addDraftId = useCallback(id => {
1034
- setDraftIds(ids => Array.from( /* @__PURE__ */new Set([...ids, id])));
1035
- }, []);
1036
- const removeDraftId = useCallback(id => {
1037
- setDraftIds(ids => ids.filter(i => i !== id));
1038
- }, []);
1039
- const handleBulkPublish = useCallback(() => {
1040
- const body = translations.map(translation => ({
698
+ const { translations } = props, client = useClient({ apiVersion: API_VERSION }), { projectId, dataset } = useWorkspace(), toast = useToast(), [invalidIds, setInvalidIds] = useState(null), [checkedIds, setCheckedIds] = useState([]), onCheckComplete = useCallback((id) => {
699
+ setCheckedIds((ids) => Array.from(/* @__PURE__ */ new Set([...ids, id])));
700
+ }, []), [open, setOpen] = useState(!1), onOpen = useCallback(() => setOpen(!0), []), onClose = useCallback(() => setOpen(!1), []), addInvalidId = useCallback((id) => {
701
+ setInvalidIds((ids) => ids ? Array.from(/* @__PURE__ */ new Set([...ids, id])) : [id]);
702
+ }, []), removeInvalidId = useCallback((id) => {
703
+ setInvalidIds((ids) => ids ? ids.filter((i) => i !== id) : []);
704
+ }, []), [draftIds, setDraftIds] = useState([]), addDraftId = useCallback((id) => {
705
+ setDraftIds((ids) => Array.from(/* @__PURE__ */ new Set([...ids, id])));
706
+ }, []), removeDraftId = useCallback((id) => {
707
+ setDraftIds((ids) => ids.filter((i) => i !== id));
708
+ }, []), handleBulkPublish = useCallback(() => {
709
+ const body = translations.map((translation) => ({
1041
710
  documentId: translation.value._ref
1042
711
  }));
1043
712
  client.request({
1044
- uri: "/publish/".concat(projectId, "/").concat(dataset),
713
+ uri: `/publish/${projectId}/${dataset}`,
1045
714
  method: "POST",
1046
715
  body
1047
716
  }).then(() => {
@@ -1050,184 +719,157 @@ function BulkPublish(props) {
1050
719
  title: "Success",
1051
720
  description: "Bulk publish complete"
1052
721
  });
1053
- }).catch(err => {
1054
- console.error(err);
1055
- toast.push({
722
+ }).catch((err) => {
723
+ console.error(err), toast.push({
1056
724
  status: "error",
1057
725
  title: "Error",
1058
726
  description: "Bulk publish failed"
1059
727
  });
1060
728
  });
1061
- }, [translations, client, projectId, dataset, toast]);
1062
- const disabled =
1063
- // Not all documents have been checked
1064
- checkedIds.length !== translations.length ||
1065
- // Some document(s) are invalid
1066
- Boolean(invalidIds && (invalidIds == null ? void 0 : invalidIds.length) > 0) ||
1067
- // No documents are drafts
1068
- !draftIds.length;
1069
- return (translations == null ? void 0 : translations.length) > 0 ? /* @__PURE__ */jsx(Card, {
1070
- padding: 4,
1071
- border: true,
1072
- radius: 2,
1073
- children: /* @__PURE__ */jsxs(Stack, {
1074
- space: 3,
1075
- children: [/* @__PURE__ */jsxs(Inline, {
1076
- space: 3,
1077
- children: [/* @__PURE__ */jsx(Text, {
1078
- weight: "bold",
1079
- size: 1,
1080
- children: "Bulk publishing"
1081
- }), /* @__PURE__ */jsx(Info, {})]
1082
- }), /* @__PURE__ */jsx(Stack, {
1083
- children: /* @__PURE__ */jsx(Button, {
1084
- onClick: onOpen,
1085
- text: "Prepare bulk publishing",
1086
- mode: "ghost"
1087
- })
1088
- }), open && /* @__PURE__ */jsx(Dialog, {
729
+ }, [translations, client, projectId, dataset, toast]), disabled = (
730
+ // Not all documents have been checked
731
+ checkedIds.length !== translations.length || // Some document(s) are invalid
732
+ !!(invalidIds && (invalidIds == null ? void 0 : invalidIds.length) > 0) || // No documents are drafts
733
+ !draftIds.length
734
+ );
735
+ return (translations == null ? void 0 : translations.length) > 0 ? /* @__PURE__ */ jsx(Card, { padding: 4, border: !0, radius: 2, children: /* @__PURE__ */ jsxs(Stack, { space: 3, children: [
736
+ /* @__PURE__ */ jsxs(Inline, { space: 3, children: [
737
+ /* @__PURE__ */ jsx(Text, { weight: "bold", size: 1, children: "Bulk publishing" }),
738
+ /* @__PURE__ */ jsx(Info, {})
739
+ ] }),
740
+ /* @__PURE__ */ jsx(Stack, { children: /* @__PURE__ */ jsx(
741
+ Button,
742
+ {
743
+ onClick: onOpen,
744
+ text: "Prepare bulk publishing",
745
+ mode: "ghost"
746
+ }
747
+ ) }),
748
+ open && /* @__PURE__ */ jsx(
749
+ Dialog,
750
+ {
751
+ animate: !0,
1089
752
  header: "Bulk publishing",
1090
753
  id: "bulk-publish-dialog",
1091
754
  onClose,
1092
755
  zOffset: 1e3,
1093
756
  width: 3,
1094
- children: /* @__PURE__ */jsxs(Stack, {
1095
- space: 4,
1096
- padding: 4,
1097
- children: [draftIds.length > 0 ? /* @__PURE__ */jsxs(Stack, {
1098
- space: 2,
1099
- children: [/* @__PURE__ */jsxs(Text, {
1100
- size: 1,
1101
- children: ["There", " ", draftIds.length === 1 ? "is 1 draft document" : "are ".concat(draftIds.length, " draft documents"), "."]
1102
- }), invalidIds && invalidIds.length > 0 ? /* @__PURE__ */jsxs(TextWithTone, {
1103
- tone: "critical",
1104
- size: 1,
1105
- children: [invalidIds && invalidIds.length === 1 ? "1 draft document has" : "".concat(invalidIds && invalidIds.length, " draft documents have"), " ", "validation issues that must addressed first"]
1106
- }) : /* @__PURE__ */jsx(TextWithTone, {
1107
- tone: "positive",
1108
- size: 1,
1109
- children: "All drafts are valid and can be bulk published"
1110
- })]
1111
- }) : null, /* @__PURE__ */jsx(Stack, {
1112
- space: 1,
1113
- children: translations.filter(translation => {
1114
- var _a;
1115
- return (_a = translation == null ? void 0 : translation.value) == null ? void 0 : _a._ref;
1116
- }).map(translation => /* @__PURE__ */jsx(DocumentCheck, {
757
+ children: /* @__PURE__ */ jsxs(Stack, { space: 4, padding: 4, children: [
758
+ draftIds.length > 0 ? /* @__PURE__ */ jsxs(Stack, { space: 2, children: [
759
+ /* @__PURE__ */ jsxs(Text, { size: 1, children: [
760
+ "There",
761
+ " ",
762
+ draftIds.length === 1 ? "is 1 draft document" : `are ${draftIds.length} draft documents`,
763
+ "."
764
+ ] }),
765
+ invalidIds && invalidIds.length > 0 ? /* @__PURE__ */ jsxs(TextWithTone, { tone: "critical", size: 1, children: [
766
+ invalidIds && invalidIds.length === 1 ? "1 draft document has" : `${invalidIds && invalidIds.length} draft documents have`,
767
+ " ",
768
+ "validation issues that must addressed first"
769
+ ] }) : /* @__PURE__ */ jsx(TextWithTone, { tone: "positive", size: 1, children: "All drafts are valid and can be bulk published" })
770
+ ] }) : null,
771
+ /* @__PURE__ */ jsx(Stack, { space: 1, children: translations.filter((translation) => {
772
+ var _a;
773
+ return (_a = translation == null ? void 0 : translation.value) == null ? void 0 : _a._ref;
774
+ }).map((translation) => /* @__PURE__ */ jsx(
775
+ DocumentCheck,
776
+ {
1117
777
  id: translation.value._ref,
1118
778
  onCheckComplete,
1119
779
  addInvalidId,
1120
780
  removeInvalidId,
1121
781
  addDraftId,
1122
782
  removeDraftId
1123
- }, translation._key))
1124
- }), draftIds.length > 0 ? /* @__PURE__ */jsx(Button, {
1125
- mode: "ghost",
1126
- tone: invalidIds && (invalidIds == null ? void 0 : invalidIds.length) > 0 ? "caution" : "positive",
1127
- text: draftIds.length === 1 ? "Publish draft document" : "Bulk publish ".concat(draftIds.length, " draft documents"),
1128
- onClick: handleBulkPublish,
1129
- disabled
1130
- }) : /* @__PURE__ */jsx(Text, {
1131
- muted: true,
1132
- size: 1,
1133
- children: "No draft documents to publish"
1134
- })]
1135
- })
1136
- })]
1137
- })
1138
- }) : null;
783
+ },
784
+ translation._key
785
+ )) }),
786
+ draftIds.length > 0 ? /* @__PURE__ */ jsx(
787
+ Button,
788
+ {
789
+ mode: "ghost",
790
+ tone: invalidIds && (invalidIds == null ? void 0 : invalidIds.length) > 0 ? "caution" : "positive",
791
+ text: draftIds.length === 1 ? "Publish draft document" : `Bulk publish ${draftIds.length} draft documents`,
792
+ onClick: handleBulkPublish,
793
+ disabled
794
+ }
795
+ ) : /* @__PURE__ */ jsx(Text, { muted: !0, size: 1, children: "No draft documents to publish" })
796
+ ] })
797
+ }
798
+ )
799
+ ] }) }) : null;
1139
800
  }
1140
801
  function ReferencePatcher(props) {
1141
- const {
1142
- translation,
1143
- documentType,
1144
- metadataId
1145
- } = props;
1146
- const editState = useEditState(translation.value._ref, documentType);
1147
- const client = useClient({
1148
- apiVersion: API_VERSION
1149
- });
1150
- const {
1151
- onChange
1152
- } = useDocumentPane();
1153
- useEffect(() => {
802
+ const { translation, documentType, metadataId } = props, editState = useEditState(translation.value._ref, documentType), client = useClient({ apiVersion: API_VERSION }), { onChange } = useDocumentPane();
803
+ return useEffect(() => {
1154
804
  if (
1155
- // We have a reference
1156
- translation.value._ref &&
1157
- // It's still weak and not-yet-strengthened
1158
- translation.value._weak &&
1159
- // We also want to keep this check because maybe the user *configured* weak refs
1160
- translation.value._strengthenOnPublish &&
1161
- // The referenced document has just been published
1162
- !editState.draft && editState.published && editState.ready) {
1163
- const referencePathBase = ["translations", {
1164
- _key: translation._key
1165
- }, "value"];
1166
- onChange(new PatchEvent([unset([...referencePathBase, "_weak"]), unset([...referencePathBase, "_strengthenOnPublish"])]));
805
+ // We have a reference
806
+ translation.value._ref && // It's still weak and not-yet-strengthened
807
+ translation.value._weak && // We also want to keep this check because maybe the user *configured* weak refs
808
+ translation.value._strengthenOnPublish && // The referenced document has just been published
809
+ !editState.draft && editState.published && editState.ready
810
+ ) {
811
+ const referencePathBase = [
812
+ "translations",
813
+ { _key: translation._key },
814
+ "value"
815
+ ];
816
+ onChange(
817
+ new PatchEvent([
818
+ unset([...referencePathBase, "_weak"]),
819
+ unset([...referencePathBase, "_strengthenOnPublish"])
820
+ ])
821
+ );
1167
822
  }
1168
- }, [translation, editState, metadataId, client, onChange]);
1169
- return null;
823
+ }, [translation, editState, metadataId, client, onChange]), null;
1170
824
  }
1171
825
  function OptimisticallyStrengthen(props) {
1172
- const {
1173
- translations = [],
1174
- metadataId
1175
- } = props;
1176
- if (!translations.length) {
1177
- return null;
1178
- }
1179
- return /* @__PURE__ */jsx(Fragment, {
1180
- children: translations.map(translation => {
826
+ const { translations = [], metadataId } = props;
827
+ return translations.length ? /* @__PURE__ */ jsx(Fragment, { children: translations.map(
828
+ (translation) => {
1181
829
  var _a;
1182
- return ((_a = translation.value._strengthenOnPublish) == null ? void 0 : _a.type) ? /* @__PURE__ */jsx(ReferencePatcher, {
1183
- translation,
1184
- documentType: translation.value._strengthenOnPublish.type,
1185
- metadataId
1186
- }, translation._key) : null;
1187
- })
1188
- });
830
+ return (_a = translation.value._strengthenOnPublish) != null && _a.type ? /* @__PURE__ */ jsx(
831
+ ReferencePatcher,
832
+ {
833
+ translation,
834
+ documentType: translation.value._strengthenOnPublish.type,
835
+ metadataId
836
+ },
837
+ translation._key
838
+ ) : null;
839
+ }
840
+ ) }) : null;
1189
841
  }
1190
842
  var metadata = (schemaTypes, metadataFields) => defineType({
1191
843
  type: "document",
1192
844
  name: METADATA_SCHEMA_NAME,
1193
845
  title: "Translation metadata",
1194
846
  icon: TranslateIcon,
1195
- liveEdit: true,
1196
- fields: [defineField({
1197
- name: TRANSLATIONS_ARRAY_NAME,
1198
- type: "internationalizedArrayReference"
1199
- }), defineField({
1200
- name: "schemaTypes",
1201
- description: "Optional: Used to filter the reference fields above so all translations share the same types.",
1202
- type: "array",
1203
- // For some reason TS dislikes this line because of the DocumentDefinition return type
1204
- // @ts-expect-error
1205
- of: [{
1206
- type: "string"
1207
- }],
1208
- options: {
1209
- list: schemaTypes
1210
- },
1211
- readOnly: _ref2 => {
1212
- let {
1213
- value
1214
- } = _ref2;
1215
- return Boolean(value);
1216
- }
1217
- }), ...metadataFields],
847
+ liveEdit: !0,
848
+ fields: [
849
+ defineField({
850
+ name: TRANSLATIONS_ARRAY_NAME,
851
+ type: "internationalizedArrayReference"
852
+ }),
853
+ defineField({
854
+ name: "schemaTypes",
855
+ description: "Optional: Used to filter the reference fields above so all translations share the same types.",
856
+ type: "array",
857
+ of: [{ type: "string" }],
858
+ options: { list: schemaTypes },
859
+ readOnly: ({ value }) => !!value
860
+ }),
861
+ ...metadataFields
862
+ ],
1218
863
  preview: {
1219
864
  select: {
1220
865
  translations: TRANSLATIONS_ARRAY_NAME,
1221
866
  documentSchemaTypes: "schemaTypes"
1222
867
  },
1223
868
  prepare(selection) {
1224
- const {
1225
- translations = [],
1226
- documentSchemaTypes = []
1227
- } = selection;
1228
- const title = translations.length === 1 ? "1 Translation" : "".concat(translations.length, " Translations");
1229
- const languageKeys = translations.length ? translations.map(t => t._key.toUpperCase()).join(", ") : "";
1230
- const subtitle = [languageKeys ? "(".concat(languageKeys, ")") : null, (documentSchemaTypes == null ? void 0 : documentSchemaTypes.length) ? documentSchemaTypes.map(s => s).join(", ") : ""].filter(Boolean).join(" ");
869
+ const { translations = [], documentSchemaTypes = [] } = selection, title = translations.length === 1 ? "1 Translation" : `${translations.length} Translations`, languageKeys = translations.length ? translations.map((t) => t._key.toUpperCase()).join(", ") : "", subtitle = [
870
+ languageKeys ? `(${languageKeys})` : null,
871
+ documentSchemaTypes != null && documentSchemaTypes.length ? documentSchemaTypes.map((s) => s).join(", ") : ""
872
+ ].filter(Boolean).join(" ");
1231
873
  return {
1232
874
  title,
1233
875
  subtitle
@@ -1235,212 +877,167 @@ var metadata = (schemaTypes, metadataFields) => defineType({
1235
877
  }
1236
878
  }
1237
879
  });
1238
- const documentInternationalization = definePlugin(config => {
1239
- const pluginConfig = {
1240
- ...DEFAULT_CONFIG,
1241
- ...config
1242
- };
1243
- const {
1244
- supportedLanguages,
1245
- schemaTypes,
1246
- languageField,
1247
- bulkPublish,
1248
- metadataFields
1249
- } = pluginConfig;
1250
- if (schemaTypes.length === 0) {
1251
- throw new Error("You must specify at least one schema type on which to enable document internationalization. Update the `schemaTypes` option in the documentInternationalization() configuration.");
1252
- }
1253
- return {
1254
- name: "@sanity/document-internationalization",
1255
- studio: {
1256
- components: {
1257
- layout: props => DocumentInternationalizationProvider({
1258
- ...props,
1259
- pluginConfig
1260
- })
1261
- }
1262
- },
1263
- // Adds:
1264
- // - A bulk-publishing UI component to the form
1265
- // - Will only work for projects on a compatible plan
1266
- form: {
1267
- components: {
1268
- input: props => {
1269
- var _a, _b, _c;
1270
- if (props.id === "root" && props.schemaType.name === METADATA_SCHEMA_NAME && isSanityDocument(props == null ? void 0 : props.value)) {
1271
- const metadataId = (_a = props == null ? void 0 : props.value) == null ? void 0 : _a._id;
1272
- const translations = (_c = (_b = props == null ? void 0 : props.value) == null ? void 0 : _b.translations) != null ? _c : [];
1273
- const weakAndTypedTranslations = translations.filter(_ref3 => {
1274
- let {
1275
- value
1276
- } = _ref3;
1277
- return value && value._weak && value._strengthenOnPublish;
1278
- });
1279
- return /* @__PURE__ */jsxs(Stack, {
1280
- space: 5,
1281
- children: [bulkPublish ? /* @__PURE__ */jsx(BulkPublish, {
1282
- translations
1283
- }) : null, weakAndTypedTranslations.length > 0 ? /* @__PURE__ */jsx(OptimisticallyStrengthen, {
1284
- metadataId,
1285
- translations: weakAndTypedTranslations
1286
- }) : null, props.renderDefault(props)]
1287
- });
1288
- }
1289
- return props.renderDefault(props);
880
+ const documentInternationalization = definePlugin(
881
+ (config) => {
882
+ const pluginConfig = { ...DEFAULT_CONFIG, ...config }, {
883
+ supportedLanguages,
884
+ schemaTypes,
885
+ languageField,
886
+ bulkPublish,
887
+ metadataFields
888
+ } = pluginConfig;
889
+ if (schemaTypes.length === 0)
890
+ throw new Error(
891
+ "You must specify at least one schema type on which to enable document internationalization. Update the `schemaTypes` option in the documentInternationalization() configuration."
892
+ );
893
+ return {
894
+ name: "@sanity/document-internationalization",
895
+ studio: {
896
+ components: {
897
+ layout: (props) => DocumentInternationalizationProvider({ ...props, pluginConfig })
1290
898
  }
1291
- }
1292
- },
1293
- // Adds:
1294
- // - The `Translations` dropdown to the editing form
1295
- // - `Badges` to documents with a language value
1296
- // - The `DeleteMetadataAction` action to the metadata document type
1297
- document: {
1298
- unstable_languageFilter: (prev, ctx) => {
1299
- const {
1300
- schemaType,
1301
- documentId
1302
- } = ctx;
1303
- return schemaTypes.includes(schemaType) && documentId ? [...prev, props => DocumentInternationalizationMenu({
1304
- ...props,
1305
- documentId
1306
- })] : prev;
1307
899
  },
1308
- badges: (prev, _ref4) => {
1309
- let {
1310
- schemaType
1311
- } = _ref4;
1312
- if (!schemaTypes.includes(schemaType)) {
1313
- return prev;
900
+ // Adds:
901
+ // - A bulk-publishing UI component to the form
902
+ // - Will only work for projects on a compatible plan
903
+ form: {
904
+ components: {
905
+ input: (props) => {
906
+ var _a, _b, _c;
907
+ if (props.id === "root" && props.schemaType.name === METADATA_SCHEMA_NAME && isSanityDocument(props == null ? void 0 : props.value)) {
908
+ const metadataId = (_a = props == null ? void 0 : props.value) == null ? void 0 : _a._id, translations = (_c = (_b = props == null ? void 0 : props.value) == null ? void 0 : _b.translations) != null ? _c : [], weakAndTypedTranslations = translations.filter(
909
+ ({ value }) => (value == null ? void 0 : value._weak) && value._strengthenOnPublish
910
+ );
911
+ return /* @__PURE__ */ jsxs(Stack, { space: 5, children: [
912
+ bulkPublish ? /* @__PURE__ */ jsx(BulkPublish, { translations }) : null,
913
+ weakAndTypedTranslations.length > 0 ? /* @__PURE__ */ jsx(
914
+ OptimisticallyStrengthen,
915
+ {
916
+ metadataId,
917
+ translations: weakAndTypedTranslations
918
+ }
919
+ ) : null,
920
+ props.renderDefault(props)
921
+ ] });
922
+ }
923
+ return props.renderDefault(props);
924
+ }
1314
925
  }
1315
- return [props => LanguageBadge(props), ...prev];
1316
926
  },
1317
- actions: (prev, _ref5) => {
1318
- let {
1319
- schemaType
1320
- } = _ref5;
1321
- if (schemaType === METADATA_SCHEMA_NAME) {
1322
- return [...prev, DeleteMetadataAction];
1323
- }
1324
- return prev;
1325
- }
1326
- },
1327
- // Adds:
1328
- // - The `Translations metadata` document type to the schema
1329
- schema: {
1330
- // Create the metadata document type
1331
- types: [metadata(schemaTypes, metadataFields)],
1332
- // For every schema type this plugin is enabled on
1333
- // Create an initial value template to set the language
1334
- templates: (prev, _ref6) => {
1335
- let {
1336
- schema
1337
- } = _ref6;
1338
- if (!Array.isArray(supportedLanguages)) {
1339
- return prev;
1340
- }
1341
- const parameterizedTemplates = schemaTypes.map(schemaType => {
1342
- var _a, _b;
1343
- return {
1344
- id: "".concat(schemaType, "-parameterized"),
1345
- title: "".concat((_b = (_a = schema == null ? void 0 : schema.get(schemaType)) == null ? void 0 : _a.title) != null ? _b : schemaType, ": with Language"),
1346
- schemaType,
1347
- parameters: [{
1348
- name: "languageId",
1349
- title: "Language ID",
1350
- type: "string"
1351
- }],
1352
- value: _ref7 => {
1353
- let {
1354
- languageId
1355
- } = _ref7;
1356
- return {
927
+ // Adds:
928
+ // - The `Translations` dropdown to the editing form
929
+ // - `Badges` to documents with a language value
930
+ // - The `DeleteMetadataAction` action to the metadata document type
931
+ document: {
932
+ unstable_languageFilter: (prev, ctx) => {
933
+ const { schemaType, documentId } = ctx;
934
+ return schemaTypes.includes(schemaType) && documentId ? [
935
+ ...prev,
936
+ (props) => DocumentInternationalizationMenu({ ...props, documentId })
937
+ ] : prev;
938
+ },
939
+ badges: (prev, { schemaType }) => schemaTypes.includes(schemaType) ? [(props) => LanguageBadge(props), ...prev] : prev,
940
+ actions: (prev, { schemaType }) => schemaType === METADATA_SCHEMA_NAME ? [...prev, DeleteMetadataAction] : prev
941
+ },
942
+ // Adds:
943
+ // - The `Translations metadata` document type to the schema
944
+ schema: {
945
+ // Create the metadata document type
946
+ types: [metadata(schemaTypes, metadataFields)],
947
+ // For every schema type this plugin is enabled on
948
+ // Create an initial value template to set the language
949
+ templates: (prev, { schema }) => {
950
+ if (!Array.isArray(supportedLanguages))
951
+ return prev;
952
+ const parameterizedTemplates = schemaTypes.map((schemaType) => {
953
+ var _a, _b;
954
+ return {
955
+ id: `${schemaType}-parameterized`,
956
+ title: `${(_b = (_a = schema == null ? void 0 : schema.get(schemaType)) == null ? void 0 : _a.title) != null ? _b : schemaType}: with Language`,
957
+ schemaType,
958
+ parameters: [
959
+ { name: "languageId", title: "Language ID", type: "string" }
960
+ ],
961
+ value: ({ languageId }) => ({
1357
962
  [languageField]: languageId
1358
- };
1359
- }
1360
- };
1361
- });
1362
- const staticTemplates = schemaTypes.flatMap(schemaType => {
1363
- return supportedLanguages.map(language => {
963
+ })
964
+ };
965
+ }), staticTemplates = schemaTypes.flatMap((schemaType) => supportedLanguages.map((language) => {
1364
966
  var _a, _b;
1365
967
  return {
1366
- id: "".concat(schemaType, "-").concat(language.id),
1367
- title: "".concat(language.title, " ").concat((_b = (_a = schema == null ? void 0 : schema.get(schemaType)) == null ? void 0 : _a.title) != null ? _b : schemaType),
968
+ id: `${schemaType}-${language.id}`,
969
+ title: `${language.title} ${(_b = (_a = schema == null ? void 0 : schema.get(schemaType)) == null ? void 0 : _a.title) != null ? _b : schemaType}`,
1368
970
  schemaType,
1369
971
  value: {
1370
972
  [languageField]: language.id
1371
973
  }
1372
974
  };
1373
- });
1374
- });
1375
- return [...prev, ...parameterizedTemplates, ...staticTemplates];
1376
- }
1377
- },
1378
- // Uses:
1379
- // - `sanity-plugin-internationalized-array` to maintain the translations array
1380
- plugins: [
1381
- // Translation metadata stores its references using this plugin
1382
- // It cuts down on attribute usage and gives UI conveniences to add new translations
1383
- internationalizedArray({
1384
- languages: supportedLanguages,
1385
- fieldTypes: [defineField({
1386
- name: "reference",
1387
- type: "reference",
1388
- to: schemaTypes.map(type => ({
1389
- type
1390
- })),
1391
- weak: pluginConfig.weakReferences,
1392
- // Reference filters don't actually enforce validation!
1393
- validation: Rule => Rule.custom(async (item, context) => {
1394
- var _a;
1395
- if (!((_a = item == null ? void 0 : item.value) == null ? void 0 : _a._ref) || !(item == null ? void 0 : item._key)) {
1396
- return true;
1397
- }
1398
- const client = context.getClient({
1399
- apiVersion: API_VERSION
1400
- });
1401
- const valueLanguage = await client.fetch("*[_id in [$ref, $draftRef]][0].".concat(languageField), {
1402
- ref: item.value._ref,
1403
- draftRef: "drafts.".concat(item.value._ref)
1404
- });
1405
- if (valueLanguage && valueLanguage === item._key) {
1406
- return true;
1407
- }
1408
- return "Referenced document does not have the correct language value";
1409
- }),
1410
- options: {
1411
- // TODO: Update type once it knows the values of this filter
1412
- // @ts-expect-error
1413
- filter: _ref8 => {
1414
- let {
1415
- parent,
1416
- document
1417
- } = _ref8;
1418
- if (!parent) return null;
1419
- const parentArray = Array.isArray(parent) ? parent : [parent];
1420
- const language = parentArray.find(p => p._key);
1421
- if (!(language == null ? void 0 : language._key)) return null;
1422
- if (document.schemaTypes) {
1423
- return {
1424
- filter: "_type in $schemaTypes && ".concat(languageField, " == $language"),
1425
- params: {
1426
- schemaTypes: document.schemaTypes,
1427
- language: language._key
1428
- }
1429
- };
1430
- }
1431
- return {
1432
- filter: "".concat(languageField, " == $language"),
1433
- params: {
1434
- language: language._key
1435
- }
1436
- };
1437
- }
975
+ }));
976
+ return [...prev, ...parameterizedTemplates, ...staticTemplates];
1438
977
  }
1439
- }, {
1440
- strict: false
1441
- })]
1442
- })]
1443
- };
1444
- });
1445
- export { DeleteTranslationAction, DocumentInternationalizationMenu, documentInternationalization, useDocumentInternationalizationContext };
978
+ },
979
+ // Uses:
980
+ // - `sanity-plugin-internationalized-array` to maintain the translations array
981
+ plugins: [
982
+ // Translation metadata stores its references using this plugin
983
+ // It cuts down on attribute usage and gives UI conveniences to add new translations
984
+ internationalizedArray({
985
+ languages: supportedLanguages,
986
+ fieldTypes: [
987
+ defineField(
988
+ {
989
+ name: "reference",
990
+ type: "reference",
991
+ to: schemaTypes.map((type) => ({ type })),
992
+ weak: pluginConfig.weakReferences,
993
+ // Reference filters don't actually enforce validation!
994
+ validation: (Rule) => (
995
+ // @ts-expect-error - fix typings
996
+ Rule.custom(async (item, context) => {
997
+ var _a;
998
+ if (!((_a = item == null ? void 0 : item.value) != null && _a._ref) || !(item != null && item._key))
999
+ return !0;
1000
+ const valueLanguage = await context.getClient({ apiVersion: API_VERSION }).fetch(
1001
+ `*[_id in [$ref, $draftRef]][0].${languageField}`,
1002
+ {
1003
+ ref: item.value._ref,
1004
+ draftRef: `drafts.${item.value._ref}`
1005
+ }
1006
+ );
1007
+ return valueLanguage && valueLanguage === item._key ? !0 : "Referenced document does not have the correct language value";
1008
+ })
1009
+ ),
1010
+ options: {
1011
+ // @ts-expect-error - Update type once it knows the values of this filter
1012
+ filter: ({ parent, document }) => {
1013
+ if (!parent)
1014
+ return null;
1015
+ const language = (Array.isArray(parent) ? parent : [parent]).find((p) => p._key);
1016
+ return language != null && language._key ? document.schemaTypes ? {
1017
+ filter: `_type in $schemaTypes && ${languageField} == $language`,
1018
+ params: {
1019
+ schemaTypes: document.schemaTypes,
1020
+ language: language._key
1021
+ }
1022
+ } : {
1023
+ filter: `${languageField} == $language`,
1024
+ params: { language: language._key }
1025
+ } : null;
1026
+ }
1027
+ }
1028
+ },
1029
+ { strict: !1 }
1030
+ )
1031
+ ]
1032
+ })
1033
+ ]
1034
+ };
1035
+ }
1036
+ );
1037
+ export {
1038
+ DeleteTranslationAction,
1039
+ DocumentInternationalizationMenu,
1040
+ documentInternationalization,
1041
+ useDocumentInternationalizationContext
1042
+ };
1446
1043
  //# sourceMappingURL=index.esm.js.map