# ContactTable Component - Complete Redesign ## Overview The ContactTable has been completely rewritten to match the ClientTable structure with improved features, loading states, and action buttons. ## New Features Added ### 1. **Loading State with Skeleton Screen** - Shows animated skeleton rows while data is loading - Loading spinner in top-right corner - Smooth pulse animation for better UX ### 2. **Complete Data Display** Columns now show: - **Contact Name** - With avatar and full name - **Client** - Shows associated client name (or "-" if none) - **Email** - Contact email address - **Phone / Mobile** - Both phone numbers with icons - **Position** - Job title/position - **Status** - Shows star badge if primary contact - **Actions** - View, Edit, Delete buttons ### 3. **Action Buttons** Three action buttons per contact: - **View** (Info/Blue) - View contact details - **Edit** (Warning/Yellow) - Edit contact information - **Delete** (Danger/Red) - Delete contact ### 4. **Empty State** Shows a friendly message when no contacts exist: - Address book icon - "Aucun contact trouvé" message - Helpful text ### 5. **DataTable Integration** - Searchable table - Pagination (5, 10, 15, 20 per page) - Fixed height scrolling - Automatic reinitialization on data changes ### 6. **Event Emissions** The component now emits three events: ```javascript emit("view", contactId) // When view button clicked emit("edit", contactId) // When edit button clicked emit("delete", contactId) // When delete button clicked ``` ## Usage ### Basic Usage ```vue ``` ### Props | Prop | Type | Default | Description | |------|------|---------|-------------| | `data` | Array | `[]` | Array of contact objects | | `loading` | Boolean | `false` | Shows loading skeleton | | `skeletonRows` | Number | `5` | Number of skeleton rows to show | ### Events | Event | Payload | Description | |-------|---------|-------------| | `@view` | `contactId` | Emitted when view button is clicked | | `@edit` | `contactId` | Emitted when edit button is clicked | | `@delete` | `contactId` | Emitted when delete button is clicked | ### Expected Data Structure ```javascript const contacts = [ { id: 1, first_name: "John", last_name: "Doe", full_name: "John Doe", // Computed in backend email: "john@example.com", phone: "+33 1 23 45 67 89", mobile: "+33 6 12 34 56 78", position: "Sales Manager", is_primary: true, client: { id: 5, name: "Acme Corporation" } }, // ... ] ``` ## Parent Component Example ```vue ``` ## Styling Features - **Responsive design** - Adapts to mobile screens - **Skeleton animations** - Shimmer and pulse effects - **Icon badges** - For status indicators - **Avatar images** - Random avatars for visual appeal - **Consistent spacing** - Matches ClientTable design ## Dependencies - `simple-datatables` - For table pagination and search - `SoftButton` - Custom button component - `SoftAvatar` - Avatar component - Font Awesome icons ## File Modified - `src/components/molecules/Tables/ContactTable.vue` --- **Status**: ✅ Complete **Date**: October 16, 2025