@open-mercato/core 0.6.6-develop.6314.1.c7b8291aa2 → 0.6.6-develop.6330.1.a261878aa8

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 (91) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js +7 -12
  3. package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js.map +2 -2
  4. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +5 -2
  5. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
  6. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +2 -1
  7. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
  8. package/dist/modules/customer_accounts/widgets/injection/company-users/widget.client.js +2 -1
  9. package/dist/modules/customer_accounts/widgets/injection/company-users/widget.client.js.map +2 -2
  10. package/dist/modules/customers/ai-tools/_shared.js +158 -0
  11. package/dist/modules/customers/ai-tools/_shared.js.map +7 -0
  12. package/dist/modules/customers/ai-tools/companies-pack.js +15 -121
  13. package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
  14. package/dist/modules/customers/ai-tools/people-pack.js +9 -107
  15. package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
  16. package/dist/modules/customers/components/calendar/CalendarScreen.js +1 -0
  17. package/dist/modules/customers/components/calendar/CalendarScreen.js.map +2 -2
  18. package/dist/modules/customers/components/calendar/EventPeekPopover.js +12 -1
  19. package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
  20. package/dist/modules/customers/components/calendar/TimeGrid.js +3 -0
  21. package/dist/modules/customers/components/calendar/TimeGrid.js.map +2 -2
  22. package/dist/modules/customers/components/calendar/types.js.map +1 -1
  23. package/dist/modules/customers/components/detail/EntityTagsDialog.js +76 -67
  24. package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +3 -3
  25. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +4 -3
  26. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
  27. package/dist/modules/data_sync/api/runs.js +1 -0
  28. package/dist/modules/data_sync/api/runs.js.map +2 -2
  29. package/dist/modules/data_sync/backend/data-sync/page.js +3 -1
  30. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  31. package/dist/modules/data_sync/data/validators.js +1 -0
  32. package/dist/modules/data_sync/data/validators.js.map +2 -2
  33. package/dist/modules/data_sync/lib/sync-run-service.js +20 -0
  34. package/dist/modules/data_sync/lib/sync-run-service.js.map +2 -2
  35. package/dist/modules/entities/api/records.js +11 -1
  36. package/dist/modules/entities/api/records.js.map +2 -2
  37. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +17 -10
  38. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  39. package/dist/modules/messages/api/unread-count/route.js +32 -0
  40. package/dist/modules/messages/api/unread-count/route.js.map +2 -2
  41. package/dist/modules/query_index/components/QueryIndexesTable.js +13 -5
  42. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  43. package/dist/modules/shipping_carriers/i18n/en.js +11 -1
  44. package/dist/modules/shipping_carriers/i18n/en.js.map +2 -2
  45. package/dist/modules/shipping_carriers/i18n/pl.js +11 -1
  46. package/dist/modules/shipping_carriers/i18n/pl.js.map +2 -2
  47. package/dist/modules/shipping_carriers/widgets/injection/tracking-status-badge/widget.client.js +25 -0
  48. package/dist/modules/shipping_carriers/widgets/injection/tracking-status-badge/widget.client.js.map +7 -0
  49. package/dist/modules/shipping_carriers/widgets/injection/tracking-status-badge/widget.js +3 -17
  50. package/dist/modules/shipping_carriers/widgets/injection/tracking-status-badge/widget.js.map +2 -2
  51. package/dist/modules/translations/widgets/injection/translation-manager/widget.client.js +19 -14
  52. package/dist/modules/translations/widgets/injection/translation-manager/widget.client.js.map +2 -2
  53. package/package.json +7 -7
  54. package/src/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.tsx +7 -10
  55. package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +6 -7
  56. package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +3 -2
  57. package/src/modules/customer_accounts/widgets/injection/company-users/widget.client.tsx +3 -2
  58. package/src/modules/customers/ai-tools/_shared.ts +270 -0
  59. package/src/modules/customers/ai-tools/companies-pack.ts +17 -157
  60. package/src/modules/customers/ai-tools/people-pack.ts +11 -133
  61. package/src/modules/customers/components/calendar/CalendarScreen.tsx +1 -0
  62. package/src/modules/customers/components/calendar/EventPeekPopover.tsx +29 -11
  63. package/src/modules/customers/components/calendar/TimeGrid.tsx +3 -0
  64. package/src/modules/customers/components/calendar/types.ts +1 -0
  65. package/src/modules/customers/components/detail/EntityTagsDialog.tsx +89 -71
  66. package/src/modules/customers/i18n/de.json +1 -0
  67. package/src/modules/customers/i18n/en.json +1 -0
  68. package/src/modules/customers/i18n/es.json +1 -0
  69. package/src/modules/customers/i18n/pl.json +1 -0
  70. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +6 -3
  71. package/src/modules/data_sync/api/runs.ts +1 -0
  72. package/src/modules/data_sync/backend/data-sync/page.tsx +3 -1
  73. package/src/modules/data_sync/data/validators.ts +1 -0
  74. package/src/modules/data_sync/i18n/de.json +1 -0
  75. package/src/modules/data_sync/i18n/en.json +1 -0
  76. package/src/modules/data_sync/i18n/es.json +1 -0
  77. package/src/modules/data_sync/i18n/pl.json +1 -0
  78. package/src/modules/data_sync/lib/sync-run-service.ts +23 -0
  79. package/src/modules/entities/api/records.ts +17 -1
  80. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +25 -12
  81. package/src/modules/messages/api/unread-count/route.ts +40 -0
  82. package/src/modules/query_index/components/QueryIndexesTable.tsx +17 -15
  83. package/src/modules/shipping_carriers/i18n/de.json +11 -1
  84. package/src/modules/shipping_carriers/i18n/en.json +11 -1
  85. package/src/modules/shipping_carriers/i18n/en.ts +10 -0
  86. package/src/modules/shipping_carriers/i18n/es.json +11 -1
  87. package/src/modules/shipping_carriers/i18n/pl.json +11 -1
  88. package/src/modules/shipping_carriers/i18n/pl.ts +10 -0
  89. package/src/modules/shipping_carriers/widgets/injection/tracking-status-badge/widget.client.tsx +35 -0
  90. package/src/modules/shipping_carriers/widgets/injection/tracking-status-badge/widget.tsx +3 -22
  91. package/src/modules/translations/widgets/injection/translation-manager/widget.client.tsx +30 -13
@@ -70,5 +70,15 @@
70
70
  "shipping_carriers.create.summary.to": "Nach",
71
71
  "shipping_carriers.create.title": "Sendung beim Transporteur erstellen",
72
72
  "shipping_carriers.feature.manage": "Versanddienstleister-Vorgaenge verwalten",
73
- "shipping_carriers.feature.view": "Sendungen der Versanddienstleister anzeigen"
73
+ "shipping_carriers.feature.view": "Sendungen der Versanddienstleister anzeigen",
74
+ "shipping_carriers.status.cancelled": "Storniert",
75
+ "shipping_carriers.status.delivered": "Zugestellt",
76
+ "shipping_carriers.status.failed_delivery": "Zustellung fehlgeschlagen",
77
+ "shipping_carriers.status.in_transit": "Unterwegs",
78
+ "shipping_carriers.status.label_created": "Label erstellt",
79
+ "shipping_carriers.status.out_for_delivery": "In Zustellung",
80
+ "shipping_carriers.status.pending": "Ausstehend",
81
+ "shipping_carriers.status.picked_up": "Abgeholt",
82
+ "shipping_carriers.status.returned": "Zuruckgesendet",
83
+ "shipping_carriers.status.unknown": "Unbekannt"
74
84
  }
@@ -70,5 +70,15 @@
70
70
  "shipping_carriers.create.summary.to": "To",
71
71
  "shipping_carriers.create.title": "Create carrier shipment",
72
72
  "shipping_carriers.feature.manage": "Manage shipping carrier operations",
73
- "shipping_carriers.feature.view": "View shipping carrier shipments"
73
+ "shipping_carriers.feature.view": "View shipping carrier shipments",
74
+ "shipping_carriers.status.cancelled": "Cancelled",
75
+ "shipping_carriers.status.delivered": "Delivered",
76
+ "shipping_carriers.status.failed_delivery": "Delivery failed",
77
+ "shipping_carriers.status.in_transit": "In transit",
78
+ "shipping_carriers.status.label_created": "Label created",
79
+ "shipping_carriers.status.out_for_delivery": "Out for delivery",
80
+ "shipping_carriers.status.pending": "Pending",
81
+ "shipping_carriers.status.picked_up": "Picked up",
82
+ "shipping_carriers.status.returned": "Returned",
83
+ "shipping_carriers.status.unknown": "Unknown"
74
84
  }
@@ -4,4 +4,14 @@ export default {
4
4
  'shipping_carriers.column.trackingStatus': 'Tracking status',
5
5
  'shipping_carriers.column.shippingStatus': 'Shipping status',
6
6
  'shipping_carriers.action.createShipment': 'Create shipment',
7
+ 'shipping_carriers.status.cancelled': 'Cancelled',
8
+ 'shipping_carriers.status.delivered': 'Delivered',
9
+ 'shipping_carriers.status.failed_delivery': 'Delivery failed',
10
+ 'shipping_carriers.status.in_transit': 'In transit',
11
+ 'shipping_carriers.status.label_created': 'Label created',
12
+ 'shipping_carriers.status.out_for_delivery': 'Out for delivery',
13
+ 'shipping_carriers.status.pending': 'Pending',
14
+ 'shipping_carriers.status.picked_up': 'Picked up',
15
+ 'shipping_carriers.status.returned': 'Returned',
16
+ 'shipping_carriers.status.unknown': 'Unknown',
7
17
  }
@@ -70,5 +70,15 @@
70
70
  "shipping_carriers.create.summary.to": "Hasta",
71
71
  "shipping_carriers.create.title": "Crear envio con transportista",
72
72
  "shipping_carriers.feature.manage": "Gestionar operaciones de transportistas",
73
- "shipping_carriers.feature.view": "Ver envios de transportistas"
73
+ "shipping_carriers.feature.view": "Ver envios de transportistas",
74
+ "shipping_carriers.status.cancelled": "Cancelado",
75
+ "shipping_carriers.status.delivered": "Entregado",
76
+ "shipping_carriers.status.failed_delivery": "Entrega fallida",
77
+ "shipping_carriers.status.in_transit": "En transito",
78
+ "shipping_carriers.status.label_created": "Etiqueta creada",
79
+ "shipping_carriers.status.out_for_delivery": "En reparto",
80
+ "shipping_carriers.status.pending": "Pendiente",
81
+ "shipping_carriers.status.picked_up": "Recogido",
82
+ "shipping_carriers.status.returned": "Devuelto",
83
+ "shipping_carriers.status.unknown": "Desconocido"
74
84
  }
@@ -70,5 +70,15 @@
70
70
  "shipping_carriers.create.summary.to": "Odbiór",
71
71
  "shipping_carriers.create.title": "Utwórz przesyłkę u przewoźnika",
72
72
  "shipping_carriers.feature.manage": "Zarzadzanie operacjami przewoznikow",
73
- "shipping_carriers.feature.view": "Podglad przesylek przewoznikow"
73
+ "shipping_carriers.feature.view": "Podglad przesylek przewoznikow",
74
+ "shipping_carriers.status.cancelled": "Anulowano",
75
+ "shipping_carriers.status.delivered": "Doreczono",
76
+ "shipping_carriers.status.failed_delivery": "Doreczenie nieudane",
77
+ "shipping_carriers.status.in_transit": "W transporcie",
78
+ "shipping_carriers.status.label_created": "Etykieta utworzona",
79
+ "shipping_carriers.status.out_for_delivery": "W doreczeniu",
80
+ "shipping_carriers.status.pending": "Oczekuje",
81
+ "shipping_carriers.status.picked_up": "Odebrano",
82
+ "shipping_carriers.status.returned": "Zwrocono",
83
+ "shipping_carriers.status.unknown": "Nieznany"
74
84
  }
@@ -4,4 +4,14 @@ export default {
4
4
  'shipping_carriers.column.trackingStatus': 'Status śledzenia',
5
5
  'shipping_carriers.column.shippingStatus': 'Status wysyłki',
6
6
  'shipping_carriers.action.createShipment': 'Utwórz przesyłkę',
7
+ 'shipping_carriers.status.cancelled': 'Anulowano',
8
+ 'shipping_carriers.status.delivered': 'Doręczono',
9
+ 'shipping_carriers.status.failed_delivery': 'Doręczenie nieudane',
10
+ 'shipping_carriers.status.in_transit': 'W transporcie',
11
+ 'shipping_carriers.status.label_created': 'Etykieta utworzona',
12
+ 'shipping_carriers.status.out_for_delivery': 'W doręczeniu',
13
+ 'shipping_carriers.status.pending': 'Oczekuje',
14
+ 'shipping_carriers.status.picked_up': 'Odebrano',
15
+ 'shipping_carriers.status.returned': 'Zwrócono',
16
+ 'shipping_carriers.status.unknown': 'Nieznany',
7
17
  }
@@ -0,0 +1,35 @@
1
+ 'use client'
2
+
3
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
4
+ import { StatusBadge, type StatusMap } from '@open-mercato/ui/primitives/status-badge'
5
+ import type { UnifiedShipmentStatus } from '../../../lib/adapter'
6
+
7
+ type ShippingStatus = UnifiedShipmentStatus | 'pending'
8
+
9
+ const shippingStatusVariantMap: StatusMap<ShippingStatus> = {
10
+ pending: 'neutral',
11
+ label_created: 'info',
12
+ picked_up: 'info',
13
+ in_transit: 'info',
14
+ out_for_delivery: 'info',
15
+ delivered: 'success',
16
+ failed_delivery: 'error',
17
+ returned: 'warning',
18
+ cancelled: 'error',
19
+ unknown: 'neutral',
20
+ }
21
+
22
+ export type ShippingStatusBadgeWidgetProps = {
23
+ status: string
24
+ }
25
+
26
+ export default function ShippingStatusBadgeWidget({ status }: ShippingStatusBadgeWidgetProps) {
27
+ const t = useT()
28
+ const variant = shippingStatusVariantMap[status as ShippingStatus] ?? 'neutral'
29
+
30
+ return (
31
+ <StatusBadge variant={variant} dot>
32
+ {t(`shipping_carriers.status.${status}`, status)}
33
+ </StatusBadge>
34
+ )
35
+ }
@@ -1,20 +1,6 @@
1
+ import * as React from 'react'
1
2
  import type { InjectionColumnWidget } from '@open-mercato/shared/modules/widgets/injection'
2
-
3
- const SHIPPING_STATUS_COLORS: Record<string, string> = {
4
- pending: 'bg-gray-100 text-gray-700',
5
- label_created: 'bg-slate-100 text-slate-700',
6
- picked_up: 'bg-sky-100 text-sky-700',
7
- in_transit: 'bg-blue-100 text-blue-700',
8
- out_for_delivery: 'bg-indigo-100 text-indigo-700',
9
- delivered: 'bg-green-100 text-green-700',
10
- returned: 'bg-amber-100 text-amber-700',
11
- cancelled: 'bg-red-100 text-red-700',
12
- failed_delivery: 'bg-orange-100 text-orange-700',
13
- }
14
-
15
- function formatShippingStatusLabel(value: string): string {
16
- return value.replace(/_/g, ' ')
17
- }
3
+ import ShippingStatusBadgeWidget from './widget.client'
18
4
 
19
5
  const widget: InjectionColumnWidget = {
20
6
  metadata: {
@@ -30,12 +16,7 @@ const widget: InjectionColumnWidget = {
30
16
  cell: ({ getValue }) => {
31
17
  const value = getValue()
32
18
  if (typeof value !== 'string' || value.length === 0) return null
33
- const colors = SHIPPING_STATUS_COLORS[value] ?? 'bg-gray-100 text-gray-700'
34
- return (
35
- <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${colors}`}>
36
- {formatShippingStatusLabel(value)}
37
- </span>
38
- )
19
+ return React.createElement(ShippingStatusBadgeWidget, { status: value })
39
20
  },
40
21
  },
41
22
  ],
@@ -3,9 +3,12 @@
3
3
  import * as React from 'react'
4
4
  import { useParams } from 'next/navigation'
5
5
  import Link from 'next/link'
6
+ import { useQuery } from '@tanstack/react-query'
6
7
  import { ExternalLink, Languages } from 'lucide-react'
7
8
  import type { InjectionWidgetComponentProps } from '@open-mercato/shared/modules/widgets/injection'
8
9
  import { useT } from '@open-mercato/shared/lib/i18n/context'
10
+ import { hasAllFeatures } from '@open-mercato/shared/lib/auth/featureMatch'
11
+ import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
9
12
  import { Button } from '@open-mercato/ui/primitives/button'
10
13
  import {
11
14
  Drawer,
@@ -21,20 +24,34 @@ import { extractRecordId } from '../../../lib/extract-record-id'
21
24
  type WidgetContext = { entityId?: string; recordId?: string }
22
25
  type WidgetData = Record<string, unknown> & { id?: string | number }
23
26
 
27
+ type FeatureCheckResponse = {
28
+ ok: boolean
29
+ granted: string[]
30
+ userId: string
31
+ }
32
+
33
+ const TRANSLATION_ACCESS_FEATURES = ['translations.view']
34
+
35
+ // Probe access through the shared apiCall/React Query path so multiple injected
36
+ // widget instances dedupe a single request via the query key. feature-check
37
+ // always answers 200 with the granted feature list, so a user without
38
+ // translations.view is hidden gracefully — no login redirect, no forbidden flash.
24
39
  function useTranslationAccess(): boolean {
25
- const [hasAccess, setHasAccess] = React.useState(false)
26
- React.useEffect(() => {
27
- let mounted = true
28
- // Use the original fetch to bypass the global apiFetch wrapper
29
- // that redirects to login on 403. This lets us gracefully hide the widget
30
- // when the user lacks translations.view instead of crashing the page.
31
- const nativeFetch = ((window as any).__omOriginalFetch as typeof fetch) || fetch
32
- nativeFetch('/api/translations/locales', { credentials: 'include' })
33
- .then((res) => { if (mounted) setHasAccess(res.ok) })
34
- .catch(() => { if (mounted) setHasAccess(false) })
35
- return () => { mounted = false }
36
- }, [])
37
- return hasAccess
40
+ const { data } = useQuery<boolean>({
41
+ queryKey: ['translations', 'widget-access', ...TRANSLATION_ACCESS_FEATURES],
42
+ queryFn: async () => {
43
+ const res = await apiCall<FeatureCheckResponse>('/api/auth/feature-check', {
44
+ method: 'POST',
45
+ headers: { 'content-type': 'application/json' },
46
+ body: JSON.stringify({ features: TRANSLATION_ACCESS_FEATURES }),
47
+ })
48
+ if (!res.ok) return false
49
+ return hasAllFeatures(TRANSLATION_ACCESS_FEATURES, res.result?.granted ?? [])
50
+ },
51
+ staleTime: 5 * 60 * 1000,
52
+ retry: false,
53
+ })
54
+ return data === true
38
55
  }
39
56
 
40
57
  export default function TranslationWidget({ context, data }: InjectionWidgetComponentProps<WidgetContext, WidgetData>) {