257 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| {{template "base.html" .}} {{define "title"}}Home{{end}} {{define "header"}}
 | |
| <a href="./">Home</a>
 | |
| {{end}} {{define "content"}}
 | |
| <div class="flex flex-col gap-4">
 | |
|   <div class="w-full">
 | |
|     <div
 | |
|       class="relative w-full p-4 bg-white shadow-lg dark:bg-gray-700 rounded"
 | |
|     >
 | |
|       <p
 | |
|         class="absolute top-3 text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500"
 | |
|       >
 | |
|         Daily Read Totals
 | |
|       </p>
 | |
| 
 | |
|       {{ $data := (GetSVGGraphData .Data.GraphData 800 70 )}}
 | |
|       <svg
 | |
|         viewBox="26 0 755 {{ $data.Height }}"
 | |
|         preserveAspectRatio="none"
 | |
|         width="100%"
 | |
|         height="4em"
 | |
|       >
 | |
|         <!-- Bezier Line Graph -->
 | |
|         <path
 | |
|           fill="#316BBE"
 | |
|           fill-opacity="0.5"
 | |
|           stroke="none"
 | |
|           d="{{ $data.BezierPath }} {{ $data.BezierFill }}"
 | |
|         />
 | |
| 
 | |
|         <path fill="none" stroke="#316BBE" d="{{ $data.BezierPath }}" />
 | |
| 
 | |
|         {{ range $index, $item := $data.LinePoints }}
 | |
|         <line
 | |
|           class="hover-trigger"
 | |
|           stroke="black"
 | |
|           stroke-opacity="0.0"
 | |
|           stroke-width="{{ $data.Offset }}"
 | |
|           x1="{{ $item.X }}"
 | |
|           x2="{{ $item.X }}"
 | |
|           y1="0"
 | |
|           y2="{{ $data.Height }}"
 | |
|         ></line>
 | |
|         <g class="hover-item">
 | |
|           <line
 | |
|             class="text-black dark:text-white"
 | |
|             stroke-opacity="0.2"
 | |
|             x1="{{ $item.X }}"
 | |
|             x2="{{ $item.X }}"
 | |
|             y1="30"
 | |
|             y2="{{ $data.Height }}"
 | |
|           ></line>
 | |
|           <text
 | |
|             class="text-black dark:text-white"
 | |
|             alignment-baseline="middle"
 | |
|             transform="translate({{ $item.X }}, 5) translate(-30, 8)"
 | |
|             font-size="10"
 | |
|           >
 | |
|             {{ (index $.Data.GraphData $index).Date }}
 | |
|           </text>
 | |
|           <text
 | |
|             class="text-black dark:text-white"
 | |
|             alignment-baseline="middle"
 | |
|             transform="translate({{ $item.X }}, 25) translate(-30, -2)"
 | |
|             font-size="10"
 | |
|           >
 | |
|             {{ (index $.Data.GraphData $index).MinutesRead }} minutes
 | |
|           </text>
 | |
|         </g>
 | |
|         {{ end }}
 | |
|       </svg>
 | |
| 
 | |
|       <style>
 | |
|         /* Interactive Hover */
 | |
|         .hover-item {
 | |
|           visibility: hidden;
 | |
|           opacity: 0;
 | |
|         }
 | |
|         .hover-trigger:hover + .hover-item,
 | |
|         .hover-item:hover {
 | |
|           visibility: visible;
 | |
|           opacity: 1;
 | |
|         }
 | |
| 
 | |
|         /* SVG Component Styling */
 | |
|         svg text.text-black {
 | |
|           fill: black;
 | |
|         }
 | |
|         svg line.text-black {
 | |
|           stroke: black;
 | |
|         }
 | |
|         @media (prefers-color-scheme: dark) {
 | |
|           svg text.dark\:text-white {
 | |
|             fill: white;
 | |
|           }
 | |
|           svg line.dark\:text-white {
 | |
|             stroke: white;
 | |
|           }
 | |
|         }
 | |
|       </style>
 | |
|     </div>
 | |
|   </div>
 | |
| 
 | |
|   <div class="grid grid-cols-2 gap-4 md:grid-cols-4">
 | |
|     <a href="./documents" class="w-full">
 | |
|       <div
 | |
|         class="flex gap-4 w-full p-4 bg-white shadow-lg dark:bg-gray-700 rounded"
 | |
|       >
 | |
|         <div
 | |
|           class="flex flex-col justify-around dark:text-white w-full text-sm"
 | |
|         >
 | |
|           <p class="text-2xl font-bold text-black dark:text-white">
 | |
|             {{ .Data.DatabaseInfo.DocumentsSize }}
 | |
|           </p>
 | |
|           <p class="text-sm text-gray-400">Documents</p>
 | |
|         </div>
 | |
|       </div>
 | |
|     </a>
 | |
|     <a href="./activity" class="w-full">
 | |
|       <div
 | |
|         class="flex gap-4 w-full p-4 bg-white shadow-lg dark:bg-gray-700 rounded"
 | |
|       >
 | |
|         <div
 | |
|           class="flex flex-col justify-around dark:text-white w-full text-sm"
 | |
|         >
 | |
|           <p class="text-2xl font-bold text-black dark:text-white">
 | |
|             {{ .Data.DatabaseInfo.ActivitySize }}
 | |
|           </p>
 | |
|           <p class="text-sm text-gray-400">Activity Records</p>
 | |
|         </div>
 | |
|       </div>
 | |
|     </a>
 | |
|     <div class="w-full">
 | |
|       <div
 | |
|         class="flex gap-4 w-full p-4 bg-white shadow-lg dark:bg-gray-700 rounded"
 | |
|       >
 | |
|         <div
 | |
|           class="flex flex-col justify-around dark:text-white w-full text-sm"
 | |
|         >
 | |
|           <p class="text-2xl font-bold text-black dark:text-white">
 | |
|             {{ .Data.DatabaseInfo.ProgressSize }}
 | |
|           </p>
 | |
|           <p class="text-sm text-gray-400">Progress Records</p>
 | |
|         </div>
 | |
|       </div>
 | |
|     </div>
 | |
|     <div class="w-full">
 | |
|       <div
 | |
|         class="flex gap-4 w-full p-4 bg-white shadow-lg dark:bg-gray-700 rounded"
 | |
|       >
 | |
|         <div
 | |
|           class="flex flex-col justify-around dark:text-white w-full text-sm"
 | |
|         >
 | |
|           <p class="text-2xl font-bold text-black dark:text-white">
 | |
|             {{ .Data.DatabaseInfo.DevicesSize }}
 | |
|           </p>
 | |
|           <p class="text-sm text-gray-400">Devices</p>
 | |
|         </div>
 | |
|       </div>
 | |
|     </div>
 | |
|   </div>
 | |
| 
 | |
|   <div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
 | |
|     {{ range $item := .Data.Streaks }}
 | |
|     <div class="w-full">
 | |
|       <div
 | |
|         class="relative w-full px-4 py-6 bg-white shadow-lg dark:bg-gray-700 rounded"
 | |
|       >
 | |
|         <p
 | |
|           class="text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500"
 | |
|         >
 | |
|           {{ if eq $item.Window "WEEK" }} Weekly Read Streak {{ else }} Daily
 | |
|           Read Streak {{ end }}
 | |
|         </p>
 | |
|         <div class="flex items-end my-6 space-x-2">
 | |
|           <p class="text-5xl font-bold text-black dark:text-white">
 | |
|             {{ $item.CurrentStreak }}
 | |
|           </p>
 | |
|         </div>
 | |
|         <div class="dark:text-white">
 | |
|           <div
 | |
|             class="flex items-center justify-between pb-2 mb-2 text-sm border-b border-gray-200"
 | |
|           >
 | |
|             <div>
 | |
|               <p>
 | |
|                 {{ if eq $item.Window "WEEK" }} Current Weekly Streak {{ else }}
 | |
|                 Current Daily Streak {{ end }}
 | |
|               </p>
 | |
|               <div class="flex items-end text-sm text-gray-400">
 | |
|                 {{ $item.CurrentStreakStartDate }} ➞ {{
 | |
|                 $item.CurrentStreakEndDate }}
 | |
|               </div>
 | |
|             </div>
 | |
|             <div class="flex items-end font-bold">
 | |
|               {{ $item.CurrentStreak }}
 | |
|             </div>
 | |
|           </div>
 | |
|           <div class="flex items-center justify-between pb-2 mb-2 text-sm">
 | |
|             <div>
 | |
|               <p>
 | |
|                 {{ if eq $item.Window "WEEK" }} Best Weekly Streak {{ else }}
 | |
|                 Best Daily Streak {{ end }}
 | |
|               </p>
 | |
|               <div class="flex items-end text-sm text-gray-400">
 | |
|                 {{ $item.MaxStreakStartDate }} ➞ {{ $item.MaxStreakEndDate }}
 | |
|               </div>
 | |
|             </div>
 | |
|             <div class="flex items-end font-bold">{{ $item.MaxStreak }}</div>
 | |
|           </div>
 | |
|         </div>
 | |
|       </div>
 | |
|     </div>
 | |
|     {{ end }}
 | |
| 
 | |
|     <div class="w-full">
 | |
|       <div
 | |
|         class="flex flex-col justify-between h-full w-full px-4 py-6 bg-white shadow-lg dark:bg-gray-700 rounded"
 | |
|       >
 | |
|         <div>
 | |
|           <p
 | |
|             class="text-sm font-semibold text-gray-700 border-b border-gray-200 w-max dark:text-white dark:border-gray-500"
 | |
|           >
 | |
|             WPM Leaderboard
 | |
|           </p>
 | |
|           <div class="flex items-end my-6 space-x-2">
 | |
|             {{ $length := len .Data.WPMLeaderboard }} {{ if eq $length 0 }}
 | |
|             <p class="text-5xl font-bold text-black dark:text-white">N/A</p>
 | |
|             {{ else }}
 | |
|             <p class="text-5xl font-bold text-black dark:text-white">
 | |
|               {{ (index .Data.WPMLeaderboard 0).UserID }}
 | |
|             </p>
 | |
|             {{ end }}
 | |
|           </div>
 | |
|         </div>
 | |
|         <div class="dark:text-white">
 | |
|           {{ range $index, $item := .Data.WPMLeaderboard }} {{ if lt $index 3 }}
 | |
|           {{ if eq $index 0 }}
 | |
|           <div class="flex items-center justify-between pt-2 pb-2 text-sm">
 | |
|             {{ else }}
 | |
|             <div
 | |
|               class="flex items-center justify-between pt-2 pb-2 text-sm border-t border-gray-200"
 | |
|             >
 | |
|               {{ end }}
 | |
|               <div>
 | |
|                 <p>{{ $item.UserID }}</p>
 | |
|               </div>
 | |
|               <div class="flex items-end font-bold">{{ $item.Wpm }} WPM</div>
 | |
|             </div>
 | |
|             {{ end }} {{ end }}
 | |
|           </div>
 | |
|         </div>
 | |
|       </div>
 | |
|     </div>
 | |
| 
 | |
|     {{end}}
 | |
|   </div>
 | |
| </div>
 |