Skip to content

Commit 15e1368

Browse files
✨ [Feature] Add styling and embedding tools for FlatPages content (refs #3921, #3922, #4019)
Issues: - [[PageStatiqueV2] Proposer des styles prédéfinis #3921](#3921) - [[PageStatiqueV2] Alignement des images #3922](#3922) - [Intégration composant "Suggestions" #4019](#4019) The following styling possibilities have been added: - a blockquote section - an information section - multiple heading levels (from H2 to H6) Added embedding tools : - decorated link with a button style (from tool "Lien Bouton") - the "Suggestions" tool allow to embed an element referencing Geotrek objects (available categories: treks, touristic content, touristic event, outdoor site). It takes the form of an invisible DIV in the HTML content which can be retrieved through the API and displayed nicely (with cards in an article for instance). It also removes static files from the previously used `youtube` tinymce plugin which is not compatible with TinyMCE 5.
1 parent f2b2c2d commit 15e1368

27 files changed

Lines changed: 309 additions & 404 deletions

docs/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ CHANGELOG
88
**Features**
99

1010
- Add new menu headers and flat pages with tree hierarchies
11+
- Add styling and embedding tools for FlatPages content (refs #3921, #3922, #4019)
1112

1213
**Bug fixes**
1314

docs/usage/static-pages.rst

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,52 @@ Les champs Titre, Publiée et Contenu peuvent recevoir une valeur différente po
7474

7575
Ces champs sont une alternative au glisser-déposer sur la liste des Pages Statiques et permettent de déplacer les pages dans l'arborescence (voir `Arborescence des pages statiques`_).
7676

77-
**Mise en forme et médias**
77+
Mise en forme et médias
78+
-----------------------
7879

7980
Le champ contenu expose un éditeur de texte riche (TinyMCE) permettant d'ajouter de la mise en forme et des médias dans le contenu de la page.
8081

8182
- mise en forme du texte : titres, styles du texte, couleur du texte
8283
- insertion de listes
84+
- encart "Information"
85+
- lien sous forme de bouton
86+
- citation
8387

8488
Médias :
8589

8690
- insérer une image
8791
- insérer une vidéo YouTube
8892
- insérer un lien vers une autre page
93+
- encart de suggestion de contenu Geotrek
94+
95+
Insérer une image
96+
-----------------
97+
98+
L'outil *Insérer/modifier* une image permet d'insérer une image dans le contenu. Les champs suivants sont à renseigner :
99+
100+
- Source
101+
- Description alternative : non-affichée, pour l'accessibilité et les formes de consultation alternatives du contenu
102+
- Largeur et Hauteur de présentation de l'image en pixels
103+
- checkbox Afficher le sous-titrage insère une zone de texte collée à l'image pour présenter un titre (le titre est à saisir dans le contenu une fois le formulaire validé)
104+
105+
Insérer des suggestions de contenu Geotrek
106+
------------------------------------------
107+
108+
Avec l'outil *Suggestions*, les champs suivants sont à renseigner :
109+
110+
- le type de contenu (itinéraires, contenu touristique, événements ou site d'activités de plein nature)
111+
- les identifiants des contenus (séparés par des virgules. Par exemple : 12,8,73)
112+
- un titre pour l'encart de suggestions
113+
114+
Après la validation du formulaire une zone récapitulant les informations saisies sous forme textuelle est placée dans le contenu de la page. Le site portail enrichira la présentation des suggestions avec les titres des contenus suggérés à la place des identifiants et les images associées.
115+
116+
Vérifier la mise en page du contenu
117+
-----------------------------------
118+
119+
Les outils suivants sont disponibles :
120+
121+
- *Afficher les blocs* : permet de contrôler finement la séparation du contenu en blocs (pratique pour les paragraphes de texte)
122+
- *Code source* : affiche et permet de modifier directement le contenu au format HTML (pour les utilisateurs avertis)
89123

90124
Publier une page
91125
================

geotrek/flatpages/forms.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.conf import settings
22
from django.core import validators
3-
from tinymce.widgets import TinyMCE
3+
from geotrek.flatpages.widgets import FlatPageTinyMCE
44

55
from treebeard.forms import MoveNodeForm
66

@@ -26,7 +26,7 @@ def __init__(self, *args, **kwargs):
2626
# are passed along as they contain modeltranslation CSS classes.
2727
for fieldname, formfield in self.fields.items():
2828
if fieldname.startswith('content_'):
29-
self.fields[fieldname].widget = TinyMCE(attrs=self.fields[fieldname].widget.attrs)
29+
self.fields[fieldname].widget = FlatPageTinyMCE(attrs=self.fields[fieldname].widget.attrs)
3030

3131
if self.instance.pk:
3232
page = Attachment.objects.filter(
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
h1, h2, h3 {
2+
clear: both;
3+
}
4+
5+
.align-left {
6+
float: left;
7+
margin-right: 1rem;
8+
margin-bottom: 1rem;
9+
}
10+
11+
.align-right {
12+
float: right;
13+
margin-left: 1rem;
14+
margin-bottom: 1rem;
15+
}
16+
17+
.button-link {
18+
display: inline-block;
19+
padding: 0.5rem 1rem;
20+
border-radius: 1rem;
21+
border: 1px solid;
22+
text-decoration: none;
23+
}
24+
25+
.information {
26+
clear: both;
27+
padding: 1rem;
28+
background: lightgray;
29+
}
30+
31+
.suggestions {
32+
clear: both;
33+
display: block !important;
34+
background: lightgreen;
35+
color: green;
36+
padding: 2rem;
37+
border-radius: 1rem;
38+
box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
39+
clear: both;
40+
}
41+
42+
.suggestions::before {
43+
content: '' attr(data-type) ' suggestions : ' attr(data-label) '';
44+
font-size: 1.2rem;
45+
display: block;
46+
margin-bottom: .3rem;
47+
}
48+
49+
.suggestions::after {
50+
content: 'Identifiants : ' attr(data-ids) '';
51+
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/*
2+
Note: We have included the plugin in the same JavaScript file as the TinyMCE
3+
instance for display purposes only. Tiny recommends not maintaining the plugin
4+
with the TinyMCE instance and using the `external_plugins` option.
5+
*/
6+
7+
document.addEventListener("DOMContentLoaded", function () {
8+
tinymce.PluginManager.add('button-link', function (editor, url) {
9+
var openDialogButtonLink = function () {
10+
return editor.windowManager.open({
11+
title: 'Lien bouton',
12+
body: {
13+
type: 'panel',
14+
items: [
15+
{
16+
type: 'input',
17+
name: 'label',
18+
label: 'Intitulé',
19+
},
20+
{
21+
type: 'input',
22+
name: 'link',
23+
label: 'Lien',
24+
},
25+
{
26+
type: 'checkbox',
27+
name: 'target',
28+
label: 'Ouvrir dans un nouvel onglet'
29+
}
30+
]
31+
},
32+
buttons: [
33+
{
34+
type: 'cancel',
35+
text: 'Close'
36+
},
37+
{
38+
type: 'submit',
39+
text: 'Save',
40+
primary: true
41+
}
42+
],
43+
initialData: {
44+
label: tinymce.activeEditor.selection.getContent(),
45+
},
46+
onSubmit: function (api) {
47+
var data = api.getData();
48+
if (!data.link || !data.label) {
49+
return;
50+
}
51+
var target = data.target ? ' target="_blank" rel="noopener noreferrer" ' : '';
52+
editor.insertContent('<a class="button-link"' + target + 'href="' + data.link + '">' + data.label + '</a>');
53+
api.close();
54+
}
55+
});
56+
};
57+
58+
var openDialogSuggestion = function () {
59+
return editor.windowManager.open({
60+
title: 'Suggestions',
61+
body: {
62+
type: 'panel',
63+
items: [
64+
{
65+
type: 'listbox',
66+
name: 'type',
67+
label: 'Type',
68+
items: [
69+
{value: 'trek', text: 'Trek'},
70+
{value: 'touristicContent', text: 'Touristic content'},
71+
{value: 'touristicEvent', text: 'Touristic event'},
72+
{value: 'outdoorSite', text: 'Outdoor site'},
73+
]
74+
},
75+
{
76+
type: 'input',
77+
name: 'label',
78+
label: "Intitulé de l'encart",
79+
},
80+
{
81+
type: 'input',
82+
name: 'ids',
83+
label: "Liste d'ID (séparés par des virgules)",
84+
}
85+
]
86+
},
87+
buttons: [
88+
{
89+
type: 'cancel',
90+
text: 'Close'
91+
},
92+
{
93+
type: 'submit',
94+
text: 'Save',
95+
primary: true
96+
}
97+
],
98+
initialData: {
99+
label: tinymce.activeEditor.selection.getContent(),
100+
},
101+
onSubmit: function (api) {
102+
var data = api.getData();
103+
if (!data.type || !data.ids) {
104+
return;
105+
}
106+
editor.insertContent('<div class="suggestions" data-label="' + data.label + '" data-type="' + data.type + '" data-ids="' + data.ids + '" style="display: none" contenteditable="false"></div>');
107+
api.close();
108+
}
109+
});
110+
};
111+
/* Add a button that opens a window */
112+
editor.ui.registry.addButton('button-link', {
113+
text: 'Lien bouton',
114+
onAction: function () {
115+
/* Open window */
116+
openDialogButtonLink();
117+
}
118+
});
119+
/* Add a button that opens a window */
120+
editor.ui.registry.addButton('suggestions', {
121+
text: 'Suggestions',
122+
onAction: function () {
123+
/* Open window */
124+
openDialogSuggestion();
125+
}
126+
});
127+
})
128+
129+
}); // end of document DOMContentLoaded event handler

geotrek/flatpages/static/tiny_mce/plugins/youtube/README.md

Lines changed: 0 additions & 78 deletions
This file was deleted.

geotrek/flatpages/static/tiny_mce/plugins/youtube/css/styles.css

Lines changed: 0 additions & 9 deletions
This file was deleted.
Binary file not shown.
-212 Bytes
Binary file not shown.

geotrek/flatpages/static/tiny_mce/plugins/youtube/js/main.js

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)