Moving some UI files and create no UI elements. Also updates to sqlite plugin.

This commit is contained in:
Jason Tudisco 2022-01-29 01:26:33 -06:00
parent 54f16d0ac2
commit a88d85d3bc
12 changed files with 512 additions and 507 deletions

80
.gitignore vendored
View File

@ -1,40 +1,40 @@
# Logs # Logs
logs logs
*.log *.log
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
lerna-debug.log* lerna-debug.log*
.pnpm-debug.log* .pnpm-debug.log*
.npm .npm
# yarn v2 # yarn v2
.yarn/cache .yarn/cache
.yarn/unplugged .yarn/unplugged
.yarn/build-state.yml .yarn/build-state.yml
.yarn/install-state.gz .yarn/install-state.gz
.pnp.* .pnp.*
# Dependency directories # Dependency directories
node_modules/ node_modules/
jspm_packages/ jspm_packages/
# dotenv environment variable files # dotenv environment variable files
.env .env
.env.development.local .env.development.local
.env.test.local .env.test.local
.env.production.local .env.production.local
.env.local .env.local
# IDEs # IDEs
.vscode .vscode
.idea .idea
# parcel-bundler cache (https://parceljs.org/) # parcel-bundler cache (https://parceljs.org/)
.cache .cache
.parcel-cache .parcel-cache
# build directory # build directory
dist/ dist/

View File

@ -1,6 +1,6 @@
{ {
"extends": "@parcel/config-default", "extends": "@parcel/config-default",
"transformers": { "transformers": {
"*.riot": ["@riotjs/parcel-transformer-riot"] "*.riot": ["@riotjs/parcel-transformer-riot"]
} }
} }

View File

@ -1,21 +1,21 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'"> <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'"> <meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<title>Time Chain</title> <title>Time Chain</title>
<link rel="stylesheet" href="src/css/main.css"> <link rel="stylesheet" href="src/css/main.css">
</head> </head>
<body> <body>
<div class="loading" > <div class="loading" >
<h1>Time Chain!</h1> <h1>Time Chain!</h1>
<p>Time traveling your data! Comming soon...</p> <p>Time traveling your data! Comming soon...</p>
<p id="timestamp"></p> <p id="timestamp"></p>
<img src="src/img/chain2.svg" class="rotate"> <img src="src/img/chain2.svg" class="rotate">
</div> </div>
<script type="module" src="src/dist/start.js"></script> <script type="module" src="src/dist/start.js"></script>
</body> </body>
</html> </html>

View File

@ -1,31 +1,31 @@
body { body {
background-color: #333; background-color: #333;
color: whitesmoke; color: whitesmoke;
} }
.loading { .loading {
text-align: center; text-align: center;
padding: 5em; padding: 5em;
} }
.loading img { .loading img {
width: 30%; width: 30%;
} }
.loading p { .loading p {
font-weight: 700; font-weight: 700;
font-size: 1.2em; font-size: 1.2em;
} }
.rotate { .rotate {
animation: rotation 2s infinite linear; animation: rotation 2s infinite linear;
} }
@keyframes rotation { @keyframes rotation {
from { from {
transform: rotate(0deg); transform: rotate(0deg);
} }
to { to {
transform: rotate(359deg); transform: rotate(359deg);
} }
} }

View File

@ -1,35 +1,35 @@
const InterfaceRecord = { const InterfaceRecord = {
find(search,limit,offset){}, find(search,limit,offset){},
get(uuid){}, get(uuid){},
add(uuid,timestamp,content,mime,hash){}, add(uuid,timestamp,content,mime,hash){},
update(uuid,timestamp,content,mime,hash){}, update(uuid,timestamp,content,mime,hash){},
delete(uuid){}, delete(uuid){},
} }
const InterfaceFile = { const InterfaceFile = {
add(uuid_record,uuid,timestamp,content,mime,hash){}, add(uuid_record,uuid,timestamp,content,mime,hash){},
getByRecord(uuid_record){}, getByRecord(uuid_record){},
get(uuid){}, get(uuid){},
delete(uuid){}, delete(uuid){},
deleteRecord(uuid_record){}, deleteRecord(uuid_record){},
update(uuid,timestamp,content,mime,hash){} update(uuid,timestamp,content,mime,hash){}
} }
const InterfaceTag = { const InterfaceTag = {
add(uuid,word){}, add(uuid,word){},
delete(uuid){} delete(uuid){}
} }
const InterfaceTagLink = { const InterfaceTagLink = {
add(uuid_record,uuid_tag){}, add(uuid_record,uuid_tag){},
delete(uuid_record,uuid_tag){}, delete(uuid_record,uuid_tag){},
deleteTag(uuid){}, deleteTag(uuid){},
deleteRecord(uuid){} deleteRecord(uuid){}
} }
module.exports = { module.exports = {
InterfaceTagLink, InterfaceTagLink,
InterfaceTag, InterfaceTag,
InterfaceFile, InterfaceFile,
InterfaceRecord InterfaceRecord
} }

View File

@ -1,76 +1,76 @@
const { ipcMain } = require('electron'); const { ipcMain } = require('electron');
const {app} = require('electron'); const {app} = require('electron');
const config = app.getPath('userData'); const config = app.getPath('userData');
const Conf = require('conf'); const Conf = require('conf');
const config = new Conf(); const config = new Conf();
// ** Extra Data // ** Extra Data
ipcMain.on('timechain-config-dir', (event,arg) => { ipcMain.on('timechain-config-dir', (event,arg) => {
const configDir = app.getPath('userData'); const configDir = app.getPath('userData');
event.reply('timechain-config-dir-reply', configDir); event.reply('timechain-config-dir-reply', configDir);
}); });
// ** RECORD ** // ** RECORD **
ipcMain.on('timechain-record-add', (event, arg) => { ipcMain.on('timechain-record-add', (event, arg) => {
event.reply('timechain-record-add-reply', 'pong') event.reply('timechain-record-add-reply', 'pong')
}); });
ipcMain.on('timechain-record-delete', (event, arg) => { ipcMain.on('timechain-record-delete', (event, arg) => {
event.reply('timechain-record-delete-reply', 'pong') event.reply('timechain-record-delete-reply', 'pong')
}); });
ipcMain.on('timechain-record-update', (event, arg) => { ipcMain.on('timechain-record-update', (event, arg) => {
event.reply('timechain-record-update-reply', 'pong') event.reply('timechain-record-update-reply', 'pong')
}); });
ipcMain.on('timechain-record-find', (event, arg) => { ipcMain.on('timechain-record-find', (event, arg) => {
event.reply('timechain-record-find-reply', 'pong') event.reply('timechain-record-find-reply', 'pong')
}); });
// ** FILE ** // ** FILE **
ipcMain.on('timechain-file-find', (event, arg) => { ipcMain.on('timechain-file-find', (event, arg) => {
event.reply('timechain-file-find-reply', 'pong') event.reply('timechain-file-find-reply', 'pong')
}); });
ipcMain.on('timechain-file-add', (event, arg) => { ipcMain.on('timechain-file-add', (event, arg) => {
event.reply('timechain-file-add-reply', 'pong') event.reply('timechain-file-add-reply', 'pong')
}); });
ipcMain.on('timechain-file-update', (event, arg) => { ipcMain.on('timechain-file-update', (event, arg) => {
event.reply('timechain-file-update-reply', 'pong') event.reply('timechain-file-update-reply', 'pong')
}); });
ipcMain.on('timechain-file-delete', (event, arg) => { ipcMain.on('timechain-file-delete', (event, arg) => {
event.reply('timechain-file-delete-reply', 'pong') event.reply('timechain-file-delete-reply', 'pong')
}); });
// ** TAG ** // ** TAG **
ipcMain.on('timechain-tag-add', (event, arg) => { ipcMain.on('timechain-tag-add', (event, arg) => {
event.reply('timechain-tag-add-reply', 'pong') event.reply('timechain-tag-add-reply', 'pong')
}); });
ipcMain.on('timechain-tag-delete', (event, arg) => { ipcMain.on('timechain-tag-delete', (event, arg) => {
event.reply('timechain-tag-delete-reply', 'pong') event.reply('timechain-tag-delete-reply', 'pong')
}); });
// ** TAG LINK ** // ** TAG LINK **
ipcMain.on('timechain-taglink-add', (event, arg) => { ipcMain.on('timechain-taglink-add', (event, arg) => {
event.reply('timechain-taglink-add-reply', 'pong') event.reply('timechain-taglink-add-reply', 'pong')
}); });
ipcMain.on('timechain-taglink-delete', (event, arg) => { ipcMain.on('timechain-taglink-delete', (event, arg) => {
event.reply('timechain-taglink-delete-reply', 'pong') event.reply('timechain-taglink-delete-reply', 'pong')
}); });
ipcMain.on('timechain-taglink-deleteTag', (event, arg) => { ipcMain.on('timechain-taglink-deleteTag', (event, arg) => {
event.reply('timechain-taglink-deleteTag-reply', 'pong') event.reply('timechain-taglink-deleteTag-reply', 'pong')
}); });
ipcMain.on('timechain-taglink-deleteRecord', (event, arg) => { ipcMain.on('timechain-taglink-deleteRecord', (event, arg) => {
event.reply('timechain-taglink-deleteRecord-reply', 'pong') event.reply('timechain-taglink-deleteRecord-reply', 'pong')
}); });

View File

@ -1,264 +1,264 @@
const Interface = require("es6-interface"); const Interface = require("es6-interface");
const {InterfaceRecord,InterfaceFile,InterfaceTag,InterfaceTagLink} = require("./interfaces"); const {InterfaceRecord,InterfaceFile,InterfaceTag,InterfaceTagLink} = require("./interfaces");
let db = null; let db = null;
const connectToDatabase = (path)=>{ const connectToDatabase = (path)=>{
db = require('better-sqlite3')(path, {}); db = require('better-sqlite3')(path, {});
} }
class TimeChainDataSqliteTag extends Interface(InterfaceTag) { class TimeChainDataSqliteTag extends Interface(InterfaceTag) {
constructor(){ constructor(){
} }
add(uuid,word){ add(uuid,word){
} }
delete(uuid){ delete(uuid){
} }
} }
class TimeChainDataSqliteTagLink extends Interface(InterfaceTagLink) { class TimeChainDataSqliteTagLink extends Interface(InterfaceTagLink) {
constructor(){ constructor(){
} }
} }
class TimeChainDataSqliteFile extends Interface(InterfaceFile) { class TimeChainDataSqliteFile extends Interface(InterfaceFile) {
constructor(){ constructor(){
const table = `CREATE TABLE IF NOT EXISTS "files" ( const table = `CREATE TABLE IF NOT EXISTS "files" (
"uuid" TEXT UNIQUE, "uuid" TEXT UNIQUE,
"uuid_record" TEXT NOT NULL, "uuid_record" TEXT NOT NULL,
"timestamp" INTEGER NOT NULL, "timestamp" INTEGER NOT NULL,
"content" BLOB NOT NULL, "content" BLOB NOT NULL,
"mime" TEXT NOT NULL, "mime" TEXT NOT NULL,
"hash" TEXT, "hash" TEXT,
"created_at" INTEGER NOT NULL, "created_at" INTEGER NOT NULL,
"updated_at" INTEGER NOT NULL, "updated_at" INTEGER NOT NULL,
PRIMARY KEY("uuid") PRIMARY KEY("uuid")
);`; );`;
const table_idx = ` const table_idx = `
CREATE INDEX IF NOT EXISTS "files_idx_record" ON "files" ( CREATE INDEX IF NOT EXISTS "files_idx_record" ON "files" (
"uuid_record" "uuid_record"
); );
CREATE INDEX IF NOT EXISTS "files_idx_time" ON "files" ( CREATE INDEX IF NOT EXISTS "files_idx_time" ON "files" (
"timestamp" DESC "timestamp" DESC
);`; );`;
if(!db){ if(!db){
throw new Error("Database is not connected"); throw new Error("Database is not connected");
} }
db.exec(table + "\n" + table_idx); db.exec(table + "\n" + table_idx);
this.db = db; this.db = db;
} }
get table_insert() { get table_insert() {
if(!this._table_insert){ if(!this._table_insert){
this._table_insert = db.prepare(`INSERT INTO files (uuid,uuid_record,timestamp,content,mime,hash,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?)`); this._table_insert = db.prepare(`INSERT INTO files (uuid,uuid_record,timestamp,content,mime,hash,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?)`);
} }
return this._table_insert; return this._table_insert;
} }
get table_update() { get table_update() {
if(!this._table_update){ if(!this._table_update){
this._table_update = db.prepare(`UPDATE files SET timestamp = ?, content = ?, mime = ? hash = ?, updated_at = ? WHERE uuid = ?`); this._table_update = db.prepare(`UPDATE files SET timestamp = ?, content = ?, mime = ? hash = ?, updated_at = ? WHERE uuid = ?`);
} }
return this._table_update; return this._table_update;
} }
get table_delete() { get table_delete() {
if(!this._table_delete){ if(!this._table_delete){
this._table_delete = db.prepare(`DELETE FROM files WHERE uuid = ?`); this._table_delete = db.prepare(`DELETE FROM files WHERE uuid = ?`);
} }
return this._table_delete; return this._table_delete;
} }
get table_delete_record() { get table_delete_record() {
if(!this._table_delete_record){ if(!this._table_delete_record){
this._table_delete_record = db.prepare(`DELETE FROM files WHERE uuid_record = ?`); this._table_delete_record = db.prepare(`DELETE FROM files WHERE uuid_record = ?`);
} }
return this._table_delete_record; return this._table_delete_record;
} }
get table_find_one() { get table_find_one() {
if(!this._table_find_one){ if(!this._table_find_one){
this._table_find_one = db.prepare(`SELECT * FROM files WHERE uuid = ?`); this._table_find_one = db.prepare(`SELECT * FROM files WHERE uuid = ?`);
} }
return this._table_find_one; return this._table_find_one;
} }
get table_find_record(){ get table_find_record(){
if(!this._table_find_record){ if(!this._table_find_record){
this._table_find_record = db.prepare(`SELECT * FROM files WHERE uuid_record = ?`); this._table_find_record = db.prepare(`SELECT * FROM files WHERE uuid_record = ?`);
} }
return this._table_find_record; return this._table_find_record;
} }
add(uuid_record,uuid,timestamp,content,mime,hash){ add(uuid_record,uuid,timestamp,content,mime,hash){
return new Promise(resolve=>{ return new Promise(resolve=>{
const dt = Math.floor(Date.now()); const dt = Math.floor(Date.now());
const res = this.table_insert.exec(uuid,uuid_record,timestamp,content,mime,hash,dt,dt); const res = this.table_insert.exec(uuid,uuid_record,timestamp,content,mime,hash,dt,dt);
return resolve(res?.changes); return resolve(res?.changes);
}); });
} }
getByRecord(uuid_record){ getByRecord(uuid_record){
return new Promise(resolve => { return new Promise(resolve => {
const res = this.table_find_record.get(uuid_record); const res = this.table_find_record.get(uuid_record);
return resolve(res); return resolve(res);
}); });
} }
get(uuid){ get(uuid){
return new Promise(resolve => { return new Promise(resolve => {
const res = this.table_fine_one.get(uuid); const res = this.table_fine_one.get(uuid);
return resolve(res); return resolve(res);
}); });
} }
delete(uuid){ delete(uuid){
return new Promise(resolve=>{ return new Promise(resolve=>{
const res = this.table_delete.exec(uuid); const res = this.table_delete.exec(uuid);
return resolve(res?.changes); return resolve(res?.changes);
}) })
} }
deleteRecord(){ deleteRecord(){
return new Promise(resolve=>{ return new Promise(resolve=>{
const res = this.table_delete_record.exec(uuid_record); const res = this.table_delete_record.exec(uuid_record);
return resolve(res?.changes); return resolve(res?.changes);
}) })
} }
update(uuid,timestamp,content,mime,hash){ update(uuid,timestamp,content,mime,hash){
return new Promise(resolve=>{ return new Promise(resolve=>{
const res = this.table_update.exec(timestamp,content,mime,hash,uuid); const res = this.table_update.exec(timestamp,content,mime,hash,uuid);
return resolve(res?.changes); return resolve(res?.changes);
}) })
} }
} }
class TimeChainDataSqliteRecord extends Interface(InterfaceRecord) { class TimeChainDataSqliteRecord extends Interface(InterfaceRecord) {
constructor(){ constructor(){
//TODO: Create Tables Here if not exist //TODO: Create Tables Here if not exist
const table = `CREATE TABLE IF NOT EXISTS "records" ( const table = `CREATE TABLE IF NOT EXISTS "records" (
"uuid" TEXT NOT NULL UNIQUE, "uuid" TEXT NOT NULL UNIQUE,
"timestamp" INTEGER NOT NULL, "timestamp" INTEGER NOT NULL,
"content" TEXT NOT NULL, "content" TEXT NOT NULL,
"mime" TEXT NOT NULL, "mime" TEXT NOT NULL,
"hash" TEXT, "hash" TEXT,
"created_at" INTEGER NOT NULL, "created_at" INTEGER NOT NULL,
"updated_at" INTEGER NOT NULL, "updated_at" INTEGER NOT NULL,
PRIMARY KEY("uuid") PRIMARY KEY("uuid")
);`; );`;
const table_idx = `CREATE INDEX IF NOT EXISTS "records_idx_timestamp" ON "records" ( const table_idx = `CREATE INDEX IF NOT EXISTS "records_idx_timestamp" ON "records" (
"timestamp" DESC "timestamp" DESC
);` );`
if(!db){ if(!db){
throw new Error("Database is not connected"); throw new Error("Database is not connected");
} }
db.exec(table + "\n" + table_idx); db.exec(table + "\n" + table_idx);
this.db = db; this.db = db;
} }
get table_insert() { get table_insert() {
if(!this._table_insert){ if(!this._table_insert){
this._table_insert = db.prepare(`INSERT INTO records (uuid,timestamp,content,mime,hash,created_at,updated_at) VALUES (?,?,?,?,?,?,?)`); this._table_insert = db.prepare(`INSERT INTO records (uuid,timestamp,content,mime,hash,created_at,updated_at) VALUES (?,?,?,?,?,?,?)`);
} }
return this._table_insert; return this._table_insert;
} }
get table_update(){ get table_update(){
if(!this._table_update){ if(!this._table_update){
this._table_update = db.prepare(`UPDATE records SET timestamp = ?, content = ?, mime = ?, hash = ? updated_at = ? WHERE uuid = ?`); this._table_update = db.prepare(`UPDATE records SET timestamp = ?, content = ?, mime = ?, hash = ? updated_at = ? WHERE uuid = ?`);
} }
return this._table_update; return this._table_update;
} }
get table_delete(){ get table_delete(){
if(!this._table_delete){ if(!this._table_delete){
this._table_delete = db.prepare(`DELETE FROM records WHERE uuid = ?`); this._table_delete = db.prepare(`DELETE FROM records WHERE uuid = ?`);
} }
return this._table_delete; return this._table_delete;
} }
get table_fine_one(){ get table_fine_one(){
if(!this._table_fine_one){ if(!this._table_fine_one){
this._table_fine_one = db.prepare(`SELECT * FROM records WHERE uuid = ?`); this._table_fine_one = db.prepare(`SELECT * FROM records WHERE uuid = ?`);
} }
return this._table_fine_one; return this._table_fine_one;
} }
add(uuid,timestamp,content,mime,hash){ add(uuid,timestamp,content,mime,hash){
return new Promise(resolve=>{ return new Promise(resolve=>{
const dt = Math.floor(Date.now()); const dt = Math.floor(Date.now());
const res = this.table_insert.run(uuid,timestamp,content,mime,hash,dt,dt); const res = this.table_insert.run(uuid,timestamp,content,mime,hash,dt,dt);
return resolve(res?.changes); return resolve(res?.changes);
}); });
} }
get(uuid){ get(uuid){
return new Promise(resolve=>{ return new Promise(resolve=>{
const rec = this.table_fine_one.get(uuid); const rec = this.table_fine_one.get(uuid);
return resolve(rec); return resolve(rec);
}); });
} }
find(search,sort=null,limit=undefined,offset=0){ find(search,sort=null,limit=undefined,offset=0){
//TODO: add logic for seach and sort (Currently does nothing) //TODO: add logic for seach and sort (Currently does nothing)
return new Promise(resolve=>{ return new Promise(resolve=>{
const rescount = this.db.prepare("SELECT count(*) as cnt FROM records").get(); const rescount = this.db.prepare("SELECT count(*) as cnt FROM records").get();
if(limit){ if(limit){
const res = this.db.prepare("SELECT * FROM records ORDER BY timestamp DESC LIMIT ? OFFSET ?").all(limit,offset); const res = this.db.prepare("SELECT * FROM records ORDER BY timestamp DESC LIMIT ? OFFSET ?").all(limit,offset);
}else{ }else{
const res = this.db.prepare("SELECT * FROM records ORDER BY timestamp DESC").all(); const res = this.db.prepare("SELECT * FROM records ORDER BY timestamp DESC").all();
} }
return resolve({ return resolve({
data: res, data: res,
count: rescount?.cnt, count: rescount?.cnt,
limit: limit, limit: limit,
offset: offset offset: offset
}); });
}) })
} }
delete(uuid){ delete(uuid){
return new Promise(resolve=>{ return new Promise(resolve=>{
const res = this.table_delete.exec(uuid); const res = this.table_delete.exec(uuid);
return resolve(res?.changes); return resolve(res?.changes);
}); });
} }
update(uuid,content,mime,hash){ update(uuid,content,mime,hash){
return new Promise(resolve=>{ return new Promise(resolve=>{
const dt = Math.floor(Date.now()); const dt = Math.floor(Date.now());
const res = this.table_update.exec(content,mime,hash,dt,uuid); const res = this.table_update.exec(content,mime,hash,dt,uuid);
return resolve(res?.changes); return resolve(res?.changes);
}) })
} }
} }
class TimeChainDataSqlite { class TimeChainDataSqlite {
} }

5
src/ui/app.riot Normal file
View File

@ -0,0 +1,5 @@
<app>
</app>

View File

0
src/ui/timer-ctrl.riot Normal file
View File

View File

@ -1,34 +1,34 @@
<timestamp> <timestamp>
<div class="timestamp"> <div class="timestamp">
<div class="timestamp-icon"> <div class="timestamp-icon">
<div class="timestamp-text">{ state.time_text }</div> <div class="timestamp-text">{ state.time_text }</div>
</div> </div>
<script> <script>
const pubsub = require('pubsub-js'); const pubsub = require('pubsub-js');
const dayjs = require('dayjs'); const dayjs = require('dayjs');
export default { export default {
state: { state: {
time_text: "", time_text: "",
format: "long" format: "long"
}, },
onMounted(){ onMounted(){
this.start(); this.start();
}, },
start(){ start(){
setTimeout(()=>{ setTimeout(()=>{
this.makeString(); this.makeString();
this.start(); this.start();
},200); },200);
}, },
makeString(){ makeString(){
if(this.state.format=="long"){ if(this.state.format=="long"){
this.update({time_text:dayjs().format("MMMM D, YYYY h:mm:ss A")}); this.update({time_text:dayjs().format("MMMM D, YYYY h:mm:ss A")});
} }
} }
}; };
</script> </script>
</timestamp> </timestamp>

View File

@ -1,7 +1,7 @@
import Timestamp from './timestamp.riot' import Timestamp from './src/ui/timestamp.riot'
import { component } from 'riot' import { component } from 'riot'
component(Timestamp)(document.getElementById('timestamp')) component(Timestamp)(document.getElementById('timestamp'))
console.log("yes!"); console.log("yes!");