Mercurial > packages > framework
annotate publishable/resources/js/ServerTable.js @ 7:e6132a1e8e24 default tip
Adding better support for test among other base changes.
| author | Luka Sitas <sitas.luka.97@gmail.com> |
|---|---|
| date | Thu, 25 Sep 2025 19:58:32 -0400 |
| parents | 6ded573b0a61 |
| children |
| rev | line source |
|---|---|
|
4
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
1 class ServerTable { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
2 /** |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
3 * @param {HTMLElement} rootEl - The container element for the table |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
4 * @param {Object} options - Configuration options |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
5 * @param {string} options.endpoint - API endpoint for data |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
6 * @param {Array} options.columns - Array of column configs: [{name, label, ...}] |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
7 * @param {number} [options.pageSize=10] - Default rows per page |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
8 * @param {Array} [options.initialSort=[]] - Default sort: [{col, dir}] |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
9 * @param {Object} [options.headers={}] - Additional headers for requests |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
10 * @param {string} [options.groupBy={}] - Which column to group by |
|
7
e6132a1e8e24
Adding better support for test among other base changes.
Luka Sitas <sitas.luka.97@gmail.com>
parents:
6
diff
changeset
|
11 * @param {Function} [options.postRender={}] - Function to call after rendering |
|
4
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
12 * @param {Function} [options.groupRender={}] - Function to render the grouping |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
13 */ |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
14 constructor(rootEl, options) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
15 this.rootEl = rootEl; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
16 this.endpoint = options.endpoint; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
17 this.columns = options.columns || []; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
18 this.pageSize = options.pageSize || 10; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
19 this.sort = options.initialSort || []; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
20 this.filters = options.filters || {}; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
21 this.currentPage = 1; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
22 this.headers = options.headers || {}; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
23 this.groupBy = options.groupBy; |
|
7
e6132a1e8e24
Adding better support for test among other base changes.
Luka Sitas <sitas.luka.97@gmail.com>
parents:
6
diff
changeset
|
24 this.postRender = options.postRender || null ; |
|
4
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
25 this.groupRender = |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
26 options.groupRender || |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
27 ((g, rows) => |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
28 `<tr class="st-group-row"><td colspan="${this.columns.length}">Group: ${g}</td></tr>`); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
29 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
30 this.skeleton = options.skeleton || ` |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
31 <div class="st-table-container"> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
32 <table> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
33 <thead> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
34 </thead> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
35 <tbody> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
36 <!-- Data rows will go here --> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
37 </tbody> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
38 </table> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
39 <div class="st-controls"> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
40 <span class="st-pagination"></span> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
41 <span class="st-status"></span> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
42 </div> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
43 </div> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
44 `; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
45 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
46 this.state = { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
47 loading: false, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
48 error: null, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
49 totalRecords: 0, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
50 records: [], |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
51 }; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
52 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
53 // Render initial skeleton and fetch initial data |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
54 this.renderSkeleton(); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
55 this.fetchData(); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
56 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
57 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
58 renderSkeleton() { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
59 // Build base structure: table shell, controls area |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
60 this.rootEl.innerHTML = this.skeleton; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
61 // Store references |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
62 this.head = this.rootEl.querySelector("thead"); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
63 this.tbody = this.rootEl.querySelector("tbody"); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
64 this.statusEl = this.rootEl.querySelector(".st-status"); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
65 this.paginationEl = this.rootEl.querySelector(".st-pagination"); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
66 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
67 // Draw the header |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
68 this.head.innerHTML = ` |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
69 <tr> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
70 ${this.columns.map((col) => `<th scope="col">${col.label || col.name}</th>`).join("")} |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
71 </tr> |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
72 `; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
73 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
74 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
75 async fetchData() { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
76 this.setLoading(true); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
77 const payload = { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
78 page: this.currentPage, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
79 page_size: this.pageSize, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
80 sort: this.sort, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
81 filters: this.filters, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
82 }; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
83 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
84 try { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
85 const res = await fetch(this.endpoint, { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
86 method: "POST", |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
87 headers: { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
88 ...this.headers, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
89 "Content-Type": "application/json", |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
90 }, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
91 body: JSON.stringify(payload), |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
92 }); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
93 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
94 if (!res.ok) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
95 throw new Error(`Server responded with ${res.status}`); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
96 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
97 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
98 const data = await res.json(); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
99 // Minimal shape validation |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
100 if ( |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
101 !Array.isArray(data.records) || |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
102 typeof data.total_records !== "number" |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
103 ) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
104 throw new Error("Malformed server response"); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
105 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
106 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
107 // Save data in state |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
108 this.state.records = data.records; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
109 this.state.totalRecords = data.total_records; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
110 this.state.error = null; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
111 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
112 this.renderRows(); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
113 this.updateControls(); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
114 } catch (err) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
115 this.state.error = err.message; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
116 this.renderError(); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
117 } finally { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
118 this.setLoading(false); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
119 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
120 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
121 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
122 setLoading(loading) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
123 this.state.loading = loading; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
124 this.statusEl.textContent = loading ? "Loading..." : ""; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
125 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
126 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
127 renderRows() { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
128 const { records } = this.state; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
129 const cols = this.columns; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
130 const groupBy = this.groupBy; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
131 const groupRender = |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
132 typeof this.groupRender === "function" |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
133 ? this.groupRender |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
134 : (g, rows) => |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
135 `<tr class="st-group-row"><td colspan="${cols.length}">Project: ${g}</td></tr>`; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
136 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
137 if (!records || records.length === 0) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
138 this.tbody.innerHTML = `<tr><td colspan="${cols.length}">No data</td></tr>`; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
139 return; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
140 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
141 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
142 // Group if needed |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
143 if (groupBy) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
144 // Find grouping field or function |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
145 const getGroupValue = |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
146 typeof groupBy === "function" ? groupBy : (row) => row[groupBy]; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
147 let lastGroup = undefined; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
148 let out = ""; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
149 let groupRows = []; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
150 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
151 for (let i = 0; i < records.length; i++) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
152 const row = records[i]; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
153 const groupVal = getGroupValue(row); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
154 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
155 // On group transition, flush previous group |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
156 if (i === 0 || groupVal !== lastGroup) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
157 if (i > 0) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
158 // Optionally do something with groupRows if groupRender wants it |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
159 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
160 // Insert group header row |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
161 out += groupRender(groupVal, []); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
162 lastGroup = groupVal; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
163 groupRows = []; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
164 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
165 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
166 groupRows.push(row); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
167 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
168 out += `<tr>${cols |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
169 .map((col, ci) => { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
170 // If grouping by this column, suppress repeated values (leave blank except for first row in group) |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
171 if ( |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
172 typeof groupBy === "string" && |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
173 col.name === groupBy && |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
174 groupVal === lastGroup && |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
175 groupRows.length > 1 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
176 ) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
177 return `<td></td>`; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
178 } |
| 5 | 179 return `<td class='${ typeof col.class === "string" ? col.class : '' }' >${ |
|
4
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
180 typeof col.render === "function" |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
181 ? col.render(row, col, i) |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
182 : row[col.name] |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
183 }</td>`; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
184 }) |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
185 .join("")}</tr>`; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
186 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
187 this.tbody.innerHTML = out; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
188 } else { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
189 // No grouping |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
190 this.tbody.innerHTML = records |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
191 .map( |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
192 (row, i) => |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
193 `<tr>${cols |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
194 .map( |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
195 (col) => |
| 5 | 196 `<td class='${ typeof col.class === "string" ? col.class : '' }' >${ |
|
4
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
197 typeof col.render === "function" |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
198 ? col.render(row, col, i) |
|
6
6ded573b0a61
updating the server tables to show blank on null by default
luka
parents:
5
diff
changeset
|
199 : row[col.name] === null ? '' : row[col.name] |
|
4
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
200 }</td>`, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
201 ) |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
202 .join("")}</tr>`, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
203 ) |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
204 .join(""); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
205 } |
|
7
e6132a1e8e24
Adding better support for test among other base changes.
Luka Sitas <sitas.luka.97@gmail.com>
parents:
6
diff
changeset
|
206 if(typeof this.postRender === "function") this.postRender(); |
|
4
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
207 } |
|
7
e6132a1e8e24
Adding better support for test among other base changes.
Luka Sitas <sitas.luka.97@gmail.com>
parents:
6
diff
changeset
|
208 |
|
4
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
209 renderError() { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
210 this.tbody.innerHTML = `<tr><td colspan="${this.columns.length}" style="color:red">${this.state.error}</td></tr>`; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
211 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
212 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
213 updateControls() { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
214 // Basic pagination info (full controls to come later) |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
215 const from = 1 + (this.currentPage - 1) * this.pageSize; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
216 const to = Math.min( |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
217 this.currentPage * this.pageSize, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
218 this.state.totalRecords, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
219 ); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
220 this.paginationEl.textContent = `Showing ${from}-${to} of ${this.state.totalRecords}`; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
221 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
222 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
223 // PUBLIC: force reload |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
224 reload() { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
225 this.fetchData(); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
226 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
227 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
228 // PUBLIC: update filters, resets to page 1 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
229 setFilters(newFilters) { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
230 this.filters = newFilters; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
231 this.currentPage = 1; |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
232 this.fetchData(); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
233 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
234 } |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
235 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
236 // Example usage (not part of module export): |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
237 /* |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
238 const table = new ServerTable(document.getElementById('my-table'), { |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
239 endpoint: '/tickets/get_data', |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
240 columns: [ |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
241 {name: 'id', label: 'ID'}, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
242 {name: 'subject', label: 'Subject'}, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
243 {name: 'project', label: 'Project'}, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
244 {name: 'created_at', label: 'Created At'}, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
245 ], |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
246 pageSize: 10, |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
247 initialSort: [{col: 'created_at', dir: 'desc'}] |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
248 }); |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
249 */ |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
250 |
|
84c75d9d90be
Changing usage to be bootstrap 5, not everything is reviewed but it's been started
luka
parents:
diff
changeset
|
251 window.ServerTable = ServerTable; |
