Browse Source

Lists can have a cover image

imwald
Nuša Pukšič 1 month ago
parent
commit
3f128eb6a2
  1. 1
      src/Controller/ReadingListWizardController.php
  2. 1
      src/Dto/CategoryDraft.php
  3. 6
      src/Form/CategoryType.php
  4. 1
      src/Service/ReadingListManager.php
  5. 38
      templates/reading_list/reading_setup.html.twig

1
src/Controller/ReadingListWizardController.php

@ -141,6 +141,7 @@ class ReadingListWizardController extends AbstractController
$tags[] = ['type', 'reading-list']; $tags[] = ['type', 'reading-list'];
if ($draft->title) { $tags[] = ['title', $draft->title]; } if ($draft->title) { $tags[] = ['title', $draft->title]; }
if ($draft->summary) { $tags[] = ['summary', $draft->summary]; } if ($draft->summary) { $tags[] = ['summary', $draft->summary]; }
if ($draft->image) { $tags[] = ['image', $draft->image]; }
foreach ($draft->tags as $t) { $tags[] = ['t', $t]; } foreach ($draft->tags as $t) { $tags[] = ['t', $t]; }
foreach ($draft->articles as $a) { foreach ($draft->articles as $a) {
if (is_string($a) && $a !== '') { $tags[] = ['a', $a]; } if (is_string($a) && $a !== '') { $tags[] = ['a', $a]; }

1
src/Dto/CategoryDraft.php

@ -8,6 +8,7 @@ class CategoryDraft
{ {
public string $title = ''; public string $title = '';
public string $summary = ''; public string $summary = '';
public string $image = '';
/** @var string[] */ /** @var string[] */
public array $tags = []; public array $tags = [];
/** @var string[] article coordinates like kind:pubkey:slug */ /** @var string[] article coordinates like kind:pubkey:slug */

6
src/Form/CategoryType.php

@ -7,6 +7,7 @@ namespace App\Form;
use App\Dto\CategoryDraft; use App\Dto\CategoryDraft;
use App\Form\DataTransformer\CommaSeparatedToArrayTransformer; use App\Form\DataTransformer\CommaSeparatedToArrayTransformer;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
@ -29,6 +30,11 @@ class CategoryType extends AbstractType
'required' => false, 'required' => false,
'empty_data' => '', 'empty_data' => '',
]) ])
->add('image', TextType::class, [
'label' => 'Cover image URL',
'required' => false,
'empty_data' => '',
])
->add('tags', TextType::class, [ ->add('tags', TextType::class, [
'label' => 'Tags (comma separated)', 'label' => 'Tags (comma separated)',
'required' => false, 'required' => false,

1
src/Service/ReadingListManager.php

@ -190,6 +190,7 @@ class ReadingListManager
match ($tagName) { match ($tagName) {
'title' => $draft->title = (string)$tagValue, 'title' => $draft->title = (string)$tagValue,
'summary' => $draft->summary = (string)$tagValue, 'summary' => $draft->summary = (string)$tagValue,
'image' => $draft->image = (string)$tagValue,
't' => $draft->tags[] = (string)$tagValue, 't' => $draft->tags[] = (string)$tagValue,
'a' => $draft->articles[] = (string)$tagValue, 'a' => $draft->articles[] = (string)$tagValue,
default => null, default => null,

38
templates/reading_list/reading_setup.html.twig

@ -6,6 +6,44 @@
{{ form_start(form) }} {{ form_start(form) }}
{{ form_row(form.title, {label: 'Title'}) }} {{ form_row(form.title, {label: 'Title'}) }}
{{ form_row(form.summary) }} {{ form_row(form.summary) }}
{{ form_row(form.image) }}
<div class="actions" data-controller="publishing--image-upload">
<button type="button"
class="btn btn-secondary"
data-action="click->publishing--image-upload#openDialog">
Upload Image
</button>
<div data-publishing--image-upload-target="dialog" class="iu-dialog">
<div class="iu-backdrop" data-action="click->publishing--image-upload#closeDialog"></div>
<div class="iu-modal">
<div class="modal-header">
<h5>Upload Image</h5>
<button type="button" class="close" data-action="click->publishing--image-upload#closeDialog">&times;</button>
</div>
<div class="modal-body">
<div>
<label for="upload-provider">Upload to</label>
<select id="upload-provider" data-publishing--image-upload-target="provider">
<option value="sovbit">files.sovbit.host</option>
<option value="nostrbuild">nostr.build</option>
<option value="nostrcheck">nostrcheck.me</option>
</select>
</div>
<div data-publishing--image-upload-target="dropArea" class="upload-area">
<span>Drag &amp; drop or click to select an image</span>
<input type="file" accept="image/*" data-publishing--image-upload-target="fileInput">
</div>
<div data-publishing--image-upload-target="progress" class="upload-progress"></div>
<div data-publishing--image-upload-target="error" class="upload-error"></div>
</div>
</div>
</div>
</div>
{{ form_row(form.tags) }} {{ form_row(form.tags) }}
<div class="mt-3 d-flex flex-row gap-2 actions"> <div class="mt-3 d-flex flex-row gap-2 actions">

Loading…
Cancel
Save