Browse Source

Magazine admin, edit

imwald
Nuša Pukšič 4 months ago
parent
commit
2b945ae30b
  1. 2
      assets/styles/utilities.css
  2. 71
      src/Controller/MagazineWizardController.php
  3. 3
      templates/admin/magazines.html.twig

2
assets/styles/utilities.css

@ -35,7 +35,7 @@ @@ -35,7 +35,7 @@
.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}
/* Buttons - sizes only (base buttons defined elsewhere) */
.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.25;border-radius:.2rem}
.btn.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.25;border-radius:.2rem}
/* Spinner (bootstrap-like) */
.spinner-border{display:inline-block;width:1.5rem;height:1.5rem;border:.2em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}

71
src/Controller/MagazineWizardController.php

@ -20,6 +20,7 @@ use Symfony\Component\Security\Csrf\CsrfToken; @@ -20,6 +20,7 @@ use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use swentel\nostr\Key\Key;
use Redis as RedisClient;
use Symfony\Contracts\Cache\CacheInterface;
class MagazineWizardController extends AbstractController
{
@ -240,6 +241,76 @@ class MagazineWizardController extends AbstractController @@ -240,6 +241,76 @@ class MagazineWizardController extends AbstractController
return $this->redirectToRoute('home');
}
#[Route('/magazine/wizard/edit/{slug}', name: 'mag_wizard_edit')]
public function editStart(string $slug, CacheInterface $redisCache, Request $request): Response
{
// Load magazine event
$magEvent = $redisCache->get('magazine-' . $slug, function () {
return null;
});
if (!$magEvent || !method_exists($magEvent, 'getTags')) {
throw $this->createNotFoundException('Magazine not found');
}
$tags = (array)$magEvent->getTags();
$draft = new \App\Dto\MagazineDraft();
$draft->slug = $slug;
$draft->title = $this->getTagValue($tags, 'title') ?? '';
$draft->summary = $this->getTagValue($tags, 'summary') ?? '';
$draft->imageUrl = $this->getTagValue($tags, 'image') ?? '';
$draft->language = $this->getTagValue($tags, 'l');
$draft->tags = $this->getAllTagValues($tags, 't');
$draft->categories = [];
// For each category coordinate (30040:pubkey:slug), load its index and map
foreach ($tags as $t) {
if (is_array($t) && ($t[0] ?? null) === 'a' && isset($t[1]) && str_starts_with((string)$t[1], '30040:')) {
$parts = explode(':', (string)$t[1], 3);
if (count($parts) !== 3) { continue; }
$catSlug = $parts[2];
$catEvent = $redisCache->get('magazine-' . $catSlug, function () { return null; });
if (!$catEvent || !method_exists($catEvent, 'getTags')) { continue; }
$ctags = (array)$catEvent->getTags();
$cat = new \App\Dto\CategoryDraft();
$cat->slug = $catSlug;
$cat->title = $this->getTagValue($ctags, 'title') ?? '';
$cat->summary = $this->getTagValue($ctags, 'summary') ?? '';
$cat->tags = $this->getAllTagValues($ctags, 't');
$cat->articles = [];
foreach ($ctags as $ct) {
if (is_array($ct) && ($ct[0] ?? null) === 'a' && isset($ct[1])) {
$cat->articles[] = (string)$ct[1];
}
}
$draft->categories[] = $cat;
}
}
$this->saveDraft($request, $draft);
return $this->redirectToRoute('mag_wizard_setup');
}
private function getTagValue(array $tags, string $name): ?string
{
foreach ($tags as $t) {
if (is_array($t) && ($t[0] ?? null) === $name && isset($t[1])) {
return (string)$t[1];
}
}
return null;
}
private function getAllTagValues(array $tags, string $name): array
{
$out = [];
foreach ($tags as $t) {
if (is_array($t) && ($t[0] ?? null) === $name && isset($t[1])) {
$out[] = (string)$t[1];
}
}
return $out;
}
private function getDraft(Request $request): ?MagazineDraft
{
$data = $request->getSession()->get(self::SESSION_KEY);

3
templates/admin/magazines.html.twig

@ -13,7 +13,8 @@ @@ -13,7 +13,8 @@
<summary>
<strong>📁 {{ mag.name }}</strong>
<small class="text-muted">(slug: {{ mag.slug }})</small>
<a class="btn btn-sm ms-2" href="{{ path('admin_magazine_edit', {slug: mag.slug}) }}">Edit</a>
<!-- Top-level Edit now points to wizard category management -->
<a class="btn btn-sm ms-2" href="{{ path('mag_wizard_edit', {slug: mag.slug}) }}">Edit</a>
</summary>
{% if mag.categories is not empty %}
<ul class="list-unstyled ms-3 mt-2">

Loading…
Cancel
Save