@gorgo/medusa-integration 0.1.4 → 0.2.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.
@@ -121,9 +121,9 @@ const IntegrationsPage = () => {
121
121
  queryFn: () => sdk.client.fetch("/admin/integrations", { query: queryParams }),
122
122
  placeholderData: reactQuery.keepPreviousData
123
123
  });
124
- const integrations = (data == null ? void 0 : data.integrations) ?? [];
125
- const count = (data == null ? void 0 : data.count) ?? 0;
126
- const categories = (data == null ? void 0 : data.categories) ?? [];
124
+ const integrations = data?.integrations ?? [];
125
+ const count = data?.count ?? 0;
126
+ const categories = data?.categories ?? [];
127
127
  const invalidate = () => qc.invalidateQueries({ queryKey: ["integration-overview"] });
128
128
  const toggleEnabled = reactQuery.useMutation({
129
129
  mutationFn: ({ providerId, next }) => sdk.client.fetch(`/admin/integrations/${providerId}/enable`, {
@@ -134,7 +134,7 @@ const IntegrationsPage = () => {
134
134
  ui.toast.success(next ? t("integration.toast.enabled") : t("integration.toast.disabled"));
135
135
  invalidate();
136
136
  },
137
- onError: (e) => ui.toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.updateFailed"))
137
+ onError: (e) => ui.toast.error(e?.message ?? t("integration.toast.updateFailed"))
138
138
  });
139
139
  const test = reactQuery.useMutation({
140
140
  mutationFn: (providerId) => sdk.client.fetch(
@@ -145,7 +145,7 @@ const IntegrationsPage = () => {
145
145
  r.status === "passed" ? ui.toast.success(t("integration.toast.connectionOk")) : ui.toast.warning(r.message ?? r.status);
146
146
  invalidate();
147
147
  },
148
- onError: (e) => ui.toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.testFailed"))
148
+ onError: (e) => ui.toast.error(e?.message ?? t("integration.toast.testFailed"))
149
149
  });
150
150
  const remove = reactQuery.useMutation({
151
151
  mutationFn: (providerId) => sdk.client.fetch(`/admin/integrations/${providerId}`, { method: "DELETE" }),
@@ -153,7 +153,7 @@ const IntegrationsPage = () => {
153
153
  ui.toast.success(t("integration.toast.deleted"));
154
154
  invalidate();
155
155
  },
156
- onError: (e) => ui.toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.deleteFailed"))
156
+ onError: (e) => ui.toast.error(e?.message ?? t("integration.toast.deleteFailed"))
157
157
  });
158
158
  const onDelete = async (item) => {
159
159
  const confirmed = await prompt({
@@ -291,372 +291,84 @@ const IntegrationsBreadcrumb = () => {
291
291
  const handle$2 = {
292
292
  breadcrumb: () => /* @__PURE__ */ jsxRuntime.jsx(IntegrationsBreadcrumb, {})
293
293
  };
294
- function isSafeHref(raw) {
295
- try {
296
- return new URL(raw).protocol === "https:";
297
- } catch {
298
- return false;
294
+ const Dash = () => /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", className: "text-ui-fg-subtle", children: "-" });
295
+ const IntegrationFieldValue = ({
296
+ field,
297
+ value,
298
+ secretConfigured = false
299
+ }) => {
300
+ const { t } = reactI18next.useTranslation();
301
+ if (field.secret || field.control === "secret") {
302
+ return secretConfigured ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: "••••••••" }) : /* @__PURE__ */ jsxRuntime.jsx(Dash, {});
299
303
  }
300
- }
301
- const INLINE_RE = /`([^`\n]+)`|\[([^\]\n]*)\]\(([^)\s]+)\)|\*\*([^*\n]+)\*\*|\*([^*\n]+)\*|_([^_\n]+)_/;
302
- const MAX_DEPTH = 3;
303
- function parseInline(src, depth = 0) {
304
- if (!src) return [];
305
- if (depth >= MAX_DEPTH) return [{ type: "text", value: src }];
306
- const out = [];
307
- const re = new RegExp(INLINE_RE, "g");
308
- let last = 0;
309
- let m;
310
- while ((m = re.exec(src)) !== null) {
311
- const [full, code, linkText, linkHref, strong, star, underscore] = m;
312
- if (m.index > last) out.push({ type: "text", value: src.slice(last, m.index) });
313
- last = m.index + full.length;
314
- if (code !== void 0) {
315
- out.push({ type: "code", value: code });
316
- } else if (linkHref !== void 0) {
317
- const isImage = m.index > 0 && src[m.index - 1] === "!";
318
- if (!isImage && isSafeHref(linkHref)) {
319
- out.push({ type: "link", href: linkHref, children: parseInline(linkText, depth + 1) });
320
- } else {
321
- out.push({ type: "text", value: full });
322
- }
323
- } else if (strong !== void 0) {
324
- out.push({ type: "strong", children: parseInline(strong, depth + 1) });
325
- } else {
326
- out.push({ type: "em", children: parseInline(star ?? underscore, depth + 1) });
327
- }
304
+ if (field.control === "switch") {
305
+ if (value == null) return /* @__PURE__ */ jsxRuntime.jsx(Dash, {});
306
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: value ? "green" : "grey", children: value ? t("integration.status.enabled") : t("integration.status.disabled") });
328
307
  }
329
- if (last < src.length) out.push({ type: "text", value: src.slice(last) });
330
- return out;
331
- }
332
- const MD_MAX_CHARS = 8e3;
333
- const MD_MAX_BLOCKS = 200;
334
- const FENCE_RE = /^```(.*)$/;
335
- const HEADING_RE = /^(#{1,3})\s+(.*)$/;
336
- const HR_RE = /^-{3,}\s*$/;
337
- const UL_RE = /^[-*]\s+(.*)$/;
338
- const OL_RE = /^\d+\.\s+(.*)$/;
339
- function fenceLabel(info) {
340
- const first = info.trim().split(/\s+/)[0] ?? "";
341
- return first.replace(/[^a-zA-Z0-9._/-]/g, "").slice(0, 40) || null;
342
- }
343
- function parseMarkdown(src) {
344
- if (typeof src !== "string" || !src) return [];
345
- if (src.length > MD_MAX_CHARS) return [{ type: "truncated" }];
346
- const lines = src.replace(/\r\n?/g, "\n").split("\n");
347
- const blocks = [];
348
- let para = [];
349
- const flushPara = () => {
350
- if (!para.length) return;
351
- blocks.push({ type: "paragraph", children: parseInline(para.join(" ")) });
352
- para = [];
353
- };
354
- for (let i = 0; i < lines.length; i++) {
355
- const line = lines[i];
356
- const fence = FENCE_RE.exec(line);
357
- if (fence) {
358
- flushPara();
359
- const body = [];
360
- i++;
361
- while (i < lines.length && !FENCE_RE.test(lines[i])) body.push(lines[i++]);
362
- blocks.push({ type: "codeBlock", label: fenceLabel(fence[1]), value: body.join("\n") });
363
- continue;
364
- }
365
- if (!line.trim()) {
366
- flushPara();
367
- continue;
368
- }
369
- if (HR_RE.test(line)) {
370
- flushPara();
371
- blocks.push({ type: "hr" });
372
- continue;
373
- }
374
- const heading = HEADING_RE.exec(line);
375
- if (heading) {
376
- flushPara();
377
- blocks.push({
378
- type: "heading",
379
- level: heading[1].length + 1,
380
- children: parseInline(heading[2])
381
- });
382
- continue;
383
- }
384
- const ul = UL_RE.exec(line);
385
- const ol = ul ? null : OL_RE.exec(line);
386
- if (ul || ol) {
387
- flushPara();
388
- const ordered = !!ol;
389
- const itemRe = ordered ? OL_RE : UL_RE;
390
- const items = [];
391
- while (i < lines.length) {
392
- const item = itemRe.exec(lines[i]);
393
- if (!item) break;
394
- items.push(parseInline(item[1]));
395
- i++;
396
- }
397
- i--;
398
- blocks.push({ type: "list", ordered, items });
399
- continue;
308
+ if (field.control === "json") {
309
+ if (Array.isArray(value)) {
310
+ return value.length ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: t("integration.form.items", { count: value.length }) }) : /* @__PURE__ */ jsxRuntime.jsx(Dash, {});
400
311
  }
401
- para.push(line);
312
+ if (value == null) return /* @__PURE__ */ jsxRuntime.jsx(Dash, {});
313
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: t("integration.status.configured") });
402
314
  }
403
- flushPara();
404
- const weight = blocks.reduce((n, b) => n + (b.type === "list" ? b.items.length : 1), 0);
405
- return weight > MD_MAX_BLOCKS ? [{ type: "truncated" }] : blocks;
406
- }
407
- const Inline = ({ nodes }) => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: nodes.map((node, i) => {
408
- switch (node.type) {
409
- case "text":
410
- return /* @__PURE__ */ jsxRuntime.jsx("span", { children: node.value }, i);
411
- case "code":
412
- return /* @__PURE__ */ jsxRuntime.jsx("code", { className: "txt-compact-small bg-ui-bg-component rounded px-1 py-0.5", children: node.value }, i);
413
- case "strong":
414
- return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-small-plus", children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: node.children }) }, i);
415
- case "em":
416
- return /* @__PURE__ */ jsxRuntime.jsx("em", { children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: node.children }) }, i);
417
- case "link":
418
- return /* @__PURE__ */ jsxRuntime.jsx(
419
- "a",
420
- {
421
- href: node.href,
422
- target: "_blank",
423
- rel: "noopener noreferrer",
424
- className: "text-ui-fg-interactive hover:underline",
425
- children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: node.children })
426
- },
427
- i
428
- );
315
+ if (value == null || value === "") return /* @__PURE__ */ jsxRuntime.jsx(Dash, {});
316
+ if (field.control === "select") {
317
+ const labelKey = field.optionLabels?.[String(value)];
318
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "grey", children: labelKey ? t(labelKey) : String(value) });
429
319
  }
430
- }) });
431
- const Block = ({ block, truncatedLabel }) => {
432
- switch (block.type) {
433
- case "heading":
434
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: block.level === 2 ? "h2" : "h3", children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: block.children }) });
435
- case "paragraph":
436
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: block.children }) });
437
- case "list": {
438
- const List = block.ordered ? "ol" : "ul";
439
- return /* @__PURE__ */ jsxRuntime.jsx(
440
- List,
441
- {
442
- className: `text-ui-fg-subtle txt-small flex flex-col gap-y-1 pl-5 ${block.ordered ? "list-decimal" : "list-disc"}`,
443
- children: block.items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: item }) }, i))
320
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: String(value) });
321
+ };
322
+ var isCheckBoxInput = (element) => element.type === "checkbox";
323
+ var isDateObject = (value) => value instanceof Date;
324
+ var isNullOrUndefined = (value) => value == null;
325
+ const isObjectType = (value) => typeof value === "object";
326
+ var isObject = (value) => !isNullOrUndefined(value) && !Array.isArray(value) && isObjectType(value) && !isDateObject(value);
327
+ var getEventValue = (event) => isObject(event) && event.target ? isCheckBoxInput(event.target) ? event.target.checked : event.target.value : event;
328
+ var getNodeParentName = (name) => name.substring(0, name.search(/\.\d+(\.|$)/)) || name;
329
+ var isNameInFieldArray = (names, name) => names.has(getNodeParentName(name));
330
+ var isPlainObject = (tempObject) => {
331
+ const prototypeCopy = tempObject.constructor && tempObject.constructor.prototype;
332
+ return isObject(prototypeCopy) && prototypeCopy.hasOwnProperty("isPrototypeOf");
333
+ };
334
+ var isWeb = typeof window !== "undefined" && typeof window.HTMLElement !== "undefined" && typeof document !== "undefined";
335
+ function cloneObject(data) {
336
+ let copy;
337
+ const isArray = Array.isArray(data);
338
+ if (data instanceof Date) {
339
+ copy = new Date(data);
340
+ } else if (data instanceof Set) {
341
+ copy = new Set(data);
342
+ } else if (!(isWeb && (data instanceof Blob || data instanceof FileList)) && (isArray || isObject(data))) {
343
+ copy = isArray ? [] : {};
344
+ if (!isArray && !isPlainObject(data)) {
345
+ copy = data;
346
+ } else {
347
+ for (const key in data) {
348
+ if (data.hasOwnProperty(key)) {
349
+ copy[key] = cloneObject(data[key]);
444
350
  }
445
- );
351
+ }
446
352
  }
447
- case "codeBlock":
448
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-subtle flex flex-col gap-y-2 rounded-md px-3 pb-1 pt-2", children: [
449
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-x-2", children: [
450
- block.label ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", weight: "plus", className: "text-ui-fg-subtle", children: block.label }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
451
- /* @__PURE__ */ jsxRuntime.jsx(ui.Copy, { content: block.value })
452
- ] }),
453
- /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "txt-compact-small text-ui-fg-subtle overflow-x-auto whitespace-pre pb-2", children: block.value })
454
- ] });
455
- case "hr":
456
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-ui-border-base border-t" });
457
- case "truncated":
458
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-muted", children: truncatedLabel });
353
+ } else {
354
+ return data;
459
355
  }
356
+ return copy;
357
+ }
358
+ var compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];
359
+ var isUndefined = (val) => val === void 0;
360
+ var get = (object, path, defaultValue) => {
361
+ if (!path || !isObject(object)) {
362
+ return defaultValue;
363
+ }
364
+ const result = compact(path.split(/[,[\].]+?/)).reduce((result2, key) => isNullOrUndefined(result2) ? result2 : result2[key], object);
365
+ return isUndefined(result) || result === object ? isUndefined(object[path]) ? defaultValue : object[path] : result;
460
366
  };
461
- const Markdown = ({
462
- source,
463
- truncatedLabel
464
- }) => {
465
- const blocks = React.useMemo(() => parseMarkdown(source), [source]);
466
- if (!blocks.length) return null;
467
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-y-4", children: blocks.map((block, i) => /* @__PURE__ */ jsxRuntime.jsx(Block, { block, truncatedLabel }, i)) });
468
- };
469
- const PUBLISH_URL = "https://docs.gorgojs.com/medusa-modules/integration";
470
- const API_URL = "https://gorgojs.com";
471
- const iconSrc = (icon) => icon.startsWith("data:") ? icon : API_URL + icon;
472
- const InstallModal = ({
473
- item,
474
- onOpenChange
475
- }) => {
476
- var _a, _b, _c;
477
- const { t, i18n } = reactI18next.useTranslation();
478
- const lang = i18n.language.split("-")[0] === "ru" ? "ru" : "en";
479
- const source = ((_a = item == null ? void 0 : item.docsSnippet) == null ? void 0 : _a[lang]) || ((_b = item == null ? void 0 : item.docsSnippet) == null ? void 0 : _b.en) || ((_c = item == null ? void 0 : item.docsSnippet) == null ? void 0 : _c.ru) || "";
480
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer, { open: !!item, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Drawer.Content, { children: [
481
- /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
482
- item && /* @__PURE__ */ jsxRuntime.jsx(IntegrationIcon, { src: iconSrc(item.icon), alt: item.label, size: "small" }),
483
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: item == null ? void 0 : item.label })
484
- ] }) }) }),
485
- /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Body, { className: "flex flex-1 flex-col gap-y-4 overflow-auto", children: source.trim() ? /* @__PURE__ */ jsxRuntime.jsx(Markdown, { source, truncatedLabel: t("integration.browse.install_truncated") }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: t("integration.browse.install_empty") }) }),
486
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Drawer.Footer, { children: [
487
- /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: t("integration.actions.cancel") }) }),
488
- (item == null ? void 0 : item.docsUrl) && /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "primary", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: item.docsUrl, target: "_blank", rel: "noopener noreferrer", children: [
489
- t("integration.browse.install_docs"),
490
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, {})
491
- ] }) })
492
- ] })
493
- ] }) });
494
- };
495
- const BrowsePage = () => {
496
- const { t } = reactI18next.useTranslation();
497
- const navigate = reactRouterDom.useNavigate();
498
- const [activeTab, setActiveTab] = React.useState("all");
499
- const [search, setSearch] = React.useState("");
500
- const [installItem, setInstallItem] = React.useState(null);
501
- const { data, isLoading } = reactQuery.useQuery({
502
- queryKey: ["integration-catalog"],
503
- queryFn: () => sdk.client.fetch("/admin/integrations/catalog")
504
- });
505
- const items = (data == null ? void 0 : data.integrations) ?? [];
506
- const categories = React.useMemo(() => [...new Set(items.map((i) => i.category))], [items]);
507
- const q = search.trim().toLowerCase();
508
- const filtered = items.filter((i) => {
509
- if (activeTab !== "all" && i.category !== activeTab) return false;
510
- if (q && ![i.label, i.shortDescription, i.npm].some((s) => s.toLowerCase().includes(q))) return false;
511
- return true;
512
- });
513
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3", children: [
514
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
515
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between px-6 py-4", children: [
516
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
517
- /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: t("integration.browse.title") }),
518
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: t("integration.browse.subtitle") })
519
- ] }),
520
- false
521
- ] }),
522
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3 px-6 py-4", children: [
523
- /* @__PURE__ */ jsxRuntime.jsx(ui.Tabs, { value: activeTab, onValueChange: setActiveTab, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Tabs.List, { children: [
524
- /* @__PURE__ */ jsxRuntime.jsx(ui.Tabs.Trigger, { value: "all", children: t("integration.list.tabs.all") }),
525
- categories.map((c) => /* @__PURE__ */ jsxRuntime.jsx(ui.Tabs.Trigger, { value: c, children: t(`integration.categories.${c}`) }, c))
526
- ] }) }),
527
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-64", children: /* @__PURE__ */ jsxRuntime.jsx(
528
- ui.Input,
529
- {
530
- placeholder: t("integration.browse.searchPlaceholder"),
531
- value: search,
532
- onChange: (e) => setSearch(e.target.value)
533
- }
534
- ) })
535
- ] })
536
- ] }),
537
- isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntime.jsx(icons.Spinner, { className: "text-ui-fg-subtle animate-spin" }) }) : filtered.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: t("integration.list.emptyFiltered") }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4", children: filtered.map((item) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "shadow-borders-base bg-ui-bg-base flex flex-col rounded-lg", children: [
538
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col gap-y-3 p-4", children: [
539
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-x-2", children: [
540
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
541
- /* @__PURE__ */ jsxRuntime.jsx(IntegrationIcon, { src: iconSrc(item.icon), alt: item.label }),
542
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
543
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: item.label }),
544
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", leading: "compact", className: "text-ui-fg-subtle", children: t("integration.browse.by", { author: item.authorLocalized }) })
545
- ] })
546
- ] }),
547
- /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: item.installed ? "green" : "grey", children: item.installed ? t("integration.browse.installed") : t("integration.browse.notInstalled") })
548
- ] }),
549
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle line-clamp-2", children: item.shortDescription })
550
- ] }),
551
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between border-t px-4 py-3", children: [
552
- item.installed && item.provider_id ? /* @__PURE__ */ jsxRuntime.jsx(
553
- ui.Button,
554
- {
555
- size: "small",
556
- variant: "primary",
557
- onClick: () => navigate(`/settings/integrations/${item.provider_id}`),
558
- children: t("integration.browse.settings")
559
- }
560
- ) : /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { size: "small", variant: "secondary", onClick: () => setInstallItem(item), children: [
561
- /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
562
- t("integration.browse.add")
563
- ] }),
564
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: t(`integration.categories.${item.category}`) })
565
- ] })
566
- ] }, item.integrationId)) }),
567
- /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "flex items-center justify-center p-4", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: PUBLISH_URL, target: "_blank", rel: "noreferrer", className: "text-ui-fg-base txt-small", children: [
568
- t("integration.browse.learnMore"),
569
- " →"
570
- ] }) }),
571
- /* @__PURE__ */ jsxRuntime.jsx(InstallModal, { item: installItem, onOpenChange: (open) => !open && setInstallItem(null) })
572
- ] });
573
- };
574
- const BrowseBreadcrumb = () => {
575
- const { t } = reactI18next.useTranslation();
576
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: t("integration.browse.title") });
577
- };
578
- const handle$1 = {
579
- breadcrumb: () => /* @__PURE__ */ jsxRuntime.jsx(BrowseBreadcrumb, {})
580
- };
581
- const Dash = () => /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", className: "text-ui-fg-subtle", children: "-" });
582
- const IntegrationFieldValue = ({
583
- field,
584
- value,
585
- secretConfigured = false
586
- }) => {
587
- var _a;
588
- const { t } = reactI18next.useTranslation();
589
- if (field.secret || field.control === "secret") {
590
- return secretConfigured ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: "••••••••" }) : /* @__PURE__ */ jsxRuntime.jsx(Dash, {});
591
- }
592
- if (field.control === "switch") {
593
- if (value == null) return /* @__PURE__ */ jsxRuntime.jsx(Dash, {});
594
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: value ? "green" : "grey", children: value ? t("integration.status.enabled") : t("integration.status.disabled") });
595
- }
596
- if (field.control === "json") {
597
- if (Array.isArray(value)) {
598
- return value.length ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: t("integration.form.items", { count: value.length }) }) : /* @__PURE__ */ jsxRuntime.jsx(Dash, {});
599
- }
600
- if (value == null) return /* @__PURE__ */ jsxRuntime.jsx(Dash, {});
601
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: t("integration.status.configured") });
602
- }
603
- if (value == null || value === "") return /* @__PURE__ */ jsxRuntime.jsx(Dash, {});
604
- if (field.control === "select") {
605
- const labelKey = (_a = field.optionLabels) == null ? void 0 : _a[String(value)];
606
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "grey", children: labelKey ? t(labelKey) : String(value) });
607
- }
608
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: String(value) });
609
- };
610
- var isCheckBoxInput = (element) => element.type === "checkbox";
611
- var isDateObject = (value) => value instanceof Date;
612
- var isNullOrUndefined = (value) => value == null;
613
- const isObjectType = (value) => typeof value === "object";
614
- var isObject = (value) => !isNullOrUndefined(value) && !Array.isArray(value) && isObjectType(value) && !isDateObject(value);
615
- var getEventValue = (event) => isObject(event) && event.target ? isCheckBoxInput(event.target) ? event.target.checked : event.target.value : event;
616
- var getNodeParentName = (name) => name.substring(0, name.search(/\.\d+(\.|$)/)) || name;
617
- var isNameInFieldArray = (names, name) => names.has(getNodeParentName(name));
618
- var isPlainObject = (tempObject) => {
619
- const prototypeCopy = tempObject.constructor && tempObject.constructor.prototype;
620
- return isObject(prototypeCopy) && prototypeCopy.hasOwnProperty("isPrototypeOf");
621
- };
622
- var isWeb = typeof window !== "undefined" && typeof window.HTMLElement !== "undefined" && typeof document !== "undefined";
623
- function cloneObject(data) {
624
- let copy;
625
- const isArray = Array.isArray(data);
626
- if (data instanceof Date) {
627
- copy = new Date(data);
628
- } else if (data instanceof Set) {
629
- copy = new Set(data);
630
- } else if (!(isWeb && (data instanceof Blob || data instanceof FileList)) && (isArray || isObject(data))) {
631
- copy = isArray ? [] : {};
632
- if (!isArray && !isPlainObject(data)) {
633
- copy = data;
634
- } else {
635
- for (const key in data) {
636
- if (data.hasOwnProperty(key)) {
637
- copy[key] = cloneObject(data[key]);
638
- }
639
- }
640
- }
641
- } else {
642
- return data;
643
- }
644
- return copy;
645
- }
646
- var compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];
647
- var isUndefined = (val) => val === void 0;
648
- var get = (object, path, defaultValue) => {
649
- if (!path || !isObject(object)) {
650
- return defaultValue;
651
- }
652
- const result = compact(path.split(/[,[\].]+?/)).reduce((result2, key) => isNullOrUndefined(result2) ? result2 : result2[key], object);
653
- return isUndefined(result) || result === object ? isUndefined(object[path]) ? defaultValue : object[path] : result;
654
- };
655
- var isBoolean = (value) => typeof value === "boolean";
656
- const EVENTS = {
657
- BLUR: "blur",
658
- FOCUS_OUT: "focusout",
659
- CHANGE: "change"
367
+ var isBoolean = (value) => typeof value === "boolean";
368
+ const EVENTS = {
369
+ BLUR: "blur",
370
+ FOCUS_OUT: "focusout",
371
+ CHANGE: "change"
660
372
  };
661
373
  const VALIDATION_MODE = {
662
374
  onBlur: "onBlur",
@@ -2226,578 +1938,823 @@ const IntegrationField = ({
2226
1938
  rules: {
2227
1939
  required: enforceRequired ? t("integration.form.required", { field: t(field.label) }) : false
2228
1940
  },
2229
- render: ({ field: f, fieldState }) => {
2230
- var _a;
2231
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2232
- renderControl(field, f, secretConfigured, t),
2233
- ((_a = fieldState.error) == null ? void 0 : _a.message) && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-error", children: fieldState.error.message })
2234
- ] });
1941
+ render: ({ field: f, fieldState }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1942
+ renderControl(field, f, secretConfigured, t),
1943
+ fieldState.error?.message && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-error", children: fieldState.error.message })
1944
+ ] })
1945
+ }
1946
+ ),
1947
+ field.hint && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: t(field.hint) })
1948
+ ] });
1949
+ };
1950
+ function renderControl(field, f, secretConfigured, t) {
1951
+ const placeholder = field.placeholder ? t(field.placeholder) : void 0;
1952
+ const disabled = field.readonly === true;
1953
+ switch (field.control) {
1954
+ case "switch":
1955
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Switch, { checked: !!f.value, onCheckedChange: f.onChange, disabled });
1956
+ case "select": {
1957
+ const declared = field.options ?? [];
1958
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1959
+ ui.Select,
1960
+ {
1961
+ value: f.value == null ? "" : String(f.value),
1962
+ onValueChange: (next) => f.onChange(declared.find((o) => String(o) === next) ?? next),
1963
+ disabled,
1964
+ children: [
1965
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, { placeholder }) }),
1966
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Content, { children: declared.map((o) => {
1967
+ const labelKey = field.optionLabels?.[String(o)];
1968
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: String(o), children: labelKey ? t(labelKey) : String(o) }, String(o));
1969
+ }) })
1970
+ ]
1971
+ }
1972
+ );
1973
+ }
1974
+ case "number":
1975
+ return /* @__PURE__ */ jsxRuntime.jsx(
1976
+ ui.Input,
1977
+ {
1978
+ type: "number",
1979
+ placeholder,
1980
+ value: f.value ?? "",
1981
+ disabled,
1982
+ onChange: (e) => f.onChange(e.target.value === "" ? null : e.target.valueAsNumber)
1983
+ }
1984
+ );
1985
+ case "url":
1986
+ return /* @__PURE__ */ jsxRuntime.jsx(
1987
+ ui.Input,
1988
+ {
1989
+ type: "url",
1990
+ placeholder,
1991
+ value: f.value ?? "",
1992
+ disabled,
1993
+ onChange: f.onChange
1994
+ }
1995
+ );
1996
+ case "secret":
1997
+ return /* @__PURE__ */ jsxRuntime.jsx(
1998
+ ui.Input,
1999
+ {
2000
+ type: "password",
2001
+ placeholder: secretConfigured ? t("integration.form.keepSecret") : placeholder ?? "",
2002
+ value: f.value ?? "",
2003
+ disabled,
2004
+ onChange: f.onChange,
2005
+ className: !f.value ? "[&~div]:hidden" : void 0
2006
+ }
2007
+ );
2008
+ case "json":
2009
+ return /* @__PURE__ */ jsxRuntime.jsx(JsonField, { field, f });
2010
+ default:
2011
+ return /* @__PURE__ */ jsxRuntime.jsx(
2012
+ ui.Input,
2013
+ {
2014
+ placeholder,
2015
+ value: f.value ?? "",
2016
+ disabled,
2017
+ onChange: f.onChange
2235
2018
  }
2019
+ );
2020
+ }
2021
+ }
2022
+ function isFieldVisible(field, values) {
2023
+ const rule = field.visibleWhen;
2024
+ if (!rule) return true;
2025
+ return values[rule.field] === rule.equals;
2026
+ }
2027
+ function sectionDefaults(section, values) {
2028
+ const out = {};
2029
+ for (const f of section.fields) {
2030
+ if (f.secret || f.control === "secret") out[f.name] = "";
2031
+ else if (f.control === "switch") out[f.name] = values?.[f.name] ?? f.default ?? false;
2032
+ else if (f.control === "json") out[f.name] = values?.[f.name] ?? f.default;
2033
+ else out[f.name] = values?.[f.name] ?? f.default ?? "";
2034
+ }
2035
+ return out;
2036
+ }
2037
+ const EditSectionDrawer = ({
2038
+ open,
2039
+ onOpenChange,
2040
+ providerId,
2041
+ section,
2042
+ values,
2043
+ configuredSecrets = []
2044
+ }) => {
2045
+ const { t } = reactI18next.useTranslation();
2046
+ const qc = reactQuery.useQueryClient();
2047
+ const configured = new Set(configuredSecrets);
2048
+ const [defaults] = React.useState(() => sectionDefaults(section, values));
2049
+ const form = useForm({ values: defaults });
2050
+ const current = form.watch();
2051
+ const visibilityValues = { ...values, ...current };
2052
+ const save = reactQuery.useMutation({
2053
+ mutationFn: (sectionValues) => sdk.client.fetch(`/admin/integrations/${providerId}`, {
2054
+ method: "POST",
2055
+ // Only this section's values + its id — the server validates just this section and
2056
+ // merges over the rest of the stored config (keeping blank/untouched secrets).
2057
+ body: { section_id: section.id, values: sectionValues }
2058
+ }),
2059
+ onSuccess: () => {
2060
+ ui.toast.success(t("integration.toast.saved"));
2061
+ qc.invalidateQueries({ queryKey: ["integration", providerId] });
2062
+ qc.invalidateQueries({ queryKey: ["integration-overview"] });
2063
+ onOpenChange(false);
2064
+ },
2065
+ onError: (e) => ui.toast.error(e?.message ?? t("integration.toast.saveFailed"))
2066
+ });
2067
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Drawer.Content, { children: [
2068
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Title, { children: t(section.title) }) }),
2069
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Body, { className: "flex flex-1 flex-col gap-y-4 overflow-auto", children: section.fields.filter((f) => isFieldVisible(f, visibilityValues)).map((f) => /* @__PURE__ */ jsxRuntime.jsx(
2070
+ IntegrationField,
2071
+ {
2072
+ field: f,
2073
+ control: form.control,
2074
+ secretConfigured: configured.has(f.name)
2075
+ },
2076
+ f.name
2077
+ )) }),
2078
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Drawer.Footer, { children: [
2079
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", disabled: save.isPending, children: t("integration.actions.cancel") }) }),
2080
+ /* @__PURE__ */ jsxRuntime.jsx(
2081
+ ui.Button,
2082
+ {
2083
+ size: "small",
2084
+ isLoading: save.isPending,
2085
+ onClick: form.handleSubmit((v) => save.mutate(v)),
2086
+ children: t("integration.actions.save")
2087
+ }
2088
+ )
2089
+ ] })
2090
+ ] }) });
2091
+ };
2092
+ const Row = ({ label, children }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-ui-fg-subtle grid grid-cols-2 px-6 py-4", children: [
2093
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: label }),
2094
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-x-2", children })
2095
+ ] });
2096
+ const EditPage = () => {
2097
+ const { t } = reactI18next.useTranslation();
2098
+ const { provider_id } = reactRouterDom.useParams();
2099
+ const qc = reactQuery.useQueryClient();
2100
+ const navigate = reactRouterDom.useNavigate();
2101
+ const prompt = ui.usePrompt();
2102
+ const [editingSection, setEditingSection] = React.useState(null);
2103
+ const { data, isLoading } = reactQuery.useQuery({
2104
+ queryKey: ["integration", provider_id],
2105
+ queryFn: () => sdk.client.fetch(`/admin/integrations/${provider_id}`)
2106
+ });
2107
+ const descriptor = data?.descriptor;
2108
+ const record = data?.integration;
2109
+ const isConfigured = !!record;
2110
+ const isComplete = data?.is_complete ?? false;
2111
+ const invalidate = () => {
2112
+ qc.invalidateQueries({ queryKey: ["integration", provider_id] });
2113
+ qc.invalidateQueries({ queryKey: ["integration-overview"] });
2114
+ };
2115
+ const test = reactQuery.useMutation({
2116
+ mutationFn: () => sdk.client.fetch(
2117
+ `/admin/integrations/${provider_id}/test-connection`,
2118
+ { method: "POST" }
2119
+ ),
2120
+ onSuccess: (r) => {
2121
+ r.status === "passed" ? ui.toast.success(t("integration.toast.connectionOk")) : ui.toast.warning(r.message ?? r.status);
2122
+ invalidate();
2123
+ },
2124
+ onError: (e) => ui.toast.error(e?.message ?? t("integration.toast.testFailed"))
2125
+ });
2126
+ const toggleEnabled = reactQuery.useMutation({
2127
+ mutationFn: (next) => sdk.client.fetch(`/admin/integrations/${provider_id}/enable`, {
2128
+ method: "POST",
2129
+ body: { is_enabled: next }
2130
+ }),
2131
+ onSuccess: (_d, next) => {
2132
+ ui.toast.success(next ? t("integration.toast.enabled") : t("integration.toast.disabled"));
2133
+ invalidate();
2134
+ },
2135
+ onError: (e) => ui.toast.error(e?.message ?? t("integration.toast.updateFailed"))
2136
+ });
2137
+ const remove = reactQuery.useMutation({
2138
+ mutationFn: () => sdk.client.fetch(`/admin/integrations/${provider_id}`, { method: "DELETE" }),
2139
+ onSuccess: () => {
2140
+ ui.toast.success(t("integration.toast.deleted"));
2141
+ invalidate();
2142
+ navigate("/settings/integrations");
2143
+ },
2144
+ onError: (e) => ui.toast.error(e?.message ?? t("integration.toast.deleteFailed"))
2145
+ });
2146
+ const onDelete = async () => {
2147
+ const confirmed = await prompt({
2148
+ title: t("integration.delete.title"),
2149
+ description: t("integration.delete.description", {
2150
+ name: descriptor ? t(descriptor.displayName) : ""
2151
+ }),
2152
+ confirmText: t("integration.actions.delete"),
2153
+ cancelText: t("integration.actions.cancel")
2154
+ });
2155
+ if (confirmed) remove.mutate();
2156
+ };
2157
+ if (isLoading) {
2158
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "flex items-center justify-center p-8", children: /* @__PURE__ */ jsxRuntime.jsx(icons.Spinner, { className: "text-ui-fg-subtle animate-spin" }) });
2159
+ }
2160
+ if (!descriptor) {
2161
+ throw new Medusa.FetchError(
2162
+ `Integration with provider_id: ${provider_id} was not found`,
2163
+ "There is no page at this address",
2164
+ 404
2165
+ );
2166
+ }
2167
+ const version = data?.version ?? null;
2168
+ const author = data?.author ?? null;
2169
+ const authorUrl = data?.author_url ?? null;
2170
+ const lifecycle = !isConfigured ? { color: "grey", label: t("integration.status.notConfigured") } : !isComplete ? { color: "orange", label: t("integration.status.incomplete") } : record.is_enabled ? { color: "green", label: t("integration.status.enabled") } : { color: "grey", label: t("integration.status.disabled") };
2171
+ const connection = descriptor.hasTestConnection ? record?.last_test_status === "passed" ? { color: "green", label: t("integration.status.connected") } : record?.last_test_status === "failed" ? { color: "red", label: t("integration.status.connectionFailed") } : null : null;
2172
+ const editing = descriptor.sections.find((s) => s.id === editingSection) ?? null;
2173
+ const configuredSecrets = new Set(record?.configured_secrets ?? []);
2174
+ const sectionData = {
2175
+ providerId: provider_id,
2176
+ identifier: descriptor.identifier,
2177
+ values: record?.values ?? {},
2178
+ isComplete
2179
+ };
2180
+ const renderSection = (section) => /* @__PURE__ */ jsxRuntime.jsx(components.LayoutComposer.Entry, { id: section.id, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
2181
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
2182
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: t(section.title) }),
2183
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
2184
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "small", variant: "transparent", children: /* @__PURE__ */ jsxRuntime.jsx(icons.EllipsisHorizontal, {}) }) }),
2185
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Content, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Item, { className: "gap-x-2", onClick: () => setEditingSection(section.id), children: [
2186
+ /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, { className: "text-ui-fg-subtle" }),
2187
+ t("integration.actions.edit")
2188
+ ] }) })
2189
+ ] })
2190
+ ] }),
2191
+ section.fields.filter((f) => isFieldVisible(f, record?.values ?? {})).map((f) => /* @__PURE__ */ jsxRuntime.jsx(Row, { label: t(f.label), children: /* @__PURE__ */ jsxRuntime.jsx(
2192
+ IntegrationFieldValue,
2193
+ {
2194
+ field: f,
2195
+ value: record?.values?.[f.name] ?? f.default,
2196
+ secretConfigured: configuredSecrets.has(f.name)
2197
+ }
2198
+ ) }, f.name))
2199
+ ] }, section.id) });
2200
+ const mainSections = descriptor.sections.filter((s) => s.column !== "side");
2201
+ const sideSections = descriptor.sections.filter((s) => s.column === "side");
2202
+ const main = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2203
+ /* @__PURE__ */ jsxRuntime.jsx(components.LayoutComposer.Entry, { id: "main", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
2204
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3 px-6 py-4", children: [
2205
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
2206
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
2207
+ /* @__PURE__ */ jsxRuntime.jsx(IntegrationIcon, { src: descriptor.icon, alt: t(descriptor.displayName) }),
2208
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-1", children: [
2209
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
2210
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: t(descriptor.displayName) }),
2211
+ provider_id && /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "grey", children: toModuleProviderId(provider_id, descriptor.category) })
2212
+ ] }),
2213
+ version && /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "xsmall", leading: "compact", className: "text-ui-fg-subtle", children: [
2214
+ t("integration.meta.version", { version }),
2215
+ author && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2216
+ " • ",
2217
+ t("integration.meta.authorPrefix"),
2218
+ " ",
2219
+ authorUrl ? /* @__PURE__ */ jsxRuntime.jsx(
2220
+ "a",
2221
+ {
2222
+ href: authorUrl,
2223
+ target: "_blank",
2224
+ rel: "noreferrer",
2225
+ className: "text-ui-fg-interactive",
2226
+ children: author
2227
+ }
2228
+ ) : author
2229
+ ] })
2230
+ ] })
2231
+ ] })
2232
+ ] }),
2233
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
2234
+ /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: lifecycle.color, children: lifecycle.label }),
2235
+ connection && /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: connection.color, children: connection.label }),
2236
+ isConfigured && /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
2237
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "small", variant: "transparent", children: /* @__PURE__ */ jsxRuntime.jsx(icons.EllipsisHorizontal, {}) }) }),
2238
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
2239
+ descriptor.hasTestConnection && record.is_enabled && isComplete && /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Item, { disabled: test.isPending, onClick: () => test.mutate(), children: t("integration.actions.test") }),
2240
+ isConfigured && /* @__PURE__ */ jsxRuntime.jsx(
2241
+ ui.DropdownMenu.Item,
2242
+ {
2243
+ disabled: toggleEnabled.isPending,
2244
+ onClick: () => toggleEnabled.mutate(!record.is_enabled),
2245
+ children: record.is_enabled ? t("integration.actions.disable") : t("integration.actions.enable")
2246
+ }
2247
+ ),
2248
+ isConfigured && /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Separator, {}),
2249
+ isConfigured && /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Item, { className: "gap-x-2", onClick: onDelete, children: [
2250
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, { className: "text-ui-fg-subtle" }),
2251
+ t("integration.actions.delete")
2252
+ ] })
2253
+ ] })
2254
+ ] })
2255
+ ] })
2256
+ ] }),
2257
+ descriptor.description && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: t(descriptor.description) })
2258
+ ] }),
2259
+ /* @__PURE__ */ jsxRuntime.jsx(Row, { label: t("integration.labels.category"), children: /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "grey", children: t(`integration.categories.${descriptor.category}`) }) })
2260
+ ] }) }),
2261
+ mainSections.map(renderSection),
2262
+ editing && /* @__PURE__ */ jsxRuntime.jsx(
2263
+ EditSectionDrawer,
2264
+ {
2265
+ open: true,
2266
+ onOpenChange: (open) => !open && setEditingSection(null),
2267
+ providerId: provider_id,
2268
+ section: editing,
2269
+ values: record?.values ?? {},
2270
+ configuredSecrets: record?.configured_secrets ?? []
2271
+ },
2272
+ editing.id
2273
+ )
2274
+ ] });
2275
+ const side = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: sideSections.map(renderSection) });
2276
+ return /* @__PURE__ */ jsxRuntime.jsx(
2277
+ components.LayoutComposer,
2278
+ {
2279
+ widgetsZonePrefix: `gorgo.integration.${descriptor.identifier}`,
2280
+ preferredLayoutId: descriptor.preferredLayoutId,
2281
+ sections: { main, side },
2282
+ data: sectionData,
2283
+ hasOutlet: false
2284
+ }
2285
+ );
2286
+ };
2287
+ const IntegrationBreadcrumb = ({ params }) => {
2288
+ const { t } = reactI18next.useTranslation();
2289
+ const providerId = params.provider_id;
2290
+ const { data } = reactQuery.useQuery({
2291
+ queryKey: ["integration", providerId],
2292
+ queryFn: () => sdk.client.fetch(`/admin/integrations/${providerId}`),
2293
+ enabled: !!providerId
2294
+ });
2295
+ const descriptor = data?.descriptor;
2296
+ if (!descriptor) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
2297
+ const name = t(descriptor.displayName);
2298
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2299
+ name + " ",
2300
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "grey", children: providerId })
2301
+ ] });
2302
+ };
2303
+ const handle$1 = {
2304
+ breadcrumb: ({ params }) => /* @__PURE__ */ jsxRuntime.jsx(IntegrationBreadcrumb, { params })
2305
+ };
2306
+ function isSafeHref(raw) {
2307
+ try {
2308
+ return new URL(raw).protocol === "https:";
2309
+ } catch {
2310
+ return false;
2311
+ }
2312
+ }
2313
+ const INLINE_RE = /`([^`\n]+)`|\[([^\]\n]*)\]\(([^)\s]+)\)|\*\*([^*\n]+)\*\*|\*([^*\n]+)\*|_([^_\n]+)_/;
2314
+ const MAX_DEPTH = 3;
2315
+ function parseInline(src, depth = 0) {
2316
+ if (!src) return [];
2317
+ if (depth >= MAX_DEPTH) return [{ type: "text", value: src }];
2318
+ const out = [];
2319
+ const re = new RegExp(INLINE_RE, "g");
2320
+ let last = 0;
2321
+ let m;
2322
+ while ((m = re.exec(src)) !== null) {
2323
+ const [full, code, linkText, linkHref, strong, star, underscore] = m;
2324
+ if (m.index > last) out.push({ type: "text", value: src.slice(last, m.index) });
2325
+ last = m.index + full.length;
2326
+ if (code !== void 0) {
2327
+ out.push({ type: "code", value: code });
2328
+ } else if (linkHref !== void 0) {
2329
+ const isImage = m.index > 0 && src[m.index - 1] === "!";
2330
+ if (!isImage && isSafeHref(linkHref)) {
2331
+ out.push({ type: "link", href: linkHref, children: parseInline(linkText, depth + 1) });
2332
+ } else {
2333
+ out.push({ type: "text", value: full });
2334
+ }
2335
+ } else if (strong !== void 0) {
2336
+ out.push({ type: "strong", children: parseInline(strong, depth + 1) });
2337
+ } else {
2338
+ out.push({ type: "em", children: parseInline(star ?? underscore, depth + 1) });
2339
+ }
2340
+ }
2341
+ if (last < src.length) out.push({ type: "text", value: src.slice(last) });
2342
+ return out;
2343
+ }
2344
+ const MD_MAX_CHARS = 8e3;
2345
+ const MD_MAX_BLOCKS = 200;
2346
+ const FENCE_RE = /^```(.*)$/;
2347
+ const HEADING_RE = /^(#{1,3})\s+(.*)$/;
2348
+ const HR_RE = /^-{3,}\s*$/;
2349
+ const UL_RE = /^[-*]\s+(.*)$/;
2350
+ const OL_RE = /^\d+\.\s+(.*)$/;
2351
+ function fenceLabel(info) {
2352
+ const first = info.trim().split(/\s+/)[0] ?? "";
2353
+ return first.replace(/[^a-zA-Z0-9._/-]/g, "").slice(0, 40) || null;
2354
+ }
2355
+ function parseMarkdown(src) {
2356
+ if (typeof src !== "string" || !src) return [];
2357
+ if (src.length > MD_MAX_CHARS) return [{ type: "truncated" }];
2358
+ const lines = src.replace(/\r\n?/g, "\n").split("\n");
2359
+ const blocks = [];
2360
+ let para = [];
2361
+ const flushPara = () => {
2362
+ if (!para.length) return;
2363
+ blocks.push({ type: "paragraph", children: parseInline(para.join(" ")) });
2364
+ para = [];
2365
+ };
2366
+ for (let i = 0; i < lines.length; i++) {
2367
+ const line = lines[i];
2368
+ const fence = FENCE_RE.exec(line);
2369
+ if (fence) {
2370
+ flushPara();
2371
+ const body = [];
2372
+ i++;
2373
+ while (i < lines.length && !FENCE_RE.test(lines[i])) body.push(lines[i++]);
2374
+ blocks.push({ type: "codeBlock", label: fenceLabel(fence[1]), value: body.join("\n") });
2375
+ continue;
2376
+ }
2377
+ if (!line.trim()) {
2378
+ flushPara();
2379
+ continue;
2380
+ }
2381
+ if (HR_RE.test(line)) {
2382
+ flushPara();
2383
+ blocks.push({ type: "hr" });
2384
+ continue;
2385
+ }
2386
+ const heading = HEADING_RE.exec(line);
2387
+ if (heading) {
2388
+ flushPara();
2389
+ blocks.push({
2390
+ type: "heading",
2391
+ level: heading[1].length + 1,
2392
+ children: parseInline(heading[2])
2393
+ });
2394
+ continue;
2395
+ }
2396
+ const ul = UL_RE.exec(line);
2397
+ const ol = ul ? null : OL_RE.exec(line);
2398
+ if (ul || ol) {
2399
+ flushPara();
2400
+ const ordered = !!ol;
2401
+ const itemRe = ordered ? OL_RE : UL_RE;
2402
+ const items = [];
2403
+ while (i < lines.length) {
2404
+ const item = itemRe.exec(lines[i]);
2405
+ if (!item) break;
2406
+ items.push(parseInline(item[1]));
2407
+ i++;
2236
2408
  }
2237
- ),
2238
- field.hint && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: t(field.hint) })
2239
- ] });
2240
- };
2241
- function renderControl(field, f, secretConfigured, t) {
2242
- const placeholder = field.placeholder ? t(field.placeholder) : void 0;
2243
- const disabled = field.readonly === true;
2244
- switch (field.control) {
2245
- case "switch":
2246
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Switch, { checked: !!f.value, onCheckedChange: f.onChange, disabled });
2247
- case "select":
2248
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Select, { value: f.value ?? "", onValueChange: f.onChange, disabled, children: [
2249
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Value, { placeholder }) }),
2250
- /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Content, { children: (field.options ?? []).map((o) => {
2251
- var _a;
2252
- const labelKey = (_a = field.optionLabels) == null ? void 0 : _a[o];
2253
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Select.Item, { value: o, children: labelKey ? t(labelKey) : o }, o);
2254
- }) })
2255
- ] });
2256
- case "number":
2257
- return /* @__PURE__ */ jsxRuntime.jsx(
2258
- ui.Input,
2259
- {
2260
- type: "number",
2261
- placeholder,
2262
- value: f.value ?? "",
2263
- disabled,
2264
- onChange: (e) => f.onChange(e.target.value === "" ? null : e.target.valueAsNumber)
2265
- }
2266
- );
2267
- case "url":
2268
- return /* @__PURE__ */ jsxRuntime.jsx(
2269
- ui.Input,
2270
- {
2271
- type: "url",
2272
- placeholder,
2273
- value: f.value ?? "",
2274
- disabled,
2275
- onChange: f.onChange
2276
- }
2277
- );
2278
- case "secret":
2409
+ i--;
2410
+ blocks.push({ type: "list", ordered, items });
2411
+ continue;
2412
+ }
2413
+ para.push(line);
2414
+ }
2415
+ flushPara();
2416
+ const weight = blocks.reduce((n, b) => n + (b.type === "list" ? b.items.length : 1), 0);
2417
+ return weight > MD_MAX_BLOCKS ? [{ type: "truncated" }] : blocks;
2418
+ }
2419
+ const Inline = ({ nodes }) => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: nodes.map((node, i) => {
2420
+ switch (node.type) {
2421
+ case "text":
2422
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { children: node.value }, i);
2423
+ case "code":
2424
+ return /* @__PURE__ */ jsxRuntime.jsx("code", { className: "txt-compact-small bg-ui-bg-component rounded px-1 py-0.5", children: node.value }, i);
2425
+ case "strong":
2426
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-small-plus", children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: node.children }) }, i);
2427
+ case "em":
2428
+ return /* @__PURE__ */ jsxRuntime.jsx("em", { children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: node.children }) }, i);
2429
+ case "link":
2279
2430
  return /* @__PURE__ */ jsxRuntime.jsx(
2280
- ui.Input,
2431
+ "a",
2281
2432
  {
2282
- type: "password",
2283
- placeholder: secretConfigured ? t("integration.form.keepSecret") : placeholder ?? "",
2284
- value: f.value ?? "",
2285
- disabled,
2286
- onChange: f.onChange,
2287
- className: !f.value ? "[&~div]:hidden" : void 0
2288
- }
2433
+ href: node.href,
2434
+ target: "_blank",
2435
+ rel: "noopener noreferrer",
2436
+ className: "text-ui-fg-interactive hover:underline",
2437
+ children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: node.children })
2438
+ },
2439
+ i
2289
2440
  );
2290
- case "json":
2291
- return /* @__PURE__ */ jsxRuntime.jsx(JsonField, { field, f });
2292
- default:
2441
+ }
2442
+ }) });
2443
+ const Block = ({ block, truncatedLabel }) => {
2444
+ switch (block.type) {
2445
+ case "heading":
2446
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: block.level === 2 ? "h2" : "h3", children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: block.children }) });
2447
+ case "paragraph":
2448
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: block.children }) });
2449
+ case "list": {
2450
+ const List = block.ordered ? "ol" : "ul";
2293
2451
  return /* @__PURE__ */ jsxRuntime.jsx(
2294
- ui.Input,
2452
+ List,
2295
2453
  {
2296
- placeholder,
2297
- value: f.value ?? "",
2298
- disabled,
2299
- onChange: f.onChange
2454
+ className: `text-ui-fg-subtle txt-small flex flex-col gap-y-1 pl-5 ${block.ordered ? "list-decimal" : "list-disc"}`,
2455
+ children: block.items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { nodes: item }) }, i))
2300
2456
  }
2301
2457
  );
2458
+ }
2459
+ case "codeBlock":
2460
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-subtle flex flex-col gap-y-2 rounded-md px-3 pb-1 pt-2", children: [
2461
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-x-2", children: [
2462
+ block.label ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", weight: "plus", className: "text-ui-fg-subtle", children: block.label }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
2463
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Copy, { content: block.value })
2464
+ ] }),
2465
+ /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "txt-compact-small text-ui-fg-subtle overflow-x-auto whitespace-pre pb-2", children: block.value })
2466
+ ] });
2467
+ case "hr":
2468
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-ui-border-base border-t" });
2469
+ case "truncated":
2470
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-muted", children: truncatedLabel });
2302
2471
  }
2303
- }
2304
- function isFieldVisible(field, values) {
2305
- const rule = field.visibleWhen;
2306
- if (!rule) return true;
2307
- return values[rule.field] === rule.equals;
2308
- }
2309
- function sectionDefaults(section, values) {
2310
- const out = {};
2311
- for (const f of section.fields) {
2312
- if (f.secret || f.control === "secret") out[f.name] = "";
2313
- else if (f.control === "switch") out[f.name] = (values == null ? void 0 : values[f.name]) ?? f.default ?? false;
2314
- else if (f.control === "json") out[f.name] = (values == null ? void 0 : values[f.name]) ?? f.default;
2315
- else out[f.name] = (values == null ? void 0 : values[f.name]) ?? f.default ?? "";
2316
- }
2317
- return out;
2318
- }
2319
- const EditSectionDrawer = ({
2320
- open,
2321
- onOpenChange,
2322
- providerId,
2323
- section,
2324
- values,
2325
- configuredSecrets = []
2472
+ };
2473
+ const Markdown = ({
2474
+ source,
2475
+ truncatedLabel
2326
2476
  }) => {
2327
- const { t } = reactI18next.useTranslation();
2328
- const qc = reactQuery.useQueryClient();
2329
- const configured = new Set(configuredSecrets);
2330
- const [defaults] = React.useState(() => sectionDefaults(section, values));
2331
- const form = useForm({ values: defaults });
2332
- const current = form.watch();
2333
- const visibilityValues = { ...values, ...current };
2334
- const save = reactQuery.useMutation({
2335
- mutationFn: (sectionValues) => sdk.client.fetch(`/admin/integrations/${providerId}`, {
2336
- method: "POST",
2337
- // Only this section's values + its id — the server validates just this section and
2338
- // merges over the rest of the stored config (keeping blank/untouched secrets).
2339
- body: { section_id: section.id, values: sectionValues }
2340
- }),
2341
- onSuccess: () => {
2342
- ui.toast.success(t("integration.toast.saved"));
2343
- qc.invalidateQueries({ queryKey: ["integration", providerId] });
2344
- qc.invalidateQueries({ queryKey: ["integration-overview"] });
2345
- onOpenChange(false);
2346
- },
2347
- onError: (e) => ui.toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.saveFailed"))
2348
- });
2349
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Drawer.Content, { children: [
2350
- /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Title, { children: t(section.title) }) }),
2351
- /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Body, { className: "flex flex-1 flex-col gap-y-4 overflow-auto", children: section.fields.filter((f) => isFieldVisible(f, visibilityValues)).map((f) => /* @__PURE__ */ jsxRuntime.jsx(
2352
- IntegrationField,
2353
- {
2354
- field: f,
2355
- control: form.control,
2356
- secretConfigured: configured.has(f.name)
2357
- },
2358
- f.name
2359
- )) }),
2360
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Drawer.Footer, { children: [
2361
- /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", disabled: save.isPending, children: t("integration.actions.cancel") }) }),
2362
- /* @__PURE__ */ jsxRuntime.jsx(
2363
- ui.Button,
2364
- {
2365
- size: "small",
2366
- isLoading: save.isPending,
2367
- onClick: form.handleSubmit((v) => save.mutate(v)),
2368
- children: t("integration.actions.save")
2369
- }
2370
- )
2371
- ] })
2372
- ] }) });
2477
+ const blocks = React.useMemo(() => parseMarkdown(source), [source]);
2478
+ if (!blocks.length) return null;
2479
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-y-4", children: blocks.map((block, i) => /* @__PURE__ */ jsxRuntime.jsx(Block, { block, truncatedLabel }, i)) });
2373
2480
  };
2374
- const Row = ({ label, children }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-ui-fg-subtle grid grid-cols-2 px-6 py-4", children: [
2375
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: label }),
2376
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-x-2", children })
2377
- ] });
2378
- const EditPage = () => {
2379
- const { t } = reactI18next.useTranslation();
2380
- const { provider_id } = reactRouterDom.useParams();
2381
- const qc = reactQuery.useQueryClient();
2382
- const navigate = reactRouterDom.useNavigate();
2383
- const prompt = ui.usePrompt();
2384
- const [editingSection, setEditingSection] = React.useState(null);
2385
- const { data, isLoading } = reactQuery.useQuery({
2386
- queryKey: ["integration", provider_id],
2387
- queryFn: () => sdk.client.fetch(`/admin/integrations/${provider_id}`)
2388
- });
2389
- const descriptor = data == null ? void 0 : data.descriptor;
2390
- const record = data == null ? void 0 : data.integration;
2391
- const isConfigured = !!record;
2392
- const isComplete = (data == null ? void 0 : data.is_complete) ?? false;
2393
- const invalidate = () => {
2394
- qc.invalidateQueries({ queryKey: ["integration", provider_id] });
2395
- qc.invalidateQueries({ queryKey: ["integration-overview"] });
2396
- };
2397
- const test = reactQuery.useMutation({
2398
- mutationFn: () => sdk.client.fetch(
2399
- `/admin/integrations/${provider_id}/test-connection`,
2400
- { method: "POST" }
2401
- ),
2402
- onSuccess: (r) => {
2403
- r.status === "passed" ? ui.toast.success(t("integration.toast.connectionOk")) : ui.toast.warning(r.message ?? r.status);
2404
- invalidate();
2405
- },
2406
- onError: (e) => ui.toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.testFailed"))
2407
- });
2408
- const toggleEnabled = reactQuery.useMutation({
2409
- mutationFn: (next) => sdk.client.fetch(`/admin/integrations/${provider_id}/enable`, {
2410
- method: "POST",
2411
- body: { is_enabled: next }
2412
- }),
2413
- onSuccess: (_d, next) => {
2414
- ui.toast.success(next ? t("integration.toast.enabled") : t("integration.toast.disabled"));
2415
- invalidate();
2416
- },
2417
- onError: (e) => ui.toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.updateFailed"))
2481
+ const PUBLISH_URL = "https://docs.gorgojs.com/medusa-modules/integration";
2482
+ const API_URL = "https://gorgojs.com";
2483
+ const iconSrc = (icon) => icon.startsWith("data:") ? icon : API_URL + icon;
2484
+ const InstallModal = ({
2485
+ item,
2486
+ onOpenChange
2487
+ }) => {
2488
+ const { t, i18n } = reactI18next.useTranslation();
2489
+ const lang = i18n.language.split("-")[0] === "ru" ? "ru" : "en";
2490
+ const source = item?.docsSnippet?.[lang] || item?.docsSnippet?.en || item?.docsSnippet?.ru || "";
2491
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer, { open: !!item, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Drawer.Content, { children: [
2492
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
2493
+ item && /* @__PURE__ */ jsxRuntime.jsx(IntegrationIcon, { src: iconSrc(item.icon), alt: item.label, size: "small" }),
2494
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: item?.label })
2495
+ ] }) }) }),
2496
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Body, { className: "flex flex-1 flex-col gap-y-4 overflow-auto", children: source.trim() ? /* @__PURE__ */ jsxRuntime.jsx(Markdown, { source, truncatedLabel: t("integration.browse.install_truncated") }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: t("integration.browse.install_empty") }) }),
2497
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Drawer.Footer, { children: [
2498
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: t("integration.actions.cancel") }) }),
2499
+ item?.docsUrl && /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "primary", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: item.docsUrl, target: "_blank", rel: "noopener noreferrer", children: [
2500
+ t("integration.browse.install_docs"),
2501
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, {})
2502
+ ] }) })
2503
+ ] })
2504
+ ] }) });
2505
+ };
2506
+ const BrowsePage = () => {
2507
+ const { t } = reactI18next.useTranslation();
2508
+ const navigate = reactRouterDom.useNavigate();
2509
+ const [activeTab, setActiveTab] = React.useState("all");
2510
+ const [search, setSearch] = React.useState("");
2511
+ const [installItem, setInstallItem] = React.useState(null);
2512
+ const { data, isLoading } = reactQuery.useQuery({
2513
+ queryKey: ["integration-catalog"],
2514
+ queryFn: () => sdk.client.fetch("/admin/integrations/catalog")
2418
2515
  });
2419
- const remove = reactQuery.useMutation({
2420
- mutationFn: () => sdk.client.fetch(`/admin/integrations/${provider_id}`, { method: "DELETE" }),
2421
- onSuccess: () => {
2422
- ui.toast.success(t("integration.toast.deleted"));
2423
- invalidate();
2424
- navigate("/settings/integrations");
2425
- },
2426
- onError: (e) => ui.toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.deleteFailed"))
2516
+ const items = data?.integrations ?? [];
2517
+ const categories = React.useMemo(() => [...new Set(items.map((i) => i.category))], [items]);
2518
+ const q = search.trim().toLowerCase();
2519
+ const filtered = items.filter((i) => {
2520
+ if (activeTab !== "all" && i.category !== activeTab) return false;
2521
+ if (q && ![i.label, i.shortDescription, i.npm].some((s) => s.toLowerCase().includes(q))) return false;
2522
+ return true;
2427
2523
  });
2428
- const onDelete = async () => {
2429
- const confirmed = await prompt({
2430
- title: t("integration.delete.title"),
2431
- description: t("integration.delete.description", {
2432
- name: descriptor ? t(descriptor.displayName) : ""
2433
- }),
2434
- confirmText: t("integration.actions.delete"),
2435
- cancelText: t("integration.actions.cancel")
2436
- });
2437
- if (confirmed) remove.mutate();
2438
- };
2439
- if (isLoading) {
2440
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "flex items-center justify-center p-8", children: /* @__PURE__ */ jsxRuntime.jsx(icons.Spinner, { className: "text-ui-fg-subtle animate-spin" }) });
2441
- }
2442
- if (!descriptor) {
2443
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "p-6", children: [
2444
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: t("integration.unknown", { id: provider_id }) }),
2445
- /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Link, { to: "/settings/integrations", className: "text-ui-fg-base", children: t("integration.back") })
2446
- ] });
2447
- }
2448
- const version = (data == null ? void 0 : data.version) ?? null;
2449
- const author = (data == null ? void 0 : data.author) ?? null;
2450
- const authorUrl = (data == null ? void 0 : data.author_url) ?? null;
2451
- const lifecycle = !isConfigured ? { color: "grey", label: t("integration.status.notConfigured") } : !isComplete ? { color: "orange", label: t("integration.status.incomplete") } : record.is_enabled ? { color: "green", label: t("integration.status.enabled") } : { color: "grey", label: t("integration.status.disabled") };
2452
- const connection = descriptor.hasTestConnection ? (record == null ? void 0 : record.last_test_status) === "passed" ? { color: "green", label: t("integration.status.connected") } : (record == null ? void 0 : record.last_test_status) === "failed" ? { color: "red", label: t("integration.status.connectionFailed") } : null : null;
2453
- const editing = descriptor.sections.find((s) => s.id === editingSection) ?? null;
2454
- const configuredSecrets = new Set((record == null ? void 0 : record.configured_secrets) ?? []);
2455
- const sectionData = {
2456
- providerId: provider_id,
2457
- identifier: descriptor.identifier,
2458
- values: (record == null ? void 0 : record.values) ?? {},
2459
- isComplete
2460
- };
2461
- const renderSection = (section) => /* @__PURE__ */ jsxRuntime.jsx(components.LayoutComposer.Entry, { id: section.id, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
2462
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
2463
- /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: t(section.title) }),
2464
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
2465
- /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "small", variant: "transparent", children: /* @__PURE__ */ jsxRuntime.jsx(icons.EllipsisHorizontal, {}) }) }),
2466
- /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Content, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Item, { className: "gap-x-2", onClick: () => setEditingSection(section.id), children: [
2467
- /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, { className: "text-ui-fg-subtle" }),
2468
- t("integration.actions.edit")
2469
- ] }) })
2524
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3", children: [
2525
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
2526
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between px-6 py-4", children: [
2527
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
2528
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: t("integration.browse.title") }),
2529
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: t("integration.browse.subtitle") })
2530
+ ] }),
2531
+ false
2532
+ ] }),
2533
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3 px-6 py-4", children: [
2534
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Tabs, { value: activeTab, onValueChange: setActiveTab, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Tabs.List, { children: [
2535
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Tabs.Trigger, { value: "all", children: t("integration.list.tabs.all") }),
2536
+ categories.map((c) => /* @__PURE__ */ jsxRuntime.jsx(ui.Tabs.Trigger, { value: c, children: t(`integration.categories.${c}`) }, c))
2537
+ ] }) }),
2538
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-64", children: /* @__PURE__ */ jsxRuntime.jsx(
2539
+ ui.Input,
2540
+ {
2541
+ placeholder: t("integration.browse.searchPlaceholder"),
2542
+ value: search,
2543
+ onChange: (e) => setSearch(e.target.value)
2544
+ }
2545
+ ) })
2470
2546
  ] })
2471
2547
  ] }),
2472
- section.fields.filter((f) => isFieldVisible(f, (record == null ? void 0 : record.values) ?? {})).map((f) => {
2473
- var _a;
2474
- return /* @__PURE__ */ jsxRuntime.jsx(Row, { label: t(f.label), children: /* @__PURE__ */ jsxRuntime.jsx(
2475
- IntegrationFieldValue,
2476
- {
2477
- field: f,
2478
- value: ((_a = record == null ? void 0 : record.values) == null ? void 0 : _a[f.name]) ?? f.default,
2479
- secretConfigured: configuredSecrets.has(f.name)
2480
- }
2481
- ) }, f.name);
2482
- })
2483
- ] }, section.id) });
2484
- const mainSections = descriptor.sections.filter((s) => s.column !== "side");
2485
- const sideSections = descriptor.sections.filter((s) => s.column === "side");
2486
- const main = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2487
- /* @__PURE__ */ jsxRuntime.jsx(components.LayoutComposer.Entry, { id: "main", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
2488
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3 px-6 py-4", children: [
2489
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
2548
+ isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntime.jsx(icons.Spinner, { className: "text-ui-fg-subtle animate-spin" }) }) : filtered.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: t("integration.list.emptyFiltered") }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4", children: filtered.map((item) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "shadow-borders-base bg-ui-bg-base flex flex-col rounded-lg", children: [
2549
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col gap-y-3 p-4", children: [
2550
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-x-2", children: [
2490
2551
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
2491
- /* @__PURE__ */ jsxRuntime.jsx(IntegrationIcon, { src: descriptor.icon, alt: t(descriptor.displayName) }),
2492
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-1", children: [
2493
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
2494
- /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: t(descriptor.displayName) }),
2495
- provider_id && /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "grey", children: toModuleProviderId(provider_id, descriptor.category) })
2496
- ] }),
2497
- version && /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "xsmall", leading: "compact", className: "text-ui-fg-subtle", children: [
2498
- t("integration.meta.version", { version }),
2499
- author && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2500
- " • ",
2501
- t("integration.meta.authorPrefix"),
2502
- " ",
2503
- authorUrl ? /* @__PURE__ */ jsxRuntime.jsx(
2504
- "a",
2505
- {
2506
- href: authorUrl,
2507
- target: "_blank",
2508
- rel: "noreferrer",
2509
- className: "text-ui-fg-interactive",
2510
- children: author
2511
- }
2512
- ) : author
2513
- ] })
2514
- ] })
2552
+ /* @__PURE__ */ jsxRuntime.jsx(IntegrationIcon, { src: iconSrc(item.icon), alt: item.label }),
2553
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
2554
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: item.label }),
2555
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", leading: "compact", className: "text-ui-fg-subtle", children: t("integration.browse.by", { author: item.authorLocalized }) })
2515
2556
  ] })
2516
2557
  ] }),
2517
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
2518
- /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: lifecycle.color, children: lifecycle.label }),
2519
- connection && /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: connection.color, children: connection.label }),
2520
- isConfigured && /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
2521
- /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "small", variant: "transparent", children: /* @__PURE__ */ jsxRuntime.jsx(icons.EllipsisHorizontal, {}) }) }),
2522
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
2523
- descriptor.hasTestConnection && record.is_enabled && isComplete && /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Item, { disabled: test.isPending, onClick: () => test.mutate(), children: t("integration.actions.test") }),
2524
- isConfigured && /* @__PURE__ */ jsxRuntime.jsx(
2525
- ui.DropdownMenu.Item,
2526
- {
2527
- disabled: toggleEnabled.isPending,
2528
- onClick: () => toggleEnabled.mutate(!record.is_enabled),
2529
- children: record.is_enabled ? t("integration.actions.disable") : t("integration.actions.enable")
2530
- }
2531
- ),
2532
- isConfigured && /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Separator, {}),
2533
- isConfigured && /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Item, { className: "gap-x-2", onClick: onDelete, children: [
2534
- /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, { className: "text-ui-fg-subtle" }),
2535
- t("integration.actions.delete")
2536
- ] })
2537
- ] })
2538
- ] })
2539
- ] })
2558
+ /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: item.installed ? "green" : "grey", children: item.installed ? t("integration.browse.installed") : t("integration.browse.notInstalled") })
2540
2559
  ] }),
2541
- descriptor.description && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: t(descriptor.description) })
2560
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle line-clamp-2", children: item.shortDescription })
2542
2561
  ] }),
2543
- /* @__PURE__ */ jsxRuntime.jsx(Row, { label: t("integration.labels.category"), children: /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "grey", children: t(`integration.categories.${descriptor.category}`) }) })
2562
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between border-t px-4 py-3", children: [
2563
+ item.installed && item.provider_id ? /* @__PURE__ */ jsxRuntime.jsx(
2564
+ ui.Button,
2565
+ {
2566
+ size: "small",
2567
+ variant: "primary",
2568
+ onClick: () => navigate(`/settings/integrations/${item.provider_id}`),
2569
+ children: t("integration.browse.settings")
2570
+ }
2571
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { size: "small", variant: "secondary", onClick: () => setInstallItem(item), children: [
2572
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
2573
+ t("integration.browse.add")
2574
+ ] }),
2575
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: t(`integration.categories.${item.category}`) })
2576
+ ] })
2577
+ ] }, item.integrationId)) }),
2578
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "flex items-center justify-center p-4", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: PUBLISH_URL, target: "_blank", rel: "noreferrer", className: "text-ui-fg-base txt-small", children: [
2579
+ t("integration.browse.learnMore"),
2580
+ " →"
2544
2581
  ] }) }),
2545
- mainSections.map(renderSection),
2546
- editing && /* @__PURE__ */ jsxRuntime.jsx(
2547
- EditSectionDrawer,
2548
- {
2549
- open: true,
2550
- onOpenChange: (open) => !open && setEditingSection(null),
2551
- providerId: provider_id,
2552
- section: editing,
2553
- values: (record == null ? void 0 : record.values) ?? {},
2554
- configuredSecrets: (record == null ? void 0 : record.configured_secrets) ?? []
2555
- },
2556
- editing.id
2557
- )
2582
+ /* @__PURE__ */ jsxRuntime.jsx(InstallModal, { item: installItem, onOpenChange: (open) => !open && setInstallItem(null) })
2558
2583
  ] });
2559
- const side = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: sideSections.map(renderSection) });
2560
- return /* @__PURE__ */ jsxRuntime.jsx(
2561
- components.LayoutComposer,
2562
- {
2563
- widgetsZonePrefix: `gorgo.integration.${descriptor.identifier}`,
2564
- preferredLayoutId: descriptor.preferredLayoutId,
2565
- sections: { main, side },
2566
- data: sectionData,
2567
- hasOutlet: false
2568
- }
2569
- );
2570
2584
  };
2571
- const IntegrationBreadcrumb = ({ params }) => {
2585
+ const BrowseBreadcrumb = () => {
2572
2586
  const { t } = reactI18next.useTranslation();
2573
- const providerId = params.provider_id;
2574
- const { data } = reactQuery.useQuery({
2575
- queryKey: ["integration", providerId],
2576
- queryFn: () => sdk.client.fetch(`/admin/integrations/${providerId}`),
2577
- enabled: !!providerId
2578
- });
2579
- const descriptor = data == null ? void 0 : data.descriptor;
2580
- if (!descriptor) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
2581
- const name = t(descriptor.displayName);
2582
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2583
- name + " ",
2584
- /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "grey", children: providerId })
2585
- ] });
2587
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: t("integration.browse.title") });
2586
2588
  };
2587
2589
  const handle = {
2588
- breadcrumb: ({ params }) => /* @__PURE__ */ jsxRuntime.jsx(IntegrationBreadcrumb, { params })
2590
+ breadcrumb: () => /* @__PURE__ */ jsxRuntime.jsx(BrowseBreadcrumb, {})
2591
+ };
2592
+ const integration$w = { "list": { "title": "التكاملات", "subtitle": "إدارة إعدادات التكاملات", "browseIntegrations": "تصفح التكاملات", "learnMore": "تعرّف على كيفية إنشاء التكاملات", "searchPlaceholder": "البحث في التكاملات", "empty": "لا توجد تكاملات مسجلة. عرّف المزودين ضمن options.providers الخاصة بإضافة التكاملات في medusa-config.", "emptyFiltered": "لا توجد تكاملات مطابقة لعوامل التصفية.", "tested": "تم الاختبار", "testFailed": "فشل الاختبار", "tabs": { "all": "الكل" } }, "browse": { "title": "التصفح", "subtitle": "ابحث عن التكاملات المتاحة", "publish": "إضافة تكامل", "learnMore": "تعرّف على كيفية إنشاء ونشر تكاملك الخاص", "searchPlaceholder": "البحث في التكاملات", "by": "بواسطة {{author}}", "installed": "مثبَّت", "notInstalled": "غير مثبَّت", "add": "إضافة", "settings": "الإعدادات", "install_docs": "قراءة التوثيق", "install_empty": "تعليمات الإعداد لهذا التكامل غير متوفرة بعد.", "install_truncated": "هذه التعليمات أطول من أن تُعرض هنا — افتح التوثيق." }, "columns": { "integration": "التكامل", "description": "الوصف", "category": "الفئة", "status": "الحالة" }, "status": { "notConfigured": "غير مُهيّأ", "incomplete": "غير مكتمل", "enabled": "ممكّن", "disabled": "معطل", "configured": "مُهيّأ", "connected": "متصل", "connectionFailed": "فشل الاتصال" }, "meta": { "version": "v{{version}}", "authorPrefix": "بواسطة" }, "labels": { "category": "الفئة" }, "categories": { "payment": "الدفع", "notification": "الإشعارات", "fulfillment": "التنفيذ", "search": "البحث", "content": "المحتوى", "analytics": "التحليلات", "authentication": "المصادقة", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "الأسواق", "feed": "الخلاصات", "file_providers": "مزودو الملفات", "other": "أخرى" }, "actions": { "test": "اختبار الاتصال", "enable": "تمكين", "disable": "تعطيل", "delete": "حذف", "edit": "تحرير", "save": "حفظ", "cancel": "إلغاء" }, "delete": { "title": "حذف التهيئة", "description": "هل تريد إزالة التهيئة المحفوظة لـ {{name}}؟ لا يمكن التراجع عن هذا الإجراء." }, "form": { "required": "{{field}} مطلوب", "invalidJson": "JSON غير صالح", "keepSecret": "•••••• – اتركه فارغًا للإبقاء عليه", "items": "{{count}} عناصر" }, "toast": { "saved": "تم الحفظ", "saveFailed": "فشل الحفظ", "connectionOk": "الاتصال ناجح", "testFailed": "فشل الاختبار", "enabled": "تم التمكين", "disabled": "تم التعطيل", "deleted": "تم حذف التهيئة", "deleteFailed": "فشل الحذف", "updateFailed": "فشل التحديث" }, "unknown": 'تكامل غير معروف "{{id}}".', "back": "العودة إلى التكاملات" };
2593
+ const ar = {
2594
+ integration: integration$w
2595
+ };
2596
+ const integration$v = { "list": { "title": "Интеграции", "subtitle": "Управление на настройките на интеграциите", "browseIntegrations": "Разгледай интеграциите", "learnMore": "Научете как да създавате интеграции", "searchPlaceholder": "Търсене на интеграции", "empty": "Няма регистрирани интеграции. Декларирайте доставчици в options.providers на плъгина за интеграции в medusa-config.", "emptyFiltered": "Няма интеграции, отговарящи на филтрите.", "tested": "тествано", "testFailed": "тестът е неуспешен", "tabs": { "all": "Всички" } }, "browse": { "title": "Каталог", "subtitle": "Намерете налични интеграции", "publish": "Добавяне на интеграция", "learnMore": "Научете как да създадете и публикувате собствена интеграция", "searchPlaceholder": "Търсене на интеграции", "by": "от {{author}}", "installed": "Инсталирано", "notInstalled": "Не е инсталирано", "add": "Добави", "settings": "Настройки", "install_docs": "Прочети документацията", "install_empty": "Инструкциите за настройка на тази интеграция все още не са налични.", "install_truncated": "Инструкциите са твърде дълги, за да бъдат показани тук — отворете документацията." }, "columns": { "integration": "Интеграция", "description": "Описание", "category": "Категория", "status": "Статус" }, "status": { "notConfigured": "Не е конфигурирано", "incomplete": "Незавършено", "enabled": "Активирано", "disabled": "Деактивирано", "configured": "Конфигурирано", "connected": "Свързано", "connectionFailed": "Неуспешна връзка" }, "meta": { "version": "v{{version}}", "authorPrefix": "от" }, "labels": { "category": "Категория" }, "categories": { "payment": "Плащания", "notification": "Известия", "fulfillment": "Изпълнение", "search": "Търсене", "content": "Съдържание", "analytics": "Анализи", "authentication": "Удостоверяване", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Маркетплейс", "feed": "Фийдове", "file_providers": "Файлови доставчици", "other": "Други" }, "actions": { "test": "Тест на връзката", "enable": "Активирай", "disable": "Деактивирай", "delete": "Изтрий", "edit": "Редактирай", "save": "Запази", "cancel": "Отказ" }, "delete": { "title": "Изтриване на конфигурацията", "description": "Да се премахне ли запазената конфигурация за {{name}}? Това действие не може да бъде отменено." }, "form": { "required": "{{field}} е задължително", "invalidJson": "Невалиден JSON", "keepSecret": "•••••• – оставете празно, за да запазите", "items": "{{count}} елемента" }, "toast": { "saved": "Запазено", "saveFailed": "Неуспешно запазване", "connectionOk": "Връзката е успешна", "testFailed": "Тестът е неуспешен", "enabled": "Активирано", "disabled": "Деактивирано", "deleted": "Конфигурацията е изтрита", "deleteFailed": "Неуспешно изтриване", "updateFailed": "Неуспешно обновяване" }, "unknown": "Неизвестна интеграция „{{id}}“.", "back": "Назад към интеграциите" };
2597
+ const bg = {
2598
+ integration: integration$v
2599
+ };
2600
+ const integration$u = { "list": { "title": "Integracije", "subtitle": "Upravljanje postavkama integracija", "browseIntegrations": "Pregledaj integracije", "learnMore": "Saznajte kako izraditi integracije", "searchPlaceholder": "Pretraži integracije", "empty": "Nema registrovanih integracija. Deklarišite pružatelje u options.providers dodatka za integracije u medusa-config.", "emptyFiltered": "Nijedna integracija ne odgovara vašim filterima.", "tested": "testirano", "testFailed": "test nije uspio", "tabs": { "all": "Sve" } }, "browse": { "title": "Katalog", "subtitle": "Pronađite dostupne integracije", "publish": "Dodaj integraciju", "learnMore": "Saznajte kako izraditi i objaviti vlastitu integraciju", "searchPlaceholder": "Pretraži integracije", "by": "od {{author}}", "installed": "Instalirano", "notInstalled": "Nije instalirano", "add": "Dodaj", "settings": "Postavke", "install_docs": "Pročitaj dokumentaciju", "install_empty": "Upute za podešavanje ove integracije još nisu dostupne.", "install_truncated": "Ove upute su predugačke za prikaz ovdje — otvorite dokumentaciju." }, "columns": { "integration": "Integracija", "description": "Opis", "category": "Kategorija", "status": "Status" }, "status": { "notConfigured": "Nije konfigurisano", "incomplete": "Nepotpuno", "enabled": "Omogućeno", "disabled": "Onemogućeno", "configured": "Konfigurisano", "connected": "Povezano", "connectionFailed": "Povezivanje nije uspjelo" }, "meta": { "version": "v{{version}}", "authorPrefix": "od" }, "labels": { "category": "Kategorija" }, "categories": { "payment": "Plaćanja", "notification": "Obavijesti", "fulfillment": "Ispuna", "search": "Pretraga", "content": "Sadržaj", "analytics": "Analitika", "authentication": "Autentifikacija", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Tržnica", "feed": "Feedovi", "file_providers": "Pružatelji datoteka", "other": "Ostalo" }, "actions": { "test": "Testiraj vezu", "enable": "Omogući", "disable": "Onemogući", "delete": "Izbriši", "edit": "Uredi", "save": "Sačuvaj", "cancel": "Otkaži" }, "delete": { "title": "Brisanje konfiguracije", "description": "Ukloniti sačuvanu konfiguraciju za {{name}}? Ova radnja se ne može poništiti." }, "form": { "required": "{{field}} je obavezno", "invalidJson": "Neispravan JSON", "keepSecret": "•••••• – ostavite prazno da zadržite", "items": "{{count}} stavki" }, "toast": { "saved": "Sačuvano", "saveFailed": "Spremanje nije uspjelo", "connectionOk": "Veza uspostavljena", "testFailed": "Test nije uspio", "enabled": "Omogućeno", "disabled": "Onemogućeno", "deleted": "Konfiguracija izbrisana", "deleteFailed": "Brisanje nije uspjelo", "updateFailed": "Ažuriranje nije uspjelo" }, "unknown": 'Nepoznata integracija "{{id}}".', "back": "Nazad na integracije" };
2601
+ const bs = {
2602
+ integration: integration$u
2589
2603
  };
2590
- const integration$1 = {
2591
- list: {
2592
- title: "Integrations",
2593
- subtitle: "Manage integrations settings",
2594
- browseIntegrations: "Browse Integrations",
2595
- learnMore: "Learn how to build integrations",
2596
- searchPlaceholder: "Search integrations",
2597
- empty: "No integrations registered. Declare providers under the integration plugin's options.providers in medusa-config.",
2598
- emptyFiltered: "No integrations match your filters.",
2599
- tested: "tested",
2600
- testFailed: "test failed",
2601
- tabs: {
2602
- all: "All"
2603
- }
2604
- },
2605
- browse: {
2606
- title: "Browse",
2607
- subtitle: "Find available integrations",
2608
- publish: "Add Integration",
2609
- learnMore: "Learn how to build and publish your own integration",
2610
- searchPlaceholder: "Search integrations",
2611
- by: "by {{author}}",
2612
- installed: "Installed",
2613
- notInstalled: "Not installed",
2614
- add: "Add",
2615
- settings: "Settings",
2616
- install_docs: "Read docs",
2617
- install_empty: "Setup instructions for this integration aren't available yet.",
2618
- install_truncated: "These instructions are too long to show here — open the documentation."
2619
- },
2620
- columns: {
2621
- integration: "Integration",
2622
- description: "Description",
2623
- category: "Category",
2624
- status: "Status"
2625
- },
2626
- status: {
2627
- notConfigured: "Not configured",
2628
- incomplete: "Incomplete",
2629
- enabled: "Enabled",
2630
- disabled: "Disabled",
2631
- configured: "Configured",
2632
- connected: "Connected",
2633
- connectionFailed: "Connection failed"
2634
- },
2635
- meta: {
2636
- version: "v{{version}}",
2637
- authorPrefix: "by"
2638
- },
2639
- labels: {
2640
- category: "Category"
2641
- },
2642
- categories: {
2643
- payment: "Payment",
2644
- notification: "Notification",
2645
- fulfillment: "Fulfillment",
2646
- search: "Search",
2647
- content: "Content",
2648
- analytics: "Analytics",
2649
- authentication: "Authentication",
2650
- erp: "ERP",
2651
- crm: "CRM",
2652
- pim: "PIM",
2653
- marketplace: "Marketplace",
2654
- feed: "Feed",
2655
- file_providers: "File providers",
2656
- other: "Other"
2657
- },
2658
- actions: {
2659
- test: "Test connection",
2660
- enable: "Enable",
2661
- disable: "Disable",
2662
- "delete": "Delete",
2663
- edit: "Edit",
2664
- save: "Save",
2665
- cancel: "Cancel"
2666
- },
2667
- "delete": {
2668
- title: "Delete configuration",
2669
- description: "Remove the stored configuration for {{name}}? This can't be undone."
2670
- },
2671
- form: {
2672
- required: "{{field}} is required",
2673
- invalidJson: "Invalid JSON",
2674
- keepSecret: "•••••• – leave blank to keep",
2675
- items: "{{count}} items"
2676
- },
2677
- toast: {
2678
- saved: "Saved",
2679
- saveFailed: "Save failed",
2680
- connectionOk: "Connection OK",
2681
- testFailed: "Test failed",
2682
- enabled: "Enabled",
2683
- disabled: "Disabled",
2684
- deleted: "Configuration deleted",
2685
- deleteFailed: "Delete failed",
2686
- updateFailed: "Update failed"
2687
- },
2688
- unknown: 'Unknown integration "{{id}}".',
2689
- back: "Back to integrations"
2604
+ const integration$t = { "list": { "title": "Integrace", "subtitle": "Správa nastavení integrací", "browseIntegrations": "Procházet integrace", "learnMore": "Zjistěte, jak vytvářet integrace", "searchPlaceholder": "Hledat integrace", "empty": "Nejsou registrovány žádné integrace. Deklarujte poskytovatele v options.providers pluginu integrací v medusa-config.", "emptyFiltered": "Žádné integrace neodpovídají vašim filtrům.", "tested": "otestováno", "testFailed": "test selhal", "tabs": { "all": "Vše" } }, "browse": { "title": "Katalog", "subtitle": "Najděte dostupné integrace", "publish": "Přidat integraci", "learnMore": "Zjistěte, jak vytvořit a publikovat vlastní integraci", "searchPlaceholder": "Hledat integrace", "by": "od {{author}}", "installed": "Nainstalováno", "notInstalled": "Nenainstalováno", "add": "Přidat", "settings": "Nastavení", "install_docs": "Přečíst dokumentaci", "install_empty": "Pokyny k nastavení této integrace zatím nejsou k dispozici.", "install_truncated": "Tyto pokyny jsou příliš dlouhé na zobrazení zde — otevřete dokumentaci." }, "columns": { "integration": "Integrace", "description": "Popis", "category": "Kategorie", "status": "Stav" }, "status": { "notConfigured": "Nenakonfigurováno", "incomplete": "Nedokončeno", "enabled": "Aktivní", "disabled": "Neaktivní", "configured": "Nakonfigurováno", "connected": "Připojeno", "connectionFailed": "Připojení selhalo" }, "meta": { "version": "v{{version}}", "authorPrefix": "od" }, "labels": { "category": "Kategorie" }, "categories": { "payment": "Platby", "notification": "Oznámení", "fulfillment": "Plnění", "search": "Vyhledávání", "content": "Obsah", "analytics": "Analytika", "authentication": "Ověřování", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Tržiště", "feed": "Feedy", "file_providers": "Poskytovatelé souborů", "other": "Ostatní" }, "actions": { "test": "Otestovat připojení", "enable": "Aktivovat", "disable": "Deaktivovat", "delete": "Smazat", "edit": "Upravit", "save": "Uložit", "cancel": "Zrušit" }, "delete": { "title": "Smazat konfiguraci", "description": "Odstranit uloženou konfiguraci pro {{name}}? Tuto akci nelze vrátit zpět." }, "form": { "required": "{{field}} je povinné", "invalidJson": "Neplatný JSON", "keepSecret": "•••••• – ponechte prázdné pro zachování", "items": "{{count}} položek" }, "toast": { "saved": "Uloženo", "saveFailed": "Uložení se nezdařilo", "connectionOk": "Připojení v pořádku", "testFailed": "Test se nezdařil", "enabled": "Aktivováno", "disabled": "Deaktivováno", "deleted": "Konfigurace smazána", "deleteFailed": "Smazání se nezdařilo", "updateFailed": "Aktualizace se nezdařila" }, "unknown": "Neznámá integrace „{{id}}“.", "back": "Zpět na integrace" };
2605
+ const cs = {
2606
+ integration: integration$t
2690
2607
  };
2608
+ const integration$s = { "list": { "title": "Integrationen", "subtitle": "Integrationseinstellungen verwalten", "browseIntegrations": "Integrationen durchsuchen", "learnMore": "Erfahren Sie, wie Sie Integrationen erstellen", "searchPlaceholder": "Integrationen suchen", "empty": "Keine Integrationen registriert. Deklarieren Sie Anbieter unter options.providers des Integrations-Plugins in medusa-config.", "emptyFiltered": "Keine Integrationen entsprechen Ihren Filtern.", "tested": "getestet", "testFailed": "Test fehlgeschlagen", "tabs": { "all": "Alle" } }, "browse": { "title": "Katalog", "subtitle": "Verfügbare Integrationen finden", "publish": "Integration hinzufügen", "learnMore": "Erfahren Sie, wie Sie Ihre eigene Integration erstellen und veröffentlichen", "searchPlaceholder": "Integrationen suchen", "by": "von {{author}}", "installed": "Installiert", "notInstalled": "Nicht installiert", "add": "Hinzufügen", "settings": "Einstellungen", "install_docs": "Dokumentation lesen", "install_empty": "Für diese Integration sind noch keine Einrichtungsanweisungen verfügbar.", "install_truncated": "Diese Anweisungen sind zu lang für die Anzeige hier — öffnen Sie die Dokumentation." }, "columns": { "integration": "Integration", "description": "Beschreibung", "category": "Kategorie", "status": "Status" }, "status": { "notConfigured": "Nicht konfiguriert", "incomplete": "Unvollständig", "enabled": "Aktiviert", "disabled": "Deaktiviert", "configured": "Konfiguriert", "connected": "Verbunden", "connectionFailed": "Verbindung fehlgeschlagen" }, "meta": { "version": "v{{version}}", "authorPrefix": "von" }, "labels": { "category": "Kategorie" }, "categories": { "payment": "Zahlung", "notification": "Benachrichtigungen", "fulfillment": "Erfüllung", "search": "Suche", "content": "Inhalte", "analytics": "Analyse", "authentication": "Authentifizierung", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marktplatz", "feed": "Feeds", "file_providers": "Dateianbieter", "other": "Sonstiges" }, "actions": { "test": "Verbindung testen", "enable": "Aktivieren", "disable": "Deaktivieren", "delete": "Löschen", "edit": "Bearbeiten", "save": "Speichern", "cancel": "Abbrechen" }, "delete": { "title": "Konfiguration löschen", "description": "Die gespeicherte Konfiguration für {{name}} entfernen? Diese Aktion kann nicht rückgängig gemacht werden." }, "form": { "required": "{{field}} ist erforderlich", "invalidJson": "Ungültiges JSON", "keepSecret": "•••••• – leer lassen, um beizubehalten", "items": "{{count}} Elemente" }, "toast": { "saved": "Gespeichert", "saveFailed": "Speichern fehlgeschlagen", "connectionOk": "Verbindung OK", "testFailed": "Test fehlgeschlagen", "enabled": "Aktiviert", "disabled": "Deaktiviert", "deleted": "Konfiguration gelöscht", "deleteFailed": "Löschen fehlgeschlagen", "updateFailed": "Aktualisierung fehlgeschlagen" }, "unknown": "Unbekannte Integration „{{id}}“.", "back": "Zurück zu den Integrationen" };
2609
+ const de = {
2610
+ integration: integration$s
2611
+ };
2612
+ const integration$r = { "list": { "title": "Ενσωματώσεις", "subtitle": "Διαχείριση ρυθμίσεων ενσωματώσεων", "browseIntegrations": "Περιήγηση στις ενσωματώσεις", "learnMore": "Μάθετε πώς να δημιουργείτε ενσωματώσεις", "searchPlaceholder": "Αναζήτηση ενσωματώσεων", "empty": "Δεν έχουν καταχωρηθεί ενσωματώσεις. Δηλώστε παρόχους στο options.providers του πρόσθετου ενσωματώσεων στο medusa-config.", "emptyFiltered": "Καμία ενσωμάτωση δεν ταιριάζει με τα φίλτρα σας.", "tested": "ελέγχθηκε", "testFailed": "ο έλεγχος απέτυχε", "tabs": { "all": "Όλα" } }, "browse": { "title": "Κατάλογος", "subtitle": "Βρείτε διαθέσιμες ενσωματώσεις", "publish": "Προσθήκη ενσωμάτωσης", "learnMore": "Μάθετε πώς να δημιουργήσετε και να δημοσιεύσετε τη δική σας ενσωμάτωση", "searchPlaceholder": "Αναζήτηση ενσωματώσεων", "by": "από {{author}}", "installed": "Εγκατεστημένο", "notInstalled": "Μη εγκατεστημένο", "add": "Προσθήκη", "settings": "Ρυθμίσεις", "install_docs": "Διαβάστε την τεκμηρίωση", "install_empty": "Οι οδηγίες εγκατάστασης για αυτήν την ενσωμάτωση δεν είναι ακόμη διαθέσιμες.", "install_truncated": "Αυτές οι οδηγίες είναι πολύ μεγάλες για να εμφανιστούν εδώ — ανοίξτε την τεκμηρίωση." }, "columns": { "integration": "Ενσωμάτωση", "description": "Περιγραφή", "category": "Κατηγορία", "status": "Κατάσταση" }, "status": { "notConfigured": "Μη διαμορφωμένο", "incomplete": "Ημιτελές", "enabled": "Ενεργοποιημένο", "disabled": "Απενεργοποιημένο", "configured": "Διαμορφωμένο", "connected": "Συνδεδεμένο", "connectionFailed": "Η σύνδεση απέτυχε" }, "meta": { "version": "v{{version}}", "authorPrefix": "από" }, "labels": { "category": "Κατηγορία" }, "categories": { "payment": "Πληρωμές", "notification": "Ειδοποιήσεις", "fulfillment": "Εκπλήρωση", "search": "Αναζήτηση", "content": "Περιεχόμενο", "analytics": "Αναλυτικά στοιχεία", "authentication": "Έλεγχος ταυτότητας", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Αγορά", "feed": "Ροές", "file_providers": "Πάροχοι αρχείων", "other": "Άλλα" }, "actions": { "test": "Έλεγχος σύνδεσης", "enable": "Ενεργοποίηση", "disable": "Απενεργοποίηση", "delete": "Διαγραφή", "edit": "Επεξεργασία", "save": "Αποθήκευση", "cancel": "Ακύρωση" }, "delete": { "title": "Διαγραφή διαμόρφωσης", "description": "Κατάργηση της αποθηκευμένης διαμόρφωσης για {{name}}; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί." }, "form": { "required": "Το πεδίο {{field}} είναι υποχρεωτικό", "invalidJson": "Μη έγκυρο JSON", "keepSecret": "•••••• – αφήστε το κενό για διατήρηση", "items": "{{count}} στοιχεία" }, "toast": { "saved": "Αποθηκεύτηκε", "saveFailed": "Η αποθήκευση απέτυχε", "connectionOk": "Η σύνδεση είναι εντάξει", "testFailed": "Ο έλεγχος απέτυχε", "enabled": "Ενεργοποιήθηκε", "disabled": "Απενεργοποιήθηκε", "deleted": "Η διαμόρφωση διαγράφηκε", "deleteFailed": "Η διαγραφή απέτυχε", "updateFailed": "Η ενημέρωση απέτυχε" }, "unknown": "Άγνωστη ενσωμάτωση «{{id}}».", "back": "Επιστροφή στις ενσωματώσεις" };
2613
+ const el = {
2614
+ integration: integration$r
2615
+ };
2616
+ const integration$q = { "list": { "title": "Integrations", "subtitle": "Manage integrations settings", "browseIntegrations": "Browse Integrations", "learnMore": "Learn how to build integrations", "searchPlaceholder": "Search integrations", "empty": "No integrations registered. Declare providers under the integration plugin's options.providers in medusa-config.", "emptyFiltered": "No integrations match your filters.", "tested": "tested", "testFailed": "test failed", "tabs": { "all": "All" } }, "browse": { "title": "Browse", "subtitle": "Find available integrations", "publish": "Add Integration", "learnMore": "Learn how to build and publish your own integration", "searchPlaceholder": "Search integrations", "by": "by {{author}}", "installed": "Installed", "notInstalled": "Not installed", "add": "Add", "settings": "Settings", "install_docs": "Read docs", "install_empty": "Setup instructions for this integration aren't available yet.", "install_truncated": "These instructions are too long to show here — open the documentation." }, "columns": { "integration": "Integration", "description": "Description", "category": "Category", "status": "Status" }, "status": { "notConfigured": "Not configured", "incomplete": "Incomplete", "enabled": "Enabled", "disabled": "Disabled", "configured": "Configured", "connected": "Connected", "connectionFailed": "Connection failed" }, "meta": { "version": "v{{version}}", "authorPrefix": "by" }, "labels": { "category": "Category" }, "categories": { "payment": "Payment", "notification": "Notification", "fulfillment": "Fulfillment", "search": "Search", "content": "Content", "analytics": "Analytics", "authentication": "Authentication", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feed", "file_providers": "File providers", "other": "Other" }, "actions": { "test": "Test connection", "enable": "Enable", "disable": "Disable", "delete": "Delete", "edit": "Edit", "save": "Save", "cancel": "Cancel" }, "delete": { "title": "Delete configuration", "description": "Remove the stored configuration for {{name}}? This can't be undone." }, "form": { "required": "{{field}} is required", "invalidJson": "Invalid JSON", "keepSecret": "•••••• – leave blank to keep", "items": "{{count}} items" }, "toast": { "saved": "Saved", "saveFailed": "Save failed", "connectionOk": "Connection OK", "testFailed": "Test failed", "enabled": "Enabled", "disabled": "Disabled", "deleted": "Configuration deleted", "deleteFailed": "Delete failed", "updateFailed": "Update failed" }, "unknown": 'Unknown integration "{{id}}".', "back": "Back to integrations" };
2691
2617
  const en = {
2692
- integration: integration$1
2618
+ integration: integration$q
2619
+ };
2620
+ const integration$p = { "list": { "title": "Integrations", "subtitle": "Manage integrations settings", "browseIntegrations": "Browse Integrations", "learnMore": "Learn how to build integrations", "searchPlaceholder": "Search integrations", "empty": "No integrations registered. Declare providers under the integration plugin's options.providers in medusa-config.", "emptyFiltered": "No integrations match your filters.", "tested": "tested", "testFailed": "test failed", "tabs": { "all": "All" } }, "browse": { "title": "Browse", "subtitle": "Find available integrations", "publish": "Add Integration", "learnMore": "Learn how to build and publish your own integration", "searchPlaceholder": "Search integrations", "by": "by {{author}}", "installed": "Installed", "notInstalled": "Not installed", "add": "Add", "settings": "Settings", "install_docs": "Read docs", "install_empty": "Setup instructions for this integration aren't available yet.", "install_truncated": "These instructions are too long to show here — open the documentation." }, "columns": { "integration": "Integration", "description": "Description", "category": "Category", "status": "Status" }, "status": { "notConfigured": "Not configured", "incomplete": "Incomplete", "enabled": "Enabled", "disabled": "Disabled", "configured": "Configured", "connected": "Connected", "connectionFailed": "Connection failed" }, "meta": { "version": "v{{version}}", "authorPrefix": "by" }, "labels": { "category": "Category" }, "categories": { "payment": "Payment", "notification": "Notification", "fulfillment": "Fulfilment", "search": "Search", "content": "Content", "analytics": "Analytics", "authentication": "Authentication", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feed", "file_providers": "File providers", "other": "Other" }, "actions": { "test": "Test connection", "enable": "Enable", "disable": "Disable", "delete": "Delete", "edit": "Edit", "save": "Save", "cancel": "Cancel" }, "delete": { "title": "Delete configuration", "description": "Remove the stored configuration for {{name}}? This can't be undone." }, "form": { "required": "{{field}} is required", "invalidJson": "Invalid JSON", "keepSecret": "•••••• – leave blank to keep", "items": "{{count}} items" }, "toast": { "saved": "Saved", "saveFailed": "Save failed", "connectionOk": "Connection OK", "testFailed": "Test failed", "enabled": "Enabled", "disabled": "Disabled", "deleted": "Configuration deleted", "deleteFailed": "Delete failed", "updateFailed": "Update failed" }, "unknown": 'Unknown integration "{{id}}".', "back": "Back to integrations" };
2621
+ const enGB = {
2622
+ integration: integration$p
2693
2623
  };
2694
- const integration = {
2695
- list: {
2696
- title: "Интеграции",
2697
- subtitle: "Управление настройками интеграций",
2698
- browseIntegrations: "Найти интеграции",
2699
- learnMore: "Как создавать интеграции",
2700
- searchPlaceholder: "Поиск интеграций",
2701
- empty: "Нет зарегистрированных интеграций. Объявите провайдеров в options.providers плагина интеграций в medusa-config.",
2702
- emptyFiltered: "Нет интеграций по заданным фильтрам",
2703
- tested: "проверено",
2704
- testFailed: "ошибка проверки",
2705
- tabs: {
2706
- all: "Все"
2707
- }
2708
- },
2709
- browse: {
2710
- title: "Каталог",
2711
- subtitle: "Поиск доступных интеграций",
2712
- publish: "Добавить интеграцию",
2713
- learnMore: "Как создать и опубликовать свою интеграцию",
2714
- searchPlaceholder: "Поиск интеграций",
2715
- by: "от {{author}}",
2716
- installed: "Установлено",
2717
- notInstalled: "Не установлено",
2718
- add: "Добавить",
2719
- settings: "Настройки",
2720
- install_docs: "Читать документацию",
2721
- install_empty: "Инструкция по настройке для этой интеграции пока недоступна.",
2722
- install_truncated: "Инструкция слишком длинная для показа здесь — откройте документацию."
2723
- },
2724
- columns: {
2725
- integration: "Интеграция",
2726
- description: "Описание",
2727
- category: "Категория",
2728
- status: "Статус"
2729
- },
2730
- status: {
2731
- notConfigured: "Не настроено",
2732
- incomplete: "Не завершено",
2733
- enabled: "Включено",
2734
- disabled: "Выключено",
2735
- configured: "Настроено",
2736
- connected: "Подключено",
2737
- connectionFailed: "Ошибка подключения"
2738
- },
2739
- meta: {
2740
- version: "v{{version}}",
2741
- authorPrefix: "от"
2742
- },
2743
- labels: {
2744
- category: "Категория"
2745
- },
2746
- categories: {
2747
- payment: "Платежи",
2748
- notification: "Уведомления",
2749
- fulfillment: "Доставка",
2750
- search: "Поиск",
2751
- content: "Контент",
2752
- analytics: "Аналитика",
2753
- authentication: "Аутентификация",
2754
- erp: "ERP",
2755
- crm: "CRM",
2756
- pim: "PIM",
2757
- marketplace: "Маркетплейс",
2758
- feed: "Фиды",
2759
- file_providers: "Файловые провайдеры",
2760
- other: "Прочее"
2761
- },
2762
- actions: {
2763
- test: "Проверить соединение",
2764
- enable: "Включить",
2765
- disable: "Выключить",
2766
- "delete": "Удалить",
2767
- edit: "Редактировать",
2768
- save: "Сохранить",
2769
- cancel: "Отмена"
2770
- },
2771
- "delete": {
2772
- title: "Удалить конфигурацию",
2773
- description: "Удалить сохранённую конфигурацию «{{name}}»? Это действие необратимо."
2774
- },
2775
- form: {
2776
- required: "Поле «{{field}}» обязательно",
2777
- invalidJson: "Некорректный JSON",
2778
- keepSecret: "•••••• – оставьте пустым, чтобы не менять",
2779
- items: "{{count}} шт."
2780
- },
2781
- toast: {
2782
- saved: "Сохранено",
2783
- saveFailed: "Не удалось сохранить",
2784
- connectionOk: "Соединение установлено",
2785
- testFailed: "Проверка не удалась",
2786
- enabled: "Включено",
2787
- disabled: "Выключено",
2788
- deleted: "Конфигурация удалена",
2789
- deleteFailed: "Не удалось удалить",
2790
- updateFailed: "Не удалось обновить"
2791
- },
2792
- unknown: "Неизвестная интеграция «{{id}}».",
2793
- back: "К интеграциям"
2624
+ const integration$o = { "list": { "title": "Integraciones", "subtitle": "Gestiona la configuración de las integraciones", "browseIntegrations": "Explorar integraciones", "learnMore": "Aprende a crear integraciones", "searchPlaceholder": "Buscar integraciones", "empty": "No hay integraciones registradas. Declara los proveedores en options.providers del plugin de integraciones en medusa-config.", "emptyFiltered": "Ninguna integración coincide con tus filtros.", "tested": "probado", "testFailed": "prueba fallida", "tabs": { "all": "Todas" } }, "browse": { "title": "Catálogo", "subtitle": "Encuentra integraciones disponibles", "publish": "Añadir integración", "learnMore": "Aprende a crear y publicar tu propia integración", "searchPlaceholder": "Buscar integraciones", "by": "por {{author}}", "installed": "Instalado", "notInstalled": "No instalado", "add": "Añadir", "settings": "Configuración", "install_docs": "Leer documentación", "install_empty": "Las instrucciones de configuración de esta integración aún no están disponibles.", "install_truncated": "Estas instrucciones son demasiado largas para mostrarlas aquí — abre la documentación." }, "columns": { "integration": "Integración", "description": "Descripción", "category": "Categoría", "status": "Estado" }, "status": { "notConfigured": "Sin configurar", "incomplete": "Incompleto", "enabled": "Habilitado", "disabled": "Deshabilitado", "configured": "Configurado", "connected": "Conectado", "connectionFailed": "Error de conexión" }, "meta": { "version": "v{{version}}", "authorPrefix": "por" }, "labels": { "category": "Categoría" }, "categories": { "payment": "Pagos", "notification": "Notificaciones", "fulfillment": "Cumplimiento", "search": "Búsqueda", "content": "Contenido", "analytics": "Analíticas", "authentication": "Autenticación", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feeds", "file_providers": "Proveedores de archivos", "other": "Otros" }, "actions": { "test": "Probar conexión", "enable": "Habilitar", "disable": "Deshabilitar", "delete": "Eliminar", "edit": "Editar", "save": "Guardar", "cancel": "Cancelar" }, "delete": { "title": "Eliminar configuración", "description": "¿Eliminar la configuración guardada de {{name}}? Esta acción no puede deshacerse." }, "form": { "required": "{{field}} es obligatorio", "invalidJson": "JSON no válido", "keepSecret": "•••••• – déjalo en blanco para mantenerlo", "items": "{{count}} elementos" }, "toast": { "saved": "Guardado", "saveFailed": "No se pudo guardar", "connectionOk": "Conexión correcta", "testFailed": "La prueba falló", "enabled": "Habilitado", "disabled": "Deshabilitado", "deleted": "Configuración eliminada", "deleteFailed": "No se pudo eliminar", "updateFailed": "No se pudo actualizar" }, "unknown": "Integración desconocida «{{id}}».", "back": "Volver a integraciones" };
2625
+ const es = {
2626
+ integration: integration$o
2794
2627
  };
2628
+ const integration$n = { "list": { "title": "یکپارچه‌سازی‌ها", "subtitle": "مدیریت تنظیمات یکپارچه‌سازی‌ها", "browseIntegrations": "مرور یکپارچه‌سازی‌ها", "learnMore": "بیاموزید چگونه یکپارچه‌سازی بسازید", "searchPlaceholder": "جستجوی یکپارچه‌سازی‌ها", "empty": "هیچ یکپارچه‌سازی ثبت نشده است. ارائه‌دهندگان را در options.providers افزونه یکپارچه‌سازی در medusa-config تعریف کنید.", "emptyFiltered": "هیچ یکپارچه‌سازی با فیلترهای شما مطابقت ندارد.", "tested": "آزمایش شد", "testFailed": "آزمایش ناموفق بود", "tabs": { "all": "همه" } }, "browse": { "title": "مرور", "subtitle": "یکپارچه‌سازی‌های موجود را پیدا کنید", "publish": "افزودن یکپارچه‌سازی", "learnMore": "بیاموزید چگونه یکپارچه‌سازی خود را بسازید و منتشر کنید", "searchPlaceholder": "جستجوی یکپارچه‌سازی‌ها", "by": "توسط {{author}}", "installed": "نصب‌شده", "notInstalled": "نصب نشده", "add": "افزودن", "settings": "تنظیمات", "install_docs": "خواندن مستندات", "install_empty": "دستورالعمل راه‌اندازی این یکپارچه‌سازی هنوز در دسترس نیست.", "install_truncated": "این دستورالعمل برای نمایش در اینجا بسیار طولانی است — مستندات را باز کنید." }, "columns": { "integration": "یکپارچه‌سازی", "description": "توضیحات", "category": "دسته‌بندی", "status": "وضعیت" }, "status": { "notConfigured": "پیکربندی نشده", "incomplete": "ناقص", "enabled": "فعال", "disabled": "غیرفعال", "configured": "پیکربندی شده", "connected": "متصل", "connectionFailed": "اتصال ناموفق بود" }, "meta": { "version": "v{{version}}", "authorPrefix": "توسط" }, "labels": { "category": "دسته‌بندی" }, "categories": { "payment": "پرداخت", "notification": "اعلان‌ها", "fulfillment": "پردازش سفارش", "search": "جستجو", "content": "محتوا", "analytics": "تحلیل‌ها", "authentication": "احراز هویت", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "بازارگاه", "feed": "فیدها", "file_providers": "ارائه‌دهندگان فایل", "other": "سایر" }, "actions": { "test": "آزمایش اتصال", "enable": "فعال کردن", "disable": "غیرفعال کردن", "delete": "حذف", "edit": "ویرایش", "save": "ذخیره", "cancel": "لغو" }, "delete": { "title": "حذف پیکربندی", "description": "پیکربندی ذخیره‌شده برای {{name}} حذف شود؟ این عمل قابل بازگشت نیست." }, "form": { "required": "{{field}} الزامی است", "invalidJson": "JSON نامعتبر", "keepSecret": "•••••• – برای حفظ مقدار خالی بگذارید", "items": "{{count}} مورد" }, "toast": { "saved": "ذخیره شد", "saveFailed": "ذخیره‌سازی ناموفق بود", "connectionOk": "اتصال برقرار است", "testFailed": "آزمایش ناموفق بود", "enabled": "فعال شد", "disabled": "غیرفعال شد", "deleted": "پیکربندی حذف شد", "deleteFailed": "حذف ناموفق بود", "updateFailed": "به‌روزرسانی ناموفق بود" }, "unknown": "یکپارچه‌سازی ناشناخته «{{id}}».", "back": "بازگشت به یکپارچه‌سازی‌ها" };
2629
+ const fa = {
2630
+ integration: integration$n
2631
+ };
2632
+ const integration$m = { "list": { "title": "Intégrations", "subtitle": "Gérer les paramètres des intégrations", "browseIntegrations": "Parcourir les intégrations", "learnMore": "Découvrez comment créer des intégrations", "searchPlaceholder": "Rechercher des intégrations", "empty": "Aucune intégration enregistrée. Déclarez les fournisseurs dans options.providers du plugin d'intégrations dans medusa-config.", "emptyFiltered": "Aucune intégration ne correspond à vos filtres.", "tested": "testé", "testFailed": "échec du test", "tabs": { "all": "Toutes" } }, "browse": { "title": "Catalogue", "subtitle": "Trouvez les intégrations disponibles", "publish": "Ajouter une intégration", "learnMore": "Découvrez comment créer et publier votre propre intégration", "searchPlaceholder": "Rechercher des intégrations", "by": "par {{author}}", "installed": "Installé", "notInstalled": "Non installé", "add": "Ajouter", "settings": "Paramètres", "install_docs": "Lire la documentation", "install_empty": "Les instructions de configuration de cette intégration ne sont pas encore disponibles.", "install_truncated": "Ces instructions sont trop longues pour être affichées ici — ouvrez la documentation." }, "columns": { "integration": "Intégration", "description": "Description", "category": "Catégorie", "status": "Statut" }, "status": { "notConfigured": "Non configuré", "incomplete": "Incomplet", "enabled": "Activé", "disabled": "Désactivé", "configured": "Configuré", "connected": "Connecté", "connectionFailed": "Échec de la connexion" }, "meta": { "version": "v{{version}}", "authorPrefix": "par" }, "labels": { "category": "Catégorie" }, "categories": { "payment": "Paiement", "notification": "Notifications", "fulfillment": "Livraison", "search": "Recherche", "content": "Contenu", "analytics": "Analytique", "authentication": "Authentification", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Flux", "file_providers": "Fournisseurs de fichiers", "other": "Autres" }, "actions": { "test": "Tester la connexion", "enable": "Activer", "disable": "Désactiver", "delete": "Supprimer", "edit": "Modifier", "save": "Enregistrer", "cancel": "Annuler" }, "delete": { "title": "Supprimer la configuration", "description": "Supprimer la configuration enregistrée pour {{name}} ? Cette action ne peut être annulée." }, "form": { "required": "{{field}} est requis", "invalidJson": "JSON invalide", "keepSecret": "•••••• – laissez vide pour conserver", "items": "{{count}} éléments" }, "toast": { "saved": "Enregistré", "saveFailed": "Échec de l'enregistrement", "connectionOk": "Connexion OK", "testFailed": "Échec du test", "enabled": "Activé", "disabled": "Désactivé", "deleted": "Configuration supprimée", "deleteFailed": "Échec de la suppression", "updateFailed": "Échec de la mise à jour" }, "unknown": "Intégration inconnue « {{id}} ».", "back": "Retour aux intégrations" };
2633
+ const fr = {
2634
+ integration: integration$m
2635
+ };
2636
+ const integration$l = { "list": { "title": "אינטגרציות", "subtitle": "ניהול הגדרות האינטגרציות", "browseIntegrations": "עיון באינטגרציות", "learnMore": "למדו כיצד לבנות אינטגרציות", "searchPlaceholder": "חיפוש אינטגרציות", "empty": "לא רשומות אינטגרציות. הגדירו ספקים תחת options.providers של תוסף האינטגרציות ב-medusa-config.", "emptyFiltered": "אין אינטגרציות התואמות את הסינון שלך.", "tested": "נבדק", "testFailed": "הבדיקה נכשלה", "tabs": { "all": "הכל" } }, "browse": { "title": "קטלוג", "subtitle": "מצאו אינטגרציות זמינות", "publish": "הוספת אינטגרציה", "learnMore": "למדו כיצד לבנות ולפרסם אינטגרציה משלכם", "searchPlaceholder": "חיפוש אינטגרציות", "by": "על ידי {{author}}", "installed": "מותקן", "notInstalled": "לא מותקן", "add": "הוסף", "settings": "הגדרות", "install_docs": "קרא את התיעוד", "install_empty": "הוראות ההתקנה עבור אינטגרציה זו אינן זמינות עדיין.", "install_truncated": "ההוראות ארוכות מדי להצגה כאן — פתחו את התיעוד." }, "columns": { "integration": "אינטגרציה", "description": "תיאור", "category": "קטגוריה", "status": "סטטוס" }, "status": { "notConfigured": "לא מוגדר", "incomplete": "לא הושלם", "enabled": "מופעל", "disabled": "מושבת", "configured": "מוגדר", "connected": "מחובר", "connectionFailed": "החיבור נכשל" }, "meta": { "version": "v{{version}}", "authorPrefix": "על ידי" }, "labels": { "category": "קטגוריה" }, "categories": { "payment": "תשלומים", "notification": "התראות", "fulfillment": "מימוש", "search": "חיפוש", "content": "תוכן", "analytics": "אנליטיקה", "authentication": "אימות", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "זירת מסחר", "feed": "פידים", "file_providers": "ספקי קבצים", "other": "אחר" }, "actions": { "test": "בדיקת חיבור", "enable": "הפעל", "disable": "השבת", "delete": "מחק", "edit": "ערוך", "save": "שמור", "cancel": "בטל" }, "delete": { "title": "מחיקת תצורה", "description": "להסיר את התצורה השמורה עבור {{name}}? פעולה זו אינה ניתנת לביטול." }, "form": { "required": "{{field}} הוא שדה חובה", "invalidJson": "JSON לא תקין", "keepSecret": "•••••• – השאירו ריק כדי לשמור", "items": "{{count}} פריטים" }, "toast": { "saved": "נשמר", "saveFailed": "השמירה נכשלה", "connectionOk": "החיבור תקין", "testFailed": "הבדיקה נכשלה", "enabled": "הופעל", "disabled": "הושבת", "deleted": "התצורה נמחקה", "deleteFailed": "המחיקה נכשלה", "updateFailed": "העדכון נכשל" }, "unknown": 'אינטגרציה לא ידועה "{{id}}".', "back": "חזרה לאינטגרציות" };
2637
+ const he = {
2638
+ integration: integration$l
2639
+ };
2640
+ const integration$k = { "list": { "title": "Integracije", "subtitle": "Upravljanje postavkama integracija", "browseIntegrations": "Pregledaj integracije", "learnMore": "Saznajte kako izraditi integracije", "searchPlaceholder": "Pretraži integracije", "empty": "Nema registriranih integracija. Deklarirajte pružatelje u options.providers dodatka za integracije u medusa-config.", "emptyFiltered": "Nijedna integracija ne odgovara vašim filtrima.", "tested": "testirano", "testFailed": "test nije uspio", "tabs": { "all": "Sve" } }, "browse": { "title": "Katalog", "subtitle": "Pronađite dostupne integracije", "publish": "Dodaj integraciju", "learnMore": "Saznajte kako izraditi i objaviti vlastitu integraciju", "searchPlaceholder": "Pretraži integracije", "by": "od {{author}}", "installed": "Instalirano", "notInstalled": "Nije instalirano", "add": "Dodaj", "settings": "Postavke", "install_docs": "Pročitaj dokumentaciju", "install_empty": "Upute za postavljanje ove integracije još nisu dostupne.", "install_truncated": "Ove su upute predugačke za prikaz ovdje — otvorite dokumentaciju." }, "columns": { "integration": "Integracija", "description": "Opis", "category": "Kategorija", "status": "Status" }, "status": { "notConfigured": "Nije konfigurirano", "incomplete": "Nepotpuno", "enabled": "Omogućeno", "disabled": "Onemogućeno", "configured": "Konfigurirano", "connected": "Povezano", "connectionFailed": "Povezivanje nije uspjelo" }, "meta": { "version": "v{{version}}", "authorPrefix": "od" }, "labels": { "category": "Kategorija" }, "categories": { "payment": "Plaćanja", "notification": "Obavijesti", "fulfillment": "Otprema", "search": "Pretraga", "content": "Sadržaj", "analytics": "Analitika", "authentication": "Autentifikacija", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Tržnica", "feed": "Feedovi", "file_providers": "Pružatelji datoteka", "other": "Ostalo" }, "actions": { "test": "Testiraj vezu", "enable": "Omogući", "disable": "Onemogući", "delete": "Izbriši", "edit": "Uredi", "save": "Spremi", "cancel": "Otkaži" }, "delete": { "title": "Brisanje konfiguracije", "description": "Ukloniti spremljenu konfiguraciju za {{name}}? Ovu radnju nije moguće poništiti." }, "form": { "required": "{{field}} je obavezno", "invalidJson": "Neispravan JSON", "keepSecret": "•••••• – ostavite prazno za zadržavanje", "items": "{{count}} stavki" }, "toast": { "saved": "Spremljeno", "saveFailed": "Spremanje nije uspjelo", "connectionOk": "Veza uspostavljena", "testFailed": "Test nije uspio", "enabled": "Omogućeno", "disabled": "Onemogućeno", "deleted": "Konfiguracija izbrisana", "deleteFailed": "Brisanje nije uspjelo", "updateFailed": "Ažuriranje nije uspjelo" }, "unknown": 'Nepoznata integracija "{{id}}".', "back": "Natrag na integracije" };
2641
+ const hr = {
2642
+ integration: integration$k
2643
+ };
2644
+ const integration$j = { "list": { "title": "Integrációk", "subtitle": "Integrációk beállításainak kezelése", "browseIntegrations": "Integrációk böngészése", "learnMore": "Ismerje meg, hogyan készíthet integrációkat", "searchPlaceholder": "Integrációk keresése", "empty": "Nincsenek regisztrált integrációk. Adja meg a szolgáltatókat az integrációs bővítmény options.providers beállításában a medusa-config fájlban.", "emptyFiltered": "Egyetlen integráció sem felel meg a szűrőknek.", "tested": "tesztelve", "testFailed": "a teszt sikertelen", "tabs": { "all": "Összes" } }, "browse": { "title": "Katalógus", "subtitle": "Találjon elérhető integrációkat", "publish": "Integráció hozzáadása", "learnMore": "Ismerje meg, hogyan készítheti el és teheti közzé saját integrációját", "searchPlaceholder": "Integrációk keresése", "by": "{{author}} által", "installed": "Telepítve", "notInstalled": "Nincs telepítve", "add": "Hozzáadás", "settings": "Beállítások", "install_docs": "Dokumentáció olvasása", "install_empty": "Ehhez az integrációhoz még nem érhető el beállítási útmutató.", "install_truncated": "Ez az útmutató túl hosszú ahhoz, hogy itt megjelenjen — nyissa meg a dokumentációt." }, "columns": { "integration": "Integráció", "description": "Leírás", "category": "Kategória", "status": "Státusz" }, "status": { "notConfigured": "Nincs konfigurálva", "incomplete": "Befejezetlen", "enabled": "Engedélyezve", "disabled": "Letiltva", "configured": "Konfigurálva", "connected": "Csatlakoztatva", "connectionFailed": "A kapcsolódás sikertelen" }, "meta": { "version": "v{{version}}", "authorPrefix": "készítette:" }, "labels": { "category": "Kategória" }, "categories": { "payment": "Fizetés", "notification": "Értesítések", "fulfillment": "Teljesítés", "search": "Keresés", "content": "Tartalom", "analytics": "Analitika", "authentication": "Hitelesítés", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Piactér", "feed": "Hírcsatornák", "file_providers": "Fájlszolgáltatók", "other": "Egyéb" }, "actions": { "test": "Kapcsolat tesztelése", "enable": "Engedélyezés", "disable": "Letiltás", "delete": "Törlés", "edit": "Szerkesztés", "save": "Mentés", "cancel": "Mégse" }, "delete": { "title": "Konfiguráció törlése", "description": "Eltávolítja a(z) {{name}} mentett konfigurációját? Ez a művelet nem vonható vissza." }, "form": { "required": "A(z) {{field}} megadása kötelező", "invalidJson": "Érvénytelen JSON", "keepSecret": "•••••• – hagyja üresen a megtartáshoz", "items": "{{count}} elem" }, "toast": { "saved": "Mentve", "saveFailed": "A mentés sikertelen", "connectionOk": "A kapcsolat rendben", "testFailed": "A teszt sikertelen", "enabled": "Engedélyezve", "disabled": "Letiltva", "deleted": "Konfiguráció törölve", "deleteFailed": "A törlés sikertelen", "updateFailed": "A frissítés sikertelen" }, "unknown": "Ismeretlen integráció: „{{id}}”.", "back": "Vissza az integrációkhoz" };
2645
+ const hu = {
2646
+ integration: integration$j
2647
+ };
2648
+ const integration$i = { "list": { "title": "Integrasi", "subtitle": "Kelola pengaturan integrasi", "browseIntegrations": "Jelajahi integrasi", "learnMore": "Pelajari cara membangun integrasi", "searchPlaceholder": "Cari integrasi", "empty": "Tidak ada integrasi yang terdaftar. Deklarasikan penyedia di options.providers plugin integrasi pada medusa-config.", "emptyFiltered": "Tidak ada integrasi yang cocok dengan filter Anda.", "tested": "teruji", "testFailed": "pengujian gagal", "tabs": { "all": "Semua" } }, "browse": { "title": "Katalog", "subtitle": "Temukan integrasi yang tersedia", "publish": "Tambah integrasi", "learnMore": "Pelajari cara membangun dan memublikasikan integrasi Anda sendiri", "searchPlaceholder": "Cari integrasi", "by": "oleh {{author}}", "installed": "Terpasang", "notInstalled": "Belum terpasang", "add": "Tambah", "settings": "Pengaturan", "install_docs": "Baca dokumentasi", "install_empty": "Petunjuk penyiapan untuk integrasi ini belum tersedia.", "install_truncated": "Petunjuk ini terlalu panjang untuk ditampilkan di sini — buka dokumentasinya." }, "columns": { "integration": "Integrasi", "description": "Deskripsi", "category": "Kategori", "status": "Status" }, "status": { "notConfigured": "Belum dikonfigurasi", "incomplete": "Belum lengkap", "enabled": "Diaktifkan", "disabled": "Dinonaktifkan", "configured": "Terkonfigurasi", "connected": "Terhubung", "connectionFailed": "Koneksi gagal" }, "meta": { "version": "v{{version}}", "authorPrefix": "oleh" }, "labels": { "category": "Kategori" }, "categories": { "payment": "Pembayaran", "notification": "Notifikasi", "fulfillment": "Pemenuhan", "search": "Pencarian", "content": "Konten", "analytics": "Analitik", "authentication": "Autentikasi", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feed", "file_providers": "Penyedia file", "other": "Lainnya" }, "actions": { "test": "Uji koneksi", "enable": "Aktifkan", "disable": "Nonaktifkan", "delete": "Hapus", "edit": "Edit", "save": "Simpan", "cancel": "Batal" }, "delete": { "title": "Hapus konfigurasi", "description": "Hapus konfigurasi tersimpan untuk {{name}}? Tindakan ini tidak dapat dibatalkan." }, "form": { "required": "{{field}} wajib diisi", "invalidJson": "JSON tidak valid", "keepSecret": "•••••• – biarkan kosong untuk mempertahankan", "items": "{{count}} item" }, "toast": { "saved": "Tersimpan", "saveFailed": "Gagal menyimpan", "connectionOk": "Koneksi berhasil", "testFailed": "Pengujian gagal", "enabled": "Diaktifkan", "disabled": "Dinonaktifkan", "deleted": "Konfigurasi dihapus", "deleteFailed": "Gagal menghapus", "updateFailed": "Gagal memperbarui" }, "unknown": 'Integrasi tidak dikenal "{{id}}".', "back": "Kembali ke integrasi" };
2649
+ const id = {
2650
+ integration: integration$i
2651
+ };
2652
+ const integration$h = { "list": { "title": "Integrazioni", "subtitle": "Gestisci le impostazioni delle integrazioni", "browseIntegrations": "Esplora le integrazioni", "learnMore": "Scopri come creare integrazioni", "searchPlaceholder": "Cerca integrazioni", "empty": "Nessuna integrazione registrata. Dichiara i fornitori in options.providers del plugin integrazioni in medusa-config.", "emptyFiltered": "Nessuna integrazione corrisponde ai filtri.", "tested": "testato", "testFailed": "test fallito", "tabs": { "all": "Tutte" } }, "browse": { "title": "Catalogo", "subtitle": "Trova le integrazioni disponibili", "publish": "Aggiungi integrazione", "learnMore": "Scopri come creare e pubblicare la tua integrazione", "searchPlaceholder": "Cerca integrazioni", "by": "di {{author}}", "installed": "Installato", "notInstalled": "Non installato", "add": "Aggiungi", "settings": "Impostazioni", "install_docs": "Leggi la documentazione", "install_empty": "Le istruzioni di configurazione per questa integrazione non sono ancora disponibili.", "install_truncated": "Queste istruzioni sono troppo lunghe per essere mostrate qui — apri la documentazione." }, "columns": { "integration": "Integrazione", "description": "Descrizione", "category": "Categoria", "status": "Stato" }, "status": { "notConfigured": "Non configurato", "incomplete": "Incompleto", "enabled": "Abilitato", "disabled": "Disabilitato", "configured": "Configurato", "connected": "Connesso", "connectionFailed": "Connessione non riuscita" }, "meta": { "version": "v{{version}}", "authorPrefix": "di" }, "labels": { "category": "Categoria" }, "categories": { "payment": "Pagamenti", "notification": "Notifiche", "fulfillment": "Evasione", "search": "Ricerca", "content": "Contenuti", "analytics": "Analisi", "authentication": "Autenticazione", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feed", "file_providers": "Fornitori di file", "other": "Altro" }, "actions": { "test": "Testa connessione", "enable": "Abilita", "disable": "Disabilita", "delete": "Elimina", "edit": "Modifica", "save": "Salva", "cancel": "Annulla" }, "delete": { "title": "Elimina configurazione", "description": "Rimuovere la configurazione salvata per {{name}}? Questa azione non può essere annullata." }, "form": { "required": "{{field}} è obbligatorio", "invalidJson": "JSON non valido", "keepSecret": "•••••• – lascia vuoto per mantenere", "items": "{{count}} elementi" }, "toast": { "saved": "Salvato", "saveFailed": "Salvataggio non riuscito", "connectionOk": "Connessione OK", "testFailed": "Test non riuscito", "enabled": "Abilitato", "disabled": "Disabilitato", "deleted": "Configurazione eliminata", "deleteFailed": "Eliminazione non riuscita", "updateFailed": "Aggiornamento non riuscito" }, "unknown": "Integrazione sconosciuta «{{id}}».", "back": "Torna alle integrazioni" };
2653
+ const it = {
2654
+ integration: integration$h
2655
+ };
2656
+ const integration$g = { "list": { "title": "インテグレーション", "subtitle": "インテグレーションの設定を管理します", "browseIntegrations": "インテグレーションを探す", "learnMore": "インテグレーションの作り方を学ぶ", "searchPlaceholder": "インテグレーションを検索", "empty": "登録されているインテグレーションはありません。medusa-config のインテグレーションプラグインの options.providers にプロバイダーを宣言してください。", "emptyFiltered": "フィルターに一致するインテグレーションはありません。", "tested": "テスト済み", "testFailed": "テスト失敗", "tabs": { "all": "すべて" } }, "browse": { "title": "カタログ", "subtitle": "利用可能なインテグレーションを探す", "publish": "インテグレーションを追加", "learnMore": "独自のインテグレーションを作成して公開する方法を学ぶ", "searchPlaceholder": "インテグレーションを検索", "by": "{{author}} 作", "installed": "インストール済み", "notInstalled": "未インストール", "add": "追加", "settings": "設定", "install_docs": "ドキュメントを読む", "install_empty": "このインテグレーションのセットアップ手順はまだ利用できません。", "install_truncated": "この手順はここに表示するには長すぎます — ドキュメントを開いてください。" }, "columns": { "integration": "インテグレーション", "description": "説明", "category": "カテゴリー", "status": "ステータス" }, "status": { "notConfigured": "未設定", "incomplete": "未完了", "enabled": "有効", "disabled": "無効", "configured": "設定済み", "connected": "接続済み", "connectionFailed": "接続に失敗しました" }, "meta": { "version": "v{{version}}", "authorPrefix": "作成者" }, "labels": { "category": "カテゴリー" }, "categories": { "payment": "決済", "notification": "通知", "fulfillment": "フルフィルメント", "search": "検索", "content": "コンテンツ", "analytics": "分析", "authentication": "認証", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "マーケットプレイス", "feed": "フィード", "file_providers": "ファイルプロバイダー", "other": "その他" }, "actions": { "test": "接続テスト", "enable": "有効化", "disable": "無効化", "delete": "削除", "edit": "編集", "save": "保存", "cancel": "キャンセル" }, "delete": { "title": "設定を削除", "description": "{{name}} の保存済み設定を削除しますか?この操作は元に戻せません。" }, "form": { "required": "{{field}} は必須です", "invalidJson": "無効な JSON", "keepSecret": "•••••• – 変更しない場合は空欄のまま", "items": "{{count}} 件" }, "toast": { "saved": "保存しました", "saveFailed": "保存に失敗しました", "connectionOk": "接続に成功しました", "testFailed": "テストに失敗しました", "enabled": "有効にしました", "disabled": "無効にしました", "deleted": "設定を削除しました", "deleteFailed": "削除に失敗しました", "updateFailed": "更新に失敗しました" }, "unknown": "不明なインテグレーション「{{id}}」。", "back": "インテグレーションに戻る" };
2657
+ const ja = {
2658
+ integration: integration$g
2659
+ };
2660
+ const integration$f = { "list": { "title": "통합", "subtitle": "통합 설정 관리", "browseIntegrations": "통합 둘러보기", "learnMore": "통합을 만드는 방법 알아보기", "searchPlaceholder": "통합 검색", "empty": "등록된 통합이 없습니다. medusa-config의 통합 플러그인 options.providers에 제공자를 선언하세요.", "emptyFiltered": "필터와 일치하는 통합이 없습니다.", "tested": "테스트됨", "testFailed": "테스트 실패", "tabs": { "all": "전체" } }, "browse": { "title": "카탈로그", "subtitle": "사용 가능한 통합 찾기", "publish": "통합 추가", "learnMore": "자신만의 통합을 만들고 게시하는 방법 알아보기", "searchPlaceholder": "통합 검색", "by": "{{author}} 제작", "installed": "설치됨", "notInstalled": "설치되지 않음", "add": "추가", "settings": "설정", "install_docs": "문서 읽기", "install_empty": "이 통합에 대한 설정 안내는 아직 제공되지 않습니다.", "install_truncated": "안내가 너무 길어 여기에 표시할 수 없습니다 — 문서를 열어 보세요." }, "columns": { "integration": "통합", "description": "설명", "category": "카테고리", "status": "상태" }, "status": { "notConfigured": "구성되지 않음", "incomplete": "미완료", "enabled": "활성화됨", "disabled": "비활성화됨", "configured": "구성됨", "connected": "연결됨", "connectionFailed": "연결 실패" }, "meta": { "version": "v{{version}}", "authorPrefix": "제작" }, "labels": { "category": "카테고리" }, "categories": { "payment": "결제", "notification": "알림", "fulfillment": "이행", "search": "검색", "content": "콘텐츠", "analytics": "분석", "authentication": "인증", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "마켓플레이스", "feed": "피드", "file_providers": "파일 제공자", "other": "기타" }, "actions": { "test": "연결 테스트", "enable": "활성화", "disable": "비활성화", "delete": "삭제", "edit": "편집", "save": "저장", "cancel": "취소" }, "delete": { "title": "구성 삭제", "description": "{{name}}의 저장된 구성을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다." }, "form": { "required": "{{field}}은(는) 필수입니다", "invalidJson": "잘못된 JSON", "keepSecret": "•••••• – 유지하려면 비워 두세요", "items": "{{count}}개 항목" }, "toast": { "saved": "저장됨", "saveFailed": "저장 실패", "connectionOk": "연결 성공", "testFailed": "테스트 실패", "enabled": "활성화됨", "disabled": "비활성화됨", "deleted": "구성이 삭제됨", "deleteFailed": "삭제 실패", "updateFailed": "업데이트 실패" }, "unknown": '알 수 없는 통합 "{{id}}".', "back": "통합으로 돌아가기" };
2661
+ const ko = {
2662
+ integration: integration$f
2663
+ };
2664
+ const integration$e = { "list": { "title": "Integracijos", "subtitle": "Integracijų nustatymų valdymas", "browseIntegrations": "Naršyti integracijas", "learnMore": "Sužinokite, kaip kurti integracijas", "searchPlaceholder": "Ieškoti integracijų", "empty": "Nėra registruotų integracijų. Nurodykite teikėjus integracijų papildinio options.providers medusa-config faile.", "emptyFiltered": "Nė viena integracija neatitinka jūsų filtrų.", "tested": "patikrinta", "testFailed": "patikra nepavyko", "tabs": { "all": "Visos" } }, "browse": { "title": "Katalogas", "subtitle": "Raskite prieinamas integracijas", "publish": "Pridėti integraciją", "learnMore": "Sužinokite, kaip sukurti ir paskelbti savo integraciją", "searchPlaceholder": "Ieškoti integracijų", "by": "sukūrė {{author}}", "installed": "Įdiegta", "notInstalled": "Neįdiegta", "add": "Pridėti", "settings": "Nustatymai", "install_docs": "Skaityti dokumentaciją", "install_empty": "Šios integracijos sąrankos instrukcijos dar nepasiekiamos.", "install_truncated": "Šios instrukcijos per ilgos, kad būtų rodomos čia — atverkite dokumentaciją." }, "columns": { "integration": "Integracija", "description": "Aprašymas", "category": "Kategorija", "status": "Būsena" }, "status": { "notConfigured": "Nesukonfigūruota", "incomplete": "Nebaigta", "enabled": "Įjungta", "disabled": "Išjungta", "configured": "Sukonfigūruota", "connected": "Prijungta", "connectionFailed": "Nepavyko prisijungti" }, "meta": { "version": "v{{version}}", "authorPrefix": "sukūrė" }, "labels": { "category": "Kategorija" }, "categories": { "payment": "Mokėjimai", "notification": "Pranešimai", "fulfillment": "Vykdymas", "search": "Paieška", "content": "Turinys", "analytics": "Analitika", "authentication": "Autentifikavimas", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Prekyvietė", "feed": "Srautai", "file_providers": "Failų teikėjai", "other": "Kita" }, "actions": { "test": "Tikrinti ryšį", "enable": "Įjungti", "disable": "Išjungti", "delete": "Ištrinti", "edit": "Keisti", "save": "Išsaugoti", "cancel": "Atšaukti" }, "delete": { "title": "Ištrinti konfigūraciją", "description": "Pašalinti išsaugotą {{name}} konfigūraciją? Šis veiksmas neatstatomas." }, "form": { "required": "{{field}} yra privalomas", "invalidJson": "Netinkamas JSON", "keepSecret": "•••••• – palikite tuščią, kad išliktų", "items": "{{count}} elementai" }, "toast": { "saved": "Išsaugota", "saveFailed": "Nepavyko išsaugoti", "connectionOk": "Ryšys sėkmingas", "testFailed": "Patikra nepavyko", "enabled": "Įjungta", "disabled": "Išjungta", "deleted": "Konfigūracija ištrinta", "deleteFailed": "Nepavyko ištrinti", "updateFailed": "Nepavyko atnaujinti" }, "unknown": "Nežinoma integracija „{{id}}“.", "back": "Atgal į integracijas" };
2665
+ const lt = {
2666
+ integration: integration$e
2667
+ };
2668
+ const integration$d = { "list": { "title": "Интеграции", "subtitle": "Управување со поставките на интеграциите", "browseIntegrations": "Прегледај интеграции", "learnMore": "Научете како да создавате интеграции", "searchPlaceholder": "Пребарај интеграции", "empty": "Нема регистрирани интеграции. Декларирајте даватели во options.providers на приклучокот за интеграции во medusa-config.", "emptyFiltered": "Нема интеграции што одговараат на вашите филтри.", "tested": "тестирано", "testFailed": "тестот не успеа", "tabs": { "all": "Сите" } }, "browse": { "title": "Каталог", "subtitle": "Најдете достапни интеграции", "publish": "Додај интеграција", "learnMore": "Научете како да создадете и објавите сопствена интеграција", "searchPlaceholder": "Пребарај интеграции", "by": "од {{author}}", "installed": "Инсталирано", "notInstalled": "Не е инсталирано", "add": "Додади", "settings": "Поставки", "install_docs": "Прочитај ја документацијата", "install_empty": "Упатствата за поставување на оваа интеграција сè уште не се достапни.", "install_truncated": "Овие упатства се предолги за да се прикажат овде — отворете ја документацијата." }, "columns": { "integration": "Интеграција", "description": "Опис", "category": "Категорија", "status": "Статус" }, "status": { "notConfigured": "Не е конфигурирано", "incomplete": "Незавршено", "enabled": "Овозможено", "disabled": "Оневозможено", "configured": "Конфигурирано", "connected": "Поврзано", "connectionFailed": "Поврзувањето не успеа" }, "meta": { "version": "v{{version}}", "authorPrefix": "од" }, "labels": { "category": "Категорија" }, "categories": { "payment": "Плаќања", "notification": "Известувања", "fulfillment": "Исполнување", "search": "Пребарување", "content": "Содржина", "analytics": "Аналитика", "authentication": "Автентикација", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Пазар", "feed": "Фидови", "file_providers": "Даватели на датотеки", "other": "Друго" }, "actions": { "test": "Тестирај врска", "enable": "Овозможи", "disable": "Оневозможи", "delete": "Избриши", "edit": "Уреди", "save": "Зачувај", "cancel": "Откажи" }, "delete": { "title": "Бришење на конфигурацијата", "description": "Да се отстрани зачуваната конфигурација за {{name}}? Ова дејство не може да се врати." }, "form": { "required": "{{field}} е задолжително", "invalidJson": "Неважечки JSON", "keepSecret": "•••••• – оставете празно за да го задржите", "items": "{{count}} ставки" }, "toast": { "saved": "Зачувано", "saveFailed": "Зачувувањето не успеа", "connectionOk": "Врската е успешна", "testFailed": "Тестот не успеа", "enabled": "Овозможено", "disabled": "Оневозможено", "deleted": "Конфигурацијата е избришана", "deleteFailed": "Бришењето не успеа", "updateFailed": "Ажурирањето не успеа" }, "unknown": "Непозната интеграција „{{id}}“.", "back": "Назад кон интеграциите" };
2669
+ const mk = {
2670
+ integration: integration$d
2671
+ };
2672
+ const integration$c = { "list": { "title": "Интеграциуд", "subtitle": "Интеграцийн тохиргоог удирдах", "browseIntegrations": "Интеграциудыг үзэх", "learnMore": "Интеграци хэрхэн бүтээхийг сурах", "searchPlaceholder": "Интеграци хайх", "empty": "Бүртгэгдсэн интеграци алга. medusa-config дахь интеграци залгаасын options.providers-д үйлчилгээ үзүүлэгчдийг зарлана уу.", "emptyFiltered": "Таны шүүлтүүрт тохирох интеграци алга.", "tested": "шалгасан", "testFailed": "шалгалт амжилтгүй", "tabs": { "all": "Бүгд" } }, "browse": { "title": "Каталог", "subtitle": "Боломжтой интеграциудыг олох", "publish": "Интеграци нэмэх", "learnMore": "Өөрийн интеграцийг хэрхэн бүтээж нийтлэхийг сурах", "searchPlaceholder": "Интеграци хайх", "by": "{{author}}-ээс", "installed": "Суулгасан", "notInstalled": "Суулгаагүй", "add": "Нэмэх", "settings": "Тохиргоо", "install_docs": "Баримтжуулалтыг унших", "install_empty": "Энэ интеграцийн тохируулгын заавар хараахан бэлэн болоогүй байна.", "install_truncated": "Энэ заавар энд харуулахад хэт урт байна — баримтжуулалтыг нээнэ үү." }, "columns": { "integration": "Интеграци", "description": "Тайлбар", "category": "Ангилал", "status": "Төлөв" }, "status": { "notConfigured": "Тохируулаагүй", "incomplete": "Дуусаагүй", "enabled": "Идэвхтэй", "disabled": "Идэвхгүй", "configured": "Тохируулсан", "connected": "Холбогдсон", "connectionFailed": "Холболт амжилтгүй" }, "meta": { "version": "v{{version}}", "authorPrefix": "зохиогч" }, "labels": { "category": "Ангилал" }, "categories": { "payment": "Төлбөр", "notification": "Мэдэгдэл", "fulfillment": "Биелэлт", "search": "Хайлт", "content": "Контент", "analytics": "Аналитик", "authentication": "Баталгаажуулалт", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Маркетплейс", "feed": "Фийд", "file_providers": "Файлын үйлчилгээ үзүүлэгчид", "other": "Бусад" }, "actions": { "test": "Холболтыг шалгах", "enable": "Идэвхжүүлэх", "disable": "Идэвхгүй болгох", "delete": "Устгах", "edit": "Засварлах", "save": "Хадгалах", "cancel": "Цуцлах" }, "delete": { "title": "Тохиргоог устгах", "description": "{{name}}-ийн хадгалагдсан тохиргоог устгах уу? Энэ үйлдлийг буцаах боломжгүй." }, "form": { "required": "{{field}} шаардлагатай", "invalidJson": "Буруу JSON", "keepSecret": "•••••• – хэвээр үлдээхийн тулд хоосон орхино уу", "items": "{{count}} зүйл" }, "toast": { "saved": "Хадгалагдлаа", "saveFailed": "Хадгалахад алдаа гарлаа", "connectionOk": "Холболт амжилттай", "testFailed": "Шалгалт амжилтгүй боллоо", "enabled": "Идэвхжлээ", "disabled": "Идэвхгүй боллоо", "deleted": "Тохиргоог устгалаа", "deleteFailed": "Устгахад алдаа гарлаа", "updateFailed": "Шинэчлэхэд алдаа гарлаа" }, "unknown": "Тодорхойгүй интеграци «{{id}}».", "back": "Интеграциуд руу буцах" };
2673
+ const mn = {
2674
+ integration: integration$c
2675
+ };
2676
+ const integration$b = { "list": { "title": "Integraties", "subtitle": "Beheer de instellingen van integraties", "browseIntegrations": "Integraties bekijken", "learnMore": "Leer hoe je integraties bouwt", "searchPlaceholder": "Integraties zoeken", "empty": "Geen integraties geregistreerd. Declareer providers in options.providers van de integratieplug-in in medusa-config.", "emptyFiltered": "Geen integraties komen overeen met je filters.", "tested": "getest", "testFailed": "test mislukt", "tabs": { "all": "Alle" } }, "browse": { "title": "Catalogus", "subtitle": "Vind beschikbare integraties", "publish": "Integratie toevoegen", "learnMore": "Leer hoe je je eigen integratie bouwt en publiceert", "searchPlaceholder": "Integraties zoeken", "by": "door {{author}}", "installed": "Geïnstalleerd", "notInstalled": "Niet geïnstalleerd", "add": "Toevoegen", "settings": "Instellingen", "install_docs": "Documentatie lezen", "install_empty": "Installatie-instructies voor deze integratie zijn nog niet beschikbaar.", "install_truncated": "Deze instructies zijn te lang om hier te tonen — open de documentatie." }, "columns": { "integration": "Integratie", "description": "Beschrijving", "category": "Categorie", "status": "Status" }, "status": { "notConfigured": "Niet geconfigureerd", "incomplete": "Onvolledig", "enabled": "Ingeschakeld", "disabled": "Uitgeschakeld", "configured": "Geconfigureerd", "connected": "Verbonden", "connectionFailed": "Verbinding mislukt" }, "meta": { "version": "v{{version}}", "authorPrefix": "door" }, "labels": { "category": "Categorie" }, "categories": { "payment": "Betalingen", "notification": "Notificaties", "fulfillment": "Verzending", "search": "Zoeken", "content": "Content", "analytics": "Analytics", "authentication": "Authenticatie", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marktplaats", "feed": "Feeds", "file_providers": "Bestandsproviders", "other": "Overig" }, "actions": { "test": "Verbinding testen", "enable": "Inschakelen", "disable": "Uitschakelen", "delete": "Verwijderen", "edit": "Bewerken", "save": "Opslaan", "cancel": "Annuleren" }, "delete": { "title": "Configuratie verwijderen", "description": "De opgeslagen configuratie voor {{name}} verwijderen? Deze actie kan niet ongedaan worden gemaakt." }, "form": { "required": "{{field}} is verplicht", "invalidJson": "Ongeldige JSON", "keepSecret": "•••••• – laat leeg om te behouden", "items": "{{count}} items" }, "toast": { "saved": "Opgeslagen", "saveFailed": "Opslaan mislukt", "connectionOk": "Verbinding OK", "testFailed": "Test mislukt", "enabled": "Ingeschakeld", "disabled": "Uitgeschakeld", "deleted": "Configuratie verwijderd", "deleteFailed": "Verwijderen mislukt", "updateFailed": "Bijwerken mislukt" }, "unknown": 'Onbekende integratie "{{id}}".', "back": "Terug naar integraties" };
2677
+ const nl = {
2678
+ integration: integration$b
2679
+ };
2680
+ const integration$a = { "list": { "title": "Integracje", "subtitle": "Zarządzaj ustawieniami integracji", "browseIntegrations": "Przeglądaj integracje", "learnMore": "Dowiedz się, jak tworzyć integracje", "searchPlaceholder": "Szukaj integracji", "empty": "Brak zarejestrowanych integracji. Zadeklaruj dostawców w options.providers wtyczki integracji w medusa-config.", "emptyFiltered": "Żadna integracja nie pasuje do filtrów.", "tested": "przetestowano", "testFailed": "test nieudany", "tabs": { "all": "Wszystkie" } }, "browse": { "title": "Katalog", "subtitle": "Znajdź dostępne integracje", "publish": "Dodaj integrację", "learnMore": "Dowiedz się, jak stworzyć i opublikować własną integrację", "searchPlaceholder": "Szukaj integracji", "by": "od {{author}}", "installed": "Zainstalowano", "notInstalled": "Niezainstalowano", "add": "Dodaj", "settings": "Ustawienia", "install_docs": "Przeczytaj dokumentację", "install_empty": "Instrukcja konfiguracji tej integracji nie jest jeszcze dostępna.", "install_truncated": "Ta instrukcja jest zbyt długa, aby wyświetlić ją tutaj — otwórz dokumentację." }, "columns": { "integration": "Integracja", "description": "Opis", "category": "Kategoria", "status": "Status" }, "status": { "notConfigured": "Nieskonfigurowane", "incomplete": "Niekompletne", "enabled": "Włączone", "disabled": "Wyłączone", "configured": "Skonfigurowane", "connected": "Połączono", "connectionFailed": "Połączenie nieudane" }, "meta": { "version": "v{{version}}", "authorPrefix": "od" }, "labels": { "category": "Kategoria" }, "categories": { "payment": "Płatności", "notification": "Powiadomienia", "fulfillment": "Realizacja", "search": "Wyszukiwanie", "content": "Treść", "analytics": "Analityka", "authentication": "Uwierzytelnianie", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Kanały", "file_providers": "Dostawcy plików", "other": "Inne" }, "actions": { "test": "Testuj połączenie", "enable": "Włącz", "disable": "Wyłącz", "delete": "Usuń", "edit": "Edytuj", "save": "Zapisz", "cancel": "Anuluj" }, "delete": { "title": "Usuń konfigurację", "description": "Usunąć zapisaną konfigurację dla {{name}}? Tej akcji nie można cofnąć." }, "form": { "required": "{{field}} jest wymagane", "invalidJson": "Nieprawidłowy JSON", "keepSecret": "•••••• – pozostaw puste, aby zachować", "items": "{{count}} elementów" }, "toast": { "saved": "Zapisano", "saveFailed": "Nie udało się zapisać", "connectionOk": "Połączenie OK", "testFailed": "Test nieudany", "enabled": "Włączono", "disabled": "Wyłączono", "deleted": "Konfiguracja usunięta", "deleteFailed": "Nie udało się usunąć", "updateFailed": "Nie udało się zaktualizować" }, "unknown": "Nieznana integracja „{{id}}”.", "back": "Powrót do integracji" };
2681
+ const pl = {
2682
+ integration: integration$a
2683
+ };
2684
+ const integration$9 = { "list": { "title": "Integrações", "subtitle": "Gerencie as configurações das integrações", "browseIntegrations": "Explorar integrações", "learnMore": "Aprenda a criar integrações", "searchPlaceholder": "Buscar integrações", "empty": "Nenhuma integração registrada. Declare os provedores em options.providers do plugin de integrações no medusa-config.", "emptyFiltered": "Nenhuma integração corresponde aos seus filtros.", "tested": "testado", "testFailed": "falha no teste", "tabs": { "all": "Todas" } }, "browse": { "title": "Catálogo", "subtitle": "Encontre integrações disponíveis", "publish": "Adicionar integração", "learnMore": "Aprenda a criar e publicar sua própria integração", "searchPlaceholder": "Buscar integrações", "by": "por {{author}}", "installed": "Instalado", "notInstalled": "Não instalado", "add": "Adicionar", "settings": "Configurações", "install_docs": "Ler documentação", "install_empty": "As instruções de configuração desta integração ainda não estão disponíveis.", "install_truncated": "Estas instruções são longas demais para exibir aqui — abra a documentação." }, "columns": { "integration": "Integração", "description": "Descrição", "category": "Categoria", "status": "Status" }, "status": { "notConfigured": "Não configurado", "incomplete": "Incompleto", "enabled": "Habilitado", "disabled": "Desabilitado", "configured": "Configurado", "connected": "Conectado", "connectionFailed": "Falha na conexão" }, "meta": { "version": "v{{version}}", "authorPrefix": "por" }, "labels": { "category": "Categoria" }, "categories": { "payment": "Pagamentos", "notification": "Notificações", "fulfillment": "Atendimento", "search": "Busca", "content": "Conteúdo", "analytics": "Análises", "authentication": "Autenticação", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feeds", "file_providers": "Provedores de arquivos", "other": "Outros" }, "actions": { "test": "Testar conexão", "enable": "Habilitar", "disable": "Desabilitar", "delete": "Excluir", "edit": "Editar", "save": "Salvar", "cancel": "Cancelar" }, "delete": { "title": "Excluir configuração", "description": "Remover a configuração salva de {{name}}? Esta ação não pode ser desfeita." }, "form": { "required": "{{field}} é obrigatório", "invalidJson": "JSON inválido", "keepSecret": "•••••• – deixe em branco para manter", "items": "{{count}} itens" }, "toast": { "saved": "Salvo", "saveFailed": "Falha ao salvar", "connectionOk": "Conexão OK", "testFailed": "Falha no teste", "enabled": "Habilitado", "disabled": "Desabilitado", "deleted": "Configuração excluída", "deleteFailed": "Falha ao excluir", "updateFailed": "Falha ao atualizar" }, "unknown": 'Integração desconhecida "{{id}}".', "back": "Voltar para integrações" };
2685
+ const ptBR = {
2686
+ integration: integration$9
2687
+ };
2688
+ const integration$8 = { "list": { "title": "Integrações", "subtitle": "Gere as definições das integrações", "browseIntegrations": "Explorar integrações", "learnMore": "Aprende a criar integrações", "searchPlaceholder": "Pesquisar integrações", "empty": "Nenhuma integração registada. Declara os fornecedores em options.providers do plugin de integrações no medusa-config.", "emptyFiltered": "Nenhuma integração corresponde aos teus filtros.", "tested": "testado", "testFailed": "falha no teste", "tabs": { "all": "Todas" } }, "browse": { "title": "Catálogo", "subtitle": "Encontra integrações disponíveis", "publish": "Adicionar integração", "learnMore": "Aprende a criar e publicar a tua própria integração", "searchPlaceholder": "Pesquisar integrações", "by": "por {{author}}", "installed": "Instalado", "notInstalled": "Não instalado", "add": "Adicionar", "settings": "Definições", "install_docs": "Ler documentação", "install_empty": "As instruções de configuração desta integração ainda não estão disponíveis.", "install_truncated": "Estas instruções são demasiado longas para mostrar aqui — abre a documentação." }, "columns": { "integration": "Integração", "description": "Descrição", "category": "Categoria", "status": "Estado" }, "status": { "notConfigured": "Não configurado", "incomplete": "Incompleto", "enabled": "Ativado", "disabled": "Desativado", "configured": "Configurado", "connected": "Ligado", "connectionFailed": "Falha na ligação" }, "meta": { "version": "v{{version}}", "authorPrefix": "por" }, "labels": { "category": "Categoria" }, "categories": { "payment": "Pagamentos", "notification": "Notificações", "fulfillment": "Cumprimento", "search": "Pesquisa", "content": "Conteúdo", "analytics": "Análises", "authentication": "Autenticação", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feeds", "file_providers": "Fornecedores de ficheiros", "other": "Outros" }, "actions": { "test": "Testar ligação", "enable": "Ativar", "disable": "Desativar", "delete": "Eliminar", "edit": "Editar", "save": "Guardar", "cancel": "Cancelar" }, "delete": { "title": "Eliminar configuração", "description": "Remover a configuração guardada de {{name}}? Esta ação não pode ser anulada." }, "form": { "required": "{{field}} é obrigatório", "invalidJson": "JSON inválido", "keepSecret": "•••••• – deixa em branco para manter", "items": "{{count}} itens" }, "toast": { "saved": "Guardado", "saveFailed": "Falha ao guardar", "connectionOk": "Ligação OK", "testFailed": "Falha no teste", "enabled": "Ativado", "disabled": "Desativado", "deleted": "Configuração eliminada", "deleteFailed": "Falha ao eliminar", "updateFailed": "Falha ao atualizar" }, "unknown": "Integração desconhecida «{{id}}».", "back": "Voltar às integrações" };
2689
+ const ptPT = {
2690
+ integration: integration$8
2691
+ };
2692
+ const integration$7 = { "list": { "title": "Integrări", "subtitle": "Gestionează setările integrărilor", "browseIntegrations": "Răsfoiește integrările", "learnMore": "Află cum să creezi integrări", "searchPlaceholder": "Caută integrări", "empty": "Nicio integrare înregistrată. Declară furnizorii în options.providers al pluginului de integrări din medusa-config.", "emptyFiltered": "Nicio integrare nu corespunde filtrelor.", "tested": "testat", "testFailed": "testul a eșuat", "tabs": { "all": "Toate" } }, "browse": { "title": "Catalog", "subtitle": "Găsește integrările disponibile", "publish": "Adaugă integrare", "learnMore": "Află cum să creezi și să publici propria integrare", "searchPlaceholder": "Caută integrări", "by": "de {{author}}", "installed": "Instalat", "notInstalled": "Neinstalat", "add": "Adaugă", "settings": "Setări", "install_docs": "Citește documentația", "install_empty": "Instrucțiunile de configurare pentru această integrare nu sunt încă disponibile.", "install_truncated": "Aceste instrucțiuni sunt prea lungi pentru a fi afișate aici — deschide documentația." }, "columns": { "integration": "Integrare", "description": "Descriere", "category": "Categorie", "status": "Stare" }, "status": { "notConfigured": "Neconfigurat", "incomplete": "Incomplet", "enabled": "Activat", "disabled": "Dezactivat", "configured": "Configurat", "connected": "Conectat", "connectionFailed": "Conectarea a eșuat" }, "meta": { "version": "v{{version}}", "authorPrefix": "de" }, "labels": { "category": "Categorie" }, "categories": { "payment": "Plăți", "notification": "Notificări", "fulfillment": "Îndeplinire", "search": "Căutare", "content": "Conținut", "analytics": "Analize", "authentication": "Autentificare", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Fluxuri", "file_providers": "Furnizori de fișiere", "other": "Altele" }, "actions": { "test": "Testează conexiunea", "enable": "Activează", "disable": "Dezactivează", "delete": "Șterge", "edit": "Editează", "save": "Salvează", "cancel": "Anulează" }, "delete": { "title": "Șterge configurația", "description": "Elimini configurația salvată pentru {{name}}? Această acțiune nu poate fi anulată." }, "form": { "required": "{{field}} este obligatoriu", "invalidJson": "JSON invalid", "keepSecret": "•••••• – lasă gol pentru a păstra", "items": "{{count}} elemente" }, "toast": { "saved": "Salvat", "saveFailed": "Salvarea a eșuat", "connectionOk": "Conexiune reușită", "testFailed": "Testul a eșuat", "enabled": "Activat", "disabled": "Dezactivat", "deleted": "Configurație ștearsă", "deleteFailed": "Ștergerea a eșuat", "updateFailed": "Actualizarea a eșuat" }, "unknown": "Integrare necunoscută „{{id}}”.", "back": "Înapoi la integrări" };
2693
+ const ro = {
2694
+ integration: integration$7
2695
+ };
2696
+ const integration$6 = { "list": { "title": "Интеграции", "subtitle": "Управление настройками интеграций", "browseIntegrations": "Найти интеграции", "learnMore": "Как создавать интеграции", "searchPlaceholder": "Поиск интеграций", "empty": "Нет зарегистрированных интеграций. Объявите провайдеров в options.providers плагина интеграций в medusa-config.", "emptyFiltered": "Нет интеграций по заданным фильтрам", "tested": "проверено", "testFailed": "ошибка проверки", "tabs": { "all": "Все" } }, "browse": { "title": "Каталог", "subtitle": "Поиск доступных интеграций", "publish": "Добавить интеграцию", "learnMore": "Как создать и опубликовать свою интеграцию", "searchPlaceholder": "Поиск интеграций", "by": "от {{author}}", "installed": "Установлено", "notInstalled": "Не установлено", "add": "Добавить", "settings": "Настройки", "install_docs": "Читать документацию", "install_empty": "Инструкция по настройке для этой интеграции пока недоступна.", "install_truncated": "Инструкция слишком длинная для показа здесь — откройте документацию." }, "columns": { "integration": "Интеграция", "description": "Описание", "category": "Категория", "status": "Статус" }, "status": { "notConfigured": "Не настроено", "incomplete": "Не завершено", "enabled": "Включено", "disabled": "Выключено", "configured": "Настроено", "connected": "Подключено", "connectionFailed": "Ошибка подключения" }, "meta": { "version": "v{{version}}", "authorPrefix": "от" }, "labels": { "category": "Категория" }, "categories": { "payment": "Платежи", "notification": "Уведомления", "fulfillment": "Доставка", "search": "Поиск", "content": "Контент", "analytics": "Аналитика", "authentication": "Аутентификация", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Маркетплейс", "feed": "Фиды", "file_providers": "Файловые провайдеры", "other": "Прочее" }, "actions": { "test": "Проверить соединение", "enable": "Включить", "disable": "Выключить", "delete": "Удалить", "edit": "Редактировать", "save": "Сохранить", "cancel": "Отмена" }, "delete": { "title": "Удалить конфигурацию", "description": "Удалить сохранённую конфигурацию «{{name}}»? Это действие необратимо." }, "form": { "required": "Поле «{{field}}» обязательно", "invalidJson": "Некорректный JSON", "keepSecret": "•••••• – оставьте пустым, чтобы не менять", "items": "{{count}} шт." }, "toast": { "saved": "Сохранено", "saveFailed": "Не удалось сохранить", "connectionOk": "Соединение установлено", "testFailed": "Проверка не удалась", "enabled": "Включено", "disabled": "Выключено", "deleted": "Конфигурация удалена", "deleteFailed": "Не удалось удалить", "updateFailed": "Не удалось обновить" }, "unknown": "Неизвестная интеграция «{{id}}».", "back": "К интеграциям" };
2795
2697
  const ru = {
2698
+ integration: integration$6
2699
+ };
2700
+ const integration$5 = { "list": { "title": "การเชื่อมต่อ", "subtitle": "จัดการการตั้งค่าการเชื่อมต่อ", "browseIntegrations": "เรียกดูการเชื่อมต่อ", "learnMore": "เรียนรู้วิธีสร้างการเชื่อมต่อ", "searchPlaceholder": "ค้นหาการเชื่อมต่อ", "empty": "ยังไม่มีการเชื่อมต่อที่ลงทะเบียน ประกาศผู้ให้บริการใน options.providers ของปลั๊กอินการเชื่อมต่อใน medusa-config", "emptyFiltered": "ไม่มีการเชื่อมต่อที่ตรงกับตัวกรองของคุณ", "tested": "ทดสอบแล้ว", "testFailed": "ทดสอบล้มเหลว", "tabs": { "all": "ทั้งหมด" } }, "browse": { "title": "แคตตาล็อก", "subtitle": "ค้นหาการเชื่อมต่อที่พร้อมใช้งาน", "publish": "เพิ่มการเชื่อมต่อ", "learnMore": "เรียนรู้วิธีสร้างและเผยแพร่การเชื่อมต่อของคุณเอง", "searchPlaceholder": "ค้นหาการเชื่อมต่อ", "by": "โดย {{author}}", "installed": "ติดตั้งแล้ว", "notInstalled": "ยังไม่ได้ติดตั้ง", "add": "เพิ่ม", "settings": "การตั้งค่า", "install_docs": "อ่านเอกสาร", "install_empty": "คำแนะนำการตั้งค่าสำหรับการเชื่อมต่อนี้ยังไม่พร้อมใช้งาน", "install_truncated": "คำแนะนำนี้ยาวเกินกว่าจะแสดงที่นี่ — เปิดเอกสารประกอบ" }, "columns": { "integration": "การเชื่อมต่อ", "description": "คำอธิบาย", "category": "หมวดหมู่", "status": "สถานะ" }, "status": { "notConfigured": "ยังไม่ได้ตั้งค่า", "incomplete": "ไม่สมบูรณ์", "enabled": "เปิดใช้งาน", "disabled": "ปิดใช้งาน", "configured": "ตั้งค่าแล้ว", "connected": "เชื่อมต่อแล้ว", "connectionFailed": "การเชื่อมต่อล้มเหลว" }, "meta": { "version": "v{{version}}", "authorPrefix": "โดย" }, "labels": { "category": "หมวดหมู่" }, "categories": { "payment": "การชำระเงิน", "notification": "การแจ้งเตือน", "fulfillment": "การจัดส่ง", "search": "ค้นหา", "content": "เนื้อหา", "analytics": "การวิเคราะห์", "authentication": "การยืนยันตัวตน", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "มาร์เก็ตเพลส", "feed": "ฟีด", "file_providers": "ผู้ให้บริการไฟล์", "other": "อื่นๆ" }, "actions": { "test": "ทดสอบการเชื่อมต่อ", "enable": "เปิดใช้งาน", "disable": "ปิดใช้งาน", "delete": "ลบ", "edit": "แก้ไข", "save": "บันทึก", "cancel": "ยกเลิก" }, "delete": { "title": "ลบการตั้งค่า", "description": "ลบการตั้งค่าที่บันทึกไว้สำหรับ {{name}} หรือไม่? การกระทำนี้ไม่สามารถย้อนกลับได้" }, "form": { "required": "ต้องระบุ {{field}}", "invalidJson": "JSON ไม่ถูกต้อง", "keepSecret": "•••••• – เว้นว่างไว้เพื่อคงค่าเดิม", "items": "{{count}} รายการ" }, "toast": { "saved": "บันทึกแล้ว", "saveFailed": "บันทึกไม่สำเร็จ", "connectionOk": "เชื่อมต่อสำเร็จ", "testFailed": "ทดสอบไม่สำเร็จ", "enabled": "เปิดใช้งานแล้ว", "disabled": "ปิดใช้งานแล้ว", "deleted": "ลบการตั้งค่าแล้ว", "deleteFailed": "ลบไม่สำเร็จ", "updateFailed": "อัปเดตไม่สำเร็จ" }, "unknown": 'ไม่รู้จักการเชื่อมต่อ "{{id}}"', "back": "กลับไปที่การเชื่อมต่อ" };
2701
+ const th = {
2702
+ integration: integration$5
2703
+ };
2704
+ const integration$4 = { "list": { "title": "Entegrasyonlar", "subtitle": "Entegrasyon ayarlarını yönetin", "browseIntegrations": "Entegrasyonlara göz atın", "learnMore": "Entegrasyonların nasıl oluşturulduğunu öğrenin", "searchPlaceholder": "Entegrasyon ara", "empty": "Kayıtlı entegrasyon yok. Sağlayıcıları medusa-config içindeki entegrasyon eklentisinin options.providers alanında tanımlayın.", "emptyFiltered": "Filtrelerinizle eşleşen entegrasyon yok.", "tested": "test edildi", "testFailed": "test başarısız", "tabs": { "all": "Tümü" } }, "browse": { "title": "Katalog", "subtitle": "Mevcut entegrasyonları bulun", "publish": "Entegrasyon ekle", "learnMore": "Kendi entegrasyonunuzu nasıl oluşturup yayımlayacağınızı öğrenin", "searchPlaceholder": "Entegrasyon ara", "by": "{{author}} tarafından", "installed": "Kurulu", "notInstalled": "Kurulu değil", "add": "Ekle", "settings": "Ayarlar", "install_docs": "Dokümantasyonu oku", "install_empty": "Bu entegrasyon için kurulum talimatları henüz mevcut değil.", "install_truncated": "Bu talimatlar burada gösterilemeyecek kadar uzun — dokümantasyonu açın." }, "columns": { "integration": "Entegrasyon", "description": "Açıklama", "category": "Kategori", "status": "Durum" }, "status": { "notConfigured": "Yapılandırılmadı", "incomplete": "Tamamlanmadı", "enabled": "Etkin", "disabled": "Devre dışı", "configured": "Yapılandırıldı", "connected": "Bağlandı", "connectionFailed": "Bağlantı başarısız" }, "meta": { "version": "v{{version}}", "authorPrefix": "geliştiren" }, "labels": { "category": "Kategori" }, "categories": { "payment": "Ödeme", "notification": "Bildirimler", "fulfillment": "Sipariş karşılama", "search": "Arama", "content": "İçerik", "analytics": "Analitik", "authentication": "Kimlik doğrulama", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Pazar yeri", "feed": "Beslemeler", "file_providers": "Dosya sağlayıcıları", "other": "Diğer" }, "actions": { "test": "Bağlantıyı test et", "enable": "Etkinleştir", "disable": "Devre dışı bırak", "delete": "Sil", "edit": "Düzenle", "save": "Kaydet", "cancel": "İptal" }, "delete": { "title": "Yapılandırmayı sil", "description": "{{name}} için kayıtlı yapılandırma kaldırılsın mı? Bu işlem geri alınamaz." }, "form": { "required": "{{field}} zorunludur", "invalidJson": "Geçersiz JSON", "keepSecret": "•••••• – korumak için boş bırakın", "items": "{{count}} öğe" }, "toast": { "saved": "Kaydedildi", "saveFailed": "Kaydetme başarısız", "connectionOk": "Bağlantı başarılı", "testFailed": "Test başarısız", "enabled": "Etkinleştirildi", "disabled": "Devre dışı bırakıldı", "deleted": "Yapılandırma silindi", "deleteFailed": "Silme başarısız", "updateFailed": "Güncelleme başarısız" }, "unknown": 'Bilinmeyen entegrasyon "{{id}}".', "back": "Entegrasyonlara dön" };
2705
+ const tr = {
2706
+ integration: integration$4
2707
+ };
2708
+ const integration$3 = { "list": { "title": "Інтеграції", "subtitle": "Керування налаштуваннями інтеграцій", "browseIntegrations": "Переглянути інтеграції", "learnMore": "Дізнайтеся, як створювати інтеграції", "searchPlaceholder": "Пошук інтеграцій", "empty": "Немає зареєстрованих інтеграцій. Оголосіть постачальників у options.providers плагіна інтеграцій у medusa-config.", "emptyFiltered": "Немає інтеграцій, що відповідають вашим фільтрам.", "tested": "перевірено", "testFailed": "помилка перевірки", "tabs": { "all": "Усі" } }, "browse": { "title": "Каталог", "subtitle": "Знайдіть доступні інтеграції", "publish": "Додати інтеграцію", "learnMore": "Дізнайтеся, як створити та опублікувати власну інтеграцію", "searchPlaceholder": "Пошук інтеграцій", "by": "від {{author}}", "installed": "Встановлено", "notInstalled": "Не встановлено", "add": "Додати", "settings": "Налаштування", "install_docs": "Читати документацію", "install_empty": "Інструкція з налаштування для цієї інтеграції поки недоступна.", "install_truncated": "Інструкція надто довга для показу тут — відкрийте документацію." }, "columns": { "integration": "Інтеграція", "description": "Опис", "category": "Категорія", "status": "Статус" }, "status": { "notConfigured": "Не налаштовано", "incomplete": "Не завершено", "enabled": "Увімкнено", "disabled": "Вимкнено", "configured": "Налаштовано", "connected": "Підключено", "connectionFailed": "Помилка підключення" }, "meta": { "version": "v{{version}}", "authorPrefix": "від" }, "labels": { "category": "Категорія" }, "categories": { "payment": "Платежі", "notification": "Сповіщення", "fulfillment": "Виконання", "search": "Пошук", "content": "Контент", "analytics": "Аналітика", "authentication": "Автентифікація", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Маркетплейс", "feed": "Фіди", "file_providers": "Файлові постачальники", "other": "Інше" }, "actions": { "test": "Перевірити з'єднання", "enable": "Увімкнути", "disable": "Вимкнути", "delete": "Видалити", "edit": "Редагувати", "save": "Зберегти", "cancel": "Скасувати" }, "delete": { "title": "Видалити конфігурацію", "description": "Видалити збережену конфігурацію для {{name}}? Цю дію неможливо скасувати." }, "form": { "required": "Поле «{{field}}» обов'язкове", "invalidJson": "Некоректний JSON", "keepSecret": "•••••• – залиште порожнім, щоб не змінювати", "items": "{{count}} шт." }, "toast": { "saved": "Збережено", "saveFailed": "Не вдалося зберегти", "connectionOk": "З'єднання встановлено", "testFailed": "Перевірка не вдалася", "enabled": "Увімкнено", "disabled": "Вимкнено", "deleted": "Конфігурацію видалено", "deleteFailed": "Не вдалося видалити", "updateFailed": "Не вдалося оновити" }, "unknown": "Невідома інтеграція «{{id}}».", "back": "До інтеграцій" };
2709
+ const uk = {
2710
+ integration: integration$3
2711
+ };
2712
+ const integration$2 = { "list": { "title": "Tích hợp", "subtitle": "Quản lý cài đặt tích hợp", "browseIntegrations": "Duyệt các tích hợp", "learnMore": "Tìm hiểu cách xây dựng tích hợp", "searchPlaceholder": "Tìm kiếm tích hợp", "empty": "Chưa có tích hợp nào được đăng ký. Khai báo nhà cung cấp trong options.providers của plugin tích hợp trong medusa-config.", "emptyFiltered": "Không có tích hợp nào khớp với bộ lọc của bạn.", "tested": "đã kiểm tra", "testFailed": "kiểm tra thất bại", "tabs": { "all": "Tất cả" } }, "browse": { "title": "Danh mục", "subtitle": "Tìm các tích hợp có sẵn", "publish": "Thêm tích hợp", "learnMore": "Tìm hiểu cách xây dựng và phát hành tích hợp của riêng bạn", "searchPlaceholder": "Tìm kiếm tích hợp", "by": "bởi {{author}}", "installed": "Đã cài đặt", "notInstalled": "Chưa cài đặt", "add": "Thêm", "settings": "Cài đặt", "install_docs": "Đọc tài liệu", "install_empty": "Hướng dẫn thiết lập cho tích hợp này chưa có sẵn.", "install_truncated": "Hướng dẫn này quá dài để hiển thị ở đây — hãy mở tài liệu." }, "columns": { "integration": "Tích hợp", "description": "Mô tả", "category": "Danh mục", "status": "Trạng thái" }, "status": { "notConfigured": "Chưa cấu hình", "incomplete": "Chưa hoàn tất", "enabled": "Đã bật", "disabled": "Đã tắt", "configured": "Đã cấu hình", "connected": "Đã kết nối", "connectionFailed": "Kết nối thất bại" }, "meta": { "version": "v{{version}}", "authorPrefix": "bởi" }, "labels": { "category": "Danh mục" }, "categories": { "payment": "Thanh toán", "notification": "Thông báo", "fulfillment": "Xử lý giao hàng", "search": "Tìm kiếm", "content": "Nội dung", "analytics": "Phân tích", "authentication": "Xác thực", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Sàn thương mại", "feed": "Nguồn cấp", "file_providers": "Nhà cung cấp tệp", "other": "Khác" }, "actions": { "test": "Kiểm tra kết nối", "enable": "Bật", "disable": "Tắt", "delete": "Xóa", "edit": "Chỉnh sửa", "save": "Lưu", "cancel": "Hủy" }, "delete": { "title": "Xóa cấu hình", "description": "Xóa cấu hình đã lưu cho {{name}}? Hành động này không thể hoàn tác." }, "form": { "required": "{{field}} là bắt buộc", "invalidJson": "JSON không hợp lệ", "keepSecret": "•••••• – để trống để giữ nguyên", "items": "{{count}} mục" }, "toast": { "saved": "Đã lưu", "saveFailed": "Lưu thất bại", "connectionOk": "Kết nối thành công", "testFailed": "Kiểm tra thất bại", "enabled": "Đã bật", "disabled": "Đã tắt", "deleted": "Đã xóa cấu hình", "deleteFailed": "Xóa thất bại", "updateFailed": "Cập nhật thất bại" }, "unknown": 'Tích hợp không xác định "{{id}}".', "back": "Quay lại tích hợp" };
2713
+ const vi = {
2714
+ integration: integration$2
2715
+ };
2716
+ const integration$1 = { "list": { "title": "集成", "subtitle": "管理集成设置", "browseIntegrations": "浏览集成", "learnMore": "了解如何构建集成", "searchPlaceholder": "搜索集成", "empty": "尚未注册任何集成。请在 medusa-config 中集成插件的 options.providers 下声明供应商。", "emptyFiltered": "没有符合筛选条件的集成。", "tested": "已测试", "testFailed": "测试失败", "tabs": { "all": "全部" } }, "browse": { "title": "目录", "subtitle": "查找可用的集成", "publish": "添加集成", "learnMore": "了解如何构建并发布你自己的集成", "searchPlaceholder": "搜索集成", "by": "由 {{author}} 提供", "installed": "已安装", "notInstalled": "未安装", "add": "添加", "settings": "设置", "install_docs": "阅读文档", "install_empty": "该集成的设置说明尚不可用。", "install_truncated": "这些说明过长,无法在此显示 — 请打开文档。" }, "columns": { "integration": "集成", "description": "描述", "category": "分类", "status": "状态" }, "status": { "notConfigured": "未配置", "incomplete": "未完成", "enabled": "已启用", "disabled": "已禁用", "configured": "已配置", "connected": "已连接", "connectionFailed": "连接失败" }, "meta": { "version": "v{{version}}", "authorPrefix": "由" }, "labels": { "category": "分类" }, "categories": { "payment": "支付", "notification": "通知", "fulfillment": "履约", "search": "搜索", "content": "内容", "analytics": "分析", "authentication": "身份验证", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "市场", "feed": "数据源", "file_providers": "文件供应商", "other": "其他" }, "actions": { "test": "测试连接", "enable": "启用", "disable": "禁用", "delete": "删除", "edit": "编辑", "save": "保存", "cancel": "取消" }, "delete": { "title": "删除配置", "description": "移除 {{name}} 的已保存配置?此操作无法撤销。" }, "form": { "required": "{{field}} 为必填项", "invalidJson": "无效的 JSON", "keepSecret": "•••••• – 留空以保持不变", "items": "{{count}} 项" }, "toast": { "saved": "已保存", "saveFailed": "保存失败", "connectionOk": "连接成功", "testFailed": "测试失败", "enabled": "已启用", "disabled": "已禁用", "deleted": "配置已删除", "deleteFailed": "删除失败", "updateFailed": "更新失败" }, "unknown": "未知集成“{{id}}”。", "back": "返回集成" };
2717
+ const zhCN = {
2718
+ integration: integration$1
2719
+ };
2720
+ const integration = { "list": { "title": "整合", "subtitle": "管理整合設定", "browseIntegrations": "瀏覽整合", "learnMore": "了解如何建立整合", "searchPlaceholder": "搜尋整合", "empty": "尚未註冊任何整合。請在 medusa-config 中整合外掛的 options.providers 下宣告提供者。", "emptyFiltered": "沒有符合篩選條件的整合。", "tested": "已測試", "testFailed": "測試失敗", "tabs": { "all": "全部" } }, "browse": { "title": "目錄", "subtitle": "尋找可用的整合", "publish": "新增整合", "learnMore": "了解如何建立並發布您自己的整合", "searchPlaceholder": "搜尋整合", "by": "由 {{author}} 提供", "installed": "已安裝", "notInstalled": "未安裝", "add": "新增", "settings": "設定", "install_docs": "閱讀說明文件", "install_empty": "此整合的設定說明尚未提供。", "install_truncated": "這些說明過長,無法在此顯示 — 請開啟說明文件。" }, "columns": { "integration": "整合", "description": "描述", "category": "分類", "status": "狀態" }, "status": { "notConfigured": "未設定", "incomplete": "未完成", "enabled": "已啟用", "disabled": "已停用", "configured": "已設定", "connected": "已連線", "connectionFailed": "連線失敗" }, "meta": { "version": "v{{version}}", "authorPrefix": "由" }, "labels": { "category": "分類" }, "categories": { "payment": "付款", "notification": "通知", "fulfillment": "出貨", "search": "搜尋", "content": "內容", "analytics": "分析", "authentication": "驗證", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "市集", "feed": "資料來源", "file_providers": "檔案提供者", "other": "其他" }, "actions": { "test": "測試連線", "enable": "啟用", "disable": "停用", "delete": "刪除", "edit": "編輯", "save": "儲存", "cancel": "取消" }, "delete": { "title": "刪除設定", "description": "移除 {{name}} 的已儲存設定?此操作無法復原。" }, "form": { "required": "{{field}} 為必填", "invalidJson": "無效的 JSON", "keepSecret": "•••••• – 留空以保持不變", "items": "{{count}} 項" }, "toast": { "saved": "已儲存", "saveFailed": "儲存失敗", "connectionOk": "連線成功", "testFailed": "測試失敗", "enabled": "已啟用", "disabled": "已停用", "deleted": "設定已刪除", "deleteFailed": "刪除失敗", "updateFailed": "更新失敗" }, "unknown": "未知的整合「{{id}}」。", "back": "返回整合" };
2721
+ const zhTW = {
2796
2722
  integration
2797
2723
  };
2798
2724
  const i18nTranslations0 = {
2725
+ ar: { translation: ar },
2726
+ bg: { translation: bg },
2727
+ bs: { translation: bs },
2728
+ cs: { translation: cs },
2729
+ de: { translation: de },
2730
+ el: { translation: el },
2799
2731
  en: { translation: en },
2800
- ru: { translation: ru }
2732
+ enGB: { translation: enGB },
2733
+ es: { translation: es },
2734
+ fa: { translation: fa },
2735
+ fr: { translation: fr },
2736
+ he: { translation: he },
2737
+ hr: { translation: hr },
2738
+ hu: { translation: hu },
2739
+ id: { translation: id },
2740
+ it: { translation: it },
2741
+ ja: { translation: ja },
2742
+ ko: { translation: ko },
2743
+ lt: { translation: lt },
2744
+ mk: { translation: mk },
2745
+ mn: { translation: mn },
2746
+ nl: { translation: nl },
2747
+ pl: { translation: pl },
2748
+ ptBR: { translation: ptBR },
2749
+ ptPT: { translation: ptPT },
2750
+ ro: { translation: ro },
2751
+ ru: { translation: ru },
2752
+ th: { translation: th },
2753
+ tr: { translation: tr },
2754
+ uk: { translation: uk },
2755
+ vi: { translation: vi },
2756
+ zhCN: { translation: zhCN },
2757
+ zhTW: { translation: zhTW }
2801
2758
  };
2802
2759
  const widgetModule = { widgets: [] };
2803
2760
  const routeModule = {
@@ -2808,13 +2765,13 @@ const routeModule = {
2808
2765
  handle: { label: config.label, translationNs: config.translationNs, ...handle$2 }
2809
2766
  },
2810
2767
  {
2811
- Component: BrowsePage,
2812
- path: "/settings/integrations/browse",
2768
+ Component: EditPage,
2769
+ path: "/settings/integrations/:provider_id",
2813
2770
  handle: handle$1
2814
2771
  },
2815
2772
  {
2816
- Component: EditPage,
2817
- path: "/settings/integrations/:provider_id",
2773
+ Component: BrowsePage,
2774
+ path: "/settings/integrations/browse",
2818
2775
  handle
2819
2776
  }
2820
2777
  ]