@open-mercato/core 0.6.6 → 0.6.7-develop.6553.1.2ec7246e04

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 (271) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/gateway_session_initialization/index.js +23 -0
  3. package/dist/generated/entities/gateway_session_initialization/index.js.map +7 -0
  4. package/dist/generated/entities.ids.generated.js +1 -0
  5. package/dist/generated/entities.ids.generated.js.map +2 -2
  6. package/dist/generated/entity-fields-registry.js +12 -0
  7. package/dist/generated/entity-fields-registry.js.map +2 -2
  8. package/dist/modules/api_keys/api/keys/route.js +30 -13
  9. package/dist/modules/api_keys/api/keys/route.js.map +2 -2
  10. package/dist/modules/api_keys/cli.js +2 -1
  11. package/dist/modules/api_keys/cli.js.map +2 -2
  12. package/dist/modules/attachments/api/file/[id]/route.js +9 -7
  13. package/dist/modules/attachments/api/file/[id]/route.js.map +2 -2
  14. package/dist/modules/attachments/api/image/[id]/[[...slug]]/route.js +9 -7
  15. package/dist/modules/attachments/api/image/[id]/[[...slug]]/route.js.map +2 -2
  16. package/dist/modules/attachments/api/route.js +21 -17
  17. package/dist/modules/attachments/api/route.js.map +2 -2
  18. package/dist/modules/attachments/components/AttachmentContentPreview.js +6 -35
  19. package/dist/modules/attachments/components/AttachmentContentPreview.js.map +2 -2
  20. package/dist/modules/attachments/lib/reconcileOrganization.js +110 -0
  21. package/dist/modules/attachments/lib/reconcileOrganization.js.map +7 -0
  22. package/dist/modules/attachments/lib/requestScope.js +10 -0
  23. package/dist/modules/attachments/lib/requestScope.js.map +7 -0
  24. package/dist/modules/audit_logs/backend/audit-logs/page.js +14 -24
  25. package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
  26. package/dist/modules/auth/api/autologin.js +85 -0
  27. package/dist/modules/auth/api/autologin.js.map +7 -0
  28. package/dist/modules/auth/api/users/route.js +6 -2
  29. package/dist/modules/auth/api/users/route.js.map +2 -2
  30. package/dist/modules/auth/cli.js +3 -2
  31. package/dist/modules/auth/cli.js.map +2 -2
  32. package/dist/modules/auth/lib/autologin.js +19 -0
  33. package/dist/modules/auth/lib/autologin.js.map +7 -0
  34. package/dist/modules/configs/lib/upgrade-actions.js +22 -0
  35. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  36. package/dist/modules/customer_accounts/api/admin/roles/[id]/acl.js +1 -0
  37. package/dist/modules/customer_accounts/api/admin/roles/[id]/acl.js.map +2 -2
  38. package/dist/modules/customer_accounts/api/admin/roles/[id].js +17 -3
  39. package/dist/modules/customer_accounts/api/admin/roles/[id].js.map +2 -2
  40. package/dist/modules/customer_accounts/api/portal/users/[id]/roles.js +6 -1
  41. package/dist/modules/customer_accounts/api/portal/users/[id]/roles.js.map +2 -2
  42. package/dist/modules/customer_accounts/api/portal/users-invite.js +6 -1
  43. package/dist/modules/customer_accounts/api/portal/users-invite.js.map +2 -2
  44. package/dist/modules/customer_accounts/services/customerInvitationService.js +1 -0
  45. package/dist/modules/customer_accounts/services/customerInvitationService.js.map +2 -2
  46. package/dist/modules/customer_accounts/services/customerRbacService.js +6 -1
  47. package/dist/modules/customer_accounts/services/customerRbacService.js.map +2 -2
  48. package/dist/modules/customer_accounts/widgets/injection-table.js +0 -2
  49. package/dist/modules/customer_accounts/widgets/injection-table.js.map +2 -2
  50. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +7 -1
  51. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
  52. package/dist/modules/customers/backend/customers/deals/pipeline/components/ViewTabsRow.js +2 -2
  53. package/dist/modules/customers/backend/customers/deals/pipeline/components/ViewTabsRow.js.map +2 -2
  54. package/dist/modules/customers/components/detail/CompanyDetailTabs.js +37 -43
  55. package/dist/modules/customers/components/detail/CompanyDetailTabs.js.map +2 -2
  56. package/dist/modules/customers/components/detail/DealDetailTabs.js +23 -35
  57. package/dist/modules/customers/components/detail/DealDetailTabs.js.map +2 -2
  58. package/dist/modules/customers/components/detail/DetailTabsLayout.js +6 -21
  59. package/dist/modules/customers/components/detail/DetailTabsLayout.js.map +2 -2
  60. package/dist/modules/customers/components/detail/MobilePersonDetail.js +26 -32
  61. package/dist/modules/customers/components/detail/MobilePersonDetail.js.map +2 -2
  62. package/dist/modules/customers/components/detail/PersonDetailTabs.js +29 -39
  63. package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +2 -2
  64. package/dist/modules/customers/components/detail/useDealsAccess.js +16 -0
  65. package/dist/modules/customers/components/detail/useDealsAccess.js.map +7 -0
  66. package/dist/modules/dashboards/api/roles/widgets/route.js +22 -3
  67. package/dist/modules/dashboards/api/roles/widgets/route.js.map +2 -2
  68. package/dist/modules/dashboards/api/users/widgets/route.js +22 -3
  69. package/dist/modules/dashboards/api/users/widgets/route.js.map +2 -2
  70. package/dist/modules/dashboards/cli.js +4 -3
  71. package/dist/modules/dashboards/cli.js.map +2 -2
  72. package/dist/modules/dashboards/lib/widgetAssignmentScope.js +9 -1
  73. package/dist/modules/dashboards/lib/widgetAssignmentScope.js.map +2 -2
  74. package/dist/modules/dictionaries/commands/entries.js +7 -14
  75. package/dist/modules/dictionaries/commands/entries.js.map +2 -2
  76. package/dist/modules/dictionaries/commands/entry-operations.js +7 -16
  77. package/dist/modules/dictionaries/commands/entry-operations.js.map +2 -2
  78. package/dist/modules/dictionaries/commands/factory.js +9 -3
  79. package/dist/modules/dictionaries/commands/factory.js.map +2 -2
  80. package/dist/modules/dictionaries/fields/dictionary.js +56 -41
  81. package/dist/modules/dictionaries/fields/dictionary.js.map +2 -2
  82. package/dist/modules/directory/utils/organizationScope.js +10 -3
  83. package/dist/modules/directory/utils/organizationScope.js.map +2 -2
  84. package/dist/modules/entities/api/records.js +5 -4
  85. package/dist/modules/entities/api/records.js.map +2 -2
  86. package/dist/modules/entities/backend/entities/system/[entityId]/page.meta.js +1 -0
  87. package/dist/modules/entities/backend/entities/system/[entityId]/page.meta.js.map +2 -2
  88. package/dist/modules/entities/backend/entities/user/[entityId]/page.js +49 -49
  89. package/dist/modules/entities/backend/entities/user/[entityId]/page.js.map +2 -2
  90. package/dist/modules/entities/backend/entities/user/[entityId]/page.meta.js +1 -0
  91. package/dist/modules/entities/backend/entities/user/[entityId]/page.meta.js.map +2 -2
  92. package/dist/modules/entities/cli.js +2 -1
  93. package/dist/modules/entities/cli.js.map +2 -2
  94. package/dist/modules/feature_toggles/api/check/boolean/route.js +0 -14
  95. package/dist/modules/feature_toggles/api/check/boolean/route.js.map +2 -2
  96. package/dist/modules/feature_toggles/defaults.json +8 -0
  97. package/dist/modules/integrations/backend/integrations/[id]/page.js +9 -80
  98. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  99. package/dist/modules/payment_gateways/data/entities.js +45 -0
  100. package/dist/modules/payment_gateways/data/entities.js.map +2 -2
  101. package/dist/modules/payment_gateways/lib/gateway-service.js +173 -38
  102. package/dist/modules/payment_gateways/lib/gateway-service.js.map +3 -3
  103. package/dist/modules/payment_gateways/lib/session-idempotency.js +104 -0
  104. package/dist/modules/payment_gateways/lib/session-idempotency.js.map +7 -0
  105. package/dist/modules/payment_gateways/migrations/Migration20260709220938_payment_gateways.js +11 -0
  106. package/dist/modules/payment_gateways/migrations/Migration20260709220938_payment_gateways.js.map +7 -0
  107. package/dist/modules/planner/backend/planner/availability-rulesets/[id]/page.js +16 -14
  108. package/dist/modules/planner/backend/planner/availability-rulesets/[id]/page.js.map +2 -2
  109. package/dist/modules/planner/components/AvailabilityRulesEditor.js +18 -30
  110. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  111. package/dist/modules/query_index/api/status.js +2 -8
  112. package/dist/modules/query_index/api/status.js.map +2 -2
  113. package/dist/modules/resources/backend/resources/resources/[id]/page.js +24 -24
  114. package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
  115. package/dist/modules/sales/backend/sales/channels/create/page.js +6 -0
  116. package/dist/modules/sales/backend/sales/channels/create/page.js.map +2 -2
  117. package/dist/modules/sales/backend/sales/channels/create/page.meta.js +2 -0
  118. package/dist/modules/sales/backend/sales/channels/create/page.meta.js.map +2 -2
  119. package/dist/modules/sales/backend/sales/channels/offers/page.js +6 -0
  120. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  121. package/dist/modules/sales/backend/sales/channels/offers/page.meta.js +2 -0
  122. package/dist/modules/sales/backend/sales/channels/offers/page.meta.js.map +2 -2
  123. package/dist/modules/sales/backend/sales/channels/page.js +6 -0
  124. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  125. package/dist/modules/sales/backend/sales/channels/page.meta.js +2 -0
  126. package/dist/modules/sales/backend/sales/channels/page.meta.js.map +2 -2
  127. package/dist/modules/sales/backend/sales/documents/[id]/page.js +6 -4
  128. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  129. package/dist/modules/sales/commands/documents.js +44 -0
  130. package/dist/modules/sales/commands/documents.js.map +2 -2
  131. package/dist/modules/sales/commands/returns.js +2 -27
  132. package/dist/modules/sales/commands/returns.js.map +2 -2
  133. package/dist/modules/sales/components/SalesChannelsDisabledNotice.js +15 -0
  134. package/dist/modules/sales/components/SalesChannelsDisabledNotice.js.map +7 -0
  135. package/dist/modules/sales/components/documents/AddressesSection.js +6 -2
  136. package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
  137. package/dist/modules/sales/components/documents/ItemsSection.js +1 -0
  138. package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
  139. package/dist/modules/sales/components/documents/LineItemDialog.js +9 -0
  140. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  141. package/dist/modules/sales/components/documents/SalesDocumentForm.js +51 -3
  142. package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
  143. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +10 -8
  144. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  145. package/dist/modules/sales/components/documents/ShipmentDialog.js +59 -38
  146. package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
  147. package/dist/modules/sales/components/useSalesChannelsEnabled.js +44 -0
  148. package/dist/modules/sales/components/useSalesChannelsEnabled.js.map +7 -0
  149. package/dist/modules/sales/lib/calculations.js +6 -0
  150. package/dist/modules/sales/lib/calculations.js.map +2 -2
  151. package/dist/modules/sales/lib/salesChannelsToggle.js +18 -0
  152. package/dist/modules/sales/lib/salesChannelsToggle.js.map +7 -0
  153. package/dist/modules/sales/lib/salesChannelsToggleId.js +5 -0
  154. package/dist/modules/sales/lib/salesChannelsToggleId.js.map +7 -0
  155. package/dist/modules/sales/lib/shipments/snapshots.js +27 -1
  156. package/dist/modules/sales/lib/shipments/snapshots.js.map +2 -2
  157. package/dist/modules/staff/backend/staff/team-members/[id]/page.js +22 -25
  158. package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +2 -2
  159. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +12 -14
  160. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  161. package/dist/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.js +10 -29
  162. package/dist/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.js.map +2 -2
  163. package/dist/modules/sync_excel/lib/adapters/customers.js +19 -20
  164. package/dist/modules/sync_excel/lib/adapters/customers.js.map +2 -2
  165. package/dist/modules/sync_excel/lib/parser.js +185 -0
  166. package/dist/modules/sync_excel/lib/parser.js.map +2 -2
  167. package/dist/modules/sync_excel/lib/upload-storage.js +20 -1
  168. package/dist/modules/sync_excel/lib/upload-storage.js.map +2 -2
  169. package/generated/entities/gateway_session_initialization/index.ts +10 -0
  170. package/generated/entities.ids.generated.ts +1 -0
  171. package/generated/entity-fields-registry.ts +12 -0
  172. package/package.json +9 -8
  173. package/src/modules/api_keys/api/keys/route.ts +36 -13
  174. package/src/modules/api_keys/cli.ts +2 -3
  175. package/src/modules/attachments/api/file/[id]/route.ts +11 -7
  176. package/src/modules/attachments/api/image/[id]/[[...slug]]/route.ts +11 -7
  177. package/src/modules/attachments/api/route.ts +26 -21
  178. package/src/modules/attachments/components/AttachmentContentPreview.tsx +9 -44
  179. package/src/modules/attachments/lib/reconcileOrganization.ts +188 -0
  180. package/src/modules/attachments/lib/requestScope.ts +27 -0
  181. package/src/modules/audit_logs/backend/audit-logs/page.tsx +12 -22
  182. package/src/modules/auth/api/autologin.ts +100 -0
  183. package/src/modules/auth/api/users/route.ts +11 -2
  184. package/src/modules/auth/cli.ts +3 -2
  185. package/src/modules/auth/lib/autologin.ts +36 -0
  186. package/src/modules/configs/i18n/de.json +5 -1
  187. package/src/modules/configs/i18n/en.json +5 -1
  188. package/src/modules/configs/i18n/es.json +5 -1
  189. package/src/modules/configs/i18n/pl.json +5 -1
  190. package/src/modules/configs/lib/upgrade-actions.ts +24 -0
  191. package/src/modules/customer_accounts/AGENTS.md +8 -6
  192. package/src/modules/customer_accounts/api/admin/roles/[id]/acl.ts +1 -0
  193. package/src/modules/customer_accounts/api/admin/roles/[id].ts +17 -3
  194. package/src/modules/customer_accounts/api/portal/users/[id]/roles.ts +6 -1
  195. package/src/modules/customer_accounts/api/portal/users-invite.ts +6 -1
  196. package/src/modules/customer_accounts/services/customerInvitationService.ts +1 -0
  197. package/src/modules/customer_accounts/services/customerRbacService.ts +9 -2
  198. package/src/modules/customer_accounts/widgets/injection-table.ts +0 -2
  199. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +11 -1
  200. package/src/modules/customers/backend/customers/deals/pipeline/components/ViewTabsRow.tsx +6 -2
  201. package/src/modules/customers/components/detail/CompanyDetailTabs.tsx +39 -55
  202. package/src/modules/customers/components/detail/DealDetailTabs.tsx +24 -49
  203. package/src/modules/customers/components/detail/DetailTabsLayout.tsx +13 -24
  204. package/src/modules/customers/components/detail/MobilePersonDetail.tsx +25 -31
  205. package/src/modules/customers/components/detail/PersonDetailTabs.tsx +29 -50
  206. package/src/modules/customers/components/detail/useDealsAccess.ts +19 -0
  207. package/src/modules/dashboards/api/roles/widgets/route.ts +22 -3
  208. package/src/modules/dashboards/api/users/widgets/route.ts +22 -3
  209. package/src/modules/dashboards/cli.ts +4 -9
  210. package/src/modules/dashboards/lib/widgetAssignmentScope.ts +18 -0
  211. package/src/modules/dictionaries/commands/entries.ts +7 -16
  212. package/src/modules/dictionaries/commands/entry-operations.ts +8 -18
  213. package/src/modules/dictionaries/commands/factory.ts +8 -2
  214. package/src/modules/dictionaries/fields/dictionary.tsx +55 -32
  215. package/src/modules/dictionaries/i18n/de.json +2 -0
  216. package/src/modules/dictionaries/i18n/en.json +2 -0
  217. package/src/modules/dictionaries/i18n/es.json +2 -0
  218. package/src/modules/dictionaries/i18n/pl.json +2 -0
  219. package/src/modules/directory/utils/organizationScope.ts +36 -2
  220. package/src/modules/entities/api/records.ts +5 -7
  221. package/src/modules/entities/backend/entities/system/[entityId]/page.meta.ts +1 -0
  222. package/src/modules/entities/backend/entities/user/[entityId]/page.meta.ts +1 -0
  223. package/src/modules/entities/backend/entities/user/[entityId]/page.tsx +51 -49
  224. package/src/modules/entities/cli.ts +2 -1
  225. package/src/modules/entities/i18n/de.json +34 -0
  226. package/src/modules/entities/i18n/en.json +34 -0
  227. package/src/modules/entities/i18n/es.json +34 -0
  228. package/src/modules/entities/i18n/pl.json +34 -0
  229. package/src/modules/feature_toggles/api/check/boolean/route.ts +0 -15
  230. package/src/modules/feature_toggles/defaults.json +8 -0
  231. package/src/modules/integrations/backend/integrations/[id]/page.tsx +16 -59
  232. package/src/modules/payment_gateways/data/entities.ts +39 -0
  233. package/src/modules/payment_gateways/lib/gateway-service.ts +211 -40
  234. package/src/modules/payment_gateways/lib/session-idempotency.ts +142 -0
  235. package/src/modules/payment_gateways/migrations/.snapshot-open-mercato.json +236 -0
  236. package/src/modules/payment_gateways/migrations/Migration20260709220938_payment_gateways.ts +10 -0
  237. package/src/modules/planner/backend/planner/availability-rulesets/[id]/page.tsx +14 -20
  238. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +16 -34
  239. package/src/modules/query_index/api/status.ts +2 -8
  240. package/src/modules/resources/backend/resources/resources/[id]/page.tsx +27 -37
  241. package/src/modules/sales/backend/sales/channels/create/page.meta.ts +3 -0
  242. package/src/modules/sales/backend/sales/channels/create/page.tsx +7 -0
  243. package/src/modules/sales/backend/sales/channels/offers/page.meta.ts +3 -0
  244. package/src/modules/sales/backend/sales/channels/offers/page.tsx +7 -0
  245. package/src/modules/sales/backend/sales/channels/page.meta.ts +4 -0
  246. package/src/modules/sales/backend/sales/channels/page.tsx +7 -0
  247. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +7 -5
  248. package/src/modules/sales/commands/documents.ts +65 -0
  249. package/src/modules/sales/commands/returns.ts +2 -32
  250. package/src/modules/sales/components/SalesChannelsDisabledNotice.tsx +21 -0
  251. package/src/modules/sales/components/documents/AddressesSection.tsx +6 -2
  252. package/src/modules/sales/components/documents/ItemsSection.tsx +5 -0
  253. package/src/modules/sales/components/documents/LineItemDialog.tsx +10 -0
  254. package/src/modules/sales/components/documents/SalesDocumentForm.tsx +53 -3
  255. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +10 -8
  256. package/src/modules/sales/components/documents/ShipmentDialog.tsx +65 -40
  257. package/src/modules/sales/components/useSalesChannelsEnabled.ts +59 -0
  258. package/src/modules/sales/i18n/de.json +5 -0
  259. package/src/modules/sales/i18n/en.json +5 -0
  260. package/src/modules/sales/i18n/es.json +5 -0
  261. package/src/modules/sales/i18n/pl.json +5 -0
  262. package/src/modules/sales/lib/calculations.ts +15 -0
  263. package/src/modules/sales/lib/salesChannelsToggle.ts +26 -0
  264. package/src/modules/sales/lib/salesChannelsToggleId.ts +1 -0
  265. package/src/modules/sales/lib/shipments/snapshots.ts +30 -0
  266. package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +25 -34
  267. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +11 -17
  268. package/src/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.tsx +11 -28
  269. package/src/modules/sync_excel/lib/adapters/customers.ts +20 -22
  270. package/src/modules/sync_excel/lib/parser.ts +245 -0
  271. package/src/modules/sync_excel/lib/upload-storage.ts +23 -1
@@ -167,7 +167,7 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
167
167
  const entJson = await readApiResultOrThrow<EntitiesListResponse>(
168
168
  '/api/entities/entities',
169
169
  undefined,
170
- { errorMessage: 'Failed to load entity metadata', fallback: { items: [] } },
170
+ { errorMessage: t('entities.userEntities.edit.errors.loadMetadataFailed', 'Failed to load entity metadata'), fallback: { items: [] } },
171
171
  )
172
172
  const ent = (entJson.items || []).find((x: any) => x.entityId === entityId)
173
173
  if (mounted) {
@@ -197,7 +197,7 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
197
197
  const json = await readApiResultOrThrow<DefinitionsManageResponse>(
198
198
  `/api/entities/definitions.manage?entityId=${encodeURIComponent(entityId)}`,
199
199
  undefined,
200
- { errorMessage: 'Failed to load entity definitions', fallback: { items: [], deletedKeys: [] } },
200
+ { errorMessage: t('entities.userEntities.edit.errors.loadDefinitionsFailed', 'Failed to load entity definitions'), fallback: { items: [], deletedKeys: [] } },
201
201
  )
202
202
  if (mounted) {
203
203
  const loaded: Def[] = (json.items || []).map((d: any) => ({ key: d.key, kind: d.kind, configJson: d.configJson || {}, isActive: d.isActive !== false }))
@@ -220,14 +220,14 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
220
220
  setSingleFieldsetPerRecord(json.settings?.singleFieldsetPerRecord !== false)
221
221
  }
222
222
  } catch (e: any) {
223
- if (mounted) setError(e.message || 'Failed to load')
223
+ if (mounted) setError(e.message || t('entities.userEntities.edit.errors.loadFailed', 'Failed to load'))
224
224
  } finally {
225
225
  if (mounted) setLoading(false)
226
226
  }
227
227
  }
228
228
  if (entityId) load()
229
229
  return () => { mounted = false }
230
- }, [entityId])
230
+ }, [entityId, t])
231
231
 
232
232
  function addField() {
233
233
  setDefs((arr) => [
@@ -249,13 +249,13 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
249
249
  body: JSON.stringify({ entityId, key }),
250
250
  })
251
251
  if (!call.ok) {
252
- await raiseCrudError(call.response, 'Failed to restore field')
252
+ await raiseCrudError(call.response, t('entities.userEntities.edit.errors.restoreFieldFailed', 'Failed to restore field'))
253
253
  }
254
254
  // Reload definitions & deleted keys
255
255
  const j2 = await readApiResultOrThrow<DefinitionsManageResponse>(
256
256
  `/api/entities/definitions.manage?entityId=${encodeURIComponent(entityId)}`,
257
257
  undefined,
258
- { errorMessage: 'Failed to reload field definitions', fallback: { items: [], deletedKeys: [] } },
258
+ { errorMessage: t('entities.userEntities.edit.errors.reloadDefinitionsFailed', 'Failed to reload field definitions'), fallback: { items: [], deletedKeys: [] } },
259
259
  )
260
260
  const loaded: Def[] = (j2.items || []).map((d: any) => ({ key: d.key, kind: d.kind, configJson: d.configJson || {}, isActive: d.isActive !== false }))
261
261
  loaded.sort(
@@ -264,10 +264,10 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
264
264
  setDefs(loaded)
265
265
  setDefsVersion(readVersionToken(j2.version))
266
266
  setDeletedKeys(Array.isArray(j2.deletedKeys) ? j2.deletedKeys : [])
267
- flash(`Restored ${key}`, 'success')
267
+ flash(t('entities.userEntities.edit.flash.restoredField', 'Restored {{key}}', { key }), 'success')
268
268
  await invalidateCustomFieldDefs(queryClient, entityId)
269
269
  } catch (e: any) {
270
- flash(e?.message || 'Failed to restore field', 'error')
270
+ flash(e?.message || t('entities.userEntities.edit.errors.restoreFieldFailed', 'Failed to restore field'), 'error')
271
271
  }
272
272
  }
273
273
 
@@ -276,8 +276,8 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
276
276
  setError(null)
277
277
  try {
278
278
  if (!validateAll()) {
279
- flash('Please fix validation errors in field definitions', 'error')
280
- throw new Error('Validation failed')
279
+ flash(t('entities.customFields.errors.validation', 'Please fix validation errors in field definitions.'), 'error')
280
+ throw new Error(t('entities.userEntities.edit.errors.validationFailed', 'Validation failed'))
281
281
  }
282
282
  const payload = {
283
283
  entityId,
@@ -298,13 +298,13 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
298
298
  )
299
299
  if (!call.ok) {
300
300
  if (surfaceRecordConflict({ status: call.status, body: call.result }, t)) return
301
- await raiseCrudError(call.response, 'Failed to save definitions')
301
+ await raiseCrudError(call.response, t('entities.customFields.errors.saveFailed', 'Failed to save field definitions.'))
302
302
  }
303
303
  setDefsVersion(readVersionToken(call.result?.version))
304
304
  await invalidateCustomFieldDefs(queryClient, entityId)
305
- router.push(`/backend/entities/user?flash=Definitions%20saved&type=success`)
305
+ router.push(`/backend/entities/user?flash=${encodeURIComponent(t('entities.customFields.flash.saved', 'Definitions saved'))}&type=success`)
306
306
  } catch (e: any) {
307
- setError(e.message || 'Failed to save')
307
+ setError(e.message || t('entities.customFields.errors.saveFailed', 'Failed to save field definitions.'))
308
308
  } finally {
309
309
  setSaving(false)
310
310
  }
@@ -321,13 +321,13 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
321
321
  body: JSON.stringify({ entityId, key: def.key }),
322
322
  })
323
323
  if (!call.ok) {
324
- await raiseCrudError(call.response, 'Failed to delete field')
324
+ await raiseCrudError(call.response, t('entities.customFields.errors.deleteFailed', 'Failed to delete field.'))
325
325
  }
326
326
  // Keep the optimistic-lock token in sync after an out-of-band delete so a
327
327
  // later Save does not falsely 409 against our own change (issue #3152).
328
328
  setDefsVersion(readVersionToken(call.result?.version))
329
329
  } catch (error) {
330
- const message = error instanceof Error ? error.message : 'Failed to delete field'
330
+ const message = error instanceof Error ? error.message : t('entities.customFields.errors.deleteFailed', 'Failed to delete field.')
331
331
  flash(message, 'error')
332
332
  return
333
333
  }
@@ -372,7 +372,7 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
372
372
  setOrderSaving(true)
373
373
  try {
374
374
  // Do not save order when there are invalid keys/kinds
375
- if (!validateAll()) throw new Error('Validation failed')
375
+ if (!validateAll()) throw new Error(t('entities.userEntities.edit.errors.validationFailed', 'Validation failed'))
376
376
  const payload = {
377
377
  entityId,
378
378
  definitions: defs.filter(d => !!d.key).map((d) => ({
@@ -396,14 +396,14 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
396
396
  setOrderDirty(false)
397
397
  return
398
398
  }
399
- await raiseCrudError(call.response, 'Failed to save order')
399
+ await raiseCrudError(call.response, t('entities.userEntities.edit.errors.saveOrderFailed', 'Failed to save order'))
400
400
  }
401
401
  setDefsVersion(readVersionToken(call.result?.version))
402
402
  setOrderDirty(false)
403
- flash('Order saved', 'success')
403
+ flash(t('entities.userEntities.edit.flash.orderSaved', 'Order saved'), 'success')
404
404
  await invalidateCustomFieldDefs(queryClient, entityId)
405
405
  } catch (e: any) {
406
- flash(e?.message || 'Failed to save order', 'error')
406
+ flash(e?.message || t('entities.userEntities.edit.errors.saveOrderFailed', 'Failed to save order'), 'error')
407
407
  } finally {
408
408
  setOrderSaving(false)
409
409
  }
@@ -423,21 +423,21 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
423
423
 
424
424
  const metadataFieldsReadOnly = entitySource === 'code'
425
425
  const fields: CrudField[] = [
426
- { id: 'label', label: 'Label', type: 'text', required: true, readOnly: metadataFieldsReadOnly },
427
- { id: 'description', label: 'Description', type: 'textarea', readOnly: metadataFieldsReadOnly },
426
+ { id: 'label', label: t('entities.userEntities.form.label.label', 'Label'), type: 'text', required: true, readOnly: metadataFieldsReadOnly },
427
+ { id: 'description', label: t('entities.userEntities.form.description.label', 'Description'), type: 'textarea', readOnly: metadataFieldsReadOnly },
428
428
  {
429
429
  id: 'defaultEditor',
430
- label: 'Default Editor (multiline)',
430
+ label: t('entities.userEntities.form.defaultEditor.label', 'Default Editor (multiline)'),
431
431
  type: 'select',
432
432
  readOnly: metadataFieldsReadOnly,
433
433
  options: [
434
- { value: '', label: 'Default (Markdown)' },
435
- { value: 'markdown', label: 'Markdown (UIW)' },
436
- { value: 'simpleMarkdown', label: 'Simple Markdown' },
437
- { value: 'htmlRichText', label: 'HTML Rich Text' },
434
+ { value: '', label: t('entities.userEntities.form.defaultEditor.options.default', 'Default (Markdown)') },
435
+ { value: 'markdown', label: t('entities.userEntities.form.defaultEditor.options.markdown', 'Markdown (UIW)') },
436
+ { value: 'simpleMarkdown', label: t('entities.userEntities.form.defaultEditor.options.simpleMarkdown', 'Simple Markdown') },
437
+ { value: 'htmlRichText', label: t('entities.userEntities.form.defaultEditor.options.htmlRichText', 'HTML Rich Text') },
438
438
  ],
439
439
  } as any,
440
- ...(entitySource === 'custom' ? [{ id: 'showInSidebar', label: 'Show in sidebar', type: 'checkbox' }] : []),
440
+ ...(entitySource === 'custom' ? [{ id: 'showInSidebar', label: t('entities.userEntities.form.showInSidebar.label', 'Show in sidebar'), type: 'checkbox' }] : []),
441
441
  ]
442
442
  const renderFieldDefinitions = React.useCallback(() => (
443
443
  <FieldDefinitionsEditor
@@ -474,7 +474,7 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
474
474
  })
475
475
  setOrderDirty(true)
476
476
  }}
477
- orderNotice={orderDirty ? { dirty: true, saving: orderSaving, message: 'Reordered will auto-save on blur' } : undefined}
477
+ orderNotice={orderDirty ? { dirty: true, saving: orderSaving, message: t('entities.userEntities.edit.orderNotice', 'Reordered - will auto-save on blur') } : undefined}
478
478
  addButtonLabel={t('entities.customFields.editor.addField', 'Add Field')}
479
479
  translate={t}
480
480
  listRef={listRef}
@@ -491,22 +491,22 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
491
491
  }}
492
492
  />
493
493
  ),
494
- [defs, defErrors, deletedKeys, fieldsets, activeFieldset, singleFieldsetPerRecord, orderDirty, orderSaving, addField, removeField, restoreField, saveOrderIfDirty])
494
+ [defs, defErrors, deletedKeys, fieldsets, activeFieldset, singleFieldsetPerRecord, orderDirty, orderSaving, addField, removeField, restoreField, saveOrderIfDirty, t])
495
495
 
496
- const definitionsGroup: CrudFormGroup = { id: 'definitions', title: 'Field Definitions', column: 1, component: renderFieldDefinitions }
496
+ const definitionsGroup: CrudFormGroup = { id: 'definitions', title: t('entities.userEntities.edit.groups.definitions', 'Field Definitions'), column: 1, component: renderFieldDefinitions }
497
497
 
498
498
  const groups: CrudFormGroup[] = [
499
- { id: 'settings', title: 'Entity Settings', column: 1, fields: entitySource === 'custom' ? ['label','description','defaultEditor','showInSidebar'] : ['label','description','defaultEditor'] },
499
+ { id: 'settings', title: t('entities.userEntities.edit.groups.settings', 'Entity Settings'), column: 1, fields: entitySource === 'custom' ? ['label','description','defaultEditor','showInSidebar'] : ['label','description','defaultEditor'] },
500
500
  definitionsGroup,
501
501
  ]
502
502
 
503
503
  const handleCrudFormSubmit = React.useCallback(async (vals: Record<string, unknown>) => {
504
504
  if (!entityId) {
505
- throw createCrudFormError('Invalid entity ID')
505
+ throw createCrudFormError(t('entities.userEntities.edit.errors.invalidEntityId', 'Invalid entity ID'))
506
506
  }
507
507
  if (!validateAll()) {
508
- flash('Please fix validation errors in field definitions', 'error')
509
- throw createCrudFormError('Please fix validation errors in field definitions')
508
+ flash(t('entities.customFields.errors.validation', 'Please fix validation errors in field definitions.'), 'error')
509
+ throw createCrudFormError(t('entities.customFields.errors.validation', 'Please fix validation errors in field definitions.'))
510
510
  }
511
511
  // Code-declared system entities are not registered as custom entities — their
512
512
  // metadata is owned by code and `POST /api/entities/entities` is fail-closed for
@@ -514,14 +514,14 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
514
514
  // skip the registration call and persist definitions below.
515
515
  if (shouldRegisterEntityMetadata(entitySource)) {
516
516
  const entityPayload = buildEntityMetadataPayload(entitySource, vals)
517
- if (!entityPayload) throw createCrudFormError('Validation failed')
517
+ if (!entityPayload) throw createCrudFormError(t('entities.userEntities.edit.errors.validationFailed', 'Validation failed'))
518
518
  const callEntity = await apiCall('/api/entities/entities', {
519
519
  method: 'POST',
520
520
  headers: { 'content-type': 'application/json' },
521
521
  body: JSON.stringify({ entityId, ...entityPayload }),
522
522
  })
523
523
  if (!callEntity.ok) {
524
- await raiseCrudError(callEntity.response, 'Failed to save entity')
524
+ await raiseCrudError(callEntity.response, t('entities.userEntities.edit.errors.saveEntityFailed', 'Failed to save entity'))
525
525
  }
526
526
  try { window.dispatchEvent(new Event('om:refresh-sidebar')) } catch {}
527
527
  }
@@ -543,13 +543,13 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
543
543
  }),
544
544
  )
545
545
  if (!callDefs.ok) {
546
- await raiseCrudError(callDefs.response, 'Failed to save definitions')
546
+ await raiseCrudError(callDefs.response, t('entities.customFields.errors.saveFailed', 'Failed to save field definitions.'))
547
547
  }
548
548
  setDefsVersion(readVersionToken(callDefs.result?.version))
549
549
  try { window.dispatchEvent(new Event('om:refresh-sidebar')) } catch {}
550
550
  await invalidateCustomFieldDefs(queryClient, entityId)
551
- flash('Definitions saved', 'success')
552
- }, [buildFieldsetPayload, defs, defsVersion, entityId, entitySource, queryClient, singleFieldsetPerRecord, validateAll])
551
+ flash(t('entities.customFields.flash.saved', 'Definitions saved'), 'success')
552
+ }, [buildFieldsetPayload, defs, defsVersion, entityId, entitySource, queryClient, singleFieldsetPerRecord, t, validateAll])
553
553
 
554
554
  if (!entityId) {
555
555
  return (
@@ -557,8 +557,8 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
557
557
  <PageBody>
558
558
  <div className="p-6">
559
559
  <Alert variant="destructive">
560
- <AlertTitle>Invalid entity</AlertTitle>
561
- <AlertDescription>The requested entity ID is missing or invalid.</AlertDescription>
560
+ <AlertTitle>{t('entities.userEntities.edit.errors.invalidEntityTitle', 'Invalid entity')}</AlertTitle>
561
+ <AlertDescription>{t('entities.userEntities.edit.errors.invalidEntityDescription', 'The requested entity ID is missing or invalid.')}</AlertDescription>
562
562
  </Alert>
563
563
  </div>
564
564
  </PageBody>
@@ -571,12 +571,12 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
571
571
  <div className="p-4">
572
572
  <CrudForm
573
573
  schema={entityFormSchema}
574
- title={`Edit fieldset: ${requestedFieldset ?? entityId}`}
574
+ title={t('entities.userEntities.edit.fieldsetTitle', 'Edit fieldset: {{name}}', { name: requestedFieldset ?? entityId })}
575
575
  fields={[]}
576
576
  groups={[definitionsGroup]}
577
577
  initialValues={entityInitial as any}
578
578
  isLoading={entityFormLoading || loading}
579
- submitLabel="Save"
579
+ submitLabel={t('entities.userEntities.records.form.submitSave', 'Save')}
580
580
  deleteVisible={false}
581
581
  backHref={undefined}
582
582
  cancelHref={undefined}
@@ -592,30 +592,32 @@ export default function EditDefinitionsPage({ params }: { params?: { entityId?:
592
592
  <PageBody>
593
593
  <CrudForm
594
594
  schema={entityFormSchema}
595
- title={`Edit Entity: ${entityId}`}
595
+ title={t('entities.userEntities.edit.title', 'Edit Entity: {{entityId}}', { entityId })}
596
596
  backHref={entitySource === 'code' ? "/backend/entities/system" : "/backend/entities/user"}
597
597
  fields={fields}
598
598
  groups={groups}
599
599
  initialValues={entityInitial as any}
600
600
  isLoading={entityFormLoading || loading}
601
- submitLabel="Save"
601
+ submitLabel={t('entities.userEntities.records.form.submitSave', 'Save')}
602
602
  deleteVisible={entitySource === 'custom'}
603
603
  extraActions={entitySource === 'custom' ? (
604
604
  <Button variant="outline" asChild>
605
605
  <Link href={`/backend/entities/user/${encodeURIComponent(entityId)}/records`}>
606
- Show Records
606
+ {t('entities.userEntities.edit.showRecords', 'Show Records')}
607
607
  </Link>
608
608
  </Button>
609
609
  ) : null}
610
610
  cancelHref={entitySource === 'code' ? "/backend/entities/system" : "/backend/entities/user"}
611
- successRedirect={entitySource === 'code' ? "/backend/entities/system?flash=Definitions%20saved&type=success" : "/backend/entities/user?flash=Definitions%20saved&type=success"}
611
+ successRedirect={entitySource === 'code'
612
+ ? `/backend/entities/system?flash=${encodeURIComponent(t('entities.customFields.flash.saved', 'Definitions saved'))}&type=success`
613
+ : `/backend/entities/user?flash=${encodeURIComponent(t('entities.customFields.flash.saved', 'Definitions saved'))}&type=success`}
612
614
  onSubmit={handleCrudFormSubmit}
613
615
  onDelete={entitySource === 'custom' ? async () => {
614
616
  const callDelete = await apiCall('/api/entities/entities', { method: 'DELETE', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ entityId }) })
615
617
  if (!callDelete.ok) {
616
- await raiseCrudError(callDelete.response, 'Failed to delete entity')
618
+ await raiseCrudError(callDelete.response, t('entities.userEntities.edit.errors.deleteEntityFailed', 'Failed to delete entity'))
617
619
  }
618
- flash('Entity deleted', 'success')
620
+ flash(t('entities.userEntities.edit.flash.entityDeleted', 'Entity deleted'), 'success')
619
621
  try { window.dispatchEvent(new Event('om:refresh-sidebar')) } catch {}
620
622
  } : undefined}
621
623
  />
@@ -10,6 +10,7 @@ import readline from 'node:readline/promises'
10
10
  import { stdin as input, stdout as output } from 'node:process'
11
11
  import { isTenantDataEncryptionEnabled } from '@open-mercato/shared/lib/encryption/toggles'
12
12
  import { parseBooleanToken } from '@open-mercato/shared/lib/boolean'
13
+ import { parseCommaSeparatedList } from '@open-mercato/shared/lib/string'
13
14
  import { createKmsService, type KmsService, type TenantDek } from '@open-mercato/shared/lib/encryption/kms'
14
15
  import {
15
16
  decryptWithAesGcm,
@@ -193,7 +194,7 @@ const addField: ModuleCli = {
193
194
  let options: string[] | undefined
194
195
  if (kind === 'select') {
195
196
  const raw = (args.options as string) || await ask('Options (comma-separated)', 'low,medium,high')
196
- options = raw.split(',').map((s) => s.trim()).filter(Boolean)
197
+ options = parseCommaSeparatedList(raw)
197
198
  }
198
199
  let defaultValue: any = undefined
199
200
  const defRaw = (args.default as string) ?? (args.defaultValue as string)
@@ -93,6 +93,7 @@
93
93
  "entities.customFields.editor.noFieldsets": "Noch keine Feldgruppen definiert. Mit Feldgruppen lassen sich benutzerdefinierte Felder für verschiedene Varianten derselben Entität gruppieren (z. B. Mode- vs. Sportprodukte).",
94
94
  "entities.customFields.editor.noGroup": "Keine Gruppe",
95
95
  "entities.customFields.editor.noOptionsDefined": "Keine Optionen definiert.",
96
+ "entities.customFields.editor.noParameterPlaceholder": "-",
96
97
  "entities.customFields.editor.noValidationRules": "Keine Validierungsregeln definiert.",
97
98
  "entities.customFields.editor.optionLabelPlaceholder": "Für Benutzer sichtbare Beschriftung (optional)",
98
99
  "entities.customFields.editor.options": "Optionen",
@@ -118,6 +119,17 @@
118
119
  "entities.customFields.editor.unassignedFields": "Nicht zugewiesene Felder",
119
120
  "entities.customFields.editor.unitsOptional": "Einheiten (optional)",
120
121
  "entities.customFields.editor.unitsPlaceholder": "kg, cm usw.",
122
+ "entities.customFields.editor.validation.date": "Datum",
123
+ "entities.customFields.editor.validation.eq": "gleich",
124
+ "entities.customFields.editor.validation.float": "Gleitkommazahl",
125
+ "entities.customFields.editor.validation.gt": "größer als",
126
+ "entities.customFields.editor.validation.gte": "größer oder gleich",
127
+ "entities.customFields.editor.validation.integer": "Ganzzahl",
128
+ "entities.customFields.editor.validation.lt": "kleiner als",
129
+ "entities.customFields.editor.validation.lte": "kleiner oder gleich",
130
+ "entities.customFields.editor.validation.ne": "ungleich",
131
+ "entities.customFields.editor.validation.regex": "Regex",
132
+ "entities.customFields.editor.validation.required": "erforderlich",
121
133
  "entities.customFields.editor.validationRules": "Validierungsregeln",
122
134
  "entities.customFields.editor.value": "Wert",
123
135
  "entities.customFields.editor.valueRequired": "Der Wert ist erforderlich",
@@ -183,6 +195,28 @@
183
195
  "entities.nav.systemEntities": "Systementitäten",
184
196
  "entities.nav.userEntities": "Benutzerentitäten",
185
197
  "entities.nav.userEntities.create": "Entität erstellen",
198
+ "entities.userEntities.edit.errors.deleteEntityFailed": "Entität konnte nicht gelöscht werden",
199
+ "entities.userEntities.edit.errors.invalidEntityDescription": "Die angeforderte Entitäts-ID fehlt oder ist ungültig.",
200
+ "entities.userEntities.edit.errors.invalidEntityId": "Ungültige Entitäts-ID",
201
+ "entities.userEntities.edit.errors.invalidEntityTitle": "Ungültige Entität",
202
+ "entities.userEntities.edit.errors.loadDefinitionsFailed": "Entitätsdefinitionen konnten nicht geladen werden",
203
+ "entities.userEntities.edit.errors.loadFailed": "Laden fehlgeschlagen",
204
+ "entities.userEntities.edit.errors.loadMetadataFailed": "Entitätsmetadaten konnten nicht geladen werden",
205
+ "entities.userEntities.edit.errors.reloadDefinitionsFailed": "Felddefinitionen konnten nicht neu geladen werden",
206
+ "entities.userEntities.edit.errors.restoreFieldFailed": "Feld konnte nicht wiederhergestellt werden",
207
+ "entities.userEntities.edit.errors.saveEntityFailed": "Entität konnte nicht gespeichert werden",
208
+ "entities.userEntities.edit.errors.saveOrderFailed": "Reihenfolge konnte nicht gespeichert werden",
209
+ "entities.userEntities.edit.errors.validationFailed": "Validierung fehlgeschlagen",
210
+ "entities.userEntities.edit.fieldsetTitle": "Feldgruppe bearbeiten: {{name}}",
211
+ "entities.userEntities.edit.flash.entityDeleted": "Entität gelöscht",
212
+ "entities.userEntities.edit.flash.orderSaved": "Reihenfolge gespeichert",
213
+ "entities.userEntities.edit.flash.restoredField": "{{key}} wiederhergestellt",
214
+ "entities.userEntities.edit.groups.definitions": "Felddefinitionen",
215
+ "entities.userEntities.edit.groups.settings": "Entitätseinstellungen",
216
+ "entities.userEntities.edit.orderNotice": "Neu angeordnet - wird beim Verlassen gespeichert",
217
+ "entities.userEntities.edit.pageTitle": "Definitionen bearbeiten",
218
+ "entities.userEntities.edit.showRecords": "Datensätze anzeigen",
219
+ "entities.userEntities.edit.title": "Entität bearbeiten: {{entityId}}",
186
220
  "entities.userEntities.errors.entityIdExists": "Entitäts-ID ist bereits vorhanden",
187
221
  "entities.userEntities.errors.entityIdRequired": "Entitäts-ID ist erforderlich",
188
222
  "entities.userEntities.errors.loadFailed": "Entitäten konnten nicht geladen werden",
@@ -93,6 +93,7 @@
93
93
  "entities.customFields.editor.noFieldsets": "No fieldsets defined yet. Fieldsets let you group custom fields for different variants of the same entity (e.g., Fashion vs. Sport products).",
94
94
  "entities.customFields.editor.noGroup": "No group",
95
95
  "entities.customFields.editor.noOptionsDefined": "No options defined.",
96
+ "entities.customFields.editor.noParameterPlaceholder": "-",
96
97
  "entities.customFields.editor.noValidationRules": "No validation rules defined.",
97
98
  "entities.customFields.editor.optionLabelPlaceholder": "Label shown to users (optional)",
98
99
  "entities.customFields.editor.options": "Options",
@@ -118,6 +119,17 @@
118
119
  "entities.customFields.editor.unassignedFields": "Unassigned fields",
119
120
  "entities.customFields.editor.unitsOptional": "Units (optional)",
120
121
  "entities.customFields.editor.unitsPlaceholder": "kg, cm, etc.",
122
+ "entities.customFields.editor.validation.date": "date",
123
+ "entities.customFields.editor.validation.eq": "eq",
124
+ "entities.customFields.editor.validation.float": "float",
125
+ "entities.customFields.editor.validation.gt": "gt",
126
+ "entities.customFields.editor.validation.gte": "gte",
127
+ "entities.customFields.editor.validation.integer": "integer",
128
+ "entities.customFields.editor.validation.lt": "lt",
129
+ "entities.customFields.editor.validation.lte": "lte",
130
+ "entities.customFields.editor.validation.ne": "ne",
131
+ "entities.customFields.editor.validation.regex": "regex",
132
+ "entities.customFields.editor.validation.required": "required",
121
133
  "entities.customFields.editor.validationRules": "Validation rules",
122
134
  "entities.customFields.editor.value": "Value",
123
135
  "entities.customFields.editor.valueRequired": "Value is required",
@@ -183,6 +195,28 @@
183
195
  "entities.nav.systemEntities": "System Entities",
184
196
  "entities.nav.userEntities": "User Entities",
185
197
  "entities.nav.userEntities.create": "Create Entity",
198
+ "entities.userEntities.edit.errors.deleteEntityFailed": "Failed to delete entity",
199
+ "entities.userEntities.edit.errors.invalidEntityDescription": "The requested entity ID is missing or invalid.",
200
+ "entities.userEntities.edit.errors.invalidEntityId": "Invalid entity ID",
201
+ "entities.userEntities.edit.errors.invalidEntityTitle": "Invalid entity",
202
+ "entities.userEntities.edit.errors.loadDefinitionsFailed": "Failed to load entity definitions",
203
+ "entities.userEntities.edit.errors.loadFailed": "Failed to load",
204
+ "entities.userEntities.edit.errors.loadMetadataFailed": "Failed to load entity metadata",
205
+ "entities.userEntities.edit.errors.reloadDefinitionsFailed": "Failed to reload field definitions",
206
+ "entities.userEntities.edit.errors.restoreFieldFailed": "Failed to restore field",
207
+ "entities.userEntities.edit.errors.saveEntityFailed": "Failed to save entity",
208
+ "entities.userEntities.edit.errors.saveOrderFailed": "Failed to save order",
209
+ "entities.userEntities.edit.errors.validationFailed": "Validation failed",
210
+ "entities.userEntities.edit.fieldsetTitle": "Edit fieldset: {{name}}",
211
+ "entities.userEntities.edit.flash.entityDeleted": "Entity deleted",
212
+ "entities.userEntities.edit.flash.orderSaved": "Order saved",
213
+ "entities.userEntities.edit.flash.restoredField": "Restored {{key}}",
214
+ "entities.userEntities.edit.groups.definitions": "Field Definitions",
215
+ "entities.userEntities.edit.groups.settings": "Entity Settings",
216
+ "entities.userEntities.edit.orderNotice": "Reordered - will auto-save on blur",
217
+ "entities.userEntities.edit.pageTitle": "Edit definitions",
218
+ "entities.userEntities.edit.showRecords": "Show Records",
219
+ "entities.userEntities.edit.title": "Edit Entity: {{entityId}}",
186
220
  "entities.userEntities.errors.entityIdExists": "Entity ID already exists",
187
221
  "entities.userEntities.errors.entityIdRequired": "Entity ID is required",
188
222
  "entities.userEntities.errors.loadFailed": "Failed to load entities",
@@ -93,6 +93,7 @@
93
93
  "entities.customFields.editor.noFieldsets": "Aún no se han definido conjuntos de campos. Los conjuntos de campos permiten agrupar campos personalizados para distintas variantes de la misma entidad (p. ej. productos de Moda vs. Deporte).",
94
94
  "entities.customFields.editor.noGroup": "Sin grupo",
95
95
  "entities.customFields.editor.noOptionsDefined": "No se han definido opciones.",
96
+ "entities.customFields.editor.noParameterPlaceholder": "-",
96
97
  "entities.customFields.editor.noValidationRules": "No se han definido reglas de validación.",
97
98
  "entities.customFields.editor.optionLabelPlaceholder": "Etiqueta visible para los usuarios (opcional)",
98
99
  "entities.customFields.editor.options": "Opciones",
@@ -118,6 +119,17 @@
118
119
  "entities.customFields.editor.unassignedFields": "Campos sin asignar",
119
120
  "entities.customFields.editor.unitsOptional": "Unidades (opcional)",
120
121
  "entities.customFields.editor.unitsPlaceholder": "kg, cm, etc.",
122
+ "entities.customFields.editor.validation.date": "fecha",
123
+ "entities.customFields.editor.validation.eq": "igual",
124
+ "entities.customFields.editor.validation.float": "decimal",
125
+ "entities.customFields.editor.validation.gt": "mayor que",
126
+ "entities.customFields.editor.validation.gte": "mayor o igual",
127
+ "entities.customFields.editor.validation.integer": "entero",
128
+ "entities.customFields.editor.validation.lt": "menor que",
129
+ "entities.customFields.editor.validation.lte": "menor o igual",
130
+ "entities.customFields.editor.validation.ne": "distinto",
131
+ "entities.customFields.editor.validation.regex": "regex",
132
+ "entities.customFields.editor.validation.required": "obligatorio",
121
133
  "entities.customFields.editor.validationRules": "Reglas de validación",
122
134
  "entities.customFields.editor.value": "Valor",
123
135
  "entities.customFields.editor.valueRequired": "El valor es obligatorio",
@@ -183,6 +195,28 @@
183
195
  "entities.nav.systemEntities": "Entidades del sistema",
184
196
  "entities.nav.userEntities": "Entidades de usuario",
185
197
  "entities.nav.userEntities.create": "Crear entidad",
198
+ "entities.userEntities.edit.errors.deleteEntityFailed": "No se pudo eliminar la entidad",
199
+ "entities.userEntities.edit.errors.invalidEntityDescription": "Falta el ID de la entidad solicitada o no es válido.",
200
+ "entities.userEntities.edit.errors.invalidEntityId": "ID de entidad no válido",
201
+ "entities.userEntities.edit.errors.invalidEntityTitle": "Entidad no válida",
202
+ "entities.userEntities.edit.errors.loadDefinitionsFailed": "No se pudieron cargar las definiciones de la entidad",
203
+ "entities.userEntities.edit.errors.loadFailed": "No se pudo cargar",
204
+ "entities.userEntities.edit.errors.loadMetadataFailed": "No se pudieron cargar los metadatos de la entidad",
205
+ "entities.userEntities.edit.errors.reloadDefinitionsFailed": "No se pudieron recargar las definiciones de campos",
206
+ "entities.userEntities.edit.errors.restoreFieldFailed": "No se pudo restaurar el campo",
207
+ "entities.userEntities.edit.errors.saveEntityFailed": "No se pudo guardar la entidad",
208
+ "entities.userEntities.edit.errors.saveOrderFailed": "No se pudo guardar el orden",
209
+ "entities.userEntities.edit.errors.validationFailed": "La validación falló",
210
+ "entities.userEntities.edit.fieldsetTitle": "Editar conjunto: {{name}}",
211
+ "entities.userEntities.edit.flash.entityDeleted": "Entidad eliminada",
212
+ "entities.userEntities.edit.flash.orderSaved": "Orden guardado",
213
+ "entities.userEntities.edit.flash.restoredField": "{{key}} restaurado",
214
+ "entities.userEntities.edit.groups.definitions": "Definiciones de campos",
215
+ "entities.userEntities.edit.groups.settings": "Configuración de la entidad",
216
+ "entities.userEntities.edit.orderNotice": "Reordenado - se guardará al salir del campo",
217
+ "entities.userEntities.edit.pageTitle": "Editar definiciones",
218
+ "entities.userEntities.edit.showRecords": "Mostrar registros",
219
+ "entities.userEntities.edit.title": "Editar entidad: {{entityId}}",
186
220
  "entities.userEntities.errors.entityIdExists": "El ID de la entidad ya existe",
187
221
  "entities.userEntities.errors.entityIdRequired": "El ID de la entidad es obligatorio",
188
222
  "entities.userEntities.errors.loadFailed": "No se pudieron cargar las entidades",
@@ -93,6 +93,7 @@
93
93
  "entities.customFields.editor.noFieldsets": "Nie zdefiniowano jeszcze zestawów pól. Zestawy pól pozwalają grupować pola niestandardowe dla różnych wariantów tej samej encji (np. produkty Moda vs Sport).",
94
94
  "entities.customFields.editor.noGroup": "Bez grupy",
95
95
  "entities.customFields.editor.noOptionsDefined": "Nie zdefiniowano opcji.",
96
+ "entities.customFields.editor.noParameterPlaceholder": "-",
96
97
  "entities.customFields.editor.noValidationRules": "Nie zdefiniowano reguł walidacji.",
97
98
  "entities.customFields.editor.optionLabelPlaceholder": "Etykieta widoczna dla użytkowników (opcjonalnie)",
98
99
  "entities.customFields.editor.options": "Opcje",
@@ -118,6 +119,17 @@
118
119
  "entities.customFields.editor.unassignedFields": "Pola nieprzypisane",
119
120
  "entities.customFields.editor.unitsOptional": "Jednostki (opcjonalnie)",
120
121
  "entities.customFields.editor.unitsPlaceholder": "kg, cm itp.",
122
+ "entities.customFields.editor.validation.date": "data",
123
+ "entities.customFields.editor.validation.eq": "równe",
124
+ "entities.customFields.editor.validation.float": "liczba zmiennoprzecinkowa",
125
+ "entities.customFields.editor.validation.gt": "większe niż",
126
+ "entities.customFields.editor.validation.gte": "większe lub równe",
127
+ "entities.customFields.editor.validation.integer": "liczba całkowita",
128
+ "entities.customFields.editor.validation.lt": "mniejsze niż",
129
+ "entities.customFields.editor.validation.lte": "mniejsze lub równe",
130
+ "entities.customFields.editor.validation.ne": "różne",
131
+ "entities.customFields.editor.validation.regex": "regex",
132
+ "entities.customFields.editor.validation.required": "wymagane",
121
133
  "entities.customFields.editor.validationRules": "Reguły walidacji",
122
134
  "entities.customFields.editor.value": "Wartość",
123
135
  "entities.customFields.editor.valueRequired": "Wartość jest wymagana",
@@ -183,6 +195,28 @@
183
195
  "entities.nav.systemEntities": "Encje systemowe",
184
196
  "entities.nav.userEntities": "Encje użytkownika",
185
197
  "entities.nav.userEntities.create": "Utwórz encję",
198
+ "entities.userEntities.edit.errors.deleteEntityFailed": "Nie udało się usunąć encji",
199
+ "entities.userEntities.edit.errors.invalidEntityDescription": "Brakuje identyfikatora encji albo jest on nieprawidłowy.",
200
+ "entities.userEntities.edit.errors.invalidEntityId": "Nieprawidłowy identyfikator encji",
201
+ "entities.userEntities.edit.errors.invalidEntityTitle": "Nieprawidłowa encja",
202
+ "entities.userEntities.edit.errors.loadDefinitionsFailed": "Nie udało się wczytać definicji encji",
203
+ "entities.userEntities.edit.errors.loadFailed": "Nie udało się wczytać",
204
+ "entities.userEntities.edit.errors.loadMetadataFailed": "Nie udało się wczytać metadanych encji",
205
+ "entities.userEntities.edit.errors.reloadDefinitionsFailed": "Nie udało się ponownie wczytać definicji pól",
206
+ "entities.userEntities.edit.errors.restoreFieldFailed": "Nie udało się przywrócić pola",
207
+ "entities.userEntities.edit.errors.saveEntityFailed": "Nie udało się zapisać encji",
208
+ "entities.userEntities.edit.errors.saveOrderFailed": "Nie udało się zapisać kolejności",
209
+ "entities.userEntities.edit.errors.validationFailed": "Walidacja nie powiodła się",
210
+ "entities.userEntities.edit.fieldsetTitle": "Edytuj zestaw pól: {{name}}",
211
+ "entities.userEntities.edit.flash.entityDeleted": "Encja została usunięta",
212
+ "entities.userEntities.edit.flash.orderSaved": "Kolejność została zapisana",
213
+ "entities.userEntities.edit.flash.restoredField": "Przywrócono {{key}}",
214
+ "entities.userEntities.edit.groups.definitions": "Definicje pól",
215
+ "entities.userEntities.edit.groups.settings": "Ustawienia encji",
216
+ "entities.userEntities.edit.orderNotice": "Zmieniono kolejność - zapisze się po opuszczeniu pola",
217
+ "entities.userEntities.edit.pageTitle": "Edytuj definicje",
218
+ "entities.userEntities.edit.showRecords": "Pokaż rekordy",
219
+ "entities.userEntities.edit.title": "Edytuj encję: {{entityId}}",
186
220
  "entities.userEntities.errors.entityIdExists": "Identyfikator encji już istnieje",
187
221
  "entities.userEntities.errors.entityIdRequired": "Identyfikator encji jest wymagany",
188
222
  "entities.userEntities.errors.loadFailed": "Nie udało się wczytać encji",
@@ -18,21 +18,6 @@ export async function GET(req: Request) {
18
18
  return NextResponse.json({ error: 'Missing required parameter: identifier' }, { status: 400 })
19
19
  }
20
20
 
21
- if (auth.isSuperAdmin === true) {
22
- return NextResponse.json({
23
- ok: true,
24
- value: true,
25
- resolution: {
26
- valueType: "boolean",
27
- value: true,
28
- source: "override",
29
- toggleId: "superadmin",
30
- identifier,
31
- tenantId: "superadmin"
32
- }
33
- })
34
- }
35
-
36
21
  const container = await createRequestContainer()
37
22
  const { scope } = await resolveFeatureCheckContext({
38
23
  container,
@@ -16,6 +16,14 @@
16
16
  "type": "string",
17
17
  "defaultValue": "Free shipping on orders over $50"
18
18
  },
19
+ {
20
+ "identifier": "sales_channels_enabled",
21
+ "name": "Sales Channels",
22
+ "description": "Show sales channel pickers, filters, and management UI. Disable for tenants that do not use sales channels.",
23
+ "category": "sales",
24
+ "type": "boolean",
25
+ "defaultValue": true
26
+ },
19
27
  {
20
28
  "identifier": "order_review_threshold",
21
29
  "name": "Order Review Threshold",