Skip to content

Commit d38051d

Browse files
tstieglerpsineur
authored andcommitted
Change site-wide announcement into one with thread submission. cc #84
- Change site-wide announcement into announcement with thread submission. - Code cleanup - Fix username fetch
1 parent d29c834 commit d38051d

File tree

12 files changed

+219
-41
lines changed

12 files changed

+219
-41
lines changed

assets/less/components/alert.less

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,10 @@
4343
border: 1px solid @alert-success-border-color;
4444
background: @alert-success-color;
4545
}
46+
47+
&--error {
48+
color: @alert-error-text-color;
49+
border: 1px solid @alert-error-border-color;
50+
background: @alert-error-color;
51+
}
4652
}

assets/less/settings.less

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@
5959
@alert-primary-border-color: #b5cce3;
6060
@alert-primary-text-color: #172a3e;
6161

62+
@alert-error-color: #f6d0d0;
63+
@alert-error-border-color: #d99797;
64+
@alert-error-text-color: #3a1d1d;
65+
6266
// Forms
6367
@form-error-color: red;
6468
@form-text-input-background-color: #fff;

config/app_routes/frontpageconfig.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,8 @@ frontpageconfig:
22
controller: App\Controller\FrontPageConfigurationController::frontPageConfig
33
path: /frontpageconfig
44
methods: [GET, POST]
5+
6+
frontpageconfig_removeannouncement:
7+
controller: App\Controller\FrontPageConfigurationController::removeAnnouncement
8+
path: /frontpageconfig/remove_announcement
9+
methods: [POST]

src/Controller/FrontController.php

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
use App\Entity\User;
66
use App\Entity\ForumConfiguration;
7+
use App\Entity\Submission;
78
use App\Repository\ForumRepository;
89
use App\Repository\ForumConfigurationRepository;
910
use App\Repository\SubmissionRepository;
1011
use App\Utils\PermissionsChecker;
1112
use Symfony\Component\HttpFoundation\Response;
13+
use Doctrine\ORM\EntityManager;
1214

1315
/**
1416
* Actions that list submissions across many forums.
@@ -28,10 +30,14 @@
2830
* instead.
2931
*/
3032
final class FrontController extends AbstractController {
31-
public function front(ForumRepository $fr, SubmissionRepository $sr, ForumConfigurationRepository $fcr, string $sortBy, int $page) {
33+
public function front(ForumRepository $fr, SubmissionRepository $sr, ForumConfigurationRepository $fcr, string $sortBy, int $page, EntityManager $em) {
3234
$user = $this->getUser();
3335

3436
$siteConfig = $fcr->findSitewide();
37+
$announcementSubmission = null;
38+
if($siteConfig->getAnnouncementSubmissionId() != null) {
39+
$announcementSubmission = $em->find("App\\Entity\\Submission", $siteConfig->getAnnouncementSubmissionId());
40+
}
3541

3642
if (!$user instanceof User) {
3743
//$listing = User::FRONT_FEATURED;
@@ -45,20 +51,20 @@ public function front(ForumRepository $fr, SubmissionRepository $sr, ForumConfig
4551

4652
switch ($listing) {
4753
case User::FRONT_SUBSCRIBED:
48-
return $this->subscribed($fr, $sr, $sortBy, $page, $siteConfig);
54+
return $this->subscribed($fr, $sr, $sortBy, $page, $siteConfig, $announcementSubmission);
4955
case User::FRONT_FEATURED:
50-
return $this->featured($fr, $sr, $sortBy, $page, $siteConfig);
56+
return $this->featured($fr, $sr, $sortBy, $page, $siteConfig, $announcementSubmission);
5157
case User::FRONT_ALL:
5258
//return $this->all($sr, $sortBy, $page, $siteConfig);
53-
return $this->all($fr, $sr, $sortBy, $page, $siteConfig);
59+
return $this->all($fr, $sr, $sortBy, $page, $siteConfig, $announcementSubmission);
5460
case User::FRONT_MODERATED:
55-
return $this->moderated($fr, $sr, $sortBy, $page, $siteConfig);
61+
return $this->moderated($fr, $sr, $sortBy, $page, $siteConfig, $announcementSubmission);
5662
default:
5763
throw new \InvalidArgumentException('bad front page selection');
5864
}
5965
}
6066

61-
public function featured(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig) {
67+
public function featured(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig, Submission $announcementSubmission) {
6268
$forums = $fr->findFeaturedForumNames();
6369
$submissions = $sr->findFrontPageSubmissions($forums, $sortBy, $page);
6470

@@ -68,10 +74,11 @@ public function featured(ForumRepository $fr, SubmissionRepository $sr, string $
6874
'submissions' => $submissions,
6975
'sort_by' => $sortBy,
7076
'announcement' => $siteConfig->getAnnouncement(),
77+
'announcementSubmission' => $announcementSubmission,
7178
]);
7279
}
7380

74-
public function subscribed(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig) {
81+
public function subscribed(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig, Submission $announcementSubmission) {
7582
$this->denyAccessUnlessGranted('ROLE_USER');
7683

7784
$forums = $fr->findSubscribedForumNames($this->getUser());
@@ -90,6 +97,7 @@ public function subscribed(ForumRepository $fr, SubmissionRepository $sr, string
9097
'sort_by' => $sortBy,
9198
'submissions' => $submissions,
9299
'announcement' => $siteConfig->getAnnouncement(),
100+
'announcementSubmission' => $announcementSubmission,
93101
]);
94102
}
95103

@@ -100,7 +108,7 @@ public function subscribed(ForumRepository $fr, SubmissionRepository $sr, string
100108
*
101109
* @return Response
102110
*/
103-
public function all(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig) {
111+
public function all(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig, Submission $announcementSubmission) {
104112
# Added for v1.
105113
$admin = PermissionsChecker::isAdmin($this->getUser());
106114
$forums = $fr->findAllForumNames();
@@ -112,10 +120,11 @@ public function all(ForumRepository $fr, SubmissionRepository $sr, string $sortB
112120
'sort_by' => $sortBy,
113121
'submissions' => $submissions,
114122
'announcement' => $siteConfig->getAnnouncement(),
123+
'announcementSubmission' => $announcementSubmission,
115124
]);
116125
}
117126

118-
public function moderated(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig) {
127+
public function moderated(ForumRepository $fr, SubmissionRepository $sr, string $sortBy, int $page, ForumConfiguration $siteConfig, Submission $announcementSubmission) {
119128
$this->denyAccessUnlessGranted('ROLE_USER');
120129

121130
$forums = $fr->findModeratedForumNames($this->getUser());
@@ -127,6 +136,7 @@ public function moderated(ForumRepository $fr, SubmissionRepository $sr, string
127136
'sort_by' => $sortBy,
128137
'submissions' => $submissions,
129138
'announcement' => $siteConfig->getAnnouncement(),
139+
'announcementSubmission' => $announcementSubmission,
130140
]);
131141
}
132142

src/Controller/FrontPageConfigurationController.php

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@
44

55
use App\Entity\User;
66
use App\Entity\ForumConfiguration;
7+
use App\Entity\Submission;
78
use App\Repository\ForumRepository;
89
use App\Repository\ForumConfigurationRepository;
910
use App\Repository\SubmissionRepository;
11+
use App\Repository\UserRepository;
1012
use Symfony\Component\HttpFoundation\Response;
1113
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
1214
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
13-
use App\Form\ForumConfigurationType;
14-
use App\Form\Model\ForumConfigurationData;
15+
use App\Form\NewForumAnnouncementType;
16+
use App\Form\Model\NewForumAnnouncementData;
1517
use Doctrine\ORM\EntityManager;
1618
use Symfony\Component\HttpFoundation\Request;
1719

@@ -20,37 +22,87 @@
2022
* @IsGranted("ROLE_ADMIN")
2123
*/
2224
final class FrontPageConfigurationController extends AbstractController {
23-
public function frontPageConfig(ForumRepository $fr, SubmissionRepository $sr, ForumConfigurationRepository $fcr, EntityManager $em, Request $request) {
24-
$data = new ForumConfigurationData($fcr->findSitewide());
2525

26-
$form = $this->createForm(ForumConfigurationType::class, $data);
26+
public function frontPageConfig(
27+
ForumRepository $fr,
28+
SubmissionRepository $sr,
29+
ForumConfigurationRepository $fcr,
30+
UserRepository $ur,
31+
EntityManager $em,
32+
Request $request
33+
) {
34+
$announcementForumName = "announcements";
35+
$data = new NewForumAnnouncementData();
36+
37+
$form = $this->createForm(NewForumAnnouncementType::class, $data);
2738
$form->handleRequest($request);
2839

2940
$message = "";
41+
$messageClass = "";
3042

3143
if ($form->isSubmitted() && $form->isValid()) {
32-
$fc = $data->toForumConfiguration();
44+
// Find the user and forum for submission.
45+
$user = $ur->loadUserByUsername($this->getUser()->getUsername());
46+
$forum = $fr->findOneByCaseInsensitiveName($announcementForumName);
47+
48+
if($forum != null) {
49+
// Create the submission.
50+
$submission = new Submission(
51+
$data->threadTitle,
52+
null,
53+
$data->threadContent,
54+
$forum,
55+
$user,
56+
null
57+
);
58+
$em->persist($submission);
59+
$em->flush();
3360

34-
// For sitewide settings, we need to force this to null.
35-
$fc->setForumId(null);
61+
// Load the current announcement's row id. Sitewide announcemnts have null forum id.
62+
$fc = $fcr->findSitewide();
63+
$fc->setAnnouncementSubmissionId($submission->getId());
64+
$fc->setAnnouncement($data->announcement);
65+
$fc->setForumId(null);
3666

37-
if($fc->getId() == null || trim($fc->getId()) == "")
3867
$em->persist($fc);
39-
else
40-
$em->merge($fc);
68+
$em->flush();
4169

42-
$em->flush();
70+
// After saving, pull the data back down again.
71+
$data = new NewForumAnnouncementData();
72+
$form = $this->createForm(NewForumAnnouncementType::class, $data);
4373

44-
// After saving, pull the data back down again.
45-
$data = new ForumConfigurationData($fcr->findSitewide());
46-
$form = $this->createForm(ForumConfigurationType::class, $data);
74+
$message = "front_page_configuration_form.announcement_saved";
75+
$messageClass = "success";
76+
} else {
77+
$message = "front_page_configuration_form.announcement_forum_error";
78+
$messageClass = "error";
79+
}
80+
}
4781

48-
$message = "front_page_configuration_form.message_saved";
82+
// Load the current sitewide so we can show the announcement.
83+
$frontpageconfig = $fcr->findSitewide();
84+
$announcementSubmission = null;
85+
if($frontpageconfig->getAnnouncementSubmissionId() != null) {
86+
$announcementSubmission = $em->find("App\\Entity\\Submission", $frontpageconfig->getAnnouncementSubmissionId());
4987
}
5088

5189
return $this->render('frontpageconfig/frontpageconfig.html.twig', [
5290
'form' => $form->createView(),
5391
'message' => $message,
92+
'messageClass' => $messageClass,
93+
'current_announcement' => $frontpageconfig->getAnnouncement(),
94+
'announcementSubmission' => $announcementSubmission,
5495
]);
5596
}
97+
98+
public function removeAnnouncement(ForumRepository $fr, SubmissionRepository $sr, ForumConfigurationRepository $fcr, EntityManager $em, Request $request) {
99+
$fc = $fcr->findSitewide();
100+
101+
$fc->setAnnouncement(null);
102+
$fc->setAnnouncementSubmissionId(null);
103+
$em->merge($fc);
104+
$em->flush();
105+
106+
return $this->redirectToRoute('frontpageconfig');
107+
}
56108
}

src/Entity/ForumConfiguration.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ class ForumConfiguration {
3939
*/
4040
private $announcement;
4141

42+
/**
43+
* @ORM\Column(type="bigint", nullable=true)
44+
*
45+
* @var int|null
46+
*/
47+
private $announcementSubmissionId;
48+
4249
public function __construct($forumId) {
4350
$this->forumId = $forumId;
4451
}
@@ -66,4 +73,12 @@ public function getAnnouncement() {
6673
public function setAnnouncement($announcement) {
6774
$this->announcement = $announcement;
6875
}
76+
77+
public function getAnnouncementSubmissionId() {
78+
return $this->announcementSubmissionId;
79+
}
80+
81+
public function setAnnouncementSubmissionId($id) {
82+
$this->announcementSubmissionId = $id;
83+
}
6984
}

src/Form/Model/ForumConfigurationData.php renamed to src/Form/Model/NewForumAnnouncementData.php

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use App\Entity\ForumConfiguration;
66
use Symfony\Component\Validator\Constraints as Assert;
77

8-
class ForumConfigurationData {
8+
class NewForumAnnouncementData {
99
/**
1010
* @var int
1111
*/
@@ -21,10 +21,22 @@ class ForumConfigurationData {
2121
*/
2222
public $announcement;
2323

24-
public function __construct(ForumConfiguration $fc) {
25-
$this->id = $fc->getId();
26-
$this->forumId = $fc->getForumId();
27-
$this->announcement = $fc->getAnnouncement();
24+
/**
25+
* @var string
26+
*/
27+
public $threadTitle;
28+
29+
/**
30+
* @var string
31+
*/
32+
public $threadContent;
33+
34+
public function __construct(ForumConfiguration $fc = null) {
35+
if($fc != null) {
36+
$this->id = $fc->getId();
37+
$this->forumId = $fc->getForumId();
38+
$this->announcement = $fc->getAnnouncement();
39+
}
2840
}
2941

3042
public function toForumConfiguration(): ForumConfiguration {

src/Form/ForumConfigurationType.php renamed to src/Form/NewForumAnnouncementType.php

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace App\Form;
44

5-
use App\Form\Model\ForumConfigurationData;
5+
use App\Form\Model\NewForumAnnouncementData;
66
use Symfony\Component\Form\AbstractType;
77
use App\Form\Type\MarkdownType;
88
use Symfony\Component\Form\Extension\Core\Type\TextType;
@@ -12,12 +12,20 @@
1212
use Symfony\Component\Form\FormBuilderInterface;
1313
use Symfony\Component\OptionsResolver\OptionsResolver;
1414

15-
class ForumConfigurationType extends AbstractType {
15+
class NewForumAnnouncementType extends AbstractType {
1616
public function buildForm(FormBuilderInterface $builder, array $options) {
1717
$builder
18-
->add('announcement', MarkdownType::class, [
18+
->add('announcement', TextType::class, [
1919
'label' => 'front_page_configuration_form.announcement',
20-
'required' => false
20+
'required' => true
21+
])
22+
->add('threadTitle', TextType::class, [
23+
'label' => 'front_page_configuration_form.thread_title',
24+
'required' => true
25+
])
26+
->add('threadContent', MarkdownType::class, [
27+
'label' => 'front_page_configuration_form.thread_content',
28+
'required' => true
2129
])
2230
->add('id', HiddenType::class, [])
2331
->add('forumId', HiddenType::class, [])
@@ -28,7 +36,7 @@ public function buildForm(FormBuilderInterface $builder, array $options) {
2836

2937
public function configureOptions(OptionsResolver $resolver) {
3038
$resolver->setDefaults([
31-
'data_class' => ForumConfigurationData::class,
39+
'data_class' => NewForumAnnouncementData::class,
3240
]);
3341
}
3442
}

0 commit comments

Comments
 (0)