Show improved project details on placeholder page

This commit is contained in:
Alex Cabal 2024-12-18 15:49:36 -06:00
parent 7a6a743295
commit 378555d131
7 changed files with 153 additions and 55 deletions

View file

@ -45,7 +45,9 @@ use function Safe\shell_exec;
* @property string $IndexableText
* @property ?EbookPlaceholder $EbookPlaceholder
* @property array<Project> $Projects
* @property array<Project> $PastProjects
* @property ?Project $ProjectInProgress
* @property ?Artwork $Artwork
*/
final class Ebook{
use Traits\Accessor;
@ -127,12 +129,30 @@ final class Ebook{
protected ?EbookPlaceholder $_EbookPlaceholder = null;
/** @var array<Project> $_Projects */
protected array $_Projects;
/** @var array<Project> $_PastProjects */
protected array $_PastProjects;
protected ?Project $_ProjectInProgress;
protected ?Artwork $_Artwork;
// *******
// GETTERS
// *******
protected function GetArtwork(): ?Artwork{
if(!isset($this->_Artwork)){
$this->_Artwork = Db::Query('
SELECT
*
from
Artworks
where
EbookUrl = ?
', [preg_replace('/^url:/iu', '', $this->Identifier)], Artwork::class)[0] ?? null;
}
return $this->_Artwork;
}
/**
* @return array<Project>
*/
@ -141,6 +161,8 @@ final class Ebook{
$this->_Projects = Db::Query('
SELECT *
from Projects
inner join Ebooks
using(EbookId)
where EbookId = ?
order by Created desc
', [$this->EbookId], Project::class);
@ -158,6 +180,8 @@ final class Ebook{
$this->_ProjectInProgress = Db::Query('
SELECT *
from Projects
inner join Ebooks
using(EbookId)
where EbookId = ?
and Status in (?, ?)
', [$this->EbookId, Enums\ProjectStatusType::InProgress, Enums\ProjectStatusType::Stalled], Project::class)[0] ?? null;
@ -167,6 +191,29 @@ final class Ebook{
return $this->_ProjectInProgress;
}
/**
* @return array<Project>
*/
protected function GetPastProjects(): array{
if(!isset($this->_PastProjects)){
if(!isset($this->EbookId)){
$this->_PastProjects = [];
}
else{
$this->_PastProjects = Db::Query('
SELECT *
from Projects
inner join Ebooks
using(EbookId)
where EbookId = ?
and Status in (?, ?)
', [$this->EbookId, Enums\ProjectStatusType::Completed, Enums\ProjectStatusType::Abandoned], Project::class);
}
}
return $this->_PastProjects;
}
/**
* @return array<GitCommit>
*/

View file

@ -1,7 +1,7 @@
<?
$preheader = $preheader ?? null;
$letterhead = $letterhead ?? false;
$hasDataTable = $hasDataTable ?? false;
$hasAdminTable = $hasAdminTable ?? false;
?><!DOCTYPE html>
<html lang="en">
<head>
@ -190,13 +190,13 @@ $hasDataTable = $hasDataTable ?? false;
text-align: center;
}
<? if($hasDataTable){ ?>
table.data-table td:first-child{
<? if($hasAdminTable){ ?>
table.admin-table td:first-child{
font-weight: bold;
text-align: right;
}
table.data-table td{
table.admin-table td{
padding: .25em;
border: none;
}

View file

@ -4,56 +4,9 @@
* @var string $role
* @var User $user
*/
?><?= Template::EmailHeader(['hasDataTable' => true, 'letterhead' => true]) ?>
?><?= Template::EmailHeader(['hasAdminTable' => true, 'letterhead' => true]) ?>
<p>Youve been assigned a new ebook project to <strong><?= $role ?></strong>:</p>
<table class="data-table">
<tbody>
<tr>
<td>Title:</td>
<td><a href="<?= SITE_URL ?><?= $project->Ebook->Url ?>"><?= Formatter::EscapeHtml($project->Ebook->Title) ?></a></td>
</tr>
<tr>
<td>Producer:</td>
<td>
<? if($project->ProducerEmail !== null){ ?>
<a href="mailto:<?= Formatter::EscapeHtml($project->ProducerEmail) ?>"><?= Formatter::EscapeHtml($project->ProducerName) ?></a>
<? }elseif($project->DiscussionUrl !== null){ ?>
<a href="<?= Formatter::EscapeHtml($project->DiscussionUrl) ?>"><?= Formatter::EscapeHtml($project->ProducerName) ?></a>
<? }else{ ?>
<?= Formatter::EscapeHtml($project->ProducerName) ?>
<? } ?>
</td>
</tr>
<tr>
<td>Manager:</td>
<td>
<a href="<?= SITE_URL ?><?= $project->Manager->Url ?>/projects"><?= Formatter::EscapeHtml($project->Manager->DisplayName) ?></a>
</td>
</tr>
<tr>
<td>Reviewer:</td>
<td>
<a href="<?= SITE_URL ?><?= $project->Reviewer->Url ?>/projects"><?= Formatter::EscapeHtml($project->Reviewer->DisplayName) ?></a>
</td>
</tr>
<? if($project->VcsUrl !== null){ ?>
<tr>
<td>Repository:</td>
<td>
<a href="<?= Formatter::EscapeHtml($project->VcsUrl) ?>"><?= Formatter::EscapeHtml($project->VcsUrlDomain) ?></a>
</td>
</tr>
<? } ?>
<? if($project->DiscussionUrl !== null){ ?>
<tr>
<td>Discussion:</td>
<td>
<a href="<?= Formatter::EscapeHtml($project->DiscussionUrl) ?>"><?= Formatter::EscapeHtml($project->DiscussionUrlDomain) ?></a>
</td>
</tr>
<? } ?>
</tbody>
</table>
<?= Template::ProjectDetailsTable(['project' => $project, 'useFullyQualifiedUrls' => true, 'showArtworkStatus' => false]) ?>
<p>If youre unable to <?= $role ?> this ebook project, <a href="mailto:<?= EDITOR_IN_CHIEF_EMAIL_ADDRESS ?>">email the Editor-in-Chief</a> and well reassign it.</p>
<ul>
<li>

View file

@ -0,0 +1,73 @@
<?
/**
* @var Project $project
*/
$useFullyQualifiedUrls = $useFullyQualifiedUrls ?? false;
$showTitle = $showTitle ?? true;
$showArtworkStatus = $showArtworkStatus ?? true;
?>
<table class="admin-table">
<tbody>
<? if($showTitle){ ?>
<tr>
<td>Title:</td>
<td><a href="<? if($useFullyQualifiedUrls){ ?><?= SITE_URL ?><? } ?><?= $project->Ebook->Url ?>"><?= Formatter::EscapeHtml($project->Ebook->Title) ?></a></td>
</tr>
<? } ?>
<tr>
<td>Producer:</td>
<td>
<? if($project->ProducerEmail !== null){ ?>
<a href="mailto:<?= Formatter::EscapeHtml($project->ProducerEmail) ?>"><?= Formatter::EscapeHtml($project->ProducerName) ?></a>
<? }elseif($project->DiscussionUrl !== null){ ?>
<a href="<?= Formatter::EscapeHtml($project->DiscussionUrl) ?>"><?= Formatter::EscapeHtml($project->ProducerName) ?></a>
<? }else{ ?>
<?= Formatter::EscapeHtml($project->ProducerName) ?>
<? } ?>
</td>
</tr>
<tr>
<td>Manager:</td>
<td>
<a href="<? if($useFullyQualifiedUrls){ ?><?= SITE_URL ?><? } ?><?= $project->Manager->Url ?>/projects"><?= Formatter::EscapeHtml($project->Manager->DisplayName) ?></a>
</td>
</tr>
<tr>
<td>Reviewer:</td>
<td>
<a href="<? if($useFullyQualifiedUrls){ ?><?= SITE_URL ?><? } ?><?= $project->Reviewer->Url ?>/projects"><?= Formatter::EscapeHtml($project->Reviewer->DisplayName) ?></a>
</td>
</tr>
<? if($project->VcsUrl !== null){ ?>
<tr>
<td>Repository:</td>
<td>
<a href="<?= Formatter::EscapeHtml($project->VcsUrl) ?>"><?= Formatter::EscapeHtml($project->VcsUrlDomain) ?></a>
</td>
</tr>
<? } ?>
<? if($project->DiscussionUrl !== null){ ?>
<tr>
<td>Discussion:</td>
<td>
<a href="<?= Formatter::EscapeHtml($project->DiscussionUrl) ?>"><?= Formatter::EscapeHtml($project->DiscussionUrlDomain) ?></a>
</td>
</tr>
<? } ?>
<? if($showArtworkStatus){ ?>
<tr>
<td>Cover art:</td>
<td>
<? if($project->Ebook->Artwork !== null){ ?>
<i>
<a href="<?= $project->Ebook->Artwork->Url ?>"><?= Formatter::EscapeHtml($project->Ebook->Artwork->Name) ?></a>
</i> <i>(<?= ucfirst($project->Ebook->Artwork->Status->value) ?>.)</i>
<? }else{ ?>
<i>None.</i>
<? } ?>
</td>
</tr>
<? } ?>
</tbody>
</table>

View file

@ -3296,6 +3296,7 @@ ol.ebooks-list > li.ribbon.not-pd a::after{
content: "not p.d. yet";
}
p + table.admin-table,
h2 + table.admin-table{
margin-top: .5rem;
}

View file

@ -125,7 +125,31 @@ catch(Exceptions\EbookNotFoundException){
<? } ?>
<? if(Session::$User?->Benefits->CanEditProjects || Session::$User?->Benefits->CanManageProjects || Session::$User?->Benefits->CanReviewProjects){ ?>
<?= Template::EbookProjects(['ebook' => $ebook, 'showAddButton' => Session::$User->Benefits->CanEditProjects && $ebook->ProjectInProgress === null, 'showEditButton' => Session::$User->Benefits->CanEditProjects]) ?>
<? if($ebook->ProjectInProgress !== null){ ?>
<section id="projects">
<h2>Project in progress</h2>
<? if(Session::$User->Benefits->CanEditProjects){ ?>
<p>
<a href="<?= $ebook->ProjectInProgress->EditUrl ?>">Edit project</a>
</p>
<? } ?>
<?= Template::ProjectDetailsTable(['project' => $ebook->ProjectInProgress, 'showTitle' => false]) ?>
</section>
<? } ?>
<section id="projects">
<h2>Past projects</h2>
<? if(Session::$User->Benefits->CanEditProjects && $ebook->ProjectInProgress === null){ ?>
<p>
<a href="<?= $ebook->Url ?>/projects/new">New project</a>
</p>
<? } ?>
<? if(sizeof($ebook->PastProjects) == 0){ ?>
<p class="empty-notice">None.</p>
<? }else{ ?>
<?= Template::ProjectsTable(['projects' => $ebook->PastProjects, 'includeTitle' => false, 'showEditButton' => Session::$User->Benefits->CanEditProjects]) ?>
<? } ?>
</section>
<? } ?>
</article>
</main>

View file

@ -74,7 +74,7 @@ catch(Exceptions\InvalidPermissionsException){
<? if(isset($createdEbook)){ ?>
<? if($isOnlyProjectCreated){ ?>
<p class="message success">An ebook placeholder <a href="<?= $createdEbook->Url ?>">already exists</a> for this ebook, but a a new project was created!</p>
<p class="message success">An ebook placeholder <a href="<?= $createdEbook->Url ?>">already exists</a> for this ebook, but a new project was created!</p>
<? }elseif($isCreated){ ?>
<p class="message success">Ebook placeholder created: <a href="<?= $createdEbook->Url ?>"><?= Formatter::EscapeHtml($createdEbook->Title) ?></a>!</p>
<? } ?>