|  |  | @ -256,6 +256,7 @@ | 
			
		
	
		
			
				
					|  |  |  |           contact above.) | 
			
		
	
		
			
				
					|  |  |  |         </div> | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         <!-- similar to gift display below --> | 
			
		
	
		
			
				
					|  |  |  |         <ul v-else class="text-sm border-t border-slate-300"> | 
			
		
	
		
			
				
					|  |  |  |           <li | 
			
		
	
		
			
				
					|  |  |  |             v-for="give in givesToThis" | 
			
		
	
	
		
			
				
					|  |  | @ -263,8 +264,8 @@ | 
			
		
	
		
			
				
					|  |  |  |             class="py-1.5 border-b border-slate-300" | 
			
		
	
		
			
				
					|  |  |  |           > | 
			
		
	
		
			
				
					|  |  |  |             <div class="flex justify-between gap-4"> | 
			
		
	
		
			
				
					|  |  |  |               <span | 
			
		
	
		
			
				
					|  |  |  |                 ><fa icon="user" class="fa-fw text-slate-400"></fa> | 
			
		
	
		
			
				
					|  |  |  |               <span> | 
			
		
	
		
			
				
					|  |  |  |                 <fa icon="user" class="fa-fw text-slate-400" /> | 
			
		
	
		
			
				
					|  |  |  |                 {{ | 
			
		
	
		
			
				
					|  |  |  |                   serverUtil.didInfo( | 
			
		
	
		
			
				
					|  |  |  |                     give.agentDid, | 
			
		
	
	
		
			
				
					|  |  | @ -308,12 +309,60 @@ | 
			
		
	
		
			
				
					|  |  |  |       </div> | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |       <div class="grid items-start grid-cols-1 gap-4"> | 
			
		
	
		
			
				
					|  |  |  |         <div | 
			
		
	
		
			
				
					|  |  |  |           v-if="givesProvidedByThis.length > 0" | 
			
		
	
		
			
				
					|  |  |  |           class="bg-slate-100 px-4 py-3 rounded-md" | 
			
		
	
		
			
				
					|  |  |  |         > | 
			
		
	
		
			
				
					|  |  |  |           <h3 class="text-sm uppercase font-semibold mb-3 border-b"> | 
			
		
	
		
			
				
					|  |  |  |             Individuals Getting Contributions From This | 
			
		
	
		
			
				
					|  |  |  |           </h3> | 
			
		
	
		
			
				
					|  |  |  |           <!-- similar to gift display above --> | 
			
		
	
		
			
				
					|  |  |  |           <ul class="text-sm border-t border-slate-300"> | 
			
		
	
		
			
				
					|  |  |  |             <li | 
			
		
	
		
			
				
					|  |  |  |               v-for="give in givesProvidedByThis" | 
			
		
	
		
			
				
					|  |  |  |               :key="give.id" | 
			
		
	
		
			
				
					|  |  |  |               class="py-1.5 border-b border-slate-300" | 
			
		
	
		
			
				
					|  |  |  |             > | 
			
		
	
		
			
				
					|  |  |  |               <div class="flex justify-between gap-4"> | 
			
		
	
		
			
				
					|  |  |  |                 <span> | 
			
		
	
		
			
				
					|  |  |  |                   {{ | 
			
		
	
		
			
				
					|  |  |  |                     serverUtil.didInfo( | 
			
		
	
		
			
				
					|  |  |  |                       give.agentDid, | 
			
		
	
		
			
				
					|  |  |  |                       activeDid, | 
			
		
	
		
			
				
					|  |  |  |                       allMyDids, | 
			
		
	
		
			
				
					|  |  |  |                       allContacts, | 
			
		
	
		
			
				
					|  |  |  |                     ) | 
			
		
	
		
			
				
					|  |  |  |                   }} | 
			
		
	
		
			
				
					|  |  |  |                 </span> | 
			
		
	
		
			
				
					|  |  |  |                 <span v-if="give.amount" class="whitespace-nowrap"> | 
			
		
	
		
			
				
					|  |  |  |                   <fa | 
			
		
	
		
			
				
					|  |  |  |                     :icon="libsUtil.iconForUnitCode(give.unit)" | 
			
		
	
		
			
				
					|  |  |  |                     class="fa-fw text-slate-400" | 
			
		
	
		
			
				
					|  |  |  |                   />{{ give.amount }} | 
			
		
	
		
			
				
					|  |  |  |                 </span> | 
			
		
	
		
			
				
					|  |  |  |               </div> | 
			
		
	
		
			
				
					|  |  |  |               <div class="text-slate-500"> | 
			
		
	
		
			
				
					|  |  |  |                 <fa icon="calendar" class="fa-fw text-slate-400" /> | 
			
		
	
		
			
				
					|  |  |  |                 {{ give.issuedAt?.substring(0, 10) }} | 
			
		
	
		
			
				
					|  |  |  |               </div> | 
			
		
	
		
			
				
					|  |  |  |               <div v-if="give.description" class="text-slate-500"> | 
			
		
	
		
			
				
					|  |  |  |                 <fa icon="comment" class="fa-fw text-slate-400" /> | 
			
		
	
		
			
				
					|  |  |  |                 {{ give.description }} | 
			
		
	
		
			
				
					|  |  |  |               </div> | 
			
		
	
		
			
				
					|  |  |  |               <a @click="onClickLoadClaim(give.jwtId)"> | 
			
		
	
		
			
				
					|  |  |  |                 <fa icon="file-lines" class="text-blue-500 cursor-pointer" /> | 
			
		
	
		
			
				
					|  |  |  |               </a> | 
			
		
	
		
			
				
					|  |  |  |             </li> | 
			
		
	
		
			
				
					|  |  |  |           </ul> | 
			
		
	
		
			
				
					|  |  |  |           <div v-if="fulfillersToHitLimit" class="text-center">Load More</div> | 
			
		
	
		
			
				
					|  |  |  |         </div> | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         <div | 
			
		
	
		
			
				
					|  |  |  |           v-if="fulfillersToThis.length > 0" | 
			
		
	
		
			
				
					|  |  |  |           class="bg-slate-100 px-4 py-3 rounded-md" | 
			
		
	
		
			
				
					|  |  |  |         > | 
			
		
	
		
			
				
					|  |  |  |           <h3 class="text-sm uppercase font-semibold mb-3"> | 
			
		
	
		
			
				
					|  |  |  |             Contributions To This Idea | 
			
		
	
		
			
				
					|  |  |  |             Projects That Contribute To This | 
			
		
	
		
			
				
					|  |  |  |           </h3> | 
			
		
	
		
			
				
					|  |  |  |           <!-- centering because long, wrapped project names didn't left align with blank or "text-left" --> | 
			
		
	
		
			
				
					|  |  |  |           <div class="text-center"> | 
			
		
	
	
		
			
				
					|  |  | @ -331,7 +380,7 @@ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         <div v-if="fulfilledByThis" class="bg-slate-100 px-4 py-3 rounded-md"> | 
			
		
	
		
			
				
					|  |  |  |           <h3 class="text-sm uppercase font-semibold mb-3"> | 
			
		
	
		
			
				
					|  |  |  |             Contributions From This Idea | 
			
		
	
		
			
				
					|  |  |  |             Projects Getting Contributions From This | 
			
		
	
		
			
				
					|  |  |  |           </h3> | 
			
		
	
		
			
				
					|  |  |  |           <!-- centering because long, wrapped project names didn't left align with blank or "text-left" --> | 
			
		
	
		
			
				
					|  |  |  |           <div class="text-center"> | 
			
		
	
	
		
			
				
					|  |  | @ -401,6 +450,8 @@ export default class ProjectViewView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |   fulfillersToHitLimit = false; | 
			
		
	
		
			
				
					|  |  |  |   givesToThis: Array<GiveSummaryRecord> = []; | 
			
		
	
		
			
				
					|  |  |  |   givesHitLimit = false; | 
			
		
	
		
			
				
					|  |  |  |   givesProvidedByThis: Array<GiveSummaryRecord> = []; | 
			
		
	
		
			
				
					|  |  |  |   givesProvidedByHitLimit = false; | 
			
		
	
		
			
				
					|  |  |  |   imageUrl = ""; | 
			
		
	
		
			
				
					|  |  |  |   issuer = ""; | 
			
		
	
		
			
				
					|  |  |  |   latitude = 0; | 
			
		
	
	
		
			
				
					|  |  | @ -540,9 +591,11 @@ export default class ProjectViewView extends Vue { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     this.loadGives(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     this.loadGivesProvidedBy(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     this.loadOffers(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     this.loadFulfillersTo(); | 
			
		
	
		
			
				
					|  |  |  |     this.loadPlanFulfillersTo(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     // now load fulfilled-by, a single project | 
			
		
	
		
			
				
					|  |  |  |     if (identity) { | 
			
		
	
	
		
			
				
					|  |  | @ -696,7 +749,7 @@ export default class ProjectViewView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   async loadFulfillersTo() { | 
			
		
	
		
			
				
					|  |  |  |   async loadPlanFulfillersTo() { | 
			
		
	
		
			
				
					|  |  |  |     const fulfillsUrl = | 
			
		
	
		
			
				
					|  |  |  |       this.apiServer + | 
			
		
	
		
			
				
					|  |  |  |       "/api/v2/report/planFulfillersToPlan?planHandleId=" + | 
			
		
	
	
		
			
				
					|  |  | @ -752,6 +805,64 @@ export default class ProjectViewView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   async loadGivesProvidedBy() { | 
			
		
	
		
			
				
					|  |  |  |     const providedByUrl = | 
			
		
	
		
			
				
					|  |  |  |       this.apiServer + | 
			
		
	
		
			
				
					|  |  |  |       "/api/v2/report/givesProvidedBy?providerId=" + | 
			
		
	
		
			
				
					|  |  |  |       encodeURIComponent(this.projectId); | 
			
		
	
		
			
				
					|  |  |  |     let postfix = ""; | 
			
		
	
		
			
				
					|  |  |  |     if (this.givesProvidedByThis.length > 0) { | 
			
		
	
		
			
				
					|  |  |  |       postfix = | 
			
		
	
		
			
				
					|  |  |  |         "&beforeId=" + | 
			
		
	
		
			
				
					|  |  |  |         this.givesProvidedByThis[this.givesProvidedByThis.length - 1].jwtId; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     const providedByFullUrl = providedByUrl + postfix; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     const headers: RawAxiosRequestHeaders = { | 
			
		
	
		
			
				
					|  |  |  |       "Content-Type": "application/json", | 
			
		
	
		
			
				
					|  |  |  |     }; | 
			
		
	
		
			
				
					|  |  |  |     const identity = await this.getIdentity(this.activeDid); | 
			
		
	
		
			
				
					|  |  |  |     if (identity) { | 
			
		
	
		
			
				
					|  |  |  |       const token = await accessToken(identity); | 
			
		
	
		
			
				
					|  |  |  |       headers["Authorization"] = "Bearer " + token; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     try { | 
			
		
	
		
			
				
					|  |  |  |       const resp = await this.axios.get(providedByFullUrl, { headers }); | 
			
		
	
		
			
				
					|  |  |  |       if (resp.status === 200) { | 
			
		
	
		
			
				
					|  |  |  |         this.givesProvidedByThis = this.givesProvidedByThis.concat( | 
			
		
	
		
			
				
					|  |  |  |           resp.data.data, | 
			
		
	
		
			
				
					|  |  |  |         ); | 
			
		
	
		
			
				
					|  |  |  |         this.givesProvidedByHitLimit = resp.data.hitLimit; | 
			
		
	
		
			
				
					|  |  |  |       } else { | 
			
		
	
		
			
				
					|  |  |  |         this.$notify( | 
			
		
	
		
			
				
					|  |  |  |           { | 
			
		
	
		
			
				
					|  |  |  |             group: "alert", | 
			
		
	
		
			
				
					|  |  |  |             type: "danger", | 
			
		
	
		
			
				
					|  |  |  |             title: "Error", | 
			
		
	
		
			
				
					|  |  |  |             text: "Failed to retrieve gives that were provided by this project.", | 
			
		
	
		
			
				
					|  |  |  |           }, | 
			
		
	
		
			
				
					|  |  |  |           5000, | 
			
		
	
		
			
				
					|  |  |  |         ); | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |     } catch (error: unknown) { | 
			
		
	
		
			
				
					|  |  |  |       const serverError = error as AxiosError; | 
			
		
	
		
			
				
					|  |  |  |       this.$notify( | 
			
		
	
		
			
				
					|  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |           group: "alert", | 
			
		
	
		
			
				
					|  |  |  |           type: "danger", | 
			
		
	
		
			
				
					|  |  |  |           title: "Error", | 
			
		
	
		
			
				
					|  |  |  |           text: "Something went wrong retrieving gives that were provided by this project.", | 
			
		
	
		
			
				
					|  |  |  |         }, | 
			
		
	
		
			
				
					|  |  |  |         5000, | 
			
		
	
		
			
				
					|  |  |  |       ); | 
			
		
	
		
			
				
					|  |  |  |       console.error( | 
			
		
	
		
			
				
					|  |  |  |         "Something went wrong retrieving gives that were provided by this project:", | 
			
		
	
		
			
				
					|  |  |  |         serverError.message, | 
			
		
	
		
			
				
					|  |  |  |       ); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   /** | 
			
		
	
		
			
				
					|  |  |  |    * Handle clicking on a project entry found in the list | 
			
		
	
		
			
				
					|  |  |  |    * @param id of the project | 
			
		
	
	
		
			
				
					|  |  | 
 |