mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 11:08:04 +00:00 
			
		
		
		
	feat: Add AssignmentCard with story for agent UI (#12360)
# Pull Request Template ## Description This PR adds the `AssignmentCard` component with a story for the agent management UI. ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ### Screenshot <img width="1061" height="357" alt="image" src="https://github.com/user-attachments/assets/e5548325-294a-48f8-8c7f-0a0c9272bf76" /> <img width="1061" height="357" alt="image" src="https://github.com/user-attachments/assets/cfb76bf4-bddc-4ec4-a27d-27be3efb0e8f" /> <img width="1061" height="357" alt="image" src="https://github.com/user-attachments/assets/6efc6617-4ce5-42df-b239-c296bbd0acc5" /> ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules
This commit is contained in:
		| @@ -0,0 +1,63 @@ | ||||
| <script setup> | ||||
| import AssignmentCard from './AssignmentCard.vue'; | ||||
|  | ||||
| const agentAssignments = [ | ||||
|   { | ||||
|     id: 1, | ||||
|     title: 'Assignment policy', | ||||
|     description: 'Manage how conversations get assigned in inboxes.', | ||||
|     features: [ | ||||
|       { | ||||
|         icon: 'i-lucide-circle-fading-arrow-up', | ||||
|         label: 'Assign by conversations evenly or by available capacity', | ||||
|       }, | ||||
|       { | ||||
|         icon: 'i-lucide-scale', | ||||
|         label: 'Add fair distribution rules to avoid overloading any agent', | ||||
|       }, | ||||
|       { | ||||
|         icon: 'i-lucide-inbox', | ||||
|         label: 'Add inboxes to a policy - one policy per inbox', | ||||
|       }, | ||||
|     ], | ||||
|   }, | ||||
|   { | ||||
|     id: 2, | ||||
|     title: 'Agent capacity policy', | ||||
|     description: 'Manage workload for agents.', | ||||
|     features: [ | ||||
|       { | ||||
|         icon: 'i-lucide-glass-water', | ||||
|         label: 'Define maximum conversations per inbox', | ||||
|       }, | ||||
|       { | ||||
|         icon: 'i-lucide-circle-minus', | ||||
|         label: 'Create exceptions based on labels and time', | ||||
|       }, | ||||
|       { | ||||
|         icon: 'i-lucide-users-round', | ||||
|         label: 'Add agents to a policy - one policy per agent', | ||||
|       }, | ||||
|     ], | ||||
|   }, | ||||
| ]; | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <Story | ||||
|     title="Components/AgentManagementPolicy/AssignmentCard" | ||||
|     :layout="{ type: 'grid', width: '1000px' }" | ||||
|   > | ||||
|     <Variant title="Assignment Card"> | ||||
|       <div class="px-4 py-4 bg-n-background flex gap-6 justify-between"> | ||||
|         <AssignmentCard | ||||
|           v-for="(item, index) in agentAssignments" | ||||
|           :key="index" | ||||
|           :title="item.title" | ||||
|           :description="item.description" | ||||
|           :features="item.features" | ||||
|         /> | ||||
|       </div> | ||||
|     </Variant> | ||||
|   </Story> | ||||
| </template> | ||||
| @@ -0,0 +1,46 @@ | ||||
| <script setup> | ||||
| import Icon from 'dashboard/components-next/icon/Icon.vue'; | ||||
| import Button from 'dashboard/components-next/button/Button.vue'; | ||||
| import CardLayout from 'dashboard/components-next/CardLayout.vue'; | ||||
|  | ||||
| defineProps({ | ||||
|   title: { type: String, default: '' }, | ||||
|   description: { type: String, default: '' }, | ||||
|   features: { type: Array, default: () => [] }, | ||||
| }); | ||||
|  | ||||
| const emit = defineEmits(['click']); | ||||
|  | ||||
| const handleClick = () => { | ||||
|   emit('click'); | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <CardLayout class="[&>div]:px-5 cursor-pointer" @click="handleClick"> | ||||
|     <div class="flex flex-col items-start gap-2"> | ||||
|       <div class="flex justify-between w-full items-center"> | ||||
|         <h3 class="text-n-slate-12 text-base font-medium">{{ title }}</h3> | ||||
|         <Button | ||||
|           xs | ||||
|           slate | ||||
|           ghost | ||||
|           icon="i-lucide-chevron-right" | ||||
|           @click.stop="handleClick" | ||||
|         /> | ||||
|       </div> | ||||
|       <p class="text-n-slate-11 text-sm mb-0">{{ description }}</p> | ||||
|     </div> | ||||
|  | ||||
|     <ul class="flex flex-col items-start gap-3 mt-3"> | ||||
|       <li | ||||
|         v-for="feature in features" | ||||
|         :key="feature.id" | ||||
|         class="flex items-center gap-3" | ||||
|       > | ||||
|         <Icon :icon="feature.icon" class="text-n-slate-11 size-4" /> | ||||
|         {{ feature.label }} | ||||
|       </li> | ||||
|     </ul> | ||||
|   </CardLayout> | ||||
| </template> | ||||
		Reference in New Issue
	
	Block a user
	 Sivin Varghese
					Sivin Varghese