Skip to content

Commit a876931

Browse files
Create xlsl-manager.js
1 parent 7c65ae6 commit a876931

File tree

1 file changed

+204
-0
lines changed

1 file changed

+204
-0
lines changed

xlsl-manager.js

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
// Aura XLSL Vanilla JS Manager
2+
3+
let xlslData = { files: {}, csvs: {} };
4+
let selectedSheet = '';
5+
let parsedCsv = [];
6+
let highlightedCsv = [];
7+
const COLORS = ['#fffa65', '#a0e7e5', '#ffd6a5', '#ffadad', '#caffbf'];
8+
9+
const fileInput = document.getElementById('fileInput');
10+
const csvText = document.getElementById('csvText');
11+
const mavenRegex = document.getElementById('mavenRegex');
12+
const replaceWith = document.getElementById('replaceWith');
13+
const csvTable = document.getElementById('csvTable');
14+
const sheetButtons = document.getElementById('sheetButtons');
15+
16+
// ---------- Load XLSL ----------
17+
fileInput.addEventListener('change', (e) => {
18+
const file = e.target.files[0];
19+
const reader = new FileReader();
20+
reader.onload = (ev) => {
21+
try {
22+
xlslData = JSON.parse(ev.target.result);
23+
const sheets = Object.keys(xlslData.csvs);
24+
if (sheets.length > 0) {
25+
switchSheet(sheets[0]);
26+
}
27+
renderSheetButtons();
28+
} catch {
29+
alert('Invalid .xlsl file');
30+
}
31+
};
32+
reader.readAsText(file);
33+
});
34+
35+
// ---------- Sheet Buttons ----------
36+
function renderSheetButtons() {
37+
sheetButtons.innerHTML = '';
38+
Object.keys(xlslData.csvs).forEach(sheet => {
39+
const btn = document.createElement('button');
40+
btn.textContent = sheet;
41+
btn.addEventListener('click', () => switchSheet(sheet));
42+
sheetButtons.appendChild(btn);
43+
});
44+
}
45+
46+
// ---------- Switch Sheet ----------
47+
function switchSheet(sheet) {
48+
selectedSheet = sheet;
49+
csvText.value = xlslData.csvs[sheet];
50+
parseCsv(xlslData.csvs[sheet]);
51+
}
52+
53+
// ---------- Parse CSV ----------
54+
function parseCsv(text) {
55+
const parsed = Papa.parse(text, { header: true }).data;
56+
parsedCsv = parsed;
57+
highlightedCsv = parsed;
58+
renderTable();
59+
}
60+
61+
// ---------- Convert Maven %regex[...] ----------
62+
function convertMavenRegex(input) {
63+
const lines = input.split('\n').filter(Boolean);
64+
return lines.map(line => {
65+
const match = line.match(/%regex\[(.*)\]/);
66+
if (match) return new RegExp(match[1].replace(/\$\{project\.build\.directory\}/g, 'target'), 'g');
67+
return null;
68+
}).filter(Boolean);
69+
}
70+
71+
// ---------- Render Table ----------
72+
function renderTable() {
73+
csvTable.innerHTML = '';
74+
if (!highlightedCsv || highlightedCsv.length === 0) return;
75+
76+
// Header
77+
const thead = document.createElement('thead');
78+
const trHead = document.createElement('tr');
79+
Object.keys(highlightedCsv[0]).forEach(col => {
80+
const th = document.createElement('th');
81+
th.innerHTML = col;
82+
trHead.appendChild(th);
83+
});
84+
thead.appendChild(trHead);
85+
csvTable.appendChild(thead);
86+
87+
// Body
88+
const tbody = document.createElement('tbody');
89+
highlightedCsv.forEach(row => {
90+
const tr = document.createElement('tr');
91+
Object.keys(row).forEach(col => {
92+
const td = document.createElement('td');
93+
td.innerHTML = row[col];
94+
tr.appendChild(td);
95+
});
96+
tbody.appendChild(tr);
97+
});
98+
csvTable.appendChild(tbody);
99+
}
100+
101+
// ---------- Highlight Sheet ----------
102+
document.getElementById('highlightSheet').addEventListener('click', () => {
103+
const regexList = convertMavenRegex(mavenRegex.value);
104+
highlightedCsv = parsedCsv.map(row => {
105+
const newRow = {};
106+
Object.keys(row).forEach((col, i) => {
107+
let cell = row[col];
108+
regexList.forEach((rx, j) => {
109+
cell = cell.replace(rx, match => `<span style="background:${COLORS[j % COLORS.length]}">${match}</span>`);
110+
});
111+
newRow[col] = cell;
112+
});
113+
return newRow;
114+
});
115+
renderTable();
116+
});
117+
118+
// ---------- Replace Sheet ----------
119+
document.getElementById('replaceSheet').addEventListener('click', () => {
120+
const regexList = convertMavenRegex(mavenRegex.value);
121+
const replaced = parsedCsv.map(row => {
122+
const newRow = {};
123+
Object.keys(row).forEach(col => {
124+
let cell = row[col];
125+
regexList.forEach(rx => { cell = cell.replace(rx, replaceWith.value); });
126+
newRow[col] = cell;
127+
});
128+
return newRow;
129+
});
130+
parsedCsv = replaced;
131+
highlightedCsv = replaced;
132+
xlslData.csvs[selectedSheet] = Papa.unparse(replaced);
133+
renderTable();
134+
});
135+
136+
// ---------- Highlight All Sheets ----------
137+
document.getElementById('highlightAll').addEventListener('click', () => {
138+
const regexList = convertMavenRegex(mavenRegex.value);
139+
Object.keys(xlslData.csvs).forEach(sheet => {
140+
const parsed = Papa.parse(xlslData.csvs[sheet], { header: true }).data;
141+
const highlighted = parsed.map(row => {
142+
const newRow = {};
143+
Object.keys(row).forEach((col, i) => {
144+
let cell = row[col];
145+
regexList.forEach((rx, j) => {
146+
cell = cell.replace(rx, match => `<span style="background:${COLORS[j % COLORS.length]}">${match}</span>`);
147+
});
148+
newRow[col] = cell;
149+
});
150+
return newRow;
151+
});
152+
xlslData.csvs[sheet] = Papa.unparse(highlighted);
153+
});
154+
parseCsv(xlslData.csvs[selectedSheet]);
155+
});
156+
157+
// ---------- Replace All Sheets ----------
158+
document.getElementById('replaceAll').addEventListener('click', () => {
159+
const regexList = convertMavenRegex(mavenRegex.value);
160+
Object.keys(xlslData.csvs).forEach(sheet => {
161+
const parsed = Papa.parse(xlslData.csvs[sheet], { header: true }).data;
162+
const replaced = parsed.map(row => {
163+
const newRow = {};
164+
Object.keys(row).forEach(col => {
165+
let cell = row[col];
166+
regexList.forEach(rx => { cell = cell.replace(rx, replaceWith.value); });
167+
newRow[col] = cell;
168+
});
169+
return newRow;
170+
});
171+
xlslData.csvs[sheet] = Papa.unparse(replaced);
172+
});
173+
parseCsv(xlslData.csvs[selectedSheet]);
174+
});
175+
176+
// ---------- Export Master CSV ----------
177+
document.getElementById('exportMaster').addEventListener('click', () => {
178+
let masterData = [];
179+
Object.keys(xlslData.csvs).forEach(sheet => {
180+
const parsed = Papa.parse(xlslData.csvs[sheet], { header: true }).data;
181+
const parsedWithSheet = parsed.map(row => ({ sheet, ...row }));
182+
masterData = masterData.concat(parsedWithSheet);
183+
});
184+
const csvString = Papa.unparse(masterData);
185+
const blob = new Blob([csvString], { type: 'text/csv' });
186+
const link = document.createElement('a');
187+
link.href = URL.createObjectURL(blob);
188+
link.download = "master.csv";
189+
link.click();
190+
});
191+
192+
// ---------- Save XLSL ----------
193+
document.getElementById('saveXlsl').addEventListener('click', () => {
194+
const blob = new Blob([JSON.stringify(xlslData, null, 2)], { type: 'application/json' });
195+
const link = document.createElement('a');
196+
link.href = URL.createObjectURL(blob);
197+
link.download = "AuraProjectUpdated.xlsl";
198+
link.click();
199+
});
200+
201+
// ---------- Update CSV Textarea ----------
202+
csvText.addEventListener('input', () => {
203+
parseCsv(csvText.value);
204+
});

0 commit comments

Comments
 (0)