forked from mviewer/mviewerstudio
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathComponentsSelector.js
106 lines (95 loc) · 3.46 KB
/
ComponentsSelector.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import { header as textHeader } from "./components/library/TextComponent.js";
import { header as h1Header } from "./components/library/TextH1Component.js";
import { header as h3Header } from "./components/library/TextH3Component.js";
import { header as iframeHeader } from "./components/library/IframeComponent.js";
import { header as imageHeader } from "./components/library/ImageComponent.js";
import { header as buttonHeader } from "./components/library/ButtonComponent.js";
import { header as numberHeader } from "./components/library/NumbersComponent.js";
import { header as listHeader } from "./components/library/ListComponent.js";
import { header as freeHeader } from "./components/library/FreeComponent.js";
const headers = [
h1Header(),
h3Header(),
iframeHeader(),
imageHeader(),
buttonHeader(),
numberHeader(),
listHeader(),
textHeader(),
freeHeader(),
];
/**
* This class will list all components
* to display one card by components availables.
* From this display, the user will click on a card to select and add one of them.
*/
export default class ComponentsSelector {
constructor(components = [], targetContentId = "") {
this.components = components;
this.targetContentId = targetContentId;
this.selected = null;
}
onValid = () => {
let componentSelected = this.selected.click();
mv.templateGenerator.addToSelection({
detail: { component: componentSelected, header: this.selected },
});
this.setValidBtnState(false);
};
content() {
return `
<div class="row">
<div class="col-md-12 mb-2 d-flex justify-content-between align-items-center">
<h6 class="m-0" i18n="msg.template.wich_component">Quel composant souhaitez-vous ajouter ?</h6>
</div>
</div>
<div class="row">
<div class="col-md-12 mb-2 d-flex justify-content-between align-items-center">
<div class="lib-blockComp">
${headers.map((header) => this.componentToHtml(header)).join("")}
</div>
</div>
</div>`;
}
componentToHtml({ title, icon, id }) {
return `<div class="card blockComp zoomCard" id="${id}" onclick="mv.templateGenerator.componentSelector.click(this)">
<i class="${icon}"></i>
<span class="titleComp">${mviewer.tr(title)}</span>
</div>`;
}
setValidBtnState = (visible) => {
const btnClass = document.querySelector("#templateSelectorAddBtn").classList;
if (visible) {
btnClass.remove("d-none");
} else {
btnClass.add("d-none");
}
};
click(cardElement) {
const clickedHeader = headers.filter((h) => h.id == cardElement.id)[0];
const selectedId = this.selected?.id;
if (selectedId) {
this.removeSelected();
}
if (clickedHeader.id != selectedId) {
this.selected = clickedHeader;
cardElement.classList.add("selected");
}
this.setValidBtnState(this.selected);
}
removeSelected() {
if (!this.selected) return;
document.getElementById(this.selected?.id).classList.remove("selected");
this.selected = null;
}
load() {
const target = document.querySelector(`#${this.targetContentId}`);
target.innerHTML = "";
target.insertAdjacentHTML("beforeend", this.content());
_elementTranslate("body");
}
getHeaders = () => headers;
selectComponentsFromHtml = (html) => {
return headers.filter((h) => html.getElementsByClassName(h.class).length);
};
}