financial-assistant
107 строк · 3.1 Кб
1import { TableData } from "../../contracts/interfaces";
2import DataType from "../../contracts/types";
3import EventObserver from "../../observer/observer";
4
5class KnowledgeBase {
6public tag: HTMLDivElement;
7public buttonsTag: HTMLDivElement;
8public contentTag: HTMLDivElement;
9private tbody: HTMLTableSectionElement;
10
11constructor() {
12this.tag = document.createElement("div");
13this.tag.classList.add("base__wrapper");
14
15this.buttonsTag = document.createElement("div");
16this.buttonsTag.classList.add("base__buttons");
17
18this.contentTag = document.createElement("div");
19this.contentTag.classList.add("base__content", "hidden");
20
21const table = document.createElement("table");
22table.classList.add("table");
23
24this.tbody = document.createElement("tbody");
25
26table.appendChild(this.tbody);
27this.contentTag.appendChild(table);
28this.tag.append(this.buttonsTag, this.contentTag);
29}
30
31private renderEmptyPage(): void {
32const h1: HTMLHeadingElement = document.createElement("h1");
33h1.classList.add("header");
34h1.textContent = "Извините, по выбранной категории нет данных";
35
36this.buttonsTag.appendChild(h1);
37}
38
39public fillTable(rows: TableData[] | []): void {
40while (this.tbody.firstChild) {
41this.tbody.removeChild(this.tbody.firstChild);
42}
43
44rows.forEach((row) => {
45const { title, description, link } = row;
46const descWithBr = description
47.replace(/\n/g, "<br>")
48.replace(/\*\*(.*?)\*\*/g, "<b>$1</b>")
49.replace(/\-/g, " •");
50
51const tr = document.createElement("tr");
52const tTitle = document.createElement("th");
53const tDesc = document.createElement("td");
54tDesc.classList.add("table__description");
55
56const tLink = document.createElement("td");
57tLink.classList.add("table__link");
58const a = document.createElement("a");
59
60a.href = link;
61a.target = "_blank";
62a.appendChild(tLink);
63
64tTitle.textContent = title;
65tDesc.innerHTML = descWithBr;
66tLink.textContent = "Ссылка на документ";
67
68tr.append(tTitle, tDesc, a);
69
70this.tbody.appendChild(tr);
71});
72}
73
74public drawButtons(items: DataType[] | [], isList?: boolean): void {
75while (this.buttonsTag.firstChild) {
76this.buttonsTag.removeChild(this.buttonsTag.firstChild);
77}
78
79if (items.length === 0) {
80this.renderEmptyPage();
81return;
82}
83
84items.forEach((item) => {
85const a: HTMLAnchorElement = document.createElement("a");
86a.id = String(item.id);
87
88const button: HTMLDivElement = document.createElement("div");
89this.buttonsTag.className = "base__buttons";
90this.contentTag.classList.add("hidden");
91
92button.className = "button";
93button.textContent = item.nameRus;
94
95a.appendChild(button);
96this.buttonsTag.appendChild(a);
97
98if (isList) {
99this.buttonsTag.className = "base__buttons_list";
100this.contentTag.classList.remove("hidden");
101button.className = "button__thin";
102}
103});
104}
105}
106
107export default KnowledgeBase;
108