Skip to content

Commit a97dbbe

Browse files
authored
Merge pull request #333 from jdev-org/issue-218
#218 - Template - Composant libre
2 parents 67471a4 + da333f5 commit a97dbbe

File tree

9 files changed

+123
-15
lines changed

9 files changed

+123
-15
lines changed

docs/doc_user/param_data.rst

+1
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ Il est maintenant nécessaire de peupler le bloc de gauche avec des composants e
276276
* ``Chiffre clé`` : composant permettant d’afficher un chiffre clé à mettre en avant et nécessitant une valeur de type « nombre » en entrée.
277277
* ``Liste`` : composant permettant d’afficher une liste et nécessitant un champ composé d’une liste comme indiqué dans la `documentation mviewer <https://mviewerdoc.readthedocs.io/fr/latest/doc_tech/config_tpl.html#iterer-sur-un-champ-de-type-json>`_.
278278
* ``Texte`` : composant permettant d’afficher un texte et nécessitant une valeur de type texte en entrée.
279+
* ``Libre`` : composant permettant de saisir librement le contenu du template comme dans un fichier Mustache (.mst).
279280

280281
Sélectionnez un composant et cliquez sur "Enregistrer" pour l’ajouter. Il n’est possible d’ajouter qu’un composant à la fois, veuillez réitérer l’opération pour ajouter des composants supplémentaires.
281282

js/mviewerstudio.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ var editLayer = function (item, themeid, layerid) {
412412
mv.setCurrentLayerId(layerid);
413413
var element = $(item).parent().parent();
414414
var layerid = element.attr("data-layerid");
415-
415+
element.addClass("active");
416416
if (layerid != "undefined") {
417417
$("#mod-layerOptions").modal("show");
418418
mv.showLayerOptions(element, themeid, layerid);

lib/mv.js

+13-2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ var mv = (function () {
4949
layerid = el.attr("data-layerid");
5050
}
5151
var themeid = mv.getCurrentThemeId();
52+
if (!themeid) {
53+
// search theme id from config object
54+
themeid = Object.keys(config.themes)
55+
.filter((f) => {
56+
const them = config.themes[f];
57+
return them.layers.filter((l) => l.id === layerid)?.length;
58+
})
59+
.filter((x) => x)[0];
60+
}
5261
return config.themes[themeid].layers.find((l) => l.id === layerid);
5362
},
5463

@@ -627,7 +636,7 @@ var mv = (function () {
627636
$("#frm-layerid").val(layer.id);
628637
$("#frm-url").val(layer.url);
629638
$("#frm-queryable").prop("checked", layer.queryable);
630-
$("#frm-featurecount").val(layer.featurecount);
639+
$("#frm-featurecount").val(layer.featurecount || 5);
631640
$("#frm-infopanel option[value='" + layer.infopanel + "']").prop("selected", true);
632641
$("#frm-secure").val(layer.secure);
633642
$("#frm-useproxy").prop("checked", layer.useproxy);
@@ -803,7 +812,9 @@ var mv = (function () {
803812
layer.fusesearchkeys = $("#frm-fusesearchkeys").val();
804813
layer.fusesearchresult = $("#frm-fusesearchresult").val();
805814
layer.infoformat = $("#frm-infoformat").val();
806-
layer.featurecount = $("#frm-featurecount").val();
815+
layer.featurecount = document
816+
.querySelector("#frm-featurecount")
817+
.getAttribute("value");
807818
layer.infopanel = $("#frm-infopanel").val();
808819
layer.metadata = $("#frm-metadata").val();
809820
layer["metadata-csw"] = $("#frm-metadata-csw").val();

lib/template-generator/ComponentsSelector.js

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { header as imageHeader } from "./components/library/ImageComponent.js";
66
import { header as buttonHeader } from "./components/library/ButtonComponent.js";
77
import { header as numberHeader } from "./components/library/NumbersComponent.js";
88
import { header as listHeader } from "./components/library/ListComponent.js";
9+
import { header as freeHeader } from "./components/library/FreeComponent.js";
910

1011
const headers = [
1112
h1Header(),
@@ -16,6 +17,7 @@ const headers = [
1617
numberHeader(),
1718
listHeader(),
1819
textHeader(),
20+
freeHeader(),
1921
];
2022

2123
/**

lib/template-generator/TemplateGenerator.js

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import ButtonComponent from "./components/library/ButtonComponent.js";
1212
import ListComponent from "./components/library/ListComponent.js";
1313
import NumbersComponent from "./components/library/NumbersComponent.js";
1414
import IframeComponent from "./components/library/IframeComponent.js";
15+
import FreeComponent from "./components/library/FreeComponent.js";
1516
import { RightPanelLocation } from "./components/content/RightPanelLocation.js";
1617
import { BottomPanelLocation } from "./components/content/BottomPanelLocation.js";
1718
import { BottomPanelHtmlPreview } from "./components/content/BottomPanelLocation.js";
@@ -24,6 +25,7 @@ const components = [
2425
new NumbersComponent(),
2526
new IframeComponent(),
2627
new ImageComponent(),
28+
new FreeComponent(),
2729
];
2830

2931
const maxItemsByCol = 3;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class TextArea {
2+
uuid = mv.uuidv4();
3+
value = "";
4+
label = "Saisir un contenu";
5+
constructor(value = "", label) {
6+
this.value = value.value;
7+
this.label = label;
8+
}
9+
render = () => {
10+
return `
11+
<div class="row g-3 align-items-center">
12+
<label class="col-auto" for="head">${mviewer.tr(this.label)}</label>
13+
<div class="col-12">
14+
<textarea
15+
class="form-control form-control-sm component-form"
16+
style="height:100px"
17+
id="${this.uuid}"
18+
name="">${this.value ? decodeURI(this.value).trim() : ""}</textarea>
19+
</div>
20+
</div>
21+
`;
22+
};
23+
set = ({ label, value }) => {
24+
this.value = value || this.value;
25+
this.label = label || this.label;
26+
};
27+
getValue = () => {
28+
return document.getElementById(this.uuid).value;
29+
};
30+
}
31+
32+
export default TextArea;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import TemplateComponent from "./TemplateComponent.js";
2+
import TextArea from "../forms/TextArea.js";
3+
4+
export const header = () => ({
5+
icon: "bi bi-body-text",
6+
id: mv.uuidv4(),
7+
title: "template.free.title",
8+
click: () => FreeComponent,
9+
class: "FreeComponent",
10+
});
11+
12+
const defaultTypeFields = [];
13+
14+
const attributes = ["data-value"];
15+
16+
export default class FreeComponent extends TemplateComponent {
17+
constructor(customHeader, defaultAttrValues) {
18+
let defaultValues = new Map();
19+
if (defaultAttrValues) {
20+
attributes.forEach((a) => {
21+
defaultValues.set(a, defaultAttrValues[a]);
22+
});
23+
}
24+
const textArea = new TextArea(defaultValues.get("data-value"), "template.free.label");
25+
super(customHeader || header(), defaultTypeFields, [textArea], defaultValues);
26+
this.textArea = textArea;
27+
}
28+
29+
getAttributes = () => attributes;
30+
31+
render = () => {
32+
let values = {
33+
value: this.textArea.getValue(),
34+
};
35+
return this.template(values);
36+
};
37+
38+
template = ({ value }) => {
39+
return `
40+
<div class="${header().class} template-component mb-2"
41+
data-type-selector=""
42+
data-value="${encodeURI(value)}"
43+
data-component="${header().class}"
44+
>
45+
${value}
46+
</div>
47+
`;
48+
};
49+
}

lib/template-generator/components/library/TemplateComponent.js

+21-12
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default class TemplateComponent {
1111
customFields = [];
1212
defaultType = "";
1313
defaultValues = null;
14+
typeFieldSelector = "";
1415
constructor(
1516
header = { icon: "", title: "" },
1617
defaultTypeFields = ["field", "multi", "static"],
@@ -23,10 +24,12 @@ export default class TemplateComponent {
2324
this.defaultValues = defaultValues;
2425
this.defaultType = defaultValues.get("data-type-selector");
2526
}
26-
this.typeFieldSelector = new TypeFieldSelector({
27-
fields: defaultTypeFields,
28-
defaultType: this.defaultType,
29-
});
27+
if (defaultTypeFields && defaultTypeFields.length) {
28+
this.typeFieldSelector = new TypeFieldSelector({
29+
fields: defaultTypeFields,
30+
defaultType: this.defaultType,
31+
});
32+
}
3033
this.customFields = customFields;
3134
}
3235

@@ -138,7 +141,7 @@ export default class TemplateComponent {
138141
return `
139142
<div class="card cardComponent titleComponent" id=${this.uuid}>
140143
${this.cardHeader()}
141-
${this.typeFieldSelector.render()}
144+
${this.typeFieldSelector ? this.typeFieldSelector.render() : ""}
142145
<div class="subcomponents" id="${mv.uuidv4()}"></div>
143146
${this.tooltipContent()}
144147
</div>`;
@@ -149,14 +152,20 @@ export default class TemplateComponent {
149152
this.componentsArea = document
150153
.getElementById(this.uuid)
151154
.querySelector(".subcomponents");
152-
const typeFieldSelectorFromDOM = document.getElementById(this.typeFieldSelector.uuid);
153-
typeFieldSelectorFromDOM.addEventListener("change", (el) => {
154-
this.getForms(el.target.value);
155+
if (this.typeFieldSelector) {
156+
const typeFieldSelectorFromDOM = document.getElementById(
157+
this.typeFieldSelector.uuid
158+
);
159+
typeFieldSelectorFromDOM.addEventListener("change", (el) => {
160+
this.getForms(el.target.value);
161+
this.getCustomFields();
162+
_elementTranslate("body");
163+
});
164+
if (this.defaultType) {
165+
typeFieldSelectorFromDOM.dispatchEvent(new Event("change"));
166+
}
167+
} else {
155168
this.getCustomFields();
156-
_elementTranslate("body");
157-
});
158-
if (this.defaultType) {
159-
typeFieldSelectorFromDOM.dispatchEvent(new Event("change"));
160169
}
161170
_elementTranslate("body");
162171
};

mviewerstudio.i18n.json

+2
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,8 @@
377377
"template.typefield.static": "Saisie libre",
378378
"template.typefield.liField": "A partir d'un champ JSON",
379379
"template.typefield.select": "Choisir un type...",
380+
"template.free.title": "Saisie libre",
381+
"template.free.label": "Contenu du template :",
380382
"version.comment": "Ajouter une description à cette version",
381383
"version.comment.ph": "Exemple : Version de test sans données",
382384
"publish.message": "Version publiée",

0 commit comments

Comments
 (0)