@open-mercato/core 0.7.1-develop.7153.1.7145d295e6 → 0.7.1-develop.7170.1.d95074d7ba

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/AGENTS.md +2 -2
  3. package/dist/modules/auth/commands/users.js +14 -1
  4. package/dist/modules/auth/commands/users.js.map +2 -2
  5. package/dist/modules/auth/data/entities.js +2 -2
  6. package/dist/modules/auth/data/entities.js.map +2 -2
  7. package/dist/modules/auth/lib/backendChrome.js +26 -3
  8. package/dist/modules/auth/lib/backendChrome.js.map +2 -2
  9. package/dist/modules/auth/lib/profile-sections.js +1 -1
  10. package/dist/modules/auth/lib/profile-sections.js.map +2 -2
  11. package/dist/modules/auth/migrations/Migration20260907120000_auth.js +19 -0
  12. package/dist/modules/auth/migrations/Migration20260907120000_auth.js.map +7 -0
  13. package/dist/modules/communication_channels/backend/profile/communication-channels/page.meta.js +2 -2
  14. package/dist/modules/communication_channels/backend/profile/communication-channels/page.meta.js.map +1 -1
  15. package/dist/modules/customer_accounts/api/admin/demo-accounts.js +118 -0
  16. package/dist/modules/customer_accounts/api/admin/demo-accounts.js.map +7 -0
  17. package/dist/modules/customer_accounts/api/invitations/accept.js +23 -6
  18. package/dist/modules/customer_accounts/api/invitations/accept.js.map +2 -2
  19. package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js +10 -13
  20. package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js.map +2 -2
  21. package/dist/modules/customer_accounts/backend/customer_accounts/useDemoPortalAccounts.js +28 -0
  22. package/dist/modules/customer_accounts/backend/customer_accounts/useDemoPortalAccounts.js.map +7 -0
  23. package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +6 -1
  24. package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +2 -2
  25. package/dist/modules/customer_accounts/data/entities.js +4 -1
  26. package/dist/modules/customer_accounts/data/entities.js.map +2 -2
  27. package/dist/modules/customer_accounts/lib/exampleAccounts.js +9 -0
  28. package/dist/modules/customer_accounts/lib/exampleAccounts.js.map +7 -0
  29. package/dist/modules/customer_accounts/migrations/Migration20260827160000_customer_accounts.js +16 -0
  30. package/dist/modules/customer_accounts/migrations/Migration20260827160000_customer_accounts.js.map +7 -0
  31. package/dist/modules/customer_accounts/services/customerInvitationService.js +53 -6
  32. package/dist/modules/customer_accounts/services/customerInvitationService.js.map +2 -2
  33. package/dist/modules/customer_accounts/setup.js +2 -6
  34. package/dist/modules/customer_accounts/setup.js.map +2 -2
  35. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +55 -40
  36. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
  37. package/dist/modules/customers/commands/people.js +16 -1
  38. package/dist/modules/customers/commands/people.js.map +2 -2
  39. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js +18 -36
  40. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js.map +2 -2
  41. package/dist/modules/data_sync/lib/sync-schedule-service.js +25 -23
  42. package/dist/modules/data_sync/lib/sync-schedule-service.js.map +2 -2
  43. package/dist/modules/entities/api/records.js +18 -15
  44. package/dist/modules/entities/api/records.js.map +3 -3
  45. package/dist/modules/entities/lib/scoped-field-defs.js +52 -0
  46. package/dist/modules/entities/lib/scoped-field-defs.js.map +7 -0
  47. package/dist/modules/entities/lib/validation.js +4 -35
  48. package/dist/modules/entities/lib/validation.js.map +2 -2
  49. package/dist/modules/integrations/backend/integrations/[id]/page.js +32 -54
  50. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  51. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +12 -29
  52. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
  53. package/dist/modules/notifications/backend/profile/notification-preferences/page.meta.js +2 -2
  54. package/dist/modules/notifications/backend/profile/notification-preferences/page.meta.js.map +1 -1
  55. package/dist/modules/progress/lib/progressServiceImpl.js +14 -3
  56. package/dist/modules/progress/lib/progressServiceImpl.js.map +2 -2
  57. package/dist/modules/sales/backend/sales/documents/[id]/page.js +9 -9
  58. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  59. package/dist/modules/sales/components/documents/LineItemDialog.js +50 -10
  60. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  61. package/dist/modules/sales/components/documents/PaymentsSection.js +8 -3
  62. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  63. package/dist/modules/sales/components/documents/ReturnEditDialog.js +2 -7
  64. package/dist/modules/sales/components/documents/ReturnEditDialog.js.map +2 -2
  65. package/dist/modules/sales/components/documents/ReturnsSection.js +2 -7
  66. package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
  67. package/dist/modules/sales/components/documents/ShipmentsSection.js +3 -8
  68. package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
  69. package/package.json +7 -7
  70. package/src/modules/auth/commands/users.ts +14 -1
  71. package/src/modules/auth/data/entities.ts +2 -2
  72. package/src/modules/auth/lib/backendChrome.tsx +46 -2
  73. package/src/modules/auth/lib/profile-sections.tsx +14 -3
  74. package/src/modules/auth/migrations/.snapshot-open-mercato.json +4 -2
  75. package/src/modules/auth/migrations/Migration20260907120000_auth.ts +21 -0
  76. package/src/modules/communication_channels/backend/profile/communication-channels/page.meta.ts +2 -2
  77. package/src/modules/customer_accounts/AGENTS.md +3 -1
  78. package/src/modules/customer_accounts/api/admin/demo-accounts.ts +149 -0
  79. package/src/modules/customer_accounts/api/invitations/accept.ts +23 -6
  80. package/src/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.tsx +43 -41
  81. package/src/modules/customer_accounts/backend/customer_accounts/useDemoPortalAccounts.ts +42 -0
  82. package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +10 -3
  83. package/src/modules/customer_accounts/data/entities.ts +5 -1
  84. package/src/modules/customer_accounts/i18n/de.json +4 -2
  85. package/src/modules/customer_accounts/i18n/en.json +4 -2
  86. package/src/modules/customer_accounts/i18n/es.json +4 -2
  87. package/src/modules/customer_accounts/i18n/ko.json +4 -2
  88. package/src/modules/customer_accounts/i18n/pl.json +4 -2
  89. package/src/modules/customer_accounts/lib/exampleAccounts.ts +18 -0
  90. package/src/modules/customer_accounts/migrations/.snapshot-open-mercato.json +5 -7
  91. package/src/modules/customer_accounts/migrations/Migration20260827160000_customer_accounts.ts +23 -0
  92. package/src/modules/customer_accounts/services/customerInvitationService.ts +89 -5
  93. package/src/modules/customer_accounts/setup.ts +2 -6
  94. package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +74 -41
  95. package/src/modules/customers/commands/people.ts +15 -0
  96. package/src/modules/data_sync/backend/data-sync/runs/[id]/page.tsx +19 -44
  97. package/src/modules/data_sync/lib/sync-schedule-service.ts +32 -26
  98. package/src/modules/entities/api/records.ts +24 -15
  99. package/src/modules/entities/lib/scoped-field-defs.ts +76 -0
  100. package/src/modules/entities/lib/validation.ts +5 -45
  101. package/src/modules/integrations/backend/integrations/[id]/page.tsx +33 -62
  102. package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +13 -37
  103. package/src/modules/notifications/backend/profile/notification-preferences/page.meta.ts +2 -2
  104. package/src/modules/progress/AGENTS.md +1 -1
  105. package/src/modules/progress/lib/progressServiceImpl.ts +26 -3
  106. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +19 -25
  107. package/src/modules/sales/components/documents/LineItemDialog.tsx +53 -9
  108. package/src/modules/sales/components/documents/PaymentsSection.tsx +8 -8
  109. package/src/modules/sales/components/documents/ReturnEditDialog.tsx +2 -8
  110. package/src/modules/sales/components/documents/ReturnsSection.tsx +8 -7
  111. package/src/modules/sales/components/documents/ShipmentsSection.tsx +9 -8
  112. package/src/modules/sales/i18n/de.json +2 -0
  113. package/src/modules/sales/i18n/en.json +2 -0
  114. package/src/modules/sales/i18n/es.json +2 -0
  115. package/src/modules/sales/i18n/ko.json +2 -0
  116. package/src/modules/sales/i18n/pl.json +2 -0
@@ -2,7 +2,7 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { extensionPoints } from "@open-mercato/core/modules/integrations/extension-points";
5
- import { usePathname, useRouter, useSearchParams } from "next/navigation";
5
+ import { useRouter, useSearchParams } from "next/navigation";
6
6
  import { z } from "zod";
7
7
  import { Page, PageBody } from "@open-mercato/ui/backend/Page";
8
8
  import { CrudForm } from "@open-mercato/ui/backend/CrudForm";
@@ -166,16 +166,6 @@ const CATEGORY_ICONS = {
166
166
  storage: HardDrive,
167
167
  webhook: Webhook
168
168
  };
169
- function resolveRouteId(value) {
170
- if (Array.isArray(value)) return value[0];
171
- return value;
172
- }
173
- function resolvePathnameId(pathname) {
174
- const parts = pathname.split("/").filter(Boolean);
175
- const integrationId = parts.at(-1);
176
- if (!integrationId || integrationId === "integrations" || integrationId === "bundle") return void 0;
177
- return decodeURIComponent(integrationId);
178
- }
179
169
  function buildCredentialFields(credFields, secretFieldsConfigured, t) {
180
170
  return credFields.map((field) => {
181
171
  const baseDescription = field.helpDetails ? /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
@@ -282,10 +272,9 @@ function splitLogPayload(payload) {
282
272
  return { inlineEntries, nestedEntries };
283
273
  }
284
274
  function IntegrationDetailPage({ params }) {
285
- const pathname = usePathname();
286
275
  const router = useRouter();
287
276
  const searchParams = useSearchParams();
288
- const integrationId = resolveRouteId(params?.id) ?? resolvePathnameId(pathname);
277
+ const integrationId = params?.id;
289
278
  const t = useT();
290
279
  const [detail, setDetail] = React.useState(null);
291
280
  const [isLoading, setIsLoading] = React.useState(true);
@@ -311,13 +300,9 @@ function IntegrationDetailPage({ params }) {
311
300
  isLoading: isLoadingCredentialsAccess,
312
301
  canManageCredentials
313
302
  } = useIntegrationCredentialsFeatureAccess();
314
- const resolveCurrentIntegrationId = React.useCallback(() => {
315
- return integrationId ?? (typeof window !== "undefined" ? resolvePathnameId(window.location.pathname) : void 0);
316
- }, [integrationId]);
317
303
  const loadDetail = React.useCallback(async (options) => {
318
304
  const showLoading = options?.showLoading ?? true;
319
- const currentIntegrationId = resolveCurrentIntegrationId();
320
- if (!currentIntegrationId) {
305
+ if (!integrationId) {
321
306
  if (showLoading) setIsLoading(false);
322
307
  if (showLoading) setError(t("integrations.detail.loadError", "Failed to load integration"));
323
308
  return;
@@ -327,7 +312,7 @@ function IntegrationDetailPage({ params }) {
327
312
  if (showLoading) setIsLoading(true);
328
313
  try {
329
314
  const call = await apiCall(
330
- `/api/integrations/${encodeURIComponent(currentIntegrationId)}`,
315
+ `/api/integrations/${encodeURIComponent(integrationId)}`,
331
316
  void 0,
332
317
  { fallback: null }
333
318
  );
@@ -347,12 +332,11 @@ function IntegrationDetailPage({ params }) {
347
332
  if (showLoading) setError(t("integrations.detail.loadError", "Failed to load integration"));
348
333
  if (showLoading) setIsLoading(false);
349
334
  }
350
- }, [resolveCurrentIntegrationId, t]);
335
+ }, [integrationId, t]);
351
336
  const loadCredentials = React.useCallback(async () => {
352
- const currentIntegrationId = resolveCurrentIntegrationId();
353
- if (!currentIntegrationId) return;
337
+ if (!integrationId) return;
354
338
  const call = await apiCall(
355
- `/api/integrations/${encodeURIComponent(currentIntegrationId)}/credentials`,
339
+ `/api/integrations/${encodeURIComponent(integrationId)}/credentials`,
356
340
  { headers: credentialsRequestHeaders },
357
341
  { fallback: null }
358
342
  );
@@ -362,7 +346,7 @@ function IntegrationDetailPage({ params }) {
362
346
  }
363
347
  if (call.ok && call.result?.credentials) {
364
348
  const next = { ...call.result.credentials };
365
- if (currentIntegrationId === "storage_s3") {
349
+ if (integrationId === "storage_s3") {
366
350
  const authMode = next.authMode;
367
351
  if (authMode !== "access_keys" && authMode !== "ambient") {
368
352
  const hasKeys = Boolean(next.accessKeyId || next.secretAccessKey);
@@ -372,12 +356,11 @@ function IntegrationDetailPage({ params }) {
372
356
  setCredValues(next);
373
357
  setCredentialsFormKey((current) => current + 1);
374
358
  }
375
- }, [resolveCurrentIntegrationId]);
359
+ }, [integrationId]);
376
360
  const loadLogs = React.useCallback(async () => {
377
- const currentIntegrationId = resolveCurrentIntegrationId();
378
- if (!currentIntegrationId) return;
361
+ if (!integrationId) return;
379
362
  setIsLoadingLogs(true);
380
- const params2 = new URLSearchParams({ integrationId: currentIntegrationId, pageSize: "50" });
363
+ const params2 = new URLSearchParams({ integrationId, pageSize: "50" });
381
364
  if (logLevel) params2.set("level", logLevel);
382
365
  const call = await apiCall(
383
366
  `/api/integrations/logs?${params2.toString()}`,
@@ -388,7 +371,7 @@ function IntegrationDetailPage({ params }) {
388
371
  setLogs(call.result.items);
389
372
  }
390
373
  setIsLoadingLogs(false);
391
- }, [logLevel, resolveCurrentIntegrationId]);
374
+ }, [logLevel, integrationId]);
392
375
  const detailWidgetSpotId = React.useMemo(
393
376
  () => resolveIntegrationDetailWidgetSpotId(detail?.integration ?? null, extensionPoints.hosts.legacyDetailTabs.spotId),
394
377
  [detail?.integration]
@@ -523,16 +506,15 @@ function IntegrationDetailPage({ params }) {
523
506
  void loadLogs();
524
507
  }, [loadLogs]);
525
508
  const handleToggleState = React.useCallback(async (enabled) => {
526
- const currentIntegrationId = resolveCurrentIntegrationId();
527
- if (!currentIntegrationId) return;
509
+ if (!integrationId) return;
528
510
  setIsTogglingState(true);
529
511
  try {
530
512
  const call = await runMutationWithContext({
531
513
  actionId: "toggle-state",
532
- mutationPayload: { integrationId: currentIntegrationId, isEnabled: enabled },
514
+ mutationPayload: { integrationId, isEnabled: enabled },
533
515
  operation: () => withScopedApiRequestHeaders(
534
516
  buildOptimisticLockHeader(detail?.state.updatedAt),
535
- () => apiCall(`/api/integrations/${encodeURIComponent(currentIntegrationId)}/state`, {
517
+ () => apiCall(`/api/integrations/${encodeURIComponent(integrationId)}/state`, {
536
518
  method: "PUT",
537
519
  headers: { "Content-Type": "application/json" },
538
520
  body: JSON.stringify({ isEnabled: enabled })
@@ -558,15 +540,14 @@ function IntegrationDetailPage({ params }) {
558
540
  } finally {
559
541
  setIsTogglingState(false);
560
542
  }
561
- }, [detail?.state.updatedAt, refreshDetail, resolveCurrentIntegrationId, runMutationWithContext, t]);
543
+ }, [detail?.state.updatedAt, refreshDetail, integrationId, runMutationWithContext, t]);
562
544
  const handleSaveCredentials = React.useCallback(async (values) => {
563
- const currentIntegrationId = resolveCurrentIntegrationId();
564
- if (!currentIntegrationId) return;
545
+ if (!integrationId) return;
565
546
  setIsSavingCredentials(true);
566
547
  try {
567
548
  const credentialFields = detail?.integration.credentials?.fields ?? detail?.bundle?.credentials?.fields ?? [];
568
549
  const savePayload = buildIntegrationCredentialSavePayload(
569
- currentIntegrationId,
550
+ integrationId,
570
551
  values,
571
552
  credentialFields,
572
553
  secretFieldsConfigured
@@ -574,10 +555,10 @@ function IntegrationDetailPage({ params }) {
574
555
  const call = await runMutationWithContext({
575
556
  actionId: "save-credentials",
576
557
  tabId: "credentials",
577
- mutationPayload: { integrationId: currentIntegrationId, ...savePayload },
558
+ mutationPayload: { integrationId, ...savePayload },
578
559
  operation: () => withScopedApiRequestHeaders(
579
560
  buildOptimisticLockHeader(credentialsUpdatedAt),
580
- () => apiCall(`/api/integrations/${encodeURIComponent(currentIntegrationId)}/credentials`, {
561
+ () => apiCall(`/api/integrations/${encodeURIComponent(integrationId)}/credentials`, {
581
562
  method: "PUT",
582
563
  headers: { "Content-Type": "application/json" },
583
564
  body: JSON.stringify(savePayload)
@@ -597,18 +578,17 @@ function IntegrationDetailPage({ params }) {
597
578
  } finally {
598
579
  setIsSavingCredentials(false);
599
580
  }
600
- }, [credentialsUpdatedAt, detail, loadCredentials, resolveCurrentIntegrationId, runMutationWithContext, secretFieldsConfigured, t]);
581
+ }, [credentialsUpdatedAt, detail, loadCredentials, integrationId, runMutationWithContext, secretFieldsConfigured, t]);
601
582
  const handleVersionChange = React.useCallback(async (version) => {
602
- const currentIntegrationId = resolveCurrentIntegrationId();
603
- if (!currentIntegrationId) return;
583
+ if (!integrationId) return;
604
584
  try {
605
585
  const call = await runMutationWithContext({
606
586
  actionId: "change-version",
607
587
  tabId: "version",
608
- mutationPayload: { integrationId: currentIntegrationId, apiVersion: version },
588
+ mutationPayload: { integrationId, apiVersion: version },
609
589
  operation: () => withScopedApiRequestHeaders(
610
590
  buildOptimisticLockHeader(detail?.state.updatedAt),
611
- () => apiCall(`/api/integrations/${encodeURIComponent(currentIntegrationId)}/version`, {
591
+ () => apiCall(`/api/integrations/${encodeURIComponent(integrationId)}/version`, {
612
592
  method: "PUT",
613
593
  headers: { "Content-Type": "application/json" },
614
594
  body: JSON.stringify({ apiVersion: version })
@@ -625,18 +605,17 @@ function IntegrationDetailPage({ params }) {
625
605
  } catch {
626
606
  flash(t("integrations.detail.version.saveError"), "error");
627
607
  }
628
- }, [detail?.state.updatedAt, refreshDetail, resolveCurrentIntegrationId, runMutationWithContext, t]);
608
+ }, [detail?.state.updatedAt, refreshDetail, integrationId, runMutationWithContext, t]);
629
609
  const handleHealthCheck = React.useCallback(async () => {
630
- const currentIntegrationId = resolveCurrentIntegrationId();
631
- if (!currentIntegrationId) return;
610
+ if (!integrationId) return;
632
611
  setIsCheckingHealth(true);
633
612
  try {
634
613
  const call = await runMutationWithContext({
635
614
  actionId: "run-health-check",
636
615
  tabId: "health",
637
- mutationPayload: { integrationId: currentIntegrationId },
616
+ mutationPayload: { integrationId },
638
617
  operation: () => apiCall(
639
- `/api/integrations/${encodeURIComponent(currentIntegrationId)}/health`,
618
+ `/api/integrations/${encodeURIComponent(integrationId)}/health`,
640
619
  { method: "POST" },
641
620
  { fallback: null }
642
621
  )
@@ -663,7 +642,7 @@ function IntegrationDetailPage({ params }) {
663
642
  } finally {
664
643
  setIsCheckingHealth(false);
665
644
  }
666
- }, [refreshLogs, resolveCurrentIntegrationId, runMutationWithContext, t]);
645
+ }, [refreshLogs, integrationId, runMutationWithContext, t]);
667
646
  const hasVersions = Boolean(detail?.integration.apiVersions?.length);
668
647
  const integration = detail?.integration ?? null;
669
648
  const state = detail?.state ?? null;
@@ -794,17 +773,16 @@ function IntegrationDetailPage({ params }) {
794
773
  setActiveTab(resolveRequestedIntegrationDetailTab(searchParams?.get("tab"), visibleTabIds));
795
774
  }, [searchParams, visibleTabIds]);
796
775
  const handleTabChange = React.useCallback((nextValue) => {
797
- const currentIntegrationId = resolveCurrentIntegrationId();
798
776
  const nextTab = resolveRequestedIntegrationDetailTab(nextValue, visibleTabIds);
799
777
  setActiveTab(nextTab);
800
- if (!currentIntegrationId) return;
801
- const basePath = `/backend/integrations/${encodeURIComponent(currentIntegrationId)}`;
778
+ if (!integrationId) return;
779
+ const basePath = `/backend/integrations/${encodeURIComponent(integrationId)}`;
802
780
  const params2 = new URLSearchParams(searchParams?.toString() ?? "");
803
781
  if (nextTab === "credentials") params2.delete("tab");
804
782
  else params2.set("tab", nextTab);
805
783
  const query = params2.toString();
806
784
  router.replace(query ? `${basePath}?${query}` : basePath);
807
- }, [resolveCurrentIntegrationId, router, searchParams, visibleTabIds]);
785
+ }, [integrationId, router, searchParams, visibleTabIds]);
808
786
  React.useEffect(() => {
809
787
  if (!runIdFromUrl) {
810
788
  setActiveRunDetail(null);