@zeesoft/i18n-verify 2.0.2 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/driver/adapters/cypress.js +2 -1
  2. package/dist/driver/adapters/nightwatch.js +69 -4
  3. package/dist/driver/adapters/selenium.js +0 -4
  4. package/dist/driver/baseDriver.js +24 -0
  5. package/dist/index.js +10 -5
  6. package/dist/lib/i18n.js +125 -43
  7. package/dist/{utils → lib}/reports.js +48 -28
  8. package/dist/lib/validator/string.js +2 -2
  9. package/dist/template/report.html +1678 -0
  10. package/dist/utils/cache.js +15 -15
  11. package/dist/utils/constants.js +8 -5
  12. package/dist/utils/file.js +8 -4
  13. package/dist/utils/logs.js +34 -16
  14. package/dist/utils/objects/cacheData.js +14 -33
  15. package/dist/utils/objects/metaData.js +7 -26
  16. package/dist/utils/objects/reportData.js +0 -18
  17. package/dist/utils/objects/statData.js +43 -28
  18. package/dist/utils/objects/stringData.js +4 -7
  19. package/dist/utils/reportFactory/base.js +15 -7
  20. package/dist/utils/reportFactory/html/index.js +24 -9
  21. package/dist/utils/reportFactory/html/template/body.js +117 -0
  22. package/dist/utils/reportFactory/html/template/css.js +471 -409
  23. package/dist/utils/reportFactory/html/template/html.js +17 -112
  24. package/dist/utils/reportFactory/html/template/javascript/data.js +59 -1
  25. package/dist/utils/reportFactory/html/template/javascript/global.js +45 -0
  26. package/dist/utils/reportFactory/html/template/javascript/grid.js +54 -80
  27. package/dist/utils/reportFactory/html/template/javascript/index.js +9 -7
  28. package/dist/utils/reportFactory/html/template/javascript/insight.js +225 -201
  29. package/dist/utils/reportFactory/html/template/javascript/log.js +19 -0
  30. package/dist/utils/reportFactory/html/template/javascript/menuBar.js +40 -35
  31. package/dist/utils/reportFactory/html/template/javascript/overview.js +725 -533
  32. package/dist/utils/reportFactory/index.js +4 -6
  33. package/dist/utils/reportFactory/table.js +95 -0
  34. package/dist/utils/resource.js +10 -6
  35. package/dist/utils/runtime.js +23 -3
  36. package/dist/utils/scripts/postinstall.js +3 -2
  37. package/package.json +8 -3
  38. package/types/index.d.ts +46 -0
  39. package/dist/utils/reportsTable.js +0 -71
@@ -4,221 +4,245 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = () => `
8
- //Cards of locales
9
- (() => {
10
- document.addEventListener("DOMContentLoaded", function () {
11
- renderCards();
12
-
13
- // helper methods to generate cards and its sections
14
- function createStatSection(data) {
15
- const isDefaultLocale = false; // dynamically pass
16
- const holder = document.createElement("div");
17
- const table = document.createElement("table");
18
- const tbody = document.createElement("tbody");
19
- const name = document.createElement("div");
20
- const tableData = {
21
- Reviewed: 1000,
22
- "Internationlized Strings": 600,
23
- "Not Internationlized Strings": 100,
24
- "Untranslated Strings": 50,
25
- "Encoding Issue Strings": 15,
26
- "DNT Strings": 15,
27
- "Auto Ignored Strings": 20,
28
- "Internationlized Numbers": 20,
29
- "Not Internationlized Numbers": 20,
30
- "Internationlized Currency": 20,
31
- "Not Internationlized Currency": 20,
32
- "Internationlized Date": 20,
33
- "Not Internationlized Date": 20,
34
- "Internationlized Time": 20,
35
- "Not Internationlized Time": 20,
36
- "Internationlized DateTime": 20,
37
- "Not Internationlized DateTime": 20,
38
- };
39
- const addRow = (name, value) => {
40
- const row = document.createElement("tr");
41
-
42
- const col1 = document.createElement("td");
43
- col1.classList.add("name");
44
- col1.textContent = name;
45
-
46
- const col2 = document.createElement("td");
47
- col2.classList.add("value");
48
- col2.textContent = value;
49
-
50
- row.appendChild(col1);
51
- row.appendChild(col2);
52
- return row;
53
- };
54
-
55
- for (const rowData of Object.entries(tableData)) {
56
- if (!isDefaultLocale || rowData[0] !== "Untranslated Strings") {
57
- tbody.appendChild(addRow(rowData[0], rowData[1]));
58
- }
7
+ var _default = () => `// insights content
8
+ (() => {
9
+ if (!DataStore.ranSuccessfully()) {
10
+ document.getElementById('overview').innerHTML =
11
+ 'Unable to prepare zQA automation report for the project.';
12
+ return;
13
+ }
14
+
15
+ document.addEventListener('DOMContentLoaded', function () {
16
+ renderCards();
17
+
18
+ // helper methods to generate cards and its sections
19
+ function createStatSection(locale, data) {
20
+ const isDefaultLocale = DataStore.isDefaultLocale(locale);
21
+ const holder = document.createElement('div');
22
+ const table = document.createElement('table');
23
+ const tbody = document.createElement('tbody');
24
+ const name = document.createElement('div');
25
+ const tableData = {
26
+ 'Internationlized Strings':
27
+ data.localizedStrings +
28
+ data.untranslatedStrings +
29
+ data.partialStrings,
30
+ 'Not Internationlized Strings': data.notLocalizedStrings,
31
+ 'Internationlized Numbers': data.localizedNumber,
32
+ 'Not Internationlized Numbers': data.notLocalizedNumber,
33
+ 'Internationlized Currency': data.localizedCurrency,
34
+ 'Not Internationlized Currency': data.notLocalizedCurrency,
35
+ 'Internationlized Percentage': data.localizedPercentage,
36
+ 'Not Internationlized Percentage': data.notLocalizedPercentage,
37
+ 'Internationlized Date': data.localizedDate,
38
+ 'Not Internationlized Date': data.notLocalizedDate,
39
+ 'Internationlized Time': data.localizedTime,
40
+ 'Not Internationlized Time': data.notLocalizedTime,
41
+ 'Internationlized DateTime': data.localizedDate,
42
+ 'Not Internationlized DateTime': data.notLocalizedDateTime,
43
+ 'Encoding Issue Strings': data.encoding,
44
+ 'DNT Strings': data.dnt,
45
+ 'Ignored Strings': data.ignored,
46
+ 'Untranslated Strings': data.untranslatedStrings,
47
+ 'Auto Ignored Strings': data.autoIgnored,
48
+ 'User Input Strings': data.userInput,
49
+ 'Total Reviewed': data.reviewed
50
+ };
51
+ const addRow = (name, value) => {
52
+ const row = document.createElement('tr');
53
+
54
+ const col1 = document.createElement('td');
55
+ col1.classList.add('name');
56
+ col1.textContent = name;
57
+
58
+ const col2 = document.createElement('td');
59
+ col2.classList.add('value');
60
+ col2.textContent = value;
61
+
62
+ row.appendChild(col1);
63
+ row.appendChild(col2);
64
+ return row;
65
+ };
66
+
67
+ for (const rowData of Object.entries(tableData)) {
68
+ if (!isDefaultLocale || rowData[0] !== 'Untranslated Strings') {
69
+ tbody.appendChild(addRow(rowData[0], rowData[1]));
59
70
  }
60
-
61
- holder.classList.add("stat");
62
- name.classList.add("name");
63
- name.textContent = "Summary";
64
- holder.append(name);
65
-
66
- table.appendChild(tbody);
67
- holder.appendChild(table);
68
- return holder;
69
71
  }
70
72
 
71
- function createStatusBarSection(data) {
72
- const holder = document.createElement("div");
73
- holder.classList.add("status-bar");
74
-
75
- const generateBarEl = (name, total, current) => {
76
- current = (current / total) * 100;
77
- const holder = document.createElement("div");
78
- holder.classList.add("bar-container");
79
-
80
- const nameHolder = document.createElement("div");
81
- nameHolder.classList.add("name");
82
- nameHolder.textContent = name;
83
-
84
- const barHolder = document.createElement("div");
85
- barHolder.classList.add("bar-holder");
86
-
87
- const bar = document.createElement("div");
88
- bar.classList.add("bar");
89
- bar.style.width = \`\${current}%\`;
90
- bar.textContent = \`\${current}%\`;
91
-
92
- barHolder.appendChild(bar);
93
- holder.appendChild(nameHolder);
94
- holder.appendChild(barHolder);
95
-
96
- return holder;
73
+ holder.classList.add('stat');
74
+ name.classList.add('name');
75
+ name.textContent = 'Summary';
76
+ holder.append(name);
77
+
78
+ table.appendChild(tbody);
79
+ holder.appendChild(table);
80
+ return holder;
81
+ }
82
+
83
+ function createStatusBarSection(locale, data) {
84
+ const holder = document.createElement('div');
85
+ holder.classList.add('status-bar');
86
+
87
+ const generateBarEl = (name, total, current) => {
88
+ const getColorClass = (value) => {
89
+ if (value <= 25) {
90
+ return 'red';
91
+ } else if (value <= 50) {
92
+ return 'yellow';
93
+ } else if (value <= 75) {
94
+ return 'blue';
95
+ } else if (value <= 100) {
96
+ return 'green';
97
+ }
97
98
  };
99
+ current = (current / total) * 100;
100
+ current = isNaN(current) || !isFinite(current) ? 0 : current;
101
+ const holder = document.createElement('div');
102
+ holder.classList.add('bar-container');
98
103
 
99
- const isDefaultLocale = false; // should be dynamically passed
100
- const totalStrings = isDefaultLocale ? 100 : 100; // reviewed - ignore - dnt - autoignore - encoding
101
- const totalI18nedStr = isDefaultLocale ? 100 : 70;
102
- const totalLocStr = isDefaultLocale ? 100 : 90;
103
- const totalI18nedNum = isDefaultLocale ? 100 : 50;
104
- const totalI18nedDateTime = isDefaultLocale ? 100 : 80;
104
+ const nameHolder = document.createElement('div');
105
+ nameHolder.classList.add('name');
106
+ nameHolder.textContent = name;
105
107
 
106
- holder.appendChild(
107
- generateBarEl("String I18n level", totalStrings, totalI18nedStr)
108
- );
109
- holder.appendChild(
110
- generateBarEl("String L10n level", totalStrings, totalLocStr)
111
- );
112
- holder.appendChild(
113
- generateBarEl("Number I18n level", totalStrings, totalI18nedNum)
114
- );
115
- holder.appendChild(
116
- generateBarEl(
117
- "DateTime I18n level",
118
- totalStrings,
119
- totalI18nedDateTime
120
- )
121
- );
122
- return holder;
123
- }
108
+ const barHolder = document.createElement('div');
109
+ barHolder.classList.add('bar-holder');
124
110
 
125
- function generateCardContents(data) {
126
- const cardContent = document.createElement("div");
127
- cardContent.classList.add("card-content");
111
+ const bar = document.createElement('div');
112
+ bar.classList.add('bar');
113
+ bar.classList.add(\`--\${getColorClass(current)}\`);
114
+ bar.style.width = \`\${current}%\`;
115
+ bar.textContent = \`\${current.toFixed(0)}%\`;
128
116
 
129
- cardContent.appendChild(createStatusBarSection(data));
130
- cardContent.appendChild(createStatSection(data));
131
- return cardContent;
132
- }
117
+ barHolder.appendChild(bar);
118
+ holder.appendChild(nameHolder);
119
+ holder.appendChild(barHolder);
133
120
 
134
- function createCardEl(locale, data) {
135
- const card = document.createElement("div");
136
- const title = document.createElement("div");
137
- card.classList.add("card");
138
- card.dataset.locale = locale;
139
- title.classList.add("title");
140
- title.textContent = \`\${locale} details\`;
141
-
142
- // fire menu selection event on clicking the card
143
- card.addEventListener("click", () => {
144
- const previousSelectedSubMenu = document.querySelector(
145
- '.sub-menu-item.selected'
146
- );
147
- if (previousSelectedSubMenu) {
148
- window.previousSelectedLocale =
149
- previousSelectedSubMenu.dataset.locale;
150
- }
121
+ return holder;
122
+ };
123
+
124
+ const isDefaultLocale = DataStore.isDefaultLocale(locale),
125
+ totalI18nCount = isDefaultLocale
126
+ ? 100
127
+ : data.localizedStrings +
128
+ data.untranslatedStrings +
129
+ data.partialStrings +
130
+ data.notLocalizedStrings,
131
+ i18nStrings = isDefaultLocale
132
+ ? 100
133
+ : data.localizedStrings +
134
+ data.untranslatedStrings +
135
+ data.partialStrings,
136
+ totalLocCount = isDefaultLocale
137
+ ? 100
138
+ : totalI18nCount -
139
+ data.untranslatedStrings -
140
+ data.notLocalizedStrings,
141
+ totalNumberCount = isDefaultLocale
142
+ ? 100
143
+ : data.localizedNumber +
144
+ data.localizedCurrency +
145
+ data.localizedPercentage +
146
+ data.notLocalizedPercentage +
147
+ data.notLocalizedCurrency +
148
+ data.notLocalizedNumber,
149
+ i18nNumbers = isDefaultLocale
150
+ ? 100
151
+ : totalNumberCount -
152
+ data.notLocalizedPercentage -
153
+ data.notLocalizedCurrency -
154
+ data.notLocalizedNumber,
155
+ totalI18nDateTimeCount = isDefaultLocale
156
+ ? 100
157
+ : data.localizedDate +
158
+ data.localizedDateTime +
159
+ data.localizedTime +
160
+ data.notLocalizedDate +
161
+ data.notLocalizedDateTime +
162
+ data.notLocalizedTime,
163
+ i18nDateTime = isDefaultLocale
164
+ ? 100
165
+ : totalI18nDateTimeCount -
166
+ data.notLocalizedDate -
167
+ data.notLocalizedDateTime -
168
+ data.notLocalizedTime;
169
+
170
+ holder.appendChild(
171
+ generateBarEl('String I18n level', totalI18nCount, i18nStrings)
172
+ );
173
+
174
+ holder.appendChild(
175
+ generateBarEl('String L10n level', totalI18nCount, totalLocCount)
176
+ );
177
+
178
+ holder.appendChild(
179
+ generateBarEl('Number I18n level', totalNumberCount, i18nNumbers)
180
+ );
181
+
182
+ holder.appendChild(
183
+ generateBarEl(
184
+ 'DateTime I18n level',
185
+ totalI18nDateTimeCount,
186
+ i18nDateTime
187
+ )
188
+ );
189
+ return holder;
190
+ }
191
+
192
+ function generateCardContents(locale, data) {
193
+ const cardContent = document.createElement('div');
194
+ cardContent.classList.add('card-content');
195
+
196
+ cardContent.appendChild(createStatusBarSection(locale, data));
197
+ cardContent.appendChild(createStatSection(locale, data));
198
+ return cardContent;
199
+ }
200
+
201
+ function createCardEl(locale, data) {
202
+ const card = document.createElement('div');
203
+ const title = document.createElement('div');
204
+ card.classList.add('card');
205
+ card.dataset.locale = locale;
206
+ title.classList.add('title');
207
+ title.textContent = \`\${locale} details\`;
208
+
209
+ // fire menu selection event on clicking the card
210
+ card.addEventListener('click', () => {
211
+ const previousSelectedSubMenu = document.querySelector(
212
+ '.sub-menu-item.selected'
213
+ );
214
+ if (previousSelectedSubMenu) {
215
+ window.previousSelectedLocale =
216
+ previousSelectedSubMenu.dataset.locale;
217
+ }
151
218
 
152
- document
153
- .querySelector(\`.sub-menu-item[data-locale="\${locale}"]\`)
154
- .click();
155
- });
219
+ document
220
+ .querySelector(\`.sub-menu-item[data-locale="\${locale}"]\`)
221
+ .click();
222
+ });
156
223
 
157
- card.appendChild(title);
158
- card.appendChild(generateCardContents(data));
159
- return card;
160
- }
224
+ card.appendChild(title);
225
+ card.appendChild(generateCardContents(locale, data));
226
+ return card;
227
+ }
161
228
 
162
- function renderCards() {
163
- // read from global variable appData;
164
- const localeInfo = {
165
- en_US: {
166
- total: 1000,
167
- localized: 700,
168
- notLocalized: 100,
169
- untranslated: 50,
170
- encodingIssue: 20,
171
- dnt: 15,
172
- ignored: 10,
173
- autoIgnored: 5,
174
- currency: 20,
175
- number: 20,
176
- percentage: 15,
177
- dateTime: 15,
178
- date: 15,
179
- time: 15,
180
- notLocalizedcurrency: 20,
181
- notLocalizednumber: 20,
182
- notLocalizedpercentage: 15,
183
- notLocalizeddateTime: 15,
184
- notLocalizeddate: 15,
185
- notLocalizedtime: 15,
186
- },
187
- fr_FR: {
188
- total: 1000,
189
- localized: 700,
190
- notLocalized: 100,
191
- untranslated: 50,
192
- encodingIssue: 20,
193
- dnt: 15,
194
- ignored: 10,
195
- autoIgnored: 5,
196
- currency: 20,
197
- number: 20,
198
- percentage: 15,
199
- dateTime: 15,
200
- date: 15,
201
- time: 15,
202
- notLocalizedCurrency: 20,
203
- notLocalizedNumber: 20,
204
- notLocalizedPercentage: 15,
205
- notLocalizedDateTime: 15,
206
- notLocalizedDate: 15,
207
- notLocalizedTime: 15,
208
- },
209
- };
229
+ function renderCards() {
230
+ // read from global variable appData;
231
+ const localeInfo = DataStore.getLocalesData();
210
232
 
211
- if (Object.keys(localeInfo).length) {
212
- const cardHolder = document.querySelector(
213
- "#insights .cards .holder"
233
+ if (Object.keys(localeInfo).length) {
234
+ const cardHolder = document.querySelector(
235
+ '#insights .cards .holder'
236
+ );
237
+ for (const locale in localeInfo) {
238
+ const cardEl = createCardEl(
239
+ locale,
240
+ DataStore.getStatByLocale(locale)
214
241
  );
215
- for (const locale in localeInfo) {
216
- const cardEl = createCardEl(locale, localeInfo[locale]);
217
- cardHolder.appendChild(cardEl);
218
- }
242
+ cardHolder.appendChild(cardEl);
219
243
  }
220
244
  }
221
- });
222
- })();
223
- `;
245
+ }
246
+ });
247
+ })();`;
224
248
  exports.default = _default;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = () => `// log content
8
+ (() => {
9
+ document.addEventListener('DOMContentLoaded', function () {
10
+ const pre = document.querySelector('#log .log-content pre');
11
+ pre.textContent = 'Loading...';
12
+ document
13
+ .querySelector('li[data-page="log"]')
14
+ ?.addEventListener('click', (e) => {
15
+ pre.textContent = window.logData || 'No log data found!';
16
+ });
17
+ });
18
+ })();`;
19
+ exports.default = _default;
@@ -4,22 +4,22 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = () => `(() => {
7
+ var _default = metaData => `(() => {
8
8
  // for sidebar menu
9
9
  const loadContent = (section, highlightMenu = false) => {
10
10
  if (highlightMenu) {
11
11
  document
12
12
  .querySelector('li[data-page="overview"]')
13
- ?.classList.add("selected");
13
+ ?.classList.add('selected');
14
14
  }
15
15
 
16
- const contents = document.querySelectorAll(".content");
16
+ const contents = document.querySelectorAll('.content');
17
17
  contents.forEach((content) => {
18
18
  content.id !== section
19
- ? content.classList.remove("active")
20
- : content.classList.add("active");
19
+ ? content.classList.remove('active')
20
+ : content.classList.add('active');
21
21
 
22
- section === "overview" &&
22
+ section === 'overview' &&
23
23
  window.persistOverviewCharts &&
24
24
  window.persistOverviewCharts();
25
25
 
@@ -27,92 +27,97 @@ var _default = () => `(() => {
27
27
  });
28
28
  };
29
29
 
30
- document.addEventListener("DOMContentLoaded", function () {
30
+ document.addEventListener('DOMContentLoaded', function () {
31
31
  const createMenuItems = (() => {
32
- const ul = document.querySelector(".sidebar .submenu");
32
+ const ul = document.querySelector('.sidebar .submenu');
33
33
  const createListItems = (locale) => {
34
- const li = document.createElement("li");
35
- li.classList.add("sub-menu-item");
34
+ const li = document.createElement('li');
35
+ li.classList.add('sub-menu-item');
36
36
  li.dataset.locale = locale;
37
37
 
38
- const a = document.createElement("a");
39
- a.href = "#";
38
+ const a = document.createElement('a');
39
+ a.href = '#';
40
40
  a.textContent = locale;
41
41
 
42
42
  li.appendChild(a);
43
43
  return li;
44
44
  };
45
45
 
46
- for (const locale of Object.keys(DataStore.getLocalesData())) {
46
+ for (const locale of DataStore.getLocales()) {
47
47
  ul.appendChild(createListItems(locale));
48
48
  }
49
49
  })();
50
50
 
51
- const menuItems = document.querySelectorAll(".menu-item"),
52
- submenuItems = document.querySelectorAll(".sub-menu-item");
51
+ const menuItems = document.querySelectorAll('.menu-item'),
52
+ submenuItems = document.querySelectorAll('.sub-menu-item');
53
53
 
54
54
  menuItems.forEach((item) => {
55
- item.addEventListener("click", function (event) {
55
+ item.addEventListener('click', function (event) {
56
56
  const selectedMenuItem = document.querySelector(
57
- ".menu-item.selected"
57
+ '.menu-item.selected'
58
58
  ),
59
- selectedSubmenu = document.querySelector(".submenu.active"),
59
+ selectedSubmenu = document.querySelector('.submenu.active'),
60
60
  page = item.dataset.page;
61
61
 
62
62
  if (selectedMenuItem) {
63
- selectedMenuItem.classList.remove("selected");
63
+ selectedMenuItem.classList.remove('selected');
64
64
  }
65
65
 
66
66
  if (selectedSubmenu) {
67
- selectedSubmenu.classList.remove("active");
67
+ selectedSubmenu.classList.remove('active');
68
68
  }
69
69
 
70
- if (item.classList.contains("has-submenu")) {
70
+ if (item.classList.contains('has-submenu')) {
71
71
  event.preventDefault();
72
- item.classList.add("selected");
73
- const submenu = item.querySelector(".submenu");
74
- submenu.classList.add("active");
72
+ item.classList.add('selected');
73
+ const submenu = item.querySelector('.submenu');
74
+ submenu.classList.add('active');
75
75
  } else {
76
- item.classList.add("selected");
76
+ item.classList.add('selected');
77
77
  }
78
78
 
79
79
  if (selectedSubmenu) {
80
80
  selectedSubmenu
81
- .querySelectorAll(".sub-menu-item")
81
+ .querySelectorAll('.sub-menu-item')
82
82
  .forEach((submenuItem) => {
83
83
  submenuItem.textContent !== item.textContent &&
84
- submenuItem.classList.remove("selected");
84
+ submenuItem.classList.remove('selected');
85
85
  });
86
86
  }
87
87
 
88
88
  loadContent(page);
89
89
  });
90
90
 
91
- loadContent("overview", true);
91
+ loadContent('overview', true);
92
92
  });
93
93
 
94
94
  submenuItems.forEach((sItem) => {
95
- sItem.addEventListener("click", function (event) {
95
+ sItem.addEventListener('click', function (event) {
96
96
  const selectedSubMenuItem = document.querySelector(
97
- ".sub-menu-item.selected"
97
+ '.sub-menu-item.selected'
98
98
  );
99
99
  event.preventDefault();
100
100
  event.stopPropagation();
101
101
 
102
102
  if (selectedSubMenuItem) {
103
- selectedSubMenuItem.classList.remove("selected");
103
+ selectedSubMenuItem.classList.remove('selected');
104
104
  window.previousSelectedLocale =
105
105
  selectedSubMenuItem.dataset.locale;
106
106
  }
107
107
 
108
- sItem.classList.add("selected");
109
- loadContent("locale");
108
+ sItem.classList.add('selected');
109
+ loadContent('locale');
110
110
  });
111
111
  });
112
112
 
113
113
  // update footer info
114
- const footer = document.querySelector(".sidebar .footer");
115
- footer.textContent = \`${new Date().getFullYear()} @ Zeesoft. All rights reserved.\`;
114
+ const footer = document.querySelector('.sidebar .footer');
115
+ footer.textContent = \`\${new Date().getFullYear()} @ Zeesoft. All rights reserved.\`;
116
+
117
+ // update project info
118
+ document.querySelector(
119
+ 'header .logo'
120
+ ).innerHTML = \`zQA Report | \${DataStore.getAppName()}<span class="project-info"><span class="time">Report generated at: \${DataStore.getTimestamp()}</span></span>\`;
116
121
  });
117
122
  })();`;
118
123
  exports.default = _default;