@open-mercato/core 0.6.8-develop.7101.1.bd9356828a → 0.7.1-develop.7102.1.b41f7e3e51

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 (159) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/modules/auth/api/login.js +19 -0
  3. package/dist/modules/auth/api/login.js.map +2 -2
  4. package/dist/modules/auth/api/routeError.js +11 -0
  5. package/dist/modules/auth/api/routeError.js.map +7 -0
  6. package/dist/modules/auth/api/users/acl/route.js +23 -7
  7. package/dist/modules/auth/api/users/acl/route.js.map +2 -2
  8. package/dist/modules/business_rules/backend/rules/[id]/page.meta.js +6 -1
  9. package/dist/modules/business_rules/backend/rules/[id]/page.meta.js.map +2 -2
  10. package/dist/modules/business_rules/backend/rules/create/page.meta.js +5 -1
  11. package/dist/modules/business_rules/backend/rules/create/page.meta.js.map +2 -2
  12. package/dist/modules/business_rules/backend/sets/[id]/page.meta.js +6 -1
  13. package/dist/modules/business_rules/backend/sets/[id]/page.meta.js.map +2 -2
  14. package/dist/modules/business_rules/backend/sets/create/page.meta.js +5 -1
  15. package/dist/modules/business_rules/backend/sets/create/page.meta.js.map +2 -2
  16. package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js +84 -0
  17. package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js.map +7 -0
  18. package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js +7 -81
  19. package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js.map +2 -2
  20. package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +525 -0
  21. package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +7 -0
  22. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js +731 -0
  23. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js.map +7 -0
  24. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +7 -727
  25. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
  26. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +7 -521
  27. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
  28. package/dist/modules/customer_accounts/extension-points.js +1 -1
  29. package/dist/modules/customer_accounts/extension-points.js.map +2 -2
  30. package/dist/modules/customer_accounts/lib/portalUrl.js +69 -0
  31. package/dist/modules/customer_accounts/lib/portalUrl.js.map +7 -0
  32. package/dist/modules/customers/backend/customers/companies/page.js +2 -2
  33. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  34. package/dist/modules/customers/backend/customers/deals/page.js +2 -2
  35. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  36. package/dist/modules/customers/backend/customers/people/page.js +2 -2
  37. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  38. package/dist/modules/customers/components/detail/AssignRoleDialog.js +33 -28
  39. package/dist/modules/customers/components/detail/AssignRoleDialog.js.map +2 -2
  40. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +3 -1
  41. package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +2 -2
  42. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +1 -0
  43. package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +2 -2
  44. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +4 -1
  45. package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +2 -2
  46. package/dist/modules/eudr/backend/eudr/page.meta.js +2 -2
  47. package/dist/modules/eudr/backend/eudr/page.meta.js.map +2 -2
  48. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +8 -2
  49. package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +2 -2
  50. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +3 -1
  51. package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +2 -2
  52. package/dist/modules/eudr/backend/eudr/plots/create/page.js +8 -2
  53. package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +2 -2
  54. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +1 -0
  55. package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +2 -2
  56. package/dist/modules/eudr/backend/eudr/plots/page.meta.js +4 -1
  57. package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +2 -2
  58. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +3 -1
  59. package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +2 -2
  60. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +1 -0
  61. package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +2 -2
  62. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +4 -1
  63. package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +2 -2
  64. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +3 -1
  65. package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +2 -2
  66. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +1 -0
  67. package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +2 -2
  68. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +4 -1
  69. package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +2 -2
  70. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +2 -0
  71. package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +2 -2
  72. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +3 -1
  73. package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +2 -2
  74. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +1 -0
  75. package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +2 -2
  76. package/dist/modules/eudr/backend/eudr/statements/page.js +30 -25
  77. package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
  78. package/dist/modules/eudr/backend/eudr/statements/page.meta.js +4 -1
  79. package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +2 -2
  80. package/dist/modules/eudr/commands/statements.js +5 -3
  81. package/dist/modules/eudr/commands/statements.js.map +2 -2
  82. package/dist/modules/eudr/components/crudErrorI18n.js +21 -1
  83. package/dist/modules/eudr/components/crudErrorI18n.js.map +2 -2
  84. package/dist/modules/eudr/components/formConfig.js +6 -2
  85. package/dist/modules/eudr/components/formConfig.js.map +2 -2
  86. package/dist/modules/eudr/lib/statement-lifecycle.js +9 -1
  87. package/dist/modules/eudr/lib/statement-lifecycle.js.map +2 -2
  88. package/dist/modules/sales/components/documents/LineItemDialog.js +1 -1
  89. package/dist/modules/sales/components/documents/LineItemDialog.js.map +1 -1
  90. package/dist/modules/sales/widgets/injection/document-history/widget.client.js +44 -2
  91. package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
  92. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +20 -16
  93. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
  94. package/dist/modules/wms/components/backend/WmsLotDetailPage.js +10 -6
  95. package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
  96. package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +11 -7
  97. package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +2 -2
  98. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +10 -6
  99. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
  100. package/package.json +8 -8
  101. package/src/modules/auth/api/login.ts +23 -0
  102. package/src/modules/auth/api/routeError.ts +30 -0
  103. package/src/modules/auth/api/users/acl/route.ts +49 -9
  104. package/src/modules/business_rules/backend/rules/[id]/page.meta.ts +5 -0
  105. package/src/modules/business_rules/backend/rules/create/page.meta.ts +5 -1
  106. package/src/modules/business_rules/backend/sets/[id]/page.meta.ts +5 -0
  107. package/src/modules/business_rules/backend/sets/create/page.meta.ts +5 -1
  108. package/src/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.tsx +138 -0
  109. package/src/modules/customer_accounts/backend/customer_accounts/settings/page.tsx +8 -132
  110. package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +601 -0
  111. package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.tsx +838 -0
  112. package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +6 -838
  113. package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +6 -590
  114. package/src/modules/customer_accounts/extension-points.ts +1 -1
  115. package/src/modules/customer_accounts/lib/portalUrl.ts +112 -0
  116. package/src/modules/customers/backend/customers/companies/page.tsx +2 -2
  117. package/src/modules/customers/backend/customers/deals/page.tsx +2 -2
  118. package/src/modules/customers/backend/customers/people/page.tsx +2 -2
  119. package/src/modules/customers/components/detail/AssignRoleDialog.tsx +12 -7
  120. package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +2 -0
  121. package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +1 -0
  122. package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +4 -1
  123. package/src/modules/eudr/backend/eudr/page.meta.ts +2 -2
  124. package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +2 -0
  125. package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +8 -2
  126. package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +1 -0
  127. package/src/modules/eudr/backend/eudr/plots/create/page.tsx +8 -2
  128. package/src/modules/eudr/backend/eudr/plots/page.meta.ts +4 -1
  129. package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +2 -0
  130. package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +1 -0
  131. package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +4 -1
  132. package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +2 -0
  133. package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +1 -0
  134. package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +4 -1
  135. package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +2 -0
  136. package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +2 -0
  137. package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +1 -0
  138. package/src/modules/eudr/backend/eudr/statements/page.meta.ts +4 -1
  139. package/src/modules/eudr/backend/eudr/statements/page.tsx +32 -26
  140. package/src/modules/eudr/commands/statements.ts +4 -2
  141. package/src/modules/eudr/components/crudErrorI18n.ts +31 -0
  142. package/src/modules/eudr/components/formConfig.tsx +9 -1
  143. package/src/modules/eudr/i18n/de.json +3 -2
  144. package/src/modules/eudr/i18n/en.json +3 -2
  145. package/src/modules/eudr/i18n/es.json +3 -2
  146. package/src/modules/eudr/i18n/ko.json +3 -2
  147. package/src/modules/eudr/i18n/pl.json +3 -2
  148. package/src/modules/eudr/lib/statement-lifecycle.ts +8 -0
  149. package/src/modules/sales/components/documents/LineItemDialog.tsx +1 -1
  150. package/src/modules/sales/i18n/de.json +37 -0
  151. package/src/modules/sales/i18n/en.json +37 -0
  152. package/src/modules/sales/i18n/es.json +37 -0
  153. package/src/modules/sales/i18n/ko.json +37 -0
  154. package/src/modules/sales/i18n/pl.json +37 -0
  155. package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +42 -2
  156. package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +30 -26
  157. package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +21 -17
  158. package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +17 -13
  159. package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +16 -12
@@ -2,7 +2,11 @@ export const metadata = {
2
2
  requireAuth: true,
3
3
  requireFeatures: ['business_rules.manage'],
4
4
  pageTitle: 'Create Business Rule',
5
+ pageTitleKey: 'business_rules.rules.create.title',
5
6
  pageGroup: 'Business Rules',
6
7
  pageGroupKey: 'rules.nav.group',
7
- breadcrumb: [{ label: 'Business Rules', labelKey: 'rules.nav.rules' }, { label: 'Create Business Rule' }],
8
+ breadcrumb: [
9
+ { label: 'Business Rules', labelKey: 'rules.nav.rules' },
10
+ { label: 'Create Business Rule', labelKey: 'business_rules.rules.create.title' },
11
+ ],
8
12
  }
@@ -1,5 +1,10 @@
1
1
  export const metadata = {
2
2
  pageTitle: 'Edit Rule Set',
3
+ pageTitleKey: 'business_rules.sets.edit.title',
3
4
  requireAuth: true,
4
5
  requireFeatures: ['business_rules.manage_sets'],
6
+ breadcrumb: [
7
+ { label: 'Rule Sets', labelKey: 'rules.nav.sets' },
8
+ { label: 'Edit Rule Set', labelKey: 'business_rules.sets.edit.title' },
9
+ ],
5
10
  }
@@ -2,7 +2,11 @@ export const metadata = {
2
2
  requireAuth: true,
3
3
  requireFeatures: ['business_rules.manage_sets'],
4
4
  pageTitle: 'Create Rule Set',
5
+ pageTitleKey: 'business_rules.sets.create.title',
5
6
  pageGroup: 'Business Rules',
6
7
  pageGroupKey: 'rules.nav.group',
7
- breadcrumb: [{ label: 'Rule Sets', labelKey: 'rules.nav.sets' }, { label: 'Create Rule Set' }],
8
+ breadcrumb: [
9
+ { label: 'Rule Sets', labelKey: 'rules.nav.sets' },
10
+ { label: 'Create Rule Set', labelKey: 'business_rules.sets.create.title' },
11
+ ],
8
12
  }
@@ -0,0 +1,138 @@
1
+ "use client"
2
+
3
+ import { useMemo } from 'react'
4
+ import Link from 'next/link'
5
+ import { FormHeader } from '@open-mercato/ui/backend/forms'
6
+ import { Button } from '@open-mercato/ui/primitives/button'
7
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
8
+ import { buildPortalRootUrl, buildPortalUrlPattern } from '../../../lib/portalUrl'
9
+
10
+ const DEMO_CREDENTIALS = [
11
+ { email: 'alice.johnson@example.com', password: 'Password123!', role: 'Portal Admin' },
12
+ { email: 'bob.smith@example.com', password: 'Password123!', role: 'Buyer' },
13
+ { email: 'carol.white@example.com', password: 'Password123!', role: 'Viewer' },
14
+ ] as const
15
+
16
+ export type CustomerAccountsSettingsPageClientProps = {
17
+ portalOrigin: string
18
+ }
19
+
20
+ export function CustomerAccountsSettingsPageClient({ portalOrigin }: CustomerAccountsSettingsPageClientProps) {
21
+ const t = useT()
22
+
23
+ const portalUrl = useMemo(() => buildPortalUrlPattern(portalOrigin), [portalOrigin])
24
+ const portalRootUrl = useMemo(() => buildPortalRootUrl(portalOrigin), [portalOrigin])
25
+
26
+ return (
27
+ <>
28
+ <div className="px-3 py-3 md:px-6 md:py-4">
29
+ <FormHeader
30
+ mode="detail"
31
+ title={t('customer_accounts.settings.title', 'Portal Settings')}
32
+ backHref="/backend/customer_accounts/users"
33
+ backLabel={t('customer_accounts.settings.back', 'Customer Users')}
34
+ />
35
+ </div>
36
+
37
+ <div className="max-w-2xl space-y-6">
38
+ <div className="rounded-lg border p-4 space-y-3">
39
+ <h3 className="text-sm font-semibold">
40
+ {t('customer_accounts.settings.portal_access.title', 'Portal Access')}
41
+ </h3>
42
+ <div>
43
+ <p className="text-sm text-muted-foreground">
44
+ {t('customer_accounts.settings.portal_access.url_label', 'Portal URL pattern:')}
45
+ </p>
46
+ <code className="mt-1 block rounded bg-muted px-3 py-2 text-sm font-mono">
47
+ {portalUrl}
48
+ </code>
49
+ </div>
50
+ <div>
51
+ <Button type="button" variant="outline" size="sm" asChild>
52
+ <a href={portalRootUrl} target="_blank" rel="noopener noreferrer">
53
+ {t('customer_accounts.settings.portal_access.open_portal', 'Open Portal')}
54
+ </a>
55
+ </Button>
56
+ </div>
57
+ <p className="text-xs text-muted-foreground">
58
+ {t(
59
+ 'customer_accounts.settings.portal_access.slug_note',
60
+ 'The organization slug is auto-generated from the organization name. You can view and manage organizations in Directory \u2192 Organizations.',
61
+ )}
62
+ </p>
63
+ <p className="text-xs text-muted-foreground">
64
+ <Link href="/backend/directory/organizations" className="text-primary underline underline-offset-4 hover:text-primary/80">
65
+ {t('customer_accounts.settings.portal_access.manage_orgs', 'Manage Organizations')}
66
+ </Link>
67
+ </p>
68
+ </div>
69
+
70
+ <div className="rounded-lg border p-4 space-y-3">
71
+ <h3 className="text-sm font-semibold">
72
+ {t('customer_accounts.settings.demo_credentials.title', 'Demo Credentials')}
73
+ </h3>
74
+ <div className="overflow-x-auto">
75
+ <table className="w-full text-sm">
76
+ <thead>
77
+ <tr className="border-b text-left">
78
+ <th className="pb-2 pr-4 font-medium text-muted-foreground">
79
+ {t('customer_accounts.settings.demo_credentials.email', 'Email')}
80
+ </th>
81
+ <th className="pb-2 pr-4 font-medium text-muted-foreground">
82
+ {t('customer_accounts.settings.demo_credentials.password', 'Password')}
83
+ </th>
84
+ <th className="pb-2 font-medium text-muted-foreground">
85
+ {t('customer_accounts.settings.demo_credentials.role', 'Role')}
86
+ </th>
87
+ </tr>
88
+ </thead>
89
+ <tbody>
90
+ {DEMO_CREDENTIALS.map((cred) => (
91
+ <tr key={cred.email} className="border-b last:border-0">
92
+ <td className="py-2 pr-4 font-mono text-xs">{cred.email}</td>
93
+ <td className="py-2 pr-4 font-mono text-xs">{cred.password}</td>
94
+ <td className="py-2 text-xs">{cred.role}</td>
95
+ </tr>
96
+ ))}
97
+ </tbody>
98
+ </table>
99
+ </div>
100
+ <p className="text-xs text-muted-foreground">
101
+ {t(
102
+ 'customer_accounts.settings.demo_credentials.note',
103
+ 'These credentials are only available if example data was seeded during setup.',
104
+ )}
105
+ </p>
106
+ </div>
107
+
108
+ <div className="rounded-lg border p-4 space-y-3">
109
+ <h3 className="text-sm font-semibold">
110
+ {t('customer_accounts.settings.quick_links.title', 'Quick Links')}
111
+ </h3>
112
+ <ul className="space-y-2">
113
+ <li>
114
+ <Link href="/backend/customer_accounts/users" className="text-sm text-primary underline underline-offset-4 hover:text-primary/80">
115
+ {t('customer_accounts.settings.quick_links.manage_users', 'Manage customer users')}
116
+ </Link>
117
+ </li>
118
+ <li>
119
+ <Link href="/backend/customer_accounts/roles" className="text-sm text-primary underline underline-offset-4 hover:text-primary/80">
120
+ {t('customer_accounts.settings.quick_links.manage_roles', 'Manage customer roles')}
121
+ </Link>
122
+ </li>
123
+ <li>
124
+ <a
125
+ href="https://docs.open-mercato.com/framework/modules/customer-portal"
126
+ target="_blank"
127
+ rel="noopener noreferrer"
128
+ className="text-sm text-primary underline underline-offset-4 hover:text-primary/80"
129
+ >
130
+ {t('customer_accounts.settings.quick_links.portal_docs', 'Portal documentation')}
131
+ </a>
132
+ </li>
133
+ </ul>
134
+ </div>
135
+ </div>
136
+ </>
137
+ )
138
+ }
@@ -1,139 +1,15 @@
1
- "use client"
2
-
3
- import { useMemo } from 'react'
4
- import Link from 'next/link'
1
+ import { headers } from 'next/headers'
5
2
  import { Page, PageBody } from '@open-mercato/ui/backend/Page'
6
- import { FormHeader } from '@open-mercato/ui/backend/forms'
7
- import { Button } from '@open-mercato/ui/primitives/button'
8
- import { useT } from '@open-mercato/shared/lib/i18n/context'
9
-
10
- function useOrigin() {
11
- return typeof window !== 'undefined' ? window.location.origin : ''
12
- }
13
-
14
- const DEMO_CREDENTIALS = [
15
- { email: 'alice.johnson@example.com', password: 'Password123!', role: 'Portal Admin' },
16
- { email: 'bob.smith@example.com', password: 'Password123!', role: 'Buyer' },
17
- { email: 'carol.white@example.com', password: 'Password123!', role: 'Viewer' },
18
- ] as const
19
-
20
- export default function CustomerAccountsSettingsPage() {
21
- const t = useT()
22
- const origin = useOrigin()
23
-
24
- const portalUrl = useMemo(() => `${origin}/[org-slug]/portal`, [origin])
3
+ import { resolvePortalRequestOrigin } from '../../../lib/portalUrl'
4
+ import { CustomerAccountsSettingsPageClient } from './CustomerAccountsSettingsPageClient'
25
5
 
6
+ export default async function CustomerAccountsSettingsPage() {
7
+ const portalOrigin = resolvePortalRequestOrigin(await headers())
26
8
  return (
27
9
  <Page>
28
- <div className="px-3 py-3 md:px-6 md:py-4">
29
- <FormHeader
30
- mode="detail"
31
- title={t('customer_accounts.settings.title', 'Portal Settings')}
32
- backHref="/backend/customer_accounts/users"
33
- backLabel={t('customer_accounts.settings.back', 'Customer Users')}
34
- />
35
- </div>
36
-
37
- <PageBody>
38
- <div className="max-w-2xl space-y-6">
39
- <div className="rounded-lg border p-4 space-y-3">
40
- <h3 className="text-sm font-semibold">
41
- {t('customer_accounts.settings.portal_access.title', 'Portal Access')}
42
- </h3>
43
- <div>
44
- <p className="text-sm text-muted-foreground">
45
- {t('customer_accounts.settings.portal_access.url_label', 'Portal URL pattern:')}
46
- </p>
47
- <code className="mt-1 block rounded bg-muted px-3 py-2 text-sm font-mono">
48
- {portalUrl}
49
- </code>
50
- </div>
51
- <div>
52
- <Button type="button" variant="outline" size="sm" asChild>
53
- <a href={`${origin}/portal`} target="_blank" rel="noopener noreferrer">
54
- {t('customer_accounts.settings.portal_access.open_portal', 'Open Portal')}
55
- </a>
56
- </Button>
57
- </div>
58
- <p className="text-xs text-muted-foreground">
59
- {t(
60
- 'customer_accounts.settings.portal_access.slug_note',
61
- 'The organization slug is auto-generated from the organization name. You can view and manage organizations in Directory \u2192 Organizations.',
62
- )}
63
- </p>
64
- <p className="text-xs text-muted-foreground">
65
- <Link href="/backend/directory/organizations" className="text-primary underline underline-offset-4 hover:text-primary/80">
66
- {t('customer_accounts.settings.portal_access.manage_orgs', 'Manage Organizations')}
67
- </Link>
68
- </p>
69
- </div>
70
-
71
- <div className="rounded-lg border p-4 space-y-3">
72
- <h3 className="text-sm font-semibold">
73
- {t('customer_accounts.settings.demo_credentials.title', 'Demo Credentials')}
74
- </h3>
75
- <div className="overflow-x-auto">
76
- <table className="w-full text-sm">
77
- <thead>
78
- <tr className="border-b text-left">
79
- <th className="pb-2 pr-4 font-medium text-muted-foreground">
80
- {t('customer_accounts.settings.demo_credentials.email', 'Email')}
81
- </th>
82
- <th className="pb-2 pr-4 font-medium text-muted-foreground">
83
- {t('customer_accounts.settings.demo_credentials.password', 'Password')}
84
- </th>
85
- <th className="pb-2 font-medium text-muted-foreground">
86
- {t('customer_accounts.settings.demo_credentials.role', 'Role')}
87
- </th>
88
- </tr>
89
- </thead>
90
- <tbody>
91
- {DEMO_CREDENTIALS.map((cred) => (
92
- <tr key={cred.email} className="border-b last:border-0">
93
- <td className="py-2 pr-4 font-mono text-xs">{cred.email}</td>
94
- <td className="py-2 pr-4 font-mono text-xs">{cred.password}</td>
95
- <td className="py-2 text-xs">{cred.role}</td>
96
- </tr>
97
- ))}
98
- </tbody>
99
- </table>
100
- </div>
101
- <p className="text-xs text-muted-foreground">
102
- {t(
103
- 'customer_accounts.settings.demo_credentials.note',
104
- 'These credentials are only available if example data was seeded during setup.',
105
- )}
106
- </p>
107
- </div>
108
-
109
- <div className="rounded-lg border p-4 space-y-3">
110
- <h3 className="text-sm font-semibold">
111
- {t('customer_accounts.settings.quick_links.title', 'Quick Links')}
112
- </h3>
113
- <ul className="space-y-2">
114
- <li>
115
- <Link href="/backend/customer_accounts/users" className="text-sm text-primary underline underline-offset-4 hover:text-primary/80">
116
- {t('customer_accounts.settings.quick_links.manage_users', 'Manage customer users')}
117
- </Link>
118
- </li>
119
- <li>
120
- <Link href="/backend/customer_accounts/roles" className="text-sm text-primary underline underline-offset-4 hover:text-primary/80">
121
- {t('customer_accounts.settings.quick_links.manage_roles', 'Manage customer roles')}
122
- </Link>
123
- </li>
124
- <li>
125
- <a
126
- href="https://docs.open-mercato.com/framework/modules/customer-portal"
127
- target="_blank"
128
- rel="noopener noreferrer"
129
- className="text-sm text-primary underline underline-offset-4 hover:text-primary/80"
130
- >
131
- {t('customer_accounts.settings.quick_links.portal_docs', 'Portal documentation')}
132
- </a>
133
- </li>
134
- </ul>
135
- </div>
136
- </div>
10
+ {/* space-y-6 preserves the gap the page header previously got as a direct <Page> child. */}
11
+ <PageBody className="space-y-6">
12
+ <CustomerAccountsSettingsPageClient portalOrigin={portalOrigin} />
137
13
  </PageBody>
138
14
  </Page>
139
15
  )