| 
						
						
						
					 | 
					@ -1,17 +1,9 @@ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					/** | 
					 | 
					 | 
					/** * EntityGrid.vue - Unified entity grid layout component * * Extracted from | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 * EntityGrid.vue - Unified entity grid layout component | 
					 | 
					 | 
					GiftedDialog.vue to provide a reusable grid layout * for displaying people, | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 *  | 
					 | 
					 | 
					projects, and special entities with selection. * * @author Matthew Raymer */ | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					 * Extracted from GiftedDialog.vue to provide a reusable grid layout | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 * for displaying people, projects, and special entities with selection. | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 *  | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 * @author Matthew Raymer | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 */ | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					<template> | 
					 | 
					 | 
					<template> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  <!-- Quick Search --> | 
					 | 
					 | 
					  <!-- Quick Search --> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					  <div | 
					 | 
					 | 
					  <div id="QuickSearch" class="mb-4 flex items-center text-sm"> | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					    id="QuickSearch" | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    class="mb-4 flex items-center text-sm" | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  > | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					    <input | 
					 | 
					 | 
					    <input | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      v-model="searchTerm" | 
					 | 
					 | 
					      v-model="searchTerm" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      type="text" | 
					 | 
					 | 
					      type="text" | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -24,14 +16,20 @@ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      v-show="isSearching" | 
					 | 
					 | 
					      v-show="isSearching" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      class="border-y border-slate-400 ps-2 py-1.5 text-center text-slate-400" | 
					 | 
					 | 
					      class="border-y border-slate-400 ps-2 py-1.5 text-center text-slate-400" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    > | 
					 | 
					 | 
					    > | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					      <font-awesome icon="spinner" class="fa-spin-pulse leading-[1.1]"></font-awesome> | 
					 | 
					 | 
					      <font-awesome | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        icon="spinner" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        class="fa-spin-pulse leading-[1.1]" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      ></font-awesome> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    </div> | 
					 | 
					 | 
					    </div> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    <button | 
					 | 
					 | 
					    <button | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      :disabled="!searchTerm" | 
					 | 
					 | 
					      :disabled="!searchTerm" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      class="px-2 py-1.5 rounded-r bg-white border border-l-0 border-slate-400 text-slate-400 disabled:cursor-not-allowed" | 
					 | 
					 | 
					      class="px-2 py-1.5 rounded-r bg-white border border-l-0 border-slate-400 text-slate-400 disabled:cursor-not-allowed" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      @click="clearSearch" | 
					 | 
					 | 
					      @click="clearSearch" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    > | 
					 | 
					 | 
					    > | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					      <font-awesome :icon="searchTerm ? 'times' : 'magnifying-glass'" class="fa-fw"></font-awesome> | 
					 | 
					 | 
					      <font-awesome | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        :icon="searchTerm ? 'times' : 'magnifying-glass'" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        class="fa-fw" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      ></font-awesome> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    </button> | 
					 | 
					 | 
					    </button> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  </div> | 
					 | 
					 | 
					  </div> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -360,22 +358,26 @@ export default class EntityGrid extends Vue { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    try { | 
					 | 
					 | 
					    try { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      // Simulate async search (in case we need to add API calls later) | 
					 | 
					 | 
					      // Simulate async search (in case we need to add API calls later) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					      await new Promise(resolve => setTimeout(resolve, 100)); | 
					 | 
					 | 
					      await new Promise((resolve) => setTimeout(resolve, 100)); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      const searchLower = this.searchTerm.toLowerCase().trim(); | 
					 | 
					 | 
					      const searchLower = this.searchTerm.toLowerCase().trim(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      if (this.entityType === "people") { | 
					 | 
					 | 
					      if (this.entityType === "people") { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					        this.filteredEntities = (this.entities as Contact[]).filter((contact: Contact) => { | 
					 | 
					 | 
					        this.filteredEntities = (this.entities as Contact[]).filter( | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					          const name = contact.name?.toLowerCase() || ""; | 
					 | 
					 | 
					          (contact: Contact) => { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					          const did = contact.did.toLowerCase(); | 
					 | 
					 | 
					            const name = contact.name?.toLowerCase() || ""; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					          return name.includes(searchLower) || did.includes(searchLower); | 
					 | 
					 | 
					            const did = contact.did.toLowerCase(); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        }); | 
					 | 
					 | 
					            return name.includes(searchLower) || did.includes(searchLower); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					          }, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        ); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      } else { | 
					 | 
					 | 
					      } else { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					        this.filteredEntities = (this.entities as PlanData[]).filter((project: PlanData) => { | 
					 | 
					 | 
					        this.filteredEntities = (this.entities as PlanData[]).filter( | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					          const name = project.name?.toLowerCase() || ""; | 
					 | 
					 | 
					          (project: PlanData) => { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					          const handleId = project.handleId.toLowerCase(); | 
					 | 
					 | 
					            const name = project.name?.toLowerCase() || ""; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					          return name.includes(searchLower) || handleId.includes(searchLower); | 
					 | 
					 | 
					            const handleId = project.handleId.toLowerCase(); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        }); | 
					 | 
					 | 
					            return name.includes(searchLower) || handleId.includes(searchLower); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					          }, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        ); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      } | 
					 | 
					 | 
					      } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } finally { | 
					 | 
					 | 
					    } finally { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      this.isSearching = false; | 
					 | 
					 | 
					      this.isSearching = false; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					
  |