@open-mercato/core 0.4.5-develop-610fbb24ec → 0.4.5-develop-811deeb983

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 (141) hide show
  1. package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js +17 -2
  2. package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js.map +2 -2
  3. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +15 -0
  4. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  5. package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js +30 -0
  6. package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js.map +2 -2
  7. package/dist/modules/catalog/data/validators.js +4 -3
  8. package/dist/modules/catalog/data/validators.js.map +2 -2
  9. package/dist/modules/catalog/lib/messageObjectPreviews.js +146 -0
  10. package/dist/modules/catalog/lib/messageObjectPreviews.js.map +7 -0
  11. package/dist/modules/catalog/message-objects.js +95 -0
  12. package/dist/modules/catalog/message-objects.js.map +7 -0
  13. package/dist/modules/currencies/backend/currencies/[id]/page.js +21 -0
  14. package/dist/modules/currencies/backend/currencies/[id]/page.js.map +2 -2
  15. package/dist/modules/currencies/lib/messageObjectPreviews.js +51 -0
  16. package/dist/modules/currencies/lib/messageObjectPreviews.js.map +7 -0
  17. package/dist/modules/currencies/message-objects.js +41 -0
  18. package/dist/modules/currencies/message-objects.js.map +7 -0
  19. package/dist/modules/customers/backend/customers/companies/[id]/page.js +20 -0
  20. package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
  21. package/dist/modules/customers/backend/customers/deals/[id]/page.js +12 -1
  22. package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
  23. package/dist/modules/customers/backend/customers/people/[id]/page.js +20 -0
  24. package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
  25. package/dist/modules/customers/components/detail/CompanyHighlights.js +18 -14
  26. package/dist/modules/customers/components/detail/CompanyHighlights.js.map +2 -2
  27. package/dist/modules/customers/components/detail/PersonHighlights.js +18 -14
  28. package/dist/modules/customers/components/detail/PersonHighlights.js.map +2 -2
  29. package/dist/modules/customers/lib/messageObjectPreviews.js +41 -5
  30. package/dist/modules/customers/lib/messageObjectPreviews.js.map +2 -2
  31. package/dist/modules/customers/message-objects.js +31 -11
  32. package/dist/modules/customers/message-objects.js.map +2 -2
  33. package/dist/modules/messages/commands/messages.js +3 -0
  34. package/dist/modules/messages/commands/messages.js.map +2 -2
  35. package/dist/modules/messages/components/message-detail/panels/objects-panel.js +6 -1
  36. package/dist/modules/messages/components/message-detail/panels/objects-panel.js.map +2 -2
  37. package/dist/modules/messages/components/message-detail/panels/thread-panel.js +4 -1
  38. package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
  39. package/dist/modules/messages/frontend/messages/view/[token]/page.js +1 -0
  40. package/dist/modules/messages/frontend/messages/view/[token]/page.js.map +2 -2
  41. package/dist/modules/resources/backend/resources/resources/[id]/page.js +24 -7
  42. package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
  43. package/dist/modules/resources/lib/messageObjectPreviews.js +43 -0
  44. package/dist/modules/resources/lib/messageObjectPreviews.js.map +7 -0
  45. package/dist/modules/resources/message-objects.js +37 -0
  46. package/dist/modules/resources/message-objects.js.map +7 -0
  47. package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js +19 -0
  48. package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js.map +2 -2
  49. package/dist/modules/sales/backend/sales/documents/[id]/page.js +23 -2
  50. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  51. package/dist/modules/sales/backend/sales/quotes/[id]/page.js +1 -1
  52. package/dist/modules/sales/backend/sales/quotes/[id]/page.js.map +2 -2
  53. package/dist/modules/sales/lib/messageObjectPreviews.js +49 -4
  54. package/dist/modules/sales/lib/messageObjectPreviews.js.map +2 -2
  55. package/dist/modules/sales/message-objects.js +44 -2
  56. package/dist/modules/sales/message-objects.js.map +2 -2
  57. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js +59 -30
  58. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js.map +2 -2
  59. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js +1 -1
  60. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js.map +1 -1
  61. package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js +8 -30
  62. package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js.map +2 -2
  63. package/dist/modules/staff/backend/staff/my-availability/page.js +13 -0
  64. package/dist/modules/staff/backend/staff/my-availability/page.js.map +2 -2
  65. package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js +8 -31
  66. package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js.map +2 -2
  67. package/dist/modules/staff/backend/staff/team-members/[id]/page.js +32 -10
  68. package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +2 -2
  69. package/dist/modules/staff/backend/staff/team-roles/[id]/edit/page.js +14 -1
  70. package/dist/modules/staff/backend/staff/team-roles/[id]/edit/page.js.map +2 -2
  71. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +14 -1
  72. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  73. package/dist/modules/staff/components/TeamForm.js +4 -2
  74. package/dist/modules/staff/components/TeamForm.js.map +2 -2
  75. package/dist/modules/staff/components/TeamRoleForm.js +4 -2
  76. package/dist/modules/staff/components/TeamRoleForm.js.map +2 -2
  77. package/dist/modules/staff/lib/messageObjectPreviews.js +111 -2
  78. package/dist/modules/staff/lib/messageObjectPreviews.js.map +2 -2
  79. package/dist/modules/staff/message-objects.js +79 -8
  80. package/dist/modules/staff/message-objects.js.map +2 -2
  81. package/package.json +3 -3
  82. package/src/modules/catalog/backend/catalog/categories/[id]/edit/page.tsx +19 -5
  83. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +14 -0
  84. package/src/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.tsx +40 -0
  85. package/src/modules/catalog/data/validators.ts +47 -45
  86. package/src/modules/catalog/lib/messageObjectPreviews.ts +176 -0
  87. package/src/modules/catalog/message-objects.ts +102 -0
  88. package/src/modules/currencies/backend/currencies/[id]/page.tsx +20 -0
  89. package/src/modules/currencies/lib/messageObjectPreviews.ts +65 -0
  90. package/src/modules/currencies/message-objects.ts +40 -0
  91. package/src/modules/customers/backend/customers/companies/[id]/page.tsx +19 -0
  92. package/src/modules/customers/backend/customers/deals/[id]/page.tsx +13 -0
  93. package/src/modules/customers/backend/customers/people/[id]/page.tsx +19 -0
  94. package/src/modules/customers/components/detail/CompanyHighlights.tsx +14 -9
  95. package/src/modules/customers/components/detail/PersonHighlights.tsx +14 -9
  96. package/src/modules/customers/lib/messageObjectPreviews.ts +43 -3
  97. package/src/modules/customers/message-objects.ts +31 -11
  98. package/src/modules/customers/migrations/.snapshot-open-mercato.json +236 -0
  99. package/src/modules/customers/migrations/.snapshot-openmercato.json +236 -0
  100. package/src/modules/messages/commands/messages.ts +4 -0
  101. package/src/modules/messages/components/message-detail/panels/objects-panel.tsx +8 -1
  102. package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +3 -0
  103. package/src/modules/messages/frontend/messages/view/[token]/page.tsx +1 -0
  104. package/src/modules/resources/backend/resources/resources/[id]/page.tsx +20 -4
  105. package/src/modules/resources/lib/messageObjectPreviews.ts +55 -0
  106. package/src/modules/resources/message-objects.ts +36 -0
  107. package/src/modules/sales/backend/sales/channels/[channelId]/edit/page.tsx +18 -0
  108. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +23 -0
  109. package/src/modules/sales/backend/sales/quotes/[id]/page.tsx +1 -1
  110. package/src/modules/sales/lib/messageObjectPreviews.ts +54 -4
  111. package/src/modules/sales/message-objects.ts +44 -2
  112. package/src/modules/sales/widgets/messages/SalesDocumentMessageDetail.tsx +72 -34
  113. package/src/modules/sales/widgets/messages/SalesDocumentMessagePreview.tsx +1 -1
  114. package/src/modules/staff/backend/staff/leave-requests/[id]/page.tsx +7 -29
  115. package/src/modules/staff/backend/staff/my-availability/page.tsx +14 -0
  116. package/src/modules/staff/backend/staff/my-leave-requests/[id]/page.tsx +8 -30
  117. package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +28 -7
  118. package/src/modules/staff/backend/staff/team-roles/[id]/edit/page.tsx +12 -0
  119. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +12 -0
  120. package/src/modules/staff/components/TeamForm.tsx +3 -0
  121. package/src/modules/staff/components/TeamRoleForm.tsx +3 -0
  122. package/src/modules/staff/lib/messageObjectPreviews.ts +133 -2
  123. package/src/modules/staff/message-objects.ts +79 -8
  124. package/dist/modules/customers/widgets/messages/CustomerMessageObjectDetail.js +0 -51
  125. package/dist/modules/customers/widgets/messages/CustomerMessageObjectDetail.js.map +0 -7
  126. package/dist/modules/customers/widgets/messages/CustomerMessageObjectPreview.js +0 -35
  127. package/dist/modules/customers/widgets/messages/CustomerMessageObjectPreview.js.map +0 -7
  128. package/dist/modules/customers/widgets/messages/index.js +0 -7
  129. package/dist/modules/customers/widgets/messages/index.js.map +0 -7
  130. package/dist/modules/staff/widgets/messages/StaffMessageObjectDetail.js +0 -51
  131. package/dist/modules/staff/widgets/messages/StaffMessageObjectDetail.js.map +0 -7
  132. package/dist/modules/staff/widgets/messages/StaffMessageObjectPreview.js +0 -34
  133. package/dist/modules/staff/widgets/messages/StaffMessageObjectPreview.js.map +0 -7
  134. package/dist/modules/staff/widgets/messages/index.js +0 -7
  135. package/dist/modules/staff/widgets/messages/index.js.map +0 -7
  136. package/src/modules/customers/widgets/messages/CustomerMessageObjectDetail.tsx +0 -57
  137. package/src/modules/customers/widgets/messages/CustomerMessageObjectPreview.tsx +0 -49
  138. package/src/modules/customers/widgets/messages/index.ts +0 -2
  139. package/src/modules/staff/widgets/messages/StaffMessageObjectDetail.tsx +0 -57
  140. package/src/modules/staff/widgets/messages/StaffMessageObjectPreview.tsx +0 -44
  141. package/src/modules/staff/widgets/messages/index.ts +0 -2
@@ -175,6 +175,24 @@
175
175
  "nullable": true,
176
176
  "length": 6,
177
177
  "mappedType": "datetime"
178
+ },
179
+ "pipeline_id": {
180
+ "name": "pipeline_id",
181
+ "type": "uuid",
182
+ "unsigned": false,
183
+ "autoincrement": false,
184
+ "primary": false,
185
+ "nullable": true,
186
+ "mappedType": "uuid"
187
+ },
188
+ "pipeline_stage_id": {
189
+ "name": "pipeline_stage_id",
190
+ "type": "uuid",
191
+ "unsigned": false,
192
+ "autoincrement": false,
193
+ "primary": false,
194
+ "nullable": true,
195
+ "mappedType": "uuid"
178
196
  }
179
197
  },
180
198
  "name": "customer_deals",
@@ -2585,6 +2603,224 @@
2585
2603
  }
2586
2604
  },
2587
2605
  "nativeEnums": {}
2606
+ },
2607
+ {
2608
+ "columns": {
2609
+ "id": {
2610
+ "name": "id",
2611
+ "type": "uuid",
2612
+ "unsigned": false,
2613
+ "autoincrement": false,
2614
+ "primary": false,
2615
+ "nullable": false,
2616
+ "default": "gen_random_uuid()",
2617
+ "mappedType": "uuid"
2618
+ },
2619
+ "organization_id": {
2620
+ "name": "organization_id",
2621
+ "type": "uuid",
2622
+ "unsigned": false,
2623
+ "autoincrement": false,
2624
+ "primary": false,
2625
+ "nullable": false,
2626
+ "mappedType": "uuid"
2627
+ },
2628
+ "tenant_id": {
2629
+ "name": "tenant_id",
2630
+ "type": "uuid",
2631
+ "unsigned": false,
2632
+ "autoincrement": false,
2633
+ "primary": false,
2634
+ "nullable": false,
2635
+ "mappedType": "uuid"
2636
+ },
2637
+ "name": {
2638
+ "name": "name",
2639
+ "type": "text",
2640
+ "unsigned": false,
2641
+ "autoincrement": false,
2642
+ "primary": false,
2643
+ "nullable": false,
2644
+ "mappedType": "text"
2645
+ },
2646
+ "is_default": {
2647
+ "name": "is_default",
2648
+ "type": "boolean",
2649
+ "unsigned": false,
2650
+ "autoincrement": false,
2651
+ "primary": false,
2652
+ "nullable": false,
2653
+ "default": "false",
2654
+ "mappedType": "boolean"
2655
+ },
2656
+ "created_at": {
2657
+ "name": "created_at",
2658
+ "type": "timestamptz",
2659
+ "unsigned": false,
2660
+ "autoincrement": false,
2661
+ "primary": false,
2662
+ "nullable": false,
2663
+ "length": 6,
2664
+ "mappedType": "datetime"
2665
+ },
2666
+ "updated_at": {
2667
+ "name": "updated_at",
2668
+ "type": "timestamptz",
2669
+ "unsigned": false,
2670
+ "autoincrement": false,
2671
+ "primary": false,
2672
+ "nullable": false,
2673
+ "length": 6,
2674
+ "mappedType": "datetime"
2675
+ }
2676
+ },
2677
+ "name": "customer_pipelines",
2678
+ "schema": "public",
2679
+ "indexes": [
2680
+ {
2681
+ "keyName": "customer_pipelines_org_tenant_idx",
2682
+ "columnNames": [
2683
+ "organization_id",
2684
+ "tenant_id"
2685
+ ],
2686
+ "composite": true,
2687
+ "constraint": false,
2688
+ "primary": false,
2689
+ "unique": false
2690
+ },
2691
+ {
2692
+ "keyName": "customer_pipelines_pkey",
2693
+ "columnNames": [
2694
+ "id"
2695
+ ],
2696
+ "composite": false,
2697
+ "constraint": true,
2698
+ "primary": true,
2699
+ "unique": true
2700
+ }
2701
+ ],
2702
+ "checks": [],
2703
+ "foreignKeys": {},
2704
+ "nativeEnums": {}
2705
+ },
2706
+ {
2707
+ "columns": {
2708
+ "id": {
2709
+ "name": "id",
2710
+ "type": "uuid",
2711
+ "unsigned": false,
2712
+ "autoincrement": false,
2713
+ "primary": false,
2714
+ "nullable": false,
2715
+ "default": "gen_random_uuid()",
2716
+ "mappedType": "uuid"
2717
+ },
2718
+ "organization_id": {
2719
+ "name": "organization_id",
2720
+ "type": "uuid",
2721
+ "unsigned": false,
2722
+ "autoincrement": false,
2723
+ "primary": false,
2724
+ "nullable": false,
2725
+ "mappedType": "uuid"
2726
+ },
2727
+ "tenant_id": {
2728
+ "name": "tenant_id",
2729
+ "type": "uuid",
2730
+ "unsigned": false,
2731
+ "autoincrement": false,
2732
+ "primary": false,
2733
+ "nullable": false,
2734
+ "mappedType": "uuid"
2735
+ },
2736
+ "pipeline_id": {
2737
+ "name": "pipeline_id",
2738
+ "type": "uuid",
2739
+ "unsigned": false,
2740
+ "autoincrement": false,
2741
+ "primary": false,
2742
+ "nullable": false,
2743
+ "mappedType": "uuid"
2744
+ },
2745
+ "name": {
2746
+ "name": "name",
2747
+ "type": "text",
2748
+ "unsigned": false,
2749
+ "autoincrement": false,
2750
+ "primary": false,
2751
+ "nullable": false,
2752
+ "mappedType": "text"
2753
+ },
2754
+ "position": {
2755
+ "name": "position",
2756
+ "type": "int",
2757
+ "unsigned": false,
2758
+ "autoincrement": false,
2759
+ "primary": false,
2760
+ "nullable": false,
2761
+ "default": "0",
2762
+ "mappedType": "integer"
2763
+ },
2764
+ "created_at": {
2765
+ "name": "created_at",
2766
+ "type": "timestamptz",
2767
+ "unsigned": false,
2768
+ "autoincrement": false,
2769
+ "primary": false,
2770
+ "nullable": false,
2771
+ "length": 6,
2772
+ "mappedType": "datetime"
2773
+ },
2774
+ "updated_at": {
2775
+ "name": "updated_at",
2776
+ "type": "timestamptz",
2777
+ "unsigned": false,
2778
+ "autoincrement": false,
2779
+ "primary": false,
2780
+ "nullable": false,
2781
+ "length": 6,
2782
+ "mappedType": "datetime"
2783
+ }
2784
+ },
2785
+ "name": "customer_pipeline_stages",
2786
+ "schema": "public",
2787
+ "indexes": [
2788
+ {
2789
+ "keyName": "customer_pipeline_stages_pipeline_position_idx",
2790
+ "columnNames": [
2791
+ "pipeline_id",
2792
+ "position"
2793
+ ],
2794
+ "composite": true,
2795
+ "constraint": false,
2796
+ "primary": false,
2797
+ "unique": false
2798
+ },
2799
+ {
2800
+ "keyName": "customer_pipeline_stages_org_tenant_idx",
2801
+ "columnNames": [
2802
+ "organization_id",
2803
+ "tenant_id"
2804
+ ],
2805
+ "composite": true,
2806
+ "constraint": false,
2807
+ "primary": false,
2808
+ "unique": false
2809
+ },
2810
+ {
2811
+ "keyName": "customer_pipeline_stages_pkey",
2812
+ "columnNames": [
2813
+ "id"
2814
+ ],
2815
+ "composite": false,
2816
+ "constraint": true,
2817
+ "primary": true,
2818
+ "unique": true
2819
+ }
2820
+ ],
2821
+ "checks": [],
2822
+ "foreignKeys": {},
2823
+ "nativeEnums": {}
2588
2824
  }
2589
2825
  ],
2590
2826
  "nativeEnums": {}
@@ -157,6 +157,24 @@
157
157
  "nullable": true,
158
158
  "length": 6,
159
159
  "mappedType": "datetime"
160
+ },
161
+ "pipeline_id": {
162
+ "name": "pipeline_id",
163
+ "type": "uuid",
164
+ "unsigned": false,
165
+ "autoincrement": false,
166
+ "primary": false,
167
+ "nullable": true,
168
+ "mappedType": "uuid"
169
+ },
170
+ "pipeline_stage_id": {
171
+ "name": "pipeline_stage_id",
172
+ "type": "uuid",
173
+ "unsigned": false,
174
+ "autoincrement": false,
175
+ "primary": false,
176
+ "nullable": true,
177
+ "mappedType": "uuid"
160
178
  }
161
179
  },
162
180
  "name": "customer_deals",
@@ -2349,6 +2367,224 @@
2349
2367
  }
2350
2368
  },
2351
2369
  "nativeEnums": {}
2370
+ },
2371
+ {
2372
+ "columns": {
2373
+ "id": {
2374
+ "name": "id",
2375
+ "type": "uuid",
2376
+ "unsigned": false,
2377
+ "autoincrement": false,
2378
+ "primary": false,
2379
+ "nullable": false,
2380
+ "default": "gen_random_uuid()",
2381
+ "mappedType": "uuid"
2382
+ },
2383
+ "organization_id": {
2384
+ "name": "organization_id",
2385
+ "type": "uuid",
2386
+ "unsigned": false,
2387
+ "autoincrement": false,
2388
+ "primary": false,
2389
+ "nullable": false,
2390
+ "mappedType": "uuid"
2391
+ },
2392
+ "tenant_id": {
2393
+ "name": "tenant_id",
2394
+ "type": "uuid",
2395
+ "unsigned": false,
2396
+ "autoincrement": false,
2397
+ "primary": false,
2398
+ "nullable": false,
2399
+ "mappedType": "uuid"
2400
+ },
2401
+ "name": {
2402
+ "name": "name",
2403
+ "type": "text",
2404
+ "unsigned": false,
2405
+ "autoincrement": false,
2406
+ "primary": false,
2407
+ "nullable": false,
2408
+ "mappedType": "text"
2409
+ },
2410
+ "is_default": {
2411
+ "name": "is_default",
2412
+ "type": "boolean",
2413
+ "unsigned": false,
2414
+ "autoincrement": false,
2415
+ "primary": false,
2416
+ "nullable": false,
2417
+ "default": "false",
2418
+ "mappedType": "boolean"
2419
+ },
2420
+ "created_at": {
2421
+ "name": "created_at",
2422
+ "type": "timestamptz",
2423
+ "unsigned": false,
2424
+ "autoincrement": false,
2425
+ "primary": false,
2426
+ "nullable": false,
2427
+ "length": 6,
2428
+ "mappedType": "datetime"
2429
+ },
2430
+ "updated_at": {
2431
+ "name": "updated_at",
2432
+ "type": "timestamptz",
2433
+ "unsigned": false,
2434
+ "autoincrement": false,
2435
+ "primary": false,
2436
+ "nullable": false,
2437
+ "length": 6,
2438
+ "mappedType": "datetime"
2439
+ }
2440
+ },
2441
+ "name": "customer_pipelines",
2442
+ "schema": "public",
2443
+ "indexes": [
2444
+ {
2445
+ "keyName": "customer_pipelines_org_tenant_idx",
2446
+ "columnNames": [
2447
+ "organization_id",
2448
+ "tenant_id"
2449
+ ],
2450
+ "composite": true,
2451
+ "constraint": false,
2452
+ "primary": false,
2453
+ "unique": false
2454
+ },
2455
+ {
2456
+ "keyName": "customer_pipelines_pkey",
2457
+ "columnNames": [
2458
+ "id"
2459
+ ],
2460
+ "composite": false,
2461
+ "constraint": true,
2462
+ "primary": true,
2463
+ "unique": true
2464
+ }
2465
+ ],
2466
+ "checks": [],
2467
+ "foreignKeys": {},
2468
+ "nativeEnums": {}
2469
+ },
2470
+ {
2471
+ "columns": {
2472
+ "id": {
2473
+ "name": "id",
2474
+ "type": "uuid",
2475
+ "unsigned": false,
2476
+ "autoincrement": false,
2477
+ "primary": false,
2478
+ "nullable": false,
2479
+ "default": "gen_random_uuid()",
2480
+ "mappedType": "uuid"
2481
+ },
2482
+ "organization_id": {
2483
+ "name": "organization_id",
2484
+ "type": "uuid",
2485
+ "unsigned": false,
2486
+ "autoincrement": false,
2487
+ "primary": false,
2488
+ "nullable": false,
2489
+ "mappedType": "uuid"
2490
+ },
2491
+ "tenant_id": {
2492
+ "name": "tenant_id",
2493
+ "type": "uuid",
2494
+ "unsigned": false,
2495
+ "autoincrement": false,
2496
+ "primary": false,
2497
+ "nullable": false,
2498
+ "mappedType": "uuid"
2499
+ },
2500
+ "pipeline_id": {
2501
+ "name": "pipeline_id",
2502
+ "type": "uuid",
2503
+ "unsigned": false,
2504
+ "autoincrement": false,
2505
+ "primary": false,
2506
+ "nullable": false,
2507
+ "mappedType": "uuid"
2508
+ },
2509
+ "name": {
2510
+ "name": "name",
2511
+ "type": "text",
2512
+ "unsigned": false,
2513
+ "autoincrement": false,
2514
+ "primary": false,
2515
+ "nullable": false,
2516
+ "mappedType": "text"
2517
+ },
2518
+ "position": {
2519
+ "name": "position",
2520
+ "type": "int",
2521
+ "unsigned": false,
2522
+ "autoincrement": false,
2523
+ "primary": false,
2524
+ "nullable": false,
2525
+ "default": "0",
2526
+ "mappedType": "integer"
2527
+ },
2528
+ "created_at": {
2529
+ "name": "created_at",
2530
+ "type": "timestamptz",
2531
+ "unsigned": false,
2532
+ "autoincrement": false,
2533
+ "primary": false,
2534
+ "nullable": false,
2535
+ "length": 6,
2536
+ "mappedType": "datetime"
2537
+ },
2538
+ "updated_at": {
2539
+ "name": "updated_at",
2540
+ "type": "timestamptz",
2541
+ "unsigned": false,
2542
+ "autoincrement": false,
2543
+ "primary": false,
2544
+ "nullable": false,
2545
+ "length": 6,
2546
+ "mappedType": "datetime"
2547
+ }
2548
+ },
2549
+ "name": "customer_pipeline_stages",
2550
+ "schema": "public",
2551
+ "indexes": [
2552
+ {
2553
+ "keyName": "customer_pipeline_stages_pipeline_position_idx",
2554
+ "columnNames": [
2555
+ "pipeline_id",
2556
+ "position"
2557
+ ],
2558
+ "composite": true,
2559
+ "constraint": false,
2560
+ "primary": false,
2561
+ "unique": false
2562
+ },
2563
+ {
2564
+ "keyName": "customer_pipeline_stages_org_tenant_idx",
2565
+ "columnNames": [
2566
+ "organization_id",
2567
+ "tenant_id"
2568
+ ],
2569
+ "composite": true,
2570
+ "constraint": false,
2571
+ "primary": false,
2572
+ "unique": false
2573
+ },
2574
+ {
2575
+ "keyName": "customer_pipeline_stages_pkey",
2576
+ "columnNames": [
2577
+ "id"
2578
+ ],
2579
+ "composite": false,
2580
+ "constraint": true,
2581
+ "primary": true,
2582
+ "unique": true
2583
+ }
2584
+ ],
2585
+ "checks": [],
2586
+ "foreignKeys": {},
2587
+ "nativeEnums": {}
2352
2588
  }
2353
2589
  ],
2354
2590
  "nativeEnums": {}
@@ -477,6 +477,10 @@ const replyMessageCommand: CommandHandler<unknown, { id: string; externalEmail:
477
477
  }
478
478
  }
479
479
  }
480
+
481
+ if (recipientIds.size === 0 && original.senderUserId === input.userId) {
482
+ recipientIds.add(input.userId)
483
+ }
480
484
  }
481
485
  if (recipientIds.size === 0) throw new Error('No recipients available for reply')
482
486
 
@@ -5,6 +5,7 @@ import { useT } from '@open-mercato/shared/lib/i18n/context'
5
5
  import {
6
6
  getMessageUiComponentRegistry,
7
7
  } from '../../utils/typeUiRegistry'
8
+ import { getMessageObjectType } from '../../../lib/message-objects-registry'
8
9
  import type { MessageAction, MessageDetail } from '../types'
9
10
  import { toObjectAction } from '../utils'
10
11
 
@@ -28,11 +29,16 @@ export function MessageDetailObjectsSection(props: ObjectsPanelProps) {
28
29
  const componentKey = `${item.entityModule}:${item.entityType}`
29
30
  const DetailComponent = messageUiRegistry.objectDetailComponents[componentKey] ?? null
30
31
  const objectActions = props.objectActionsByObjectId.get(item.id)
32
+ const objectType = getMessageObjectType(item.entityModule, item.entityType)
31
33
 
32
34
  if (DetailComponent) {
33
- const actions: MessageObjectAction[] = objectActions
35
+ const storedActions: MessageObjectAction[] = objectActions
34
36
  ? Array.from(objectActions.entries()).map(([actionId, action]) => toObjectAction(actionId, action))
35
37
  : []
38
+ const typeDefinitionActions: MessageObjectAction[] = storedActions.length === 0
39
+ ? (objectType?.actions ?? [])
40
+ : []
41
+ const actions = storedActions.length > 0 ? storedActions : typeDefinitionActions
36
42
 
37
43
  return (
38
44
  <DetailComponent
@@ -49,6 +55,7 @@ export function MessageDetailObjectsSection(props: ObjectsPanelProps) {
49
55
  actionTakenAt={props.detail.actionTakenAt ? new Date(props.detail.actionTakenAt) : null}
50
56
  actionTakenByUserId={props.detail.actionTakenByUserId ?? null}
51
57
  actions={actions}
58
+ icon={objectType?.icon}
52
59
  onAction={async (actionId, payload) => {
53
60
  const action = objectActions?.get(actionId)
54
61
  if (!action) return
@@ -3,6 +3,7 @@
3
3
  import { useT } from '@open-mercato/shared/lib/i18n/context'
4
4
  import { MarkdownContent } from '@open-mercato/ui/backend/markdown/MarkdownContent'
5
5
  import { getMessageUiComponentRegistry } from '../../utils/typeUiRegistry'
6
+ import { getMessageObjectType } from '../../../lib/message-objects-registry'
6
7
  import type { MessageDetail, MessageDetailObject } from '../types'
7
8
  import { formatDateTime } from '../utils'
8
9
 
@@ -38,6 +39,7 @@ export function MessageDetailThreadSection({ detail }: { detail: MessageDetail }
38
39
  const componentKey = `${obj.entityModule}:${obj.entityType}`
39
40
  const PreviewComponent = messageUiRegistry.objectPreviewComponents[componentKey]
40
41
  ?? messageUiRegistry.objectPreviewComponents['messages:default']
42
+ const objectType = getMessageObjectType(obj.entityModule, obj.entityType)
41
43
  if (!PreviewComponent) return null
42
44
 
43
45
  return (
@@ -51,6 +53,7 @@ export function MessageDetailThreadSection({ detail }: { detail: MessageDetail }
51
53
  actionRequired={obj.actionRequired}
52
54
  actionType={obj.actionType ?? undefined}
53
55
  actionLabel={obj.actionLabel ?? undefined}
56
+ icon={objectType?.icon}
54
57
  />
55
58
  </div>
56
59
  )
@@ -375,6 +375,7 @@ export default function MessageTokenPage({ params }: { params: { token: string }
375
375
  actionTaken={data.actionTaken ?? null}
376
376
  actionTakenAt={data.actionTakenAt ? new Date(data.actionTakenAt) : null}
377
377
  actionTakenByUserId={data.actionTakenByUserId ?? null}
378
+ icon={objectType?.icon}
378
379
  onAction={async () => {
379
380
  return
380
381
  }}
@@ -12,6 +12,7 @@ import { updateCrud, deleteCrud } from '@open-mercato/ui/backend/utils/crud'
12
12
  import { flash } from '@open-mercato/ui/backend/FlashMessages'
13
13
  import { ActivitiesSection, NotesSection, type SectionAction, type TagOption } from '@open-mercato/ui/backend/detail'
14
14
  import { VersionHistoryAction } from '@open-mercato/ui/backend/version-history'
15
+ import { SendObjectMessageDialog } from '@open-mercato/ui/backend/messages'
15
16
  import { useT } from '@open-mercato/shared/lib/i18n/context'
16
17
  import { createTranslatorWithFallback } from '@open-mercato/shared/lib/i18n/translate'
17
18
  import { buildResourceScheduleItems } from '@open-mercato/core/modules/resources/lib/resourceSchedule'
@@ -490,10 +491,25 @@ export default function ResourcesResourceDetailPage({ params }: { params?: { id?
490
491
  backHref="/backend/resources/resources"
491
492
  backLabel={t('resources.resources.detail.back', 'Back to resources')}
492
493
  utilityActions={(
493
- <VersionHistoryAction
494
- config={resourceId ? { resourceKind: 'resources.resource', resourceId, includeRelated: true } : null}
495
- t={t}
496
- />
494
+ <>
495
+ {resourceId ? (
496
+ <SendObjectMessageDialog
497
+ object={{
498
+ entityModule: 'resources',
499
+ entityType: 'resource',
500
+ entityId: resourceId,
501
+ previewData: {
502
+ title: resourceTitle,
503
+ },
504
+ }}
505
+ viewHref={`/backend/resources/resources/${resourceId}`}
506
+ />
507
+ ) : null}
508
+ <VersionHistoryAction
509
+ config={resourceId ? { resourceKind: 'resources.resource', resourceId, includeRelated: true } : null}
510
+ t={t}
511
+ />
512
+ </>
497
513
  )}
498
514
  title={resourceTitle}
499
515
  subtitle={t('resources.resources.detail.subtitle', 'Resource profile and activity')}
@@ -0,0 +1,55 @@
1
+ import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
2
+ import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
3
+ import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
4
+ import type { ObjectPreviewData } from '@open-mercato/shared/modules/messages/types'
5
+ import type { EntityManager } from '@mikro-orm/postgresql'
6
+ import { ResourcesResource } from '../data/entities'
7
+
8
+ type PreviewContext = {
9
+ tenantId: string
10
+ organizationId?: string | null
11
+ }
12
+
13
+ async function resolveEm() {
14
+ const { resolve } = await createRequestContainer()
15
+ return resolve('em') as EntityManager
16
+ }
17
+
18
+ export async function loadResourcePreview(
19
+ entityId: string,
20
+ ctx: PreviewContext,
21
+ ): Promise<ObjectPreviewData> {
22
+ const { t } = await resolveTranslations()
23
+ const defaultTitle = t('resources.messageObjects.resource.title')
24
+
25
+ if (!ctx.organizationId) {
26
+ return { title: defaultTitle, subtitle: entityId }
27
+ }
28
+
29
+ const em = await resolveEm()
30
+ const entity = await findOneWithDecryption(
31
+ em,
32
+ ResourcesResource,
33
+ {
34
+ id: entityId,
35
+ tenantId: ctx.tenantId,
36
+ organizationId: ctx.organizationId,
37
+ deletedAt: null,
38
+ },
39
+ undefined,
40
+ { tenantId: ctx.tenantId, organizationId: ctx.organizationId },
41
+ )
42
+
43
+ if (!entity) {
44
+ return {
45
+ title: defaultTitle,
46
+ subtitle: entityId,
47
+ status: t('customers.messageObjects.notFound'),
48
+ statusColor: 'gray',
49
+ }
50
+ }
51
+
52
+ return {
53
+ title: entity.name,
54
+ }
55
+ }