@open-mercato/core 0.4.5-develop-636d33c995 → 0.4.5-develop-3d8e759e45
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.
- package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js +17 -2
- package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +15 -0
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js +30 -0
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js.map +2 -2
- package/dist/modules/catalog/inbox-actions.js +51 -0
- package/dist/modules/catalog/inbox-actions.js.map +7 -0
- package/dist/modules/catalog/lib/messageObjectPreviews.js +146 -0
- package/dist/modules/catalog/lib/messageObjectPreviews.js.map +7 -0
- package/dist/modules/catalog/message-objects.js +95 -0
- package/dist/modules/catalog/message-objects.js.map +7 -0
- package/dist/modules/currencies/backend/currencies/[id]/page.js +21 -0
- package/dist/modules/currencies/backend/currencies/[id]/page.js.map +2 -2
- package/dist/modules/currencies/lib/messageObjectPreviews.js +51 -0
- package/dist/modules/currencies/lib/messageObjectPreviews.js.map +7 -0
- package/dist/modules/currencies/message-objects.js +41 -0
- package/dist/modules/currencies/message-objects.js.map +7 -0
- package/dist/modules/customers/backend/customers/companies/[id]/page.js +20 -0
- package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +12 -1
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/[id]/page.js +20 -0
- package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyHighlights.js +18 -14
- package/dist/modules/customers/components/detail/CompanyHighlights.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonHighlights.js +18 -14
- package/dist/modules/customers/components/detail/PersonHighlights.js.map +2 -2
- package/dist/modules/customers/inbox-actions.js +230 -0
- package/dist/modules/customers/inbox-actions.js.map +7 -0
- package/dist/modules/customers/lib/messageObjectPreviews.js +41 -5
- package/dist/modules/customers/lib/messageObjectPreviews.js.map +2 -2
- package/dist/modules/customers/message-objects.js +31 -11
- package/dist/modules/customers/message-objects.js.map +2 -2
- package/dist/modules/inbox_ops/api/emails/[id]/route.js +40 -1
- package/dist/modules/inbox_ops/api/emails/[id]/route.js.map +2 -2
- package/dist/modules/inbox_ops/api/extract/route.js +87 -0
- package/dist/modules/inbox_ops/api/extract/route.js.map +7 -0
- package/dist/modules/inbox_ops/api/proposals/[id]/translate/route.js +6 -1
- package/dist/modules/inbox_ops/api/proposals/[id]/translate/route.js.map +2 -2
- package/dist/modules/inbox_ops/api/proposals/counts/route.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +40 -14
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.meta.js +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.meta.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +161 -79
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.meta.js +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.meta.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.js +109 -62
- package/dist/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.js.map +3 -3
- package/dist/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.meta.js +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.meta.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js +36 -14
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.meta.js +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.meta.js.map +2 -2
- package/dist/modules/inbox_ops/components/proposals/ActionCard.js +65 -10
- package/dist/modules/inbox_ops/components/proposals/ActionCard.js.map +2 -2
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +58 -10
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
- package/dist/modules/inbox_ops/lib/constants.js.map +2 -2
- package/dist/modules/inbox_ops/lib/contactValidation.js +40 -0
- package/dist/modules/inbox_ops/lib/contactValidation.js.map +7 -0
- package/dist/modules/inbox_ops/lib/executionEngine.js +31 -826
- package/dist/modules/inbox_ops/lib/executionEngine.js.map +3 -3
- package/dist/modules/inbox_ops/lib/executionHelpers.js +368 -0
- package/dist/modules/inbox_ops/lib/executionHelpers.js.map +7 -0
- package/dist/modules/inbox_ops/lib/extractionPrompt.js +28 -35
- package/dist/modules/inbox_ops/lib/extractionPrompt.js.map +3 -3
- package/dist/modules/inbox_ops/lib/inbox-actions-generated.d.js +1 -0
- package/dist/modules/inbox_ops/lib/inbox-actions-generated.d.js.map +7 -0
- package/dist/modules/inbox_ops/lib/translationProvider.js +15 -10
- package/dist/modules/inbox_ops/lib/translationProvider.js.map +2 -2
- package/dist/modules/inbox_ops/subscribers/extractionWorker.js +16 -16
- package/dist/modules/inbox_ops/subscribers/extractionWorker.js.map +2 -2
- package/dist/modules/messages/commands/messages.js +3 -0
- package/dist/modules/messages/commands/messages.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/objects-panel.js +6 -1
- package/dist/modules/messages/components/message-detail/panels/objects-panel.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +4 -1
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
- package/dist/modules/messages/frontend/messages/view/[token]/page.js +1 -0
- package/dist/modules/messages/frontend/messages/view/[token]/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/[id]/page.js +24 -7
- package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
- package/dist/modules/resources/lib/messageObjectPreviews.js +43 -0
- package/dist/modules/resources/lib/messageObjectPreviews.js.map +7 -0
- package/dist/modules/resources/message-objects.js +37 -0
- package/dist/modules/resources/message-objects.js.map +7 -0
- package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js +19 -0
- package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +23 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/quotes/[id]/page.js +1 -1
- package/dist/modules/sales/backend/sales/quotes/[id]/page.js.map +2 -2
- package/dist/modules/sales/inbox-actions.js +278 -0
- package/dist/modules/sales/inbox-actions.js.map +7 -0
- package/dist/modules/sales/lib/messageObjectPreviews.js +49 -4
- package/dist/modules/sales/lib/messageObjectPreviews.js.map +2 -2
- package/dist/modules/sales/message-objects.js +44 -2
- package/dist/modules/sales/message-objects.js.map +2 -2
- package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js +59 -30
- package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js.map +2 -2
- package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js +1 -1
- package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js.map +1 -1
- package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js +8 -30
- package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-availability/page.js +13 -0
- package/dist/modules/staff/backend/staff/my-availability/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js +8 -31
- package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js +32 -10
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/[id]/edit/page.js +14 -1
- package/dist/modules/staff/backend/staff/team-roles/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +14 -1
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/components/TeamForm.js +4 -2
- package/dist/modules/staff/components/TeamForm.js.map +2 -2
- package/dist/modules/staff/components/TeamRoleForm.js +4 -2
- package/dist/modules/staff/components/TeamRoleForm.js.map +2 -2
- package/dist/modules/staff/lib/messageObjectPreviews.js +111 -2
- package/dist/modules/staff/lib/messageObjectPreviews.js.map +2 -2
- package/dist/modules/staff/message-objects.js +79 -8
- package/dist/modules/staff/message-objects.js.map +2 -2
- package/jest.config.cjs +1 -0
- package/jest.mocks/inbox-actions.generated.js +5 -0
- package/package.json +2 -2
- package/src/modules/catalog/backend/catalog/categories/[id]/edit/page.tsx +19 -5
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +14 -0
- package/src/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.tsx +40 -0
- package/src/modules/catalog/inbox-actions.ts +60 -0
- package/src/modules/catalog/lib/messageObjectPreviews.ts +176 -0
- package/src/modules/catalog/message-objects.ts +102 -0
- package/src/modules/currencies/backend/currencies/[id]/page.tsx +20 -0
- package/src/modules/currencies/lib/messageObjectPreviews.ts +65 -0
- package/src/modules/currencies/message-objects.ts +40 -0
- package/src/modules/customers/backend/customers/companies/[id]/page.tsx +19 -0
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +13 -0
- package/src/modules/customers/backend/customers/people/[id]/page.tsx +19 -0
- package/src/modules/customers/components/detail/CompanyHighlights.tsx +14 -9
- package/src/modules/customers/components/detail/PersonHighlights.tsx +14 -9
- package/src/modules/customers/inbox-actions.ts +285 -0
- package/src/modules/customers/lib/messageObjectPreviews.ts +43 -3
- package/src/modules/customers/message-objects.ts +31 -11
- package/src/modules/inbox_ops/api/emails/[id]/route.ts +44 -0
- package/src/modules/inbox_ops/api/extract/route.ts +94 -0
- package/src/modules/inbox_ops/api/proposals/[id]/translate/route.ts +6 -1
- package/src/modules/inbox_ops/api/proposals/counts/route.ts +2 -0
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.meta.ts +2 -2
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +43 -13
- package/src/modules/inbox_ops/backend/inbox-ops/page.meta.ts +2 -2
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +176 -81
- package/src/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.meta.ts +2 -2
- package/src/modules/inbox_ops/backend/inbox-ops/proposals/[id]/page.tsx +122 -68
- package/src/modules/inbox_ops/backend/inbox-ops/settings/page.meta.ts +2 -2
- package/src/modules/inbox_ops/backend/inbox-ops/settings/page.tsx +36 -14
- package/src/modules/inbox_ops/components/proposals/ActionCard.tsx +91 -7
- package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +64 -12
- package/src/modules/inbox_ops/lib/constants.ts +9 -0
- package/src/modules/inbox_ops/lib/contactValidation.ts +54 -0
- package/src/modules/inbox_ops/lib/executionEngine.ts +47 -1060
- package/src/modules/inbox_ops/lib/executionHelpers.ts +527 -0
- package/src/modules/inbox_ops/lib/extractionPrompt.ts +45 -34
- package/src/modules/inbox_ops/lib/inbox-actions-generated.d.ts +11 -0
- package/src/modules/inbox_ops/lib/translationProvider.ts +16 -10
- package/src/modules/inbox_ops/subscribers/extractionWorker.ts +16 -18
- package/src/modules/messages/commands/messages.ts +4 -0
- package/src/modules/messages/components/message-detail/panels/objects-panel.tsx +8 -1
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +3 -0
- package/src/modules/messages/frontend/messages/view/[token]/page.tsx +1 -0
- package/src/modules/resources/backend/resources/resources/[id]/page.tsx +20 -4
- package/src/modules/resources/lib/messageObjectPreviews.ts +55 -0
- package/src/modules/resources/message-objects.ts +36 -0
- package/src/modules/sales/backend/sales/channels/[channelId]/edit/page.tsx +18 -0
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +23 -0
- package/src/modules/sales/backend/sales/quotes/[id]/page.tsx +1 -1
- package/src/modules/sales/inbox-actions.ts +359 -0
- package/src/modules/sales/lib/messageObjectPreviews.ts +54 -4
- package/src/modules/sales/message-objects.ts +44 -2
- package/src/modules/sales/widgets/messages/SalesDocumentMessageDetail.tsx +72 -34
- package/src/modules/sales/widgets/messages/SalesDocumentMessagePreview.tsx +1 -1
- package/src/modules/staff/backend/staff/leave-requests/[id]/page.tsx +7 -29
- package/src/modules/staff/backend/staff/my-availability/page.tsx +14 -0
- package/src/modules/staff/backend/staff/my-leave-requests/[id]/page.tsx +8 -30
- package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +28 -7
- package/src/modules/staff/backend/staff/team-roles/[id]/edit/page.tsx +12 -0
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +12 -0
- package/src/modules/staff/components/TeamForm.tsx +3 -0
- package/src/modules/staff/components/TeamRoleForm.tsx +3 -0
- package/src/modules/staff/lib/messageObjectPreviews.ts +133 -2
- package/src/modules/staff/message-objects.ts +79 -8
- package/dist/modules/customers/widgets/messages/CustomerMessageObjectDetail.js +0 -51
- package/dist/modules/customers/widgets/messages/CustomerMessageObjectDetail.js.map +0 -7
- package/dist/modules/customers/widgets/messages/CustomerMessageObjectPreview.js +0 -35
- package/dist/modules/customers/widgets/messages/CustomerMessageObjectPreview.js.map +0 -7
- package/dist/modules/customers/widgets/messages/index.js +0 -7
- package/dist/modules/customers/widgets/messages/index.js.map +0 -7
- package/dist/modules/staff/widgets/messages/StaffMessageObjectDetail.js +0 -51
- package/dist/modules/staff/widgets/messages/StaffMessageObjectDetail.js.map +0 -7
- package/dist/modules/staff/widgets/messages/StaffMessageObjectPreview.js +0 -34
- package/dist/modules/staff/widgets/messages/StaffMessageObjectPreview.js.map +0 -7
- package/dist/modules/staff/widgets/messages/index.js +0 -7
- package/dist/modules/staff/widgets/messages/index.js.map +0 -7
- package/src/modules/customers/widgets/messages/CustomerMessageObjectDetail.tsx +0 -57
- package/src/modules/customers/widgets/messages/CustomerMessageObjectPreview.tsx +0 -49
- package/src/modules/customers/widgets/messages/index.ts +0 -2
- package/src/modules/staff/widgets/messages/StaffMessageObjectDetail.tsx +0 -57
- package/src/modules/staff/widgets/messages/StaffMessageObjectPreview.tsx +0 -44
- package/src/modules/staff/widgets/messages/index.ts +0 -2
|
@@ -112,21 +112,7 @@ export default function StaffLeaveRequestDetailPage({ params }: { params?: { id?
|
|
|
112
112
|
note: record?.note ?? null,
|
|
113
113
|
}), [record, memberLabel])
|
|
114
114
|
|
|
115
|
-
|
|
116
|
-
<div className="space-y-1">
|
|
117
|
-
<p className="font-medium">{t('staff.leaveRequests.messages.contextTitle', 'Linked leave request')}</p>
|
|
118
|
-
{memberLabel ? (
|
|
119
|
-
<p className="text-xs text-muted-foreground">
|
|
120
|
-
{t('staff.leaveRequests.detail.member', 'Team member')}: {memberLabel}
|
|
121
|
-
</p>
|
|
122
|
-
) : null}
|
|
123
|
-
<p className="text-xs text-muted-foreground">
|
|
124
|
-
{t('staff.leaveRequests.detail.dates', 'Dates')}: {dateSummary}
|
|
125
|
-
</p>
|
|
126
|
-
</div>
|
|
127
|
-
), [dateSummary, memberLabel, t])
|
|
128
|
-
|
|
129
|
-
const handleSubmit = React.useCallback(async (values: LeaveRequestFormValues) => {
|
|
115
|
+
const handleSubmit = React.useCallback(async (values: LeaveRequestFormValues) => {
|
|
130
116
|
if (!record?.id) return
|
|
131
117
|
const payload = buildLeaveRequestPayload(values, { id: record.id })
|
|
132
118
|
await updateCrud('staff/leave-requests', payload, {
|
|
@@ -239,7 +225,13 @@ export default function StaffLeaveRequestDetailPage({ params }: { params?: { id?
|
|
|
239
225
|
entityId: record.id,
|
|
240
226
|
sourceEntityType: 'staff:leave_request',
|
|
241
227
|
sourceEntityId: record.id,
|
|
228
|
+
previewData: {
|
|
229
|
+
title: memberLabel || t('staff.leaveRequests.messages.contextTitle', 'Linked leave request'),
|
|
230
|
+
subtitle: dateSummary || undefined,
|
|
231
|
+
status: record?.status ?? undefined,
|
|
232
|
+
},
|
|
242
233
|
}}
|
|
234
|
+
viewHref={`/backend/staff/leave-requests/${record.id}`}
|
|
243
235
|
lockedType="staff.leave_request_approval"
|
|
244
236
|
requiredActionConfig={{
|
|
245
237
|
mode: 'required',
|
|
@@ -253,20 +245,6 @@ export default function StaffLeaveRequestDetailPage({ params }: { params?: { id?
|
|
|
253
245
|
subject: t('staff.leaveRequests.messages.compose.subject', 'Leave request approval needed'),
|
|
254
246
|
body: t('staff.leaveRequests.messages.compose.body', 'Please review this leave request and take action.'),
|
|
255
247
|
}}
|
|
256
|
-
contextPreview={messageContextPreview}
|
|
257
|
-
renderTrigger={({ openComposer, disabled }) => (
|
|
258
|
-
<Button
|
|
259
|
-
type="button"
|
|
260
|
-
size="icon"
|
|
261
|
-
variant="outline"
|
|
262
|
-
onClick={openComposer}
|
|
263
|
-
disabled={disabled}
|
|
264
|
-
aria-label={t('staff.leaveRequests.messages.compose.action', 'Send for review')}
|
|
265
|
-
title={t('staff.leaveRequests.messages.compose.action', 'Send for review')}
|
|
266
|
-
>
|
|
267
|
-
<Send className="h-4 w-4" />
|
|
268
|
-
</Button>
|
|
269
|
-
)}
|
|
270
248
|
/>
|
|
271
249
|
) : null}
|
|
272
250
|
/>
|
|
@@ -9,6 +9,7 @@ import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
|
9
9
|
import { AvailabilityRulesEditor } from '@open-mercato/core/modules/planner/components/AvailabilityRulesEditor'
|
|
10
10
|
import { buildMemberScheduleItems } from '@open-mercato/core/modules/staff/lib/memberSchedule'
|
|
11
11
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
12
|
+
import { SendObjectMessageDialog } from '@open-mercato/ui/backend/messages'
|
|
12
13
|
|
|
13
14
|
type SelfMemberResponse = {
|
|
14
15
|
member?: {
|
|
@@ -112,6 +113,19 @@ export default function StaffMyAvailabilityPage() {
|
|
|
112
113
|
<Page>
|
|
113
114
|
<PageBody>
|
|
114
115
|
<div className="space-y-4">
|
|
116
|
+
{member.availabilityRuleSetId ? (
|
|
117
|
+
<div className="flex justify-end">
|
|
118
|
+
<SendObjectMessageDialog
|
|
119
|
+
object={{
|
|
120
|
+
entityModule: 'staff',
|
|
121
|
+
entityType: 'my_availability',
|
|
122
|
+
entityId: member.availabilityRuleSetId,
|
|
123
|
+
previewData: { title: member.displayName ?? t('staff.myAvailability.title', 'My Availability') },
|
|
124
|
+
}}
|
|
125
|
+
viewHref="/backend/staff/my-availability"
|
|
126
|
+
/>
|
|
127
|
+
</div>
|
|
128
|
+
) : null}
|
|
115
129
|
{!canManageAvailability ? (
|
|
116
130
|
<div className="space-y-2 rounded-lg border bg-card p-4 text-sm text-muted-foreground">
|
|
117
131
|
<p className="font-medium text-foreground">
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import * as React from 'react'
|
|
4
4
|
import { useRouter } from 'next/navigation'
|
|
5
|
-
import {
|
|
5
|
+
import { Send } from 'lucide-react'
|
|
6
6
|
import { Page, PageBody } from '@open-mercato/ui/backend/Page'
|
|
7
7
|
import { Badge } from '@open-mercato/ui/primitives/badge'
|
|
8
8
|
import { Button } from '@open-mercato/ui/primitives/button'
|
|
@@ -102,21 +102,7 @@ export default function StaffMyLeaveRequestDetailPage({ params }: { params?: { i
|
|
|
102
102
|
record?.startDate ?? record?.start_date ?? null,
|
|
103
103
|
record?.endDate ?? record?.end_date ?? null,
|
|
104
104
|
)
|
|
105
|
-
|
|
106
|
-
<div className="space-y-1">
|
|
107
|
-
<p className="font-medium">{t('staff.leaveRequests.messages.contextTitle', 'Linked leave request')}</p>
|
|
108
|
-
{memberLabel ? (
|
|
109
|
-
<p className="text-xs text-muted-foreground">
|
|
110
|
-
{t('staff.leaveRequests.detail.member', 'Team member')}: {memberLabel}
|
|
111
|
-
</p>
|
|
112
|
-
) : null}
|
|
113
|
-
<p className="text-xs text-muted-foreground">
|
|
114
|
-
{t('staff.leaveRequests.detail.dates', 'Dates')}: {dateSummary}
|
|
115
|
-
</p>
|
|
116
|
-
</div>
|
|
117
|
-
), [dateSummary, memberLabel, t])
|
|
118
|
-
|
|
119
|
-
const handleSubmit = React.useCallback(async (values: LeaveRequestFormValues) => {
|
|
105
|
+
const handleSubmit = React.useCallback(async (values: LeaveRequestFormValues) => {
|
|
120
106
|
if (!record?.id) return
|
|
121
107
|
const payload = buildLeaveRequestPayload(values, { id: record.id })
|
|
122
108
|
await updateCrud('staff/leave-requests', payload, {
|
|
@@ -186,7 +172,13 @@ export default function StaffMyLeaveRequestDetailPage({ params }: { params?: { i
|
|
|
186
172
|
entityId: record.id,
|
|
187
173
|
sourceEntityType: 'staff:leave_request',
|
|
188
174
|
sourceEntityId: record.id,
|
|
175
|
+
previewData: {
|
|
176
|
+
title: memberLabel || t('staff.leaveRequests.messages.contextTitle', 'Linked leave request'),
|
|
177
|
+
subtitle: dateSummary || undefined,
|
|
178
|
+
status: record?.status ?? undefined,
|
|
179
|
+
},
|
|
189
180
|
}}
|
|
181
|
+
viewHref={`/backend/staff/leave-requests/${record.id}`}
|
|
190
182
|
lockedType="staff.leave_request_approval"
|
|
191
183
|
requiredActionConfig={{
|
|
192
184
|
mode: 'required',
|
|
@@ -200,20 +192,6 @@ export default function StaffMyLeaveRequestDetailPage({ params }: { params?: { i
|
|
|
200
192
|
subject: t('staff.leaveRequests.messages.compose.subject', 'Leave request approval needed'),
|
|
201
193
|
body: t('staff.leaveRequests.messages.compose.body', 'Please review this leave request and take action.'),
|
|
202
194
|
}}
|
|
203
|
-
contextPreview={messageContextPreview}
|
|
204
|
-
renderTrigger={({ openComposer, disabled }) => (
|
|
205
|
-
<Button
|
|
206
|
-
type="button"
|
|
207
|
-
size="icon"
|
|
208
|
-
variant="outline"
|
|
209
|
-
onClick={openComposer}
|
|
210
|
-
disabled={disabled}
|
|
211
|
-
aria-label={t('staff.leaveRequests.messages.compose.action', 'Send for review')}
|
|
212
|
-
title={t('staff.leaveRequests.messages.compose.action', 'Send for review')}
|
|
213
|
-
>
|
|
214
|
-
<Leaf className="h-4 w-4" />
|
|
215
|
-
</Button>
|
|
216
|
-
)}
|
|
217
195
|
/>
|
|
218
196
|
) : null}
|
|
219
197
|
/>
|
|
@@ -31,6 +31,7 @@ import { JobHistorySection } from '@open-mercato/core/modules/staff/components/d
|
|
|
31
31
|
import type { DictionarySelectLabels } from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'
|
|
32
32
|
import { Plus } from 'lucide-react'
|
|
33
33
|
import { TranslationDrawerAction } from '@open-mercato/core/modules/translations/components/TranslationDrawerAction'
|
|
34
|
+
import { SendObjectMessageDialog } from '@open-mercato/ui/backend/messages'
|
|
34
35
|
|
|
35
36
|
const MARKDOWN_CLASSNAME =
|
|
36
37
|
'text-sm text-muted-foreground break-words [&>*]:mb-2 [&>*:last-child]:mb-0 [&_ul]:ml-4 [&_ul]:list-disc [&_ol]:ml-4 [&_ol]:list-decimal [&_code]:rounded [&_code]:bg-muted [&_code]:px-1 [&_code]:py-0.5 [&_pre]:rounded-md [&_pre]:bg-muted [&_pre]:p-3 [&_pre]:text-xs'
|
|
@@ -325,13 +326,33 @@ export default function StaffTeamMemberDetailPage({ params }: { params?: { id?:
|
|
|
325
326
|
</p>
|
|
326
327
|
</div>
|
|
327
328
|
</div>
|
|
328
|
-
<
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
329
|
+
<div className="flex items-center gap-2">
|
|
330
|
+
{memberId ? (
|
|
331
|
+
<SendObjectMessageDialog
|
|
332
|
+
object={{
|
|
333
|
+
entityModule: 'staff',
|
|
334
|
+
entityType: 'team_member',
|
|
335
|
+
entityId: memberId,
|
|
336
|
+
previewData: {
|
|
337
|
+
title: displayName,
|
|
338
|
+
metadata: {
|
|
339
|
+
[t('staff.teamMembers.detail.fields.team')]: teamLabel,
|
|
340
|
+
[t('staff.teamMembers.detail.fields.user')]: userEmail ?? t('staff.teamMembers.detail.fields.userEmpty', 'No user linked'),
|
|
341
|
+
[t('staff.teamMembers.detail.fields.roles')]: roleLabels.join(', '),
|
|
342
|
+
},
|
|
343
|
+
},
|
|
344
|
+
}}
|
|
345
|
+
viewHref={`/backend/staff/team-members/${memberId}`}
|
|
346
|
+
/>
|
|
347
|
+
) : null}
|
|
348
|
+
<TranslationDrawerAction
|
|
349
|
+
config={memberId ? {
|
|
350
|
+
entityType: 'staff:staff_team_member',
|
|
351
|
+
recordId: memberId,
|
|
352
|
+
baseValues: memberRecord ?? undefined,
|
|
353
|
+
} : null}
|
|
354
|
+
/>
|
|
355
|
+
</div>
|
|
335
356
|
</div>
|
|
336
357
|
|
|
337
358
|
<div className="border-b">
|
|
@@ -8,6 +8,7 @@ import { updateCrud, deleteCrud } from '@open-mercato/ui/backend/utils/crud'
|
|
|
8
8
|
import { flash } from '@open-mercato/ui/backend/FlashMessages'
|
|
9
9
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
10
10
|
import { TeamRoleForm, type TeamRoleFormValues, type TeamRoleOption, buildTeamRolePayload } from '@open-mercato/core/modules/staff/components/TeamRoleForm'
|
|
11
|
+
import { SendObjectMessageDialog } from '@open-mercato/ui/backend/messages'
|
|
11
12
|
import { extractCustomFieldEntries } from '@open-mercato/shared/lib/crud/custom-fields-client'
|
|
12
13
|
import { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
|
|
13
14
|
|
|
@@ -143,6 +144,17 @@ export default function StaffTeamRoleEditPage({ params }: { params?: { id?: stri
|
|
|
143
144
|
onDelete={handleDelete}
|
|
144
145
|
isLoading={!initialValues}
|
|
145
146
|
loadingMessage={t('staff.teamRoles.form.loading', 'Loading team role...')}
|
|
147
|
+
extraActions={roleId ? (
|
|
148
|
+
<SendObjectMessageDialog
|
|
149
|
+
object={{
|
|
150
|
+
entityModule: 'staff',
|
|
151
|
+
entityType: 'team_role',
|
|
152
|
+
entityId: roleId,
|
|
153
|
+
previewData: { title: initialValues?.name ?? ''},
|
|
154
|
+
}}
|
|
155
|
+
viewHref={`/backend/staff/team-roles/${roleId}/edit`}
|
|
156
|
+
/>
|
|
157
|
+
) : undefined}
|
|
146
158
|
/>
|
|
147
159
|
</PageBody>
|
|
148
160
|
</Page>
|
|
@@ -14,6 +14,7 @@ import { BooleanIcon } from '@open-mercato/ui/backend/ValueIcons'
|
|
|
14
14
|
import { flash } from '@open-mercato/ui/backend/FlashMessages'
|
|
15
15
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
16
16
|
import { TeamForm, type TeamFormValues, buildTeamPayload } from '@open-mercato/core/modules/staff/components/TeamForm'
|
|
17
|
+
import { SendObjectMessageDialog } from '@open-mercato/ui/backend/messages'
|
|
17
18
|
import { extractCustomFieldEntries } from '@open-mercato/shared/lib/crud/custom-fields-client'
|
|
18
19
|
import { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
|
|
19
20
|
import { Plus } from 'lucide-react'
|
|
@@ -333,6 +334,17 @@ export default function StaffTeamEditPage({ params }: { params?: { id?: string }
|
|
|
333
334
|
onDelete={handleDelete}
|
|
334
335
|
isLoading={!initialValues}
|
|
335
336
|
loadingMessage={t('staff.teams.form.loading', 'Loading team...')}
|
|
337
|
+
extraActions={teamId ? (
|
|
338
|
+
<SendObjectMessageDialog
|
|
339
|
+
object={{
|
|
340
|
+
entityModule: 'staff',
|
|
341
|
+
entityType: 'team',
|
|
342
|
+
entityId: teamId,
|
|
343
|
+
previewData: { title: initialValues?.name ?? ''},
|
|
344
|
+
}}
|
|
345
|
+
viewHref={`/backend/staff/teams/${teamId}/edit`}
|
|
346
|
+
/>
|
|
347
|
+
) : undefined}
|
|
336
348
|
/>
|
|
337
349
|
) : (
|
|
338
350
|
<DataTable<TeamMemberRow>
|
|
@@ -24,6 +24,7 @@ export type TeamFormProps = {
|
|
|
24
24
|
onDelete?: () => Promise<void>
|
|
25
25
|
isLoading?: boolean
|
|
26
26
|
loadingMessage?: string
|
|
27
|
+
extraActions?: React.ReactNode
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
const normalizeCustomFieldSubmitValue = (value: unknown): unknown => {
|
|
@@ -60,6 +61,7 @@ export function TeamForm(props: TeamFormProps) {
|
|
|
60
61
|
onDelete,
|
|
61
62
|
isLoading,
|
|
62
63
|
loadingMessage,
|
|
64
|
+
extraActions,
|
|
63
65
|
} = props
|
|
64
66
|
const t = useT()
|
|
65
67
|
|
|
@@ -91,6 +93,7 @@ export function TeamForm(props: TeamFormProps) {
|
|
|
91
93
|
onDelete={onDelete}
|
|
92
94
|
isLoading={isLoading}
|
|
93
95
|
loadingMessage={loadingMessage}
|
|
96
|
+
extraActions={extraActions}
|
|
94
97
|
/>
|
|
95
98
|
)
|
|
96
99
|
}
|
|
@@ -32,6 +32,7 @@ export type TeamRoleFormProps = {
|
|
|
32
32
|
onDelete?: () => Promise<void>
|
|
33
33
|
isLoading?: boolean
|
|
34
34
|
loadingMessage?: string
|
|
35
|
+
extraActions?: React.ReactNode
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
const normalizeCustomFieldSubmitValue = (value: unknown): unknown => {
|
|
@@ -75,6 +76,7 @@ export function TeamRoleForm(props: TeamRoleFormProps) {
|
|
|
75
76
|
onDelete,
|
|
76
77
|
isLoading,
|
|
77
78
|
loadingMessage,
|
|
79
|
+
extraActions,
|
|
78
80
|
} = props
|
|
79
81
|
const t = useT()
|
|
80
82
|
|
|
@@ -154,6 +156,7 @@ export function TeamRoleForm(props: TeamRoleFormProps) {
|
|
|
154
156
|
onDelete={onDelete}
|
|
155
157
|
isLoading={isLoading}
|
|
156
158
|
loadingMessage={loadingMessage}
|
|
159
|
+
extraActions={extraActions}
|
|
157
160
|
/>
|
|
158
161
|
)
|
|
159
162
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
|
|
2
|
-
import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
2
|
+
import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
3
3
|
import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
|
|
4
4
|
import type { ObjectPreviewData } from '@open-mercato/shared/modules/messages/types'
|
|
5
5
|
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
6
|
-
import { StaffLeaveRequest, StaffTeam, StaffTeamMember } from '../data/entities'
|
|
6
|
+
import { StaffLeaveRequest, StaffTeam, StaffTeamMember, StaffTeamRole } from '../data/entities'
|
|
7
|
+
import { PlannerAvailabilityRuleSet } from '../../planner/data/entities'
|
|
8
|
+
import { User } from '../../auth/data/entities'
|
|
7
9
|
|
|
8
10
|
type PreviewContext = {
|
|
9
11
|
tenantId: string
|
|
@@ -170,6 +172,56 @@ export async function loadTeamMemberPreview(
|
|
|
170
172
|
|
|
171
173
|
const tags = Array.isArray(member.tags) ? member.tags : []
|
|
172
174
|
const metadata: Record<string, string> = {}
|
|
175
|
+
const teamLabel = t('staff.teamMembers.detail.fields.team')
|
|
176
|
+
const userLabel = t('staff.teamMembers.detail.fields.user')
|
|
177
|
+
const rolesLabel = t('staff.teamMembers.detail.fields.roles')
|
|
178
|
+
|
|
179
|
+
if (member.teamId) {
|
|
180
|
+
const team = await findOneWithDecryption(
|
|
181
|
+
em,
|
|
182
|
+
StaffTeam,
|
|
183
|
+
{
|
|
184
|
+
id: member.teamId,
|
|
185
|
+
tenantId: ctx.tenantId,
|
|
186
|
+
organizationId: ctx.organizationId,
|
|
187
|
+
deletedAt: null,
|
|
188
|
+
},
|
|
189
|
+
undefined,
|
|
190
|
+
{ tenantId: ctx.tenantId, organizationId: ctx.organizationId },
|
|
191
|
+
)
|
|
192
|
+
if (team?.name) metadata[teamLabel] = team.name
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (member.userId) {
|
|
196
|
+
const user = await findOneWithDecryption(
|
|
197
|
+
em,
|
|
198
|
+
User,
|
|
199
|
+
{ id: member.userId },
|
|
200
|
+
undefined,
|
|
201
|
+
{ tenantId: ctx.tenantId, organizationId: ctx.organizationId },
|
|
202
|
+
)
|
|
203
|
+
if (user?.email) metadata[userLabel] = user.email
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (Array.isArray(member.roleIds) && member.roleIds.length > 0) {
|
|
207
|
+
const roles = await findWithDecryption(
|
|
208
|
+
em,
|
|
209
|
+
StaffTeamRole,
|
|
210
|
+
{
|
|
211
|
+
id: { $in: member.roleIds },
|
|
212
|
+
tenantId: ctx.tenantId,
|
|
213
|
+
organizationId: ctx.organizationId,
|
|
214
|
+
deletedAt: null,
|
|
215
|
+
},
|
|
216
|
+
{ orderBy: { name: 'ASC' } },
|
|
217
|
+
{ tenantId: ctx.tenantId, organizationId: ctx.organizationId },
|
|
218
|
+
)
|
|
219
|
+
const roleNames = roles
|
|
220
|
+
.map((role) => role.name?.trim())
|
|
221
|
+
.filter((name): name is string => Boolean(name && name.length > 0))
|
|
222
|
+
if (roleNames.length > 0) metadata[rolesLabel] = roleNames.join(', ')
|
|
223
|
+
}
|
|
224
|
+
|
|
173
225
|
if (tags.length > 0) metadata.Tags = tags.slice(0, 5).join(', ')
|
|
174
226
|
|
|
175
227
|
return {
|
|
@@ -180,3 +232,82 @@ export async function loadTeamMemberPreview(
|
|
|
180
232
|
metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
|
|
181
233
|
}
|
|
182
234
|
}
|
|
235
|
+
|
|
236
|
+
export async function loadStaffTeamRolePreview(
|
|
237
|
+
entityId: string,
|
|
238
|
+
ctx: PreviewContext,
|
|
239
|
+
): Promise<ObjectPreviewData> {
|
|
240
|
+
const { t } = await resolveTranslations()
|
|
241
|
+
const defaultTitle = t('staff.messageObjects.teamRole.title')
|
|
242
|
+
|
|
243
|
+
if (!ctx.organizationId) {
|
|
244
|
+
return { title: defaultTitle, subtitle: entityId }
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const { resolve } = await createRequestContainer()
|
|
248
|
+
const em = resolve('em') as EntityManager
|
|
249
|
+
|
|
250
|
+
const role = await findOneWithDecryption(
|
|
251
|
+
em,
|
|
252
|
+
StaffTeamRole,
|
|
253
|
+
{
|
|
254
|
+
id: entityId,
|
|
255
|
+
tenantId: ctx.tenantId,
|
|
256
|
+
organizationId: ctx.organizationId,
|
|
257
|
+
deletedAt: null,
|
|
258
|
+
},
|
|
259
|
+
undefined,
|
|
260
|
+
{ tenantId: ctx.tenantId, organizationId: ctx.organizationId },
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
if (!role) {
|
|
264
|
+
return {
|
|
265
|
+
title: defaultTitle,
|
|
266
|
+
subtitle: entityId,
|
|
267
|
+
status: t('staff.messageObjects.notFound'),
|
|
268
|
+
statusColor: 'gray',
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
return {
|
|
273
|
+
title: role.name,
|
|
274
|
+
subtitle: role.description ?? undefined,
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export async function loadStaffAvailabilityPreview(
|
|
279
|
+
entityId: string,
|
|
280
|
+
ctx: PreviewContext,
|
|
281
|
+
): Promise<ObjectPreviewData> {
|
|
282
|
+
const { t } = await resolveTranslations()
|
|
283
|
+
const defaultTitle = t('staff.messageObjects.myAvailability.title')
|
|
284
|
+
|
|
285
|
+
if (!ctx.organizationId) {
|
|
286
|
+
return { title: defaultTitle, subtitle: entityId }
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const { resolve } = await createRequestContainer()
|
|
290
|
+
const em = resolve('em') as EntityManager
|
|
291
|
+
|
|
292
|
+
const ruleSet = await findOneWithDecryption(
|
|
293
|
+
em,
|
|
294
|
+
PlannerAvailabilityRuleSet,
|
|
295
|
+
{
|
|
296
|
+
id: entityId,
|
|
297
|
+
tenantId: ctx.tenantId,
|
|
298
|
+
organizationId: ctx.organizationId,
|
|
299
|
+
deletedAt: null,
|
|
300
|
+
},
|
|
301
|
+
undefined,
|
|
302
|
+
{ tenantId: ctx.tenantId, organizationId: ctx.organizationId },
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
if (!ruleSet) {
|
|
306
|
+
return { title: defaultTitle, subtitle: entityId }
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return {
|
|
310
|
+
title: ruleSet.name,
|
|
311
|
+
subtitle: ruleSet.description ?? undefined,
|
|
312
|
+
}
|
|
313
|
+
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { MessageObjectTypeDefinition } from '@open-mercato/shared/modules/messages/types'
|
|
2
|
+
import { MessageObjectDetail, MessageObjectPreview } from '@open-mercato/ui/backend/messages'
|
|
2
3
|
import { LeaveRequestDetail } from './components/LeaveRequestDetail'
|
|
3
4
|
import { LeaveRequestPreview } from './components/LeaveRequestPreview'
|
|
4
|
-
import { StaffMessageObjectDetail } from './widgets/messages/StaffMessageObjectDetail'
|
|
5
|
-
import { StaffMessageObjectPreview } from './widgets/messages/StaffMessageObjectPreview'
|
|
6
5
|
|
|
7
6
|
export const messageObjectTypes: MessageObjectTypeDefinition[] = [
|
|
8
7
|
{
|
|
@@ -60,9 +59,18 @@ export const messageObjectTypes: MessageObjectTypeDefinition[] = [
|
|
|
60
59
|
optionSubtitleField: 'description',
|
|
61
60
|
labelKey: 'staff.teams.page.title',
|
|
62
61
|
icon: 'users',
|
|
63
|
-
PreviewComponent:
|
|
64
|
-
DetailComponent:
|
|
65
|
-
actions: [
|
|
62
|
+
PreviewComponent: MessageObjectPreview,
|
|
63
|
+
DetailComponent: MessageObjectDetail,
|
|
64
|
+
actions: [
|
|
65
|
+
{
|
|
66
|
+
id: 'view',
|
|
67
|
+
labelKey: 'common.view',
|
|
68
|
+
variant: 'outline',
|
|
69
|
+
href: '/backend/staff/teams/{entityId}/edit',
|
|
70
|
+
icon: 'external-link',
|
|
71
|
+
isTerminal: false,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
66
74
|
loadPreview: async (entityId, ctx) => {
|
|
67
75
|
if (typeof window !== 'undefined') {
|
|
68
76
|
return {
|
|
@@ -83,9 +91,18 @@ export const messageObjectTypes: MessageObjectTypeDefinition[] = [
|
|
|
83
91
|
optionSubtitleField: 'email',
|
|
84
92
|
labelKey: 'staff.teamMembers.page.title',
|
|
85
93
|
icon: 'user-round',
|
|
86
|
-
PreviewComponent:
|
|
87
|
-
DetailComponent:
|
|
88
|
-
actions: [
|
|
94
|
+
PreviewComponent: MessageObjectPreview,
|
|
95
|
+
DetailComponent: MessageObjectDetail,
|
|
96
|
+
actions: [
|
|
97
|
+
{
|
|
98
|
+
id: 'view',
|
|
99
|
+
labelKey: 'common.view',
|
|
100
|
+
variant: 'outline',
|
|
101
|
+
href: '/backend/staff/team-members/{entityId}',
|
|
102
|
+
icon: 'external-link',
|
|
103
|
+
isTerminal: false,
|
|
104
|
+
},
|
|
105
|
+
],
|
|
89
106
|
loadPreview: async (entityId, ctx) => {
|
|
90
107
|
if (typeof window !== 'undefined') {
|
|
91
108
|
return {
|
|
@@ -97,6 +114,60 @@ export const messageObjectTypes: MessageObjectTypeDefinition[] = [
|
|
|
97
114
|
return loadTeamMemberPreview(entityId, ctx)
|
|
98
115
|
},
|
|
99
116
|
},
|
|
117
|
+
{
|
|
118
|
+
module: 'staff',
|
|
119
|
+
entityType: 'team_role',
|
|
120
|
+
messageTypes: ['default', 'messages.defaultWithObjects'],
|
|
121
|
+
entityId: 'staff:staff_team_role',
|
|
122
|
+
optionLabelField: 'name',
|
|
123
|
+
optionSubtitleField: 'description',
|
|
124
|
+
labelKey: 'staff.messageObjects.teamRole.title',
|
|
125
|
+
icon: 'shield',
|
|
126
|
+
PreviewComponent: MessageObjectPreview,
|
|
127
|
+
DetailComponent: MessageObjectDetail,
|
|
128
|
+
actions: [
|
|
129
|
+
{
|
|
130
|
+
id: 'view',
|
|
131
|
+
labelKey: 'common.view',
|
|
132
|
+
variant: 'outline',
|
|
133
|
+
href: '/backend/staff/team-roles/{entityId}/edit',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
loadPreview: async (entityId, ctx) => {
|
|
137
|
+
if (typeof window !== 'undefined') {
|
|
138
|
+
return { title: 'Team role', subtitle: entityId }
|
|
139
|
+
}
|
|
140
|
+
const { loadStaffTeamRolePreview } = await import('./lib/messageObjectPreviews')
|
|
141
|
+
return loadStaffTeamRolePreview(entityId, ctx)
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
module: 'staff',
|
|
146
|
+
entityType: 'my_availability',
|
|
147
|
+
messageTypes: ['default', 'messages.defaultWithObjects'],
|
|
148
|
+
entityId: 'planner:planner_availability_rule_set',
|
|
149
|
+
optionLabelField: 'name',
|
|
150
|
+
optionSubtitleField: 'description',
|
|
151
|
+
labelKey: 'staff.messageObjects.myAvailability.title',
|
|
152
|
+
icon: 'calendar-clock',
|
|
153
|
+
PreviewComponent: MessageObjectPreview,
|
|
154
|
+
DetailComponent: MessageObjectDetail,
|
|
155
|
+
actions: [
|
|
156
|
+
{
|
|
157
|
+
id: 'view',
|
|
158
|
+
labelKey: 'common.view',
|
|
159
|
+
variant: 'outline',
|
|
160
|
+
href: '/backend/staff/my-availability',
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
loadPreview: async (entityId, ctx) => {
|
|
164
|
+
if (typeof window !== 'undefined') {
|
|
165
|
+
return { title: 'My availability', subtitle: entityId }
|
|
166
|
+
}
|
|
167
|
+
const { loadStaffAvailabilityPreview } = await import('./lib/messageObjectPreviews')
|
|
168
|
+
return loadStaffAvailabilityPreview(entityId, ctx)
|
|
169
|
+
},
|
|
170
|
+
},
|
|
100
171
|
]
|
|
101
172
|
|
|
102
173
|
export default messageObjectTypes
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
5
|
-
import { Button } from "@open-mercato/ui/primitives/button";
|
|
6
|
-
import { CustomerMessageObjectPreview } from "./CustomerMessageObjectPreview.js";
|
|
7
|
-
function CustomerMessageObjectDetail(props) {
|
|
8
|
-
const t = useT();
|
|
9
|
-
const [executingActionId, setExecutingActionId] = React.useState(null);
|
|
10
|
-
return /* @__PURE__ */ jsxs("div", { className: "space-y-3 rounded border p-3", children: [
|
|
11
|
-
/* @__PURE__ */ jsx(
|
|
12
|
-
CustomerMessageObjectPreview,
|
|
13
|
-
{
|
|
14
|
-
entityId: props.entityId,
|
|
15
|
-
entityModule: props.entityModule,
|
|
16
|
-
entityType: props.entityType,
|
|
17
|
-
snapshot: props.snapshot,
|
|
18
|
-
previewData: props.previewData,
|
|
19
|
-
actionRequired: props.actionRequired,
|
|
20
|
-
actionType: props.actionType,
|
|
21
|
-
actionLabel: props.actionLabel
|
|
22
|
-
}
|
|
23
|
-
),
|
|
24
|
-
props.actions.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: props.actions.map((action) => /* @__PURE__ */ jsx(
|
|
25
|
-
Button,
|
|
26
|
-
{
|
|
27
|
-
type: "button",
|
|
28
|
-
size: "sm",
|
|
29
|
-
variant: action.variant ?? "default",
|
|
30
|
-
disabled: executingActionId !== null,
|
|
31
|
-
onClick: async () => {
|
|
32
|
-
if (executingActionId) return;
|
|
33
|
-
setExecutingActionId(action.id);
|
|
34
|
-
try {
|
|
35
|
-
await props.onAction(action.id, { id: props.entityId });
|
|
36
|
-
} finally {
|
|
37
|
-
setExecutingActionId(null);
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
children: executingActionId === action.id ? t("messages.actions.executing", "Executing...") : t(action.labelKey ?? action.id, action.id)
|
|
41
|
-
},
|
|
42
|
-
action.id
|
|
43
|
-
)) }) : null
|
|
44
|
-
] });
|
|
45
|
-
}
|
|
46
|
-
var CustomerMessageObjectDetail_default = CustomerMessageObjectDetail;
|
|
47
|
-
export {
|
|
48
|
-
CustomerMessageObjectDetail,
|
|
49
|
-
CustomerMessageObjectDetail_default as default
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=CustomerMessageObjectDetail.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/customers/widgets/messages/CustomerMessageObjectDetail.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { ObjectDetailProps } from '@open-mercato/shared/modules/messages/types'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { CustomerMessageObjectPreview } from './CustomerMessageObjectPreview'\n\nexport function CustomerMessageObjectDetail(props: ObjectDetailProps) {\n const t = useT()\n const [executingActionId, setExecutingActionId] = React.useState<string | null>(null)\n\n return (\n <div className=\"space-y-3 rounded border p-3\">\n <CustomerMessageObjectPreview\n entityId={props.entityId}\n entityModule={props.entityModule}\n entityType={props.entityType}\n snapshot={props.snapshot}\n previewData={props.previewData}\n actionRequired={props.actionRequired}\n actionType={props.actionType}\n actionLabel={props.actionLabel}\n />\n\n {props.actions.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {props.actions.map((action) => (\n <Button\n key={action.id}\n type=\"button\"\n size=\"sm\"\n variant={action.variant ?? 'default'}\n disabled={executingActionId !== null}\n onClick={async () => {\n if (executingActionId) return\n setExecutingActionId(action.id)\n try {\n await props.onAction(action.id, { id: props.entityId })\n } finally {\n setExecutingActionId(null)\n }\n }}\n >\n {executingActionId === action.id\n ? t('messages.actions.executing', 'Executing...')\n : t(action.labelKey ?? action.id, action.id)}\n </Button>\n ))}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default CustomerMessageObjectDetail\n\n"],
|
|
5
|
-
"mappings": ";AAaI,SACE,KADF;AAXJ,YAAY,WAAW;AACvB,SAAS,YAAY;AAErB,SAAS,cAAc;AACvB,SAAS,oCAAoC;AAEtC,SAAS,4BAA4B,OAA0B;AACpE,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAwB,IAAI;AAEpF,SACE,qBAAC,SAAI,WAAU,gCACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,MAAM;AAAA,QAChB,cAAc,MAAM;AAAA,QACpB,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,aAAa,MAAM;AAAA,QACnB,gBAAgB,MAAM;AAAA,QACtB,YAAY,MAAM;AAAA,QAClB,aAAa,MAAM;AAAA;AAAA,IACrB;AAAA,IAEC,MAAM,QAAQ,SAAS,IACtB,oBAAC,SAAI,WAAU,wBACZ,gBAAM,QAAQ,IAAI,CAAC,WAClB;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAS,OAAO,WAAW;AAAA,QAC3B,UAAU,sBAAsB;AAAA,QAChC,SAAS,YAAY;AACnB,cAAI,kBAAmB;AACvB,+BAAqB,OAAO,EAAE;AAC9B,cAAI;AACF,kBAAM,MAAM,SAAS,OAAO,IAAI,EAAE,IAAI,MAAM,SAAS,CAAC;AAAA,UACxD,UAAE;AACA,iCAAqB,IAAI;AAAA,UAC3B;AAAA,QACF;AAAA,QAEC,gCAAsB,OAAO,KAC1B,EAAE,8BAA8B,cAAc,IAC9C,EAAE,OAAO,YAAY,OAAO,IAAI,OAAO,EAAE;AAAA;AAAA,MAjBxC,OAAO;AAAA,IAkBd,CACD,GACH,IACE;AAAA,KACN;AAEJ;AAEA,IAAO,sCAAQ;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|