@oktis-works/admin 0.23.2 → 0.24.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 (90) hide show
  1. package/dist/client/_astro/{ActivityWidget.Dzoi-bq3.js → ActivityWidget.ZVWCvrxL.js} +1 -1
  2. package/dist/client/_astro/{AdminBar.eT1ch_B6.js → AdminBar.Cp3-f-Na.js} +1 -1
  3. package/dist/client/_astro/{ApiKeysManager.kbTE1CPk.js → ApiKeysManager.CpgNjjZm.js} +1 -1
  4. package/dist/client/_astro/{AtGlanceWidget.w23IIv06.js → AtGlanceWidget.B4v1yrwI.js} +1 -1
  5. package/dist/client/_astro/BaseLayout.Ceb72bti.css +1 -0
  6. package/dist/client/_astro/{CommentsManager.BN7i1RHa.js → CommentsManager.Da4veAPJ.js} +1 -1
  7. package/dist/client/_astro/ContentEditor.CSin5EHw.js +1 -0
  8. package/dist/client/_astro/ContentTypeWorkspace.CjOEvGzy.js +1 -0
  9. package/dist/client/_astro/{DashboardHome.DXzu_IXZ.js → DashboardHome.C40YVSiB.js} +1 -1
  10. package/dist/client/_astro/{DashboardLayout.astro_astro_type_script_index_0_lang.DmNSzErX.js → DashboardLayout.astro_astro_type_script_index_0_lang.DEsBqJww.js} +1 -1
  11. package/dist/client/_astro/{FieldGroupEditor.DsqphEgt.js → FieldGroupEditor.9WZ-czWM.js} +3 -3
  12. package/dist/client/_astro/{FieldGroupList.pW2Um9om.js → FieldGroupList.BG9Wq5_L.js} +1 -1
  13. package/dist/client/_astro/FieldRenderer.DrX12H8L.js +3 -0
  14. package/dist/client/_astro/{Footer.5Lcn2VXz.js → Footer.D7L9WAh7.js} +1 -1
  15. package/dist/client/_astro/{GeneralSettings.B-H8Rzy7.js → GeneralSettings.udEZdv-v.js} +1 -1
  16. package/dist/client/_astro/{LogsManager.Crd8q2te.js → LogsManager.B5TC9xQ_.js} +1 -1
  17. package/dist/client/_astro/{MediaLibrary.Cv6Ry3u9.js → MediaLibrary.D2v__yUO.js} +1 -1
  18. package/dist/client/_astro/{MenuManager.D25ika09.js → MenuManager.glKVLQiP.js} +1 -1
  19. package/dist/client/_astro/{Modal.572hmVvb.js → Modal.DijYhpj_.js} +1 -1
  20. package/dist/client/_astro/PluginManager.BGdxyG-e.js +112 -0
  21. package/dist/client/_astro/PluginPageHost.CEDOBtUT.js +1 -0
  22. package/dist/client/_astro/{PostTypesManager.C3RbmOZT.js → PostTypesManager.DTbeJSyc.js} +1 -1
  23. package/dist/client/_astro/{QuickDraftWidget.BtSGzhKq.js → QuickDraftWidget.wRkEcf8k.js} +1 -1
  24. package/dist/client/_astro/{ReadingSettings.ZFDaeo5U.js → ReadingSettings.CD8voAVk.js} +1 -1
  25. package/dist/client/_astro/{ResourceHubs.Cx9fbCv1.js → ResourceHubs.Cpu4lcaN.js} +1 -1
  26. package/dist/client/_astro/{TaxonomiesManager.BLsvmjaL.js → TaxonomiesManager.gPoogAar.js} +1 -1
  27. package/dist/client/_astro/TaxonomyTermsManager.B3TphEaE.js +1 -0
  28. package/dist/client/_astro/{ThemeCustomizer.BrDHVXLk.js → ThemeCustomizer.BKKTlRC5.js} +1 -1
  29. package/dist/client/_astro/{ThemeManager.BpS3m7Qc.js → ThemeManager.KDwxbVIq.js} +1 -1
  30. package/dist/client/_astro/{UserCreateForm.BYwgAqKk.js → UserCreateForm.IAFj7Afs.js} +1 -1
  31. package/dist/client/_astro/{UsersManager.DODMr48D.js → UsersManager.BfVYX6D5.js} +1 -1
  32. package/dist/client/_astro/{WebhooksManager.DmWIW272.js → WebhooksManager.Bp3Zp4vO.js} +1 -1
  33. package/dist/client/_astro/{api.53l1ob4Z.js → api.C1uUawnK.js} +1 -1
  34. package/dist/client/_astro/extensions.XVI9Kud6.js +1 -0
  35. package/dist/client/_astro/i18n.TTF80CEw.js +1 -0
  36. package/dist/client/_astro/{login.astro_astro_type_script_index_0_lang.BLf2Iun3.js → login.astro_astro_type_script_index_0_lang.C_Lrwk3I.js} +1 -1
  37. package/dist/client/_astro/{pt-BR.zZcF2v3X.js → pt-BR.C041vzOT.js} +1 -1
  38. package/dist/client/_astro/slots.CSARb9TW.js +1 -0
  39. package/dist/client/_astro/{src.CYKGYEyR.js → src.DoHIZU0i.js} +1 -1
  40. package/dist/client/_astro/store.BUgA6DSh.js +1 -0
  41. package/dist/server/chunks/{404_BAOD9OCa.mjs → 404_CouGE9Mj.mjs} +1 -1
  42. package/dist/server/chunks/{BaseLayout_BE8O-LS4.mjs → BaseLayout_DRJ6-Y9z.mjs} +5 -5
  43. package/dist/server/chunks/ContentEditor_DIjqVt5v.mjs +324 -0
  44. package/dist/server/chunks/{DashboardLayout_D6zphdT0.mjs → DashboardLayout_Bz8ZBDme.mjs} +102 -17
  45. package/dist/server/chunks/{FieldRenderer_D4dcZjgt.mjs → FieldRenderer_RlFoxao4.mjs} +574 -66
  46. package/dist/server/chunks/{MediaLibrary_DGmYSSZH.mjs → MediaLibrary_Dh6dBT17.mjs} +2 -2
  47. package/dist/server/chunks/{Modal_BmuvdwoB.mjs → Modal_CpojFoyP.mjs} +1 -1
  48. package/dist/server/chunks/_.._C1o1V5X_.mjs +76 -0
  49. package/dist/server/chunks/{_id__XEnJ5nS2.mjs → _id__BKZ7vD0U.mjs} +4 -4
  50. package/dist/server/chunks/{access_B5npG273.mjs → access_COyC7DxO.mjs} +3 -3
  51. package/dist/server/chunks/{api-keys_Bs6zIXYm.mjs → api-keys_D2TJYRAW.mjs} +3 -3
  52. package/dist/server/chunks/{comments_zJrnFEjl.mjs → comments_CySyBx_l.mjs} +2 -2
  53. package/dist/server/chunks/{custom-fields_C5EBkR02.mjs → custom-fields_Clivf3ew.mjs} +2 -2
  54. package/dist/server/chunks/{customize_CKqMX14y.mjs → customize_XWQyyFCl.mjs} +3 -3
  55. package/dist/server/chunks/{edit_QKBYgFkJ.mjs → edit_CYlskXjG.mjs} +2 -2
  56. package/dist/server/chunks/{i18n_C-sgJSi1.mjs → i18n_Bp0_xO2v.mjs} +27 -8
  57. package/dist/server/chunks/{index_CDwohy44.mjs → index_BufAjUfw.mjs} +2 -2
  58. package/dist/server/chunks/{index_DenKi4a3.mjs → index_CJOIvqZF.mjs} +2 -2
  59. package/dist/server/chunks/{index_BM_-WBYo.mjs → index_DBmNvPut.mjs} +2 -2
  60. package/dist/server/chunks/{index_BletZ9T6.mjs → index_Z5USLJCo.mjs} +3 -3
  61. package/dist/server/chunks/{index_Btvmuytk.mjs → index_pSSu8X0A.mjs} +2 -2
  62. package/dist/server/chunks/{login_CtIWLqC2.mjs → login_BbReGd7a.mjs} +1 -1
  63. package/dist/server/chunks/{logs_DlTldv5b.mjs → logs_D_xRW_Dm.mjs} +2 -2
  64. package/dist/server/chunks/{menus_z2d_K44p.mjs → menus_t0aZuQCI.mjs} +2 -2
  65. package/dist/server/chunks/{new_CYvLScge.mjs → new_CkSJ-S3h.mjs} +2 -2
  66. package/dist/server/chunks/{new_Cxp8Mdw4.mjs → new_DFA50r2h.mjs} +2 -2
  67. package/dist/server/chunks/{plugins_4g6EEkCb.mjs → plugins_rehiATzz.mjs} +13 -5
  68. package/dist/server/chunks/{post-types_7cW4BLBV.mjs → post-types_Dx4bmkB7.mjs} +2 -2
  69. package/dist/server/chunks/{pt-BR_AVNE88MZ.mjs → pt-BR_B8bZo1Id.mjs} +7 -1
  70. package/dist/server/chunks/{reading_2DqfBhj_.mjs → reading_DVMggOZa.mjs} +2 -2
  71. package/dist/server/chunks/{taxonomies_D7mMKpNX.mjs → taxonomies_BKVuy-kF.mjs} +2 -2
  72. package/dist/server/chunks/{taxonomy_64ggDTF9.mjs → taxonomy_CsnDSlD1.mjs} +31 -18
  73. package/dist/server/chunks/{themes_Dscq-5uk.mjs → themes_c2vDYHy-.mjs} +2 -2
  74. package/dist/server/chunks/{upload_B-DdqpaQ.mjs → upload_DYFOxmHE.mjs} +2 -2
  75. package/dist/server/chunks/{webhooks_D05B4_Rs.mjs → webhooks_CjBMAJt2.mjs} +2 -2
  76. package/dist/server/entry.mjs +43 -43
  77. package/dist/server/virtual_astro_middleware.mjs +1 -1
  78. package/package.json +5 -5
  79. package/dist/client/_astro/BaseLayout.Rpr86VwM.css +0 -1
  80. package/dist/client/_astro/ContentEditor.BlsJ2bwD.js +0 -1
  81. package/dist/client/_astro/ContentTypeWorkspace.BPVuQgzA.js +0 -1
  82. package/dist/client/_astro/FieldRenderer.AYtSBfHZ.js +0 -3
  83. package/dist/client/_astro/PluginManager.DLfgQFPF.js +0 -112
  84. package/dist/client/_astro/TaxonomyTermsManager.C_xEh8Ab.js +0 -1
  85. package/dist/client/_astro/extensions.DzQcQsO9.js +0 -1
  86. package/dist/client/_astro/i18n.A82w5XQu.js +0 -1
  87. package/dist/client/_astro/preload-helper.oCYlU9a4.js +0 -1
  88. package/dist/client/_astro/store.DLCqLxBR.js +0 -1
  89. package/dist/server/chunks/ContentEditor_DPy3I4HM.mjs +0 -690
  90. package/dist/server/chunks/_slug__BkXrukGe.mjs +0 -34
@@ -1,5 +1,5 @@
1
- import "./i18n_C-sgJSi1.mjs";
2
- import { _ as createMemo$1, h as Show2, u as For2, v as createSignal$1 } from "./DashboardLayout_D6zphdT0.mjs";
1
+ import { r as apiClient } from "./i18n_Bp0_xO2v.mjs";
2
+ import { d as For2, g as Show2, l as Button, m as Pagination, p as Modal, s as loadPluginComponent, v as createMemo$1, y as createSignal$1 } from "./DashboardLayout_Bz8ZBDme.mjs";
3
3
  import { Dynamic, createComponent, escape, memo, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
4
4
  import { For, Match, Show, Switch, createMemo, createSignal, onMount } from "solid-js";
5
5
  //#region ../../packages/validation/dist/client-validate.js
@@ -169,6 +169,7 @@ function validateTrueFalse(value, field, errors) {
169
169
  });
170
170
  }
171
171
  function validateMediaItem(item, config, field, errors) {
172
+ if (typeof item === "string" && item.trim() !== "") return;
172
173
  if (typeof item !== "object" || item === null || Array.isArray(item)) {
173
174
  errors.push({
174
175
  field,
@@ -468,33 +469,33 @@ function validateFieldClient(field, value) {
468
469
  }
469
470
  //#endregion
470
471
  //#region src/components/content/RelationshipPicker.tsx
471
- var _tmpl$$2 = [
472
+ var _tmpl$$3 = [
472
473
  "<ul",
473
474
  " class=\"relationship-picker__selection\">",
474
475
  "</ul>"
475
476
  ];
476
- var _tmpl$2$2 = ["<li", " class=\"relationship-picker__empty\">Buscando...</li>"];
477
- var _tmpl$3$2 = ["<li", " class=\"relationship-picker__empty\">Nenhum resultado</li>"];
478
- var _tmpl$4$2 = [
477
+ var _tmpl$2$3 = ["<li", " class=\"relationship-picker__empty\">Buscando...</li>"];
478
+ var _tmpl$3$3 = ["<li", " class=\"relationship-picker__empty\">Nenhum resultado</li>"];
479
+ var _tmpl$4$3 = [
479
480
  "<ul",
480
481
  " class=\"relationship-picker__results\"><!--$-->",
481
482
  "<!--/--><!--$-->",
482
483
  "<!--/--><!--$-->",
483
484
  "<!--/--></ul>"
484
485
  ];
485
- var _tmpl$5$2 = [
486
+ var _tmpl$5$3 = [
486
487
  "<div",
487
488
  " class=\"relationship-picker\"><!--$-->",
488
489
  "<!--/--><input type=\"search\" class=\"input\"",
489
490
  "><!--$-->",
490
491
  "<!--/--></div>"
491
492
  ];
492
- var _tmpl$6$2 = [
493
+ var _tmpl$6$3 = [
493
494
  "<li",
494
495
  "><!--$-->",
495
496
  "<!--/--><button type=\"button\" aria-label=\"Remover\">×</button></li>"
496
497
  ];
497
- var _tmpl$7$2 = [
498
+ var _tmpl$7$3 = [
498
499
  "<li",
499
500
  "><button type=\"button\"><!--$-->",
500
501
  "<!--/--><span class=\"relationship-picker__type\">",
@@ -511,16 +512,16 @@ function RelationshipPicker(props) {
511
512
  if (Array.isArray(value)) return value.map(String);
512
513
  return value ? [String(value)] : [];
513
514
  });
514
- return ssr(_tmpl$5$2, ssrHydrationKey(), escape(createComponent(Show2, {
515
+ return ssr(_tmpl$5$3, ssrHydrationKey(), escape(createComponent(Show2, {
515
516
  get when() {
516
517
  return selected().length > 0 || selectedIds().length > 0;
517
518
  },
518
519
  get children() {
519
- return ssr(_tmpl$$2, ssrHydrationKey(), escape(createComponent(For2, {
520
+ return ssr(_tmpl$$3, ssrHydrationKey(), escape(createComponent(For2, {
520
521
  get each() {
521
522
  return selected();
522
523
  },
523
- children: (entry) => ssr(_tmpl$6$2, ssrHydrationKey(), escape(entry.title))
524
+ children: (entry) => ssr(_tmpl$6$3, ssrHydrationKey(), escape(entry.title))
524
525
  })));
525
526
  }
526
527
  })), ssrAttribute("placeholder", escape(props.placeholder ?? "Buscar conteúdo...", true), false) + ssrAttribute("value", escape(query(), true), false), escape(createComponent(Show2, {
@@ -528,24 +529,24 @@ function RelationshipPicker(props) {
528
529
  return memo(() => !!open())() && (loading() || results().length > 0);
529
530
  },
530
531
  get children() {
531
- return ssr(_tmpl$4$2, ssrHydrationKey(), escape(createComponent(Show2, {
532
+ return ssr(_tmpl$4$3, ssrHydrationKey(), escape(createComponent(Show2, {
532
533
  get when() {
533
534
  return loading();
534
535
  },
535
536
  get children() {
536
- return ssr(_tmpl$2$2, ssrHydrationKey());
537
+ return ssr(_tmpl$2$3, ssrHydrationKey());
537
538
  }
538
539
  })), escape(createComponent(For2, {
539
540
  get each() {
540
541
  return results();
541
542
  },
542
- children: (option) => ssr(_tmpl$7$2, ssrHydrationKey(), escape(option.title), escape(option.type))
543
+ children: (option) => ssr(_tmpl$7$3, ssrHydrationKey(), escape(option.title), escape(option.type))
543
544
  })), escape(createComponent(Show2, {
544
545
  get when() {
545
546
  return memo(() => !!!loading())() && results().length === 0;
546
547
  },
547
548
  get children() {
548
- return ssr(_tmpl$3$2, ssrHydrationKey());
549
+ return ssr(_tmpl$3$3, ssrHydrationKey());
549
550
  }
550
551
  })));
551
552
  }
@@ -553,36 +554,36 @@ function RelationshipPicker(props) {
553
554
  }
554
555
  //#endregion
555
556
  //#region src/content/PluginFieldRenderer.tsx
556
- var _tmpl$$1 = ["<div", " class=\"fb-plugin-field-renderer fb-plugin-field-renderer--loading\"><div class=\"fb-spinner\" aria-hidden=\"true\"></div><span>Carregando editor...</span></div>"];
557
- var _tmpl$2$1 = [
557
+ var _tmpl$$2 = ["<div", " class=\"fb-plugin-field-renderer fb-plugin-field-renderer--loading\"><div class=\"fb-spinner\" aria-hidden=\"true\"></div><span>Carregando editor...</span></div>"];
558
+ var _tmpl$2$2 = [
558
559
  "<div",
559
560
  " class=\"fb-renderer-error\"><i data-lucide=\"alert-circle\" aria-hidden=\"true\"></i><span>",
560
561
  "</span></div>"
561
562
  ];
562
- var _tmpl$3$1 = [
563
+ var _tmpl$3$2 = [
563
564
  "<div",
564
565
  " class=\"fb-plugin-field-renderer fb-plugin-field-renderer--fallback\"><!--$-->",
565
566
  "<!--/--><!--$-->",
566
567
  "<!--/--></div>"
567
568
  ];
568
- var _tmpl$4$1 = [
569
+ var _tmpl$4$2 = [
569
570
  "<div",
570
571
  " class=\"fb-plugin-field-renderer\">",
571
572
  "</div>"
572
573
  ];
573
- var _tmpl$5$1 = [
574
+ var _tmpl$5$2 = [
574
575
  "<textarea",
575
576
  " class=\"input fb-plugin-fallback-textarea\"",
576
577
  "",
577
578
  " spellcheck=\"false\"></textarea>"
578
579
  ];
579
- var _tmpl$6$1 = [
580
+ var _tmpl$6$2 = [
580
581
  "<input",
581
582
  " type=\"number\" class=\"input\"",
582
583
  "",
583
584
  ">"
584
585
  ];
585
- var _tmpl$7$1 = [
586
+ var _tmpl$7$2 = [
586
587
  "<input",
587
588
  " type=\"text\" class=\"input\"",
588
589
  "",
@@ -596,8 +597,8 @@ function PluginFieldRenderer(props) {
596
597
  onMount(async () => {
597
598
  const pathsToTry = [props.adminRendererPath, props.adminComponentPath].filter(Boolean);
598
599
  for (const path of pathsToTry) try {
599
- const module = await import(path);
600
- const Comp = module.default || module.PluginFieldRenderer || module.PluginFieldConfig || Object.values(module)[0];
600
+ const module = await loadPluginComponent(path);
601
+ const Comp = module["default"] || module["PluginFieldRenderer"] || module["PluginFieldConfig"];
601
602
  if (Comp) {
602
603
  setComponent(Comp);
603
604
  setLoading(false);
@@ -620,7 +621,7 @@ function PluginFieldRenderer(props) {
620
621
  return loading();
621
622
  },
622
623
  get children() {
623
- return ssr(_tmpl$$1, ssrHydrationKey());
624
+ return ssr(_tmpl$$2, ssrHydrationKey());
624
625
  }
625
626
  }),
626
627
  createComponent(Match, {
@@ -628,12 +629,12 @@ function PluginFieldRenderer(props) {
628
629
  return error() || !Component();
629
630
  },
630
631
  get children() {
631
- return ssr(_tmpl$3$1, ssrHydrationKey(), escape(createComponent(Show, {
632
+ return ssr(_tmpl$3$2, ssrHydrationKey(), escape(createComponent(Show, {
632
633
  get when() {
633
634
  return error();
634
635
  },
635
636
  get children() {
636
- return ssr(_tmpl$2$1, ssrHydrationKey(), escape(error()));
637
+ return ssr(_tmpl$2$2, ssrHydrationKey(), escape(error()));
637
638
  }
638
639
  })), escape(createComponent(FallbackRenderer, {
639
640
  get field() {
@@ -646,7 +647,7 @@ function PluginFieldRenderer(props) {
646
647
  get disabled() {
647
648
  return props.disabled;
648
649
  },
649
- get _t() {
650
+ get t() {
650
651
  return props._t;
651
652
  }
652
653
  })));
@@ -655,7 +656,7 @@ function PluginFieldRenderer(props) {
655
656
  createComponent(Match, {
656
657
  when: true,
657
658
  get children() {
658
- return ssr(_tmpl$4$1, ssrHydrationKey(), escape(createComponent(Dynamic, {
659
+ return ssr(_tmpl$4$2, ssrHydrationKey(), escape(createComponent(Dynamic, {
659
660
  get component() {
660
661
  return Component();
661
662
  },
@@ -669,7 +670,7 @@ function PluginFieldRenderer(props) {
669
670
  get disabled() {
670
671
  return props.disabled;
671
672
  },
672
- get _t() {
673
+ get t() {
673
674
  return props._t;
674
675
  }
675
676
  })));
@@ -683,9 +684,384 @@ function FallbackRenderer(props) {
683
684
  const inputType = field.config?.["inputType"] || "textarea";
684
685
  const placeholder = field.config?.["placeholder"] || "";
685
686
  const rows = field.config?.["rows"] || 4;
686
- if (inputType === "textarea" || inputType === "code" || inputType === "markdown") return ssr(_tmpl$5$1, ssrHydrationKey(), ssrAttribute("value", escape(value, true), false) + ssrAttribute("placeholder", escape(placeholder, true), false) + ssrAttribute("rows", escape(rows, true), false), ssrAttribute("disabled", disabled, true));
687
- if (inputType === "number") return ssr(_tmpl$6$1, ssrHydrationKey(), ssrAttribute("value", escape(value, true), false) + ssrAttribute("placeholder", escape(placeholder, true), false), ssrAttribute("disabled", disabled, true));
688
- return ssr(_tmpl$7$1, ssrHydrationKey(), ssrAttribute("value", escape(value, true), false) + ssrAttribute("placeholder", escape(placeholder, true), false), ssrAttribute("disabled", disabled, true));
687
+ if (inputType === "textarea" || inputType === "code" || inputType === "markdown") return ssr(_tmpl$5$2, ssrHydrationKey(), ssrAttribute("value", escape(value, true), false) + ssrAttribute("placeholder", escape(placeholder, true), false) + ssrAttribute("rows", escape(rows, true), false), ssrAttribute("disabled", disabled, true));
688
+ if (inputType === "number") return ssr(_tmpl$6$2, ssrHydrationKey(), ssrAttribute("value", escape(value, true), false) + ssrAttribute("placeholder", escape(placeholder, true), false), ssrAttribute("disabled", disabled, true));
689
+ return ssr(_tmpl$7$2, ssrHydrationKey(), ssrAttribute("value", escape(value, true), false) + ssrAttribute("placeholder", escape(placeholder, true), false), ssrAttribute("disabled", disabled, true));
690
+ }
691
+ //#endregion
692
+ //#region src/components/media/MediaPickerModal.tsx
693
+ var _tmpl$$1 = [
694
+ "<div",
695
+ " class=\"notice notice--error media-picker-modal__error\"><span>",
696
+ "</span><!--$-->",
697
+ "<!--/--></div>"
698
+ ];
699
+ var _tmpl$2$1 = ["<p", " class=\"muted\">Loading media…</p>"];
700
+ var _tmpl$3$1 = ["<p", " class=\"muted\">No media found.</p>"];
701
+ var _tmpl$4$1 = [
702
+ "<div",
703
+ " class=\"media-picker-modal__order\" aria-label=\"Selected image order\"><strong>Gallery order</strong><!--$-->",
704
+ "<!--/--></div>"
705
+ ];
706
+ var _tmpl$5$1 = [
707
+ "<div",
708
+ " class=\"media-picker-modal\"><div class=\"media-picker-modal__toolbar\"><input class=\"input media-picker-modal__search\" type=\"search\" name=\"media-search\" aria-label=\"Search media\" placeholder=\"Search by filename or alt text\"",
709
+ "><!--$-->",
710
+ "<!--/--><label class=\"",
711
+ "\"><!--$-->",
712
+ "<!--/--><input type=\"file\"",
713
+ "",
714
+ " hidden></label></div><!--$-->",
715
+ "<!--/--><!--$-->",
716
+ "<!--/--><!--$-->",
717
+ "<!--/--><div class=\"media-picker-modal__body\"><div><div class=\"media-picker-modal__grid\">",
718
+ "</div><!--$-->",
719
+ "<!--/--></div><!--$-->",
720
+ "<!--/--></div><!--$-->",
721
+ "<!--/--><div class=\"media-picker-modal__actions\"><span class=\"muted\">",
722
+ "</span><div><!--$-->",
723
+ "<!--/--><!--$-->",
724
+ "<!--/--></div></div></div>"
725
+ ];
726
+ var _tmpl$6$1 = ["<img", " loading=\"lazy\">"];
727
+ var _tmpl$7$1 = [
728
+ "<button",
729
+ " type=\"button\" class=\"",
730
+ "\"><div class=\"media-card__preview\">",
731
+ "</div><span class=\"media-card__name\"",
732
+ ">",
733
+ "</span></button>"
734
+ ];
735
+ var _tmpl$8$1 = [
736
+ "<span",
737
+ " class=\"media-card__ext\">",
738
+ "</span>"
739
+ ];
740
+ var _tmpl$9$1 = [
741
+ "<div",
742
+ " class=\"media-picker-modal__order-item\"><span><!--$-->",
743
+ "<!--/-->. <!--$-->",
744
+ "<!--/--></span><!--$-->",
745
+ "<!--/--><!--$-->",
746
+ "<!--/--></div>"
747
+ ];
748
+ var _tmpl$0$1 = ["<p", " class=\"muted media-picker-modal__empty-details\">Click an item to inspect its details.</p>"];
749
+ var _tmpl$1$1 = ["<img", ">"];
750
+ var _tmpl$10$1 = ["<dt", ">Dimensions</dt>"];
751
+ var _tmpl$11$1 = [
752
+ "<dd",
753
+ ">",
754
+ "</dd>"
755
+ ];
756
+ var _tmpl$12$1 = ["<dt", ">Metadata</dt>"];
757
+ var _tmpl$13$1 = [
758
+ "<dd",
759
+ "><code>",
760
+ "</code></dd>"
761
+ ];
762
+ var _tmpl$14$1 = [
763
+ "<aside",
764
+ " class=\"media-picker-modal__details\"><div class=\"media-modal__preview\">",
765
+ "</div><h4>",
766
+ "</h4><dl class=\"media-details__list\"><dt>Filename</dt><dd>",
767
+ "</dd><dt>Extension</dt><dd>",
768
+ "</dd><dt>MIME type</dt><dd>",
769
+ "</dd><dt>Size</dt><dd>",
770
+ "</dd><!--$-->",
771
+ "<!--/--><dt>URL</dt><dd><code>",
772
+ "</code></dd><dt>Uploaded</dt><dd>",
773
+ "</dd><dt>Title</dt><dd><input class=\"input\"",
774
+ "></dd><dt>Alt text</dt><dd><input class=\"input\"",
775
+ "></dd><dt>Caption</dt><dd><textarea class=\"input\" rows=\"2\"",
776
+ "></textarea></dd><dt>Description</dt><dd><textarea class=\"input\" rows=\"3\"",
777
+ "></textarea></dd><!--$-->",
778
+ "<!--/--></dl><!--$-->",
779
+ "<!--/--></aside>"
780
+ ];
781
+ var _tmpl$15$1 = [
782
+ "<span",
783
+ " class=\"media-card__ext media-modal__file-icon\">",
784
+ "</span>"
785
+ ];
786
+ var PAGE_SIZE = 18;
787
+ function displayTitle(media) {
788
+ return media.title?.trim() || media.filename;
789
+ }
790
+ function extension(media) {
791
+ return media.filename.split(".").pop()?.toUpperCase() || "FILE";
792
+ }
793
+ function formatSize(bytes) {
794
+ if (!Number.isFinite(bytes)) return "—";
795
+ if (bytes < 1024) return `${bytes} B`;
796
+ if (bytes < 1048576) return `${(bytes / 1024).toFixed(1)} KB`;
797
+ return `${(bytes / 1048576).toFixed(1)} MB`;
798
+ }
799
+ function isImage(media) {
800
+ return media.mime_type.startsWith("image/");
801
+ }
802
+ function dimensions(media) {
803
+ const width = Number(media.metadata?.["width"]);
804
+ const height = Number(media.metadata?.["height"]);
805
+ return width > 0 && height > 0 ? `${width} × ${height} px` : null;
806
+ }
807
+ function selectedIds(value) {
808
+ return (Array.isArray(value) ? value : value ? [value] : []).map((media) => media.id);
809
+ }
810
+ function MediaPickerModal(props) {
811
+ const [items, setItems] = createSignal([]);
812
+ const [total, setTotal] = createSignal(0);
813
+ const [page, setPage] = createSignal(1);
814
+ const [search, setSearch] = createSignal("");
815
+ const [selected, setSelected] = createSignal(null);
816
+ const [selectedItems, setSelectedItems] = createSignal([]);
817
+ const [loading, setLoading] = createSignal(false);
818
+ const [error, setError] = createSignal("");
819
+ const [uploading, setUploading] = createSignal(false);
820
+ const [metadataSaving, setMetadataSaving] = createSignal(false);
821
+ const [metadataDirty, setMetadataDirty] = createSignal(false);
822
+ const [titleValue, setTitleValue] = createSignal("");
823
+ const [altValue, setAltValue] = createSignal("");
824
+ const [captionValue, setCaptionValue] = createSignal("");
825
+ const [descriptionValue, setDescriptionValue] = createSignal("");
826
+ const title = () => props.mode === "gallery" ? "Select images" : props.mode === "image" ? "Select an image" : "Select a file";
827
+ const mimeType = () => props.mode === "file" ? void 0 : "image/*";
828
+ const mediaUrl = (media) => apiClient.mediaUrl(media.url);
829
+ const load = async () => {
830
+ setLoading(true);
831
+ setError("");
832
+ try {
833
+ const result = await apiClient.listMedia({
834
+ page: page(),
835
+ limit: PAGE_SIZE,
836
+ search: search() || void 0,
837
+ mimeType: mimeType()
838
+ });
839
+ setItems(result.data ?? []);
840
+ setTotal(result.total ?? 0);
841
+ } catch (err) {
842
+ setError(err instanceof Error ? err.message : String(err));
843
+ } finally {
844
+ setLoading(false);
845
+ }
846
+ };
847
+ onMount(() => {
848
+ const current = Array.isArray(props.value) ? props.value : props.value ? [props.value] : [];
849
+ setSelectedItems(current);
850
+ setSelected(current[0] ?? null);
851
+ setTitleValue(current[0]?.title ?? "");
852
+ setAltValue(current[0]?.alt ?? "");
853
+ setCaptionValue(current[0]?.caption ?? "");
854
+ setDescriptionValue(current[0]?.description ?? "");
855
+ load();
856
+ });
857
+ const confirm = () => {
858
+ if (metadataDirty()) {
859
+ setError("Save media details before selecting this attachment.");
860
+ return;
861
+ }
862
+ if (props.mode === "gallery") {
863
+ if (selectedItems().length > 0) props.onSelect(selectedItems());
864
+ return;
865
+ }
866
+ const media = selected();
867
+ if (media) props.onSelect(media);
868
+ };
869
+ const saveMetadata = async () => {
870
+ const media = selected();
871
+ if (!media) return;
872
+ setMetadataSaving(true);
873
+ setError("");
874
+ try {
875
+ const updated = await apiClient.updateMedia(media.id, {
876
+ title: titleValue(),
877
+ alt: altValue(),
878
+ caption: captionValue(),
879
+ description: descriptionValue()
880
+ });
881
+ setSelected(updated);
882
+ setSelectedItems((current) => current.map((item) => item.id === updated.id ? updated : item));
883
+ setMetadataDirty(false);
884
+ } catch (err) {
885
+ setError(err instanceof Error ? err.message : String(err));
886
+ } finally {
887
+ setMetadataSaving(false);
888
+ }
889
+ };
890
+ const moveSelected = (index, offset) => {
891
+ const nextIndex = index + offset;
892
+ const current = [...selectedItems()];
893
+ if (nextIndex < 0 || nextIndex >= current.length) return;
894
+ const currentItem = current[index];
895
+ const nextItem = current[nextIndex];
896
+ if (!currentItem || !nextItem) return;
897
+ current[index] = nextItem;
898
+ current[nextIndex] = currentItem;
899
+ setSelectedItems(current);
900
+ };
901
+ const searchNow = async () => {
902
+ setPage(1);
903
+ await load();
904
+ };
905
+ return createComponent(Modal, {
906
+ get open() {
907
+ return props.open;
908
+ },
909
+ get title() {
910
+ return title();
911
+ },
912
+ get onClose() {
913
+ return props.onClose;
914
+ },
915
+ get children() {
916
+ return ssr(_tmpl$5$1, ssrHydrationKey(), ssrAttribute("value", escape(search(), true), false), escape(createComponent(Button, {
917
+ variant: "secondary",
918
+ onClick: () => void searchNow(),
919
+ children: "Search"
920
+ })), `btn btn-secondary ${uploading() ? "btn-loading" : ""}`, uploading() ? "Uploading…" : "Upload", ssrAttribute("accept", props.mode === "file" ? escape(void 0, true) : "image/*", false), ssrAttribute("disabled", uploading(), true), escape(createComponent(Show, {
921
+ get when() {
922
+ return error();
923
+ },
924
+ get children() {
925
+ return ssr(_tmpl$$1, ssrHydrationKey(), escape(error()), escape(createComponent(Button, {
926
+ variant: "secondary",
927
+ size: "sm",
928
+ onClick: () => void load(),
929
+ children: "Retry"
930
+ })));
931
+ }
932
+ })), escape(createComponent(Show, {
933
+ get when() {
934
+ return loading();
935
+ },
936
+ get children() {
937
+ return ssr(_tmpl$2$1, ssrHydrationKey());
938
+ }
939
+ })), escape(createComponent(Show, {
940
+ get when() {
941
+ return memo(() => !!!loading())() && items().length === 0;
942
+ },
943
+ get children() {
944
+ return ssr(_tmpl$3$1, ssrHydrationKey());
945
+ }
946
+ })), escape(createComponent(For, {
947
+ get each() {
948
+ return items();
949
+ },
950
+ children: (media) => ssr(_tmpl$7$1, ssrHydrationKey(), `media-card ${selectedIds(selectedItems()).includes(media.id) ? "media-card--selected" : ""}`, escape(createComponent(Show, {
951
+ get when() {
952
+ return isImage(media);
953
+ },
954
+ get fallback() {
955
+ return ssr(_tmpl$8$1, ssrHydrationKey(), escape(extension(media)));
956
+ },
957
+ get children() {
958
+ return ssr(_tmpl$6$1, ssrHydrationKey() + ssrAttribute("src", escape(mediaUrl(media), true), false) + ssrAttribute("alt", escape(media.alt ?? displayTitle(media), true), false));
959
+ }
960
+ })), ssrAttribute("title", escape(displayTitle(media), true), false), escape(displayTitle(media)))
961
+ })), escape(createComponent(Show, {
962
+ get when() {
963
+ return memo(() => props.mode === "gallery")() && selectedItems().length > 0;
964
+ },
965
+ get children() {
966
+ return ssr(_tmpl$4$1, ssrHydrationKey(), escape(createComponent(For, {
967
+ get each() {
968
+ return selectedItems();
969
+ },
970
+ children: (media, index) => ssr(_tmpl$9$1, ssrHydrationKey(), escape(index()) + 1, escape(displayTitle(media)), escape(createComponent(Button, {
971
+ variant: "ghost",
972
+ size: "sm",
973
+ get disabled() {
974
+ return index() === 0;
975
+ },
976
+ onClick: () => moveSelected(index(), -1),
977
+ children: "↑"
978
+ })), escape(createComponent(Button, {
979
+ variant: "ghost",
980
+ size: "sm",
981
+ get disabled() {
982
+ return index() === selectedItems().length - 1;
983
+ },
984
+ onClick: () => moveSelected(index(), 1),
985
+ children: "↓"
986
+ })))
987
+ })));
988
+ }
989
+ })), escape(createComponent(Show, {
990
+ get when() {
991
+ return selected();
992
+ },
993
+ get fallback() {
994
+ return ssr(_tmpl$0$1, ssrHydrationKey());
995
+ },
996
+ children: (media) => ssr(_tmpl$14$1, ssrHydrationKey(), escape(createComponent(Show, {
997
+ get when() {
998
+ return isImage(media());
999
+ },
1000
+ get fallback() {
1001
+ return ssr(_tmpl$15$1, ssrHydrationKey(), escape(extension(media())));
1002
+ },
1003
+ get children() {
1004
+ return ssr(_tmpl$1$1, ssrHydrationKey() + ssrAttribute("src", escape(mediaUrl(media()), true), false) + ssrAttribute("alt", escape(media().alt ?? displayTitle(media()), true), false));
1005
+ }
1006
+ })), escape(displayTitle(media())), escape(media().filename), escape(extension(media())), escape(media().mime_type), escape(formatSize(media().size)), escape(createComponent(Show, {
1007
+ get when() {
1008
+ return dimensions(media());
1009
+ },
1010
+ get children() {
1011
+ return [ssr(_tmpl$10$1, ssrHydrationKey()), ssr(_tmpl$11$1, ssrHydrationKey(), escape(dimensions(media())))];
1012
+ }
1013
+ })), escape(mediaUrl(media())), media().created_at ? escape(new Date(media().created_at).toLocaleString()) : "—", ssrAttribute("value", escape(titleValue(), true), false), ssrAttribute("value", escape(altValue(), true), false), ssrAttribute("value", escape(captionValue(), true), false), ssrAttribute("value", escape(descriptionValue(), true), false), escape(createComponent(Show, {
1014
+ get when() {
1015
+ return memo(() => !!media().metadata)() && Object.keys(media().metadata ?? {}).length > 0;
1016
+ },
1017
+ get children() {
1018
+ return [ssr(_tmpl$12$1, ssrHydrationKey()), ssr(_tmpl$13$1, ssrHydrationKey(), escape(JSON.stringify(media().metadata)))];
1019
+ }
1020
+ })), escape(createComponent(Show, {
1021
+ get when() {
1022
+ return metadataDirty();
1023
+ },
1024
+ get children() {
1025
+ return createComponent(Button, {
1026
+ variant: "secondary",
1027
+ get disabled() {
1028
+ return metadataSaving();
1029
+ },
1030
+ onClick: () => void saveMetadata(),
1031
+ get children() {
1032
+ return metadataSaving() ? "Saving…" : "Save media details";
1033
+ }
1034
+ });
1035
+ }
1036
+ })))
1037
+ })), escape(createComponent(Pagination, {
1038
+ get page() {
1039
+ return page();
1040
+ },
1041
+ limit: PAGE_SIZE,
1042
+ get total() {
1043
+ return total();
1044
+ },
1045
+ onPageChange: (next) => {
1046
+ setPage(next);
1047
+ load();
1048
+ }
1049
+ })), metadataDirty() ? "Unsaved media details" : props.mode === "gallery" ? `${escape(selectedItems().length)} image(s) selected` : selected() ? "1 item selected" : "No item selected", escape(createComponent(Button, {
1050
+ variant: "secondary",
1051
+ get onClick() {
1052
+ return props.onClose;
1053
+ },
1054
+ children: "Cancel"
1055
+ })), escape(createComponent(Button, {
1056
+ variant: "primary",
1057
+ get disabled() {
1058
+ return memo(() => props.mode === "gallery")() ? selectedItems().length === 0 : !selected();
1059
+ },
1060
+ onClick: confirm,
1061
+ children: "Select"
1062
+ })));
1063
+ }
1064
+ });
689
1065
  }
690
1066
  //#endregion
691
1067
  //#region src/components/content/FieldRenderer.tsx
@@ -829,17 +1205,22 @@ var _tmpl$21 = [
829
1205
  "><option value=\"_self\">Mesma janela</option><option value=\"_blank\">Nova janela</option></select></div>"
830
1206
  ];
831
1207
  var _tmpl$22 = [
1208
+ "<input",
1209
+ " type=\"text\" class=\"input\"",
1210
+ " readonly aria-readonly=\"true\">"
1211
+ ];
1212
+ var _tmpl$23 = [
832
1213
  "<div",
833
1214
  " class=\"field-renderer__rows\"><!--$-->",
834
1215
  "<!--/--><button type=\"button\" class=\"btn\">+ Adicionar linha</button></div>"
835
1216
  ];
836
- var _tmpl$23 = [
1217
+ var _tmpl$24 = [
837
1218
  "<div",
838
1219
  " class=\"field-renderer__rows\"><!--$-->",
839
1220
  "<!--/--><select class=\"input\" value><option value>+ Adicionar layout...</option><!--$-->",
840
1221
  "<!--/--></select></div>"
841
1222
  ];
842
- var _tmpl$24 = [
1223
+ var _tmpl$25 = [
843
1224
  "<div",
844
1225
  " class=\"field-renderer__row\"><div class=\"field-renderer__row-header\"><span><!--$-->",
845
1226
  "<!--/--> <!--$-->",
@@ -848,29 +1229,53 @@ var _tmpl$24 = [
848
1229
  ">↓</button><button type=\"button\" class=\"btn btn-danger\">Remover</button></div><!--$-->",
849
1230
  "<!--/--></div>"
850
1231
  ];
851
- var _tmpl$25 = [
1232
+ var _tmpl$26 = [
852
1233
  "<p",
853
1234
  " class=\"field-renderer__instructions\">Layout \"<!--$-->",
854
1235
  "<!--/-->\" não encontrado.</p>"
855
1236
  ];
856
- var _tmpl$26 = [
1237
+ var _tmpl$27 = [
857
1238
  "<fieldset",
858
1239
  " class=\"field-renderer__group\">",
859
1240
  "</fieldset>"
860
1241
  ];
861
- var _tmpl$27 = ["<input", " type=\"text\" class=\"input\">"];
862
- var _tmpl$28 = [
1242
+ var _tmpl$28 = ["<input", " type=\"text\" class=\"input\">"];
1243
+ var _tmpl$29 = [
863
1244
  "<div",
864
1245
  " class=\"field-renderer__row\"><div class=\"field-renderer__row-header\"><span>Linha <!--$-->",
865
1246
  "<!--/--></span><button type=\"button\" class=\"btn btn-danger\">Remover</button></div><!--$-->",
866
1247
  "<!--/--></div>"
867
1248
  ];
868
- var _tmpl$29 = [
869
- "<input",
870
- " type=\"file\" class=\"input\"",
871
- ">"
1249
+ var _tmpl$30 = ["<p", " class=\"notice notice--warning\" role=\"alert\">The selected media is no longer available. Choose a replacement.</p>"];
1250
+ var _tmpl$31 = [
1251
+ "<div",
1252
+ " class=\"media-field-input__preview\">",
1253
+ "</div>"
1254
+ ];
1255
+ var _tmpl$32 = ["<button", " type=\"button\" class=\"btn btn-ghost\">Remove</button>"];
1256
+ var _tmpl$33 = [
1257
+ "<div",
1258
+ " class=\"media-field-input\"><!--$-->",
1259
+ "<!--/--><!--$-->",
1260
+ "<!--/--><div class=\"media-field-input__actions\"><button type=\"button\" class=\"btn btn-secondary\">",
1261
+ "</button><!--$-->",
1262
+ "<!--/--></div><!--$-->",
1263
+ "<!--/--></div>"
1264
+ ];
1265
+ var _tmpl$34 = ["<img", ">"];
1266
+ var _tmpl$35 = [
1267
+ "<div",
1268
+ " class=\"media-field-input__item\"><!--$-->",
1269
+ "<!--/--><span",
1270
+ ">",
1271
+ "</span></div>"
872
1272
  ];
873
- var _tmpl$30 = [
1273
+ var _tmpl$36 = [
1274
+ "<span",
1275
+ ">",
1276
+ "</span>"
1277
+ ];
1278
+ var _tmpl$37 = [
874
1279
  "<option",
875
1280
  "",
876
1281
  ">",
@@ -1016,21 +1421,25 @@ function FieldControl(props) {
1016
1421
  case "time_picker": return ssr(_tmpl$18, ssrHydrationKey(), ssrAttribute("value", escape(props.value ?? config()["defaultValue"] ?? "", true), false));
1017
1422
  case "color_picker": return ssr(_tmpl$19, ssrHydrationKey(), ssrAttribute("value", escape(props.value ?? config()["defaultValue"] ?? "", true), false));
1018
1423
  case "image":
1019
- case "file": return createComponent(MediaPickerInput, {
1020
- multiple: false,
1424
+ case "file": return createComponent(MediaFieldInput, {
1425
+ get mode() {
1426
+ return props.field.type;
1427
+ },
1428
+ get value() {
1429
+ return props.value;
1430
+ },
1021
1431
  get onChange() {
1022
1432
  return props.onChange;
1023
- },
1024
- get accept() {
1025
- return props.field.type === "image" ? "image/*" : void 0;
1026
1433
  }
1027
1434
  });
1028
- case "gallery": return createComponent(MediaPickerInput, {
1029
- multiple: true,
1435
+ case "gallery": return createComponent(MediaFieldInput, {
1436
+ mode: "gallery",
1437
+ get value() {
1438
+ return props.value;
1439
+ },
1030
1440
  get onChange() {
1031
1441
  return props.onChange;
1032
- },
1033
- accept: "image/*"
1442
+ }
1034
1443
  });
1035
1444
  case "google_map": return ssr(_tmpl$20, ssrHydrationKey(), ssrAttribute("value", escape(props.value?.["address"] ?? "", true), false), ssrAttribute("value", escape(props.value?.["lat"] ?? "", true), false), ssrAttribute("value", escape(props.value?.["lng"] ?? "", true), false));
1036
1445
  case "link": return ssr(_tmpl$21, ssrHydrationKey(), ssrAttribute("value", escape(props.value?.["url"] ?? "", true), false), ssrAttribute("value", escape(props.value?.["target"] ?? "_self", true), false));
@@ -1049,8 +1458,7 @@ function FieldControl(props) {
1049
1458
  return props.onChange;
1050
1459
  }
1051
1460
  });
1052
- case "taxonomy":
1053
- case "user": return createComponent(RelationshipSelector, {
1461
+ case "taxonomy": return createComponent(RelationshipSelector, {
1054
1462
  get field() {
1055
1463
  return props.field;
1056
1464
  },
@@ -1064,9 +1472,25 @@ function FieldControl(props) {
1064
1472
  return config()["multiple"] !== false;
1065
1473
  }
1066
1474
  });
1475
+ case "user":
1476
+ if (props.field.isCoreField && props.field.coreFieldKey === "author") return ssr(_tmpl$22, ssrHydrationKey(), ssrAttribute("value", escape(props.value ?? "", true), false));
1477
+ return createComponent(RelationshipSelector, {
1478
+ get field() {
1479
+ return props.field;
1480
+ },
1481
+ get value() {
1482
+ return props.value;
1483
+ },
1484
+ get onChange() {
1485
+ return props.onChange;
1486
+ },
1487
+ get multiple() {
1488
+ return config()["multiple"] !== false;
1489
+ }
1490
+ });
1067
1491
  case "repeater": {
1068
1492
  const rows = () => Array.isArray(props.value) ? props.value : [];
1069
- return ssr(_tmpl$22, ssrHydrationKey(), escape(createComponent(For, {
1493
+ return ssr(_tmpl$23, ssrHydrationKey(), escape(createComponent(For, {
1070
1494
  get each() {
1071
1495
  return rows();
1072
1496
  },
@@ -1103,7 +1527,7 @@ function FieldControl(props) {
1103
1527
  data: row
1104
1528
  }));
1105
1529
  };
1106
- return ssr(_tmpl$23, ssrHydrationKey(), escape(createComponent(For, {
1530
+ return ssr(_tmpl$24, ssrHydrationKey(), escape(createComponent(For, {
1107
1531
  get each() {
1108
1532
  return rows();
1109
1533
  },
@@ -1113,12 +1537,12 @@ function FieldControl(props) {
1113
1537
  const { fc_layout: _layout, ...data } = row.data;
1114
1538
  return data;
1115
1539
  };
1116
- return ssr(_tmpl$24, ssrHydrationKey(), escape(layout()?.label || row.fc_layout || "Linha"), escape(index()) + 1, ssrAttribute("disabled", index() === 0, true), ssrAttribute("disabled", index() === rows().length - 1, true), escape(createComponent(Show, {
1540
+ return ssr(_tmpl$25, ssrHydrationKey(), escape(layout()?.label || row.fc_layout || "Linha"), escape(index()) + 1, ssrAttribute("disabled", index() === 0, true), ssrAttribute("disabled", index() === rows().length - 1, true), escape(createComponent(Show, {
1117
1541
  get when() {
1118
1542
  return layout();
1119
1543
  },
1120
1544
  get fallback() {
1121
- return ssr(_tmpl$25, ssrHydrationKey(), escape(row.fc_layout));
1545
+ return ssr(_tmpl$26, ssrHydrationKey(), escape(row.fc_layout));
1122
1546
  },
1123
1547
  get children() {
1124
1548
  return createComponent(For, {
@@ -1153,7 +1577,7 @@ function FieldControl(props) {
1153
1577
  children: (layout) => ssr(_tmpl$12, ssrHydrationKey() + ssrAttribute("value", escape(layout.name, true), false), escape(layout.label ?? layout.name))
1154
1578
  })));
1155
1579
  }
1156
- case "group": return ssr(_tmpl$26, ssrHydrationKey(), escape(createComponent(For, {
1580
+ case "group": return ssr(_tmpl$27, ssrHydrationKey(), escape(createComponent(For, {
1157
1581
  get each() {
1158
1582
  return props.field.subFields ?? [];
1159
1583
  },
@@ -1192,11 +1616,11 @@ function FieldControl(props) {
1192
1616
  return props.t;
1193
1617
  }
1194
1618
  });
1195
- return ssr(_tmpl$27, ssrHydrationKey());
1619
+ return ssr(_tmpl$28, ssrHydrationKey());
1196
1620
  }
1197
1621
  }
1198
1622
  function RepeaterRow(props) {
1199
- return ssr(_tmpl$28, ssrHydrationKey(), escape(props.index) + 1, escape(createComponent(For, {
1623
+ return ssr(_tmpl$29, ssrHydrationKey(), escape(props.index) + 1, escape(createComponent(For, {
1200
1624
  get each() {
1201
1625
  return props.field.subFields ?? [];
1202
1626
  },
@@ -1215,8 +1639,92 @@ function RepeaterRow(props) {
1215
1639
  })
1216
1640
  })));
1217
1641
  }
1218
- function MediaPickerInput(props) {
1219
- return ssr(_tmpl$29, ssrHydrationKey(), ssrAttribute("multiple", props.multiple, true) + ssrAttribute("accept", escape(props.accept, true), false));
1642
+ function MediaFieldInput(props) {
1643
+ const [open, setOpen] = createSignal(false);
1644
+ const [resolved, setResolved] = createSignal(null);
1645
+ const [stale, setStale] = createSignal(false);
1646
+ onMount(() => {
1647
+ const value = props.value;
1648
+ const ids = (Array.isArray(value) ? value : value ? [value] : []).filter((item) => typeof item === "string");
1649
+ if (ids.length === 0) {
1650
+ setStale(false);
1651
+ setResolved(Array.isArray(value) ? value : value ? [value] : []);
1652
+ return;
1653
+ }
1654
+ Promise.all(ids.map((id) => apiClient.getMedia(id).catch(() => null))).then((items) => {
1655
+ const media = items.filter((item) => item !== null);
1656
+ setStale(media.length !== ids.length);
1657
+ setResolved(props.mode === "gallery" ? media : media[0] ?? null);
1658
+ });
1659
+ });
1660
+ const currentItems = () => {
1661
+ const value = resolved() ?? props.value;
1662
+ return (Array.isArray(value) ? value : value ? [value] : []).filter((item) => typeof item === "object" && item !== null && typeof item.id === "string");
1663
+ };
1664
+ const pickerValue = () => {
1665
+ const items = currentItems();
1666
+ return props.mode === "gallery" ? items : items[0] ?? null;
1667
+ };
1668
+ return ssr(_tmpl$33, ssrHydrationKey(), escape(createComponent(Show, {
1669
+ get when() {
1670
+ return stale();
1671
+ },
1672
+ get children() {
1673
+ return ssr(_tmpl$30, ssrHydrationKey());
1674
+ }
1675
+ })), escape(createComponent(Show, {
1676
+ get when() {
1677
+ return currentItems().length > 0;
1678
+ },
1679
+ get children() {
1680
+ return ssr(_tmpl$31, ssrHydrationKey(), escape(createComponent(For, {
1681
+ get each() {
1682
+ return currentItems();
1683
+ },
1684
+ children: (media) => ssr(_tmpl$35, ssrHydrationKey(), escape(createComponent(Show, {
1685
+ get when() {
1686
+ return media.mime_type.startsWith("image/");
1687
+ },
1688
+ get fallback() {
1689
+ return ssr(_tmpl$36, ssrHydrationKey(), escape(media.filename));
1690
+ },
1691
+ get children() {
1692
+ return ssr(_tmpl$34, ssrHydrationKey() + ssrAttribute("src", escape(apiClient.mediaUrl(media.url), true), false) + ssrAttribute("alt", escape(media.alt ?? media.filename, true), false));
1693
+ }
1694
+ })), ssrAttribute("title", escape(media.filename, true), false), escape(media.title || media.filename))
1695
+ })));
1696
+ }
1697
+ })), currentItems().length > 0 ? "Change media" : "Choose media", escape(createComponent(Show, {
1698
+ get when() {
1699
+ return currentItems().length > 0;
1700
+ },
1701
+ get children() {
1702
+ return ssr(_tmpl$32, ssrHydrationKey());
1703
+ }
1704
+ })), escape(createComponent(Show, {
1705
+ get when() {
1706
+ return open();
1707
+ },
1708
+ get children() {
1709
+ return createComponent(MediaPickerModal, {
1710
+ get open() {
1711
+ return open();
1712
+ },
1713
+ get mode() {
1714
+ return props.mode;
1715
+ },
1716
+ get value() {
1717
+ return pickerValue();
1718
+ },
1719
+ onClose: () => setOpen(false),
1720
+ onSelect: (media) => {
1721
+ setResolved(media);
1722
+ props.onChange(Array.isArray(media) ? media.map((item) => item.id) : media.id);
1723
+ setOpen(false);
1724
+ }
1725
+ });
1726
+ }
1727
+ })));
1220
1728
  }
1221
1729
  function RelationshipSelector(props) {
1222
1730
  const selectedIds = () => Array.isArray(props.value) ? props.value : props.value ? [props.value] : [];
@@ -1224,7 +1732,7 @@ function RelationshipSelector(props) {
1224
1732
  get each() {
1225
1733
  return props.field.config?.["choices"] ?? [];
1226
1734
  },
1227
- children: (choice) => ssr(_tmpl$30, ssrHydrationKey() + ssrAttribute("value", escape(choice.value, true), false), ssrAttribute("selected", selectedIds().includes(choice.value), true), escape(choice.label))
1735
+ children: (choice) => ssr(_tmpl$37, ssrHydrationKey() + ssrAttribute("value", escape(choice.value, true), false), ssrAttribute("selected", selectedIds().includes(choice.value), true), escape(choice.label))
1228
1736
  })));
1229
1737
  }
1230
1738
  //#endregion