273 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			273 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
package views
 | 
						|
 | 
						|
import "fmt"
 | 
						|
import "git.32bit.cafe/32bitcafe/guestbook/internal/models"
 | 
						|
import "git.32bit.cafe/32bitcafe/guestbook/internal/forms"
 | 
						|
import "time"
 | 
						|
 | 
						|
templ GuestbookDashboardCommentsView(title string, data CommonData, website models.Website, guestbook models.Guestbook, comments []models.GuestbookComment) {
 | 
						|
	@base(title, data) {
 | 
						|
		<div id="dashboard">
 | 
						|
			@wSidebar(website)
 | 
						|
			<div>
 | 
						|
				<h1>Comments on { website.Name }</h1>
 | 
						|
				<hr/>
 | 
						|
				if len(comments) == 0 {
 | 
						|
					<p>No comments yet!</p>
 | 
						|
				}
 | 
						|
				for  _, c := range comments {
 | 
						|
					@GuestbookDashboardCommentView(data, website, c)
 | 
						|
				}
 | 
						|
			</div>
 | 
						|
		</div>
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
templ GuestbookDashboardCommentView(data CommonData, w models.Website, c models.GuestbookComment) {
 | 
						|
	{{ commentUrl := fmt.Sprintf("%s/dashboard/guestbook/comments/%s", wUrl(w), shortIdToSlug(c.ShortId)) }}
 | 
						|
	{{ hxHeaders := fmt.Sprintf("{\"X-CSRF-Token\": \"%s\"}", data.CSRFToken) }}
 | 
						|
	<div class="comment">
 | 
						|
		<div>
 | 
						|
			if c.Deleted.IsZero() {
 | 
						|
				<button class="danger" hx-delete={ commentUrl } hx-target="closest div.comment" hx-headers={ hxHeaders }>Delete</button>
 | 
						|
				<button class="outline" hx-put={ commentUrl } hx-target="closest div.comment" hx-headers={ hxHeaders }>
 | 
						|
					if !c.IsPublished {
 | 
						|
						Publish
 | 
						|
					} else {
 | 
						|
						Hide
 | 
						|
					}
 | 
						|
				</button>
 | 
						|
			}
 | 
						|
		</div>
 | 
						|
		<div>
 | 
						|
			<strong>{ c.AuthorName }</strong>
 | 
						|
			if len(c.AuthorEmail) > 0 {
 | 
						|
				{{ email := "mailto:" + c.AuthorEmail }}
 | 
						|
				| <a href={ templ.URL(email) } target="_blank">{ c.AuthorEmail }</a>
 | 
						|
			}
 | 
						|
			if len(c.AuthorSite) > 0 {
 | 
						|
				| <a href={ templ.URL(externalUrl(c.AuthorSite)) } target="_blank">{ c.AuthorSite }</a>
 | 
						|
			}
 | 
						|
			<p>
 | 
						|
				{ c.Created.In(data.CurrentUser.Settings.LocalTimezone).Format("01-02-2006 03:04PM") }
 | 
						|
			</p>
 | 
						|
		</div>
 | 
						|
		<p>
 | 
						|
			{ c.CommentText }
 | 
						|
		</p>
 | 
						|
		<hr/>
 | 
						|
	</div>
 | 
						|
}
 | 
						|
 | 
						|
templ commentForm(form forms.CommentCreateForm) {
 | 
						|
	<div>
 | 
						|
		<label for="authorname">Name</label>
 | 
						|
		{{ error, exists := form.FieldErrors["authorName"] }}
 | 
						|
		if exists {
 | 
						|
			<label class="error">{ error }</label>
 | 
						|
		}
 | 
						|
		<input type="text" name="authorname" id="authorname"/>
 | 
						|
	</div>
 | 
						|
	<div>
 | 
						|
		<label for="authoremail">Email (Optional) </label>
 | 
						|
		{{ error, exists = form.FieldErrors["authorEmail"] }}
 | 
						|
		if exists {
 | 
						|
			<label class="error">{ error }</label>
 | 
						|
		}
 | 
						|
		<input type="text" name="authoremail" id="authoremail"/>
 | 
						|
	</div>
 | 
						|
	<div>
 | 
						|
		<label for="authorsite">Site Url (Optional) </label>
 | 
						|
		{{ error, exists = form.FieldErrors["authorSite"] }}
 | 
						|
		if exists {
 | 
						|
			<label class="error">{ error }</label>
 | 
						|
		}
 | 
						|
		<input type="text" name="authorsite" id="authorsite"/>
 | 
						|
	</div>
 | 
						|
	<div>
 | 
						|
		<label for="content">Comment</label>
 | 
						|
		{{ error, exists = form.FieldErrors["content"] }}
 | 
						|
		if exists {
 | 
						|
			<label class="error">{ error }</label>
 | 
						|
		}
 | 
						|
		<textarea name="content" id="content"></textarea>
 | 
						|
	</div>
 | 
						|
	<div>
 | 
						|
		<input type="submit" value="Submit"/>
 | 
						|
	</div>
 | 
						|
}
 | 
						|
 | 
						|
templ GuestbookView(title string, data CommonData, website models.Website, guestbook models.Guestbook, comments []models.GuestbookComment, form forms.CommentCreateForm) {
 | 
						|
	{{ postUrl := fmt.Sprintf("/websites/%s/guestbook/comments/create", shortIdToSlug(website.ShortId)) }}
 | 
						|
	if data.IsHtmx {
 | 
						|
		@commentForm(form)
 | 
						|
	} else {
 | 
						|
		<html>
 | 
						|
			<head>
 | 
						|
				<title>{ title }</title>
 | 
						|
				<link href="/static/css/classless.min.css" rel="stylesheet"/>
 | 
						|
				<script src="/static/js/main.js" defer></script>
 | 
						|
			</head>
 | 
						|
			<body>
 | 
						|
				<main>
 | 
						|
					<div>
 | 
						|
						<h1>Guestbook for { website.Name }</h1>
 | 
						|
						{ data.Flash }
 | 
						|
						<form action={ templ.URL(postUrl) } method="post">
 | 
						|
							<input type="hidden" name="csrf_token" value={ data.CSRFToken }/>
 | 
						|
							@commentForm(form)
 | 
						|
						</form>
 | 
						|
					</div>
 | 
						|
					<div id="comments">
 | 
						|
						if len(comments) == 0 {
 | 
						|
							<p>No comments yet!</p>
 | 
						|
						}
 | 
						|
						for _, c := range comments {
 | 
						|
							<div>
 | 
						|
								<h3>
 | 
						|
									if c.AuthorSite != "" {
 | 
						|
										<a href={ templ.URL(externalUrl(c.AuthorSite)) } target="_blank">{ c.AuthorName }</a>
 | 
						|
									} else {
 | 
						|
										{ c.AuthorName }
 | 
						|
									}
 | 
						|
								</h3>
 | 
						|
								<time datetime={ c.Created.Format(time.RFC3339) }>{ c.Created.Format("01-02-2006 03:04PM") }</time>
 | 
						|
								<p>
 | 
						|
									{ c.CommentText }
 | 
						|
								</p>
 | 
						|
							</div>
 | 
						|
						}
 | 
						|
					</div>
 | 
						|
				</main>
 | 
						|
			</body>
 | 
						|
		</html>
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
templ settingRadio(selected bool, name, id, value string) {
 | 
						|
	<input type="radio" name={ name } id={ id } value={ value } selected?={ selected }/>
 | 
						|
}
 | 
						|
 | 
						|
templ GuestbookSettingsView(data CommonData, website models.Website) {
 | 
						|
	{{ putUrl := fmt.Sprintf("/websites/%s/dashboard/guestbook/settings", shortIdToSlug(website.ShortId)) }}
 | 
						|
	{{ gb := website.Guestbook }}
 | 
						|
	@base("Guestbook Settings", data) {
 | 
						|
		<div id="dashboard">
 | 
						|
			@wSidebar(website)
 | 
						|
			<div>
 | 
						|
				<h1>Guestbook Settings</h1>
 | 
						|
				<form hx-put={ putUrl }>
 | 
						|
					<input type="hidden" name="csrf_token" value={ data.CSRFToken }/>
 | 
						|
					<div>
 | 
						|
						<label>Guestbook Visibility</label>
 | 
						|
						<label for="gb_visible_true">
 | 
						|
							<input type="radio" name="gb_visible" id="gb_visible_true" value="true" checked?={ gb.Settings.IsVisible }/>
 | 
						|
							Public
 | 
						|
						</label>
 | 
						|
						<label for="gb_visible_false">
 | 
						|
							<input type="radio" name="gb_visible" id="gb_visible_false" value="false" checked?={ !gb.Settings.IsVisible }/>
 | 
						|
							Private
 | 
						|
						</label>
 | 
						|
					</div>
 | 
						|
					<div>
 | 
						|
						<label>Guestbook Commenting</label>
 | 
						|
						<select name="gb_commenting" id="gb-commenting">
 | 
						|
							<option value="true" selected?={ gb.Settings.IsCommentingEnabled }>Enabled</option>
 | 
						|
							<option value="1h">Disabled for 1 Hour</option>
 | 
						|
							<option value="4h">Disabled for 4 Hours</option>
 | 
						|
							<option value="8h">Disabled for 8 Hours</option>
 | 
						|
							<option value="24h">Disabled for 1 Day</option>
 | 
						|
							<option value="72h">Disabled for 3 Days</option>
 | 
						|
							<option value="168h">Disabled for 7 Days</option>
 | 
						|
							<option value="false" selected?={ !gb.Settings.IsCommentingEnabled }>Disabled</option>
 | 
						|
						</select>
 | 
						|
						if !website.Guestbook.CanComment() {
 | 
						|
							{{ localtime := gb.Settings.ReenableCommenting.In(data.CurrentUser.Settings.LocalTimezone) }}
 | 
						|
							<label>Commenting re-enabled on <time value={ localtime.Format(time.RFC3339) }>{ localtime.Format("2 January 2006") } at { localtime.Format("3:04PM MST") }</time></label>
 | 
						|
						}
 | 
						|
					</div>
 | 
						|
					<div>
 | 
						|
						<label>Enable Widgets</label>
 | 
						|
						<label for="gb_remote_true">
 | 
						|
							<input type="radio" name="gb_remote" id="gb_remote_true" value="true" checked?={ gb.Settings.AllowRemoteHostAccess }/>
 | 
						|
							Yes
 | 
						|
						</label>
 | 
						|
						<label for="gb_remote_false">
 | 
						|
							<input type="radio" name="gb_remote" id="gb_remote_false" value="false" checked?={ !gb.Settings.AllowRemoteHostAccess }/>
 | 
						|
							No
 | 
						|
						</label>
 | 
						|
					</div>
 | 
						|
					<input type="submit" value="Submit"/>
 | 
						|
				</form>
 | 
						|
			</div>
 | 
						|
		</div>
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
templ EmbeddableGuestbookCommentForm(data CommonData, w models.Website, f forms.CommentCreateForm) {
 | 
						|
	{{ postUrl := fmt.Sprintf("/websites/%s/guestbook/comments/create?headless=true", shortIdToSlug(w.ShortId)) }}
 | 
						|
	<html>
 | 
						|
		<head>
 | 
						|
			<link href="/static/css/classless.min.css" rel="stylesheet"/>
 | 
						|
		</head>
 | 
						|
		<body>
 | 
						|
			{ data.Flash }
 | 
						|
			<form action={ templ.URL(postUrl) } method="post">
 | 
						|
				<input type="hidden" name="csrf_token" value={ data.CSRFToken }/>
 | 
						|
				@commentForm(f)
 | 
						|
			</form>
 | 
						|
		</body>
 | 
						|
	</html>
 | 
						|
}
 | 
						|
 | 
						|
templ AllGuestbooksView(data CommonData, websites []models.Website) {
 | 
						|
	@base("All Guestbooks", data) {
 | 
						|
		<div>
 | 
						|
			<h1>All Guestbooks</h1>
 | 
						|
			<p>
 | 
						|
				This page exists only for testing the service.
 | 
						|
			</p>
 | 
						|
			<ul>
 | 
						|
				for _, w := range websites {
 | 
						|
					<li>
 | 
						|
						{{ gbUrl := fmt.Sprintf("/websites/%s/guestbook", shortIdToSlug(w.ShortId)) }}
 | 
						|
						<a href={ templ.URL(gbUrl) } target="_blank">{ w.Name }</a>
 | 
						|
					</li>
 | 
						|
				}
 | 
						|
			</ul>
 | 
						|
		</div>
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
templ GuestbookCommentCreateRemoteErrorView(url, err string) {
 | 
						|
	<html>
 | 
						|
		<head>
 | 
						|
			<meta http-equiv="refresh" content={ fmt.Sprintf("3; url='%s'", templ.URL(externalUrl(url))) }/>
 | 
						|
		</head>
 | 
						|
		<body>
 | 
						|
			<p>
 | 
						|
				An error occurred while posting comment. { err }. Redirecting.
 | 
						|
			</p>
 | 
						|
			<p>
 | 
						|
				<a href={ templ.URL(url) }>Redirect</a>
 | 
						|
			</p>
 | 
						|
		</body>
 | 
						|
	</html>
 | 
						|
}
 | 
						|
 | 
						|
templ GuestbookCommentCreateRemoteSuccessView(url string) {
 | 
						|
	<html>
 | 
						|
		<head>
 | 
						|
			<meta http-equiv="refresh" content={ fmt.Sprintf("3; url='%s'", templ.URL(externalUrl(url))) }/>
 | 
						|
		</head>
 | 
						|
		<body>
 | 
						|
			<p>
 | 
						|
				Comment successfully posted. Redirecting.
 | 
						|
			</p>
 | 
						|
			<p>
 | 
						|
				<a href={ templ.URL(url) }>Redirect</a>
 | 
						|
			</p>
 | 
						|
		</body>
 | 
						|
	</html>
 | 
						|
}
 |