@sanity/document-internationalization 1.0.0 → 1.0.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.
Files changed (114) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +89 -47
  3. package/lib/index.esm.js +2 -0
  4. package/lib/index.esm.js.map +1 -0
  5. package/lib/index.js +2 -0
  6. package/lib/index.js.map +1 -0
  7. package/lib/src/index.d.ts +200 -0
  8. package/package.json +100 -43
  9. package/src/actions/DeleteWithi18nAction.tsx +118 -0
  10. package/src/actions/DuplicateWithi18nAction.tsx +77 -0
  11. package/src/actions/PublishWithi18nAction.ts +118 -0
  12. package/src/actions/index.ts +42 -0
  13. package/src/badges/LanguageBadge.tsx +22 -0
  14. package/src/constants/I18nDelimiter.ts +1 -0
  15. package/src/constants/I18nPrefix.ts +1 -0
  16. package/src/constants/IdStructure.ts +4 -0
  17. package/src/constants/LanguageCultures.ts +902 -0
  18. package/src/constants/ReferenceBehavior.ts +5 -0
  19. package/src/constants/SupportedEmojiFlagCodes.ts +251 -0
  20. package/src/constants/UiMessages.ts +56 -0
  21. package/src/constants/index.ts +7 -0
  22. package/src/documentI18n.tsx +33 -0
  23. package/src/hooks/index.ts +2 -0
  24. package/src/hooks/useConfig.ts +22 -0
  25. package/src/hooks/useDelayedFlag.ts +31 -0
  26. package/src/index.ts +6 -1
  27. package/src/language-select/components/LanguageSelect/LanguageConfigContext.tsx +4 -0
  28. package/src/language-select/components/LanguageSelect/LanguageSelect.tsx +188 -0
  29. package/src/language-select/components/LanguageSelect/LanguageSelectContext.ts +16 -0
  30. package/src/language-select/components/LanguageSelect/LanguageSelectLabel.tsx +12 -0
  31. package/src/language-select/components/LanguageSelect/LanguageSelectList.tsx +84 -0
  32. package/src/language-select/components/LanguageSelect/LanguageSelectListItem.tsx +251 -0
  33. package/src/language-select/components/LanguageSelect/index.tsx +25 -0
  34. package/src/language-select/components/SingleFlag/SingleFlag.tsx +44 -0
  35. package/src/language-select/components/SingleFlag/allEmojiFlagCodes.ts +251 -0
  36. package/src/language-select/components/SingleFlag/index.ts +1 -0
  37. package/src/language-select/components/SplitPaneIcon/SplitPaneIcon.tsx +25 -0
  38. package/src/language-select/components/SplitPaneIcon/index.ts +1 -0
  39. package/src/language-select/components/index.ts +2 -0
  40. package/src/language-select/hooks/index.ts +1 -0
  41. package/src/language-select/hooks/useLanguages.ts +37 -0
  42. package/src/language-select/hooks/useListeningQuery.ts +66 -0
  43. package/src/structure/IDefaultDocumentNodeStructureProps.ts +4 -0
  44. package/src/structure/components/MaintenanceTab/MaintenanceTab.tsx +13 -0
  45. package/src/structure/components/MaintenanceTab/MaintenanceTabContent.tsx +259 -0
  46. package/src/structure/components/MaintenanceTab/index.ts +1 -0
  47. package/src/structure/components/MaintenanceTabResult/MaintenanceTabResult.tsx +44 -0
  48. package/src/structure/components/MaintenanceTabResult/index.ts +1 -0
  49. package/src/structure/components/MaintenanceTabTypeSelector/MaintenanceTabTypeSelector.tsx +56 -0
  50. package/src/structure/components/MaintenanceTabTypeSelector/index.ts +1 -0
  51. package/src/structure/hooks/index.ts +1 -0
  52. package/src/structure/hooks/useDocumentsInformation.ts +110 -0
  53. package/src/structure/index.tsx +120 -0
  54. package/src/structure/utils/fixBaseDocumentRefs.ts +30 -0
  55. package/src/structure/utils/fixBaseLanguageMismatch.ts +21 -0
  56. package/src/structure/utils/fixIdStructureMismatchDocuments.ts +72 -0
  57. package/src/structure/utils/fixLanguageFields.ts +32 -0
  58. package/src/structure/utils/fixOrphanedDocuments.ts +22 -0
  59. package/src/structure/utils/fixTranslationRefs.ts +50 -0
  60. package/src/structure/utils/index.ts +6 -0
  61. package/src/types/IEditState.ts +6 -0
  62. package/src/types/IExtendedLanguageObject.ts +6 -0
  63. package/src/types/ILanguageObject.ts +4 -0
  64. package/src/types/ILanguageQuery.ts +13 -0
  65. package/src/types/IResolverProps.ts +10 -0
  66. package/src/types/ITranslationRef.ts +6 -0
  67. package/src/types/IType.ts +40 -0
  68. package/src/types/IUseDocumentOperationResult.ts +11 -0
  69. package/src/types/TFieldNamesConfig.ts +5 -0
  70. package/src/types/TLanguage.ts +3 -0
  71. package/src/types/TLanguagesOption.ts +4 -0
  72. package/src/types/TSchema.ts +6 -0
  73. package/src/types/Ti18nConfig.ts +33 -0
  74. package/src/types/Ti18nDocument.ts +14 -0
  75. package/src/types/Ti18nSchema.ts +13 -0
  76. package/src/types/index.ts +15 -0
  77. package/src/utils/applyConfig.ts +43 -0
  78. package/src/utils/baseToTop.ts +5 -0
  79. package/src/utils/buildDocId.ts +8 -0
  80. package/src/utils/createSanityReference.ts +11 -0
  81. package/src/utils/getBaseIdFromId.ts +20 -0
  82. package/src/utils/getBaseLanguage.ts +6 -0
  83. package/src/utils/getFlag.ts +38 -0
  84. package/src/utils/getLanguageFromDocument.ts +9 -0
  85. package/src/utils/getLanguageFromId.ts +13 -0
  86. package/src/utils/getLanguagesFromOption.ts +40 -0
  87. package/src/utils/getTranslationsForId.ts +39 -0
  88. package/src/utils/index.ts +14 -0
  89. package/src/utils/makeObjectKey.ts +3 -0
  90. package/src/utils/normalizeLanguageList.ts +26 -0
  91. package/src/utils/serializePath.ts +11 -0
  92. package/src/utils/updateIntlFieldsForDocument.ts +79 -0
  93. package/src/utils/useSanityClient.ts +6 -0
  94. package/src/validators/index.ts +1 -0
  95. package/src/validators/isSlugUnique.ts +56 -0
  96. package/src/withDocumentI18nPlugin.ts +24 -0
  97. package/v2-incompatible.js +1 -1
  98. package/lib/cjs/index.js +0 -539
  99. package/lib/cjs/index.js.map +0 -1
  100. package/lib/esm/index.js +0 -532
  101. package/lib/esm/index.js.map +0 -1
  102. package/lib/types/index.d.ts +0 -12
  103. package/lib/types/index.d.ts.map +0 -1
  104. package/src/LanguageManage.tsx +0 -25
  105. package/src/LanguageOption.tsx +0 -158
  106. package/src/LanguagePatch.tsx +0 -61
  107. package/src/MenuButton.tsx +0 -101
  108. package/src/badges/index.tsx +0 -23
  109. package/src/constants.ts +0 -1
  110. package/src/hooks/useLanguageMetadata.tsx +0 -21
  111. package/src/hooks/useOpenInNewPane.tsx +0 -27
  112. package/src/plugin.tsx +0 -104
  113. package/src/schema/translation/metadata.ts +0 -42
  114. package/src/types.ts +0 -24
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2022 Simeon Griggs
3
+ Copyright (c) 2022 Sanity.io
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,66 +1,108 @@
1
- # @sanity/document-internationalization
1
+ # Document Internationalization Plugin for Sanity.io
2
2
 
3
- This is a complete rewrite of the original v0 Document Internationalization plugin, exclusively for Sanity Studio v3. The major differences include:
3
+ > This is a **Sanity Studio v3** plugin.
4
+ > For the v2 version, please refer to the [v2-branch](https://github.com/sanity-io/document-internationalization/studio-v2).
4
5
 
5
- - Start new documents in any language and create references later
6
- - Storing translation references in a separate "meta" document
7
- - Updates to one document no longer effect the change history of other translations
8
- - No use of Document Actions
9
- - Configurable "language" field on documents
6
+ [![npm version](https://img.shields.io/npm/v/@sanity/document-internationalization.svg?style=flat)](https://www.npmjs.com/package/@sanity/document-internationalization)
7
+
8
+ ![Document Level Internationalization UI](docs/img/document-level-translation.gif)
9
+
10
+ ## What this plugin solves
11
+
12
+ There are two popular methods of internationalization in Sanity Studio:
13
+
14
+ - **Document-level translation**
15
+ - A unique document version for every language
16
+ - Joined together by references and/or a predictable `_id`
17
+ - Best for documents that have unique, language-specific fields and no common content across languages
18
+ - Best for translating content using Portable Text
19
+ - **Field-level translation**
20
+ - A single document with many languages of content
21
+ - Achieved by mapping over languages on each field, to create an object
22
+ - Best for documents that have a mix of language-specific and common fields
23
+ - Not recommended for Portable Text
24
+
25
+ This plugin adds features to the Studio to improve handling **document-level translations**.
26
+
27
+ - A Language Selector to create and browse language-specific versions of each Document
28
+ - Document Actions to update base and translated documents to ensure references stay in tact
29
+ - Document Badges to highlight the language version of a document
30
+
31
+ For **field-level translations** you should use the [@sanity/language-filter plugin](https://www.npmjs.com/package/@sanity/language-filter).
32
+
33
+ *Studio V3 note*: language-filter is not available for V3 yet.
34
+
35
+ ### Many projects use both!
36
+
37
+ *Studio V3 note*: language-filter is not available for V3 yet.
38
+
39
+ An example of document-level translation could be a `lesson` schema, the `title`, `slug` and `content` fields would be unique in every language.
40
+
41
+ A good use of field-level translation could be a `person` schema. It could have the same `name` and `image` in every language, but only the `biography` would need translating.
42
+
43
+ ## Studio V3 known issues
44
+
45
+ Studio V3 does not implement language-filter yet. This means that the language button has moved into the document editor flow for the time being.
46
+ We will be looking to restore the button placement during Studio V3 dev-preview.
10
47
 
11
48
  ## Installation
12
49
 
13
- ```
50
+ From the same directory as the Studio run:
51
+
52
+ ```sh
14
53
  npm install --save @sanity/document-internationalization
15
54
  ```
16
55
 
17
56
  or
18
57
 
19
- ```
58
+ ```sh
20
59
  yarn add @sanity/document-internationalization
21
60
  ```
22
61
 
23
- ## Usage
24
-
25
- Add it as a plugin in sanity.config.ts (or .js):
26
-
27
- ```ts
28
- import {createConfig} from 'sanity'
29
- import {documentInternationalization} from '@sanity/document-internationalization'
30
-
31
- export const createConfig({
32
- // ...
33
- plugins: [
34
- documentInternationalization({
35
- // Required
36
- supportedLanguages: [
37
- {id: 'nb', title: 'Norwegian (Bokmål)'},
38
- {id: 'nn', title: 'Norwegian (Nynorsk)'},
39
- {id: 'en', title: 'English'}
40
- ],
41
- schemaTypes: ['product', 'post'],
42
- // Optional
43
- languageField: `language` // defauts to "language"
44
- })
45
- ]
46
- })
47
- ```
48
62
 
49
- The schema types that use document internationalization should also have a string field with the same name configured in the `languageField` setting. You can hide this field since the plugin will handle writing patches to it.
63
+ The plugin is now installed, but you will need to complete the following steps to see the Document Translation UI:
50
64
 
51
- ```ts
52
- // ./schema/product.ts
65
+ ## Setup next steps
66
+ 1. [Enabling and configuring the plugin](docs/enabling-and-configuring.md)
67
+ To declare available Languages and other settings
68
+ 2. [Activating internationalization on schema](docs/activating-internationalization-on-schema.md)
69
+ To enable all the above features on schema
70
+ 3. [Customise Desk Structure](docs/desk-structure.md)
71
+ To filter documents down to the base language version
72
+
73
+ ## Other documentation
74
+
75
+ 1. [Known Caveats](docs/known-caveats.md)
76
+ 2. [Data structure](docs/datastructure-intl-doc.md)
77
+ 3. [Translation Maintenance](docs/translation-maintenance.md)
78
+ 4. [GraphQL support](docs/graphql-intl-doc.md)
79
+ 5. [Advanced languages](docs/advanced-languages.md)
80
+ 6. [Usage with custom publish action](docs/usage-with-custom-publish.md)
81
+ 7. [If you don't see the plugin document actions](docs/usage-with-custom-publish.md#add-additional-actions)
82
+ 8. [GROQ query examples](/docs/groq-query-examples.md)
83
+
84
+ ## Migrating from sanity-plugin-intl-input
85
+
86
+ While most of the UI is the same in the official version of this plugin there are some breaking changes you should be aware of before migrating:
87
+
88
+ [Coming from sanity-plugin-intl-input](docs/coming-from-sanity-plugin-intl-input.md)
53
89
 
54
- // ...all other settings
55
- defineField({
56
- name: 'language',
57
- type: 'string',
58
- readOnly: true,
59
- hidden: true,
60
- })
61
- ```
62
90
 
63
91
  ## License
64
92
 
65
- MIT © Simeon Griggs
66
- See LICENSE
93
+ MIT-licensed. See LICENSE.
94
+
95
+ ## Develop & test
96
+
97
+ This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)
98
+ with default configuration for build & watch scripts.
99
+
100
+ See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)
101
+ on how to run this plugin with hotreload in the studio.
102
+
103
+ ### Release new version
104
+
105
+ Run ["CI & Release" workflow](https://github.com/sanity-io/document-internationalization/actions/workflows/main.yml).
106
+ Make sure to select the main branch and check "Release new version".
107
+
108
+ Semantic release will only release on configured branches, so it is safe to run release on any branch.
@@ -0,0 +1,2 @@
1
+ const e=["config"];var t,a,n,i,l,r,s,o,u,c,d;function h(e,t){if(null==e)return{};var a,n,i=function(e,t){if(null==e)return{};var a,n,i={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}function m(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function g(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function f(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?g(Object(a),!0).forEach((function(t){p(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):g(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}import{useClient as v,isKeyedObject as b,useSchema as y,useEditState as S,useDocumentOperation as _,useValidationStatus as C,useSyncState as w,DefaultPreview as M,useDocumentStore as I,definePlugin as A}from"sanity";import E from"just-safe-get";import T from"lodash/compact";import*as L from"react";import N,{useState as k,useEffect as B,useMemo as D,forwardRef as R,useCallback as O,createContext as P,useContext as G,useRef as j}from"react";import{useToast as K,Stack as z,Text as F,Card as U,Autocomplete as x,Flex as H,Box as W,Button as Z,Code as V,Container as Y,Dialog as J,Grid as $,MenuItem as q,Badge as Q,MenuButton as X,Menu as ee}from"@sanity/ui";import{CheckmarkIcon as te,PublishIcon as ae,TrashIcon as ne,CopyIcon as ie,EarthGlobeIcon as le,SpinnerIcon as re,AddIcon as se,ChevronDownIcon as oe}from"@sanity/icons";import{jsx as ue,jsxs as ce}from"react/jsx-runtime";import{ConfirmDeleteDialog as de,usePaneRouter as he,deskTool as me}from"sanity/desk";import{uuid as ge}from"@sanity/uuid";import fe,{keyframes as pe,css as ve}from"styled-components";import be from"just-split";import ye from"lodash/chunk";import Se from"twemoji";import _e from"html-react-parser";import{getEmojiFlag as Ce}from"@cprecioso/country-flag-emoji";import{distinctUntilChanged as we,catchError as Me}from"rxjs/operators";import Ie from"react-fast-compare";import Ae from"just-omit";import{hues as Ee}from"@sanity/color";import{RouterContext as Te}from"sanity/router";const Le=["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"],Ne=[{value:"af",title:"Afrikaans"},{value:"af-ZA",title:"Afrikaans (South Africa)"},{value:"ar",title:"Arabic"},{value:"ar-AE",title:"Arabic (U.A.E.)"},{value:"ar-BH",title:"Arabic (Bahrain)"},{value:"ar-DZ",title:"Arabic (Algeria)"},{value:"ar-EG",title:"Arabic (Egypt)"},{value:"ar-IQ",title:"Arabic (Iraq)"},{value:"ar-JO",title:"Arabic (Jordan)"},{value:"ar-KW",title:"Arabic (Kuwait)"},{value:"ar-LB",title:"Arabic (Lebanon)"},{value:"ar-LY",title:"Arabic (Libya)"},{value:"ar-MA",title:"Arabic (Morocco)"},{value:"ar-OM",title:"Arabic (Oman)"},{value:"ar-QA",title:"Arabic (Qatar)"},{value:"ar-SA",title:"Arabic (Saudi Arabia)"},{value:"ar-SY",title:"Arabic (Syria)"},{value:"ar-TN",title:"Arabic (Tunisia)"},{value:"ar-YE",title:"Arabic (Yemen)"},{value:"az",title:"Azeri"},{value:"az-Cyrl-AZ",title:"Azeri (Cyrillic, Azerbaijan)"},{value:"az-Latn-AZ",title:"Azeri (Latin, Azerbaijan)"},{value:"be",title:"Belarusian"},{value:"be-BY",title:"Belarusian (Belarus)"},{value:"bg",title:"Bulgarian"},{value:"bg-BG",title:"Bulgarian (Bulgaria)"},{value:"bs-Latn-BA",title:"Bosnian (Bosnia and Herzegovina)"},{value:"ca",title:"Catalan"},{value:"ca-ES",title:"Catalan (Catalan)"},{value:"cs",title:"Czech"},{value:"cs-CZ",title:"Czech (Czech Republic)"},{value:"cy-GB",title:"Welsh (United Kingdom)"},{value:"da",title:"Danish"},{value:"da-DK",title:"Danish (Denmark)"},{value:"de",title:"German"},{value:"de-AT",title:"German (Austria)"},{value:"de-DE",title:"German (Germany)"},{value:"de-CH",title:"German (Switzerland)"},{value:"de-LI",title:"German (Liechtenstein)"},{value:"de-LU",title:"German (Luxembourg)"},{value:"dv",title:"Divehi"},{value:"dv-MV",title:"Divehi (Maldives)"},{value:"el",title:"Greek"},{value:"el-GR",title:"Greek (Greece)"},{value:"en",title:"English"},{value:"en-029",title:"English (Caribbean)"},{value:"en-AU",title:"English (Australia)"},{value:"en-BZ",title:"English (Belize)"},{value:"en-CA",title:"English (Canada)"},{value:"en-GB",title:"English (United Kingdom)"},{value:"en-IE",title:"English (Ireland)"},{value:"en-JM",title:"English (Jamaica)"},{value:"en-NZ",title:"English (New Zealand)"},{value:"en-PH",title:"English (Republic of the Philippines)"},{value:"en-TT",title:"English (Trinidad and Tobago)"},{value:"en-US",title:"English (United States)"},{value:"en-ZA",title:"English (South Africa)"},{value:"en-ZW",title:"English (Zimbabwe)"},{value:"es",title:"Spanish"},{value:"es-AR",title:"Spanish (Argentina)"},{value:"es-BO",title:"Spanish (Bolivia)"},{value:"es-CL",title:"Spanish (Chile)"},{value:"es-CO",title:"Spanish (Colombia)"},{value:"es-CR",title:"Spanish (Costa Rica)"},{value:"es-DO",title:"Spanish (Dominican Republic)"},{value:"es-EC",title:"Spanish (Ecuador)"},{value:"es-ES",title:"Spanish (Spain)"},{value:"es-GT",title:"Spanish (Guatemala)"},{value:"es-HN",title:"Spanish (Honduras)"},{value:"es-MX",title:"Spanish (Mexico)"},{value:"es-NI",title:"Spanish (Nicaragua)"},{value:"es-PA",title:"Spanish (Panama)"},{value:"es-PE",title:"Spanish (Peru)"},{value:"es-PR",title:"Spanish (Puerto Rico)"},{value:"es-PY",title:"Spanish (Paraguay)"},{value:"es-SV",title:"Spanish (El Salvador)"},{value:"es-UY",title:"Spanish (Uruguay)"},{value:"es-VE",title:"Spanish (Venezuela)"},{value:"et",title:"Estonian"},{value:"et-EE",title:"Estonian (Estonia)"},{value:"eu",title:"Basque"},{value:"eu-ES",title:"Basque (Basque)"},{value:"fa",title:"Persian"},{value:"fa-IR",title:"Persian (Iran)"},{value:"fi",title:"Finnish"},{value:"fi-FI",title:"Finnish (Finland)"},{value:"fo",title:"Faroese"},{value:"fo-FO",title:"Faroese (Faroe Islands)"},{value:"fr",title:"French"},{value:"fr-BE",title:"French (Belgium)"},{value:"fr-CA",title:"French (Canada)"},{value:"fr-FR",title:"French (France)"},{value:"fr-CH",title:"French (Switzerland)"},{value:"fr-LU",title:"French (Luxembourg)"},{value:"fr-MC",title:"French (Principality of Monaco)"},{value:"gl",title:"Galician"},{value:"gl-ES",title:"Galician (Galician)"},{value:"gu",title:"Gujarati"},{value:"gu-IN",title:"Gujarati (India)"},{value:"he",title:"Hebrew"},{value:"he-IL",title:"Hebrew (Israel)"},{value:"hi",title:"Hindi"},{value:"hi-IN",title:"Hindi (India)"},{value:"hr",title:"Croatian"},{value:"hr-BA",title:"Croatian (Bosnia and Herzegovina)"},{value:"hr-HR",title:"Croatian (Croatia)"},{value:"hu",title:"Hungarian"},{value:"hu-HU",title:"Hungarian (Hungary)"},{value:"hy",title:"Armenian"},{value:"hy-AM",title:"Armenian (Armenia)"},{value:"id",title:"Indonesian"},{value:"id-ID",title:"Indonesian (Indonesia)"},{value:"is",title:"Icelandic"},{value:"is-IS",title:"Icelandic (Iceland)"},{value:"it",title:"Italian"},{value:"it-CH",title:"Italian (Switzerland)"},{value:"it-IT",title:"Italian (Italy)"},{value:"ja",title:"Japanese"},{value:"ja-JP",title:"Japanese (Japan)"},{value:"ka",title:"Georgian"},{value:"ka-GE",title:"Georgian (Georgia)"},{value:"kk",title:"Kazakh"},{value:"kk-KZ",title:"Kazakh (Kazakhstan)"},{value:"kn",title:"Kannada"},{value:"kn-IN",title:"Kannada (India)"},{value:"ko",title:"Korean"},{value:"kok",title:"Konkani"},{value:"kok-IN",title:"Konkani (India)"},{value:"ko-KR",title:"Korean (Korea)"},{value:"ky",title:"Kyrgyz"},{value:"ky-KG",title:"Kyrgyz (Kyrgyzstan)"},{value:"lt",title:"Lithuanian"},{value:"lt-LT",title:"Lithuanian (Lithuania)"},{value:"lv",title:"Latvian"},{value:"lv-LV",title:"Latvian (Latvia)"},{value:"mi-NZ",title:"Maori (New Zealand)"},{value:"mk",title:"Macedonian"},{value:"mk-MK",title:"Macedonian (Former Yugoslav Republic of Macedonia)"},{value:"mn",title:"Mongolian"},{value:"mn-MN",title:"Mongolian (Cyrillic, Mongolia)"},{value:"mr",title:"Marathi"},{value:"mr-IN",title:"Marathi (India)"},{value:"ms",title:"Malay"},{value:"ms-BN",title:"Malay (Brunei Darussalam)"},{value:"ms-MY",title:"Malay (Malaysia)"},{value:"mt-MT",title:"Maltese (Malta)"},{value:"nb-NO",title:"Norwegian, Bokmal (Norway)"},{value:"nl",title:"Dutch"},{value:"nl-BE",title:"Dutch (Belgium)"},{value:"nl-NL",title:"Dutch (Netherlands)"},{value:"nn-NO",title:"Norwegian, Nynorsk (Norway)"},{value:"no",title:"Norwegian"},{value:"ns-ZA",title:"Northern Sotho (South Africa)"},{value:"pa",title:"Punjabi"},{value:"pa-IN",title:"Punjabi (India)"},{value:"pl",title:"Polish"},{value:"pl-PL",title:"Polish (Poland)"},{value:"pt",title:"Portuguese"},{value:"pt-BR",title:"Portuguese (Brazil)"},{value:"pt-PT",title:"Portuguese (Portugal)"},{value:"quz-BO",title:"Quechua (Bolivia)"},{value:"quz-EC",title:"Quechua (Ecuador)"},{value:"quz-PE",title:"Quechua (Peru)"},{value:"ro",title:"Romanian"},{value:"ro-RO",title:"Romanian (Romania)"},{value:"ru",title:"Russian"},{value:"ru-RU",title:"Russian (Russia)"},{value:"sa",title:"Sanskrit"},{value:"sa-IN",title:"Sanskrit (India)"},{value:"se-FI",title:"Sami (Northern) (Finland)"},{value:"se-NO",title:"Sami (Northern) (Norway)"},{value:"se-SE",title:"Sami (Northern) (Sweden)"},{value:"sk",title:"Slovak"},{value:"sk-SK",title:"Slovak (Slovakia)"},{value:"sl",title:"Slovenian"},{value:"sl-SI",title:"Slovenian (Slovenia)"},{value:"sma-NO",title:"Sami (Southern) (Norway)"},{value:"sma-SE",title:"Sami (Southern) (Sweden)"},{value:"smj-NO",title:"Sami (Lule) (Norway)"},{value:"smj-SE",title:"Sami (Lule) (Sweden)"},{value:"smn-FI",title:"Sami (Inari) (Finland)"},{value:"sms-FI",title:"Sami (Skolt) (Finland)"},{value:"sq",title:"Albanian"},{value:"sq-AL",title:"Albanian (Albania)"},{value:"sr",title:"Serbian"},{value:"sr-Cyrl-BA",title:"Serbian (Cyrillic) (Bosnia and Herzegovina)"},{value:"sr-Cyrl-CS",title:"Serbian (Cyrillic, Serbia)"},{value:"sr-Latn-BA",title:"Serbian (Latin) (Bosnia and Herzegovina)"},{value:"sr-Latn-CS",title:"Serbian (Latin, Serbia)"},{value:"sv",title:"Swedish"},{value:"sv-FI",title:"Swedish (Finland)"},{value:"sv-SE",title:"Swedish (Sweden)"},{value:"sw",title:"Kiswahili"},{value:"sw-KE",title:"Kiswahili (Kenya)"},{value:"syr",title:"Syriac"},{value:"syr-SY",title:"Syriac (Syria)"},{value:"ta",title:"Tamil"},{value:"ta-IN",title:"Tamil (India)"},{value:"te",title:"Telugu"},{value:"te-IN",title:"Telugu (India)"},{value:"th",title:"Thai"},{value:"th-TH",title:"Thai (Thailand)"},{value:"tn-ZA",title:"Tswana (South Africa)"},{value:"tr",title:"Turkish"},{value:"tr-TR",title:"Turkish (Turkey)"},{value:"tt",title:"Tatar"},{value:"tt-RU",title:"Tatar (Russia)"},{value:"uk",title:"Ukrainian"},{value:"uk-UA",title:"Ukrainian (Ukraine)"},{value:"ur",title:"Urdu"},{value:"ur-PK",title:"Urdu (Islamic Republic of Pakistan)"},{value:"uz",title:"Uzbek"},{value:"uz-Cyrl-UZ",title:"Uzbek (Cyrillic, Uzbekistan)"},{value:"uz-Latn-UZ",title:"Uzbek (Latin, Uzbekistan)"},{value:"vi",title:"Vietnamese"},{value:"vi-VN",title:"Vietnamese (Vietnam)"},{value:"xh-ZA",title:"Xhosa (South Africa)"},{value:"zh-CN",title:"Chinese (People's Republic of China)"},{value:"zh-HK",title:"Chinese (Hong Kong S.A.R.)"},{value:"zh-CHS",title:"Chinese (Simplified)"},{value:"zh-CHT",title:"Chinese (Traditional)"},{value:"zh-MO",title:"Chinese (Macao S.A.R.)"},{value:"zh-SG",title:"Chinese (Singapore)"},{value:"zh-TW",title:"Chinese (Taiwan)"},{value:"zu-ZA",title:"Zulu (South Africa)"}],ke="i18n",Be="__i18n_";var De=(e=>(e.STRONG="strong",e.WEAK="weak",e.DISABLED="disabled",e))(De||{}),Re=(e=>(e.SUBPATH="subpath",e.DELIMITER="delimiter",e))(Re||{});const Oe={publishing:"Publishing...",publish:"Publish",updatingIntlFields:"Updating i18n fields",intlFieldsUpdated:"i18n fields updated",baseDocumentCopied:"Base document copied",translationCreatedToast:{title:e=>"Translation created: ".concat(e),description:e=>"The content from ‘".concat(e,"’ is copied into the new document translation.")},loading:"Loading languages...",draft:"Draft",missingTranslations:"Following languages are missing some translations compared to the base language",base:"Base",missing:"Missing",deleteAll:{buttonTitle:"Delete (incl. translations)",deleting:"Deleting..."},duplicateAll:{buttonTitle:"Duplicate (incl. translations)",duplicating:"Duplicating..."},translationsMaintenance:{title:"Translation Maintenance",selectSchemaPlaceholder:"Select schema type",idStructureMismatch:"document(s) with mismatched ID structures",missingLanguageField:"document(s) are missing the language field",missingDocumentRefs:"document(s) have missing translation references",missingBaseDocumentRefs:"document(s) have missing base document references",orphanDocuments:"orphaned translation document(s)",referenceBehaviorMismatch:"document(s) with mismatched reference behaviors",baseLanguageMismatch:"base document(s) with mismatched language field",fix:"Fix",pendingTransactionDialog:{header:"Confirm pending transaction",caution:"Before continuing please review the transactions. Keep in mind, the translation maintenance functionality may remove or update many documents at once. It is recommended to back-up your dataset before performing data maintenance",cancel:"Cancel",confirm:"Confirm operation"}},errors:{baseDocumentNotPublished:"It looks like you have not published your base translation yet. When using strong references it is required to publish the base document before publishing any translated entries"},languageSelect:{placeholder:"Switch language",listLabels:{existing:"Select document translations",missing:"Create new document translations"}}},Pe=(e,t,a)=>e.idStructure===Re.DELIMITER?"".concat(t).concat("__i18n_").concat(a||"*"):"".concat("i18n",".").concat(t,".").concat(a||"*"),Ge=(e,t)=>t?e.find((e=>e.id===t))||null:e.length>0?e[0]:null;function je(){return v({apiVersion:"2021-10-01"})}const Ke=async(e,t,a,n)=>{const i=(e=>e.map((e=>{if("string"==typeof e){const t=Ne.find((t=>t.value===e));return t?{title:t.title,id:e}:{title:e,id:e}}return"name"in e?(console.warn('The "name" field in your language configuration is deprecated, please replace it with "id".'),{title:e.title,id:e.name}):{title:e.title,id:e.id}})))(await(async()=>{if(Array.isArray(a))return a;const t=await e.fetch(a.query),n=a.value;return"string"==typeof n?t.map((e=>E(e,n))):t.map((e=>"name"in n?{name:E(e,n.name),title:E(e,n.title)}:{id:E(e,n.id),title:E(e,n.title)}))})());return t.languagesLoader?t.languagesLoader(i,null!=n?n:void 0):i},ze=e=>{if(!e)return;const t=e.replace(/^drafts\./,""),a=new RegExp("".concat("i18n","\\.([^.]+)\\.[^.]+")),n=t.match(a);if(n&&2===n.length)return n[1];const i=t.split("__i18n_");return i.length>0?i[0]:t},Fe=async function(e,t,a){let n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(t.idStructure===Re.DELIMITER){const t=a.split("-");t[t.length-1]="".concat(t[t.length-1]).concat("__i18n_","*");const i=await e.fetch(n?"*[_id match $segments]":"*[_id match $segments && !(_id in path('drafts.**'))]",{segments:t});return i?i.filter((e=>e._id.startsWith(a)||n&&e._id.startsWith("drafts.".concat(a)))):[]}const i=await e.fetch(n?"*[_id in path($path) || _id in path($draftPath)]":"*[_id in path($path)]",{path:Pe(t,a,"*"),draftPath:"drafts.".concat(Pe(t,a,"*"))});return null!=i?i:[]};function Ue(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return f({_type:"reference",_ref:e.replace("drafts.","")},!0===t?{_weak:!0}:{})}function xe(e,t){return(null==e?void 0:e[t.fieldNames.lang])||t.base||null}function He(e){return e.reduce(((e,t,a)=>{const n="number"==typeof t,i=b(t),l=n||i?"[]":"".concat(0===a?"":".").concat(t);return"".concat(e).concat(l)}),"")}function We(e,t){var a,n,i,l,r,s;return{base:(null==t?void 0:t.base)||(null==e?void 0:e.base)||"",languages:(null==t?void 0:t.languages)||(null==e?void 0:e.languages)||[],idStructure:(null==e?void 0:e.idStructure)||Re.DELIMITER,referenceBehavior:(null==e?void 0:e.referenceBehavior)||De.STRONG,withTranslationsMaintenance:!0===(null==e?void 0:e.withTranslationsMaintenance),shouldReload:null==e?void 0:e.shouldReload,languagesLoader:null==e?void 0:e.languagesLoader,fallbackLanguageSelect:null==e?void 0:e.fallbackLanguageSelect,customFlagComponents:null==e?void 0:e.customFlagComponents,fieldNames:{lang:(null==(a=null==t?void 0:t.fieldNames)?void 0:a.lang)||(null==(n=null==e?void 0:e.fieldNames)?void 0:n.lang)||"__i18n_lang",references:(null==(i=null==t?void 0:t.fieldNames)?void 0:i.references)||(null==(l=null==e?void 0:e.fieldNames)?void 0:l.references)||"__i18n_refs",baseReference:(null==(r=null==t?void 0:t.fieldNames)?void 0:r.baseReference)||(null==(s=null==e?void 0:e.fieldNames)?void 0:s.baseReference)||"__i18n_base"}}}function Ze(e,t){const a=y(),n=D((()=>{if(t){const e=a.get(t);if(e&&"boolean"!=typeof e.i18n)return null==e?void 0:e.i18n}return null}),[t,a]);return D((()=>We(e,n)),[n,e])}function Ve(e){return t=>{let{type:a,id:n,onComplete:i}=t;const l=K(),r=je(),s=Ze(e,a),o=ze(n),u=L.useRef(null),[c,d]=L.useState(null),[h,m]=L.useState(!1),{draft:g,published:p}=S(n,a),v=S(o,a),{publish:b}=_(n,a),{isValidating:y,validation:M}=C(n,a),I=w(n,a),A=w(o,a),E=function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:500,a=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];const[i,l]=k(e);return B((()=>{if(i!==e)if(e){if(a){const e=setTimeout((()=>l(!0)),t);return()=>clearTimeout(e)}l(!0)}else if(!e){if(n){const e=setTimeout((()=>l(!1)),t);return()=>clearTimeout(e)}l(!1)}}),[i,e,t,a,n]),i}(!!("published"===c||"publishing"===c||h||b.disabled||I.isSyncing||A.isSyncing||y||M.some((e=>"error"===e.level)))),N=L.useMemo((()=>"publishing"===c?Oe.publishing:h?Oe.updatingIntlFields:Oe.publish),[c,h]),D=L.useCallback((async()=>{m(!0);try{const e=g||p;e&&await async function(e,t,a,n){var i;const{_type:l,_id:r}=a,s=ze(r),o=r!==s,u=t.fieldNames.lang,c=t.fieldNames.references,d=t.fieldNames.baseReference,h=await Ke(e,t,t.languages,a),m=xe(a,t)||(null==(i=Ge(h,t.base))?void 0:i.id),g=e.transaction();if(g.createIfNotExists({_id:r,_type:l}),g.patch(r,{set:f({[u]:m},o&&t.referenceBehavior!==De.DISABLED?{[d]:Ue(s,t.referenceBehavior===De.WEAK)}:{})}),await g.commit(),n){const a=await Fe(e,t,s);if(a.length>0){const n=e.transaction();let i=[];t.referenceBehavior!==De.DISABLED&&(i=T(a.map((e=>{const a=xe(e,t);return a?f({_key:a},Ue(e._id,t.referenceBehavior===De.WEAK)):null}),{}))),n.patch(s,{set:{[c]:i}}),await n.commit()}}}(r,s,e,v.published),l.push({closable:!0,status:"success",title:Oe.intlFieldsUpdated})}catch(e){console.error(e),l.push({closable:!0,status:"error",title:e.toString()})}m(!1)}),[l,g,p,r,v.published,s]),R=L.useCallback((()=>{d("publishing");if(n!==o&&!v.published&&s.referenceBehavior===De.STRONG)throw new Error(Oe.errors.baseDocumentNotPublished);b.execute()}),[n,o,b,s,v.published]);return L.useEffect((()=>{const e="publishing"===c&&!g,t=e?"published":null,a=setTimeout((()=>{d(t)}),e?200:4e3);return()=>clearTimeout(a)}),[c,g]),L.useEffect((()=>{"published"===c&&(u.current||(u.current=D().then((()=>i&&i())).finally((()=>u.current=null))))}),[c,i,D]),{disabled:E,label:N,icon:"published"===c?te:ae,shortcut:E?null:"Ctrl+Alt+P",onHandle:R}}}const Ye={NOTHING_TO_DELETE:"This document doesn't yet exist or is already deleted"};function Je(e){return function(t){let{id:a,type:n,onComplete:i}=t;const l=K(),r=je(),s=Ze(e,n),o=N.useMemo((()=>ze(a)),[a]),u=S(o,n),c=w(a,n),d=w(o,n),{delete:h}=_(a,n),[m,g]=N.useState(!1),[f,p]=N.useState(!1),v=N.useCallback((()=>{p(!0)}),[]),b=N.useCallback((()=>{p(!1),i&&i()}),[i]),y=N.useCallback((async()=>{try{if(g(!0),p(!1),u.draft||u.published){const e=r.transaction();u.draft&&e.delete("drafts.".concat(o)),u.published&&e.patch(o,{unset:[s.fieldNames.references]}),await e.commit()}const e=await Fe(r,s,o,!0),t=r.transaction();e.forEach((e=>{t.delete(e._id)})),await t.commit(),h.execute(),i&&i()}catch(e){l.push({closable:!0,status:"error",title:e.toString()})}finally{g(!0)}}),[l,s,r,o,u.draft,u.published,h,i]);return{onHandle:v,tone:"critical",icon:ne,disabled:m||Boolean(h.disabled)||c.isSyncing||d.isSyncing,shortcut:"CTRL+ALT+D",title:h.disabled&&Ye[h.disabled]||"",label:m?Oe.deleteAll.deleting:Oe.deleteAll.buttonTitle,modal:f&&{type:"dialog",onClose:i,content:ue(de,{action:"delete",id:a,type:n,onCancel:b,onConfirm:y})}}}}const $e={NOTHING_TO_DUPLICATE:"This document doesn't yet exist so there's nothing to duplicate"};function qe(e){return t=>{let{id:a,type:n,draft:i,published:l}=t;const r=K(),s=je(),o=Ze(e,n),u=ze(a),{duplicate:c}=_(a,n),[d,h]=N.useState(!1),m=N.useCallback((async()=>{h(!0);try{const e=ge(),t=await Fe(s,o,u),a=s.transaction();a.create(f(f({},null!=i?i:l),{},{_id:e,_type:n})),t.forEach((t=>{const n=t._id.startsWith("drafts."),i=Pe(o,e,xe(t,o));a.create(f(f({},t),{},{_id:n?"drafts.".concat(i):i}))})),await a.commit()}catch(e){console.error(e),r.push({description:e.message})}h(!1)}),[s,o,r,u,n,i,l]);return{icon:ie,disabled:Boolean(c.disabled)||d,title:c.disabled&&$e[c.disabled]||"",label:d?Oe.duplicateAll.duplicating:Oe.duplicateAll.buttonTitle,onHandle:m}}}const Qe=(e,t,a)=>{let{schema:n,schemaType:i,documentId:l}=t;const r=n.get(i),s=r&&r.i18n,o=l===ze(l);let u=e;return s&&(u=u.map((e=>{const t="publish"===e.action,n="delete"===e.action;return t?Ve(a):n&&o?Je(a):e})),o&&u.push(qe(a))),u},Xe=R((function(e,t){let{value:a,onChange:n,onOpen:i}=e;const l=y(),r=D((()=>{var e;return null==(e=l._original)?void 0:e.types.filter((e=>!!e.i18n))}),[l]);return ce(z,{space:4,children:[ue(F,{children:Oe.translationsMaintenance.selectSchemaPlaceholder}),ue(U,{children:ue(x,{ref:t,fontSize:[2,2,3],icon:le,id:"i18n-schema-selector",options:null==r?void 0:r.map((e=>({value:e.name,payload:e}))),value:a,placeholder:"Search",openButton:{onClick:()=>i},onChange:n,renderValue:(e,t)=>(null==t?void 0:t.payload.title)||e,renderOption:e=>{let{payload:t}=e;return ue(U,{padding:2,radius:2,as:"button",children:ue(M,{layout:"default",title:t.title,media:t.icon})})}})})]})})),et=e=>{let{pending:t,count:a,labelName:n,children:i,onClick:l}=e;return ue(U,{padding:3,radius:2,shadow:1,tone:a>0?"caution":"default",children:ce(H,{align:"center",children:[ue(W,{flex:1,children:ce(F,{muted:a<=0,children:[ue("span",{children:a}),ue("span",{children:" "}),ue("span",{children:n?String(Oe.translationsMaintenance[n]):i})]})}),a>0&&ue(Z,{padding:2,fontSize:2,disabled:t,onClick:l,text:Oe.translationsMaintenance.fix})]})})},tt=(e,t,a,n)=>{var i;const l=null==(i=t.fieldNames)?void 0:i.lang,r=e.transaction();return n.forEach((e=>{const n=a.get(e._type),i=("object"==typeof n.i18n?n.i18n.base:void 0)||t.base;if(!e[l]){const t=(e=>{const t=new RegExp("".concat("i18n","\\.[^.]+\\.([^.]+)")),a=e.match(t);if(a&&2===a.length)return a[1];const n=e.split("__i18n_");return n.length>1?n[1]:void 0})(e._id)||i;r.patch(e._id,{set:{[l]:t}})}})),r},at=(e,t,a,n)=>{const i=t.fieldNames.references;return ye(a,50).map((a=>{const l=e.transaction();return a.forEach((e=>{let a=[];const r=n.filter((t=>ze(t._id)===e._id));t.referenceBehavior!==De.DISABLED&&(a=T(r.map((e=>{const a=xe(e,t);return a?f({_key:a},Ue(e._id,t.referenceBehavior===De.WEAK)):null}),{}))),l.patch(e._id,{set:{[i]:a}})})),l}))},nt=(e,t,a,n)=>{const i=e.transaction();return n.forEach((e=>{a.find((a=>{var n,i;return Array.isArray(null==e?void 0:e[t.fieldNames.references])&&(null==(n=null==e?void 0:e[t.fieldNames.references])?void 0:n.some((t=>t._ref===e._id)))||a._id===(null==(i=null==e?void 0:e[t.fieldNames.baseReference])?void 0:i._ref)}))||i.delete(e._id)})),i},it=async(e,t,a)=>{const n=await Ke(e,t,t.languages),i=Ge(n,t.base),l=t.fieldNames.lang,r=e.transaction();return a.forEach((e=>{e[l]!==(null==i?void 0:i.id)&&r.patch(e._id,{set:{[l]:null==i?void 0:i.id}})})),r},lt=(e,t,a)=>{const n=e.transaction();if(t.referenceBehavior!==De.DISABLED){const e=t.fieldNames.baseReference;a.forEach((a=>{if(!a[e]){const i=ze(a._id);n.patch(a._id,{set:{[e]:Ue(i,t.referenceBehavior===De.WEAK)}})}}))}return n},rt=fe(U)(t||(t=m(["\n grid-column-start: 1;\n grid-row-start: 1;\n"]))),st=fe(V)(a||(a=m(["\n word-break: break-word;\n white-space: break-spaces;\n"]))),ot=fe(H)(n||(n=m(["\n grid-column-start: 1;\n grid-row-start: 1;\n"]))),ut=R((function(e,t){let{config:a}=e;const[n,i]=k(""),l=je(),{pending:r,setPending:s,documents:o,baseDocuments:u,translatedDocuments:c,documentsSummaryInformation:d,fetchInformation:h}=((e,t)=>{const a=je(),n=Ze(e,t),[i,l]=N.useState(!1),[r,s]=N.useState([]),[o,u]=N.useState([]),c=N.useMemo((()=>n.idStructure===Re.DELIMITER?r.filter((e=>!e._id.includes("__i18n_"))):r.filter((e=>!e._id.startsWith("i18n")))),[n,r]),d=N.useMemo((()=>n.idStructure===Re.DELIMITER?r.filter((e=>e._id.includes("__i18n_"))):r.filter((e=>e._id.startsWith("i18n")))),[n,r]),h=N.useMemo((()=>n.idStructure===Re.DELIMITER?r.filter((e=>e._id.startsWith("i18n"))):r.filter((e=>e._id.includes("__i18n_")))),[n,r]),m=N.useCallback((async e=>{l(!0);const[t,i]=await Promise.all([Ke(a,n,n.languages),a.fetch("*[_type == $type && !(_id in path('drafts.**'))]",{type:e})]);u(t),s(i),l(!1)}),[n,a]),g=N.useMemo((()=>{var e,t,a;const i=Ge(o,n.base),l=c,s=d,u=null==(e=n.fieldNames)?void 0:e.lang,m=null==(t=n.fieldNames)?void 0:t.references,g=null==(a=n.fieldNames)?void 0:a.baseReference;return{idStructureMismatch:h,missingLanguageField:r.filter((e=>!e[u])),missingDocumentRefs:l.filter((e=>{const t=s.filter((t=>ze(t._id)===e._id));return Object.values(e[m]||[]).filter((e=>"reference"===e._type&&!!e._ref)).length!=t.length})),missingBaseDocumentRefs:s.filter((e=>!e[g])),orphanDocuments:s.filter((e=>!l.find((t=>ze(e._id)===t._id)))),referenceBehaviorMismatch:l.filter((e=>{const t=e[m]||[];return n.referenceBehavior===De.DISABLED?Object.keys(t).length>0:n.referenceBehavior===De.WEAK?Object.values(t).some((e=>!e._weak)):Object.values(t).some((e=>!!e._weak))})),baseLanguageMismatch:l.filter((e=>(null==i?void 0:i.id)&&e[u]!==i.id))}}),[n,r,o,c,d,h]);return N.useEffect((()=>{t&&m(t)}),[t]),{pending:i,setPending:l,documents:r,baseDocuments:c,translatedDocuments:d,idStructureMismatchDocuments:h,documentsSummaryInformation:g,fetchInformation:m}})(a,n),[m,g]=k(null),p=y(),v=Ze(a,n),b=O((e=>i(e)),[]),S=O((()=>i("")),[]),_=O((()=>{g(((e,t,a,n)=>{const i=t.fieldNames.references,l=new Set(n.map((e=>ze(e._id)))),r=e.transaction();l.forEach((e=>{r.patch(e,{set:{[i]:[]}})}));const s=be(n.filter((e=>e._id!==ze(e._id))),100).map((n=>{const l=e.transaction();return n.forEach((e=>{const n=ze(e._id),r=xe(e,t);if(r){const s=Pe(t,n,r);l.createIfNotExists(f(f({},e),{},{_id:s,_type:a})),l.delete(e._id),t.referenceBehavior!==De.DISABLED&&(l.patch(n,{setIfMissing:{[i]:[]}}),l.patch(n,{insert:{after:"".concat(i,"[-1]"),items:[f({_key:r},Ue(s,t.referenceBehavior===De.WEAK))]}}))}})),l}));return[r,...s]})(l,v,n,o))}),[l,v,n,o]),C=O((()=>{g([tt(l,v,p,o)])}),[l,p,v,o]),w=O((()=>{g(at(l,v,u,c))}),[l,v,u,c]),M=O((()=>{g([lt(l,v,c)])}),[l,v,c]),I=O((()=>{g([nt(l,v,u,c)])}),[l,v,u,c]),A=O((()=>{g(at(l,v,u,c))}),[l,v,u,c]),E=O((async()=>{g([await it(l,v,u)])}),[l,v,u]),T=O((()=>{if(m){const e=JSON.stringify(m.map((e=>e.toJSON())),null,2),t=new Blob([e],{type:"application/json"}),a=URL.createObjectURL(t),n=document.createElement("a");n.href=a,n.download="transactions.json",n.style.display="none",document.body.appendChild(n),n.click(),URL.revokeObjectURL(a)}}),[m]),L=O((()=>{g(null)}),[g]),B=O((async()=>{s(!0);try{m&&(await m.reduce((async(e,t)=>{await e,await t.commit()}),Promise.resolve()),await h(n),g(null))}catch(e){console.error(e)}finally{s(!1)}}),[s,h,n,m]);return ce(Y,{width:1,children:[ce(z,{space:2,children:[ue(W,{padding:4,children:ue(Xe,{value:n,onChange:b,onOpen:S,ref:t})}),!!n&&ue(W,{paddingX:4,children:ce(z,{space:2,children:[ue(et,{pending:r,count:d.idStructureMismatch.length,labelName:"idStructureMismatch",onClick:_}),ue(et,{pending:r,count:d.missingLanguageField.length,labelName:"missingLanguageField",onClick:C}),ue(et,{pending:r,count:d.missingDocumentRefs.length,labelName:"missingDocumentRefs",onClick:w}),ue(et,{pending:r,count:d.missingBaseDocumentRefs.length,labelName:"missingBaseDocumentRefs",onClick:M}),ue(et,{pending:r,count:d.orphanDocuments.length,labelName:"orphanDocuments",onClick:I}),ue(et,{pending:r,count:d.referenceBehaviorMismatch.length,labelName:"referenceBehaviorMismatch",onClick:A}),ue(et,{pending:r,count:d.baseLanguageMismatch.length,labelName:"baseLanguageMismatch",onClick:E})]})})]}),!!(null==m?void 0:m.length)&&ue(J,{id:"confirm-pending-transactions",width:2,header:Oe.translationsMaintenance.pendingTransactionDialog.header,onClose:L,footer:ue(H,{padding:3,justify:"flex-end",children:ce($,{autoFlow:"column",autoCols:"auto",gap:2,children:[ue(Z,{tone:"default",loading:r,disabled:r,text:Oe.translationsMaintenance.pendingTransactionDialog.cancel,onClick:L}),ue(Z,{tone:"critical",loading:r,disabled:r,text:Oe.translationsMaintenance.pendingTransactionDialog.confirm,onClick:B})]})}),children:ce(z,{padding:3,space:3,children:[ue(U,{padding:3,radius:2,shadow:1,tone:"caution",children:ue(F,{size:2,children:Oe.translationsMaintenance.pendingTransactionDialog.caution})}),ce($,{cols:1,children:[ue(rt,{padding:3,radius:2,shadow:1,tone:"default",children:ue(st,{language:"json",children:JSON.stringify(m.map((e=>e.toJSON())),null,2)})}),ue(ot,{padding:2,justify:"flex-end",align:"flex-start",onClick:T,children:ue(Z,{text:"Download"})})]})]})})]})}));const ct=e=>e.document(),dt=e=>{const{S:t,schema:a}=e,n=[],i=t.documentTypeListItems().filter((e=>{let t=e.getSchemaType();t="string"==typeof t?a.get(t):t;const i=t&&t.i18n;return i||n.push(e),i}));return{withoutI18n:n,withI18n:i}},ht=e=>{const{S:t}=e,a=function(e){return R((function(t,a){return ue(ut,f(f({},e),{},{ref:a}))}))}(e);return t.component(a).title(Oe.translationsMaintenance.title).id("__i18n_translations_maintenance_tab")},mt=e=>{const{S:t}=e;return t.listItem().id("__i18n_translations_maintenance_tab").title(Oe.translationsMaintenance.title).icon(le).child(ht(e))},gt=e=>{const{S:t,config:a,schema:n}=e,i=We(a,"object"==typeof n.i18n?n.i18n:void 0),l=dt(e),r={[Re.SUBPATH]:(e,t)=>t.filter("!(_id in path($path)) && !(_id in path($drafts)) && _type == $type").params({path:"".concat("i18n",".**"),drafts:"drafts.".concat("i18n",".**"),type:e.getId()}),[Re.DELIMITER]:(e,t)=>t.filter("!(_id match $id) && _type == $type").params({id:"*".concat("__i18n_","*"),type:e.getId()})},s=[...l.withoutI18n,...l.withI18n.map((e=>{const a=e.getSchemaType(),n="string"==typeof a?a:null==a?void 0:a.name;return e.child(r[i.idStructure](e,t.documentList().id(e.getId()||"").title(e.getTitle()||"").schemaType(null!=n?n:"").menuItems([...n?t.orderingMenuItemsForType(n):[]])))}))];return i.withTranslationsMaintenance&&s.splice(0,0,mt(e)),s.map((e=>e.serialize()))};function ft(e){const{S:t}=e;if(0===dt(e).withI18n.length)return t.defaults();const a=gt(e);return t.list().id("__root__").title("Content").items(a).showIcons(a.some((e=>{return!(!(t=e.schemaType)||"string"==typeof t)&&Boolean(t.icon);var t})))}function pt(e){return(t,a)=>{const{document:n,path:i,type:l}=a,r=null==l?void 0:l.options;if(!n)throw new Error("`document` was not provided in validation context.");if(!i)throw new Error("`path` was not provided in validation context.");const s=(null==r?void 0:r.disableArrayWarning)||!1,o=ze(n._id),u=n._type,c=He(i.concat("current"));if(!s&&c.includes("[]")){const e=He(i);console.warn(["Slug field at path ".concat(e," is within an array and cannot be automatically checked for uniqueness"),'If you need to check for uniqueness, provide your own "isUnique" method',"To disable this message, set `disableArrayWarning: true` on the slug `options` field"].join("\n"))}const d=["_type == $docType",'!(_id in path("drafts.**"))',"_id != $baseId",'!(_id in path("i18n." + $baseId + ".*"))','!(_id match $baseId + "'.concat("__i18n_",'*")'),"".concat(c," == $slug")].join(" && ");return e.fetch("!defined(*[".concat(d,"][0]._id)"),{docType:u,baseId:o,slug:t},{tag:"validation.slug-is-unique"})}}const vt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(!e)return"";switch(e.toLocaleLowerCase()){case"en":return"gb";case"sq":return"al";default:return e}},bt=P({}),yt=fe(W)(i||(i=m(["\n min-width: 24px;\n transform: translateY(1px);\n"]))),St=e=>{let{code:t,langCulture:a}=e;const n=D((()=>t&&function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(!e)return"";const t=vt(e);if(!Le.includes(t.toUpperCase()))return"";return Ce(t)}(t)),[t]),i=Se.parse(null!=n?n:"🇺🇳",{folder:"svg",ext:".svg"}),l=_e(i),{customFlagComponents:r}=G(bt),s=D((()=>{if(a&&r){const e=a.replace(/[^a-zA-Z0-9_]/g,"_");if(e in r)return r[e]}return null}),[a,r]);return ue(W,{"aria-label":t,children:s&&t?ue(s,{code:t}):ue(yt,{children:l})})};const _t={},Ct={apiVersion:"v2022-05-09"};const wt=(e,t)=>{var a,n;return Number(null!=(a=e.isBase)?a:0)-Number(null!=(n=t.isBase)?n:0)};function Mt(e){let{children:t}=e;return ue(W,{padding:2,children:ue(F,{muted:!0,size:1,children:t})})}const It=R((function(e,t){return ue("svg",f(f({"data-sanity-icon":"splitPane",width:"1em",height:"1em",viewBox:"0 0 25 25",fill:"none",xmlns:"http://www.w3.org/2000/svg",ref:t},e),{},{children:ue("path",{d:"M10.5 5.5V19.5M13 12.5H15.5M18 12.5H15.5M15.5 12.5V15M15.5 12.5V10M4.5 5.5H20.5V19.5H4.5V5.5Z",stroke:"currentColor",strokeWidth:1.2})}))})),At=P({currentDocumentId:null,currentDocumentType:null,baseLanguage:null,currentLanguage:null}),Et=pe(l||(l=m(["\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n"]))),Tt=fe(re)(r||(r=m(["\n animation: "," 500ms linear infinite;\n"])),Et),Lt=fe(Z)(s||(s=m(["\n display: none;\n flex-shrink: 0;\n margin-left: 4px;\n\n & svg {\n display: block;\n color: ",";\n }\n\n ","\n"])),Ee.gray[700].hex,(e=>{let{theme:t}=e;return ve(o||(o=m(["\n @media (min-width: ","em) {\n display: block;\n }\n "])),t.sanity.media[1]/16)})),Nt=N.forwardRef(((e,t)=>ue("button",f({type:"button",ref:t},e)))),kt=fe.button(u||(u=m(["\n color: ",";\n background-color: ",";\n\n span {\n color: ",";\n }\n"])),(e=>{let{theme:t}=e;return t.sanity.color.button.default.primary.enabled.fg}),(e=>{let{theme:t}=e;return t.sanity.color.button.default.primary.enabled.bg}),(e=>{let{theme:t}=e;return t.sanity.color.button.default.primary.enabled.fg})),Bt=e=>{let{status:t,language:a}=e;const n=K(),i=G(bt),l=je(),{currentDocumentId:r,currentDocumentType:s,baseLanguage:o}=N.useContext(At);if(!r||!s)throw new Error("No document in view");const u=Ze(i,s),c=N.useContext(Te),{routerPanesState:d,groupIndex:h,replaceCurrent:m}=he(),[g,p]=N.useState(!1),v=N.useMemo((()=>ze(r)),[r]),b=N.useMemo((()=>a.id.split(/[_-]/).pop()),[a.id]),y=N.useMemo((()=>a.id===(null==o?void 0:o.id)?v:Pe(u,v,a.id)),[u,v,a.id,o]),_=S(v,s),C=N.useMemo((()=>a.isBase?a.title.length>=20?Oe.base.split(" ")[0]:Oe.base:null),[a]),w=N.useCallback(((e,t)=>{m({id:e,params:{type:t}})}),[m]),M=N.useCallback(((e,t)=>{if(!c)return;const a=[...d];a.splice(h+1,0,[{id:e,params:{type:t}}]);const n=c.resolvePathFromState({panes:a});c.navigateUrl({path:n})}),[c,d,h]),I=N.useCallback((async()=>{try{p(!0);const e=_.draft||_.published,t=u.fieldNames.lang,i=u.fieldNames.references,r=u.fieldNames.baseReference,c=u.referenceBehavior;await l.createIfNotExists(f(f({_id:"drafts.".concat(y),_type:s},e?Ae(e,["_id","_type",i]):{}),{},{[t]:a.id},(null==e?void 0:e._id)&&c!==De.DISABLED?{[r]:{_type:"reference",_ref:e._id.replace("drafts.",""),_weak:!0,_strengthenOnPublish:{type:s,weak:"weak"===c,template:{id:s,params:void 0}}}}:{})),n.push({closable:!0,status:"success",title:Oe.translationCreatedToast.title(a.title),description:o?Oe.translationCreatedToast.description(o.title):void 0}),w(y,s)}catch(e){n.push({closable:!0,status:"error",title:e.toString()})}finally{p(!1)}}),[u,_,y,s,a.id,a.title,n,o,w,l]),A=N.useCallback((()=>{w(y,s)}),[w,y,s]),E=N.useCallback((()=>{M(y,s)}),[M,y,s]);return"missing"===t?ue(q,{as:Nt,"data-as":"button",disabled:g,icon:g?Tt:se,text:a.title,onClick:I}):ce(H,{children:[ue(q,{as:a.isCurrentLanguage?kt:Nt,"data-as":"button","data-selected":a.isCurrentLanguage,selected:a.isCurrentLanguage,onClick:A,paddingY:1,paddingX:2,children:ce(H,{align:"center",gap:2,children:[ue(St,{code:b,langCulture:a.id}),ue(W,{flex:1,children:ue(F,{children:a.title})}),C?ue(Q,{fontSize:0,children:C}):null]})}),!a.isCurrentLanguage&&ue(Lt,{type:"button",tone:"default",mode:"bleed",padding:2,onClick:E,children:ue(It,{width:19,height:19})})]})},Dt=fe(W)(c||(c=m(["\n border-bottom: 1px solid var(--card-shadow-outline-color);\n"]))),Rt=fe(W)(d||(d=m(["\n minwidth: 250;\n"]))),Ot=e=>{let{draftLanguageObjects:t,publishedLanguageObjects:a,missingLanguageObjects:n}=e;const i=N.useMemo((()=>Boolean(!(!t.length&&!a.length)&&n.length)),[t,a,n]),l=N.useMemo((()=>[...t.map((e=>f(f({},e),{},{status:"draft"}))),...a.map((e=>f(f({},e),{},{status:"published"})))].sort(wt).reverse()),[t,a]);return ce(Rt,{children:[!!l.length&&ce(W,{children:[ue(Mt,{children:Oe.languageSelect.listLabels.existing}),ue($,{columns:1,gap:1,children:l.map((e=>ue(Bt,{status:e.status,language:e},e.id)))})]}),i&&ue(Dt,{marginY:1}),!!n.length&&ce(W,{children:[ue(Mt,{children:Oe.languageSelect.listLabels.missing}),ue($,{columns:1,gap:1,children:n.map((e=>ue(Bt,{status:"missing",language:e},e.id)))})]})]})},Pt={constrainSize:!0,placement:"bottom",portal:!0},Gt=e=>{let{schemaType:t,document:a}=e;var n,i;const l=Ze(G(bt),t.name),[r,s]=function(e,t){const a=je(),{draft:n,published:i}=S(t._id.replace(/^drafts\./,""),t._type),[l,r]=k(!1),[s,o]=k([]),u=O((async()=>{if(0===s.length||e.shouldReload&&e.shouldReload(null!=n?n:i)){r(!0);const t=await Ke(a,e,e.languages,null!=n?n:i);o(t),r(!1)}}),[a,e,n,i,s]);return B((()=>{u()}),[n,i,s,e,u]),[l,s]}(l,a),o=N.useMemo((()=>Ge(s,l.base)),[s,l.base]),u=N.useMemo((()=>xe(a,l)||(o?o.id:null)),[a,o,l]),c=N.useMemo((()=>s.find((e=>e.id===u))),[s,u]),d=N.useMemo((()=>null==u?void 0:u.split(/[-_]/).pop()),[u]),h='*[_type == $type && _id in $ids]{\n _id,\n "'.concat(l.fieldNames.lang,'": ').concat(l.fieldNames.lang,"\n }"),m=N.useMemo((()=>{const e=ze(a._id),t=s.map((t=>t===o?e:Pe(l,e,t.id))),n=t.map((e=>"drafts.".concat(e)));return{ids:[...t,...n],type:a._type}}),[l,o,s,a._id,a._type]),{loading:g,data:p}=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:_t,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Ct;const[n,i]=k(!0),[l,r]=k(!1),[s,o]=k(null),u=j(null),c=I();return B((()=>(e&&(u.current=c.listenQuery(e,t,a).pipe(we(Ie),Me((e=>(console.error(e),r(e),i(!1),o(null),e)))).subscribe((e=>{o((t=>Ie(t,e)?t:e)),i(!1),r(!1)}))),()=>u.current?u.current.unsubscribe():void 0)),[e,t,a]),{loading:n,error:l,data:s}}(h,m),v=N.useMemo((()=>{const e=[],t=[],a=[];if(!(null==p?void 0:p.length))return{draftLanguageObjects:e,publishedLanguageObjects:t,missingLanguageObjects:a};const n=p.reduce(((e,t)=>{if(!t._id.startsWith("drafts.")){return p.some((e=>e._id==="drafts.".concat(t._id)))?e:[...e,t]}return[...e,t]}),[]),i=new Map;return n.forEach((e=>{const t=E(null!=e?e:{},l.fieldNames.lang),a=e&&e._id.replace(/^drafts\./,"")===ze(e._id);t?i.set(t,e):a&&(null==o?void 0:o.id)&&i.set(o.id,e)})),s.forEach(((n,l)=>{const r=f(f({},n),{},{isBase:o?n.id===o.id:0===l,isCurrentLanguage:n.id===u}),s=i.get(n.id);(null==s?void 0:s._id)&&!s._id.startsWith("drafts.")?t.push(r):(null==s?void 0:s._id)&&s._id.startsWith("drafts.")?e.push(r):a.push(r)})),{draftLanguageObjects:e,publishedLanguageObjects:t,missingLanguageObjects:a}}),[l,s,o,p,u]);return!c||!u||r||g||0===s.length?ue(Z,{disabled:!0,mode:"bleed",padding:3,loading:r||g,iconRight:oe,text:Oe.languageSelect.placeholder}):ue(At.Provider,{value:{baseLanguage:o,currentLanguage:c,currentDocumentType:a._type,currentDocumentId:a._id},children:ue(X,{id:"document-internationalization/language-select",popover:Pt,button:ue(Z,{paddingY:1,paddingX:2,mode:"bleed",title:null!=(n=c.title)?n:c.id,children:ce(H,{align:"center",gap:2,children:[ue(St,{code:d,langCulture:u}),ue(W,{flex:1,children:ue(F,{children:null!=(i=c.title)?i:c.id})}),ue(oe,{width:19,height:19})]})}),menu:ue(ee,{children:ue(Ot,f({},v))})})})};function jt(t){const{config:a}=t,n=h(t,e),i=t.value;return ce(bt.Provider,{value:a,children:[i._id&&ue(H,{flex:1,justify:"flex-end",children:ue(Gt,{schemaType:t.schemaType,document:i})}),t.renderDefault(n)]})}const Kt=A((e=>({name:"document-i18n",document:{actions:(t,a)=>Qe(t,a,e),badges:t=>{return[...t,(a=e,e=>{const t=Ze(a,e.type),n=e.draft||e.published,i=n?xe(n,t):null;return i?{label:i,color:"success"}:null})];var a}},form:{components:{input(t){const{value:a}=t;return t.schemaType.i18n&&"object"==typeof a&&(null==a?void 0:a._id)?ue(jt,f({config:e},t)):t.renderDefault(t)}}}})));function zt(e,t){var a;const n=Kt(t);return T([...Array.isArray(e)?e:e(t),null==(a=t.includeDeskTool)||a?me({structure:(e,a)=>{let{schema:n}=a;return ft({S:e,schema:n,config:t})}}):null,n])}export{Be as I18nDelimiter,ke as I18nPrefix,Re as IdStructure,Ne as LanguageCultures,De as ReferenceBehavior,Le as SupportedEmojiFlagCodes,Oe as UiMessages,Je as createDeleteAction,qe as createDuplicateAction,pt as createIsSlugUnique,Ve as createPublishAction,Kt as documentI18n,ct as getDefaultDocumentNode,ft as getDocumentList,dt as getDocumentTypes,gt as getFilteredDocumentTypeListItems,mt as getMaintenanceListItem,ht as getMaintenanceTabComponent,Qe as resolveActions,zt as withDocumentI18nPlugin};
2
+ //# sourceMappingURL=index.esm.js.map