2022-08-14 21:40:57 +00:00
{{define "title"}}My Dashboard{{end}}
2022-08-10 05:10:47 +00:00
{{define "content"}}
< div class = "container" >
< section class = "hero is-info is-bold" >
< div class = "hero-body" >
< div class = "container" >
< h1 class = "title" > User Dashboard< / h1 >
< h2 class = "subtitle" > to your account< / h2 >
< / div >
< / div >
< / section >
< div class = "block p-4" >
< div class = "columns" >
< div class = "column" >
2022-08-13 22:39:31 +00:00
<!-- Onboarding Checklist -->
{{if or (not .CurrentUser.Certified) (not .CurrentUser.ProfilePhoto.ID)}}
< div class = "card block" >
< header class = "card-header has-background-danger" >
< p class = "card-header-title has-text-light" >
< span class = "icon" > < i class = "fa fa-check" > < / i > < / span >
< span > Onboarding Checklist< / span >
< / p >
< / header >
< div class = "card-content" >
< p class = "block" >
You're almost there! Please review the following checklist items to gain
full access to this website. Members are expected to have a face picture
as their default Profile Pic and upload a Verification Photo to become
certified as being a real person.
< / p >
2024-05-27 20:07:15 +00:00
< aside class = "menu" >
< ul class = "menu-list" >
< li >
< a href = "/photo/upload?intent=profile_pic" >
< div class = "columns is-mobile is-gapless" >
< div class = "column is-narrow mr-2" >
{{if .CurrentUser.ProfilePhoto.ID}}
< span class = "icon" > < i class = "fa fa-circle-check has-text-success" > < / i > < / span >
{{else}}
< span class = "icon" > < i class = "fa fa-circle-xmark has-text-danger" > < / i > < / span >
{{end}}
< / div >
< div class = "column" >
Upload a Profile Picture to your account that shows your face
2024-03-29 06:18:23 +00:00
2024-05-27 20:07:15 +00:00
< p class = "help" >
Click here to upload a new profile picture
< i class = "fa fa-external-link ml-1" > < / i >
< / p >
< / div >
2024-03-29 06:18:23 +00:00
< / div >
2024-05-27 20:07:15 +00:00
< / a >
< / li >
2022-08-13 22:39:31 +00:00
2024-05-27 20:07:15 +00:00
< li >
< a href = "/photo/certification" >
< div class = "columns is-mobile is-gapless" >
< div class = "column is-narrow mr-2" >
{{if .CurrentUser.Certified}}
< span class = "icon" > < i class = "fa fa-circle-check has-text-success" > < / i > < / span >
{{else}}
< span class = "icon" > < i class = "fa fa-circle-xmark has-text-danger" > < / i > < / span >
{{end}}
< / div >
< div class = "column" >
Get certified by uploading a verification selfie
2024-03-29 06:18:23 +00:00
2024-05-27 20:07:15 +00:00
< p class = "help" >
Click here to go to the Certification Photo upload page
< i class = "fa fa-external-link ml-1" > < / i >
< / p >
< / div >
2024-03-29 06:18:23 +00:00
< / div >
2024-05-27 20:07:15 +00:00
< / a >
< / li >
< / ul >
< / aside >
2022-08-13 22:39:31 +00:00
< / div >
< / div >
{{end}}
2023-02-14 06:19:18 +00:00
<!-- "Very Private" Restricted Account warning for certified users -->
{{if and .CurrentUser.Certified .IsShyUser}}
< div class = "card block" >
< header class = "card-header has-background-danger" >
< p class = "card-header-title has-text-light" >
< span class = "icon" > < i class = "fa fa-exclamation-triangle" > < / i > < / span >
< span > Your profile page is too private< / span >
< / p >
< / header >
< div class = "card-content" >
< p class = "block" >
You are considered to be a < strong > Shy Account< / strong > because your profile and
photos are all set to Private or Friends-only visibility, so that to other members
of {{PrettyTitle}} you appear like a blank, faceless profile.
< / p >
< p class = "block" >
While in this restricted state, you are grouped into a cohort with other members who
are as shy as you are and have limited contact options to connect with our other,
{{PrettyTitle}} members who are sharing their nudes on public.
< / p >
< p class = "block" >
< a href = "/faq#shy-faqs" > Click here to learn more< / a > about your Shy Account. To
remedy this, please see the following steps:
< / p >
2024-05-27 20:07:15 +00:00
< aside class = "menu" >
< ul class = "menu-list" >
< li >
< a href = "/settings" >
{{if eq .CurrentUser.Visibility "public"}}
< span class = "icon" > < i class = "fa fa-circle-check has-text-success" > < / i > < / span >
{{else}}
< span class = "icon" > < i class = "fa fa-circle-xmark has-text-danger" > < / i > < / span >
2023-02-14 06:19:18 +00:00
{{end}}
2024-05-27 20:07:15 +00:00
< span >
Have your profile visibility set to < strong > Public< / strong > .
{{if not (eq .CurrentUser.Visibility "public")}}
< span class = "icon" > < i class = "fa fa-external-link" > < / i > < / span >
{{end}}
< / span >
< / a >
< / li >
2023-02-14 06:19:18 +00:00
2024-05-27 20:07:15 +00:00
< li >
< a href = "/u/{{.CurrentUser.Username}}/photos" >
{{if .HasPublicPhoto}}
< span class = "icon" > < i class = "fa fa-circle-check has-text-success" > < / i > < / span >
{{else}}
< span class = "icon" > < i class = "fa fa-circle-xmark has-text-danger" > < / i > < / span >
2023-02-14 06:19:18 +00:00
{{end}}
2024-05-27 20:07:15 +00:00
< span >
Have at least one < strong > Public< / strong > photo on your profile.
{{if not .HasPublicPhoto}}
< span class = "icon" > < i class = "fa fa-external-link" > < / i > < / span >
{{end}}
< / span >
< / a >
< / li >
< / ul >
< / aside >
2023-02-14 06:19:18 +00:00
< / div >
2023-08-20 04:09:23 +00:00
< / div >
{{end}}
2023-12-26 23:58:21 +00:00
<!-- New Feature -->
{{if not (.CurrentUser.GetProfileField "hero-color-start")}}
2023-08-20 04:09:23 +00:00
< div class = "card block" >
2024-03-30 22:59:29 +00:00
< header class = "card-header has-background-success" >
2023-08-20 04:09:23 +00:00
< p class = "card-header-title has-text-light" >
< i class = "fa fa-gift mr-2" > < / i >
2023-12-26 23:58:21 +00:00
New Feature: Profile Look & Feel
2023-08-20 04:09:23 +00:00
< / p >
< / header >
< div class = "card-content" >
< p class = "block" >
2023-12-26 23:58:21 +00:00
A new feature is now available:
< a href = "/settings#look" > customize your profile page look & feel!< / a >
2023-08-20 04:09:23 +00:00
< / p >
< p class = "block" >
2023-12-26 23:58:21 +00:00
You can now personalize your profile page with a custom color scheme for
your header and profile cards. In the future, it will also be possible to
set a custom wallpaper background image and stylize your profile page
even further!
2023-08-20 04:09:23 +00:00
< / p >
< p class = "block" >
2023-12-26 23:58:21 +00:00
Check it out on your Settings > < a href = "/settings#look" > Look & Feel< / a >
page!
2023-08-20 04:09:23 +00:00
< / p >
< / div >
2023-02-14 06:19:18 +00:00
< / div >
2023-12-26 23:58:21 +00:00
{{end}}
2023-02-14 06:19:18 +00:00
2022-08-13 22:39:31 +00:00
< div class = "card block" >
2022-08-10 05:10:47 +00:00
< header class = "card-header has-background-link" >
< p class = "card-header-title has-text-light" > My Account< / p >
< / header >
< div class = "card-content" >
2024-04-19 03:18:55 +00:00
< aside class = "menu" >
< ul class = "menu-list" >
< li >
< a href = "/u/{{.CurrentUser.Username}}" >
< span class = "icon" > < i class = "fa fa-user" > < / i > < / span >
My Profile
< / a >
< / li >
< li >
< a href = "/u/{{.CurrentUser.Username}}/photos" >
< span class = "icon" > < i class = "fa fa-image" > < / i > < / span >
My Photos
< / a >
< / li >
< li >
< a href = "/photo/upload" >
< span class = "icon" > < i class = "fa fa-upload" > < / i > < / span >
Upload Photos
< / a >
< / li >
< li >
< a href = "/photo/private" >
< span class = "icon" > < i class = "fa fa-eye" > < / i > < / span >
Manage Private Photos
< / a >
< / li >
< li >
< a href = "/settings" >
< span class = "icon" > < i class = "fa fa-edit" > < / i > < / span >
Edit Profile & Settings
< / a >
< / li >
< li >
< a href = "/photo/certification" >
< span class = "icon" > < i class = "fa fa-certificate" > < / i > < / span >
Certification Photo
< / a >
< / li >
< li >
< a href = "/users/blocked" >
< span class = "icon" > < i class = "fa fa-hand" > < / i > < / span >
Blocked Users
< / a >
< / li >
< li >
< a href = "/notes/me" >
< span class = "icon" > < i class = "fa fa-pen-to-square mr-1" > < / i > < / span >
My User Notes
< / a >
< / li >
< li >
< a href = "/logout" >
< span class = "icon" > < i class = "fa fa-arrow-right-from-bracket" > < / i > < / span >
Log out
< / a >
< / li >
{{if .SessionImpersonated}}
< li >
< a href = "/admin/unimpersonate" class = "has-text-danger" >
< span class = "icon" > < i class = "fa fa-ghost" > < / i > < / span >
< span > Unimpersonate< / span >
< / a >
< / li >
{{end}}
< li >
< a href = "/settings#deactivate" >
< span class = "icon" > < i class = "fa fa-trash" > < / i > < / span >
Delete account
< / a >
< / li >
< / ul >
< / aside >
2022-08-10 05:10:47 +00:00
< / div >
< / div >
< / div >
2022-08-25 04:17:34 +00:00
{{$Root := .}}
2022-08-10 05:10:47 +00:00
< div class = "column" >
2022-08-25 04:17:34 +00:00
< div class = "card" id = "notifications" >
2022-08-10 05:10:47 +00:00
< header class = "card-header has-background-warning" >
2024-04-02 00:53:19 +00:00
< p class = "card-header-title" > Notifications< / p >
2022-08-10 05:10:47 +00:00
< / header >
< div class = "card-content" >
2023-08-05 01:54:04 +00:00
<!-- Notifications header row: tablets on upwards -->
< div class = "is-hidden-mobile" >
< form method = "POST" action = "{{.Request.URL.Path}}" >
{{InputCSRF}}
< div class = "columns mb-2" >
< div class = "column" >
{{if gt .NavUnreadNotifications 0}}
{{.NavUnreadNotifications}} unread notification{{Pluralize64 .NavUnreadNotifications}}.
{{else}}
No unread notifications.
{{end}}
< / div >
< div class = "column is-narrow has-text-right" >
< button type = "submit" name = "intent" value = "clear-all"
class="button is-danger is-light is-small"
2023-08-05 02:41:14 +00:00
onclick="return window.confirm('Are you sure you want to REMOVE all notifications?')"
title="Remove all notifications from your feed">
2023-08-05 01:54:04 +00:00
< i class = "fa fa-xmark mr-1" > < / i >
Clear all
< / button >
< button type = "submit" name = "intent" value = "read-notifications"
class="button is-link is-light is-small">
< i class = "fa fa-check mr-1" > < / i >
Mark all as read
< / button >
< / div >
< / div >
< / form >
< / div >
<!-- Notifications header: for mobiles only version -->
< div class = "is-hidden-tablet" >
< p >
2022-08-25 04:17:34 +00:00
{{if gt .NavUnreadNotifications 0}}
{{.NavUnreadNotifications}} unread notification{{Pluralize64 .NavUnreadNotifications}}.
{{else}}
No unread notifications.
{{end}}
2023-08-05 01:54:04 +00:00
< / p >
< form method = "POST" action = "{{.Request.URL.Path}}" >
{{InputCSRF}}
< div class = "my-2 has-text-right" >
< button type = "submit" name = "intent" value = "clear-all"
class="button is-danger is-light is-small"
onclick="return window.confirm('Are you sure you want to REMOVE all notifications?')">
< i class = "fa fa-xmark mr-1" > < / i >
Clear all
< / button >
< button type = "submit" name = "intent" value = "read-notifications"
class="button is-link is-light is-small">
< i class = "fa fa-check mr-1" > < / i >
Mark all as read
< / button >
< / div >
< / form >
< hr >
2022-08-25 04:17:34 +00:00
< / div >
2024-02-29 04:49:16 +00:00
<!-- Filters -->
< div class = "block" >
< form action = "{{.Request.URL.Path}}" method = "GET" >
< div class = "card nonshy-collapsible-mobile nonshy-collapsible-always mb-5" >
< header class = "card-header has-background-link-light" >
2024-03-30 22:59:29 +00:00
< p class = "card-header-title has-text-dark" >
2024-02-29 04:49:16 +00:00
< i class = "fa fa-list mr-2" > < / i > Notification Types
< / p >
< button class = "card-header-icon" type = "button" >
< span class = "icon" >
< i class = "fa fa-angle-up" > < / i >
< / span >
< / button >
< / header >
< div class = "card-content" >
< p class = "block" >
< a href = "/settings#notifications" >
< i class = "fa fa-gear mr-1" > < / i >
Manage notification settings
< / a >
< / p >
< div class = "columns is-multiline mb-0" >
< div class = "column is-half" >
< div class = "field" >
< label class = "checkbox" >
< input type = "checkbox"
name="likes"
value="true"
{{if .Filters.Likes}}checked{{end}}
>
Likes
< p class = "help" >
on your photos, profile or comments
< / p >
< / label >
< / div >
< / div >
< div class = "column is-half" >
< div class = "field" >
< label class = "checkbox" >
< input type = "checkbox"
name="comments"
value="true"
{{if .Filters.Comments}}checked{{end}}
>
Comments
< p class = "help" >
on your photos
< / p >
< / label >
< / div >
< / div >
< div class = "column is-half" >
< div class = "field" >
< label class = "checkbox" >
< input type = "checkbox"
name="photos"
value="true"
{{if .Filters.NewPhotos}}checked{{end}}
>
New Photos
< p class = "help" >
of your friends
< / p >
< / label >
< / div >
< / div >
< div class = "column is-half" >
< div class = "field" >
< label class = "checkbox" >
< input type = "checkbox"
name="replies"
value="true"
{{if .Filters.AlsoCommented}}checked{{end}}
>
Replies
< p class = "help" >
on comment threads you follow
< / p >
< / label >
< / div >
< / div >
< div class = "column is-half" >
< div class = "field" >
< label class = "checkbox" >
< input type = "checkbox"
name="private"
value="true"
{{if .Filters.PrivatePhoto}}checked{{end}}
>
Private photos
< p class = "help" >
unlock notifications
< / p >
< / label >
< / div >
< / div >
< div class = "column is-half" >
< div class = "field" >
< label class = "checkbox" >
< input type = "checkbox"
name="misc"
value="true"
{{if .Filters.Misc}}checked{{end}}
>
Miscellaneous
< p class = "help" >
new friends, certification photos, etc.
< / p >
< / label >
< / div >
< / div >
< / div >
< div class = "block has-text-centered" >
< a href = "{{.Request.URL.Path}}" class = "button" >
Reset
< / a >
< button type = "submit" class = "button is-success" >
Apply Filters
< / button >
< / div >
< / div >
< / div >
2023-10-28 21:34:35 +00:00
2022-08-25 04:17:34 +00:00
< table class = "table is-striped is-fullwidth is-hoverable" >
< tbody >
{{range .Notifications}}
{{$Body := $Root.NotifMap.Get .ID}}
< tr >
< td class = "nonshy-notification-row" data-notification-id = "{{.ID}}" >
2024-08-08 05:15:47 +00:00
<!-- Delete button for just this notification -->
< button type = "button"
class="button is-danger px-2 py-1 is-small nonshy-notif-delete-button"
data-notification-id="{{.ID}}"
title="Remove this notification from your feed">
< i class = "fa fa-xmark mr" > < / i >
< / button >
2022-08-25 04:17:34 +00:00
< div class = "columns" >
< div class = "column is-narrow has-text-centered" >
{{if not .Read}}
< div class = "mb-2 nonshy-notification-new" >
< strong class = "tag is-success" > NEW!< / strong >
< / div >
{{end}}
2022-08-26 03:36:59 +00:00
< a href = "/u/{{.AboutUser.Username}}" >
2022-09-09 04:42:20 +00:00
{{template "avatar-48x48" .AboutUser}}
2022-08-25 04:17:34 +00:00
< / a >
< / div >
< div class = "column" >
2024-08-22 04:53:35 +00:00
< div class = "mb-1 pr-4" >
2022-08-25 04:17:34 +00:00
{{if eq .Type "like"}}
< span class = "icon" > < i class = "fa fa-heart has-text-danger" > < / i > < / span >
< span >
2022-08-26 03:36:59 +00:00
< a href = "/u/{{.AboutUser.Username}}" > < strong > {{.AboutUser.Username}}< / strong > < / a >
2022-08-25 04:17:34 +00:00
liked your
{{if eq .TableName "photos"}}
2022-08-27 02:50:33 +00:00
{{if $Body.Photo}}
< a href = "/photo/view?id={{$Body.Photo.ID}}" > photo< / a > .
{{else}}
photo.
{{end}}
2022-08-25 04:17:34 +00:00
{{else if eq .TableName "users"}}
profile page.
2022-08-30 03:00:15 +00:00
{{else if eq .TableName "comments"}}
{{if .Link}}
< a href = "{{.Link}}" > comment< / a > :
{{else}}
comment.
{{end}}
2022-08-25 04:17:34 +00:00
{{else}}
{{.TableName}}.
{{end}}
< / span >
2022-08-27 02:50:33 +00:00
{{else if eq .Type "comment"}}
< span class = "icon" > < i class = "fa fa-comment has-text-success" > < / i > < / span >
< span >
< a href = "/u/{{.AboutUser.Username}}" > < strong > {{.AboutUser.Username}}< / strong > < / a >
commented on your
< a href = "{{.Link}}" >
{{if eq .TableName "photos"}}
photo:
{{else}}
{{.TableName}}:
{{end}}
< / a >
< / span >
2022-08-27 18:42:48 +00:00
{{else if eq .Type "also_comment"}}
< span class = "icon" > < i class = "fa fa-comment has-text-success" > < / i > < / span >
< span >
< a href = "/u/{{.AboutUser.Username}}" > < strong > {{.AboutUser.Username}}< / strong > < / a >
also commented on a
< a href = "{{.Link}}" >
{{if eq .TableName "photos"}}
photo
{{else}}
{{.TableName}}
{{end}}
< / a >
that you replied to:
< / span >
{{else if eq .Type "also_posted"}}
< span class = "icon" > < i class = "fa fa-comments has-text-success" > < / i > < / span >
< span >
< a href = "/u/{{.AboutUser.Username}}" > < strong > {{.AboutUser.Username}}< / strong > < / a >
replied to < a href = "{{.Link}}" > a forum thread< / a > that you follow:
< / span >
2022-08-26 03:36:59 +00:00
{{else if eq .Type "friendship_approved"}}
2022-08-27 02:50:33 +00:00
< span class = "icon" > < i class = "fa fa-user-group has-text-success" > < / i > < / span >
2022-08-26 03:36:59 +00:00
< span >
< a href = "/u/{{.AboutUser.Username}}" > < strong > {{.AboutUser.Username}}< / strong > < / a >
accepted your friend request!
< / span >
2022-09-08 04:18:54 +00:00
{{else if eq .Type "private_photo"}}
< span class = "icon" > < i class = "fa fa-unlock has-text-private" > < / i > < / span >
< span >
< a href = "/u/{{.AboutUser.Username}}" > < strong > {{.AboutUser.Username}}< / strong > < / a >
has granted you access to see their
< a href = "{{.Link}}" class = "has-text-private" > private photos< / a > !
< / span >
2023-03-17 03:04:43 +00:00
{{else if eq .Type "new_photo"}}
< span class = "icon" >
{{if and $Body.Photo (eq $Body.Photo.Visibility "private")}}
2023-12-27 00:31:37 +00:00
< i class = "fa fa-eye {{if $Body.Photo.Explicit}}has-text-danger{{else}}has-text-private{{end}}" > < / i >
2023-03-17 03:04:43 +00:00
{{else}}
2023-12-27 00:31:37 +00:00
< i class = "fa fa-image {{if $Body.Photo.Explicit}}has-text-danger{{else}}has-text-link{{end}}" > < / i >
2023-03-17 03:04:43 +00:00
{{end}}
< / span >
< span >
< a href = "/u/{{.AboutUser.Username}}" > < strong > {{.AboutUser.Username}}< / strong > < / a >
has uploaded a new
{{if and $Body.Photo (eq $Body.Photo.Visibility "private")}}
< span class = "has-text-private" > private photo!< / span >
{{else}}
photo!
{{end}}
< / span >
2022-08-26 03:36:59 +00:00
{{else if eq .Type "cert_approved"}}
< span class = "icon" > < i class = "fa fa-certificate has-text-success" > < / i > < / span >
< span >
Your < strong > certification photo< / strong > was approved!
< / span >
2024-05-26 19:34:00 +00:00
{{else if eq .Type "cert_secondary"}}
< span class = "icon" > < i class = "fa fa-certificate has-text-warning" > < / i > < / span >
< span >
About your < strong > certification photo:< / strong >
< / span >
2022-08-26 03:36:59 +00:00
{{else if eq .Type "cert_rejected"}}
< span class = "icon" > < i class = "fa fa-certificate has-text-danger" > < / i > < / span >
< span >
Your < strong > certification photo< / strong > was rejected!
< / span >
2024-08-22 04:53:35 +00:00
{{else if eq .Type "forum_moderator"}}
2024-08-22 06:06:06 +00:00
< span class = "icon" > < i class = "fa fa-user-tie has-text-success" > < / i > < / span >
2024-08-22 04:53:35 +00:00
< span >
You have been appointed as a < strong class = "has-text-success" > moderator< / strong >
for the forum < a href = "/f/{{$Body.Forum.Fragment}}" > {{$Body.Forum.Title}}< / a > !
< / span >
2022-08-25 04:17:34 +00:00
{{else}}
2022-08-26 03:36:59 +00:00
{{.AboutUser.Username}} {{.Type}} {{.TableName}} {{.TableID}}
2022-08-25 04:17:34 +00:00
{{end}}
< / div >
2022-08-26 03:36:59 +00:00
<!-- Attached message? -->
{{if .Message}}
2022-08-27 02:50:33 +00:00
< div class = "block content mb-1" >
2022-08-27 18:42:48 +00:00
< blockquote class = "p-2 pl-4" > {{ToMarkdown (TrimEllipses .Message 256)}}< / blockquote >
< / div >
{{end}}
<!-- Attached forum thread? -->
{{if $Body.Thread}}
< div >
On thread: < a href = "{{.Link}}" > {{$Body.Thread.Title}}< / a >
2022-08-26 03:36:59 +00:00
< / div >
{{end}}
2022-08-25 04:17:34 +00:00
<!-- Photo caption? -->
{{if $Body.Photo}}
< div class = "block" >
2022-08-27 02:50:33 +00:00
<!-- If it's a comment, have a link to view it -->
{{if eq .Type "comment"}}
< div class = "is-size-7 pt-1" >
< span class = "icon" > < i class = "fa fa-arrow-right" > < / i > < / span >
< a href = "{{.Link}}" > See all comments< / a >
< / div >
{{else}}
< em > {{or $Body.Photo.Caption "No caption."}}< / em >
{{end}}
2023-12-27 00:31:37 +00:00
<!-- Admin action: mark this pic explicit? -->
{{if and ($Root.CurrentUser.IsAdmin) (not $Body.Photo.Explicit)}}
< div class = "mt-2" >
< a href = "/admin/photo/mark-explicit?photo_id={{$Body.Photo.ID}}&next={{$Root.Request.URL}}"
class="has-text-danger is-size-7"
onclick="return confirm('Do you want to mark this photo as Explicit?')">
< i class = "fa fa-peace mr-1" > < / i >
Mark photo as Explicit
< / a >
< / div >
{{end}}
2022-08-25 04:17:34 +00:00
< / div >
{{end}}
< hr class = "has-background-light mb-1" >
< small title = "{{.CreatedAt.Format " 2006-01-02 15:04:05 " } } " >
2023-08-05 01:54:04 +00:00
{{SincePrettyCoarse .CreatedAt}} ago.
2024-08-08 05:15:47 +00:00
<!-- Contextual "Unsubscribe" buttons -->
{{if or (eq .Type "also_posted") (eq .Type "also_comment")}}
< small >
2024-08-08 06:30:19 +00:00
< a href = "#"
data-link="/comments/subscription?table_name={{.TableName}}& table_id={{.TableID}}& next={{UrlEncode $Root.Request.URL.String}}& subscribe=false"
data-confirm="Do you want to TURN OFF notifications about this comment thread?"
class="has-text-warning is-small nonshy-mute-notification-link"
title="Turn off notifications about this thread">
2024-08-08 05:15:47 +00:00
< i class = "fa fa-microphone-slash mr-1" > < / i > Mute this thread
< / a >
< / small >
2024-08-08 06:05:23 +00:00
{{else if eq .Type "new_photo"}}
< small >
2024-08-08 06:30:19 +00:00
< a href = "#"
data-link="/comments/subscription?table_name=friend.photos& table_id={{.AboutUser.Username}}& next={{UrlEncode $Root.Request.URL.String}}& subscribe=false"
2024-08-08 06:33:45 +00:00
data-confirm="Do you want to TURN OFF notifications about @{{.AboutUser.Username}}'s new photo uploads?\n\nNote: to re-subscribe to their new photo notifications, see the link at the top of @{{.AboutUser.Username}}'s Photo Gallery page."
2024-08-08 06:30:19 +00:00
class="has-text-warning is-small nonshy-mute-notification-link"
title="Turn off notifications about @{{.AboutUser.Username}}'s new photo uploads">
2024-08-08 06:05:23 +00:00
< i class = "fa fa-microphone-slash mr-1" > < / i > Mute these notifications
< / a >
< / small >
2024-08-08 05:15:47 +00:00
{{end}}
2022-08-25 04:17:34 +00:00
< / small >
< / div >
<!-- Attached photo? -->
{{if $Body.PhotoID}}
2023-09-24 18:41:19 +00:00
< div class = "column is-one-quarter is-clipped" >
2023-06-26 06:09:43 +00:00
<!-- GIF video? -->
{{if HasSuffix $Body.Photo.Filename ".mp4"}}
2024-05-19 21:08:17 +00:00
< video loop controls controlsList = "nodownload" playsinline
2024-03-16 06:19:26 +00:00
{{if $Body.Photo.AltText}}title="{{$Body.Photo.AltText}}"{{end}}
2023-09-24 18:41:19 +00:00
{{if BlurExplicit $Body.Photo}}class="blurred-explicit"
{{else if (not (eq ($Root.CurrentUser.GetProfileField "autoplay_gif") "false"))}}autoplay
{{end}}>
2023-06-26 06:09:43 +00:00
< source src = "{{PhotoURL $Body.Photo.Filename}}" type = "video/mp4" >
< / video >
2023-06-26 06:12:44 +00:00
< div >
< a href = "/photo/view?id={{$Body.Photo.ID}}" class = "is-size-7" >
< i class = "fa fa-arrow-right" > < / i > View GIF
< / a >
< / div >
2023-06-26 06:09:43 +00:00
{{else}}
2022-08-27 02:50:33 +00:00
< a href = "/photo/view?id={{$Body.Photo.ID}}" >
2024-03-16 06:19:26 +00:00
< img src = "{{PhotoURL $Body.Photo.Filename}}" loading = "lazy"
{{if BlurExplicit $Body.Photo}} class="blurred-explicit"{{end}}
{{if $Body.Photo.AltText}}title="{{$Body.Photo.AltText}}" alt="{{$Body.Photo.AltText}}"{{end}}>
2022-08-27 02:50:33 +00:00
< / a >
2023-06-26 06:09:43 +00:00
{{end}}
2022-08-25 04:17:34 +00:00
{{if $Body.Photo.Caption}}
< small > {{$Body.Photo.Caption}}< / small >
{{else}}
< small > < em > No caption.< / em > < / small >
{{end}}
2023-06-16 02:06:16 +00:00
<!-- Like button for the photo right here -->
{{if ne $Body.Photo.UserID $Root.CurrentUser.ID}}
< div class = "mt-1" >
{{$Like := $Root.PhotoLikeMap.Get $Body.PhotoID}}
2023-06-22 01:36:42 +00:00
< button type = "button" class = "button is-small nonshy-like-button"
2023-06-16 02:06:16 +00:00
data-table-name="photos" data-table-id="{{$Body.PhotoID}}"
2023-06-22 01:36:42 +00:00
title="Like">
2023-06-16 02:06:16 +00:00
< span class = "icon{{if $Like.UserLikes}} has-text-danger{{end}}" > < i class = "fa fa-heart" > < / i > < / span >
< span class = "nonshy-likes" >
Like
{{if gt $Like.Count 0}}
({{$Like.Count}})
{{end}}
< / span >
2023-06-22 01:36:42 +00:00
< / button >
2023-06-16 02:06:16 +00:00
< / div >
{{end}}
2022-08-25 04:17:34 +00:00
< / div >
{{end}}
< / div >
< / td >
< / tr >
{{end}}
< / tbody >
< / table >
{{if .Pager.HasNext}}
< div class = "has-text-centered" >
2022-09-10 19:09:46 +00:00
< a href = "{{.Request.URL.Path}}?{{QueryPlus " page " . Pager . Next } } " class = "button" > View older notifications< / a >
2022-08-25 04:17:34 +00:00
< / div >
{{end}}
2022-08-10 05:10:47 +00:00
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
2022-08-25 04:17:34 +00:00
< script type = "text/javascript" >
// Notifications helper.
document.addEventListener('DOMContentLoaded', () => {
let busy = false;
2023-08-05 01:54:04 +00:00
// For delete buttons: if they click thru the first confirm, do not ask every single time
// for the rest of the current page load.
let dontAskAgain = false;
2022-08-25 04:17:34 +00:00
// Bind to the notification table rows.
(document.querySelectorAll(".nonshy-notification-row") || []).forEach(node => {
2022-09-09 04:42:20 +00:00
let $newBadge = node.querySelector(".nonshy-notification-new"),
2023-08-05 01:54:04 +00:00
$deleteButton = node.querySelector(".nonshy-notif-delete-button"),
2022-09-09 04:42:20 +00:00
ID = node.dataset.notificationId;
2022-08-25 04:17:34 +00:00
2023-08-05 01:54:04 +00:00
// Delete buttons for individual notifications.
$deleteButton.addEventListener("click", (e) => {
e.stopPropagation();
e.preventDefault();
if (!dontAskAgain) {
if (!window.confirm(
"Do you want to DELETE this notification?\n\nNote: If you click Ok, you will not be asked "+
"the next time you want to delete another notification until your next page reload."
)) {
return;
}
dontAskAgain = true;
}
busy = true;
return fetch("/v1/notifications/delete", {
method: "POST",
mode: "same-origin",
cache: "no-cache",
credentials: "same-origin",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
"id": parseInt(ID),
}),
})
.then((response) => response.json())
.then((data) => {
console.log(data);
// Hide the notification row immediately.
node.style.display = 'none';
}).catch(resp => {
window.alert(resp);
}).finally(() => {
busy = false;
});
});
2022-09-09 04:42:20 +00:00
// If the notification doesn't have a "NEW!" badge, no action needed.
if ($newBadge === null) return;
2022-08-25 04:17:34 +00:00
2022-09-09 04:42:20 +00:00
// Collect any hyperlinks in this row.
let links = Array.from(node.querySelectorAll("a"));
links.push(node);
// Apply a "click" handler to the notification row as a whole, and to all of the hyperlinks in it.
// For the hyperlinks: prevent the browser following the link UNTIL the successful ajax request to
// mark the notification "read" has run.
links.forEach(link => {
link.addEventListener("click", (e) => {
if (busy) return;
// In case it's a hyperlink, grab the href.
let href = link.attributes.href;
if (href !== undefined) {
e.preventDefault();
href = href.textContent;
}
$newBadge.style.display = "none";
busy = true;
return fetch("/v1/notifications/read", {
method: "POST",
mode: "same-origin",
cache: "no-cache",
credentials: "same-origin",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
"id": parseInt(ID),
}),
})
.then((response) => response.json())
.then((data) => {
console.log(data);
}).catch(resp => {
window.alert(resp);
}).finally(() => {
busy = false;
2024-08-08 06:30:19 +00:00
if (href !== undefined & & href !== "#") {
2022-09-09 04:42:20 +00:00
window.location.href = href;
}
});
2022-08-25 04:17:34 +00:00
})
2023-08-05 01:54:04 +00:00
});
2022-08-25 04:17:34 +00:00
});
2024-08-08 06:30:19 +00:00
// "Mute notification" links.
// NOTE: to avoid conflict with the "mark notification as read, then follow href" code
// above, the mute buttons href is made safer and this function will get its follow-thru
// URL from a data attribute.
(document.querySelectorAll(".nonshy-mute-notification-link") || []).forEach(node => {
node.addEventListener("click", (e) => {
e.preventDefault();
e.stopPropagation();
const link = node.dataset.link,
2024-08-08 06:33:45 +00:00
prompt = node.dataset.confirm.replace(/\\n/g, "\n");
2024-08-08 06:30:19 +00:00
if (!window.confirm(prompt)) return;
window.location = link;
});
});
2022-08-25 04:17:34 +00:00
});
< / script >
2023-06-17 00:42:28 +00:00
{{end}}