mirror of
https://github.com/standardebooks/web.git
synced 2025-07-08 15:50:29 -04:00
Show improved project details on placeholder page
This commit is contained in:
parent
7a6a743295
commit
378555d131
7 changed files with 153 additions and 55 deletions
|
@ -45,7 +45,9 @@ use function Safe\shell_exec;
|
||||||
* @property string $IndexableText
|
* @property string $IndexableText
|
||||||
* @property ?EbookPlaceholder $EbookPlaceholder
|
* @property ?EbookPlaceholder $EbookPlaceholder
|
||||||
* @property array<Project> $Projects
|
* @property array<Project> $Projects
|
||||||
|
* @property array<Project> $PastProjects
|
||||||
* @property ?Project $ProjectInProgress
|
* @property ?Project $ProjectInProgress
|
||||||
|
* @property ?Artwork $Artwork
|
||||||
*/
|
*/
|
||||||
final class Ebook{
|
final class Ebook{
|
||||||
use Traits\Accessor;
|
use Traits\Accessor;
|
||||||
|
@ -127,12 +129,30 @@ final class Ebook{
|
||||||
protected ?EbookPlaceholder $_EbookPlaceholder = null;
|
protected ?EbookPlaceholder $_EbookPlaceholder = null;
|
||||||
/** @var array<Project> $_Projects */
|
/** @var array<Project> $_Projects */
|
||||||
protected array $_Projects;
|
protected array $_Projects;
|
||||||
|
/** @var array<Project> $_PastProjects */
|
||||||
|
protected array $_PastProjects;
|
||||||
protected ?Project $_ProjectInProgress;
|
protected ?Project $_ProjectInProgress;
|
||||||
|
protected ?Artwork $_Artwork;
|
||||||
|
|
||||||
// *******
|
// *******
|
||||||
// GETTERS
|
// 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>
|
* @return array<Project>
|
||||||
*/
|
*/
|
||||||
|
@ -141,6 +161,8 @@ final class Ebook{
|
||||||
$this->_Projects = Db::Query('
|
$this->_Projects = Db::Query('
|
||||||
SELECT *
|
SELECT *
|
||||||
from Projects
|
from Projects
|
||||||
|
inner join Ebooks
|
||||||
|
using(EbookId)
|
||||||
where EbookId = ?
|
where EbookId = ?
|
||||||
order by Created desc
|
order by Created desc
|
||||||
', [$this->EbookId], Project::class);
|
', [$this->EbookId], Project::class);
|
||||||
|
@ -158,6 +180,8 @@ final class Ebook{
|
||||||
$this->_ProjectInProgress = Db::Query('
|
$this->_ProjectInProgress = Db::Query('
|
||||||
SELECT *
|
SELECT *
|
||||||
from Projects
|
from Projects
|
||||||
|
inner join Ebooks
|
||||||
|
using(EbookId)
|
||||||
where EbookId = ?
|
where EbookId = ?
|
||||||
and Status in (?, ?)
|
and Status in (?, ?)
|
||||||
', [$this->EbookId, Enums\ProjectStatusType::InProgress, Enums\ProjectStatusType::Stalled], Project::class)[0] ?? null;
|
', [$this->EbookId, Enums\ProjectStatusType::InProgress, Enums\ProjectStatusType::Stalled], Project::class)[0] ?? null;
|
||||||
|
@ -167,6 +191,29 @@ final class Ebook{
|
||||||
return $this->_ProjectInProgress;
|
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>
|
* @return array<GitCommit>
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?
|
<?
|
||||||
$preheader = $preheader ?? null;
|
$preheader = $preheader ?? null;
|
||||||
$letterhead = $letterhead ?? false;
|
$letterhead = $letterhead ?? false;
|
||||||
$hasDataTable = $hasDataTable ?? false;
|
$hasAdminTable = $hasAdminTable ?? false;
|
||||||
?><!DOCTYPE html>
|
?><!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
|
@ -190,13 +190,13 @@ $hasDataTable = $hasDataTable ?? false;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
<? if($hasDataTable){ ?>
|
<? if($hasAdminTable){ ?>
|
||||||
table.data-table td:first-child{
|
table.admin-table td:first-child{
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.data-table td{
|
table.admin-table td{
|
||||||
padding: .25em;
|
padding: .25em;
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,56 +4,9 @@
|
||||||
* @var string $role
|
* @var string $role
|
||||||
* @var User $user
|
* @var User $user
|
||||||
*/
|
*/
|
||||||
?><?= Template::EmailHeader(['hasDataTable' => true, 'letterhead' => true]) ?>
|
?><?= Template::EmailHeader(['hasAdminTable' => true, 'letterhead' => true]) ?>
|
||||||
<p>You’ve been assigned a new ebook project to <strong><?= $role ?></strong>:</p>
|
<p>You’ve been assigned a new ebook project to <strong><?= $role ?></strong>:</p>
|
||||||
<table class="data-table">
|
<?= Template::ProjectDetailsTable(['project' => $project, 'useFullyQualifiedUrls' => true, 'showArtworkStatus' => false]) ?>
|
||||||
<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>
|
|
||||||
<p>If you’re unable to <?= $role ?> this ebook project, <a href="mailto:<?= EDITOR_IN_CHIEF_EMAIL_ADDRESS ?>">email the Editor-in-Chief</a> and we’ll reassign it.</p>
|
<p>If you’re unable to <?= $role ?> this ebook project, <a href="mailto:<?= EDITOR_IN_CHIEF_EMAIL_ADDRESS ?>">email the Editor-in-Chief</a> and we’ll reassign it.</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
|
73
templates/ProjectDetailsTable.php
Normal file
73
templates/ProjectDetailsTable.php
Normal 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>
|
|
@ -3296,6 +3296,7 @@ ol.ebooks-list > li.ribbon.not-pd a::after{
|
||||||
content: "not p.d. yet";
|
content: "not p.d. yet";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p + table.admin-table,
|
||||||
h2 + table.admin-table{
|
h2 + table.admin-table{
|
||||||
margin-top: .5rem;
|
margin-top: .5rem;
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,7 +125,31 @@ catch(Exceptions\EbookNotFoundException){
|
||||||
<? } ?>
|
<? } ?>
|
||||||
|
|
||||||
<? if(Session::$User?->Benefits->CanEditProjects || Session::$User?->Benefits->CanManageProjects || Session::$User?->Benefits->CanReviewProjects){ ?>
|
<? 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>
|
</article>
|
||||||
</main>
|
</main>
|
||||||
|
|
|
@ -74,7 +74,7 @@ catch(Exceptions\InvalidPermissionsException){
|
||||||
|
|
||||||
<? if(isset($createdEbook)){ ?>
|
<? if(isset($createdEbook)){ ?>
|
||||||
<? if($isOnlyProjectCreated){ ?>
|
<? 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){ ?>
|
<? }elseif($isCreated){ ?>
|
||||||
<p class="message success">Ebook placeholder created: <a href="<?= $createdEbook->Url ?>"><?= Formatter::EscapeHtml($createdEbook->Title) ?></a>!</p>
|
<p class="message success">Ebook placeholder created: <a href="<?= $createdEbook->Url ?>"><?= Formatter::EscapeHtml($createdEbook->Title) ?></a>!</p>
|
||||||
<? } ?>
|
<? } ?>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue