package components import ( "fmt" "reichard.io/antholume/database" "reichard.io/antholume/ngtemplates/common" ) func FirstNonZero[T comparable](all ...T) T { var zeroT T for _, item := range all { if item != zeroT { return item } } return zeroT } func orUnknown(val *string) string { if val == nil { return "Unknown" } return *val } templ DocumentCard(document database.GetDocumentsWithStatsRow) { <div class="w-full relative"> <div class="flex gap-4 w-full h-full p-4 shadow-lg bg-white dark:bg-gray-700 rounded" > <div class="min-w-fit my-auto h-48 relative"> <a href={ templ.SafeURL(fmt.Sprintf("./documents/%s", document.ID)) }> <img class="rounded object-cover h-full" src={ fmt.Sprintf("./documents/%s/cover", document.ID) } /> </a> </div> <div class="flex flex-col justify-around dark:text-white w-full text-sm"> <div class="inline-flex shrink-0 items-center"> <div> <p class="text-gray-400">Title</p> <p class="font-medium">{ orUnknown(document.Title) }</p> </div> </div> <div class="inline-flex shrink-0 items-center"> <div> <p class="text-gray-400">Author</p> <p class="font-medium">{ orUnknown(document.Author) }</p> </div> </div> <div class="inline-flex shrink-0 items-center"> <div> <p class="text-gray-400">Progress</p> <p class="font-medium">{ fmt.Sprintf("%.2f%%", document.Percentage) }</p> </div> </div> <div class="inline-flex shrink-0 items-center"> <div> <p class="text-gray-400">Time Read</p> <p class="font-medium">{ common.NiceSeconds(document.TotalTimeSeconds) }</p> </div> </div> </div> <div class="absolute flex flex-col gap-2 right-4 bottom-4 text-gray-500 dark:text-gray-400" > <a href="./activity?document={{ .ID }}"> @ActivitySVG("") </a> if document.Filepath != nil && *document.Filepath != "" { <a href={ templ.SafeURL(fmt.Sprintf("./documents/%s/file", document.ID)) }> @DownloadSVG("") </a> } else { @DownloadSVG("text-gray-200 dark:text-gray-600") } </div> </div> </div> }