Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
O
OpenQuizz
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
10
Issues
10
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Weber Rodolphe
OpenQuizz
Commits
bcc68db3
Commit
bcc68db3
authored
Sep 24, 2021
by
Jérémie Passerat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Sauvegarde 24/09
parent
b71a7fe3
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
174 additions
and
67 deletions
+174
-67
ImporterFichier.vue
src/ImporterFichier.vue
+102
-26
Previsualiser_Moodle.vue
src/Previsualiser_Moodle.vue
+13
-9
Modifier_Contenu.vue
src/components/Modifier_Contenu.vue
+5
-3
Volet_Base.vue
src/components/Volet_Base.vue
+29
-18
Edit_Contenus.vue
src/components/moodle/Edit_Contenus.vue
+16
-11
Service.js
src/service/Service.js
+9
-0
No files found.
src/ImporterFichier.vue
View file @
bcc68db3
<
template
>
<
template
>
<div>
<div>
<div
style=
"text-align: center"
v-show=
"isImportation"
>
<div
style=
"text-align: center"
v-show=
"isImportation"
>
Je suis la page pour charger un contenu
<br>
Je suis la page pour charger un contenu
<br>
<input
type=
"file"
name=
"fichier"
@
change=
"onUploadFiles"
>
<input
type=
"file"
name=
"fichier"
@
change=
"onUploadFiles"
><br>
<p
style=
"color: red"
v-show=
"fichierError"
>
Aucun fichier uploadé
</p>
<div
class=
"markdown"
>
<br>
<button
class=
"ajouterContenu"
v-on:click=
"choisirTags"
>
créer
</button><br><br>
<button
class=
"retourArriere"
v-on:click=
"retourArriere"
>
revenir en arrière
</button>
</div>
<div
style=
"margin-top: 3vh"
v-if=
"isNotXml"
>
<label>
Le fichier n'est pas de type xml
</label><br>
<label>
Entrer le titre du fichier :
</label><br>
<input
type=
"text"
v-model=
"titreFichier"
required=
"required"
@
change=
"removeError"
/><br><br>
<p
style=
"color: red"
v-show=
"titreError"
>
Le descriptif du fichier est vide
</p>
<label>
Entrer un descriptif associé au fichier :
</label><br>
<textarea
rows=
"7"
cols=
"42"
v-model=
"descriptifFichier"
aria-required=
"true"
></textarea>
<p
style=
"color: red"
v-show=
"descriptifError"
>
Le descriptif du fichier est vide
</p>
</div>
<div
class=
"markdown"
>
<br>
<button
class=
"ajouterContenu"
v-on:click=
"choisirTags"
>
créer
</button><br><br>
<button
class=
"retourArriere"
v-on:click=
"retourArriere"
>
revenir en arrière
</button>
</div>
</div>
</div>
<TagsFixes
v-show=
"!isImportation"
@
tags=
"ajouterContenu"
></TagsFixes>
<TagsFixes
v-show=
"!isImportation"
@
tags=
"ajouterContenu"
></TagsFixes>
</div>
</div>
...
@@ -35,8 +47,15 @@ export default {
...
@@ -35,8 +47,15 @@ export default {
data
()
{
data
()
{
return
{
return
{
formData
:
null
,
formData
:
null
,
isImportation
:
true
isImportation
:
true
,
isNotXml
:
false
,
descriptifFichier
:
''
,
typeDocument
:
''
,
titreFichier
:
''
,
titreError
:
false
,
descriptifError
:
false
,
fichierError
:
false
,
nonTouche
:
true
,
}
}
},
},
methods
:
{
methods
:
{
...
@@ -44,17 +63,35 @@ export default {
...
@@ -44,17 +63,35 @@ export default {
* @vuese
* @vuese
* Fonction pour déclencher l'affichage de la page pour choisir les tags fixes
* Fonction pour déclencher l'affichage de la page pour choisir les tags fixes
*/
*/
choisirTags
:
function
()
{
choisirTags
:
function
()
{
this
.
isImportation
=
false
if
(
this
.
isNotXml
)
{
this
.
nonTouche
=
false
this
.
removeError
()
if
(
!
this
.
descriptifError
)
this
.
descriptifError
=
this
.
descriptifFichier
.
length
===
0
}
if
(
this
.
formData
===
null
){
this
.
fichierError
=
true
}
else
if
(
!
this
.
titreError
&&
!
this
.
descriptifError
)
{
this
.
isImportation
=
false
}
},
},
/**
/**
* @vuese
* @vuese
* permet 'd'enrengistrer' le fichier uploadé via le formulaire
* permet 'd'enrengistrer' le fichier uploadé via le formulaire
*/
*/
onUploadFiles
:
function
(
event
)
{
onUploadFiles
:
function
(
event
)
{
this
.
formData
=
new
FormData
()
this
.
formData
=
new
FormData
()
this
.
formData
.
append
(
'file'
,
event
.
target
.
files
.
item
(
0
));
if
(
event
.
target
.
files
.
item
(
0
).
type
!==
'text/xml'
)
{
this
.
isNotXml
=
true
this
.
typeDocument
=
event
.
target
.
files
.
item
(
0
).
type
}
this
.
formData
.
append
(
'file'
,
event
.
target
.
files
.
item
(
0
))
this
.
fichierError
=
false
},
},
/**
/**
* @vuese
* @vuese
...
@@ -62,6 +99,10 @@ export default {
...
@@ -62,6 +99,10 @@ export default {
*/
*/
retourArriere
:
function
()
{
retourArriere
:
function
()
{
// evenement pour retourner vers le volet Contenu_Base
// evenement pour retourner vers le volet Contenu_Base
this
.
formData
=
""
this
.
titreFichier
=
""
this
.
descriptifFichier
=
""
this
.
isNotXml
=
false
this
.
$emit
(
"retourArriere"
)
this
.
$emit
(
"retourArriere"
)
},
},
/**
/**
...
@@ -70,17 +111,52 @@ export default {
...
@@ -70,17 +111,52 @@ export default {
*/
*/
ajouterContenu
:
function
(
event
)
{
ajouterContenu
:
function
(
event
)
{
let
that
=
this
let
that
=
this
Service
.
uploaderContenuPerso
(
this
.
formData
,
this
.
auteur
,
JSON
.
stringify
(
event
.
tags
)).
then
(
if
(
!
this
.
isNotXml
)
{
function
(
reponse
)
{
Service
.
uploaderContenuPerso
(
this
.
formData
,
this
.
auteur
,
JSON
.
stringify
(
event
.
tags
)).
then
(
let
nouveauContenu
=
reponse
.
data
function
(
reponse
)
{
nouveauContenu
.
provenance
=
"perso"
let
nouveauContenu
=
reponse
.
data
nouveauContenu
.
tags_libres
=
[]
nouveauContenu
.
provenance
=
"perso"
that
.
$emit
(
"contenuAjoute"
,
{
contenu
:
nouveauContenu
})
nouveauContenu
.
tags_libres
=
[]
that
.
contenuSaisi
=
''
that
.
$emit
(
"contenuAjoute"
,
{
contenu
:
nouveauContenu
})
that
.
retourArriere
()
that
.
contenuSaisi
=
''
that
.
isImportation
=
true
that
.
retourArriere
()
}
that
.
isImportation
=
true
)
}
)
}
else
{
alert
(
"titre_fichier : "
+
this
.
titreFichier
)
Service
.
uploaderContenuPersoNonXml
(
this
.
formData
,
this
.
auteur
,
JSON
.
stringify
(
event
.
tags
),
this
.
descriptifFichier
,
this
.
typeDocument
,
this
.
titreFichier
).
then
(
function
(
reponse
)
{
let
nouveauContenu
=
reponse
.
data
nouveauContenu
.
provenance
=
"perso"
nouveauContenu
.
tags_libres
=
[]
that
.
$emit
(
"contenuAjoute"
,
{
contenu
:
nouveauContenu
})
that
.
contenuSaisi
=
''
that
.
retourArriere
()
that
.
isImportation
=
true
}
)
}
},
/**
* @vuese
* Enleve les messages d'erreur d'ajout de contenu non xml (titre)
*/
removeError
:
function
()
{
if
(
!
this
.
nonTouche
)
this
.
titreError
=
this
.
titreFichier
.
length
===
0
}
},
watch
:
{
/**
* @vuese
* Enleve les messages d'erreur d'ajout de contenu non xml (descriptif
*/
descriptifFichier
:
function
()
{
if
(
!
this
.
nonTouche
)
this
.
descriptifError
=
this
.
descriptifFichier
.
length
===
0
}
}
}
}
}
}
...
...
src/Previsualiser_Moodle.vue
View file @
bcc68db3
...
@@ -35,7 +35,9 @@ export default {
...
@@ -35,7 +35,9 @@ export default {
// texte du contenu survolé
// texte du contenu survolé
id
:
{},
id
:
{},
// provenance du contenu survolé
// provenance du contenu survolé
provenance
:
{}
provenance
:
{},
// source du contenu survole
source
:
{}
},
},
mounted
()
{
mounted
()
{
/**
/**
...
@@ -45,14 +47,16 @@ export default {
...
@@ -45,14 +47,16 @@ export default {
let
that
=
this
let
that
=
this
// alert(this.provenance)
// alert(this.provenance)
if
(
this
.
provenance
!==
'en-cours'
&&
this
.
provenance
!==
'maj'
)
{
if
(
this
.
source
===
'moodle'
)
{
Service
.
parserTexte
(
JSON
.
stringify
(
this
.
id
)).
then
(
function
(
response
)
{
if
(
this
.
provenance
!==
'en-cours'
&&
this
.
provenance
!==
'maj'
)
{
that
.
questionParsee
=
response
.
data
Service
.
parserTexte
(
JSON
.
stringify
(
this
.
id
)).
then
(
function
(
response
)
{
})
that
.
questionParsee
=
response
.
data
}
else
{
})
Service
.
parserTexteEnCours
(
JSON
.
stringify
(
this
.
id
)).
then
(
function
(
response
)
{
}
else
{
that
.
questionParsee
=
response
.
data
Service
.
parserTexteEnCours
(
JSON
.
stringify
(
this
.
id
)).
then
(
function
(
response
)
{
})
that
.
questionParsee
=
response
.
data
})
}
}
}
},
},
...
...
src/components/Modifier_Contenu.vue
View file @
bcc68db3
...
@@ -66,7 +66,7 @@
...
@@ -66,7 +66,7 @@
style=
"position: static; height: 78vh; margin-top: -0.77%"
v-bind:darktheme=
"darktheme"
@
chargerTagsLibres=
"chargerTagsLibres"
v-bind:tagLibreAssocie=
"tagLibreAssocie"
></TagsLibres>
style=
"position: static; height: 78vh; margin-top: -0.77%"
v-bind:darktheme=
"darktheme"
@
chargerTagsLibres=
"chargerTagsLibres"
v-bind:tagLibreAssocie=
"tagLibreAssocie"
></TagsLibres>
<Edit
_Contenus
@
actionMoodle=
"actionMoodle"
v-show=
"!isModeTag && sourceContenu === 'moodle'"
v-bind:darktheme=
"darktheme"
<Edit
_Contenus
@
actionMoodle=
"actionMoodle"
v-show=
"!isModeTag && sourceContenu === 'moodle'"
v-bind:darktheme=
"darktheme"
v-bind:idContenu=
"idContenu"
v-bind:provenance=
"contenuCliqueProvenance"
></Edit
_Contenus
>
v-bind:idContenu=
"idContenu"
v-bind:
source=
"sourceContenu"
v-bind:
provenance=
"contenuCliqueProvenance"
></Edit
_Contenus
>
<div
class=
"markdown"
v-show=
"sourceContenu !== 'moodle'"
>
<div
class=
"markdown"
v-show=
"sourceContenu !== 'moodle'"
>
<br>
<br>
...
@@ -251,7 +251,7 @@ export default {
...
@@ -251,7 +251,7 @@ export default {
*/
*/
calculerNoteContenu
:
function
()
{
calculerNoteContenu
:
function
()
{
if
(
this
.
contenuCliqueProvenance
!==
"moodle"
&&
this
.
contenuCliqueProvenance
!==
""
)
{
if
(
this
.
sourceContenu
!==
"moodle"
&&
this
.
contenuCliqueProvenance
!==
""
)
{
if
(
parseInt
(
this
.
versionChoisie
)
!==
this
.
versionMax
)
{
if
(
parseInt
(
this
.
versionChoisie
)
!==
this
.
versionMax
)
{
for
(
let
it
in
this
.
contenuClique
.
historique
)
{
for
(
let
it
in
this
.
contenuClique
.
historique
)
{
if
(
this
.
contenuClique
.
historique
[
it
].
numero
===
parseInt
(
this
.
versionChoisie
))
{
if
(
this
.
contenuClique
.
historique
[
it
].
numero
===
parseInt
(
this
.
versionChoisie
))
{
...
@@ -268,7 +268,9 @@ export default {
...
@@ -268,7 +268,9 @@ export default {
}
}
return
(
this
.
contenuClique
.
versionEnCours
.
note
/
this
.
contenuClique
.
versionEnCours
.
nbreNotes
).
toFixed
(
2
)
return
(
this
.
contenuClique
.
versionEnCours
.
note
/
this
.
contenuClique
.
versionEnCours
.
nbreNotes
).
toFixed
(
2
)
}
}
}
return
0
}
else
{
return
this
.
contenuClique
.
moyenne
}
}
}
},
},
watch
:
{
watch
:
{
...
...
src/components/Volet_Base.vue
View file @
bcc68db3
...
@@ -70,10 +70,12 @@ isActif ? {'margin-left': '1vw', 'margin-right': '1vw'} : {'margin-left': '0.6vw
...
@@ -70,10 +70,12 @@ isActif ? {'margin-left': '1vw', 'margin-right': '1vw'} : {'margin-left': '0.6vw
}">
}">
<td
:id=
"JSON.stringify(item._id)"
v-on:click=
"chargerContenu(item, item.provenance)"
>
{{
item
.
titre
}}
<div
style=
"display:none;"
>
<td
:id=
"JSON.stringify(item._id)"
v-on:click=
"chargerContenu(item, item.provenance)"
>
{{
item
.
titre
}}
<div
style=
"display:none;"
>
{{
item
.
_id
}}
</div></td>
{{
item
.
_id
}}
</div></td>
<b-popover
style=
"height: 700px; width: 700px"
class=
"non"
v-on:show=
"rechercherTexte(item._id, item.provenance, item.source)"
:target=
"JSON.stringify(item._id)"
<b-popover
style=
"height: 700px; width: 700px"
class=
"non"
v-on:show=
"rechercherTexte(item._id, item.provenance, item.source
, item.descriptif
)"
:target=
"JSON.stringify(item._id)"
triggers=
"hover"
placement=
"bottom"
>
triggers=
"hover"
placement=
"bottom"
>
<p
id=
"beautiful"
v-html=
"texteDuContenu"
v-if=
"!isMoodle"
></p>
<p
id=
"beautiful"
v-html=
"texteDuContenu"
v-if=
"!isMoodle"
></p>
<Previsualiser
_Moodle
v-bind:id=
"item._id"
v-bind:provenance=
"item.provenance"
v-else
></Previsualiser
_Moodle
>
<p
v-if=
"isAutre"
>
{{
descriptifContenu
}}
</p>
<Previsualiser
_Moodle
v-bind:id=
"item._id"
v-bind:provenance=
"item.provenance"
v-bind:source=
"item.source"
v-if=
"isMoodle && !isAutre"
></Previsualiser
_Moodle
>
</b-popover>
</b-popover>
<!-- auteur -->
<!-- auteur -->
<td>
{{
item
.
auteur
}}
</td>
<td>
{{
item
.
auteur
}}
</td>
...
@@ -87,9 +89,10 @@ isActif ? {'margin-left': '1vw', 'margin-right': '1vw'} : {'margin-left': '0.6vw
...
@@ -87,9 +89,10 @@ isActif ? {'margin-left': '1vw', 'margin-right': '1vw'} : {'margin-left': '0.6vw
<td
v-if=
"item.provenance === 'en-cours'"
>
-
</td>
<td
v-if=
"item.provenance === 'en-cours'"
>
-
</td>
<td
v-else
>
{{
item
.
popularite
}}
</td>
<td
v-else
>
{{
item
.
popularite
}}
</td>
<!-- note -->
<!-- note -->
<td
v-if=
"item.provenance === 'en-cours'"
>
-
</td>
<td
v-if=
"item.provenance === 'en-cours'"
>
{{
item
.
moyenne
}}
</td>
<td
v-else
>
{{
calculerNote
(
item
)
}}
</td>
<td
v-else
>
{{
calculerNote
(
item
)
}}
</td>
<td>
{{
item
.
note_perso
}}
</td>
<td
v-if=
"item.provenance !== 'tiers'"
>
-
</td>
<td
v-else
>
{{
item
.
note_perso
}}
</td>
<td
v-show=
"!isActif"
v-if=
"item.provenance !== 'en-cours'"
v-b-popover
.
hover
.
bottom=
"tagsFixesContenu(item.tags_fixes)"
>
<td
v-show=
"!isActif"
v-if=
"item.provenance !== 'en-cours'"
v-b-popover
.
hover
.
bottom=
"tagsFixesContenu(item.tags_fixes)"
>
{{
tagsFixesContenu
(
item
.
tags_fixes
)
}}
</td>
{{
tagsFixesContenu
(
item
.
tags_fixes
)
}}
</td>
<td
v-show=
"!isActif"
v-else
v-b-popover
.
hover
.
bottom=
"'tags non disponibles'"
>
tags non disponibles
</td>
<td
v-show=
"!isActif"
v-else
v-b-popover
.
hover
.
bottom=
"'tags non disponibles'"
>
tags non disponibles
</td>
...
@@ -207,11 +210,13 @@ export default {
...
@@ -207,11 +210,13 @@ export default {
checkes
:
[],
checkes
:
[],
nouveauContenu
:
false
,
nouveauContenu
:
false
,
texteDuContenu
:
''
,
texteDuContenu
:
''
,
descriptifContenu
:
''
,
titreContenu
:
''
,
titreContenu
:
''
,
token
:
''
,
token
:
''
,
razModeVariante
:
false
,
razModeVariante
:
false
,
//modeFiltre: false,
//modeFiltre: false,
isMoodle
:
false
,
isMoodle
:
false
,
isAutre
:
true
,
texteBoutonvariante
:
"changer"
,
texteBoutonvariante
:
"changer"
,
// booléens pour le tri des colonnes du tableau
// booléens pour le tri des colonnes du tableau
titreTrie
:
false
,
titreTrie
:
false
,
...
@@ -528,16 +533,18 @@ export default {
...
@@ -528,16 +533,18 @@ export default {
converter
=
new
showdown
.
Converter
()
converter
=
new
showdown
.
Converter
()
this
.
texteDuContenu
=
converter
.
makeMarkdown
(
this
.
texteDuContenu
)
this
.
texteDuContenu
=
converter
.
makeMarkdown
(
this
.
texteDuContenu
)
// Si Moodle, on en a pas besoin, car géré via Prévisualiser_Moodle et consorts
}
else
if
(
item
.
source
===
"autre"
){
}
/*else if (item.source === "moodle"){
let
that
=
this
let
that
=
this
Service.recupererTexteContenu(JSON.stringify(item._id)).then(
if
(
item
.
provenance
!==
'en-cours'
)
function (response) {
Service
.
recupererTexteContenu
(
JSON
.
stringify
(
item
.
_id
)).
then
(
function
(
reponse
)
{
that.texteDuContenu = response.data
that
.
texteDuContenu
=
reponse
.
data
// alert(response.data)
})
}
else
{
)
Service
.
recupererTexteContenuEnCours
(
JSON
.
stringify
(
item
.
_id
)).
then
(
function
(
reponse
)
{
}*/
that
.
texteDuContenu
=
reponse
.
data
})
}
}
}
}
},
},
/**
/**
...
@@ -720,20 +727,24 @@ export default {
...
@@ -720,20 +727,24 @@ export default {
* @vuese
* @vuese
* Récupération du texte d'
un
contenu
* Récupération du texte d'
un
contenu
*
/
*
/
rechercherTexte
:
function
(
id
,
provenance
,
source
)
{
rechercherTexte
:
function
(
id
,
provenance
,
source
,
description
)
{
if
(
id
===
undefined
)
if
(
id
===
undefined
)
return
return
let
that
=
this
let
that
=
this
if
(
source
===
"moodle"
){
if
(
source
===
"moodle"
){
this
.
isMoodle
=
true
this
.
isMoodle
=
true
}
this
.
isAutre
=
false
else
{
}
else
if
(
source
===
"autre"
){
this
.
isMoodle
=
false
this
.
isMoodle
=
false
this
.
isAutre
=
true
this
.
descriptifContenu
=
description
}
else
{
this
.
isMoodle
=
false
this
.
isAutre
=
false
if
(
provenance
===
'en-cours'
)
{
if
(
provenance
===
'en-cours'
)
{
Service
.
recupererTexteContenuEnCours
(
JSON
.
stringify
(
id
)).
then
(
Service
.
recupererTexteContenuEnCours
(
JSON
.
stringify
(
id
)).
then
(
...
...
src/components/moodle/Edit_Contenus.vue
View file @
bcc68db3
...
@@ -26,7 +26,9 @@ export default {
...
@@ -26,7 +26,9 @@ export default {
//l'id du contenu clique
//l'id du contenu clique
idContenu
:
{},
idContenu
:
{},
//la provenance du contenu
//la provenance du contenu
provenance
:
{}
provenance
:
{},
// la source du contenu
source
:
{}
},
},
methods
:
{
methods
:
{
passerMoodle
:
function
(
event
)
{
passerMoodle
:
function
(
event
)
{
...
@@ -48,18 +50,21 @@ export default {
...
@@ -48,18 +50,21 @@ export default {
//alert(that.provenance)
//alert(that.provenance)
if
(
this
.
provenance
!==
'en-cours'
)
{
if
(
this
.
source
===
'moodle'
)
{
Service
.
parserTexte
(
JSON
.
stringify
(
this
.
idContenu
)).
then
(
function
(
response
)
{
if
(
this
.
provenance
!==
'en-cours'
)
{
that
.
questionParsee
=
response
.
data
alert
(
"Puuuu"
)
that
.
type_question
=
that
.
questionParsee
.
type_question
Service
.
parserTexte
(
JSON
.
stringify
(
this
.
idContenu
)).
then
(
function
(
response
)
{
that
.
questionParsee
=
response
.
data
that
.
type_question
=
that
.
questionParsee
.
type_question
})
})
}
else
{
}
else
{
Service
.
parserTexteEnCours
(
JSON
.
stringify
(
this
.
idContenu
)).
then
(
function
(
response
)
{
Service
.
parserTexteEnCours
(
JSON
.
stringify
(
this
.
idContenu
)).
then
(
function
(
response
)
{
that
.
questionParsee
=
response
.
data
that
.
questionParsee
=
response
.
data
that
.
type_question
=
that
.
questionParsee
.
type_question
that
.
type_question
=
that
.
questionParsee
.
type_question
})
})
}
}
}
}
}
}
}
...
...
src/service/Service.js
View file @
bcc68db3
...
@@ -102,6 +102,15 @@ export default {
...
@@ -102,6 +102,15 @@ export default {
}
}
})
})
},
},
uploaderContenuPersoNonXml
(
data
,
auteur
,
tags
,
descriptif
,
type
,
titre
){
return
axios
.
post
(
urlBase
+
contenus
+
"uploadContenuNonXml/"
+
auteur
+
"?tags="
+
tags
+
"&descriptif="
+
descriptif
+
"&type="
+
type
+
"&titre="
+
titre
,
data
,
{
headers
:
{
'Content-Type'
:
'multipart/form-data'
,
Authorization
:
"Bearer "
+
localStorage
.
token
,
}
})
},
creerContenuTiers
(
data
)
{
creerContenuTiers
(
data
)
{
return
axios
.
patch
(
urlBase
+
contenus
+
"ajouterTiers"
,
data
,
this
.
getHeader
())
return
axios
.
patch
(
urlBase
+
contenus
+
"ajouterTiers"
,
data
,
this
.
getHeader
())
},
},
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment