From b912222ab9ba320b9f3c57c8eed785c4efa3462f Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 4 Nov 2024 18:59:40 +0100 Subject: [PATCH] feat(forum): improve topic creation onboarding --- assets/css/pages/_forum.scss | 56 ++++++++++++++ assets/css/tools/_typography.scss | 9 +++ assets/elements/editor/Toolbar.js | 5 +- assets/elements/editor/buttons/CodeButton.js | 21 +++++ assets/elements/forum/ForumOnboarding.js | 40 ++++++++++ assets/elements/index.js | 2 + bun.lockb | Bin 312094 -> 332069 bytes package.json | 1 + .../Forum/Repository/TopicRepository.php | 18 +++++ src/Http/Controller/ForumController.php | 8 +- .../Subscriber/MercureCookieMiddleware.php | 2 +- src/Infrastructure/Spam/GeoIpService.php | 2 - templates/forum/new.html.twig | 73 ++++++++++++++++++ 13 files changed, 229 insertions(+), 8 deletions(-) create mode 100644 assets/elements/editor/buttons/CodeButton.js create mode 100644 assets/elements/forum/ForumOnboarding.js diff --git a/assets/css/pages/_forum.scss b/assets/css/pages/_forum.scss index 97a1ed6af..96aa0142d 100644 --- a/assets/css/pages/_forum.scss +++ b/assets/css/pages/_forum.scss @@ -550,3 +550,59 @@ border-right: 10px solid #0000; border-left: 10px solid #0000; } + +// Onboarding sur la création de sujet +// ============= +.onboarding-step { + display: grid; + align-items: flex-start; + grid-template-columns: 32px 1fr; + gap: 1rem; + counter-increment: onboarding; + interpolate-size: allow-keywords; +} +.onboarding-step p { + color: var(--color-light); +} +.onboarding-step__number { + width: 32px; + height: 32px; + font-size: 1.2rem; + line-height: 1; + font-weight: bold; + border-radius: 50%; + display: grid; + place-items: center; +} +.onboarding-step__body { + height: auto; + transition: height .5s; + overflow: hidden; +} +.onboarding-step__number::after { + content: counter(onboarding); +} +.onboarding-step__number svg { + width: 32px; + height: 32px; + display: none; +} +.is-done .onboarding-step__number { + box-shadow: inset 0 0 0 3px var(--green); + background: var(--color); + color: var(--green); + border: none; +} +.is-done .onboarding-step__number svg { + display: block; +} +.is-done .onboarding-step__number::after { + display: none; +} +.is-done .onboarding-step__body, +.is-disabled .onboarding-step__body { + height: 32px; +} +.is-disabled.onboarding-step { + opacity: .3; +} diff --git a/assets/css/tools/_typography.scss b/assets/css/tools/_typography.scss index 0a2c0ab1d..61449955e 100644 --- a/assets/css/tools/_typography.scss +++ b/assets/css/tools/_typography.scss @@ -117,6 +117,15 @@ small, .text-small { font-size: .9em; } +.snippet { + font-size: .95rem; + border: solid 1px var(--border); + background-color: var(--list-hover); + display: inline-block; + border-radius: .25rem; + padding: .4rem .5rem; +} + // Pour générer les polices : https://transfonter.org/ // Alignements diff --git a/assets/elements/editor/Toolbar.js b/assets/elements/editor/Toolbar.js index ef60caf5f..f0c42e860 100644 --- a/assets/elements/editor/Toolbar.js +++ b/assets/elements/editor/Toolbar.js @@ -1,8 +1,9 @@ /** * @property {HTMLDivElement} element */ -import { BoldButton, FullScreenButton, LinkButton, SpeechButton } from './buttons' +import { BoldButton, FullScreenButton, LinkButton } from './buttons' import { createElement } from '/functions/dom.js' +import CodeButton from '/elements/editor/buttons/CodeButton.js' export default class Toolbar { /** @@ -14,7 +15,7 @@ export default class Toolbar { const left = createElement('div', { class: 'mdeditor__toolbarleft' }) const right = createElement('div', { class: 'mdeditor__toolbarright' }) const fullScreenButton = new FullScreenButton(editor) - this.addButtons(left, [new BoldButton(editor), new LinkButton(editor), new SpeechButton(editor)]) + this.addButtons(left, [new CodeButton(editor), new BoldButton(editor), new LinkButton(editor)]) this.addButtons(right, [fullScreenButton]) this.element.appendChild(left) this.element.appendChild(right) diff --git a/assets/elements/editor/buttons/CodeButton.js b/assets/elements/editor/buttons/CodeButton.js new file mode 100644 index 000000000..d976c100b --- /dev/null +++ b/assets/elements/editor/buttons/CodeButton.js @@ -0,0 +1,21 @@ +import Button from './Button' +import { strToDom } from '/functions/dom.js' + +export default class CodeButton extends Button { + shortcut () { + return false + } + + icon () { + return strToDom( + '' + ) + } + + /** + * @param {Editor} editor + */ + action () { + this.editor.wrapWith('\n```\n', '\n```\n') + } +} diff --git a/assets/elements/forum/ForumOnboarding.js b/assets/elements/forum/ForumOnboarding.js new file mode 100644 index 000000000..eaf30303e --- /dev/null +++ b/assets/elements/forum/ForumOnboarding.js @@ -0,0 +1,40 @@ +import { flash } from '/elements/Alert.js' + +export class ForumOnboarding extends HTMLElement { + #step = 0 + + onSubmit = e => { + const form = e.currentTarget + if (this.#step > 1) { + return + } + e.preventDefault() + const answer = new FormData(form) + .get('challenge') + .split('\n') + .map(line => line.trim()) + .filter(line => line !== '') + .join('\n') + if ( + (this.#step === 0 && answer.includes('**vérifier**')) || + (this.#step === 1 && answer.includes('```\nconst') && answer.includes(')\n```')) + ) { + this.#step++ + form.classList.add('is-done') + const nextForm = form.nextElementSibling + nextForm.classList.remove('is-disabled') + nextForm.querySelector('button[type="submit"]').removeAttribute('disabled') + } else { + flash( + this.#step === 0 ? 'Vous devez mettre le mot "vérifier" en gras' : 'Vous devez entourer le code de ```', + 'danger' + ) + } + } + + connectedCallback () { + this.querySelectorAll('form').forEach(form => { + form.addEventListener('submit', this.onSubmit) + }) + } +} diff --git a/assets/elements/index.js b/assets/elements/index.js index 37187c34c..c6da8b08d 100644 --- a/assets/elements/index.js +++ b/assets/elements/index.js @@ -36,6 +36,7 @@ import { MarkAsWatched } from '/elements/courses/MarkAsWatched.jsx' import { PodcastVote } from '/elements/PodcastVote.js' import { SpoilerBox } from '/elements/SpoilerBox' import {Captcha} from '/elements/Captcha' +import {ForumOnboarding} from "/elements/forum/ForumOnboarding.js"; // Custom Elements customElements.define('nav-tabs', NavTabs) @@ -64,6 +65,7 @@ customElements.define('premium-player', PremiumPlayer) customElements.define('loader-overlay', LoaderOverlay) customElements.define('theme-switcher', ThemeSwitcher) customElements.define('podcast-vote', PodcastVote) +customElements.define('forum-onboarding', ForumOnboarding) preactCustomElement('site-notifications', Notifications) preactCustomElement('contact-form', ContactForm) preactCustomElement('comments-area', Comments, ['target']) diff --git a/bun.lockb b/bun.lockb index e1c3e15cc164db65db1f848e6a498665d79cf5d7..940f8f341d5aa50761b67b61b927e16a219c1edb 100755 GIT binary patch delta 60100 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

x(WwCMpQ{Yo;cd1BUVq*rM!XQmN( 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 PB5H48gDE#b^~t{gf!b4N diff --git a/package.json b/package.json index 6b6b2571c..b912c0cde 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "devDependencies": { "@preact/preset-vite": "^2.8.2", "doctoc": "^2.0.1", + "eslint-config-preact": "^1.5.0", "prettier": "^3.2.5", "prettier-standard": "^16.4.1", "sass": "^1.77.2", diff --git a/src/Domain/Forum/Repository/TopicRepository.php b/src/Domain/Forum/Repository/TopicRepository.php index ca463ebb5..f8e255c93 100644 --- a/src/Domain/Forum/Repository/TopicRepository.php +++ b/src/Domain/Forum/Repository/TopicRepository.php @@ -8,6 +8,7 @@ use App\Domain\Forum\Entity\Topic; use App\Infrastructure\Orm\AbstractRepository; use App\Infrastructure\Spam\SpammableRepositoryTrait; +use Doctrine\ORM\NoResultException; use Doctrine\ORM\Query; use Doctrine\ORM\Query\ResultSetMappingBuilder; use Doctrine\Persistence\ManagerRegistry; @@ -21,6 +22,23 @@ public function __construct(ManagerRegistry $registry) parent::__construct($registry, Topic::class); } + public function hasTopics(User $user): bool + { + try { + $this->createQueryBuilder('t') + ->select('t.id') + ->where('t.author = :user') + ->setMaxResults(1) + ->setParameter('user', $user) + ->getQuery() + ->getSingleScalarResult(); + } catch (NoResultException) { + return false; + } + + return true; + } + /** * Récupère les derniers sujets créés par l'utilisateur. * diff --git a/src/Http/Controller/ForumController.php b/src/Http/Controller/ForumController.php index 7830e8284..3c789d9b1 100644 --- a/src/Http/Controller/ForumController.php +++ b/src/Http/Controller/ForumController.php @@ -73,16 +73,17 @@ public function showLegacy(int $id): Response } #[Route(path: '/forum/new', name: 'forum_new')] - public function create(Request $request): Response + public function create(Request $request, TopicRepository $topicRepository): Response { $this->denyAccessUnlessGranted(ForumVoter::CREATE_TOPIC); /** @var User $user */ $user = $this->getUser(); - $topic = (new Topic())->setContent($this->renderView('forum/template/placeholder.text.twig')); + $topic = new Topic(); $topic->setAuthor($user); $form = $this->createForm(ForumTopicForm::class, $topic); $form->handleRequest($request); - if ($form->isSubmitted() && $form->isValid()) { + $isSubmitted = $form->isSubmitted(); + if ($isSubmitted && $form->isValid()) { $this->topicService->createTopic($topic); $this->addFlash('success', 'Le sujet a bien été créé'); @@ -91,6 +92,7 @@ public function create(Request $request): Response return $this->render('forum/new.html.twig', [ 'form' => $form->createView(), + 'has_onboarding' => !$isSubmitted && !$topicRepository->hasTopics($user), ]); } diff --git a/src/Infrastructure/Mercure/Subscriber/MercureCookieMiddleware.php b/src/Infrastructure/Mercure/Subscriber/MercureCookieMiddleware.php index 18fc40557..dff38c010 100644 --- a/src/Infrastructure/Mercure/Subscriber/MercureCookieMiddleware.php +++ b/src/Infrastructure/Mercure/Subscriber/MercureCookieMiddleware.php @@ -63,7 +63,7 @@ public function setMercureCookie(ResponseEvent $event): void ->withExpires($exp) ->withValue($this->tokenFactory->create($channels, null, [ // We need to set a date without ms to avoid float in "exp" - 'exp' => new \DateTimeImmutable("@" . $exp->getTimestamp()), + 'exp' => new \DateTimeImmutable('@'.$exp->getTimestamp()), ])); $response->headers->setCookie($cookie); } diff --git a/src/Infrastructure/Spam/GeoIpService.php b/src/Infrastructure/Spam/GeoIpService.php index 14dc75839..27bf19ae4 100644 --- a/src/Infrastructure/Spam/GeoIpService.php +++ b/src/Infrastructure/Spam/GeoIpService.php @@ -3,8 +3,6 @@ namespace App\Infrastructure\Spam; use GeoIp2\Database\Reader; -use GeoIp2\Exception\AddressNotFoundException; -use MaxMind\Db\Reader\InvalidDatabaseException; use Symfony\Component\DependencyInjection\Attribute\Autowire; class GeoIpService diff --git a/templates/forum/new.html.twig b/templates/forum/new.html.twig index baf4052d3..877b4d121 100644 --- a/templates/forum/new.html.twig +++ b/templates/forum/new.html.twig @@ -4,6 +4,78 @@ {% block body %} + {% if has_onboarding %} +

+ +

+ Créer un sujet +

+ +
+ Le forum utilise la syntaxe markdown, voici quelques étapes pour vous aider à formater votre sujet. +
+ + + +
+
{{ icon('check') }}
+
+

Mettre en gras

+

+ Pour mettre du texte en gras, vous pouvez l'entourer de deux * (exemple : ceci est **en gras**) +

+ + +
+
+ +
+
{{ icon('check') }}
+
+

Formater le code

+

+ Si votre question contient des morceaux de code, vous devez l'entourer de 3 `, exemple : +

+
J'ai un bug sur ce code
+
+```
+const a = 3
+```
+

+ Pour vérifier que vous avez bien compris, entourez le code +

+ + +
+
+ +
+
{{ icon('check') }}
+
+

Créer votre sujet

+

+ Afin de maximiser vos chances d'obtenir de l'aide, essayez de décrire au mieux votre problème (ne copiez pas des + centaines de lignes). Essayez de simplifier votre problème au maximum. +

+ {{ form_start(form, {attr: {class: 'grid fit js-preventMultiSubmit', style: '--col:300px'}}) }} + {{ form_row(form.name, {label: 'Titre'}) }} + {{ form_row(form.tags, {label: 'Tags', attr: {placeholder: 'Sélectionner un ou plusieurs tags'}}) }} + {{ form_row(form.content, {label: false}) }} +
+ +
+ {{ form_end(form) }} +
+
+ +
+
+ {% else %} +

@@ -28,6 +100,7 @@

{{ form_end(form) }} + {% endif %}