|  |  | @ -341,23 +341,37 @@ | 
			
		
	
		
			
				
					|  |  |  |             <div v-else-if="givesTotalsByUnit.length > 0" class="flex-1"> | 
			
		
	
		
			
				
					|  |  |  |               <span class="font-semibold mr-2 shrink-0">Totals</span> | 
			
		
	
		
			
				
					|  |  |  |               <span class="whitespace-nowrap overflow-hidden text-ellipsis"> | 
			
		
	
		
			
				
					|  |  |  |                 <a @click="totalsExpanded = !totalsExpanded" class="cursor-pointer text-blue-500"> | 
			
		
	
		
			
				
					|  |  |  |                 <a | 
			
		
	
		
			
				
					|  |  |  |                   @click="totalsExpanded = !totalsExpanded" | 
			
		
	
		
			
				
					|  |  |  |                   class="cursor-pointer text-blue-500" | 
			
		
	
		
			
				
					|  |  |  |                 > | 
			
		
	
		
			
				
					|  |  |  |                   <!-- just show the hours, or alternatively whatever is first --> | 
			
		
	
		
			
				
					|  |  |  |                   <span v-if="givenTotalHours() > 0"> | 
			
		
	
		
			
				
					|  |  |  |                     {{ givenTotalHours() }} {{ libsUtil.UNIT_SHORT["HUR"] }} | 
			
		
	
		
			
				
					|  |  |  |                   </span> | 
			
		
	
		
			
				
					|  |  |  |                   <span v-else> | 
			
		
	
		
			
				
					|  |  |  |                     {{ givesTotalsByUnit[0].amount }} {{ libsUtil.UNIT_SHORT[givesTotalsByUnit[0].unit] }} | 
			
		
	
		
			
				
					|  |  |  |                     {{ givesTotalsByUnit[0].amount }} | 
			
		
	
		
			
				
					|  |  |  |                     {{ libsUtil.UNIT_SHORT[givesTotalsByUnit[0].unit] }} | 
			
		
	
		
			
				
					|  |  |  |                   </span> | 
			
		
	
		
			
				
					|  |  |  |                   <span v-if="givesTotalsByUnit.length > 1">...</span> | 
			
		
	
		
			
				
					|  |  |  |                   <span> | 
			
		
	
		
			
				
					|  |  |  |                     <fa :icon="totalsExpanded ? 'chevron-up' : 'chevron-right'" class="fa-fw text-xs ml-1" /> | 
			
		
	
		
			
				
					|  |  |  |                     <fa | 
			
		
	
		
			
				
					|  |  |  |                       :icon="totalsExpanded ? 'chevron-up' : 'chevron-right'" | 
			
		
	
		
			
				
					|  |  |  |                       class="fa-fw text-xs ml-1" | 
			
		
	
		
			
				
					|  |  |  |                     /> | 
			
		
	
		
			
				
					|  |  |  |                   </span> | 
			
		
	
		
			
				
					|  |  |  |                 </a> | 
			
		
	
		
			
				
					|  |  |  |                 <!-- show the full list when expanded --> | 
			
		
	
		
			
				
					|  |  |  |                 <div v-if="totalsExpanded"> | 
			
		
	
		
			
				
					|  |  |  |                   <div v-for="(total, index) in givesTotalsByUnit" :key="total.unit" class="ml-2"> | 
			
		
	
		
			
				
					|  |  |  |                     <fa :icon="libsUtil.iconForUnitCode(total.unit)" class="fa-fw text-slate-400 mr-1" /> | 
			
		
	
		
			
				
					|  |  |  |                   <div | 
			
		
	
		
			
				
					|  |  |  |                     v-for="(total, index) in givesTotalsByUnit" | 
			
		
	
		
			
				
					|  |  |  |                     :key="total.unit" | 
			
		
	
		
			
				
					|  |  |  |                     class="ml-2" | 
			
		
	
		
			
				
					|  |  |  |                   > | 
			
		
	
		
			
				
					|  |  |  |                     <fa | 
			
		
	
		
			
				
					|  |  |  |                       :icon="libsUtil.iconForUnitCode(total.unit)" | 
			
		
	
		
			
				
					|  |  |  |                       class="fa-fw text-slate-400 mr-1" | 
			
		
	
		
			
				
					|  |  |  |                     /> | 
			
		
	
		
			
				
					|  |  |  |                     {{ total.amount }} {{ libsUtil.UNIT_LONG[total.unit] }} | 
			
		
	
		
			
				
					|  |  |  |                   </div> | 
			
		
	
		
			
				
					|  |  |  |                 </div> | 
			
		
	
	
		
			
				
					|  |  | @ -365,7 +379,9 @@ | 
			
		
	
		
			
				
					|  |  |  |             </div> | 
			
		
	
		
			
				
					|  |  |  |             <div v-else> | 
			
		
	
		
			
				
					|  |  |  |               <span class="font-semibold mr-2 shrink-0"> | 
			
		
	
		
			
				
					|  |  |  |                 {{ givesToThis.length }}{{ givesHitLimit ? "+" : "" }} record{{ givesToThis.length === 1 ? "" : "s" }} | 
			
		
	
		
			
				
					|  |  |  |                 {{ givesToThis.length }}{{ givesHitLimit ? "+" : "" }} record{{ | 
			
		
	
		
			
				
					|  |  |  |                   givesToThis.length === 1 ? "" : "s" | 
			
		
	
		
			
				
					|  |  |  |                 }} | 
			
		
	
		
			
				
					|  |  |  |               </span> | 
			
		
	
		
			
				
					|  |  |  |             </div> | 
			
		
	
		
			
				
					|  |  |  |           </div> | 
			
		
	
	
		
			
				
					|  |  | @ -374,62 +390,71 @@ | 
			
		
	
		
			
				
					|  |  |  |           <ul class="mt-2 text-sm border-t border-slate-300"> | 
			
		
	
		
			
				
					|  |  |  |             <li | 
			
		
	
		
			
				
					|  |  |  |               v-for="give in givesToThis" | 
			
		
	
		
			
				
					|  |  |  |             :key="give.id" | 
			
		
	
		
			
				
					|  |  |  |             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" /> | 
			
		
	
		
			
				
					|  |  |  |                 {{ | 
			
		
	
		
			
				
					|  |  |  |                   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> | 
			
		
	
		
			
				
					|  |  |  |             <div class="flex justify-between"> | 
			
		
	
		
			
				
					|  |  |  |               <a @click="onClickLoadClaim(give.jwtId)"> | 
			
		
	
		
			
				
					|  |  |  |                 <fa icon="file-lines" class="text-blue-500 cursor-pointer" /> | 
			
		
	
		
			
				
					|  |  |  |               </a> | 
			
		
	
		
			
				
					|  |  |  |               :key="give.id" | 
			
		
	
		
			
				
					|  |  |  |               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" /> | 
			
		
	
		
			
				
					|  |  |  |                   {{ | 
			
		
	
		
			
				
					|  |  |  |                     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> | 
			
		
	
		
			
				
					|  |  |  |               <div class="flex justify-between"> | 
			
		
	
		
			
				
					|  |  |  |                 <a @click="onClickLoadClaim(give.jwtId)"> | 
			
		
	
		
			
				
					|  |  |  |                   <fa icon="file-lines" class="text-blue-500 cursor-pointer" /> | 
			
		
	
		
			
				
					|  |  |  |                 </a> | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |               <a | 
			
		
	
		
			
				
					|  |  |  |                 v-if=" | 
			
		
	
		
			
				
					|  |  |  |                   checkIsConfirmable(give) && | 
			
		
	
		
			
				
					|  |  |  |                   !recentlyCheckedAndUnconfirmableJwts.includes(give.jwtId) | 
			
		
	
		
			
				
					|  |  |  |                 " | 
			
		
	
		
			
				
					|  |  |  |                 @click="deepCheckConfirmable(give)" | 
			
		
	
		
			
				
					|  |  |  |               > | 
			
		
	
		
			
				
					|  |  |  |                 <fa icon="circle-check" class="text-blue-500 cursor-pointer" /> | 
			
		
	
		
			
				
					|  |  |  |               </a> | 
			
		
	
		
			
				
					|  |  |  |               <a v-else-if="checkingConfirmationForJwtId === give.jwtId"> | 
			
		
	
		
			
				
					|  |  |  |                 <fa icon="spinner" class="fa-spin-pulse" /> | 
			
		
	
		
			
				
					|  |  |  |               </a> | 
			
		
	
		
			
				
					|  |  |  |               <a v-else @click="shallowNotifyWhyCannotConfirm(give)"> | 
			
		
	
		
			
				
					|  |  |  |                 <fa icon="circle-check" class="text-slate-500 cursor-pointer" /> | 
			
		
	
		
			
				
					|  |  |  |               </a> | 
			
		
	
		
			
				
					|  |  |  |             </div> | 
			
		
	
		
			
				
					|  |  |  |             <div v-if="give.fullClaim.image" class="flex justify-center"> | 
			
		
	
		
			
				
					|  |  |  |               <a :href="give.fullClaim.image" target="_blank"> | 
			
		
	
		
			
				
					|  |  |  |                 <img :src="give.fullClaim.image" class="h-24 mt-2 rounded-xl" /> | 
			
		
	
		
			
				
					|  |  |  |               </a> | 
			
		
	
		
			
				
					|  |  |  |             </div> | 
			
		
	
		
			
				
					|  |  |  |                 <a | 
			
		
	
		
			
				
					|  |  |  |                   v-if=" | 
			
		
	
		
			
				
					|  |  |  |                     checkIsConfirmable(give) && | 
			
		
	
		
			
				
					|  |  |  |                     !recentlyCheckedAndUnconfirmableJwts.includes(give.jwtId) | 
			
		
	
		
			
				
					|  |  |  |                   " | 
			
		
	
		
			
				
					|  |  |  |                   @click="deepCheckConfirmable(give)" | 
			
		
	
		
			
				
					|  |  |  |                 > | 
			
		
	
		
			
				
					|  |  |  |                   <fa | 
			
		
	
		
			
				
					|  |  |  |                     icon="circle-check" | 
			
		
	
		
			
				
					|  |  |  |                     class="text-blue-500 cursor-pointer" | 
			
		
	
		
			
				
					|  |  |  |                   /> | 
			
		
	
		
			
				
					|  |  |  |                 </a> | 
			
		
	
		
			
				
					|  |  |  |                 <a v-else-if="checkingConfirmationForJwtId === give.jwtId"> | 
			
		
	
		
			
				
					|  |  |  |                   <fa icon="spinner" class="fa-spin-pulse" /> | 
			
		
	
		
			
				
					|  |  |  |                 </a> | 
			
		
	
		
			
				
					|  |  |  |                 <a v-else @click="shallowNotifyWhyCannotConfirm(give)"> | 
			
		
	
		
			
				
					|  |  |  |                   <fa | 
			
		
	
		
			
				
					|  |  |  |                     icon="circle-check" | 
			
		
	
		
			
				
					|  |  |  |                     class="text-slate-500 cursor-pointer" | 
			
		
	
		
			
				
					|  |  |  |                   /> | 
			
		
	
		
			
				
					|  |  |  |                 </a> | 
			
		
	
		
			
				
					|  |  |  |               </div> | 
			
		
	
		
			
				
					|  |  |  |               <div v-if="give.fullClaim.image" class="flex justify-center"> | 
			
		
	
		
			
				
					|  |  |  |                 <a :href="give.fullClaim.image" target="_blank"> | 
			
		
	
		
			
				
					|  |  |  |                   <img | 
			
		
	
		
			
				
					|  |  |  |                     :src="give.fullClaim.image" | 
			
		
	
		
			
				
					|  |  |  |                     class="h-24 mt-2 rounded-xl" | 
			
		
	
		
			
				
					|  |  |  |                   /> | 
			
		
	
		
			
				
					|  |  |  |                 </a> | 
			
		
	
		
			
				
					|  |  |  |               </div> | 
			
		
	
		
			
				
					|  |  |  |             </li> | 
			
		
	
		
			
				
					|  |  |  |           </ul> | 
			
		
	
		
			
				
					|  |  |  |         </div> | 
			
		
	
	
		
			
				
					|  |  | @ -594,7 +619,7 @@ export default class ProjectViewView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |   givesHitLimit = false; | 
			
		
	
		
			
				
					|  |  |  |   givesProvidedByThis: Array<GiveSummaryRecord> = []; | 
			
		
	
		
			
				
					|  |  |  |   givesProvidedByHitLimit = false; | 
			
		
	
		
			
				
					|  |  |  |   givesTotalsByUnit: Array<{unit: string, amount: number}> = []; | 
			
		
	
		
			
				
					|  |  |  |   givesTotalsByUnit: Array<{ unit: string; amount: number }> = []; | 
			
		
	
		
			
				
					|  |  |  |   imageUrl = ""; | 
			
		
	
		
			
				
					|  |  |  |   isRegistered = false; | 
			
		
	
		
			
				
					|  |  |  |   issuer = ""; | 
			
		
	
	
		
			
				
					|  |  | @ -1254,14 +1279,17 @@ export default class ProjectViewView extends Vue { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   async loadTotals() { | 
			
		
	
		
			
				
					|  |  |  |     this.loadingTotals = true; | 
			
		
	
		
			
				
					|  |  |  |     const url = this.apiServer + "/api/v2/report/givesToPlans?planIds=" + encodeURIComponent(JSON.stringify([this.projectId])); | 
			
		
	
		
			
				
					|  |  |  |     const url = | 
			
		
	
		
			
				
					|  |  |  |       this.apiServer + | 
			
		
	
		
			
				
					|  |  |  |       "/api/v2/report/givesToPlans?planIds=" + | 
			
		
	
		
			
				
					|  |  |  |       encodeURIComponent(JSON.stringify([this.projectId])); | 
			
		
	
		
			
				
					|  |  |  |     const headers = await serverUtil.getHeaders(this.activeDid); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     try { | 
			
		
	
		
			
				
					|  |  |  |       const resp = await this.axios.get(url, { headers }); | 
			
		
	
		
			
				
					|  |  |  |       if (resp.status === 200 && resp.data.data) { | 
			
		
	
		
			
				
					|  |  |  |         // Calculate totals by unit | 
			
		
	
		
			
				
					|  |  |  |         const totals: {[key: string]: number} = {}; | 
			
		
	
		
			
				
					|  |  |  |         const totals: { [key: string]: number } = {}; | 
			
		
	
		
			
				
					|  |  |  |         resp.data.data.forEach((give: GiveSummaryRecord) => { | 
			
		
	
		
			
				
					|  |  |  |           const amount = give.fullClaim.object?.amountOfThisGood; | 
			
		
	
		
			
				
					|  |  |  |           const unit = give.fullClaim.object?.unitCode; | 
			
		
	
	
		
			
				
					|  |  | @ -1269,12 +1297,14 @@ export default class ProjectViewView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |             totals[unit] = (totals[unit] || 0) + amount; | 
			
		
	
		
			
				
					|  |  |  |           } | 
			
		
	
		
			
				
					|  |  |  |         }); | 
			
		
	
		
			
				
					|  |  |  |          | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         // Convert totals object to array format | 
			
		
	
		
			
				
					|  |  |  |         this.givesTotalsByUnit = Object.entries(totals).map(([unit, amount]) => ({ | 
			
		
	
		
			
				
					|  |  |  |           unit, | 
			
		
	
		
			
				
					|  |  |  |           amount | 
			
		
	
		
			
				
					|  |  |  |         })); | 
			
		
	
		
			
				
					|  |  |  |         this.givesTotalsByUnit = Object.entries(totals).map( | 
			
		
	
		
			
				
					|  |  |  |           ([unit, amount]) => ({ | 
			
		
	
		
			
				
					|  |  |  |             unit, | 
			
		
	
		
			
				
					|  |  |  |             amount, | 
			
		
	
		
			
				
					|  |  |  |           }), | 
			
		
	
		
			
				
					|  |  |  |         ); | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |     } catch (error) { | 
			
		
	
		
			
				
					|  |  |  |       console.error("Error loading totals:", error); | 
			
		
	
	
		
			
				
					|  |  | @ -1293,7 +1323,9 @@ export default class ProjectViewView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   givenTotalHours(): number { | 
			
		
	
		
			
				
					|  |  |  |     return this.givesTotalsByUnit.find(total => total.unit === "HUR")?.amount || 0; | 
			
		
	
		
			
				
					|  |  |  |     return ( | 
			
		
	
		
			
				
					|  |  |  |       this.givesTotalsByUnit.find((total) => total.unit === "HUR")?.amount || 0 | 
			
		
	
		
			
				
					|  |  |  |     ); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | </script> | 
			
		
	
	
		
			
				
					|  |  | 
 |