Skip to content

Commit

Permalink
Merge pull request #102 from saood06/main
Browse files Browse the repository at this point in the history
Allow importing multiple files at once and only keep active session in sessions object
  • Loading branch information
lmg-anon authored Dec 20, 2024
2 parents 8f56183 + 5e9a0ba commit 36cbc49
Show file tree
Hide file tree
Showing 2 changed files with 171 additions and 19 deletions.
144 changes: 125 additions & 19 deletions mikupad.html
Original file line number Diff line number Diff line change
Expand Up @@ -2455,21 +2455,33 @@
const importSession = () => {
const fileInput = document.createElement("input");
fileInput.type = 'file';
fileInput.multiple = true;
fileInput.style.display = 'none';
fileInput.onchange = (e) => {
const file = e.target.files[0];
if (!file)
fileInput.onchange = async (e) => {
const files = e.target.files;
if (files.length === 0)
return;
const reader = new FileReader();
reader.onload = (e) => {
const contents = e.target.result;
fileInput.func(contents);

const sortedFiles = Array.from(files).sort((a, b) => a.lastModified - b.lastModified);

const reader = new FileReader();
let lastNewId = null;

for (const file of sortedFiles) {
await new Promise((resolve, reject) => {
reader.onload = async (e) => {
lastNewId = await sessionStorage.createSessionFromObject(JSON.parse(e.target.result), false);
resolve();
};
reader.onerror = (e) => {
reject(e);
};
reader.readAsText(file);
});
}
if (lastNewId !== null) {
await sessionStorage.switchSession(lastNewId);
}
reader.readAsText(file);
};
fileInput.func = async (text) => {
const newId = await sessionStorage.createSessionFromObject(JSON.parse(text), false);
await sessionStorage.switchSession(newId);
};
document.body.appendChild(fileInput);
fileInput.click();
Expand Down Expand Up @@ -4629,6 +4641,30 @@
});
}

async loadSessionInfoFromDatabase(db, storeName) {
return new Promise((resolve, reject) => {
const tx = db.transaction(storeName, 'readonly');
const store = tx.objectStore(storeName);
const request = store.openCursor();

let allTables = {};

request.onsuccess = async (event) => {
const cursor = event.target.result;
if (cursor) {
if (cursor.key !== 'nextSessionId' && cursor.key !== 'selectedSessionId') {
allTables[cursor.key] = cursor.value.name;
}
cursor.continue();
} else {
resolve(allTables);
}
};
request.onerror = () => reject(request.error);
});
}


async saveToDatabase(db, storeName, key, data) {
return new Promise((resolve, reject) => {
const tx = db.transaction(storeName, 'readwrite');
Expand All @@ -4640,6 +4676,27 @@
});
}

async renameSessionInDatabase(db, storeName, key, newName) {
return new Promise((resolve, reject) => {
const tx = db.transaction(storeName, 'readwrite');
const store = tx.objectStore(storeName);
const getRequest = store.get(key);

getRequest.onsuccess = async () => {
const sessionData = getRequest.result;
if (sessionData) {
sessionData.name = newName;
const putRequest = store.put(sessionData, key);
putRequest.onsuccess = () => resolve();
putRequest.onerror = () => reject(putRequest.error);
} else {
reject(new Error(`Session with key '${key}' not found`));
}
};
getRequest.onerror = () => reject(request.error);
});
}

async deleteFromDatabase(db, storeName, key) {
return new Promise((resolve, reject) => {
const tx = db.transaction(storeName, 'readwrite');
Expand Down Expand Up @@ -4716,6 +4773,18 @@
});
}

async loadSessionInfoFromDatabase(db, storeName) {
return new Promise(async (resolve, reject) => {
const res = await db("/sessions", { storeName });
if (!res.ok) {
reject(res.status);
return;
}
const { result } = await res.json();
resolve(result);
});
}

async saveToDatabase(db, storeName, key, data) {
return new Promise(async (resolve, reject) => {
const res = await db("/save", { storeName, key, data });
Expand All @@ -4728,6 +4797,18 @@
});
}

async renameSessionInDatabase(db, storeName, key, newName) {
return new Promise(async (resolve, reject) => {
const res = await db("/rename", { storeName, key, newName });
if (!res.ok) {
reject(res.status);
return;
}
const { result } = await res.json();
resolve(result);
});
}

async deleteFromDatabase(db, storeName, key) {
return new Promise(async (resolve, reject) => {
const res = await db("/delete", { storeName, key });
Expand Down Expand Up @@ -4804,6 +4885,15 @@
}
}

async loadSessionInfoFromDatabase(db) {
try {
return await this.dbAdapter.loadSessionInfoFromDatabase(db, this.storeName);
} catch (e) {
this.dispatchErrorEvent(e);
throw e;
}
}

async saveToDatabase(db, key, data) {
try {
return await this.dbAdapter.saveToDatabase(db, this.storeName, key, data);
Expand All @@ -4813,6 +4903,15 @@
}
}

async renameSessionInDatabase(db, key, newName) {
try {
return await this.dbAdapter.renameSessionInDatabase(db, this.storeName, key, newName);
} catch (e) {
this.dispatchErrorEvent(e);
throw e;
}
}

async deleteFromDatabase(db, key) {
try {
return await this.dbAdapter.deleteFromDatabase(db, this.storeName, key);
Expand Down Expand Up @@ -4939,11 +5038,9 @@
}

async loadSessions(db) {
const sessions = await this.loadAllFromDatabase(db);
for (const [key, value] of Object.entries(sessions)) {
if (key !== 'nextSessionId' && key !== 'selectedSessionId') {
this.sessions[key] = value;
}
const sessions = await this.loadSessionInfoFromDatabase(db);
for (const [key, name] of Object.entries(sessions)) {
this.sessions[key] = { name: name };
}
if (Object.keys(this.sessions).length === 0) {
if (!await this.migrateSessions()) {
Expand All @@ -4967,11 +5064,16 @@
async switchSession(sessionId) {
if (!this.sessions[sessionId])
return;


//Clear data of old session in order to minimize memory usage.
if (this.sessions[this.selectedSession] && this.sessions[this.selectedSession]['name'])
this.sessions[this.selectedSession] = { name: this.sessions[this.selectedSession]['name'] };

const db = await this.openDatabase();
await this.saveToDatabase(db, 'selectedSessionId', +sessionId);

this.selectedSession = +sessionId;
this.sessions[this.selectedSession] = (await this.loadFromDatabase(db, this.selectedSession));

this.dispatchChangeEvent();
this.dispatchSessionChangeEvent();
Expand All @@ -4981,7 +5083,7 @@
this.sessions[sessionId]['name'] = renameSessionName;

const db = await this.openDatabase();
await this.saveToDatabase(db, sessionId, this.sessions[sessionId]);
await this.renameSessionInDatabase(db, sessionId, renameSessionName);

this.dispatchChangeEvent();
}
Expand Down Expand Up @@ -5038,6 +5140,10 @@
const db = await this.openDatabase();
await this.saveToDatabase(db, newId, this.sessions[newId]);

//Clear data of the session in order to minimize memory usage.
if (this.sessions[newId] && this.sessions[newId]['name'])
this.sessions[newId] = { name: this.sessions[newId]['name'] };

onchange?.();
return newId;
}
Expand Down
46 changes: 46 additions & 0 deletions server/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,27 @@ app.post('/save', (req, res) => {
});
});

// POST route to update session name
app.post('/rename', (req, res) => {
const { storeName, key, newName } = req.body;
const normStoreName = normalizeStoreName(storeName);
db.run(
`
UPDATE ${normStoreName}
SET data = json_set(data, '$.name', ?)
WHERE key = ?
`,
[newName, key],
(err) => {
if (err) {
res.status(500).json({ ok: false, message: 'Error updating the database' });
} else {
res.json({ ok: true, result: 'Session renamed successfully' });
}
}
);
});

// POST route to get all rows from a table
app.post('/all', (req, res) => {
const { storeName } = req.body;
Expand All @@ -254,6 +275,31 @@ app.post('/all', (req, res) => {
});
});

// POST route to get session info
app.post('/sessions', (req, res) => {
const { storeName } = req.body;
const normStoreName = normalizeStoreName(storeName);
db.all(
`
SELECT key, json_extract(data, '$.name') AS name
FROM ${normStoreName}
WHERE key NOT IN ('selectedSessionId', 'nextSessionId')
`,
[],
(err, rows) => {
if (err) {
res.status(500).json({ ok: false, message: 'Error querying the database' });
} else {
const sessions = {};
rows.forEach((row) => {
sessions[row.key] = row.name;
});
res.json({ ok: true, result: sessions });
}
}
);
});

// POST route to delete a session
app.post('/delete', (req, res) => {
const { storeName, key } = req.body;
Expand Down

0 comments on commit 36cbc49

Please sign in to comment.