sanity-plugin-internationalized-array 5.2.3 → 5.3.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.
package/README.md CHANGED
@@ -126,8 +126,18 @@ languages: async (client, {market = ``}) => {
126
126
  The "Add translation" buttons can be positioned in one or multiple locations by configuring `buttonLocations`:
127
127
 
128
128
  - `field` (default) Below the internationalized array field
129
- - `unstable__fieldAction` Inside a Field Action (currently unstable)
129
+ - `fieldMenu` One translate icon per field that opens a language menu
130
130
  - `document` Above the document fields, these buttons will add a new language item to every internationalized array field that can be found at the **root of the document**. Nested internationalized arrays are not yet supported.
131
+ - `unstable__fieldAction` Inside a Field Action (still accepted in config; currently unstable)
132
+
133
+ All locations are additive, so `field`, `fieldMenu`, and `document` can be used together.
134
+
135
+ ![The fieldMenu control: one translate icon opens a language menu](./img/field-menu.jpeg)
136
+
137
+ > [!WARNING]
138
+ > Do not use `unstable__fieldAction` on **this plugin 4.0.4 or later**. It crashes the document editor with `useFormValue must be used within a FormValueProvider` — on Studio 4 and above.
139
+ >
140
+ > The break is this plugin, not a Studio major. **4.0.4** ([#633](https://github.com/sanity-io/plugins/pull/633)) moved the language provider onto `document.components.unstable_layout`, so field actions now run outside `FormValueProvider` and throw. Last working plugin: **4.0.0** (and 3.x). Use `field`, `fieldMenu`, and/or `document` instead.
131
141
 
132
142
  To control the "Add translation" button titles, configure `languageDisplay`. This also affects language field labels.
133
143
 
@@ -135,7 +145,7 @@ To control the "Add translation" button titles, configure `languageDisplay`. Thi
135
145
  - `titleOnly` Shows the language title
136
146
  - `titleAndCode` Shows the language title with the code in parentheses
137
147
 
138
- The "Add all languages" button can be hidden with `buttonAddAll`.
148
+ The "Add all languages" / "Add missing languages" control can be hidden with `buttonAddAll`. Under `field` that hides the bar below the per-language buttons. Under `fieldMenu` that hides the bulk item inside the language menu.
139
149
 
140
150
  By default, opening a document reorders internationalized array items to match
141
151
  the configured `languages` order. That can create a draft (and a history entry)
@@ -150,7 +160,7 @@ export default defineConfig({
150
160
  plugins: [
151
161
  internationalizedArray({
152
162
  // ...other config
153
- buttonLocations: ['field', 'unstable__fieldAction', 'document'], // default ['field']
163
+ buttonLocations: ['field', 'fieldMenu', 'document'], // default ['field'] — locations are additive
154
164
  buttonAddAll: false, // default true
155
165
  restoreOrder: false, // default true
156
166
  languageDisplay: 'codeOnly', // codeOnly (default) | titleOnly | titleAndCode
package/dist/index.d.ts CHANGED
@@ -125,12 +125,19 @@ type PluginConfig = {
125
125
  */
126
126
  fieldTypes: (string | RuleTypeConstraint | FieldDefinition)[];
127
127
  /**
128
- * Locations where the "+ EN" add language buttons are visible
128
+ * Locations where the "+ EN" add language buttons are visible.
129
+ * `fieldMenu` is one translate icon per field that opens a
130
+ * language menu (compact; stable UI; no field actions). All locations are
131
+ * additive, so `field`, `fieldMenu`, and `document` can be combined.
132
+ * `unstable__fieldAction` is still accepted but crashes the editor from
133
+ * plugin 4.0.4 onward on Studio 4 and above.
129
134
  * @defaultValue ['field']
130
135
  * */
131
- buttonLocations?: ('field' | 'unstable__fieldAction' | 'document')[];
136
+ buttonLocations?: ('field' | 'fieldMenu' | 'unstable__fieldAction' | 'document')[];
132
137
  /**
133
- * Show or hide the "Add missing languages" button
138
+ * Show or hide the "Add all languages" / "Add missing languages" control.
139
+ * Under `field` this is the bar below the per-language buttons. Under
140
+ * `fieldMenu` it is the bulk item inside the language menu.
134
141
  * @defaultValue true
135
142
  * */
136
143
  buttonAddAll?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/cache.ts","../src/constants.ts","../src/plugin.tsx","../src/utils/internationalizedArrayLanguageFilter.ts"],"mappings":";;;KAEY;EACV,IAAI,KAAK;EACT;;KAGU;KAEA;EACV;EACA,MAAM;EACN,WAAW;EACX;EACA;EACA;EACA;EACA,aAAa,OAAO;EACpB;KAAU;IAAuB;OAAW;;;;;;;KAMlC;EACV;;EAEA;EACA;;iBAGc,iCACd,eACC,QAAQ;KAIC,2BAA2B;EACrC;EACA,QAAQ;;EAER;;;;EAIA;;KAGU,oBACV,QAAQ,cACR,eAAe,4BACZ,QAAQ;KAED;KAEA;;;;;EAKV;;;;;;;;;;;;;EAaA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BT,WAAW,aAAa;;;;;;;;;EASxB;;;;;;;;;;;;;;;;;;;;;;;;EAyBA,sBAAsB,qBAAqB;;;;;EAK3C;;;;;EAKA;;;;;;;;;;;EAWA;;;;;EAKA,kBAAkB;;;;;;;;;;EAUlB,0BAA0B;;;;;;;;;;;;EAY1B;IACE,eAAe,SAAS;IACxB,mBAAmB;;;cC5JV;;;;;;;;;;;;;;;;;;;;;;;;cCJA;cCZA,yCAAsB,OAAA;;;;;cCJtB,uCAAoC,eAChC,kBAAgB,SACtB,cAAc,eAAa,+BACP,aAChB,qCAAmC,WACrC"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/cache.ts","../src/constants.ts","../src/plugin.tsx","../src/utils/internationalizedArrayLanguageFilter.ts"],"mappings":";;;KAEY;EACV,IAAI,KAAK;EACT;;KAGU;KAEA;EACV;EACA,MAAM;EACN,WAAW;EACX;EACA;EACA;EACA;EACA,aAAa,OAAO;EACpB;KAAU;IAAuB;OAAW;;;;;;;KAMlC;EACV;;EAEA;EACA;;iBAGc,iCACd,eACC,QAAQ;KAIC,2BAA2B;EACrC;EACA,QAAQ;;EAER;;;;EAIA;;KAGU,oBACV,QAAQ,cACR,eAAe,4BACZ,QAAQ;KAED;KAEA;;;;;EAKV;;;;;;;;;;;;;EAaA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BT,WAAW,aAAa;;;;;;;;;EASxB;;;;;;;;;;;;;;;;;;;;;;;;EAyBA,sBAAsB,qBAAqB;;;;;;;;;;EAU3C;;;;;;;EAOA;;;;;;;;;;;EAWA;;;;;EAKA,kBAAkB;;;;;;;;;;EAUlB,0BAA0B;;;;;;;;;;;;EAY1B;IACE,eAAe,SAAS;IACxB,mBAAmB;;;cCnKV;;;;;;;;;;;;;;;;;;;;;;;;cCJA;cCZA,yCAAsB,OAAA;;;;;cCJtB,uCAAoC,eAChC,kBAAgB,SACtB,cAAc,eAAa,+BACP,aAChB,qCAAmC,WACrC"}
package/dist/index.js CHANGED
@@ -7,16 +7,17 @@ import { useToast } from "@sanity/ui/toast";
7
7
  import { randomKey } from "@sanity/util/content";
8
8
  import { useDocumentPane } from "sanity/structure";
9
9
  import { AddIcon } from "@sanity/icons/Add";
10
- import { createContext, createElement, use, useCallback, useContext, useDeferredValue, useEffect } from "react";
10
+ import { createContext, createElement, use, useCallback, useContext, useDeferredValue, useEffect, useId } from "react";
11
11
  import get from "lodash-es/get.js";
12
12
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
13
  import { TranslateIcon } from "@sanity/icons/Translate";
14
14
  import camelCase from "lodash-es/camelCase.js";
15
15
  import upperFirst from "lodash-es/upperFirst.js";
16
+ import { EventsContext } from "sanity/_singletons";
17
+ import { Menu, MenuButton, MenuDivider, MenuItem } from "@sanity/ui/menu";
16
18
  import { Code } from "@sanity/ui/code";
17
19
  import { WarningOutlineIcon } from "@sanity/icons/WarningOutline";
18
20
  import { RemoveCircleIcon } from "@sanity/icons/RemoveCircle";
19
- import { Menu, MenuButton, MenuItem } from "@sanity/ui/menu";
20
21
  import { Tooltip } from "@sanity/ui/tooltip";
21
22
  const namespace = "sanity-plugin-internationalized-array", functionKeyCache = /* @__PURE__ */ new WeakMap(), promiseCache = /* @__PURE__ */ new Map(), functionCache = /* @__PURE__ */ new Map();
22
23
  function stringifyCacheKey(key) {
@@ -436,7 +437,11 @@ function checkAllLanguagesArePresent(languages, value) {
436
437
  * or `"Add missing languages"` (plural) depending on how many are left.
437
438
  */
438
439
  function createAddAllTitle(value, languages) {
439
- return value?.length ? `Add missing ${languages.length - value.length === 1 ? "language" : "languages"}` : languages.length === 1 && languages[0] ? `Add ${languages[0].title} Field` : "Add all languages";
440
+ if (value?.length) {
441
+ let languagesInUse = new Set(value.map((item) => item[LANGUAGE_FIELD_NAME]));
442
+ return `Add missing ${languages.filter((language) => !languagesInUse.has(language.id)).length === 1 ? "language" : "languages"}`;
443
+ }
444
+ return languages.length === 1 && languages[0] ? `Add ${languages[0].title} Field` : "Add all languages";
440
445
  }
441
446
  function isInternationalizedArrayItemType(type) {
442
447
  return type.startsWith("internationalizedArray") && type.endsWith("Value");
@@ -576,7 +581,66 @@ const internationalizedArrayLanguageFilter = (enclosingType, _member, selectedLa
576
581
  return !language || languages.find((l) => l.id === language) ? language ? selectedLanguageIds.includes(language) : !1 : !0;
577
582
  }
578
583
  return !0;
579
- }, schemaExample = { languages: [{
584
+ };
585
+ /**
586
+ * One translate-icon button that opens a language menu — the `fieldMenu`
587
+ * location. Compact, uses only stable `@sanity/ui`, and stays visible even
588
+ * when every language is already present.
589
+ */
590
+ function CompactAddButton(props) {
591
+ let $ = c(27), { readOnly, languagesInUse, handleClick, onAddAll, buttonAddAll, addAllTitle, allFilteredLanguagesArePresent } = props, { languageDisplay, filteredLanguages: languages } = useInternationalizedArrayContext(), menuId = useId();
592
+ if (!languages.length) return null;
593
+ let t0;
594
+ $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = {
595
+ portal: !0,
596
+ placement: "bottom-end"
597
+ }, $[0] = t0) : t0 = $[0];
598
+ let t1;
599
+ $[1] === readOnly ? t1 = $[2] : (t1 = /* @__PURE__ */ jsx(Button, {
600
+ mode: "bleed",
601
+ tone: "default",
602
+ fontSize: 1,
603
+ padding: 2,
604
+ icon: TranslateIcon,
605
+ "aria-label": "Add translation",
606
+ title: "Add translation",
607
+ "data-testid": "add-translation-menu",
608
+ disabled: readOnly
609
+ }), $[1] = readOnly, $[2] = t1);
610
+ let t2;
611
+ if ($[3] !== handleClick || $[4] !== languageDisplay || $[5] !== languages || $[6] !== languagesInUse || $[7] !== readOnly) {
612
+ let t3;
613
+ $[9] !== handleClick || $[10] !== languageDisplay || $[11] !== languagesInUse || $[12] !== readOnly ? (t3 = (language) => /* @__PURE__ */ jsx(MenuItem, {
614
+ text: getLanguageDisplay(languageDisplay, language.title, language.id),
615
+ icon: AddIcon,
616
+ disabled: readOnly || languagesInUse.includes(language.id),
617
+ "data-testid": `field-menu-add-${language.id}`,
618
+ onClick: () => handleClick(language.id)
619
+ }, language.id), $[9] = handleClick, $[10] = languageDisplay, $[11] = languagesInUse, $[12] = readOnly, $[13] = t3) : t3 = $[13], t2 = languages.map(t3), $[3] = handleClick, $[4] = languageDisplay, $[5] = languages, $[6] = languagesInUse, $[7] = readOnly, $[8] = t2;
620
+ } else t2 = $[8];
621
+ let t3;
622
+ $[14] !== addAllTitle || $[15] !== allFilteredLanguagesArePresent || $[16] !== buttonAddAll || $[17] !== onAddAll || $[18] !== readOnly ? (t3 = buttonAddAll ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuDivider, {}), /* @__PURE__ */ jsx(MenuItem, {
623
+ text: addAllTitle,
624
+ icon: TranslateIcon,
625
+ disabled: readOnly || allFilteredLanguagesArePresent,
626
+ "data-testid": "field-menu-add-all",
627
+ onClick: onAddAll
628
+ })] }) : null, $[14] = addAllTitle, $[15] = allFilteredLanguagesArePresent, $[16] = buttonAddAll, $[17] = onAddAll, $[18] = readOnly, $[19] = t3) : t3 = $[19];
629
+ let t4;
630
+ $[20] !== t2 || $[21] !== t3 ? (t4 = /* @__PURE__ */ jsxs(Menu, { children: [t2, t3] }), $[20] = t2, $[21] = t3, $[22] = t4) : t4 = $[22];
631
+ let t5;
632
+ return $[23] !== menuId || $[24] !== t1 || $[25] !== t4 ? (t5 = /* @__PURE__ */ jsx(Flex, {
633
+ justify: "flex-end",
634
+ "data-testid": "field-menu",
635
+ children: /* @__PURE__ */ jsx(MenuButton, {
636
+ id: menuId,
637
+ popover: t0,
638
+ button: t1,
639
+ menu: t4
640
+ })
641
+ }), $[23] = menuId, $[24] = t1, $[25] = t4, $[26] = t5) : t5 = $[26], t5;
642
+ }
643
+ const schemaExample = { languages: [{
580
644
  id: "en",
581
645
  title: "English"
582
646
  }, {
@@ -698,6 +762,17 @@ function MigrationBanner(t0) {
698
762
  }), $[9] = t5, $[10] = t9), t9;
699
763
  }
700
764
  /**
765
+ * The events store has finished loading and recorded no history. That is a
766
+ * brand-new document.
767
+ *
768
+ * `sanity/_singletons` is internal; this is the same context `useEvents()`
769
+ * reads. Using the context directly avoids throwing when the events API is
770
+ * off (legacy timeline has no `EventsProvider`).
771
+ */
772
+ function isPristineDocument(events) {
773
+ return !events || events.loading ? !1 : events.events.length === 0;
774
+ }
775
+ /**
701
776
  * Main array input component for internationalized array fields.
702
777
  *
703
778
  * Replaces the default Sanity array input and manages the full lifecycle of
@@ -706,18 +781,19 @@ function MigrationBanner(t0) {
706
781
  * - **Language filter integration**: When `@sanity/language-filter` is active
707
782
  * for the current document type, array members are filtered to only show
708
783
  * languages matching the user's selection.
709
- * - **Adding languages**: Exposes per-language buttons and an "Add all / Add
710
- * missing languages" button (controlled by `buttonAddAll` and
711
- * `buttonLocations` config). Dispatches `setIfMissing` + `insert` patches.
784
+ * - **Adding languages**: Exposes per-language buttons, an optional compact
785
+ * `fieldMenu`, and an "Add all / Add missing languages" button (controlled
786
+ * by `buttonAddAll` and `buttonLocations`). Dispatches `setIfMissing` +
787
+ * `insert` patches.
712
788
  * - **Default languages**: Automatically adds entries for languages listed in
713
- * `defaultLanguages` when those entries are missing. Only runs once the
714
- * document exists in the dataset (it has a `_rev`) **and** the document is
715
- * writable newly created documents stay read-only until initial value
716
- * templates resolve, and the field-level `readOnly` prop can lag that
717
- * document-level lock. Skipping the patch until both are ready avoids
718
- * "Attempted to patch a read-only document" toasts. The `_rev` guard also
719
- * prevents recreating a just-deleted document or creating a draft before
720
- * the user's first edit.
789
+ * `defaultLanguages` when those entries are missing. Seeds brand-new
790
+ * documents once the events store reports they are pristine (no history),
791
+ * and seeds persisted documents that already have a `_rev`. A document
792
+ * that existed and was deleted is not pristine, so opening it — even in a
793
+ * fresh pane does not recreate it. Newly created documents stay
794
+ * read-only until initial value templates resolve, and the field-level
795
+ * `readOnly` prop can lag that document-level lock. Skipping the patch
796
+ * until writable avoids "Attempted to patch a read-only document" toasts.
721
797
  * - **Ordering**: When `restoreOrder` is enabled (default), detects when value
722
798
  * items are out of order relative to the master `languages` list and
723
799
  * automatically re-sorts them. Set `restoreOrder: false` to keep the stored
@@ -728,7 +804,7 @@ function MigrationBanner(t0) {
728
804
  * no entries and the add buttons are not visible.
729
805
  */
730
806
  function InternationalizedArray(props) {
731
- let $ = c(104), { members, value: _value, schemaType, onChange, readOnly: documentReadOnly } = props, value = _value, t0;
807
+ let $ = c(122), { members, value: _value, schemaType, onChange, readOnly: documentReadOnly } = props, value = _value, t0;
732
808
  $[0] === value ? t0 = $[1] : (t0 = value?.filter(_temp$1) ?? [], $[0] = value, $[1] = t0);
733
809
  let itemsNeedingMigration = t0, shouldMigrateArray = itemsNeedingMigration.length > 0, toast = useToast(), getFormValue = useGetFormValue(), { languages, filteredLanguages, defaultLanguages, buttonAddAll, buttonLocations, restoreOrder, languageFilter: builtInLanguageFilter } = useInternationalizedArrayContext(), { selectedLanguageIds, options: languageFilterOptions } = useLanguageFilterStudioContext(), t1;
734
810
  $[2] === Symbol.for("react.memo_cache_sentinel") ? (t1 = ["_type"], $[2] = t1) : t1 = $[2];
@@ -758,36 +834,39 @@ function InternationalizedArray(props) {
758
834
  }, $[16] = filteredLanguages, $[17] = getFormValue, $[18] = languages, $[19] = onChange, $[20] = props.path, $[21] = readOnly, $[22] = schemaType, $[23] = t5) : t5 = $[23];
759
835
  let handleAddLanguages = t5, t6;
760
836
  $[24] === Symbol.for("react.memo_cache_sentinel") ? (t6 = ["_rev"], $[24] = t6) : t6 = $[24];
761
- let documentExists = !!useFormValue(t6), t7;
762
- $[25] === value ? t7 = $[26] : (t7 = value?.map(_temp2$1).filter(Boolean).join(","), $[25] = value, $[26] = t7);
763
- let languageKeysFromValue = t7, t8;
764
- if ($[27] !== languageKeysFromValue || $[28] !== languages) {
837
+ let documentExists = !!useFormValue(t6), t7 = useContext(EventsContext), t8;
838
+ $[25] === t7 ? t8 = $[26] : (t8 = isPristineDocument(t7), $[25] = t7, $[26] = t8);
839
+ let isPristine = t8, t9;
840
+ $[27] === value ? t9 = $[28] : (t9 = value?.map(_temp2$1).filter(Boolean).join(","), $[27] = value, $[28] = t9);
841
+ let languageKeysFromValue = t9, t10;
842
+ if ($[29] !== languageKeysFromValue || $[30] !== languages) {
765
843
  bb0: {
766
844
  let languageKeys = languageKeysFromValue?.split(",") || [];
767
845
  if (!languageKeys?.length) {
768
- let t9;
769
- $[30] === Symbol.for("react.memo_cache_sentinel") ? (t9 = [], $[30] = t9) : t9 = $[30], t8 = t9;
846
+ let t11;
847
+ $[32] === Symbol.for("react.memo_cache_sentinel") ? (t11 = [], $[32] = t11) : t11 = $[32], t10 = t11;
770
848
  break bb0;
771
849
  }
772
850
  if (!languages?.length) {
773
- let t9;
774
- $[31] === Symbol.for("react.memo_cache_sentinel") ? (t9 = [], $[31] = t9) : t9 = $[31], t8 = t9;
851
+ let t11;
852
+ $[33] === Symbol.for("react.memo_cache_sentinel") ? (t11 = [], $[33] = t11) : t11 = $[33], t10 = t11;
775
853
  break bb0;
776
854
  }
777
- t8 = languages.filter((l) => languageKeys?.find((key) => key === l.id)).map(_temp3$1);
855
+ t10 = languages.filter((l) => languageKeys?.find((key) => key === l.id)).map(_temp3$1);
778
856
  }
779
- $[27] = languageKeysFromValue, $[28] = languages, $[29] = t8;
780
- } else t8 = $[29];
781
- let addedLanguages = t8, t10, t9;
782
- $[32] !== addedLanguages || $[33] !== defaultLanguages || $[34] !== documentExists || $[35] !== handleAddLanguages || $[36] !== isDeleted || $[37] !== isDeleting || $[38] !== languages || $[39] !== readOnly || $[40] !== shouldMigrateArray ? (t9 = () => {
857
+ $[29] = languageKeysFromValue, $[30] = languages, $[31] = t10;
858
+ } else t10 = $[31];
859
+ let addedLanguages = t10, t11, t12;
860
+ $[34] !== addedLanguages || $[35] !== defaultLanguages || $[36] !== documentExists || $[37] !== handleAddLanguages || $[38] !== isDeleted || $[39] !== isDeleting || $[40] !== isPristine || $[41] !== languages || $[42] !== readOnly || $[43] !== shouldMigrateArray ? (t11 = () => {
783
861
  let hasAddedDefaultLanguages = defaultLanguages.filter((language) => languages.find((l_1) => l_1.id === language)).every((language_0) => addedLanguages.includes(language_0));
784
- if (documentExists && !isDeleting && !isDeleted && !hasAddedDefaultLanguages && !shouldMigrateArray && !readOnly) {
862
+ if ((isPristine || documentExists) && !isDeleting && !isDeleted && !hasAddedDefaultLanguages && !shouldMigrateArray && !readOnly) {
785
863
  let languagesToAdd = defaultLanguages.filter((language_1) => !addedLanguages.includes(language_1)).filter((language_2) => languages.find((l_2) => l_2.id === language_2)), timeout = setTimeout(() => {
786
864
  readOnly || handleAddLanguages(languagesToAdd);
787
865
  });
788
866
  return () => clearTimeout(timeout);
789
867
  }
790
- }, t10 = [
868
+ }, t12 = [
869
+ isPristine,
791
870
  documentExists,
792
871
  isDeleted,
793
872
  isDeleting,
@@ -797,9 +876,9 @@ function InternationalizedArray(props) {
797
876
  languages,
798
877
  readOnly,
799
878
  shouldMigrateArray
800
- ], $[32] = addedLanguages, $[33] = defaultLanguages, $[34] = documentExists, $[35] = handleAddLanguages, $[36] = isDeleted, $[37] = isDeleting, $[38] = languages, $[39] = readOnly, $[40] = shouldMigrateArray, $[41] = t10, $[42] = t9) : (t10 = $[41], t9 = $[42]), useEffect(t9, t10);
801
- let t11;
802
- $[43] !== languages || $[44] !== onChange || $[45] !== readOnly || $[46] !== toast || $[47] !== value ? (t11 = () => {
879
+ ], $[34] = addedLanguages, $[35] = defaultLanguages, $[36] = documentExists, $[37] = handleAddLanguages, $[38] = isDeleted, $[39] = isDeleting, $[40] = isPristine, $[41] = languages, $[42] = readOnly, $[43] = shouldMigrateArray, $[44] = t11, $[45] = t12) : (t11 = $[44], t12 = $[45]), useEffect(t11, t12);
880
+ let t13;
881
+ $[46] !== languages || $[47] !== onChange || $[48] !== readOnly || $[49] !== toast || $[50] !== value ? (t13 = () => {
803
882
  if (readOnly || !value?.length || !languages?.length) return;
804
883
  let updatedValue = value.reduce((acc, v_1) => {
805
884
  let newIndex = languages.findIndex((l_3) => l_3.id === v_1?.[LANGUAGE_FIELD_NAME]);
@@ -809,79 +888,62 @@ function InternationalizedArray(props) {
809
888
  title: "There was an error reordering languages",
810
889
  status: "warning"
811
890
  }), onChange(set(updatedValue));
812
- }, $[43] = languages, $[44] = onChange, $[45] = readOnly, $[46] = toast, $[47] = value, $[48] = t11) : t11 = $[48];
813
- let handleRestoreOrder = t11, t12;
891
+ }, $[46] = languages, $[47] = onChange, $[48] = readOnly, $[49] = toast, $[50] = value, $[51] = t13) : t13 = $[51];
892
+ let handleRestoreOrder = t13, t14;
814
893
  bb1: {
815
894
  if (!value?.length || !languages?.length) {
816
- t12 = !0;
895
+ t14 = !0;
817
896
  break bb1;
818
897
  }
819
- let t13;
820
- $[49] !== languages || $[50] !== value ? (t13 = value?.every((v_2) => languages.find((l_4) => l_4?.id === v_2?.[LANGUAGE_FIELD_NAME])), $[49] = languages, $[50] = value, $[51] = t13) : t13 = $[51], t12 = t13;
898
+ let t15;
899
+ $[52] !== languages || $[53] !== value ? (t15 = value?.every((v_2) => languages.find((l_4) => l_4?.id === v_2?.[LANGUAGE_FIELD_NAME])), $[52] = languages, $[53] = value, $[54] = t15) : t15 = $[54], t14 = t15;
821
900
  }
822
- let allKeysAreLanguages = t12, t13;
901
+ let allKeysAreLanguages = t14, t15;
823
902
  bb2: {
824
903
  if (!value?.length || !addedLanguages.length) {
825
- let t14;
826
- $[52] === Symbol.for("react.memo_cache_sentinel") ? (t14 = [], $[52] = t14) : t14 = $[52], t13 = t14;
904
+ let t16;
905
+ $[55] === Symbol.for("react.memo_cache_sentinel") ? (t16 = [], $[55] = t16) : t16 = $[55], t15 = t16;
827
906
  break bb2;
828
907
  }
829
- let t14;
830
- if ($[53] !== addedLanguages || $[54] !== value) {
831
- let t15;
832
- $[56] === addedLanguages ? t15 = $[57] : (t15 = (v_3, vIndex) => vIndex === addedLanguages.findIndex((language_3) => language_3 === v_3.language) ? null : v_3, $[56] = addedLanguages, $[57] = t15), t14 = value.map(t15).filter(Boolean), $[53] = addedLanguages, $[54] = value, $[55] = t14;
833
- } else t14 = $[55];
834
- t13 = t14;
908
+ let t16;
909
+ if ($[56] !== addedLanguages || $[57] !== value) {
910
+ let t17;
911
+ $[59] === addedLanguages ? t17 = $[60] : (t17 = (v_3, vIndex) => vIndex === addedLanguages.findIndex((language_3) => language_3 === v_3.language) ? null : v_3, $[59] = addedLanguages, $[60] = t17), t16 = value.map(t17).filter(Boolean), $[56] = addedLanguages, $[57] = value, $[58] = t16;
912
+ } else t16 = $[58];
913
+ t15 = t16;
835
914
  }
836
- let languagesOutOfOrder = t13, languagesAreValid = !languages?.length || languages?.length && languages.every(_temp4$1), t14, t15;
837
- $[58] !== allKeysAreLanguages || $[59] !== handleRestoreOrder || $[60] !== languagesOutOfOrder || $[61] !== readOnly || $[62] !== restoreOrder ? (t14 = () => {
915
+ let languagesOutOfOrder = t15, languagesAreValid = !languages?.length || languages?.length && languages.every(_temp4$1), t16, t17;
916
+ $[61] !== allKeysAreLanguages || $[62] !== handleRestoreOrder || $[63] !== languagesOutOfOrder || $[64] !== readOnly || $[65] !== restoreOrder ? (t16 = () => {
838
917
  restoreOrder && languagesOutOfOrder.length > 0 && allKeysAreLanguages && !readOnly && handleRestoreOrder();
839
- }, t15 = [
918
+ }, t17 = [
840
919
  restoreOrder,
841
920
  languagesOutOfOrder,
842
921
  allKeysAreLanguages,
843
922
  handleRestoreOrder,
844
923
  readOnly
845
- ], $[58] = allKeysAreLanguages, $[59] = handleRestoreOrder, $[60] = languagesOutOfOrder, $[61] = readOnly, $[62] = restoreOrder, $[63] = t14, $[64] = t15) : (t14 = $[63], t15 = $[64]), useEffect(t14, t15);
846
- let t16;
847
- $[65] !== filteredLanguages || $[66] !== value ? (t16 = checkAllLanguagesArePresent(filteredLanguages, value), $[65] = filteredLanguages, $[66] = value, $[67] = t16) : t16 = $[67];
848
- let allLanguagesArePresent = t16, t17;
849
- $[68] !== filteredLanguages || $[69] !== handleAddLanguages ? (t17 = () => {
924
+ ], $[61] = allKeysAreLanguages, $[62] = handleRestoreOrder, $[63] = languagesOutOfOrder, $[64] = readOnly, $[65] = restoreOrder, $[66] = t16, $[67] = t17) : (t16 = $[66], t17 = $[67]), useEffect(t16, t17);
925
+ let t18;
926
+ if ($[68] !== addedLanguages || $[69] !== filteredLanguages) {
927
+ let t19;
928
+ $[71] === addedLanguages ? t19 = $[72] : (t19 = (language_4) => addedLanguages.includes(language_4.id), $[71] = addedLanguages, $[72] = t19), t18 = filteredLanguages.every(t19), $[68] = addedLanguages, $[69] = filteredLanguages, $[70] = t18;
929
+ } else t18 = $[70];
930
+ let allFilteredLanguagesArePresent = t18, t19;
931
+ $[73] !== filteredLanguages || $[74] !== handleAddLanguages ? (t19 = () => {
850
932
  handleAddLanguages(filteredLanguages.map(_temp5));
851
- }, $[68] = filteredLanguages, $[69] = handleAddLanguages, $[70] = t17) : t17 = $[70];
852
- let addAllMissingLanguages = t17;
933
+ }, $[73] = filteredLanguages, $[74] = handleAddLanguages, $[75] = t19) : t19 = $[75];
934
+ let addAllMissingLanguages = t19;
853
935
  if (!languagesAreValid) {
854
- let t18;
855
- return $[71] === Symbol.for("react.memo_cache_sentinel") ? (t18 = /* @__PURE__ */ jsx(Feedback, {}), $[71] = t18) : t18 = $[71], t18;
936
+ let t20;
937
+ return $[76] === Symbol.for("react.memo_cache_sentinel") ? (t20 = /* @__PURE__ */ jsx(Feedback, {}), $[76] = t20) : t20 = $[76], t20;
856
938
  }
857
- let t18;
858
- $[72] !== allLanguagesArePresent || $[73] !== buttonLocations || $[74] !== filteredLanguages.length || $[75] !== shouldMigrateArray ? (t18 = !shouldMigrateArray && buttonLocations.includes("field") && filteredLanguages?.length > 0 && !allLanguagesArePresent, $[72] = allLanguagesArePresent, $[73] = buttonLocations, $[74] = filteredLanguages.length, $[75] = shouldMigrateArray, $[76] = t18) : t18 = $[76];
859
- let addButtonsAreVisible = t18, fieldHasMembers = members?.length > 0, t19;
860
- $[77] !== filteredLanguages || $[78] !== value ? (t19 = createAddAllTitle(value, filteredLanguages), $[77] = filteredLanguages, $[78] = value, $[79] = t19) : t19 = $[79];
861
- let addAllTitle = t19, t20;
862
- if ($[80] !== filteredMembers || $[81] !== props) {
863
- let t21;
864
- $[83] === props ? t21 = $[84] : (t21 = (member_0) => member_0.kind === "item" ? /* @__PURE__ */ createElement(ArrayOfObjectsItem, {
865
- ...props,
866
- key: member_0.key,
867
- member: member_0
868
- }) : /* @__PURE__ */ jsx(MemberItemError, { member: member_0 }, member_0.key), $[83] = props, $[84] = t21), t20 = filteredMembers.map(t21), $[80] = filteredMembers, $[81] = props, $[82] = t20;
869
- } else t20 = $[82];
870
- let t21;
871
- $[85] === itemsNeedingMigration ? t21 = $[86] : (t21 = /* @__PURE__ */ jsx(MigrationBanner, { itemsNeedingMigration }), $[85] = itemsNeedingMigration, $[86] = t21);
872
- let t22;
873
- $[87] !== addButtonsAreVisible || $[88] !== fieldHasMembers ? (t22 = !addButtonsAreVisible && !fieldHasMembers ? /* @__PURE__ */ jsx(Card, {
874
- border: !0,
875
- tone: "transparent",
876
- padding: 3,
877
- radius: 2,
878
- children: /* @__PURE__ */ jsx(Text, {
879
- size: 1,
880
- children: "This internationalized field currently has no translations."
881
- })
882
- }) : null, $[87] = addButtonsAreVisible, $[88] = fieldHasMembers, $[89] = t22) : t22 = $[89];
883
- let t23;
884
- $[90] !== addAllMissingLanguages || $[91] !== addAllTitle || $[92] !== addButtonsAreVisible || $[93] !== addedLanguages || $[94] !== allLanguagesArePresent || $[95] !== buttonAddAll || $[96] !== handleAddLanguages || $[97] !== readOnly ? (t23 = addButtonsAreVisible ? /* @__PURE__ */ jsxs(Stack, {
939
+ let canAddLanguages = !shouldMigrateArray && filteredLanguages?.length > 0, t20;
940
+ $[77] !== buttonLocations || $[78] !== canAddLanguages ? (t20 = canAddLanguages && buttonLocations.includes("fieldMenu"), $[77] = buttonLocations, $[78] = canAddLanguages, $[79] = t20) : t20 = $[79];
941
+ let showFieldMenu = t20, t21;
942
+ $[80] !== allFilteredLanguagesArePresent || $[81] !== buttonLocations || $[82] !== canAddLanguages ? (t21 = canAddLanguages && buttonLocations.includes("field") && !allFilteredLanguagesArePresent, $[80] = allFilteredLanguagesArePresent, $[81] = buttonLocations, $[82] = canAddLanguages, $[83] = t21) : t21 = $[83];
943
+ let showFieldButtons = t21, fieldHasMembers = members?.length > 0, t22;
944
+ $[84] !== filteredLanguages || $[85] !== value ? (t22 = createAddAllTitle(value, filteredLanguages), $[84] = filteredLanguages, $[85] = value, $[86] = t22) : t22 = $[86];
945
+ let addAllTitle = t22, t23;
946
+ $[87] !== addAllMissingLanguages || $[88] !== addAllTitle || $[89] !== addedLanguages || $[90] !== allFilteredLanguagesArePresent || $[91] !== buttonAddAll || $[92] !== handleAddLanguages || $[93] !== readOnly || $[94] !== showFieldButtons ? (t23 = showFieldButtons ? /* @__PURE__ */ jsxs(Stack, {
885
947
  gap: 2,
886
948
  children: [/* @__PURE__ */ jsx(AddButtons, {
887
949
  languagesInUse: addedLanguages,
@@ -891,25 +953,58 @@ function InternationalizedArray(props) {
891
953
  tone: "primary",
892
954
  mode: "ghost",
893
955
  "data-testid": "add-all-languages",
894
- disabled: readOnly || allLanguagesArePresent,
956
+ disabled: readOnly || allFilteredLanguagesArePresent,
895
957
  icon: AddIcon,
896
958
  text: addAllTitle,
897
959
  onClick: addAllMissingLanguages
898
960
  }) : null]
899
- }) : null, $[90] = addAllMissingLanguages, $[91] = addAllTitle, $[92] = addButtonsAreVisible, $[93] = addedLanguages, $[94] = allLanguagesArePresent, $[95] = buttonAddAll, $[96] = handleAddLanguages, $[97] = readOnly, $[98] = t23) : t23 = $[98];
900
- let t24;
901
- return $[99] !== t20 || $[100] !== t21 || $[101] !== t22 || $[102] !== t23 ? (t24 = /* @__PURE__ */ jsxs(Stack, {
961
+ }) : null, $[87] = addAllMissingLanguages, $[88] = addAllTitle, $[89] = addedLanguages, $[90] = allFilteredLanguagesArePresent, $[91] = buttonAddAll, $[92] = handleAddLanguages, $[93] = readOnly, $[94] = showFieldButtons, $[95] = t23) : t23 = $[95];
962
+ let fieldButtons = t23, t24;
963
+ $[96] !== addAllMissingLanguages || $[97] !== addAllTitle || $[98] !== addedLanguages || $[99] !== allFilteredLanguagesArePresent || $[100] !== buttonAddAll || $[101] !== handleAddLanguages || $[102] !== readOnly || $[103] !== showFieldMenu ? (t24 = showFieldMenu ? /* @__PURE__ */ jsx(CompactAddButton, {
964
+ languagesInUse: addedLanguages,
965
+ readOnly,
966
+ handleClick: handleAddLanguages,
967
+ onAddAll: addAllMissingLanguages,
968
+ buttonAddAll,
969
+ addAllTitle,
970
+ allFilteredLanguagesArePresent
971
+ }) : null, $[96] = addAllMissingLanguages, $[97] = addAllTitle, $[98] = addedLanguages, $[99] = allFilteredLanguagesArePresent, $[100] = buttonAddAll, $[101] = handleAddLanguages, $[102] = readOnly, $[103] = showFieldMenu, $[104] = t24) : t24 = $[104];
972
+ let t25;
973
+ if ($[105] !== filteredMembers || $[106] !== props) {
974
+ let t26;
975
+ $[108] === props ? t26 = $[109] : (t26 = (member_0) => member_0.kind === "item" ? /* @__PURE__ */ createElement(ArrayOfObjectsItem, {
976
+ ...props,
977
+ key: member_0.key,
978
+ member: member_0
979
+ }) : /* @__PURE__ */ jsx(MemberItemError, { member: member_0 }, member_0.key), $[108] = props, $[109] = t26), t25 = filteredMembers.map(t26), $[105] = filteredMembers, $[106] = props, $[107] = t25;
980
+ } else t25 = $[107];
981
+ let t26;
982
+ $[110] === itemsNeedingMigration ? t26 = $[111] : (t26 = /* @__PURE__ */ jsx(MigrationBanner, { itemsNeedingMigration }), $[110] = itemsNeedingMigration, $[111] = t26);
983
+ let t27;
984
+ $[112] !== fieldHasMembers || $[113] !== showFieldButtons || $[114] !== showFieldMenu ? (t27 = !showFieldMenu && !showFieldButtons && !fieldHasMembers ? /* @__PURE__ */ jsx(Card, {
985
+ border: !0,
986
+ tone: "transparent",
987
+ padding: 3,
988
+ radius: 2,
989
+ children: /* @__PURE__ */ jsx(Text, {
990
+ size: 1,
991
+ children: "This internationalized field currently has no translations."
992
+ })
993
+ }) : null, $[112] = fieldHasMembers, $[113] = showFieldButtons, $[114] = showFieldMenu, $[115] = t27) : t27 = $[115];
994
+ let t28;
995
+ return $[116] !== fieldButtons || $[117] !== t24 || $[118] !== t25 || $[119] !== t26 || $[120] !== t27 ? (t28 = /* @__PURE__ */ jsxs(Stack, {
902
996
  gap: 2,
903
997
  children: [
904
- t20,
905
- t21,
906
- t22,
907
- t23
998
+ t24,
999
+ t25,
1000
+ t26,
1001
+ t27,
1002
+ fieldButtons
908
1003
  ]
909
- }), $[99] = t20, $[100] = t21, $[101] = t22, $[102] = t23, $[103] = t24) : t24 = $[103], t24;
1004
+ }), $[116] = fieldButtons, $[117] = t24, $[118] = t25, $[119] = t26, $[120] = t27, $[121] = t28) : t28 = $[121], t28;
910
1005
  }
911
- function _temp5(language_4) {
912
- return language_4.id;
1006
+ function _temp5(language_5) {
1007
+ return language_5.id;
913
1008
  }
914
1009
  function _temp4$1(item) {
915
1010
  return item.id && item.title;