@oktis-works/admin 0.13.1 → 0.15.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/dist/client/_astro/{ActivityWidget.CCls_jrK.js → ActivityWidget.CedrZ3yN.js} +2 -2
- package/dist/client/_astro/AdminBar.CkfSUzJJ.js +253 -0
- package/dist/client/_astro/ApiKeysManager.ChCtr3J2.js +1 -0
- package/dist/client/_astro/{AtGlanceWidget.DPkp-rxl.js → AtGlanceWidget.DMrAc7qb.js} +3 -3
- package/dist/client/_astro/{BaseLayout.DAkzjMTq.css → BaseLayout.Cp-O10m_.css} +1 -1
- package/dist/client/_astro/CommentsManager.CtiI8mwU.js +21 -0
- package/dist/client/_astro/ContentEditor.BQTSumnU.js +1 -0
- package/dist/client/_astro/ContentEditor.Bl295osh.js +3 -0
- package/dist/client/_astro/ContentTypeWorkspace.xZAsn-ok.js +1 -0
- package/dist/client/_astro/DashboardHome.B7PYDcS1.js +1 -0
- package/dist/client/_astro/{DashboardLayout.astro_astro_type_script_index_0_lang.D2eyDf2o.js → DashboardLayout.astro_astro_type_script_index_0_lang.BFY8jBwE.js} +1 -1
- package/dist/client/_astro/FbIcon.Bn4e_qFb.js +1 -0
- package/dist/client/_astro/FieldGroupEditor.BsV0u51p.js +69 -0
- package/dist/client/_astro/FieldGroupList.CXyFKdsR.js +1 -0
- package/dist/client/_astro/FieldRenderer.2TxRD88c.js +1 -0
- package/dist/client/_astro/FloatingPanel.BetdW5N2.js +1 -0
- package/dist/client/_astro/{Footer.JI2Mqd9V.js → Footer.BKD9_ctB.js} +2 -2
- package/dist/client/_astro/GeneralSettings.Di8ILdOl.js +1 -0
- package/dist/client/_astro/LogsManager.WBGR0Ci2.js +1 -0
- package/dist/client/_astro/MediaLibrary.B5ozN2R7.js +1 -0
- package/dist/client/_astro/MenuManager.9UORktNs.js +1 -0
- package/dist/client/_astro/Modal.CPaZJlDP.js +1 -0
- package/dist/client/_astro/PluginManager._RYLLtJI.js +112 -0
- package/dist/client/_astro/PostTypesManager.B6dDnCOy.js +1 -0
- package/dist/client/_astro/QuickDraftWidget.DCVYrBPm.js +17 -0
- package/dist/client/_astro/ResourceHubs.Cd0KB4Rx.js +1 -0
- package/dist/client/_astro/TaxonomiesManager.9I03xqrR.js +1 -0
- package/dist/client/_astro/TaxonomyTermsManager.btLVdHr-.js +1 -0
- package/dist/client/_astro/ThemeCustomizer.CXg9hm9t.js +49 -0
- package/dist/client/_astro/ThemeManager.BfQh8JJa.js +144 -0
- package/dist/client/_astro/UserCreateForm.BAd11jYs.js +1 -0
- package/dist/client/_astro/UsersManager.gkehfvoP.js +1 -0
- package/dist/client/_astro/WebhooksManager.BCilUaGs.js +1 -0
- package/dist/client/_astro/{api.CYg1SW2X.js → api.B03e8F6d.js} +1 -1
- package/dist/client/_astro/client.ljtU74WL.js +1 -0
- package/dist/client/_astro/extensions.EzvpwBZm.js +1 -0
- package/dist/client/_astro/i18n.LMZI7jyc.js +1 -0
- package/dist/client/_astro/{login.astro_astro_type_script_index_0_lang.F2J3xZhK.js → login.astro_astro_type_script_index_0_lang.BUOUZuDy.js} +1 -1
- package/dist/client/_astro/preload-helper.oCYlU9a4.js +1 -0
- package/dist/client/_astro/pt-BR.CfJP86YC.js +1 -0
- package/dist/client/_astro/solid.Ck4Vtfe4.js +1 -0
- package/dist/client/_astro/src.CYKGYEyR.js +1 -0
- package/dist/client/_astro/store.DJjOMYcw.js +1 -0
- package/dist/client/_astro/web.DD6VKaIp.js +1 -0
- package/dist/server/chunks/{404_C9Eokbcv.mjs → 404_CIlW8Cz9.mjs} +1 -1
- package/dist/server/chunks/{BaseLayout_DgDmTH8p.mjs → BaseLayout_DdN9Gl3i.mjs} +5 -5
- package/dist/server/chunks/ContentEditor_GenRIOIJ.mjs +655 -0
- package/dist/server/chunks/{DashboardLayout_CrxyUavx.mjs → DashboardLayout_BY4AqWC6.mjs} +354 -91
- package/dist/server/chunks/{ContentEditor_VK16JJMh.mjs → FieldRenderer_pM3Tq7vY.mjs} +54 -615
- package/dist/server/chunks/{MediaLibrary_CZuj5byR.mjs → MediaLibrary_woj8kWSK.mjs} +2 -2
- package/dist/server/chunks/{Modal_BfWFiyry.mjs → Modal_BQZlVP1o.mjs} +1 -1
- package/dist/server/chunks/{_id__BYx77RvL.mjs → _id__CIrIQBGk.mjs} +5 -4
- package/dist/server/chunks/{_slug__CR6t9xra.mjs → _slug__DP5cppSD.mjs} +1 -1
- package/dist/server/chunks/{access_Bp3EnO2H.mjs → access_Cr1RkoC8.mjs} +3 -3
- package/dist/server/chunks/{api-keys_Dt87wCbg.mjs → api-keys_DxCfUQiR.mjs} +3 -3
- package/dist/server/chunks/comments_CDCO_DTQ.mjs +208 -0
- package/dist/server/chunks/{custom-fields_CC_ZhBpp.mjs → custom-fields_DUby1Cd7.mjs} +2 -2
- package/dist/server/chunks/customize_DITLWxTB.mjs +233 -0
- package/dist/server/chunks/{edit_VYWajKgt.mjs → edit_6xBPrb1J.mjs} +3 -3
- package/dist/server/chunks/{general_DtYlpwnZ.mjs → general_CA6aT6cZ.mjs} +2 -2
- package/dist/server/chunks/{i18n_B-DWAN0e.mjs → i18n_BBVOgA0q.mjs} +75 -36
- package/dist/server/chunks/{index_CDmqkl48.mjs → index_1C4PfYEy.mjs} +2 -2
- package/dist/server/chunks/{index_ieyhXCVt.mjs → index_CO2SvpwW.mjs} +1 -1
- package/dist/server/chunks/{index_DXmHKYjS.mjs → index_Cn92C8CO.mjs} +2 -2
- package/dist/server/chunks/{index_6a-jaApt.mjs → index_D2ypKpAG.mjs} +111 -62
- package/dist/server/chunks/{index_DgVVWosZ.mjs → index_D_AiNQGl.mjs} +2 -2
- package/dist/server/chunks/{login_DRJNLDt7.mjs → login_vyj4WhBt.mjs} +1 -1
- package/dist/server/chunks/{logs_CaMNxV6h.mjs → logs_BjuW-do3.mjs} +2 -2
- package/dist/server/chunks/{menus_BsV0U5D5.mjs → menus_CPi_m-b8.mjs} +2 -2
- package/dist/server/chunks/{new_BQ2d8AHk.mjs → new_BlENJv6A.mjs} +3 -3
- package/dist/server/chunks/{new_CyBl1PM1.mjs → new_D_pNdD5e.mjs} +2 -2
- package/dist/server/chunks/plugins_sYgOSowJ.mjs +150 -0
- package/dist/server/chunks/{post-types_BBKtACUm.mjs → post-types_Bm8olePm.mjs} +2 -2
- package/dist/server/chunks/{pt-BR_Da5G4GOV.mjs → pt-BR_DYDMLZu_.mjs} +53 -24
- package/dist/server/chunks/{taxonomies_gwfTSCOV.mjs → taxonomies_DbsqX_QZ.mjs} +2 -2
- package/dist/server/chunks/{taxonomy_BKdLzLps.mjs → taxonomy_ByKdjp9j.mjs} +64 -19
- package/dist/server/chunks/{themes_CqOUZiNg.mjs → themes_BKAM_crI.mjs} +27 -129
- package/dist/server/chunks/{upload_keeE9Mn0.mjs → upload_CE4Lbc1u.mjs} +2 -2
- package/dist/server/chunks/{webhooks_sTUPF0Xn.mjs → webhooks_CpruP30e.mjs} +2 -2
- package/dist/server/entry.mjs +104 -50
- package/dist/server/virtual_astro_middleware.mjs +1 -1
- package/package.json +5 -5
- package/dist/client/_astro/AdminBar.BW8zYZI3.js +0 -253
- package/dist/client/_astro/ApiKeysManager.Cj5tsk4N.js +0 -1
- package/dist/client/_astro/ContentEditor.CByEz10Q.js +0 -3
- package/dist/client/_astro/ContentEditor.kdYzULib.js +0 -1
- package/dist/client/_astro/ContentTypeWorkspace.BMVbiGGy.js +0 -1
- package/dist/client/_astro/DashboardHome.BuDu0DuB.js +0 -1
- package/dist/client/_astro/FbIcon.CUNS6rpP.js +0 -1
- package/dist/client/_astro/FieldGroupEditor.DGjV1n67.js +0 -69
- package/dist/client/_astro/FieldGroupList.BJ2TKSgY.js +0 -1
- package/dist/client/_astro/FloatingPanel.BeCEt_JP.js +0 -1
- package/dist/client/_astro/GeneralSettings.BSObhTfM.js +0 -1
- package/dist/client/_astro/LogsManager.B4-BxzoP.js +0 -1
- package/dist/client/_astro/MediaLibrary.BHVM3oJh.js +0 -1
- package/dist/client/_astro/MenuManager.BAn4_w6-.js +0 -1
- package/dist/client/_astro/Modal.BSZ5IjBl.js +0 -1
- package/dist/client/_astro/PluginManager.D_E-lPWP.js +0 -136
- package/dist/client/_astro/PostTypesManager.BHU1d2ta.js +0 -1
- package/dist/client/_astro/QuickDraftWidget.ClSsMYB_.js +0 -17
- package/dist/client/_astro/ResourceHubs.C3suqlP0.js +0 -1
- package/dist/client/_astro/TaxonomiesManager.BXYUiJEA.js +0 -1
- package/dist/client/_astro/TaxonomyTermsManager.obB3lkr3.js +0 -1
- package/dist/client/_astro/ThemeManager.C0TKggfZ.js +0 -176
- package/dist/client/_astro/UserCreateForm.DaIOqr8v.js +0 -1
- package/dist/client/_astro/UsersManager.B5zFoWmR.js +0 -1
- package/dist/client/_astro/WebhooksManager.BRvVuxLt.js +0 -1
- package/dist/client/_astro/client.DU9Dc2oe.js +0 -1
- package/dist/client/_astro/extensions.Brl6zAPA.js +0 -1
- package/dist/client/_astro/i18n.vdBFsiPK.js +0 -1
- package/dist/client/_astro/pt-BR.CKJnipDe.js +0 -1
- package/dist/client/_astro/solid.D49dPDCT.js +0 -1
- package/dist/client/_astro/src.DXVWCoHp.js +0 -1
- package/dist/client/_astro/web.Bqbl_1YR.js +0 -1
- package/dist/server/chunks/plugins_BiaE4So1.mjs +0 -179
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import "./i18n_BBVOgA0q.mjs";
|
|
2
|
+
import { _ as createMemo$1, h as Show2, u as For2, v as createSignal$1 } from "./DashboardLayout_BY4AqWC6.mjs";
|
|
3
3
|
import { createComponent, escape, memo, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
|
|
4
4
|
import { For, Show, createMemo, createSignal, onMount } from "solid-js";
|
|
5
5
|
//#region ../../packages/validation/dist/client-validate.js
|
|
@@ -525,340 +525,34 @@ function expandCloneFields(fields) {
|
|
|
525
525
|
return result;
|
|
526
526
|
}
|
|
527
527
|
//#endregion
|
|
528
|
-
//#region src/lib/sanitize.js
|
|
529
|
-
/**
|
|
530
|
-
* Sanitizador de HTML em allowlist para pontos de injeção (innerHTML).
|
|
531
|
-
*
|
|
532
|
-
* O admin injeta HTML apenas no conteúdo das abas de ajuda (HelpTabs), que
|
|
533
|
-
* vem do i18n — mas todo innerHTML passa por aqui por defesa em profundidade.
|
|
534
|
-
*
|
|
535
|
-
* Garantias:
|
|
536
|
-
* - Allowlist de tags e atributos (script/style/svg/iframe/form são removidos,
|
|
537
|
-
* incluindo o conteúdo de tags de texto bruto como <script> e <style>).
|
|
538
|
-
* - Atributos de evento (on*), style e demais fora da allowlist são descartados.
|
|
539
|
-
* - href/src têm o protocolo validado DEPOIS de decodificar entidades e remover
|
|
540
|
-
* tab/newline — o valor emitido é re-escapado a partir do valor decodificado,
|
|
541
|
-
* de modo que o que o navegador decodifica é exatamente o que foi validado
|
|
542
|
-
* (bloqueia `javascript:`, `javascript:`, `javascript:`, etc).
|
|
543
|
-
* - Texto é escapado (& < >), preservando entidades já válidas.
|
|
544
|
-
* - Tags de fechamento sem âncora são ignoradas: conteúdo malicioso não consegue
|
|
545
|
-
* "escapar" do container nem desbalancear a árvore (o quebra-cabeça de abas
|
|
546
|
-
* e widgets continua íntegro).
|
|
547
|
-
*
|
|
548
|
-
* Puro JavaScript, sem APIs de DOM: roda igual no SSR (Node) e no navegador.
|
|
549
|
-
*/
|
|
550
|
-
/** Tags permitidas (conteúdo rico simples: ajuda, títulos, listas, links). */
|
|
551
|
-
var ALLOWED_TAGS = /* @__PURE__ */ new Set([
|
|
552
|
-
"a",
|
|
553
|
-
"abbr",
|
|
554
|
-
"b",
|
|
555
|
-
"blockquote",
|
|
556
|
-
"br",
|
|
557
|
-
"code",
|
|
558
|
-
"dd",
|
|
559
|
-
"div",
|
|
560
|
-
"dl",
|
|
561
|
-
"dt",
|
|
562
|
-
"em",
|
|
563
|
-
"figcaption",
|
|
564
|
-
"figure",
|
|
565
|
-
"h1",
|
|
566
|
-
"h2",
|
|
567
|
-
"h3",
|
|
568
|
-
"h4",
|
|
569
|
-
"h5",
|
|
570
|
-
"h6",
|
|
571
|
-
"hr",
|
|
572
|
-
"i",
|
|
573
|
-
"img",
|
|
574
|
-
"li",
|
|
575
|
-
"ol",
|
|
576
|
-
"p",
|
|
577
|
-
"pre",
|
|
578
|
-
"q",
|
|
579
|
-
"s",
|
|
580
|
-
"span",
|
|
581
|
-
"strong",
|
|
582
|
-
"sub",
|
|
583
|
-
"sup",
|
|
584
|
-
"u",
|
|
585
|
-
"ul"
|
|
586
|
-
]);
|
|
587
|
-
/** Tags vazias (emitidas com fechamento próprio, nunca empilhadas). */
|
|
588
|
-
var VOID_TAGS = /* @__PURE__ */ new Set([
|
|
589
|
-
"br",
|
|
590
|
-
"hr",
|
|
591
|
-
"img"
|
|
592
|
-
]);
|
|
593
|
-
/**
|
|
594
|
-
* Tags cujo conteúdo é texto bruto no HTML. Ao encontrá-las abertas, todo o
|
|
595
|
-
* miolo é descartado até o fechamento correspondente (senão, o conteúdo do
|
|
596
|
-
* <script> viraria texto visível ou vetor de parse).
|
|
597
|
-
*/
|
|
598
|
-
var RAW_TEXT_TAGS = /* @__PURE__ */ new Set([
|
|
599
|
-
"script",
|
|
600
|
-
"style",
|
|
601
|
-
"iframe",
|
|
602
|
-
"object",
|
|
603
|
-
"embed",
|
|
604
|
-
"svg",
|
|
605
|
-
"math",
|
|
606
|
-
"textarea",
|
|
607
|
-
"title",
|
|
608
|
-
"noscript",
|
|
609
|
-
"template"
|
|
610
|
-
]);
|
|
611
|
-
/** Atributos permitidos (globais; validação extra por atributo abaixo). */
|
|
612
|
-
var ALLOWED_ATTRS = /* @__PURE__ */ new Set([
|
|
613
|
-
"class",
|
|
614
|
-
"title",
|
|
615
|
-
"alt",
|
|
616
|
-
"width",
|
|
617
|
-
"height",
|
|
618
|
-
"href",
|
|
619
|
-
"src",
|
|
620
|
-
"target",
|
|
621
|
-
"rel"
|
|
622
|
-
]);
|
|
623
|
-
/** Esquemas aceitos em href (links externos, e-mail, telefone). */
|
|
624
|
-
var HREF_SCHEMES = /* @__PURE__ */ new Set([
|
|
625
|
-
"http",
|
|
626
|
-
"https",
|
|
627
|
-
"mailto",
|
|
628
|
-
"tel"
|
|
629
|
-
]);
|
|
630
|
-
/** Esquemas aceitos em src (somente rede). */
|
|
631
|
-
var SRC_SCHEMES = /* @__PURE__ */ new Set(["http", "https"]);
|
|
632
|
-
/** Entidades nomeadas relevantes (as que poderiam alterar a validação de URL). */
|
|
633
|
-
var NAMED_ENTITIES = {
|
|
634
|
-
amp: "&",
|
|
635
|
-
lt: "<",
|
|
636
|
-
gt: ">",
|
|
637
|
-
quot: "\"",
|
|
638
|
-
apos: "'",
|
|
639
|
-
colon: ":",
|
|
640
|
-
tab: " ",
|
|
641
|
-
newline: "\n",
|
|
642
|
-
sol: "/",
|
|
643
|
-
lpar: "(",
|
|
644
|
-
rpar: ")",
|
|
645
|
-
num: "#",
|
|
646
|
-
period: ".",
|
|
647
|
-
excl: "!",
|
|
648
|
-
comma: ","
|
|
649
|
-
};
|
|
650
|
-
/** Decodifica referências numéricas e nomeadas (uma passada, como o navegador). */
|
|
651
|
-
function decodeEntities(value) {
|
|
652
|
-
return value.replace(/&#x([0-9a-fA-F]+);?/g, (_m, hex) => fromCodePoint(parseInt(hex, 16))).replace(/&#(\d+);?/g, (_m, dec) => fromCodePoint(parseInt(dec, 10))).replace(/&([a-zA-Z][a-zA-Z0-9]{1,30});?/g, (m, name) => {
|
|
653
|
-
return NAMED_ENTITIES[name in NAMED_ENTITIES ? name : name.toLowerCase()] ?? m;
|
|
654
|
-
});
|
|
655
|
-
}
|
|
656
|
-
function fromCodePoint(cp) {
|
|
657
|
-
if (!Number.isFinite(cp) || cp < 0 || cp > 1114111) return "";
|
|
658
|
-
try {
|
|
659
|
-
return String.fromCodePoint(cp);
|
|
660
|
-
} catch {
|
|
661
|
-
return "";
|
|
662
|
-
}
|
|
663
|
-
}
|
|
664
|
-
/** Escapa valor para uso dentro de atributo entre aspas duplas. */
|
|
665
|
-
function escapeAttr(value) {
|
|
666
|
-
return value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
667
|
-
}
|
|
668
|
-
/**
|
|
669
|
-
* Escapa texto preservando entidades já válidas (evita exibir `&`
|
|
670
|
-
* literalmente quando a tradução usa `&` de propósito).
|
|
671
|
-
*/
|
|
672
|
-
function escapeText(text) {
|
|
673
|
-
return text.replace(/&(?![a-zA-Z][a-zA-Z0-9]{1,30};|#[0-9]{1,7};|#[xX][0-9a-fA-F]{1,6};)|[<>]/g, (m) => m === "&" ? "&" : m === "<" ? "<" : ">");
|
|
674
|
-
}
|
|
675
|
-
/**
|
|
676
|
-
* Valida URL decodificando entidades e removendo tab/newline (mesmo tratamento
|
|
677
|
-
* do parser de URL do navegador) antes de inspecionar o esquema.
|
|
678
|
-
*/
|
|
679
|
-
function isSafeUrl(raw, allowedSchemes) {
|
|
680
|
-
const decoded = decodeEntities(raw).replace(/[\t\n\r]/g, "").trim();
|
|
681
|
-
const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(decoded);
|
|
682
|
-
if (!scheme) return true;
|
|
683
|
-
return allowedSchemes.has(scheme[1].toLowerCase());
|
|
684
|
-
}
|
|
685
|
-
/** Normaliza valor de atributo: decodifica (como o navegador faria) e re-escapa. */
|
|
686
|
-
function normalizeAttrValue(raw) {
|
|
687
|
-
return escapeAttr(decodeEntities(raw));
|
|
688
|
-
}
|
|
689
|
-
/**
|
|
690
|
-
* Extrai pares nome/valor de uma tag, respeitando aspas (um `>` dentro de
|
|
691
|
-
* aspas não termina a tag) e valores não-aspados do HTML.
|
|
692
|
-
*/
|
|
693
|
-
function parseAttrs(body) {
|
|
694
|
-
const pairs = [];
|
|
695
|
-
const n = body.length;
|
|
696
|
-
let i = 0;
|
|
697
|
-
const isWs = (c) => c === " " || c === " " || c === "\n" || c === "\r" || c === "\f";
|
|
698
|
-
while (i < n) {
|
|
699
|
-
while (i < n && (isWs(body.charAt(i)) || body.charAt(i) === "/")) i++;
|
|
700
|
-
if (i >= n) break;
|
|
701
|
-
let name = "";
|
|
702
|
-
while (i < n && !isWs(body.charAt(i)) && body.charAt(i) !== "=" && body.charAt(i) !== ">" && body.charAt(i) !== "/" && body.charAt(i) !== "<") {
|
|
703
|
-
name += body.charAt(i);
|
|
704
|
-
i++;
|
|
705
|
-
}
|
|
706
|
-
if (!name) {
|
|
707
|
-
i++;
|
|
708
|
-
continue;
|
|
709
|
-
}
|
|
710
|
-
let value = "";
|
|
711
|
-
let j = i;
|
|
712
|
-
while (j < n && isWs(body.charAt(j))) j++;
|
|
713
|
-
if (j < n && body.charAt(j) === "=") {
|
|
714
|
-
j++;
|
|
715
|
-
while (j < n && isWs(body.charAt(j))) j++;
|
|
716
|
-
if (j < n && (body.charAt(j) === "\"" || body.charAt(j) === "'")) {
|
|
717
|
-
const quote = body.charAt(j);
|
|
718
|
-
j++;
|
|
719
|
-
const start = j;
|
|
720
|
-
while (j < n && body.charAt(j) !== quote) j++;
|
|
721
|
-
value = body.slice(start, j);
|
|
722
|
-
j++;
|
|
723
|
-
} else {
|
|
724
|
-
const start = j;
|
|
725
|
-
while (j < n && !isWs(body.charAt(j)) && body.charAt(j) !== ">") j++;
|
|
726
|
-
value = body.slice(start, j);
|
|
727
|
-
}
|
|
728
|
-
i = j;
|
|
729
|
-
}
|
|
730
|
-
pairs.push([name.toLowerCase(), value]);
|
|
731
|
-
}
|
|
732
|
-
return pairs;
|
|
733
|
-
}
|
|
734
|
-
/** Filtra atributos: allowlist + validação de protocolo; força rel seguro. */
|
|
735
|
-
function filterAttrs(tag, pairs) {
|
|
736
|
-
const kept = [];
|
|
737
|
-
const seen = /* @__PURE__ */ new Set();
|
|
738
|
-
let targetBlank = false;
|
|
739
|
-
for (const [name, raw] of pairs) {
|
|
740
|
-
if (!ALLOWED_ATTRS.has(name) || seen.has(name)) continue;
|
|
741
|
-
if (name === "href" && !isSafeUrl(raw, HREF_SCHEMES)) continue;
|
|
742
|
-
if (name === "src" && !isSafeUrl(raw, SRC_SCHEMES)) continue;
|
|
743
|
-
if (name === "target") {
|
|
744
|
-
if (normalizeAttrValue(raw) !== "_blank") continue;
|
|
745
|
-
targetBlank = true;
|
|
746
|
-
continue;
|
|
747
|
-
}
|
|
748
|
-
if (name === "rel") continue;
|
|
749
|
-
seen.add(name);
|
|
750
|
-
kept.push(`${name}="${normalizeAttrValue(raw)}"`);
|
|
751
|
-
}
|
|
752
|
-
if (tag === "a" && targetBlank) {
|
|
753
|
-
kept.push("target=\"_blank\"");
|
|
754
|
-
kept.push("rel=\"noopener noreferrer\"");
|
|
755
|
-
}
|
|
756
|
-
return kept.length > 0 ? ` ${kept.join(" ")}` : "";
|
|
757
|
-
}
|
|
758
|
-
/**
|
|
759
|
-
* Sanitiza uma string de HTML. Retorna apenas marcação da allowlist.
|
|
760
|
-
* Idempotente e sem dependências de DOM (seguro no SSR e no cliente).
|
|
761
|
-
*/
|
|
762
|
-
function sanitizeHtml(input) {
|
|
763
|
-
if (typeof input !== "string" || input.length === 0) return "";
|
|
764
|
-
const lower = input.toLowerCase();
|
|
765
|
-
const n = input.length;
|
|
766
|
-
const stack = [];
|
|
767
|
-
let out = "";
|
|
768
|
-
let i = 0;
|
|
769
|
-
while (i < n) {
|
|
770
|
-
const lt = input.indexOf("<", i);
|
|
771
|
-
if (lt === -1) {
|
|
772
|
-
out += escapeText(input.slice(i));
|
|
773
|
-
break;
|
|
774
|
-
}
|
|
775
|
-
if (lt > i) out += escapeText(input.slice(i, lt));
|
|
776
|
-
if (input.startsWith("<!--", lt)) {
|
|
777
|
-
const end = input.indexOf("-->", lt + 4);
|
|
778
|
-
i = end === -1 ? n : end + 3;
|
|
779
|
-
continue;
|
|
780
|
-
}
|
|
781
|
-
if (input.charAt(lt + 1) === "!" || input.charAt(lt + 1) === "?") {
|
|
782
|
-
const end = input.indexOf(">", lt + 2);
|
|
783
|
-
i = end === -1 ? n : end + 1;
|
|
784
|
-
continue;
|
|
785
|
-
}
|
|
786
|
-
const tagMatch = /^<(\/?)([a-zA-Z][a-zA-Z0-9]*)(?=[\s/>])/.exec(input.slice(lt, Math.min(lt + 64, n)));
|
|
787
|
-
if (!tagMatch) {
|
|
788
|
-
out += "<";
|
|
789
|
-
i = lt + 1;
|
|
790
|
-
continue;
|
|
791
|
-
}
|
|
792
|
-
const isClosing = tagMatch[1] === "/";
|
|
793
|
-
const tag = tagMatch[2].toLowerCase();
|
|
794
|
-
let j = lt + tagMatch[0].length;
|
|
795
|
-
let quote = "";
|
|
796
|
-
while (j < n) {
|
|
797
|
-
const ch = input[j];
|
|
798
|
-
if (quote) {
|
|
799
|
-
if (ch === quote) quote = "";
|
|
800
|
-
} else if (ch === "\"" || ch === "'") quote = ch;
|
|
801
|
-
else if (ch === ">") break;
|
|
802
|
-
j++;
|
|
803
|
-
}
|
|
804
|
-
if (j >= n) break;
|
|
805
|
-
const body = input.slice(lt + tagMatch[0].length, j);
|
|
806
|
-
i = j + 1;
|
|
807
|
-
if (!isClosing && RAW_TEXT_TAGS.has(tag)) {
|
|
808
|
-
const closeAt = lower.indexOf(`</${tag}`, i);
|
|
809
|
-
if (closeAt === -1) break;
|
|
810
|
-
const closeEnd = input.indexOf(">", closeAt);
|
|
811
|
-
i = closeEnd === -1 ? n : closeEnd + 1;
|
|
812
|
-
continue;
|
|
813
|
-
}
|
|
814
|
-
if (isClosing) {
|
|
815
|
-
const anchor = stack.lastIndexOf(tag);
|
|
816
|
-
if (anchor !== -1) {
|
|
817
|
-
for (let k = stack.length - 1; k >= anchor; k--) out += `</${stack[k]}>`;
|
|
818
|
-
stack.length = anchor;
|
|
819
|
-
}
|
|
820
|
-
continue;
|
|
821
|
-
}
|
|
822
|
-
if (!ALLOWED_TAGS.has(tag)) continue;
|
|
823
|
-
const attrs = filterAttrs(tag, parseAttrs(body));
|
|
824
|
-
if (VOID_TAGS.has(tag)) out += `<${tag}${attrs} />`;
|
|
825
|
-
else {
|
|
826
|
-
out += `<${tag}${attrs}>`;
|
|
827
|
-
stack.push(tag);
|
|
828
|
-
}
|
|
829
|
-
}
|
|
830
|
-
for (let k = stack.length - 1; k >= 0; k--) out += `</${stack[k]}>`;
|
|
831
|
-
return out;
|
|
832
|
-
}
|
|
833
|
-
//#endregion
|
|
834
528
|
//#region src/components/content/RelationshipPicker.jsx
|
|
835
|
-
var _tmpl$$
|
|
529
|
+
var _tmpl$$2 = [
|
|
836
530
|
"<ul",
|
|
837
531
|
" class=\"relationship-picker__selection\">",
|
|
838
532
|
"</ul>"
|
|
839
533
|
];
|
|
840
|
-
var _tmpl$2$
|
|
841
|
-
var _tmpl$3$
|
|
842
|
-
var _tmpl$4$
|
|
534
|
+
var _tmpl$2$2 = ["<li", " class=\"relationship-picker__empty\">Buscando...</li>"];
|
|
535
|
+
var _tmpl$3$2 = ["<li", " class=\"relationship-picker__empty\">Nenhum resultado</li>"];
|
|
536
|
+
var _tmpl$4$2 = [
|
|
843
537
|
"<ul",
|
|
844
538
|
" class=\"relationship-picker__results\"><!--$-->",
|
|
845
539
|
"<!--/--><!--$-->",
|
|
846
540
|
"<!--/--><!--$-->",
|
|
847
541
|
"<!--/--></ul>"
|
|
848
542
|
];
|
|
849
|
-
var _tmpl$5$
|
|
543
|
+
var _tmpl$5$2 = [
|
|
850
544
|
"<div",
|
|
851
545
|
" class=\"relationship-picker\"><!--$-->",
|
|
852
546
|
"<!--/--><input type=\"search\" class=\"input\"",
|
|
853
547
|
"><!--$-->",
|
|
854
548
|
"<!--/--></div>"
|
|
855
549
|
];
|
|
856
|
-
var _tmpl$6$
|
|
550
|
+
var _tmpl$6$2 = [
|
|
857
551
|
"<li",
|
|
858
552
|
"><!--$-->",
|
|
859
553
|
"<!--/--><button type=\"button\" aria-label=\"Remover\">×</button></li>"
|
|
860
554
|
];
|
|
861
|
-
var _tmpl$7$
|
|
555
|
+
var _tmpl$7$2 = [
|
|
862
556
|
"<li",
|
|
863
557
|
"><button type=\"button\"><!--$-->",
|
|
864
558
|
"<!--/--><span class=\"relationship-picker__type\">",
|
|
@@ -875,16 +569,16 @@ function RelationshipPicker(props) {
|
|
|
875
569
|
if (Array.isArray(value)) return value.map(String);
|
|
876
570
|
return value ? [String(value)] : [];
|
|
877
571
|
});
|
|
878
|
-
return ssr(_tmpl$5$
|
|
572
|
+
return ssr(_tmpl$5$2, ssrHydrationKey(), escape(createComponent(Show2, {
|
|
879
573
|
get when() {
|
|
880
574
|
return selected().length > 0 || selectedIds().length > 0;
|
|
881
575
|
},
|
|
882
576
|
get children() {
|
|
883
|
-
return ssr(_tmpl$$
|
|
577
|
+
return ssr(_tmpl$$2, ssrHydrationKey(), escape(createComponent(For2, {
|
|
884
578
|
get each() {
|
|
885
579
|
return selected();
|
|
886
580
|
},
|
|
887
|
-
children: (entry) => ssr(_tmpl$6$
|
|
581
|
+
children: (entry) => ssr(_tmpl$6$2, ssrHydrationKey(), escape(entry.title))
|
|
888
582
|
})));
|
|
889
583
|
}
|
|
890
584
|
})), ssrAttribute("placeholder", escape(props.placeholder ?? "Buscar conteúdo...", true), false) + ssrAttribute("value", escape(query(), true), false), escape(createComponent(Show2, {
|
|
@@ -892,24 +586,24 @@ function RelationshipPicker(props) {
|
|
|
892
586
|
return memo(() => !!open())() && (loading() || results().length > 0);
|
|
893
587
|
},
|
|
894
588
|
get children() {
|
|
895
|
-
return ssr(_tmpl$4$
|
|
589
|
+
return ssr(_tmpl$4$2, ssrHydrationKey(), escape(createComponent(Show2, {
|
|
896
590
|
get when() {
|
|
897
591
|
return loading();
|
|
898
592
|
},
|
|
899
593
|
get children() {
|
|
900
|
-
return ssr(_tmpl$2$
|
|
594
|
+
return ssr(_tmpl$2$2, ssrHydrationKey());
|
|
901
595
|
}
|
|
902
596
|
})), escape(createComponent(For2, {
|
|
903
597
|
get each() {
|
|
904
598
|
return results();
|
|
905
599
|
},
|
|
906
|
-
children: (option) => ssr(_tmpl$7$
|
|
600
|
+
children: (option) => ssr(_tmpl$7$2, ssrHydrationKey(), escape(option.title), escape(option.type))
|
|
907
601
|
})), escape(createComponent(Show2, {
|
|
908
602
|
get when() {
|
|
909
603
|
return memo(() => !!!loading())() && results().length === 0;
|
|
910
604
|
},
|
|
911
605
|
get children() {
|
|
912
|
-
return ssr(_tmpl$3$
|
|
606
|
+
return ssr(_tmpl$3$2, ssrHydrationKey());
|
|
913
607
|
}
|
|
914
608
|
})));
|
|
915
609
|
}
|
|
@@ -917,36 +611,36 @@ function RelationshipPicker(props) {
|
|
|
917
611
|
}
|
|
918
612
|
//#endregion
|
|
919
613
|
//#region src/content/PluginFieldRenderer.jsx
|
|
920
|
-
var _tmpl$$
|
|
921
|
-
var _tmpl$2$
|
|
614
|
+
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>"];
|
|
615
|
+
var _tmpl$2$1 = [
|
|
922
616
|
"<div",
|
|
923
617
|
" class=\"fb-renderer-error\"><i data-lucide=\"alert-circle\" aria-hidden=\"true\"></i><span>",
|
|
924
618
|
"</span></div>"
|
|
925
619
|
];
|
|
926
|
-
var _tmpl$3$
|
|
620
|
+
var _tmpl$3$1 = [
|
|
927
621
|
"<div",
|
|
928
622
|
" class=\"fb-plugin-field-renderer fb-plugin-field-renderer--fallback\"><!--$-->",
|
|
929
623
|
"<!--/--><!--$-->",
|
|
930
624
|
"<!--/--></div>"
|
|
931
625
|
];
|
|
932
|
-
var _tmpl$4$
|
|
626
|
+
var _tmpl$4$1 = [
|
|
933
627
|
"<div",
|
|
934
628
|
" class=\"fb-plugin-field-renderer\">",
|
|
935
629
|
"</div>"
|
|
936
630
|
];
|
|
937
|
-
var _tmpl$5$
|
|
631
|
+
var _tmpl$5$1 = [
|
|
938
632
|
"<textarea",
|
|
939
633
|
" class=\"input fb-plugin-fallback-textarea\"",
|
|
940
634
|
"",
|
|
941
635
|
" spellcheck=\"false\"></textarea>"
|
|
942
636
|
];
|
|
943
|
-
var _tmpl$6$
|
|
637
|
+
var _tmpl$6$1 = [
|
|
944
638
|
"<input",
|
|
945
639
|
" type=\"number\" class=\"input\"",
|
|
946
640
|
"",
|
|
947
641
|
">"
|
|
948
642
|
];
|
|
949
|
-
var _tmpl$7$
|
|
643
|
+
var _tmpl$7$1 = [
|
|
950
644
|
"<input",
|
|
951
645
|
" type=\"text\" class=\"input\"",
|
|
952
646
|
"",
|
|
@@ -977,13 +671,13 @@ function PluginFieldRenderer(props) {
|
|
|
977
671
|
const handleValueChange = (newValue) => {
|
|
978
672
|
props.onChange(newValue);
|
|
979
673
|
};
|
|
980
|
-
if (loading) return ssr(_tmpl$$
|
|
981
|
-
if (error || !Component) return ssr(_tmpl$3$
|
|
674
|
+
if (loading) return ssr(_tmpl$$1, ssrHydrationKey());
|
|
675
|
+
if (error || !Component) return ssr(_tmpl$3$1, ssrHydrationKey(), escape(createComponent(Show, {
|
|
982
676
|
get when() {
|
|
983
677
|
return error();
|
|
984
678
|
},
|
|
985
679
|
get children() {
|
|
986
|
-
return ssr(_tmpl$2$
|
|
680
|
+
return ssr(_tmpl$2$1, ssrHydrationKey(), escape(error()));
|
|
987
681
|
}
|
|
988
682
|
})), escape(createComponent(FallbackRenderer, {
|
|
989
683
|
get field() {
|
|
@@ -1000,7 +694,7 @@ function PluginFieldRenderer(props) {
|
|
|
1000
694
|
return props.t;
|
|
1001
695
|
}
|
|
1002
696
|
})));
|
|
1003
|
-
return ssr(_tmpl$4$
|
|
697
|
+
return ssr(_tmpl$4$1, ssrHydrationKey(), escape(createComponent(Component, {
|
|
1004
698
|
get field() {
|
|
1005
699
|
return props.field;
|
|
1006
700
|
},
|
|
@@ -1021,24 +715,24 @@ function FallbackRenderer(props) {
|
|
|
1021
715
|
const inputType = field.config?.inputType || "textarea";
|
|
1022
716
|
const placeholder = field.config?.placeholder || "";
|
|
1023
717
|
const rows = field.config?.rows || 4;
|
|
1024
|
-
if (inputType === "textarea" || inputType === "code" || inputType === "markdown") return ssr(_tmpl$5$
|
|
1025
|
-
if (inputType === "number") return ssr(_tmpl$6$
|
|
1026
|
-
return ssr(_tmpl$7$
|
|
718
|
+
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));
|
|
719
|
+
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));
|
|
720
|
+
return ssr(_tmpl$7$1, ssrHydrationKey(), ssrAttribute("value", escape(value, true), false) + ssrAttribute("placeholder", escape(placeholder, true), false), ssrAttribute("disabled", disabled, true));
|
|
1027
721
|
}
|
|
1028
722
|
//#endregion
|
|
1029
723
|
//#region src/components/content/FieldRenderer.jsx
|
|
1030
|
-
var _tmpl
|
|
1031
|
-
var _tmpl$2
|
|
724
|
+
var _tmpl$ = ["<span", " class=\"field-renderer__required\">*</span>"];
|
|
725
|
+
var _tmpl$2 = [
|
|
1032
726
|
"<p",
|
|
1033
727
|
" class=\"field-renderer__instructions\">",
|
|
1034
728
|
"</p>"
|
|
1035
729
|
];
|
|
1036
|
-
var _tmpl$3
|
|
730
|
+
var _tmpl$3 = [
|
|
1037
731
|
"<p",
|
|
1038
732
|
" class=\"field-renderer__error\" role=\"alert\">",
|
|
1039
733
|
"</p>"
|
|
1040
734
|
];
|
|
1041
|
-
var _tmpl$4
|
|
735
|
+
var _tmpl$4 = [
|
|
1042
736
|
"<div",
|
|
1043
737
|
" class=\"field-renderer\"",
|
|
1044
738
|
"><label class=\"field-renderer__label\"><!--$-->",
|
|
@@ -1048,25 +742,25 @@ var _tmpl$4$1 = [
|
|
|
1048
742
|
"<!--/--><!--$-->",
|
|
1049
743
|
"<!--/--></div>"
|
|
1050
744
|
];
|
|
1051
|
-
var _tmpl$5
|
|
745
|
+
var _tmpl$5 = [
|
|
1052
746
|
"<input",
|
|
1053
747
|
" type=\"text\" class=\"input\"",
|
|
1054
748
|
">"
|
|
1055
749
|
];
|
|
1056
|
-
var _tmpl$6
|
|
750
|
+
var _tmpl$6 = [
|
|
1057
751
|
"<textarea",
|
|
1058
752
|
" class=\"input\"",
|
|
1059
753
|
"></textarea>"
|
|
1060
754
|
];
|
|
1061
|
-
var _tmpl$7
|
|
1062
|
-
var _tmpl$8
|
|
755
|
+
var _tmpl$7 = ["<textarea", " class=\"input wysiwyg\" rows=\"8\"></textarea>"];
|
|
756
|
+
var _tmpl$8 = [
|
|
1063
757
|
"<input",
|
|
1064
758
|
" type=\"number\" class=\"input\"",
|
|
1065
759
|
">"
|
|
1066
760
|
];
|
|
1067
|
-
var _tmpl$9
|
|
1068
|
-
var _tmpl$0
|
|
1069
|
-
var _tmpl$1
|
|
761
|
+
var _tmpl$9 = ["<input", " type=\"email\" class=\"input\">"];
|
|
762
|
+
var _tmpl$0 = ["<input", " type=\"url\" class=\"input\" placeholder=\"https://\">"];
|
|
763
|
+
var _tmpl$1 = ["<input", " type=\"password\" class=\"input\">"];
|
|
1070
764
|
var _tmpl$10 = [
|
|
1071
765
|
"<input",
|
|
1072
766
|
" type=\"checkbox\"",
|
|
@@ -1217,19 +911,19 @@ function FieldRenderer(props) {
|
|
|
1217
911
|
return memo(() => !!visible())() && !LAYOUT_ONLY.has(props.field.type);
|
|
1218
912
|
},
|
|
1219
913
|
get children() {
|
|
1220
|
-
return ssr(_tmpl$4
|
|
914
|
+
return ssr(_tmpl$4, ssrHydrationKey(), ssrAttribute("data-field-type", escape(props.field.type, true), false), escape(props.field.label), escape(createComponent(Show, {
|
|
1221
915
|
get when() {
|
|
1222
916
|
return props.field.required;
|
|
1223
917
|
},
|
|
1224
918
|
get children() {
|
|
1225
|
-
return ssr(_tmpl
|
|
919
|
+
return ssr(_tmpl$, ssrHydrationKey());
|
|
1226
920
|
}
|
|
1227
921
|
})), escape(createComponent(Show, {
|
|
1228
922
|
get when() {
|
|
1229
923
|
return props.field.instructions;
|
|
1230
924
|
},
|
|
1231
925
|
get children() {
|
|
1232
|
-
return ssr(_tmpl$2
|
|
926
|
+
return ssr(_tmpl$2, ssrHydrationKey(), escape(props.field.instructions));
|
|
1233
927
|
}
|
|
1234
928
|
})), escape(createComponent(FieldControl, {
|
|
1235
929
|
get field() {
|
|
@@ -1247,7 +941,7 @@ function FieldRenderer(props) {
|
|
|
1247
941
|
return validationError();
|
|
1248
942
|
},
|
|
1249
943
|
get children() {
|
|
1250
|
-
return ssr(_tmpl$3
|
|
944
|
+
return ssr(_tmpl$3, ssrHydrationKey(), escape(validationError()));
|
|
1251
945
|
}
|
|
1252
946
|
})));
|
|
1253
947
|
}
|
|
@@ -1256,15 +950,15 @@ function FieldRenderer(props) {
|
|
|
1256
950
|
function FieldControl(props) {
|
|
1257
951
|
const config = () => props.field.config ?? {};
|
|
1258
952
|
switch (props.field.type) {
|
|
1259
|
-
case "text": return ssr(_tmpl$5
|
|
1260
|
-
case "textarea": return ssr(_tmpl$6
|
|
1261
|
-
case "wysiwyg": return ssr(_tmpl$7
|
|
953
|
+
case "text": return ssr(_tmpl$5, ssrHydrationKey(), ssrAttribute("value", escape(props.value ?? config()["defaultValue"] ?? "", true), false) + ssrAttribute("placeholder", escape(config()["placeholder"], true), false) + ssrAttribute("maxlength", escape(config()["maxLength"] ?? config()["characterLimit"], true), false));
|
|
954
|
+
case "textarea": return ssr(_tmpl$6, ssrHydrationKey(), ssrAttribute("rows", escape(config()["rows"] ?? 4, true), false) + ssrAttribute("value", escape(props.value ?? config()["defaultValue"] ?? "", true), false) + ssrAttribute("placeholder", escape(config()["placeholder"], true), false) + ssrAttribute("maxlength", escape(config()["maxLength"] ?? config()["characterLimit"], true), false));
|
|
955
|
+
case "wysiwyg": return ssr(_tmpl$7, ssrHydrationKey());
|
|
1262
956
|
case "number":
|
|
1263
|
-
case "range": return ssr(_tmpl$8
|
|
1264
|
-
case "email": return ssr(_tmpl$9
|
|
1265
|
-
case "url": return ssr(_tmpl$0
|
|
1266
|
-
case "password": return ssr(_tmpl$1
|
|
1267
|
-
case "slug": return ssr(_tmpl$5
|
|
957
|
+
case "range": return ssr(_tmpl$8, ssrHydrationKey(), ssrAttribute("value", escape(props.value ?? config()["defaultValue"] ?? "", true), false) + ssrAttribute("min", escape(config()["min"] ?? config()["minValue"], true), false) + ssrAttribute("max", escape(config()["max"] ?? config()["maxValue"], true), false) + ssrAttribute("step", escape(config()["step"], true), false));
|
|
958
|
+
case "email": return ssr(_tmpl$9, ssrHydrationKey());
|
|
959
|
+
case "url": return ssr(_tmpl$0, ssrHydrationKey());
|
|
960
|
+
case "password": return ssr(_tmpl$1, ssrHydrationKey());
|
|
961
|
+
case "slug": return ssr(_tmpl$5, ssrHydrationKey(), ssrAttribute("value", escape(props.value ?? config()["defaultValue"] ?? "", true), false) + ssrAttribute("placeholder", escape(config()["placeholder"], true), false));
|
|
1268
962
|
case "true_false": return ssr(_tmpl$10, ssrHydrationKey(), ssrAttribute("checked", Boolean(props.value), true));
|
|
1269
963
|
case "select": return ssr(_tmpl$11, ssrHydrationKey(), ssrAttribute("multiple", config()["multiple"] === true, true), escape(createComponent(For, {
|
|
1270
964
|
get each() {
|
|
@@ -1492,259 +1186,4 @@ function RelationshipSelector(props) {
|
|
|
1492
1186
|
})));
|
|
1493
1187
|
}
|
|
1494
1188
|
//#endregion
|
|
1495
|
-
|
|
1496
|
-
var _tmpl$ = [
|
|
1497
|
-
"<div",
|
|
1498
|
-
" class=\"notice notice--success\">",
|
|
1499
|
-
"</div>"
|
|
1500
|
-
];
|
|
1501
|
-
var _tmpl$2 = [
|
|
1502
|
-
"<input",
|
|
1503
|
-
" class=\"classic-editor__title\" required",
|
|
1504
|
-
">"
|
|
1505
|
-
];
|
|
1506
|
-
var _tmpl$3 = [
|
|
1507
|
-
"<div",
|
|
1508
|
-
" class=\"classic-editor__toolbar\" role=\"toolbar\"",
|
|
1509
|
-
"><button type=\"button\"><strong>B</strong></button><button type=\"button\"><em>I</em></button><button type=\"button\"><u>U</u></button><span class=\"classic-editor__toolbar-divider\"></span><button type=\"button\">❝</button><button type=\"button\">• List</button><button type=\"button\">1. List</button><button type=\"button\">Link</button></div>"
|
|
1510
|
-
];
|
|
1511
|
-
var _tmpl$4 = [
|
|
1512
|
-
"<div",
|
|
1513
|
-
" class=\"classic-editor__body\" contenteditable=\"true\" data-classic-editor role=\"textbox\" aria-multiline=\"true\"",
|
|
1514
|
-
">",
|
|
1515
|
-
"</div>"
|
|
1516
|
-
];
|
|
1517
|
-
var _tmpl$5 = [
|
|
1518
|
-
"<label",
|
|
1519
|
-
" class=\"classic-editor__excerpt\"><span>",
|
|
1520
|
-
"</span><textarea class=\"input\" rows=\"4\"",
|
|
1521
|
-
"></textarea></label>"
|
|
1522
|
-
];
|
|
1523
|
-
var _tmpl$6 = [
|
|
1524
|
-
"<section",
|
|
1525
|
-
" class=\"card custom-fields\"><h3>",
|
|
1526
|
-
"</h3><!--$-->",
|
|
1527
|
-
"<!--/--></section>"
|
|
1528
|
-
];
|
|
1529
|
-
var _tmpl$7 = [
|
|
1530
|
-
"<section",
|
|
1531
|
-
" class=\"card classic-editor__panel\"><h3>",
|
|
1532
|
-
"</h3><input class=\"input\"",
|
|
1533
|
-
"><p class=\"muted\">",
|
|
1534
|
-
"</p></section>"
|
|
1535
|
-
];
|
|
1536
|
-
var _tmpl$8 = [
|
|
1537
|
-
"<section",
|
|
1538
|
-
" class=\"card classic-editor__panel\"><h3>",
|
|
1539
|
-
"</h3><label><!--$-->",
|
|
1540
|
-
"<!--/--><select class=\"input\"",
|
|
1541
|
-
"><option value>",
|
|
1542
|
-
"</option><!--$-->",
|
|
1543
|
-
"<!--/--></select></label></section>"
|
|
1544
|
-
];
|
|
1545
|
-
var _tmpl$9 = [
|
|
1546
|
-
"<form",
|
|
1547
|
-
" class=\"content-editor classic-editor\"><!--$-->",
|
|
1548
|
-
"<!--/--><!--$-->",
|
|
1549
|
-
"<!--/--><div class=\"classic-editor__topbar\"><div><span class=\"classic-editor__eyebrow\">",
|
|
1550
|
-
"</span><h2>",
|
|
1551
|
-
"</h2></div><div class=\"classic-editor__actions\"><a class=\"btn btn-secondary\" href=\"",
|
|
1552
|
-
"\">",
|
|
1553
|
-
"</a><button type=\"submit\" class=\"btn btn-primary\"",
|
|
1554
|
-
">",
|
|
1555
|
-
"</button></div></div><div class=\"classic-editor__columns\"><main class=\"classic-editor__main\"><section class=\"card classic-editor__canvas-card\"><!--$-->",
|
|
1556
|
-
"<!--/--><div class=\"classic-editor__permalink\"><span><!--$-->",
|
|
1557
|
-
"<!--/-->:</span><input class=\"input\"",
|
|
1558
|
-
"></div><!--$-->",
|
|
1559
|
-
"<!--/--><!--$-->",
|
|
1560
|
-
"<!--/--></section><!--$-->",
|
|
1561
|
-
"<!--/--></main><aside class=\"classic-editor__sidebar\"><section class=\"card classic-editor__panel\"><h3>",
|
|
1562
|
-
"</h3><label><!--$-->",
|
|
1563
|
-
"<!--/--><select class=\"input\"",
|
|
1564
|
-
"><option value=\"DRAFT\">",
|
|
1565
|
-
"</option><option value=\"PUBLISHED\">",
|
|
1566
|
-
"</option><option value=\"ARCHIVED\">",
|
|
1567
|
-
"</option></select></label><button type=\"submit\" class=\"btn btn-primary classic-editor__full-button\"",
|
|
1568
|
-
">",
|
|
1569
|
-
"</button></section><!--$-->",
|
|
1570
|
-
"<!--/--><!--$-->",
|
|
1571
|
-
"<!--/--></aside></div></form>"
|
|
1572
|
-
];
|
|
1573
|
-
var _tmpl$0 = [
|
|
1574
|
-
"<div",
|
|
1575
|
-
" class=\"notice notice--error\">",
|
|
1576
|
-
"</div>"
|
|
1577
|
-
];
|
|
1578
|
-
var _tmpl$1 = [
|
|
1579
|
-
"<option",
|
|
1580
|
-
">",
|
|
1581
|
-
"</option>"
|
|
1582
|
-
];
|
|
1583
|
-
function ContentEditor(props) {
|
|
1584
|
-
const { t } = useTranslation();
|
|
1585
|
-
const [types, setTypes] = createSignal([]);
|
|
1586
|
-
const [groups, setGroups] = createSignal([]);
|
|
1587
|
-
const [themes, setThemes] = createSignal([]);
|
|
1588
|
-
const [data, setData] = createSignal({});
|
|
1589
|
-
const [errors, setErrors] = createSignal([]);
|
|
1590
|
-
const [saving, setSaving] = createSignal(false);
|
|
1591
|
-
const [message, setMessage] = createSignal("");
|
|
1592
|
-
const [draft, setDraft] = createSignal({
|
|
1593
|
-
type: props.initialType || "post",
|
|
1594
|
-
title: "",
|
|
1595
|
-
status: "DRAFT"
|
|
1596
|
-
});
|
|
1597
|
-
const supports = () => new Set(types().find((type) => type.slug === draft().type)?.supports ?? ["title", "editor"]);
|
|
1598
|
-
const hasSupport = (support) => supports().has(support);
|
|
1599
|
-
const typeListFallback = (available, requested) => requested || available[0]?.slug || "post";
|
|
1600
|
-
const availableLayouts = () => {
|
|
1601
|
-
const layouts = /* @__PURE__ */ new Set();
|
|
1602
|
-
for (const theme of themes()) for (const layout of theme.manifest?.provides?.layouts ?? []) layouts.add(layout);
|
|
1603
|
-
return [...layouts].sort();
|
|
1604
|
-
};
|
|
1605
|
-
const loadGroups = async (context) => {
|
|
1606
|
-
try {
|
|
1607
|
-
const query = typeof context === "string" ? { type: context } : context;
|
|
1608
|
-
const all = await apiClient.getFieldGroups(query.type ? query : void 0);
|
|
1609
|
-
const resolved = await Promise.all(all.filter((group) => group.active).map(async (group) => {
|
|
1610
|
-
return (await apiClient.getFieldGroup(group.id)).fields ?? [];
|
|
1611
|
-
}));
|
|
1612
|
-
setGroups(expandCloneFields(resolved.flat()));
|
|
1613
|
-
} catch (err) {
|
|
1614
|
-
setErrors([err instanceof Error ? err.message : String(err)]);
|
|
1615
|
-
}
|
|
1616
|
-
};
|
|
1617
|
-
onMount(async () => {
|
|
1618
|
-
let typeList = [];
|
|
1619
|
-
try {
|
|
1620
|
-
const [typeCatalog, themeList] = await Promise.all([apiClient.getContentTypes(), apiClient.getThemes().catch(() => [])]);
|
|
1621
|
-
typeList = typeCatalog;
|
|
1622
|
-
setTypes(typeCatalog);
|
|
1623
|
-
setThemes(themeList);
|
|
1624
|
-
} catch (err) {
|
|
1625
|
-
setErrors([err instanceof Error ? err.message : String(err)]);
|
|
1626
|
-
}
|
|
1627
|
-
const editId = new URLSearchParams(window.location.search).get("id");
|
|
1628
|
-
if (editId || props.singleton) try {
|
|
1629
|
-
const existing = editId ? await apiClient.getContentById(editId) : await apiClient.getSingletonContent(draft().type);
|
|
1630
|
-
if (!existing) {
|
|
1631
|
-
await loadGroups({
|
|
1632
|
-
type: draft().type,
|
|
1633
|
-
status: draft().status
|
|
1634
|
-
});
|
|
1635
|
-
return;
|
|
1636
|
-
}
|
|
1637
|
-
const rawRow = existing;
|
|
1638
|
-
setDraft({
|
|
1639
|
-
id: existing.id,
|
|
1640
|
-
type: existing.type,
|
|
1641
|
-
title: existing.title,
|
|
1642
|
-
slug: existing.slug,
|
|
1643
|
-
excerpt: existing.excerpt,
|
|
1644
|
-
featuredImageId: rawRow["featuredImageId"] ?? rawRow["featured_image_id"],
|
|
1645
|
-
status: existing.status,
|
|
1646
|
-
layout: existing.layout
|
|
1647
|
-
});
|
|
1648
|
-
setData(existing.body ?? {});
|
|
1649
|
-
} catch (err) {
|
|
1650
|
-
setErrors([err instanceof Error ? err.message : String(err)]);
|
|
1651
|
-
}
|
|
1652
|
-
else if (!typeList.some((type) => type.slug === draft().type)) setDraft({
|
|
1653
|
-
...draft(),
|
|
1654
|
-
type: typeListFallback(typeList, props.initialType)
|
|
1655
|
-
});
|
|
1656
|
-
await loadGroups({
|
|
1657
|
-
type: draft().type,
|
|
1658
|
-
slug: draft().slug,
|
|
1659
|
-
status: draft().status
|
|
1660
|
-
});
|
|
1661
|
-
});
|
|
1662
|
-
const editorContent = () => {
|
|
1663
|
-
const value = data()["content"];
|
|
1664
|
-
return typeof value === "string" ? value : "";
|
|
1665
|
-
};
|
|
1666
|
-
return ssr(_tmpl$9, ssrHydrationKey(), escape(createComponent(Show, {
|
|
1667
|
-
get when() {
|
|
1668
|
-
return errors().length > 0;
|
|
1669
|
-
},
|
|
1670
|
-
get children() {
|
|
1671
|
-
return createComponent(For, {
|
|
1672
|
-
get each() {
|
|
1673
|
-
return errors();
|
|
1674
|
-
},
|
|
1675
|
-
children: (err) => ssr(_tmpl$0, ssrHydrationKey(), escape(err))
|
|
1676
|
-
});
|
|
1677
|
-
}
|
|
1678
|
-
})), escape(createComponent(Show, {
|
|
1679
|
-
get when() {
|
|
1680
|
-
return message();
|
|
1681
|
-
},
|
|
1682
|
-
get children() {
|
|
1683
|
-
return ssr(_tmpl$, ssrHydrationKey(), escape(message()));
|
|
1684
|
-
}
|
|
1685
|
-
})), escape(types().find((type) => type.slug === draft().type)?.singularLabel || draft().type), draft().id ? escape(t("content.editor.editing")) : escape(t("content.editor.adding")), `/content/${escape(encodeURIComponent(draft().type), true)}`, escape(t("content.editor.backToList")), ssrAttribute("disabled", saving(), true), saving() ? escape(t("content.editor.saving")) : escape(t("content.editor.save")), escape(createComponent(Show, {
|
|
1686
|
-
get when() {
|
|
1687
|
-
return hasSupport("title");
|
|
1688
|
-
},
|
|
1689
|
-
get children() {
|
|
1690
|
-
return ssr(_tmpl$2, ssrHydrationKey(), ssrAttribute("aria-label", escape(t("content.editor.title"), true), false) + ssrAttribute("placeholder", escape(t("content.editor.titlePlaceholder"), true), false) + ssrAttribute("value", escape(draft().title, true), false));
|
|
1691
|
-
}
|
|
1692
|
-
})), escape(t("content.editor.slug")), ssrAttribute("value", escape(draft().slug ?? "", true), false) + ssrAttribute("placeholder", escape(t("content.editor.slugPlaceholder"), true), false), escape(createComponent(Show, {
|
|
1693
|
-
get when() {
|
|
1694
|
-
return hasSupport("editor");
|
|
1695
|
-
},
|
|
1696
|
-
get children() {
|
|
1697
|
-
return [ssr(_tmpl$3, ssrHydrationKey(), ssrAttribute("aria-label", escape(t("content.editor.toolbar"), true), false)), ssr(_tmpl$4, ssrHydrationKey(), ssrAttribute("data-placeholder", escape(t("content.editor.bodyPlaceholder"), true), false), sanitizeHtml(editorContent()))];
|
|
1698
|
-
}
|
|
1699
|
-
})), escape(createComponent(Show, {
|
|
1700
|
-
get when() {
|
|
1701
|
-
return hasSupport("excerpt");
|
|
1702
|
-
},
|
|
1703
|
-
get children() {
|
|
1704
|
-
return ssr(_tmpl$5, ssrHydrationKey(), escape(t("content.editor.excerpt")), ssrAttribute("value", escape(draft().excerpt ?? "", true), false));
|
|
1705
|
-
}
|
|
1706
|
-
})), escape(createComponent(Show, {
|
|
1707
|
-
get when() {
|
|
1708
|
-
return groups().length > 0;
|
|
1709
|
-
},
|
|
1710
|
-
get children() {
|
|
1711
|
-
return ssr(_tmpl$6, ssrHydrationKey(), escape(t("content.editor.customFields")), escape(createComponent(For, {
|
|
1712
|
-
get each() {
|
|
1713
|
-
return groups();
|
|
1714
|
-
},
|
|
1715
|
-
children: (field) => createComponent(FieldRenderer, {
|
|
1716
|
-
field,
|
|
1717
|
-
get values() {
|
|
1718
|
-
return data();
|
|
1719
|
-
},
|
|
1720
|
-
onChange: (name, value) => setData({
|
|
1721
|
-
...data(),
|
|
1722
|
-
[name]: value
|
|
1723
|
-
}),
|
|
1724
|
-
t
|
|
1725
|
-
})
|
|
1726
|
-
})));
|
|
1727
|
-
}
|
|
1728
|
-
})), escape(t("content.editor.publishPanel")), escape(t("content.editor.status")), ssrAttribute("value", escape(draft().status, true), false), escape(t("content.editor.statusOptions.draft")), escape(t("content.editor.statusOptions.published")), escape(t("content.editor.statusOptions.archived")), ssrAttribute("disabled", saving(), true), saving() ? escape(t("content.editor.saving")) : escape(t("content.editor.save")), escape(createComponent(Show, {
|
|
1729
|
-
get when() {
|
|
1730
|
-
return hasSupport("thumbnail");
|
|
1731
|
-
},
|
|
1732
|
-
get children() {
|
|
1733
|
-
return ssr(_tmpl$7, ssrHydrationKey(), escape(t("content.editor.featuredImage")), ssrAttribute("value", escape(draft().featuredImageId ?? "", true), false) + ssrAttribute("placeholder", escape(t("content.editor.mediaIdPlaceholder"), true), false), escape(t("content.editor.featuredImageHint")));
|
|
1734
|
-
}
|
|
1735
|
-
})), escape(createComponent(Show, {
|
|
1736
|
-
get when() {
|
|
1737
|
-
return availableLayouts().length > 0;
|
|
1738
|
-
},
|
|
1739
|
-
get children() {
|
|
1740
|
-
return ssr(_tmpl$8, ssrHydrationKey(), escape(t("content.editor.pageAttributes")), escape(t("content.editor.layout")), ssrAttribute("value", escape(draft().layout ?? "", true), false), escape(t("content.editor.layoutAuto")), escape(createComponent(For, {
|
|
1741
|
-
get each() {
|
|
1742
|
-
return availableLayouts();
|
|
1743
|
-
},
|
|
1744
|
-
children: (layout) => ssr(_tmpl$1, ssrHydrationKey() + ssrAttribute("value", escape(layout, true), false), escape(layout))
|
|
1745
|
-
})));
|
|
1746
|
-
}
|
|
1747
|
-
})));
|
|
1748
|
-
}
|
|
1749
|
-
//#endregion
|
|
1750
|
-
export { ContentEditor as t };
|
|
1189
|
+
export { expandCloneFields as n, FieldRenderer as t };
|