From 31f1fe17c3913c7ba331e5ad3a04931221154381 Mon Sep 17 00:00:00 2001 From: tstiegler Date: Thu, 29 Mar 2018 22:58:21 -0400 Subject: [PATCH] Initial sitewide announcements feature --- assets/less/common.less | 8 +++ assets/less/components/alert.less | 20 ++++++ assets/less/settings.less | 9 ++- config/app_routes/frontpageconfig.yaml | 4 ++ config/routes.yaml | 3 + src/Controller/FrontController.php | 28 +++++--- .../FrontPageConfigurationController.php | 56 +++++++++++++++ src/Entity/ForumConfiguration.php | 69 +++++++++++++++++++ src/Form/ForumConfigurationType.php | 34 +++++++++ src/Form/Model/ForumConfigurationData.php | 37 ++++++++++ src/Migrations/Version20180330024015.php | 43 ++++++++++++ .../ForumConfigurationRepository.php | 28 ++++++++ templates/_includes/site_nav.html.twig | 1 + templates/front/base.html.twig | 4 +- .../frontpageconfig/frontpageconfig.html.twig | 12 ++++ translations/messages.en.yml | 5 ++ 16 files changed, 349 insertions(+), 12 deletions(-) create mode 100644 config/app_routes/frontpageconfig.yaml create mode 100644 src/Controller/FrontPageConfigurationController.php create mode 100644 src/Entity/ForumConfiguration.php create mode 100644 src/Form/ForumConfigurationType.php create mode 100644 src/Form/Model/ForumConfigurationData.php create mode 100644 src/Migrations/Version20180330024015.php create mode 100644 src/Repository/ForumConfigurationRepository.php create mode 100644 templates/frontpageconfig/frontpageconfig.html.twig diff --git a/assets/less/common.less b/assets/less/common.less index fb69ef9..b9de9d6 100644 --- a/assets/less/common.less +++ b/assets/less/common.less @@ -74,3 +74,11 @@ .forum-group-heading a { color: @page-color; } + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} diff --git a/assets/less/components/alert.less b/assets/less/components/alert.less index 1aa4e3e..66a3b3d 100644 --- a/assets/less/components/alert.less +++ b/assets/less/components/alert.less @@ -24,3 +24,23 @@ from { opacity: 0; } to { opacity: 1; } } + +.form-message { + + display: flex; + flex-direction: column; + margin: 1rem 1rem 1rem 0; + padding: 1rem 1rem 0; + + &--primary { + color: @alert-primary-text-color; + border: 1px solid @alert-primary-border-color; + background: @alert-primary-color; + } + + &--success { + color: @alert-success-text-color; + border: 1px solid @alert-success-border-color; + background: @alert-success-color; + } +} diff --git a/assets/less/settings.less b/assets/less/settings.less index 5c5f3a2..97a765d 100644 --- a/assets/less/settings.less +++ b/assets/less/settings.less @@ -51,7 +51,14 @@ // Notices @alert-notice-color: aliceblue; -@alert-success-color: palegreen; + +@alert-success-color: #c6f9d3; +@alert-success-border-color: #a1dfb1; +@alert-success-text-color: #002710; + +@alert-primary-color: #cfe5fb; +@alert-primary-border-color: #b5cce3; +@alert-primary-text-color: #172a3e; // Forms @form-error-color: red; diff --git a/config/app_routes/frontpageconfig.yaml b/config/app_routes/frontpageconfig.yaml new file mode 100644 index 0000000..31a4cde --- /dev/null +++ b/config/app_routes/frontpageconfig.yaml @@ -0,0 +1,4 @@ +frontpageconfig: + controller: App\Controller\FrontPageConfigurationController::frontPageConfig + path: /frontpageconfig + methods: [GET, POST] diff --git a/config/routes.yaml b/config/routes.yaml index c58787a..3797f17 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -16,6 +16,9 @@ _forum_category: _front: resource: app_routes/front.yaml +_frontpageconfig: + resource: app_routes/frontpageconfig.yaml + _message: resource: app_routes/message.yaml diff --git a/src/Controller/FrontController.php b/src/Controller/FrontController.php index f9f2d1c..573c13d 100644 --- a/src/Controller/FrontController.php +++ b/src/Controller/FrontController.php @@ -3,7 +3,9 @@ namespace App\Controller; use App\Entity\User; +use App\Entity\ForumConfiguration; use App\Repository\ForumRepository; +use App\Repository\ForumConfigurationRepository; use App\Repository\SubmissionRepository; use Symfony\Component\HttpFoundation\Response; @@ -25,9 +27,11 @@ * instead. */ final class FrontController extends AbstractController { - public function front(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page) { + public function front(ForumRepository $fr, SubmissionRepository $sr, ForumConfigurationRepository $fcr, string $sortBy, int $page) { $user = $this->getUser(); + $siteConfig = $fcr->findSitewide(); + if (!$user instanceof User) { //$listing = User::FRONT_FEATURED; $listing = User::FRONT_ALL; @@ -40,20 +44,20 @@ public function front(ForumRepository $fr, SubmissionRepository $sr, string $sor switch ($listing) { case User::FRONT_SUBSCRIBED: - return $this->subscribed($fr, $sr, $sortBy, $page); + return $this->subscribed($fr, $sr, $sortBy, $page, $siteConfig); case User::FRONT_FEATURED: - return $this->featured($fr, $sr, $sortBy, $page); + return $this->featured($fr, $sr, $sortBy, $page, $siteConfig); case User::FRONT_ALL: - //return $this->all($sr, $sortBy, $page); - return $this->all($fr, $sr, $sortBy, $page); + //return $this->all($sr, $sortBy, $page, $siteConfig); + return $this->all($fr, $sr, $sortBy, $page, $siteConfig); case User::FRONT_MODERATED: - return $this->moderated($fr, $sr, $sortBy, $page); + return $this->moderated($fr, $sr, $sortBy, $page, $siteConfig); default: throw new \InvalidArgumentException('bad front page selection'); } } - public function featured(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page) { + public function featured(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig) { $forums = $fr->findFeaturedForumNames(); $submissions = $sr->findFrontPageSubmissions($forums, $sortBy, $page); @@ -62,10 +66,11 @@ public function featured(ForumRepository $fr, SubmissionRepository $sr, string $ 'listing' => 'featured', 'submissions' => $submissions, 'sort_by' => $sortBy, + 'announcement' => $siteConfig->getAnnouncement(), ]); } - public function subscribed(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page) { + public function subscribed(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig) { $this->denyAccessUnlessGranted('ROLE_USER'); $forums = $fr->findSubscribedForumNames($this->getUser()); @@ -83,6 +88,7 @@ public function subscribed(ForumRepository $fr, SubmissionRepository $sr, string 'listing' => 'subscribed', 'sort_by' => $sortBy, 'submissions' => $submissions, + 'announcement' => $siteConfig->getAnnouncement(), ]); } @@ -93,7 +99,7 @@ public function subscribed(ForumRepository $fr, SubmissionRepository $sr, string * * @return Response */ - public function all(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page) { + public function all(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig) { # Added for v1. $forums = $fr->findAllForumNames(); $submissions = $sr->findAllSubmissions($sortBy, $page); @@ -103,10 +109,11 @@ public function all(ForumRepository $fr, SubmissionRepository $sr, string $sortB 'listing' => 'all', 'sort_by' => $sortBy, 'submissions' => $submissions, + 'announcement' => $siteConfig->getAnnouncement(), ]); } - public function moderated(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page) { + public function moderated(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig) { $this->denyAccessUnlessGranted('ROLE_USER'); $forums = $fr->findModeratedForumNames($this->getUser()); @@ -117,6 +124,7 @@ public function moderated(ForumRepository $fr, SubmissionRepository $sr, string 'listing' => 'moderated', 'sort_by' => $sortBy, 'submissions' => $submissions, + 'announcement' => $siteConfig->getAnnouncement(), ]); } diff --git a/src/Controller/FrontPageConfigurationController.php b/src/Controller/FrontPageConfigurationController.php new file mode 100644 index 0000000..0da63cc --- /dev/null +++ b/src/Controller/FrontPageConfigurationController.php @@ -0,0 +1,56 @@ +findSitewide()); + + $form = $this->createForm(ForumConfigurationType::class, $data); + $form->handleRequest($request); + + $message = ""; + + if ($form->isSubmitted() && $form->isValid()) { + $fc = $data->toForumConfiguration(); + + // For sitewide settings, we need to force this to null. + $fc->setForumId(null); + + if($fc->getId() == null || trim($fc->getId()) == "") + $em->persist($fc); + else + $em->merge($fc); + + $em->flush(); + + // After saving, pull the data back down again. + $data = new ForumConfigurationData($fcr->findSitewide()); + $form = $this->createForm(ForumConfigurationType::class, $data); + + $message = "front_page_configuration_form.message_saved"; + } + + return $this->render('frontpageconfig/frontpageconfig.html.twig', [ + 'form' => $form->createView(), + 'message' => $message, + ]); + } +} diff --git a/src/Entity/ForumConfiguration.php b/src/Entity/ForumConfiguration.php new file mode 100644 index 0000000..4a2309b --- /dev/null +++ b/src/Entity/ForumConfiguration.php @@ -0,0 +1,69 @@ +forumId = $forumId; + } + + public function getId() { + return $this->id; + } + + public function setId($id) { + $this->id = $id; + } + + public function getForumId() { + return $this->forumId; + } + + public function setForumId($forumId) { + $this->forumId = $forumId; + } + + public function getAnnouncement() { + return $this->announcement; + } + + public function setAnnouncement($announcement) { + $this->announcement = $announcement; + } +} diff --git a/src/Form/ForumConfigurationType.php b/src/Form/ForumConfigurationType.php new file mode 100644 index 0000000..e9c8b4e --- /dev/null +++ b/src/Form/ForumConfigurationType.php @@ -0,0 +1,34 @@ +add('announcement', MarkdownType::class, [ + 'label' => 'front_page_configuration_form.announcement', + 'required' => false + ]) + ->add('id', HiddenType::class, []) + ->add('forumId', HiddenType::class, []) + ->add('submit', SubmitType::class, [ + 'label' => 'front_page_configuration_form.save', + ]); + } + + public function configureOptions(OptionsResolver $resolver) { + $resolver->setDefaults([ + 'data_class' => ForumConfigurationData::class, + ]); + } +} diff --git a/src/Form/Model/ForumConfigurationData.php b/src/Form/Model/ForumConfigurationData.php new file mode 100644 index 0000000..32f3dee --- /dev/null +++ b/src/Form/Model/ForumConfigurationData.php @@ -0,0 +1,37 @@ +id = $fc->getId(); + $this->forumId = $fc->getForumId(); + $this->announcement = $fc->getAnnouncement(); + } + + public function toForumConfiguration(): ForumConfiguration { + $fc = new ForumConfiguration($this->forumId); + $fc->setId($this->id); + $fc->setAnnouncement($this->announcement); + + return $fc; + } +} diff --git a/src/Migrations/Version20180330024015.php b/src/Migrations/Version20180330024015.php new file mode 100644 index 0000000..0d08e56 --- /dev/null +++ b/src/Migrations/Version20180330024015.php @@ -0,0 +1,43 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.'); + + $this->addSql('CREATE SEQUENCE forum_configuration_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE forum_configuration (id BIGINT NOT NULL, forum_id BIGINT DEFAULT NULL, announcement TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('ALTER TABLE forum_subscriptions ALTER id TYPE UUID'); + $this->addSql('ALTER TABLE forum_subscriptions ALTER id DROP DEFAULT'); + $this->addSql('ALTER TABLE wiki_revisions ALTER id TYPE UUID'); + $this->addSql('ALTER TABLE wiki_revisions ALTER id DROP DEFAULT'); + $this->addSql('ALTER TABLE moderators ALTER id TYPE UUID'); + $this->addSql('ALTER TABLE moderators ALTER id DROP DEFAULT'); + } + + public function down(Schema $schema) + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.'); + + $this->addSql('CREATE SCHEMA public'); + $this->addSql('DROP SEQUENCE forum_configuration_id_seq CASCADE'); + $this->addSql('DROP TABLE forum_configuration'); + $this->addSql('ALTER TABLE moderators ALTER id TYPE UUID'); + $this->addSql('ALTER TABLE moderators ALTER id DROP DEFAULT'); + $this->addSql('ALTER TABLE forum_subscriptions ALTER id TYPE UUID'); + $this->addSql('ALTER TABLE forum_subscriptions ALTER id DROP DEFAULT'); + $this->addSql('ALTER TABLE wiki_revisions ALTER id TYPE UUID'); + $this->addSql('ALTER TABLE wiki_revisions ALTER id DROP DEFAULT'); + } +} diff --git a/src/Repository/ForumConfigurationRepository.php b/src/Repository/ForumConfigurationRepository.php new file mode 100644 index 0000000..2e5f61f --- /dev/null +++ b/src/Repository/ForumConfigurationRepository.php @@ -0,0 +1,28 @@ +createQueryBuilder('fc') + ->where('fc.forumId is NULL') + ->getQuery() + ->execute(); + + if(count($config) == 0) { + return new ForumConfiguration(null); + } + + return $config[0]; + } +} diff --git a/templates/_includes/site_nav.html.twig b/templates/_includes/site_nav.html.twig index 00fe9d6..0cb9af8 100644 --- a/templates/_includes/site_nav.html.twig +++ b/templates/_includes/site_nav.html.twig @@ -29,6 +29,7 @@
  • {{ icon('hammer') }} {{ 'label.bans'|trans }}
  • {{ icon('sitemap') }} {{ 'nav.forum_categories'|trans }}
  • {{ icon('user') }} {{ 'nav.users'|trans }}
  • +
  • {{ icon('settings') }} Front Page Configuration
  • {% endif %} diff --git a/templates/front/base.html.twig b/templates/front/base.html.twig index 1d677fc..2de01b3 100644 --- a/templates/front/base.html.twig +++ b/templates/front/base.html.twig @@ -18,6 +18,8 @@ {% endblock %} {% block body %} + {% if announcement != null %}
    {{ announcement|cached_markdown(markdown_context())|raw }}
    {% endif %} +