// Back - An extremely simple git issue tracking system. Inspired by tvix's
// panettone
//
// Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de>
// SPDX-License-Identifier: AGPL-3.0-or-later
//
// This file is part of Back.
//
// You should have received a copy of the License along with this program.
// If not, see <https://www.gnu.org/licenses/agpl.txt>.
use rocket::response::content::RawHtml;
use crate::{
config::BackConfig,
git_bug::{
format::HtmlString,
issue::{identity::Author, CollapsedIssue, Comment},
},
};
impl CollapsedIssue {
pub fn to_list_entry(&self) -> RawHtml<String> {
let comment_list = if self.comments.is_empty() {
String::new()
} else {
let comments_string = if self.comments.len() > 1 {
"comments"
} else {
"comment"
};
format!(
r#"
<span class="comment-count"> - {} {}</span>
"#,
self.comments.len(),
comments_string
)
};
let CollapsedIssue {
id,
title,
message: _,
author,
timestamp,
comments: _,
status: _,
last_status_change: _,
labels: _,
} = self;
let Author { name, email, id: _ } = author;
RawHtml(format!(
r#"
<li>
<a href="/issue/{id}">
<p>
<span class="issue-subject">{title}</span>
</p>
<span class="issue-number">{id}</span> - <span class="created-by-at">Opened by <span class="user-name">{name}</span> <span class="user-email"><{email}></span> at <span class="timestamp">{timestamp}</span></span>{comment_list} </a>
</li>
"#,
))
}
pub fn to_html(&self, config: &BackConfig) -> RawHtml<String> {
let comments = if self.comments.is_empty() {
String::new()
} else {
let fmt_comments: String = self
.comments
.iter()
.map(|val| {
let Comment {
id,
author,
message,
timestamp,
} = val;
let Author {
name,
email: _,
id: _,
} = author;
format!(
r#"
<li class="comment" id="{id}">
{message}
<p class="comment-info"><span class="user-name">{name} at {timestamp}</span></p>
</li>
"#,
)
})
.collect::<Vec<String>>()
.join("\n");
format!(
r#"
<ol class="issue-history">
{fmt_comments}
</ol>
"#
)
};
{
let CollapsedIssue {
id,
title,
message,
author,
timestamp,
comments: _,
status: _,
last_status_change: _,
labels: _,
} = self;
let Author { name, email, id: _ } = author;
let html_title = HtmlString::from(title.clone());
RawHtml(format!(
r#"
<!DOCTYPE html>
<html lang="en">
<head>
<title>{html_title} | Back</title>
<link href="/style.css" rel="stylesheet" type="text/css">
<meta content="width=device-width,initial-scale=1" name="viewport">
</head>
<body>
<div class="content">
<nav>
<a href="/issues/open">Open Issues</a>
<a href="/issues/closed">Closed Issues</a>
</nav>
<header>
<h1>{title}</h1>
<div class="issue-number">{id}</div>
</header>
<main>
<div class="issue-info">
<span class="created-by-at">Opened by <span class="user-name">{name}</span> <span class="user-email"><{email}></span> at <span class="timestamp">{timestamp}</span></span>
</div>
{message}
{comments}
</main>
<footer>
<nav>
<a href="/issues/open">Open Issues</a>
<a href="{}">Source code</a>
<a href="/issues/closed">Closed Issues</a>
</nav>
</footer>
</div>
</body>
</html>
"#,
config.source_code_repository_url
))
}
}
}