diff --git a/lib/Ebook.php b/lib/Ebook.php
index e03d8ee0..e779e335 100644
--- a/lib/Ebook.php
+++ b/lib/Ebook.php
@@ -2433,7 +2433,7 @@ final class Ebook{
where EbookPlaceholders.IsWanted = true and
EbookPlaceholders.IsInProgress = false and
EbookPlaceholders.Difficulty = ?
- order by Ebooks.Updated desc
+ order by Ebooks.Created asc
', [$difficulty], Ebook::class);
}
diff --git a/templates/CollectionDescriptor.php b/templates/CollectionDescriptor.php
index 5ba87132..3c0bc537 100644
--- a/templates/CollectionDescriptor.php
+++ b/templates/CollectionDescriptor.php
@@ -7,4 +7,7 @@ $sequenceNumber = $collectionMembership?->SequenceNumber;
?>
if($sequenceNumber !== null){ ?>№ = number_format($sequenceNumber) ?> in the }else{ ?>Part of the } ?> = Formatter::EscapeHtml(preg_replace('/^The /ius', '', (string)$collection->Name)) ?>
if($collection->Type !== null){ ?>
- if(substr_compare(mb_strtolower($collection->Name), mb_strtolower($collection->Type->value), -strlen(mb_strtolower($collection->Type->value))) !== 0){ ?>= $collection->Type->value ?> } ?> }else{ ?>collection } ?>
+ if(substr_compare(mb_strtolower($collection->Name), mb_strtolower($collection->Type->value), -strlen(mb_strtolower($collection->Type->value))) !== 0){ ?>= $collection->Type->value ?> } ?>
+ }else{ ?>
+ collection
+ } ?>
diff --git a/templates/WantedEbook.php b/templates/WantedEbook.php
new file mode 100644
index 00000000..da06a4f2
--- /dev/null
+++ b/templates/WantedEbook.php
@@ -0,0 +1,34 @@
+
+/**
+ * @var Ebook $ebook
+ */
+
+if(!isset($ebook->EbookPlaceholder)){
+ return;
+}
+
+$showPlaceholderMetadata = $showPlaceholderMetadata ?? false;
+?>
+
+
+ if(isset($ebook->EbookPlaceholder->TranscriptionUrl)){ ?> } ?>= Formatter::EscapeHtml($ebook->Title) ?> if(isset($ebook->EbookPlaceholder->TranscriptionUrl)){ ?> } ?>
+
+
+ by = Formatter::EscapeHtml($ebook->AuthorsString) ?>. = $ebook->ContributorsHtml ?>
+
+ foreach($ebook->CollectionMemberships as $index => $collectionMembership){ ?>
+ if($index == 0){ ?>= Template::CollectionDescriptor(['collectionMembership' => $collectionMembership]) ?> }else{ ?>= lcfirst(Template::CollectionDescriptor(['collectionMembership' => $collectionMembership])) ?> } ?> if($index < sizeof($ebook->CollectionMemberships) - 1){ ?>, } ?> if($index == sizeof($ebook->CollectionMemberships) - 1){ ?>. } ?>
+ } ?>
+
+ if(isset($ebook->EbookPlaceholder->Notes)){ ?>
+ = Formatter::MarkdownToHtml($ebook->EbookPlaceholder->Notes, true) ?>
+ } ?>
+ if($showPlaceholderMetadata){ ?>
+ — View placeholder.
+ } ?>
+
+ if($ebook->EbookPlaceholder->IsPatron){ ?>
+ Patron selection!
+ } ?>
+
+
diff --git a/www/contribute/wanted-ebooks.php b/www/contribute/wanted-ebooks.php
index a8b2854f..5a28a2cc 100644
--- a/www/contribute/wanted-ebooks.php
+++ b/www/contribute/wanted-ebooks.php
@@ -1,38 +1,7 @@
-use function Safe\ob_end_clean;
-use function Safe\ob_start;
-
-function WantedEbooks(Enums\EbookPlaceholderDifficulty $difficulty, ?bool $showPlaceholderMetadata): string{
- $ebooks = Ebook::GetByIsWantedAndDifficulty($difficulty);
- $showPlaceholderMetadata = $showPlaceholderMetadata ?? false;
-
- ob_start();
- ?>
-
-
-
- $contents = ob_get_contents() ?: '';
- ob_end_clean();
-
- return $contents;
-}
-
+$beginnerEbooks = Ebook::GetByIsWantedAndDifficulty(Enums\EbookPlaceholderDifficulty::Beginner);
+$intermediateEbooks = Ebook::GetByIsWantedAndDifficulty(Enums\EbookPlaceholderDifficulty::Intermediate);
+$advancedEbooks = Ebook::GetByIsWantedAndDifficulty(Enums\EbookPlaceholderDifficulty::Advanced);
?>
= Template::Header(['title' => 'Wanted Ebooks', 'highlight' => 'contribute', 'description' => 'A list of ebooks the Standard Ebooks editor would like to see produced, including suggestions for first-time producers.']) ?>
@@ -47,14 +16,29 @@ function WantedEbooks(Enums\EbookPlaceholderDifficulty $difficulty, ?bool $showP
For your first production
If nothing on the list below interests you, you can pitch us something else you’d like to work on.
First productions should be on the shorter side (less than 100,000 words maximum) and without too many complex formatting issues like illustrations, significant endnotes, letters, poems, etc. Most short plain fiction novels fall in this category.
- = WantedEbooks(Enums\EbookPlaceholderDifficulty::Beginner, Session::$User?->Benefits->CanEditEbookPlaceholders) ?>
+
+ foreach($beginnerEbooks as $ebook){ ?>
+ = Template::WantedEbook(['ebook' => $ebook, 'showPlaceholderMetadata' => Session::$User?->Benefits->CanEditEbookPlaceholders]) ?>
+ } ?>
+
+
Moderate-difficulty productions
- = WantedEbooks(Enums\EbookPlaceholderDifficulty::Intermediate, Session::$User?->Benefits->CanEditEbookPlaceholders) ?>
+
+ foreach($intermediateEbooks as $ebook){ ?>
+ = Template::WantedEbook(['ebook' => $ebook, 'showPlaceholderMetadata' => Session::$User?->Benefits->CanEditEbookPlaceholders]) ?>
+ } ?>
+
+
Advanced productions
- = WantedEbooks(Enums\EbookPlaceholderDifficulty::Advanced, Session::$User?->Benefits->CanEditEbookPlaceholders) ?>
+
+ foreach($advancedEbooks as $ebook){ ?>
+ = Template::WantedEbook(['ebook' => $ebook, 'showPlaceholderMetadata' => Session::$User?->Benefits->CanEditEbookPlaceholders]) ?>
+ } ?>
+
+
Jules Verne
Verne has a complex publication and translation history. Please review these notes before starting any Verne books.
-
+
-
As of 2024, 20,000 Leagues Under the Seas does not have an acceptable public domain translation, therefore we will not host that ebook.
@@ -62,6 +46,7 @@ function WantedEbooks(Enums\EbookPlaceholderDifficulty $difficulty, ?bool $showP
Master of the World has two PD translations, one from 1911 and one from 1914. The 1911 version is bad, and the 1914 by Cranstoun Metcalfe version is preferred; but, as of 2023, there are no transcriptions or page scans for the 1914 version.
+
Uncategorized lists
-
@@ -97,9 +82,6 @@ function WantedEbooks(Enums\EbookPlaceholderDifficulty $difficulty, ?bool $showP
-
Entries in the Harvard Classics Shelf of Fiction
- -
-
The Wilderness Hunter by Theodore Roosevelt (a 2 volume work in which this PG transcription is volume 2; editions vary widely; transcription likely required for volume 1 or the latest possible combined edition)
-
diff --git a/www/css/core.css b/www/css/core.css
index 37ce25a2..93b3a352 100644
--- a/www/css/core.css
+++ b/www/css/core.css
@@ -3359,6 +3359,35 @@ nav.breadcrumbs + h1{
font-weight: normal;
}
+.patron-selection{
+ background-color: #e8c50b;
+ border: 1px solid #c8b341;
+ border-radius: 5px;
+ box-shadow: 1px 1px 0px rgba(255, 255, 255, 0.5) inset;
+}
+
+a.patron-selection:any-link{
+ color: #fff;
+ font-style: italic;
+ font-weight: bold;
+ padding: 0 .5rem;
+ text-decoration: none;
+ text-shadow: 1px 1px 0 rgba(0, 0, 0, .5);
+ transition: background 200ms ease;
+ margin-left: .5rem;
+ white-space: nowrap;
+ display: inline-block;
+}
+
+a.patron-selection:any-link:hover{
+ background: #eed967;
+ transition: none;
+}
+
+.wanted-list{
+ text-align: left;
+}
+
@media (hover: none) and (pointer: coarse){ /* target ipads and smartphones without a mouse */
/* For iPad, unset the height so it matches the other elements */
select[multiple]{