From f114843e4c6f17660389cb56f20e30275cad811c Mon Sep 17 00:00:00 2001 From: Ryan Prather Date: Fri, 4 Apr 2025 15:27:16 -0400 Subject: [PATCH] Other various changes --- public/index.php | 5 ++ src/Controller/AjaxController.php | 92 +++++++++++--------- src/Controller/DefaultController.php | 17 +++- src/Controller/ReferenceController.php | 17 ++-- src/Controller/SecurityController.php | 1 + src/Entity/User.php | 37 -------- src/Repository/ReferenceRepository.php | 29 ++++++ templates/base.html.twig | 2 +- templates/default/cheat-sheet.html.twig | 20 ++--- templates/default/home.html.twig | 26 +++--- templates/default/index.html.twig | 26 +++--- templates/default/profile.html.twig | 84 ++++++++++-------- templates/default/sidebar.html.twig | 18 ++-- templates/editors/reference-editor.html.twig | 4 +- templates/editors/series-editor.html.twig | 2 +- templates/editors/speaker-editor.html.twig | 2 +- templates/editors/template-editor.html.twig | 2 +- templates/emails/note-shared.html.twig | 19 ++-- templates/registration/register.html.twig | 2 +- templates/security/login.html.twig | 16 ++-- 20 files changed, 231 insertions(+), 190 deletions(-) diff --git a/public/index.php b/public/index.php index 9982c21..f3e92f9 100644 --- a/public/index.php +++ b/public/index.php @@ -2,6 +2,11 @@ use App\Kernel; +if (preg_match("/js\/data\.json$/", $_SERVER['REQUEST_URI'])) { + print file_get_contents('js/data.json'); + exit; +} + require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; return function (array $context) { diff --git a/src/Controller/AjaxController.php b/src/Controller/AjaxController.php index c506516..5978b10 100644 --- a/src/Controller/AjaxController.php +++ b/src/Controller/AjaxController.php @@ -12,9 +12,11 @@ use App\Entity\Bible; use App\Entity\Speaker; use App\Entity\Series; use App\Entity\Note; -use App\Entity\NoteShares; +use App\Entity\SharedNote; use App\Utils\Utils; +use Doctrine\DBAL\Exception\ReadOnlyException; use Doctrine\ORM\EntityManagerInterface; +use Exception; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -54,7 +56,7 @@ class AjaxController extends AbstractController $user = $this->getUser(); - if($template_id) { + if ($template_id) { $template = $emi->getRepository(Template::class)->find($template_id); $template->setName($template_name); $template->setContent($template_value); @@ -166,8 +168,12 @@ class AjaxController extends AbstractController $ref = new Reference(); $ref->setType($data->type); - if(is_numeric($data->book)) { + if (is_numeric($data->book)) { $ref->setNdx($data->book); + } elseif ($data->type == 'ld' || $data->type == 'hc') { + $type = substr($data->book, 0, 2); + $ref->setType($type); + $ref->setLabel($data->book); } ReferenceController::$emi = $emi; @@ -191,13 +197,27 @@ class AjaxController extends AbstractController 'note' => ReferenceController::retrieveNote($user) }; - if (!is_a($ret, Reference::class)) { - $ret = new Reference(); + $ref = new Reference(); + + if (is_a($ret, Reference::class)) { + $ref = $ret; + } + + if ($data->type == 'hc' && is_array($ret)) { + $ref->setLabel( + substr($ret[0]->getLabel(), 0, strpos($ret[0]->getLabel(), '-')) + ); + + $content = null; + foreach ($ret as $row) { + $content .= $row->getContent().PHP_EOL.PHP_EOL; + } + $ref->setContent($content); } $res->setContent(json_encode([ - 'text' => $ret->getContent(), - 'title' => "{$ret->getLabel()}", + 'text' => $ref->getContent(), + 'title' => $ref->getLabel(), ])); return $res; @@ -223,28 +243,12 @@ class AjaxController extends AbstractController { $res = new Response(); $data = json_decode($req->getContent()); - $path = match($data->type) { - 'creed' => 'Creeds', - 'bc' => 'Belgic', - 'hc' => 'Heidelberg', - 'cd' => 'Dort', - 'wcf' => 'Westminster/Confessions', - 'wsc' => 'Westminster/Shorter Catechism', - 'wlc' => 'Westminster/Larger Catechism', - 'lbc' => 'London', - '39a' => '39 Articles', - '1hc' => '1 Helvetic Catechism', - '2hc' => '2 Helvetic Catechism', - 'sd' => 'Savor Declaration', - 'agc' => 'Augsburg Confession' - }; + $ref = $emi->getRepository(Reference::class)->find($data->refId); - $ret = file_put_contents(dirname(dirname(__DIR__))."/references/{$path}/{$data->file}", $data->text); - - if($ret !== false) { - $res->setContent(json_encode(['msg' => 'File Saved'])); - } else { - $res->setContent(json_encode(['msg' => 'Failed to save file'])); + if ($ref) { + $ref->setContent($data->text); + $emi->persist($ref); + $res = $this->json(['msg' => 'Reference updated.']); } return $res; @@ -371,10 +375,10 @@ class AjaxController extends AbstractController } if (is_array($shared) && count($shared) > 0) { - $ns = new NoteShares(); + $ns = new SharedNote(); $ns->setNote($note) - ->setOwner($user) - ->setShare($shared[0]); + ->setOwnerId($user->getId()) + ->setSharedUserId($shared[0]->getId()); $emi->persist($ns); $emi->flush(); @@ -434,7 +438,7 @@ class AjaxController extends AbstractController if (is_array($ret)) { $text = null; - foreach($ret as $b) { + foreach ($ret as $b) { $text .= "{$b->getVerse()}. {$b->getContent()}".PHP_EOL; } $bible->setContent($text); @@ -477,16 +481,20 @@ class AjaxController extends AbstractController $data->trackSaveSize = false; } - $meta = $user->getMetaData(); - $meta['saveInterval'] = $data->saveInterval; - $meta['saveReferences'] = $data->saveReferences; - $meta['noteTextSize'] = $data->noteTextSize; - $meta['trackSaveSize'] = $data->trackSaveSize; - $meta['saveTimeout'] = $data->saveTimeout; - $meta['save-failure-count'] = $data->saveFailureCount; - $user->setMetaData($meta); - $emi->persist($user); - $emi->flush(); + try { + $meta = $user->getMetaData(); + $meta['saveInterval'] = $data->saveInterval; + $meta['saveReferences'] = $data->saveReferences; + $meta['noteTextSize'] = $data->noteTextSize; + $meta['trackSaveSize'] = $data->trackSaveSize; + $meta['saveTimeout'] = $data->saveTimeout; + $meta['save-failure-count'] = $data->saveFailureCount; + $user->setMetaData($meta); + $emi->persist($user); + $emi->flush(); + } catch (ReadOnlyException $e) { + return new Response('Read Only '.$_ENV['DATABASE_URL'], 403); + } $res = new Response(); $res->setContent(json_encode([ diff --git a/src/Controller/DefaultController.php b/src/Controller/DefaultController.php index 920a9a6..4244133 100644 --- a/src/Controller/DefaultController.php +++ b/src/Controller/DefaultController.php @@ -4,6 +4,7 @@ namespace App\Controller; use App\Entity\Note; use App\Entity\User; +use App\Entity\SharedNote; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; @@ -17,9 +18,9 @@ class DefaultController extends AbstractController public function index(): Response { if ($this->isGranted('IS_AUTHENTICATED_FULLY')) { - return $this->redirect('/index.php/home'); + return $this->redirect('/home'); } - return $this->render('default/index.html.twig'); + return $this->render('default/index.html.twig', ['onLoad' => null]); } #[Route('/home', name: 'app_home')] @@ -31,6 +32,7 @@ class DefaultController extends AbstractController $meta = $user->getMetaData(); return $this->render('default/home.html.twig', [ + 'onLoad' => 'setHeight()', 'last4Notes' => $last4Notes, 'reverseNoteSort' => $openNotes, 'isAdmin' => $this->isGranted('ROLE_ADMIN'), @@ -45,7 +47,7 @@ class DefaultController extends AbstractController } #[Route('/profile', name: 'app_profile')] - public function profile(): Response + public function profile(EntityManagerInterface $emi): Response { /** @var User $user */ $user = $this->getUser(); @@ -55,6 +57,7 @@ class DefaultController extends AbstractController $meta = $user->getMetaData(); if (!$meta) { $meta = [ + 'onLoad' => null, 'saveInterval' => 15, 'saveReferences' => 'checked', 'noteTextSize' => 12, @@ -67,8 +70,16 @@ class DefaultController extends AbstractController $meta['trackSaveSize'] = $meta['trackSaveSize'] ? 'checked' : null; } + $sharedWithMe = $emi->getRepository(SharedNote::class)->getNotesSharedWithMe($user); + $shared = $emi->getRepository(SharedNote::class)->getNotesSharedByMe($user); + dump($shared); + return $this->render('default/profile.html.twig', [ + 'onLoad' => 'rollUp("user");rollUp("settings")', 'meta' => $meta, + 'sharedWithMe' => $sharedWithMe, + 'shared' => $shared, + 'user' => $this->getUser(), ]); } diff --git a/src/Controller/ReferenceController.php b/src/Controller/ReferenceController.php index 6585c45..a9d5bea 100644 --- a/src/Controller/ReferenceController.php +++ b/src/Controller/ReferenceController.php @@ -41,7 +41,7 @@ class ReferenceController extends AbstractController $bible = self::$emi->getRepository(Bible::class)->findRange($bible, [$passage_start, $passage_end]); $passage = "{$passage_start}-{$passage_end}"; - $label = "{$bible[0]->getLabel()}\n{$bible[0]->getChapter()}:{$passage}"; + $label = "{$bible[0]->getLabel()}\n{$bible[0]->getChapter()}\n{$passage}"; } elseif (is_int($passage)) { $bible = self::$emi->getRepository(Bible::class)->findBy(['book' => $book, 'chapter' => $chapter, 'verse' => $passage]); $label = "{$bible[0]->getLabel()}\n{$bible[0]->getChapter()}:{$passage}"; @@ -52,9 +52,9 @@ class ReferenceController extends AbstractController $passage = null; } - if(is_array($bible)) { + if (is_array($bible)) { $text = []; - foreach($bible as $b) { + foreach ($bible as $b) { $text[] = "{$b->getVerse()}. {$b->getContent()}"; } } else { @@ -93,15 +93,16 @@ class ReferenceController extends AbstractController * * @param Reference $ref * - * @return Reference + * @return Reference|array */ - public static function retrieveHC($ref): Reference + public static function retrieveHC(Reference $ref): Reference|array { - $r = self::$emi->getRepository(Reference::class)->findBy(['type' => 'hc', 'ndx' => $ref->getNdx()]); + $r = self::$emi->getRepository(Reference::class)->findHeidelberg($ref->getLabel()); + if (!$r) { return new Reference(); } - return $r[0]; + return $r; } /** @@ -114,7 +115,7 @@ class ReferenceController extends AbstractController public static function retrieveBC($ref): Reference { $r = self::$emi->getRepository(Reference::class)->findBy(['type' => 'belgic', 'ndx' => $ref->getNdx()]); - if(!$r) { + if (!$r) { return new Reference(); } return $r[0]; diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php index 76bf5c4..c3ce368 100644 --- a/src/Controller/SecurityController.php +++ b/src/Controller/SecurityController.php @@ -19,6 +19,7 @@ class SecurityController extends AbstractController $lastUsername = $authenticationUtils->getLastUsername(); return $this->render('security/login.html.twig', [ + 'onLoad' => null, 'last_username' => $lastUsername, 'error' => $error, ]); diff --git a/src/Entity/User.php b/src/Entity/User.php index 3a60ac7..ec74ed1 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -68,12 +68,6 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, JsonSer #[ORM\OneToMany(targetEntity: Note::class, mappedBy: 'user')] private Collection $notes; - /** - * @var Collection - */ - #[ORM\OneToMany(targetEntity: NoteShares::class, mappedBy: 'ownerId', orphanRemoval: true)] - private Collection $noteShares; - #[ORM\Column(nullable: true)] private ?array $metaData = null; @@ -83,7 +77,6 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, JsonSer $this->speakers = new ArrayCollection(); $this->templates = new ArrayCollection(); $this->notes = new ArrayCollection(); - $this->noteShares = new ArrayCollection(); } public function getId(): ?Uuid @@ -319,36 +312,6 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, JsonSer ]; } - /** - * @return Collection - */ - public function getNoteShares(): Collection - { - return $this->noteShares; - } - - public function addNoteShare(NoteShares $noteShare): static - { - if (!$this->noteShares->contains($noteShare)) { - $this->noteShares->add($noteShare); - $noteShare->setOwner($this); - } - - return $this; - } - - public function removeNoteShare(NoteShares $noteShare): static - { - if ($this->noteShares->removeElement($noteShare)) { - // set the owning side to null (unless already changed) - if ($noteShare->getOwner() === $this) { - $noteShare->setOwner(null); - } - } - - return $this; - } - public function getMetaData(): ?array { return $this->metaData; diff --git a/src/Repository/ReferenceRepository.php b/src/Repository/ReferenceRepository.php index 178e950..2abb849 100644 --- a/src/Repository/ReferenceRepository.php +++ b/src/Repository/ReferenceRepository.php @@ -25,6 +25,35 @@ class ReferenceRepository extends ServiceEntityRepository ->getResult(); } + public function findHeidelberg($ref): array|Reference + { + if (substr($ref, 0, 2) == 'ld') { + $num = substr($ref, 2); + $qb = $this->createQueryBuilder('r'); + $r = $qb->where($qb->expr()->like('r.label', ':ld')) + ->setParameter('ld', "ld{$num}-%") + ->getQuery() + ->getResult() + ; + } elseif (substr($ref, 0, 2) == 'hc') { + $num = substr($ref, 2); + $qb = $this->createQueryBuilder('r'); + $r = $qb->where($qb->expr()->like('r.label', ':hc')) + ->setParameter('hc', "%-hc{$num}") + ->getQuery() + ->getResult() + ; + + if(count($r) > 0) { + $r = $r[0]; + + $r->setLabel(implode("\n", explode("-", $r->getLabel()))); + } + } + + return $r; + } + // /** // * @return Reference[] Returns an array of Reference objects // */ diff --git a/templates/base.html.twig b/templates/base.html.twig index d5fd34e..00d22bb 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -12,7 +12,7 @@ {% block title %}Welcome!{% endblock %} {% block stylesheets %}{% endblock %} - + {% block body %}{% endblock %} {% block javascripts %}{% endblock %} diff --git a/templates/default/cheat-sheet.html.twig b/templates/default/cheat-sheet.html.twig index 2e360dc..f2219f1 100644 --- a/templates/default/cheat-sheet.html.twig +++ b/templates/default/cheat-sheet.html.twig @@ -3,20 +3,20 @@ {% block title %}Markdown Cheat Sheet{% endblock %} {% block stylesheets %} - - - - + + + + {% endblock %} {% block javascripts %} - - - - - - + + + + + + diff --git a/templates/default/home.html.twig b/templates/default/home.html.twig index ed67bf5..84f86ec 100644 --- a/templates/default/home.html.twig +++ b/templates/default/home.html.twig @@ -3,10 +3,10 @@ {% block title %}Sermon Notes{% endblock %} {% block stylesheets %} - - - - + + + +

{{ owner.name }} has shared a note with you, what follows are their formatted notes. {% if isRegistered %} - You can see shared notes here. + You can see shared notes here. {% else %} - You can register for an account here, or just review the notes below + You can register for an account here, or just review the notes below {% endif %}

{{ note.title }}

- Passage: {{ note.passage }}
- Date: {{ note.date | date("F j Y") }}
- Speaker: {{ note.speaker.name }}
- Series: {{ note.series.name }}
+ Passage: {{ note.passage }}
+ Date: {{ note.date | date("F j Y") }}
+ Speaker: {{ note.speaker.name }}
+ Series: {{ note.series.name }}
{{ formattedText | raw }} diff --git a/templates/registration/register.html.twig b/templates/registration/register.html.twig index 521a291..8eaf021 100644 --- a/templates/registration/register.html.twig +++ b/templates/registration/register.html.twig @@ -36,7 +36,7 @@ {{ form_end(registrationForm) }}