contact-selector.component.html 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <div class="contact-selector" [class.disabled]="disabled">
  2. <div class="loading" *ngIf="loading">正在加载客户数据...</div>
  3. <!-- 已有客户卡片 -->
  4. <div class="customer-exists" *ngIf="currentCustomer">
  5. <div class="card">
  6. <div class="row">
  7. <div class="avatar" (click)="viewCustomerDetail()">
  8. <img *ngIf="currentCustomer.get('data')?.avatar" [src]="currentCustomer.get('data')?.avatar" alt="" />
  9. <div class="placeholder" *ngIf="!currentCustomer.get('data')?.avatar">👤</div>
  10. </div>
  11. <div class="info" (click)="viewCustomerDetail()">
  12. <div class="name">{{ currentCustomer.get('name') || currentCustomer.get('data')?.external_contact?.name || currentCustomer.get('data')?.name }}</div>
  13. <div class="meta">
  14. <span class="chip" *ngIf="currentCustomer.get('data')?.external_contact?.type">{{ currentCustomer.get('data')?.type === 1 ? '外部联系人' : '企业成员' }}</span>
  15. <span class="chip" *ngIf="canViewSensitiveInfo && currentCustomer.get('mobile')">{{ currentCustomer.get('mobile') }}</span>
  16. </div>
  17. </div>
  18. <div class="actions">
  19. <button class="btn outline" (click)="switchToSelecting()">重新选择</button>
  20. <button class="btn" (click)="viewCustomerDetail()">查看详情</button>
  21. <button class="btn" (click)="refreshContactInfo(currentCustomer)">刷新客户信息</button>
  22. </div>
  23. </div>
  24. </div>
  25. </div>
  26. <!-- 选择客户列表 -->
  27. <div class="selecting" *ngIf="!currentCustomer">
  28. <div class="toolbar">
  29. <input class="search" type="text" [(ngModel)]="searchKeyword" [placeholder]="placeholder" />
  30. </div>
  31. <div class="section">
  32. <div class="section-title">已建档的群聊客户</div>
  33. <div class="list">
  34. <div class="item" *ngFor="let c of filteredCustomers" (click)="selectExistingCustomer(c)">
  35. <div class="thumb">
  36. <img *ngIf="c.get('data')?.avatar" [src]="c.get('data')?.avatar" alt="" />
  37. <div class="placeholder" *ngIf="!c.get('data')?.avatar">👤</div>
  38. </div>
  39. <div class="detail">
  40. <div class="title">{{ c.get('name') || c.get('data')?.name }}</div>
  41. <div class="sub" *ngIf="canViewSensitiveInfo && c.get('mobile')">{{ c.get('mobile') }}</div>
  42. </div>
  43. </div>
  44. </div>
  45. </div>
  46. <div class="section" *ngIf="showCreateButton">
  47. <div class="section-title">未建档的群聊外部联系人</div>
  48. <div class="list">
  49. <div class="item" *ngFor="let m of unbuiltExternalMembers">
  50. <div class="thumb">👤</div>
  51. <div class="detail">
  52. <div class="title">{{ m.name || '外部客户' }}</div>
  53. <div class="sub">{{ m.userid }}</div>
  54. </div>
  55. <div class="ops">
  56. <button class="btn primary" (click)="createFromMember(m.userid)">创建并关联</button>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. </div>
  62. <!-- 客户详情侧栏弹层 -->
  63. <div class="overlay" *ngIf="showCustomerPanel" (click)="closeCustomerDetail()"></div>
  64. <div class="customer-panel" *ngIf="showCustomerPanel">
  65. <app-contact [customer]="currentCustomer" [currentUser]="currentUser" [embeddedMode]="true" [projectIdFilter]="project?.id" (close)="closeCustomerDetail()"></app-contact>
  66. <button class="close" (click)="closeCustomerDetail()">返回</button>
  67. </div>
  68. </div>