@consilioweb/payload-support 0.10.0 → 0.11.0

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 (42) hide show
  1. package/dist/components/TicketConversation/locales/en.json +25 -1
  2. package/dist/components/TicketConversation/locales/fr.json +25 -1
  3. package/dist/index.cjs +799 -4
  4. package/dist/index.d.cts +15 -1
  5. package/dist/index.d.ts +15 -1
  6. package/dist/index.js +800 -6
  7. package/dist/styles/TicketDetail.module.scss +294 -0
  8. package/dist/views/TicketDetailView/client.cjs +455 -249
  9. package/dist/views/TicketDetailView/client.js +456 -250
  10. package/dist/views/TicketInboxView/client.cjs +10 -9
  11. package/dist/views/TicketInboxView/client.js +2 -1
  12. package/package.json +1 -1
  13. package/src/collections/ClientSummaries.ts +16 -0
  14. package/src/collections/TicketCollaborators.ts +93 -0
  15. package/src/collections/TicketFeedback.ts +116 -0
  16. package/src/collections/TicketMessages.ts +9 -0
  17. package/src/collections/Tickets.ts +31 -1
  18. package/src/collections/index.ts +2 -0
  19. package/src/components/TicketConversation/locales/en.json +25 -1
  20. package/src/components/TicketConversation/locales/fr.json +25 -1
  21. package/src/endpoints/escalate.ts +44 -0
  22. package/src/endpoints/index.ts +15 -0
  23. package/src/endpoints/invite-collaborator.ts +215 -0
  24. package/src/endpoints/kb-search.ts +156 -0
  25. package/src/endpoints/ticket-feedback.ts +104 -0
  26. package/src/endpoints/transfer-ticket.ts +248 -0
  27. package/src/index.ts +1 -0
  28. package/src/plugin.ts +4 -0
  29. package/src/portal/auth/ChatWidget.tsx +11 -0
  30. package/src/portal/auth/dashboard/DashboardClient.tsx +85 -99
  31. package/src/portal/auth/dashboard/page.tsx +11 -2
  32. package/src/portal/auth/tickets/detail/TransferAndInviteActions.tsx +402 -0
  33. package/src/portal/auth/tickets/detail/page.tsx +122 -23
  34. package/src/portal/auth/tickets/new/KbDeflection.tsx +128 -0
  35. package/src/portal/auth/tickets/new/page.tsx +203 -100
  36. package/src/portal/locales/en.json +5 -0
  37. package/src/portal/locales/fr.json +5 -0
  38. package/src/styles/TicketDetail.module.scss +294 -0
  39. package/src/types.ts +19 -0
  40. package/src/utils/slugs.ts +2 -0
  41. package/src/views/TicketDetailView/client.tsx +346 -89
  42. package/src/views/TicketInboxView/client.tsx +2 -1
@@ -1298,3 +1298,297 @@
1298
1298
  background: var(--theme-accent-500, #6b46e8);
1299
1299
  flex-shrink: 0;
1300
1300
  }
1301
+
1302
+ // ─── SIDEBAR TABS (Overview / Client / Activity) ───
1303
+ // Sticky tab bar at the top of the sidebar. Active tab gets a 2px
1304
+ // underline using the primary text color; inactive tabs use the secondary
1305
+ // text color and lift to primary on hover. All colors come from
1306
+ // --theme-* tokens to stay coherent with light/dark themes.
1307
+ .sidebarTabs {
1308
+ position: sticky;
1309
+ top: 0;
1310
+ z-index: 2;
1311
+ display: flex;
1312
+ gap: 0;
1313
+ background: var(--theme-bg);
1314
+ border-bottom: 1px solid var(--theme-elevation-150, #f1f5f9);
1315
+ }
1316
+
1317
+ .sidebarTab {
1318
+ flex: 1;
1319
+ appearance: none;
1320
+ background: transparent;
1321
+ border: 0;
1322
+ border-bottom: 2px solid transparent;
1323
+ padding: 10px 8px;
1324
+ font-size: 12px;
1325
+ font-weight: 600;
1326
+ color: var(--theme-text-secondary, var(--theme-elevation-500));
1327
+ cursor: pointer;
1328
+ transition: color 120ms ease, border-color 120ms ease;
1329
+ text-align: center;
1330
+ line-height: 1.2;
1331
+
1332
+ &:hover {
1333
+ color: var(--theme-text);
1334
+ }
1335
+
1336
+ &:focus-visible {
1337
+ outline: 2px solid var(--theme-accent-500, #6b46e8);
1338
+ outline-offset: -2px;
1339
+ }
1340
+ }
1341
+
1342
+ .sidebarTabActive {
1343
+ color: var(--theme-text);
1344
+ border-bottom-color: var(--theme-text);
1345
+ }
1346
+
1347
+ // ─── PREVIOUS TICKETS (Client tab) ───
1348
+ .previousTicketsList {
1349
+ list-style: none;
1350
+ margin: 0;
1351
+ padding: 0;
1352
+ display: flex;
1353
+ flex-direction: column;
1354
+ gap: 4px;
1355
+ }
1356
+
1357
+ .previousTicketsItem {
1358
+ margin: 0;
1359
+ }
1360
+
1361
+ .previousTicketsLink {
1362
+ display: flex;
1363
+ flex-direction: column;
1364
+ gap: 2px;
1365
+ padding: 8px 10px;
1366
+ border-radius: 8px;
1367
+ border: 1px solid var(--theme-elevation-150, #f1f5f9);
1368
+ background: var(--theme-elevation-0);
1369
+ color: var(--theme-text);
1370
+ text-decoration: none;
1371
+ transition: background 120ms ease, border-color 120ms ease;
1372
+
1373
+ &:hover {
1374
+ background: var(--theme-elevation-50);
1375
+ border-color: var(--theme-elevation-200);
1376
+ }
1377
+ }
1378
+
1379
+ .previousTicketsSubject {
1380
+ font-size: 12px;
1381
+ font-weight: 600;
1382
+ color: var(--theme-text);
1383
+ overflow: hidden;
1384
+ text-overflow: ellipsis;
1385
+ white-space: nowrap;
1386
+ }
1387
+
1388
+ .previousTicketsMeta {
1389
+ display: flex;
1390
+ justify-content: space-between;
1391
+ align-items: center;
1392
+ gap: 6px;
1393
+ font-size: 10px;
1394
+ color: var(--theme-elevation-500);
1395
+ }
1396
+
1397
+ .previousTicketsStatus {
1398
+ text-transform: uppercase;
1399
+ letter-spacing: 0.04em;
1400
+ font-weight: 700;
1401
+ }
1402
+
1403
+ .previousTicketsDate {
1404
+ font-weight: 500;
1405
+ }
1406
+
1407
+ .previousTicketsEmpty {
1408
+ font-size: 12px;
1409
+ color: var(--theme-elevation-400);
1410
+ text-align: center;
1411
+ padding: 8px 0;
1412
+ }
1413
+
1414
+ // AI suggestion preview bandeau (au-dessus du composer)
1415
+ .aiSuggestionPreview {
1416
+ margin-top: 16px;
1417
+ padding: 12px 16px;
1418
+ border-radius: 10px;
1419
+ background: linear-gradient(180deg,
1420
+ color-mix(in srgb, var(--theme-accent-500, #6b46e8) 10%, transparent) 0%,
1421
+ color-mix(in srgb, var(--theme-accent-500, #6b46e8) 4%, transparent) 100%);
1422
+ border: 1px solid color-mix(in srgb, var(--theme-accent-500, #6b46e8) 30%, transparent);
1423
+ animation: ai-suggest-in 200ms ease-out;
1424
+ }
1425
+
1426
+ @keyframes ai-suggest-in {
1427
+ from { opacity: 0; transform: translateY(-4px); }
1428
+ to { opacity: 1; transform: translateY(0); }
1429
+ }
1430
+
1431
+ .aiSuggestionPreviewHeader {
1432
+ display: flex;
1433
+ align-items: center;
1434
+ gap: 8px;
1435
+ margin-bottom: 8px;
1436
+ }
1437
+
1438
+ .aiSuggestionIcon {
1439
+ width: 20px;
1440
+ height: 20px;
1441
+ border-radius: 50%;
1442
+ background: var(--theme-accent-500, #6b46e8);
1443
+ color: #fff;
1444
+ display: inline-flex;
1445
+ align-items: center;
1446
+ justify-content: center;
1447
+ font-size: 11px;
1448
+ font-weight: 700;
1449
+ }
1450
+
1451
+ .aiSuggestionLabel {
1452
+ font-size: 11px;
1453
+ font-weight: 700;
1454
+ text-transform: uppercase;
1455
+ letter-spacing: 0.06em;
1456
+ color: var(--theme-accent-500, #6b46e8);
1457
+ flex: 1;
1458
+ }
1459
+
1460
+ .aiSuggestionDismiss {
1461
+ width: 24px;
1462
+ height: 24px;
1463
+ border-radius: 6px;
1464
+ border: 0;
1465
+ background: none;
1466
+ cursor: pointer;
1467
+ color: var(--theme-text-tertiary);
1468
+ font-size: 18px;
1469
+ line-height: 1;
1470
+
1471
+ &:hover {
1472
+ background: var(--theme-elevation-100);
1473
+ color: var(--theme-text);
1474
+ }
1475
+ }
1476
+
1477
+ .aiSuggestionBody {
1478
+ font-size: 13px;
1479
+ line-height: 1.55;
1480
+ color: var(--theme-text);
1481
+ white-space: pre-wrap;
1482
+ max-height: 120px;
1483
+ overflow-y: auto;
1484
+ margin-bottom: 12px;
1485
+ padding: 8px 10px;
1486
+ background: var(--theme-elevation-0, #fff);
1487
+ border-radius: 6px;
1488
+ border: 1px solid var(--theme-elevation-200);
1489
+ }
1490
+
1491
+ .aiSuggestionActions {
1492
+ display: flex;
1493
+ justify-content: flex-end;
1494
+ gap: 8px;
1495
+ }
1496
+
1497
+ .aiSuggestionIgnore {
1498
+ padding: 6px 14px;
1499
+ border-radius: 6px;
1500
+ border: 1px solid var(--theme-elevation-200);
1501
+ background: var(--theme-elevation-0, #fff);
1502
+ color: var(--theme-text-secondary);
1503
+ font-size: 12px;
1504
+ font-weight: 600;
1505
+ cursor: pointer;
1506
+
1507
+ &:hover {
1508
+ background: var(--theme-elevation-100);
1509
+ color: var(--theme-text);
1510
+ }
1511
+ }
1512
+
1513
+ .aiSuggestionInsert {
1514
+ padding: 6px 14px;
1515
+ border-radius: 6px;
1516
+ border: 1px solid var(--theme-accent-500, #6b46e8);
1517
+ background: var(--theme-accent-500, #6b46e8);
1518
+ color: #fff;
1519
+ font-size: 12px;
1520
+ font-weight: 600;
1521
+ cursor: pointer;
1522
+
1523
+ &:hover {
1524
+ background: color-mix(in srgb, var(--theme-accent-500, #6b46e8) 80%, black);
1525
+ }
1526
+ }
1527
+
1528
+ .aiCardNextTitle {
1529
+ font-size: 10px;
1530
+ font-weight: 700;
1531
+ text-transform: uppercase;
1532
+ letter-spacing: 0.06em;
1533
+ color: var(--theme-elevation-500);
1534
+ margin: 12px 0 6px;
1535
+ }
1536
+ .aiCardNextActions {
1537
+ list-style: none; padding: 0; margin: 0;
1538
+ display: flex; flex-direction: column; gap: 4px;
1539
+ }
1540
+ .aiCardNextAction {
1541
+ display: flex; align-items: center; gap: 8px;
1542
+ padding: 6px 8px;
1543
+ border-radius: 6px;
1544
+ background: var(--theme-elevation-0, #fff);
1545
+ border: 1px solid var(--theme-elevation-200);
1546
+ font-size: 12px;
1547
+ }
1548
+ .aiCardNextCheck {
1549
+ width: 16px; height: 16px;
1550
+ border-radius: 4px;
1551
+ border: 1.5px solid var(--theme-elevation-300);
1552
+ background: var(--theme-elevation-0, #fff);
1553
+ display: inline-flex; align-items: center; justify-content: center;
1554
+ flex-shrink: 0;
1555
+ cursor: pointer;
1556
+ font-size: 10px; font-weight: 700;
1557
+ color: transparent;
1558
+ transition: all 100ms;
1559
+ &:hover { border-color: var(--theme-accent-500, #6b46e8); }
1560
+ &:disabled { opacity: 0.5; cursor: not-allowed; }
1561
+ }
1562
+ .aiCardNextCheckDone {
1563
+ background: var(--theme-accent-500, #6b46e8);
1564
+ border-color: var(--theme-accent-500, #6b46e8);
1565
+ color: #fff;
1566
+ }
1567
+ .aiCardNextLabel { flex: 1; color: var(--theme-text); line-height: 1.4; }
1568
+ .aiCardNextLabelDone {
1569
+ text-decoration: line-through;
1570
+ color: var(--theme-text-tertiary);
1571
+ }
1572
+ .aiCardNextWhen {
1573
+ font-size: 10px; font-weight: 600;
1574
+ color: var(--theme-text-tertiary);
1575
+ text-transform: uppercase; letter-spacing: 0.04em;
1576
+ flex-shrink: 0;
1577
+ }
1578
+
1579
+ .composerAliasSelect {
1580
+ height: 28px;
1581
+ padding: 0 8px;
1582
+ font-size: 12px; font-weight: 500;
1583
+ border-radius: 6px;
1584
+ border: 1px solid var(--theme-elevation-200);
1585
+ background: var(--theme-elevation-0, #fff);
1586
+ color: var(--theme-text);
1587
+ cursor: pointer;
1588
+ &:hover { background: var(--theme-elevation-50); }
1589
+ &:focus-visible {
1590
+ outline: 0;
1591
+ border-color: var(--theme-info-500, #2a6bd8);
1592
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--theme-info-500, #2a6bd8) 18%, transparent);
1593
+ }
1594
+ }
package/src/types.ts CHANGED
@@ -135,6 +135,7 @@ export interface SupportPluginConfig {
135
135
  slaPolicies?: string
136
136
  macros?: string
137
137
  ticketStatuses?: string
138
+ ticketFeedback?: string
138
139
  }
139
140
 
140
141
  /** Admin notification collection slug (default: 'admin-notifications') */
@@ -221,6 +222,24 @@ export interface SatisfactionSurveyData {
221
222
  comment?: string
222
223
  }
223
224
 
225
+ export type TicketStatus =
226
+ | 'open'
227
+ | 'waiting_client'
228
+ | 'resolved'
229
+ | 'closed'
230
+ | 'escalated'
231
+
232
+ export interface TicketFeedbackData {
233
+ id: number | string
234
+ ticket: number | string
235
+ client?: number | string
236
+ rating: number
237
+ comment?: string
238
+ submittedFrom?: 'portal' | 'email' | 'admin'
239
+ createdAt: string
240
+ updatedAt: string
241
+ }
242
+
224
243
  // ─── Default feature values ──────────────────────────────
225
244
 
226
245
  export const DEFAULT_FEATURES: Required<SupportFeatures> = {
@@ -19,6 +19,7 @@ export interface CollectionSlugs {
19
19
  slaPolicies: string
20
20
  macros: string
21
21
  ticketStatuses: string
22
+ ticketFeedback: string
22
23
  users: string
23
24
  media: string
24
25
  }
@@ -40,6 +41,7 @@ export const DEFAULT_SLUGS: CollectionSlugs = {
40
41
  slaPolicies: 'sla-policies',
41
42
  macros: 'macros',
42
43
  ticketStatuses: 'ticket-statuses',
44
+ ticketFeedback: 'ticket-feedback',
43
45
  users: 'users',
44
46
  media: 'media',
45
47
  }