@burdenoff/microfe-devportal 2026.626.6 → 2026.629.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/devportal/components/PageLayout.js.map +1 -1
- package/dist/devportal/pages/ApplicationDetailPage.js +100 -83
- package/dist/devportal/pages/ApplicationDetailPage.js.map +1 -1
- package/dist/devportal/pages/ApplicationVersionsPage.js +68 -22
- package/dist/devportal/pages/ApplicationVersionsPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/devportal/components/PageLayout.tsx"],"sourcesContent":["import type { FC, HTMLAttributes, ReactNode } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { AuroraBackground, PagePurpose } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"../utils/cn\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: string;\n backLink?: string;\n backLabel?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n fullWidth?: boolean;\n /**\n * Plain-language \"story\" for the page — WHAT it is for and the real use-case\n * — rendered as a calm {@link PagePurpose} under the header so every page is\n * self-explanatory for a new user. Keep it to one or two sentences.\n */\n purpose?: ReactNode;\n /** Optional \"Learn more\" link rendered at the end of the purpose line. */\n purposeLearnMoreHref?: string;\n purposeLearnMoreLabel?: string;\n /**\n * When true the page header sits over a subtle living-glass aurora backdrop\n * (Boff UI 2.0). Reserve this for the MFE's primary/overview page — one\n * aurora per MFE. The backdrop is decorative (-z-10) and never moves content.\n */\n heroBackdrop?: boolean;\n}\n\n/**\n * Standard page layout with header, optional back link, and actions\n */\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n backLink,\n backLabel,\n actions,\n children,\n className,\n fullWidth = false,\n purpose,\n purposeLearnMoreHref,\n purposeLearnMoreLabel,\n heroBackdrop = false,\n}) => {\n const { navigate, basePath } = useDevportal();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const resolvedBackLabel = backLabel ?? tr(\"devportal.back\", \"Back\");\n\n const handleBack = () => {\n if (!navigate || !backLink) return;\n\n const normalizedBasePath = basePath?.endsWith(\"/\")\n ? basePath.slice(0, -1)\n : basePath || \"\";\n const normalizedBackLink = backLink.startsWith(\"/\")\n ? backLink\n : `/${backLink}`;\n const alreadyIncludesBasePath =\n normalizedBasePath.length > 0 &&\n (normalizedBackLink === normalizedBasePath ||\n normalizedBackLink.startsWith(`${normalizedBasePath}/`));\n\n navigate(\n alreadyIncludesBasePath\n ? normalizedBackLink\n : `${normalizedBasePath}${normalizedBackLink}`,\n );\n };\n\n return (\n <div
|
|
1
|
+
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/devportal/components/PageLayout.tsx"],"sourcesContent":["import type { FC, HTMLAttributes, ReactNode } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { AuroraBackground, PagePurpose } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"../utils/cn\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: string;\n backLink?: string;\n backLabel?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n fullWidth?: boolean;\n /**\n * Plain-language \"story\" for the page — WHAT it is for and the real use-case\n * — rendered as a calm {@link PagePurpose} under the header so every page is\n * self-explanatory for a new user. Keep it to one or two sentences.\n */\n purpose?: ReactNode;\n /** Optional \"Learn more\" link rendered at the end of the purpose line. */\n purposeLearnMoreHref?: string;\n purposeLearnMoreLabel?: string;\n /**\n * When true the page header sits over a subtle living-glass aurora backdrop\n * (Boff UI 2.0). Reserve this for the MFE's primary/overview page — one\n * aurora per MFE. The backdrop is decorative (-z-10) and never moves content.\n */\n heroBackdrop?: boolean;\n}\n\n/**\n * Standard page layout with header, optional back link, and actions\n */\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n backLink,\n backLabel,\n actions,\n children,\n className,\n fullWidth = false,\n purpose,\n purposeLearnMoreHref,\n purposeLearnMoreLabel,\n heroBackdrop = false,\n}) => {\n const { navigate, basePath } = useDevportal();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const resolvedBackLabel = backLabel ?? tr(\"devportal.back\", \"Back\");\n\n const handleBack = () => {\n if (!navigate || !backLink) return;\n\n const normalizedBasePath = basePath?.endsWith(\"/\")\n ? basePath.slice(0, -1)\n : basePath || \"\";\n const normalizedBackLink = backLink.startsWith(\"/\")\n ? backLink\n : `/${backLink}`;\n const alreadyIncludesBasePath =\n normalizedBasePath.length > 0 &&\n (normalizedBackLink === normalizedBasePath ||\n normalizedBackLink.startsWith(`${normalizedBasePath}/`));\n\n navigate(\n alreadyIncludesBasePath\n ? normalizedBackLink\n : `${normalizedBasePath}${normalizedBackLink}`,\n );\n };\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-6 px-4 py-6 sm:px-6 sm:py-8 lg:px-8 lg:py-10 xl:px-12\",\n className,\n )}\n >\n {/* Header — optionally over a subtle living-glass aurora backdrop */}\n <div\n className={cn(\n \"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\",\n heroBackdrop &&\n \"relative overflow-hidden rounded-card border border-border-seam/60 px-5 py-5 sm:px-6 sm:py-6\",\n )}\n >\n {heroBackdrop && <AuroraBackground intensity=\"subtle\" />}\n <div className=\"flex flex-col gap-1\">\n {backLink && (\n <button\n onClick={handleBack}\n className=\"mb-2 flex items-center gap-1 text-sm text-text-secondary hover:text-text-primary transition-colors\"\n >\n <ArrowLeft size={16} />\n {resolvedBackLabel}\n </button>\n )}\n <h1 className=\"text-2xl font-bold tracking-tight\">{title}</h1>\n {description && <p className=\"text-text-secondary\">{description}</p>}\n {purpose && (\n <PagePurpose\n className=\"mt-1 max-w-2xl\"\n learnMoreHref={purposeLearnMoreHref}\n learnMoreLabel={purposeLearnMoreLabel}\n >\n {purpose}\n </PagePurpose>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n\n {/* Content */}\n <div className={cn(!fullWidth && \"max-w-7xl\")}>{children}</div>\n </div>\n );\n};\n\n/**\n * Section within a page\n */\nexport const PageSection: FC<\n {\n title?: string;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n } & HTMLAttributes<HTMLElement>\n> = ({ title, description, actions, children, className, ...rest }) => (\n <section className={cn(\"space-y-4\", className)} {...rest}>\n {(title || actions) && (\n <div className=\"flex items-center justify-between\">\n <div>\n {title && <h2 className=\"text-lg font-semibold\">{title}</h2>}\n {description && (\n <p className=\"text-sm text-text-secondary\">{description}</p>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )}\n {children}\n </section>\n);\n"],"mappings":";;;;;;;AAoCA,IAAa,KAAmC,EAC9C,UACA,gBACA,aACA,cACA,YACA,aACA,cACA,eAAY,IACZ,YACA,yBACA,0BACA,kBAAe,SACX;CACJ,IAAM,EAAE,aAAU,gBAAa,GAAc,EACvC,EAAE,SAAM,GAAS,EAKjB,IAAoB,OAJd,GAAa,MAA6B;EACpD,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;IAEM,kBAAkB,OAAO;AAuBnE,QACE,kBAAC,OAAD;EACE,WAAW,EACT,2EACA,EACD;YAJH,CAOE,kBAAC,OAAD;GACE,WAAW,EACT,sEACA,KACE,+FACH;aALH;IAOG,KAAgB,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA;IACxD,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,KACC,kBAAC,UAAD;OACE,eAxCa;AACvB,YAAI,CAAC,KAAY,CAAC,EAAU;QAE5B,IAAM,IAAqB,GAAU,SAAS,IAAI,GAC9C,EAAS,MAAM,GAAG,GAAG,GACrB,KAAY,IACV,IAAqB,EAAS,WAAW,IAAI,GAC/C,IACA,IAAI;AAMR,UAJE,EAAmB,SAAS,MAC3B,MAAuB,KACtB,EAAmB,WAAW,GAAG,EAAmB,GAAG,IAIrD,IACA,GAAG,IAAqB,IAC7B;;OAuBS,WAAU;iBAFZ,CAIE,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA,EACtB,EACM;;MAEX,kBAAC,MAAD;OAAI,WAAU;iBAAqC;OAAW,CAAA;MAC7D,KAAe,kBAAC,KAAD;OAAG,WAAU;iBAAuB;OAAgB,CAAA;MACnE,KACC,kBAAC,GAAD;OACE,WAAU;OACV,eAAe;OACf,gBAAgB;iBAEf;OACW,CAAA;MAEZ;;IACL,KAAW,kBAAC,OAAD;KAAK,WAAU;eAA2B;KAAc,CAAA;IAChE;MAGN,kBAAC,OAAD;GAAK,WAAW,EAAG,CAAC,KAAa,YAAY;GAAG;GAAe,CAAA,CAC3D;;GAOG,KAQR,EAAE,UAAO,gBAAa,YAAS,aAAU,cAAW,GAAG,QAC1D,kBAAC,WAAD;CAAS,WAAW,EAAG,aAAa,EAAU;CAAE,GAAI;WAApD,EACI,KAAS,MACT,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACG,KAAS,kBAAC,MAAD;GAAI,WAAU;aAAyB;GAAW,CAAA,EAC3D,KACC,kBAAC,KAAD;GAAG,WAAU;aAA+B;GAAgB,CAAA,CAE1D,EAAA,CAAA,EACL,KAAW,kBAAC,OAAD;GAAK,WAAU;aAA2B;GAAc,CAAA,CAChE;KAEP,EACO"}
|
|
@@ -48,6 +48,7 @@ function we(e) {
|
|
|
48
48
|
githubUrl: e.githubUrl || void 0,
|
|
49
49
|
pricingType: e.pricingType || void 0,
|
|
50
50
|
pricingDetails: e.pricingDetails ?? void 0,
|
|
51
|
+
manifest: e.manifest ?? void 0,
|
|
51
52
|
installCount: e.installCount,
|
|
52
53
|
activeInstallCount: e.activeInstallCount,
|
|
53
54
|
averageRating: e.averageRating ?? void 0,
|
|
@@ -427,7 +428,7 @@ var De = [
|
|
|
427
428
|
tabIndex: 0,
|
|
428
429
|
children: [
|
|
429
430
|
w === "overview" && /* @__PURE__ */ K(Pe, { app: X }),
|
|
430
|
-
w === "permissions" && /* @__PURE__ */ K(
|
|
431
|
+
w === "permissions" && /* @__PURE__ */ K(Xe, { app: X }),
|
|
431
432
|
w === "webhooks" && /* @__PURE__ */ K(je, {
|
|
432
433
|
appId: X.id,
|
|
433
434
|
onNavigate: Y
|
|
@@ -440,7 +441,7 @@ var De = [
|
|
|
440
441
|
}),
|
|
441
442
|
w === "analytics" && /* @__PURE__ */ K(Ne, { appId: X.id }),
|
|
442
443
|
w === "playground" && /* @__PURE__ */ K(Re, { app: X }),
|
|
443
|
-
w === "store-listing" && /* @__PURE__ */ K(
|
|
444
|
+
w === "store-listing" && /* @__PURE__ */ K(qe, {
|
|
444
445
|
app: X,
|
|
445
446
|
versionCount: I?.application?.versions?.totalCount ?? 0
|
|
446
447
|
})
|
|
@@ -1472,77 +1473,84 @@ var De = [
|
|
|
1472
1473
|
value: "JPY",
|
|
1473
1474
|
label: "JPY — Japanese Yen"
|
|
1474
1475
|
}
|
|
1475
|
-
], We =
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1476
|
+
], We = {
|
|
1477
|
+
NODE: [
|
|
1478
|
+
{
|
|
1479
|
+
value: "node",
|
|
1480
|
+
label: "Node"
|
|
1481
|
+
},
|
|
1482
|
+
{
|
|
1483
|
+
value: "agent",
|
|
1484
|
+
label: "Agent"
|
|
1485
|
+
},
|
|
1486
|
+
{
|
|
1487
|
+
value: "parser",
|
|
1488
|
+
label: "Parser"
|
|
1489
|
+
},
|
|
1490
|
+
{
|
|
1491
|
+
value: "datasink",
|
|
1492
|
+
label: "Data Sink"
|
|
1493
|
+
},
|
|
1494
|
+
{
|
|
1495
|
+
value: "component",
|
|
1496
|
+
label: "Component"
|
|
1497
|
+
}
|
|
1498
|
+
],
|
|
1499
|
+
WORKFLOW: [{
|
|
1489
1500
|
value: "workflow",
|
|
1490
1501
|
label: "Workflow"
|
|
1491
|
-
},
|
|
1492
|
-
{
|
|
1493
|
-
value: "botapp",
|
|
1494
|
-
label: "Bot App"
|
|
1495
|
-
},
|
|
1496
|
-
{
|
|
1497
|
-
value: "console",
|
|
1498
|
-
label: "Console"
|
|
1499
|
-
},
|
|
1500
|
-
{
|
|
1501
|
-
value: "vibemodule",
|
|
1502
|
-
label: "Vibe Module"
|
|
1503
|
-
},
|
|
1504
|
-
{
|
|
1505
|
-
value: "dashboard",
|
|
1506
|
-
label: "Dashboard"
|
|
1507
|
-
},
|
|
1508
|
-
{
|
|
1509
|
-
value: "parser",
|
|
1510
|
-
label: "Parser"
|
|
1511
|
-
},
|
|
1512
|
-
{
|
|
1513
|
-
value: "datasink",
|
|
1514
|
-
label: "Data Sink"
|
|
1515
|
-
},
|
|
1516
|
-
{
|
|
1517
|
-
value: "app",
|
|
1518
|
-
label: "App"
|
|
1519
|
-
},
|
|
1520
|
-
{
|
|
1502
|
+
}, {
|
|
1521
1503
|
value: "template",
|
|
1522
1504
|
label: "Template"
|
|
1523
|
-
},
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1505
|
+
}],
|
|
1506
|
+
APP: [
|
|
1507
|
+
{
|
|
1508
|
+
value: "app",
|
|
1509
|
+
label: "App"
|
|
1510
|
+
},
|
|
1511
|
+
{
|
|
1512
|
+
value: "integration",
|
|
1513
|
+
label: "Integration"
|
|
1514
|
+
},
|
|
1515
|
+
{
|
|
1516
|
+
value: "extension",
|
|
1517
|
+
label: "Extension"
|
|
1518
|
+
},
|
|
1519
|
+
{
|
|
1520
|
+
value: "widget",
|
|
1521
|
+
label: "Widget"
|
|
1522
|
+
},
|
|
1523
|
+
{
|
|
1524
|
+
value: "dashboard",
|
|
1525
|
+
label: "Dashboard"
|
|
1526
|
+
},
|
|
1527
|
+
{
|
|
1528
|
+
value: "console",
|
|
1529
|
+
label: "Console"
|
|
1530
|
+
},
|
|
1531
|
+
{
|
|
1532
|
+
value: "botapp",
|
|
1533
|
+
label: "Bot App"
|
|
1534
|
+
},
|
|
1535
|
+
{
|
|
1536
|
+
value: "vibemodule",
|
|
1537
|
+
label: "Vibe Module"
|
|
1538
|
+
},
|
|
1539
|
+
{
|
|
1540
|
+
value: "theme",
|
|
1541
|
+
label: "Theme"
|
|
1542
|
+
},
|
|
1543
|
+
{
|
|
1544
|
+
value: "plugin",
|
|
1545
|
+
label: "Plugin"
|
|
1546
|
+
}
|
|
1547
|
+
]
|
|
1548
|
+
}, Ge = {
|
|
1549
|
+
NODE: "node",
|
|
1550
|
+
WORKFLOW: "workflow",
|
|
1551
|
+
APP: "app"
|
|
1552
|
+
};
|
|
1553
|
+
function Ke(e) {
|
|
1546
1554
|
let t = e.manifest ?? {}, n = t.identity ?? {}, r = (t.digital ?? {}).install ?? {}, i = t.compatibility ?? {}, a = Array.isArray(t.permissions) ? t.permissions : [], o = e.pricingDetails ?? {}, s = Array.isArray(e.screenshots) ? e.screenshots.join("\n") : "";
|
|
1547
1555
|
return {
|
|
1548
1556
|
iconUrl: e.iconUrl ?? "",
|
|
@@ -1560,7 +1568,7 @@ function Ge(e) {
|
|
|
1560
1568
|
pricingType: e.pricingType ?? "",
|
|
1561
1569
|
price: typeof o.price == "number" ? String(o.price) : "",
|
|
1562
1570
|
currency: typeof o.currency == "string" ? o.currency : "",
|
|
1563
|
-
manifestItemType: typeof t.itemType == "string" ? t.itemType : "",
|
|
1571
|
+
manifestItemType: typeof t.itemType == "string" ? t.itemType : Ge[e.appType] ?? "",
|
|
1564
1572
|
manifestDisplayName: typeof n.displayName == "string" ? n.displayName : e.name ?? "",
|
|
1565
1573
|
manifestVersion: typeof n.version == "string" ? n.version : "",
|
|
1566
1574
|
manifestInstallType: typeof r.type == "string" ? r.type : "zip",
|
|
@@ -1571,15 +1579,15 @@ function Ge(e) {
|
|
|
1571
1579
|
manifestJsonContent: typeof t.jsonContent == "string" ? t.jsonContent : typeof t.content == "string" ? t.content : ""
|
|
1572
1580
|
};
|
|
1573
1581
|
}
|
|
1574
|
-
var
|
|
1582
|
+
var qe = ({ app: n, versionCount: r = 0 }) => {
|
|
1575
1583
|
let i = ye(), { workspacesGatewayUrl: a, authToken: o, workspaceId: s, getWorkspaceToken: c } = e(), { t: l } = P(), u = (e, t) => {
|
|
1576
1584
|
let n = l(e);
|
|
1577
1585
|
return n === e ? t : n;
|
|
1578
|
-
}, d = n.appType === "NODE" || n.appType === "WORKFLOW", f = n.status !== "PUBLISHED" && (!d || r > 0), [m, g] = N(() =>
|
|
1586
|
+
}, d = n.appType === "NODE" || n.appType === "WORKFLOW", f = n.status !== "PUBLISHED" && (!d || r > 0), [m, g] = N(() => Ke(n)), [v, y] = N(!1), b = ae(n);
|
|
1579
1587
|
b.current = n;
|
|
1580
1588
|
let [x] = h(), [S, { loading: ee }] = p();
|
|
1581
1589
|
ie(() => {
|
|
1582
|
-
g(
|
|
1590
|
+
g(Ke(b.current));
|
|
1583
1591
|
}, [n.id]);
|
|
1584
1592
|
let w = (e, t) => {
|
|
1585
1593
|
g((n) => ({
|
|
@@ -1722,9 +1730,9 @@ var Ke = ({ app: n, versionCount: r = 0 }) => {
|
|
|
1722
1730
|
let t = e.target.value;
|
|
1723
1731
|
w("manifestItemType", t), Ve.has(t) ? w("manifestInstallType", "json") : m.manifestInstallType === "json" && w("manifestInstallType", "zip");
|
|
1724
1732
|
},
|
|
1725
|
-
options: We,
|
|
1733
|
+
options: We[n.appType] ?? We.APP,
|
|
1726
1734
|
placeholder: u("devportal.selectItemType", "Select item type…"),
|
|
1727
|
-
hint: u("devportal.storeItemTypeHint", "
|
|
1735
|
+
hint: u("devportal.storeItemTypeHint", "Sub-category shown in the marketplace (e.g. Node vs Agent vs Parser)")
|
|
1728
1736
|
}),
|
|
1729
1737
|
/* @__PURE__ */ K(E, {
|
|
1730
1738
|
label: u("devportal.manifestDisplayName", "Display Name"),
|
|
@@ -1732,13 +1740,22 @@ var Ke = ({ app: n, versionCount: r = 0 }) => {
|
|
|
1732
1740
|
onChange: (e) => w("manifestDisplayName", e.target.value),
|
|
1733
1741
|
placeholder: "My Awesome Node"
|
|
1734
1742
|
}),
|
|
1735
|
-
V && /* @__PURE__ */ K(O, {
|
|
1736
|
-
label: u("devportal.jsonContent",
|
|
1743
|
+
V && n.appType !== "WORKFLOW" && /* @__PURE__ */ K(O, {
|
|
1744
|
+
label: u("devportal.jsonContent", "Template Definition (JSON)"),
|
|
1737
1745
|
value: m.manifestJsonContent,
|
|
1738
1746
|
onChange: (e) => w("manifestJsonContent", e.target.value),
|
|
1739
1747
|
rows: 12,
|
|
1740
1748
|
placeholder: "{\n \"nodes\": [],\n \"edges\": []\n}",
|
|
1741
1749
|
hint: u("devportal.jsonContentHint", "Paste the full JSON definition. Stored and applied directly — no zip needed.")
|
|
1750
|
+
}),
|
|
1751
|
+
V && n.appType === "WORKFLOW" && /* @__PURE__ */ q("p", {
|
|
1752
|
+
className: "text-sm text-text-secondary rounded-md bg-bg-sunken px-3 py-2",
|
|
1753
|
+
children: [
|
|
1754
|
+
"The Workflow Definition (JSON) is set per version. Go to the",
|
|
1755
|
+
" ",
|
|
1756
|
+
/* @__PURE__ */ K("strong", { children: "Versions" }),
|
|
1757
|
+
" tab to add or update it."
|
|
1758
|
+
]
|
|
1742
1759
|
})
|
|
1743
1760
|
]
|
|
1744
1761
|
})
|
|
@@ -1951,7 +1968,7 @@ var Ke = ({ app: n, versionCount: r = 0 }) => {
|
|
|
1951
1968
|
rel: "noopener noreferrer",
|
|
1952
1969
|
className: "flex items-center gap-2 text-sm text-primary hover:underline",
|
|
1953
1970
|
children: [/* @__PURE__ */ K(R, { size: 14 }), e]
|
|
1954
|
-
}),
|
|
1971
|
+
}), Je = [
|
|
1955
1972
|
{
|
|
1956
1973
|
id: "auth",
|
|
1957
1974
|
label: "Authentication",
|
|
@@ -2023,14 +2040,14 @@ var Ke = ({ app: n, versionCount: r = 0 }) => {
|
|
|
2023
2040
|
description: "Access control configuration"
|
|
2024
2041
|
}
|
|
2025
2042
|
];
|
|
2026
|
-
function
|
|
2027
|
-
let t = Object.fromEntries(
|
|
2043
|
+
function Ye(e) {
|
|
2044
|
+
let t = Object.fromEntries(Je.map((e) => [e.id, "none"]));
|
|
2028
2045
|
if (!e || !Array.isArray(e.permissions)) return t;
|
|
2029
2046
|
for (let n of e.permissions) n.resource in t && (t[n.resource] = n.level === "write" ? "write" : "read");
|
|
2030
2047
|
return t;
|
|
2031
2048
|
}
|
|
2032
|
-
var
|
|
2033
|
-
let t = e.manifest ?? {}, [n, r] = N(() =>
|
|
2049
|
+
var Xe = ({ app: e }) => {
|
|
2050
|
+
let t = e.manifest ?? {}, [n, r] = N(() => Ye(t)), [i, a] = N(!1), [o, s] = N(!1), [c] = h(), l = (e, t) => {
|
|
2034
2051
|
s(!1), r((n) => ({
|
|
2035
2052
|
...n,
|
|
2036
2053
|
[e]: t
|
|
@@ -2082,7 +2099,7 @@ var Ye = ({ app: e }) => {
|
|
|
2082
2099
|
}, e))]
|
|
2083
2100
|
}) }), /* @__PURE__ */ K("tbody", {
|
|
2084
2101
|
className: "divide-y divide-border",
|
|
2085
|
-
children:
|
|
2102
|
+
children: Je.map((e) => /* @__PURE__ */ q("tr", {
|
|
2086
2103
|
className: "hover:bg-bg-sunken/30 transition-colors",
|
|
2087
2104
|
children: [/* @__PURE__ */ q("td", {
|
|
2088
2105
|
className: "px-4 py-3",
|