diff --git a/client/main.js b/client/main.js index 24048160922e65d0abe138e35f6394383dd4f208..2d1d9db1973ba58428dff9bcb281f47c9d1ad94a 100644 --- a/client/main.js +++ b/client/main.js @@ -4,7 +4,7 @@ const port = 3000; function launcher() { const app = express(); - logger.debug(`Express started on localhost:${port}`); + logger.debug('express', `Express started on localhost:${port}`); var publicRouter = require('./routes/public.js'); @@ -14,7 +14,7 @@ function launcher() { app.use('/', publicRouter); app.listen(port, () => { - logger.info(`Express listening on port ${port}`); + logger.info('express', `Express listening on port ${port}`); }); } diff --git a/common/db.js b/common/db.js index c0a666547df546f283f3b9c2ff03f47862836c2d..6d8b1a3636579b76e369804a2aaf99557a22489a 100644 --- a/common/db.js +++ b/common/db.js @@ -46,28 +46,32 @@ class KaraDatabase { constructor(karaPath) { this.m_karaPath = karaPath; this.m_db = new sqlite3.Database(this.m_karaPath); - logger.log('info', 'Create database from file ' + karaPath); + logger.info('db', 'Create database from file ' + karaPath); } /* Call this as a destructor */ close() { this.m_db.close(); - logger.log('info', `Close database ${this.m_karaPath}`); + logger.info('db', `Close database ${this.m_karaPath}`); } /* Search from the kara table, a string. Can be anything (query, name, * language, source, etc). - * - queryString: String => a promize, callback with [(id: Int, string, - * cat, type, language, author, title, source)] */ - search(queryString) { + * - queryString: String + * - limit: Int | null -> maximal number of results + * - offset: Int | null -> offset in the search + * => a promize, callback with [(id: Int, string, cat, type, language, author, title, source)] */ + search(queryString, offset = null, limit = null) { var __ret = []; - let __sqlQuery = `SELECT id, string, + var __sqlQuery = `SELECT id, string, category AS cat, (song_type || song_number) AS type, language, author_name AS author, song_name AS title, source_name AS source FROM kara WHERE string LIKE ? OR author_name COLLATE nocase = ?`; + if (offset != null && limit != null) + __sqlQuery += ` LIMIT ${offset}, ${limit}`; function __getRecords(db) { return new Promise(resolv => { @@ -76,7 +80,7 @@ class KaraDatabase { [`%${queryString}%`, queryString], (err, rows) => { if (err) { - logger.error(err); + logger.error('db', err); throw err; } rows.forEach(row => { @@ -92,22 +96,25 @@ class KaraDatabase { } /* List all the kara in the db. - * => a promize, callback with [(id: Int, string, cat, type, language, - * author, title, source)] */ - all() { + * - limit: Int | null -> maximal number of results + * - offset: Int | null -> offset in the search + * => a promize, callback with [(id: Int, string, cat, type, language, author, title, source)] */ + all(offset = null, limit = null) { var __ret = []; - let __sqlQuery = `SELECT id, string, + var __sqlQuery = `SELECT id, string, category AS cat, (song_type || song_number) AS type, language, author_name AS author, song_name AS title, source_name AS source - FROM kara;`; + FROM kara`; + if (offset != null && limit != null) + __sqlQuery += ` LIMIT ${offset}, ${limit}`; function __getRecords(db) { return new Promise(resolv => { db.all(__sqlQuery, [], (err, rows) => { if (err) { - logger.error(err); + logger.error('db', err); throw err; } rows.forEach(row => { @@ -122,9 +129,9 @@ class KaraDatabase { } /* List all the next karas in the queue. - * - first: Integer => the first kara to consider being in the queue (the - * current one, starts ad 0) - * - count: Integer => the number of karas of the queue to load. + * - first: Integer => the first kara to consider being in the queue (the + * current one, starts ad 0) + * - count: Integer => the number of karas of the queue to load. * => a promize, callback with [(id: Int, string, cat, type, language, * author, title, source, position: Int)] */ queue(first, count) { @@ -147,7 +154,7 @@ class KaraDatabase { return new Promise(resolv => { db.all(__sqlQuery, [], (err, rows) => { if (err) { - logger.error(err); + logger.error('db', err); throw err; } rows.forEach(row => { diff --git a/common/lkt.js b/common/lkt.js index 916f2b9dbd9ed91d850c4b089519e5767aaabcbf..903ced8456d558956af9aa1f47ed6cb005f72169 100644 --- a/common/lkt.js +++ b/common/lkt.js @@ -30,28 +30,35 @@ class LktClient { writable: true, }; - logger.debug('Creating the lektor client'); + logger.debug('lkt', 'Creating the lektor client'); this.m_socket.setTimeout(3000); this.m_socket.setEncoding('utf8'); this.m_socket.on('timeout', () => { logger.error( + 'lkt', `Got timeout while connecting to localhost:${this.m_port}` ); this.m_socket.end(); }); this.m_socket.on('ready', () => { - logger.debug(`Ready to use socker with localhost:${this.m_port}`); + logger.debug( + 'lkt', + `Ready to use socker with localhost:${this.m_port}` + ); this.m_online = true; }); this.m_socket.on('end', () => { - logger.info(`Disconnected from server localhost:${this.m_port}`); + logger.info( + 'lkt', + `Disconnected from server localhost:${this.m_port}` + ); this.m_online = false; }); this.m_socket.on('error', err => { - logger.error(`${err}`); + logger.error('lkt', `${err}`); if (this.m_online) { this.m_socket.destroy(); this.m_online = false; @@ -59,12 +66,12 @@ class LktClient { }); this.m_socket.on('close', () => { - logger.info(`Socket localhost:${this.m_port} closed`); + logger.info('lkt', `Socket localhost:${this.m_port} closed`); this.m_online = false; }); this.m_socket.connect(sockopt, () => { - logger.info(`Socket connected to localhost:${this.m_port}`); + logger.info('lkt', `Socket connected to localhost:${this.m_port}`); this.m_online = true; }); @@ -75,10 +82,10 @@ class LktClient { * Note: Prefere using the static methods. */ close() { if (this.m_online) { - logger.debug('Requesting socket shutdown'); + logger.debug('lkt', 'Requesting socket shutdown'); this.m_socket.destroy(); } else { - logger.debug('Socket already closed'); + logger.debug('lkt', 'Socket already closed'); } this.m_closed = true; } diff --git a/common/logger.js b/common/logger.js index 995a80717855bdf7ddd642d78b58a6449830e3cb..29a747676f1022f00291c433e5eb94401d206772 100644 --- a/common/logger.js +++ b/common/logger.js @@ -18,7 +18,6 @@ const __loggerCustomLevels = { levels: { debug: 3, info: 2, - warn: 1, warning: 1, error: 0, }, @@ -31,7 +30,7 @@ const __loggerCustomLevels = { }, }; -var logger = winston.createLogger({ +var __logger = winston.createLogger({ transports: [ new winston.transports.File({ eol: '\n', @@ -55,6 +54,23 @@ var logger = winston.createLogger({ ), }); -Object.assign(logger, { logfile: './lektor-app.log' }); +var logger = { + logfile: './lektor-app.log', + debug: (cat, lg) => { + __logger.debug(`${cat.padEnd(10)} | ${lg}`); + }, + info: (cat, lg) => { + __logger.info(`${cat.padEnd(10)} | ${lg}`); + }, + warn: (cat, lg) => { + __logger.warning(`${cat.padEnd(10)} | ${lg}`); + }, + warning: (cat, lg) => { + __logger.warning(`${cat.padEnd(10)} | ${lg}`); + }, + error: (cat, lg) => { + __logger.error(`${cat.padEnd(10)} | ${lg}`); + }, +}; module.exports = global.logger = module.exports = logger; diff --git a/instance/index.html b/instance/index.html index ef0eaf399c3820e1ea5fee33011542da3a4caf63..bb77bf419e40a1d22604be937b4ffc304aa30998 100644 --- a/instance/index.html +++ b/instance/index.html @@ -3,8 +3,9 @@ <head> <meta charset="UTF-8" /> <title>Lektor App</title> - <!-- https://electronjs.org/docs/tutorial/security#csp-meta-tag --> - <script src="../style/jquery/jquery-3.5.1.js"></script> + <script> + window.$ = window.jQuery = require('../style/jquery/jquery-3.5.1.js'); + </script> <script src="../style/bootstrap-4.5.2-dist/js/bootstrap.min.js"></script> <link rel="stylesheet" @@ -21,6 +22,7 @@ display: none; } </style> + <script></script> </head> <body> <div id="mainFrame" class="container-fluid"> @@ -29,14 +31,14 @@ class="d-flex flex-row bd-highlight mb-3 row card" ></div> <div id="panelWrapper" class="row"> - <div + <ul id="panelLeft" class="col panel d-flex flex-column bd-highlight mb-3" - ></div> - <div + ></ul> + <ul id="panelRight" class="col panel d-flex flex-column bd-highlight mb-3" - ></div> + ></ul> </div> <div id="progressBar" diff --git a/instance/main.js b/instance/main.js index 9d491f0de62d9245859b0f1ab256f2655ea9b660..bf1f6b234724d12f962bf941953246c05e68b706 100644 --- a/instance/main.js +++ b/instance/main.js @@ -1,4 +1,5 @@ const { ipcRenderer } = require('electron'); +const ejs = require('ejs'); const logger = require('../common/logger.js'); /* prettier-ignore */ @@ -13,6 +14,7 @@ const buttonList = [ [ 'sleft', `<i class="fas fa-tag"></i>`, 'selectPlaylist', 'Playlist search' ], [ 'sleft', `<i class="fas fa-bookmark"></i>`, 'selectPool', 'Pool search' ], + [ 'right', `<i class="fas fa-compass"></i>`, 'openKurisu', 'Kurisu in a new page' ], [ 'right', `<i class="fas fa-user-friends"></i>`, 'openUserView', 'Open client view' ], [ 'right', `<i class="fas fa-music"></i>`, 'openMdtView', 'Open metadata view' ], [ 'right', `<i class="fas fa-sync-alt"></i>`, 'reloadQueue', 'Reload the queue' ], @@ -42,6 +44,7 @@ window.onload = () => { addIpcToButton('selectPool', ['select-pool']); addIpcToButton('openMdtView', ['select-mdt']); + addIpcToButton('openKurisu', ['toggle-kurisu']); addIpcToButton('openUserView', ['toggle-client-view']); addIpcToButton('reloadQueue', ['reload-queue-request']); addIpcToButton('reloadDb', ['reload-db-request', 'reload-queue-request']); @@ -49,11 +52,31 @@ window.onload = () => { logger.debug('Window loaded'); setTimeout(()=>ipcRenderer.send('reload-queue-request'),500); setInterval(()=>ipcRenderer.send('verify-queue-reloaded-request'),1000); -} + logger.debug('instance', 'Window loaded'); + + $('#filterInput').on('keypress', e => { + /* On 'Return'. */ + if (e.which != 13) return; + ipcRenderer.send('reload-db-request', $('#filterInput').val()); + }); + + document.addEventListener( + 'keydown', + e => { + if (e.ctrlKey && e.keyCode == 70) { + logger.debug('instance', 'Focus find bar'); + $('#filterInput').focus(); + } + }, + false + ); +}; + /* Create the button list */ function createButtonList(list) { function action(ipc, argument) { logger.error( + 'instance', 'The action function builder for control buttons is not implemented' ); } @@ -66,6 +89,7 @@ function createButtonList(list) { <button id="${btn[2]}" type="button" class="btn btn-primary p-2 bd-highlight" data-toggle="tooltip" data-placement="bottom" title="${btn[3]}">${btn[1]}</button>`; logger.debug( + 'instance', `Create button for "${btn[1]}" with id "${btn[2]} at the left"` ); } else if (btn[0] == 'right') { @@ -73,6 +97,7 @@ function createButtonList(list) { <button id="${btn[2]}" type="button" class="btn btn-secondary p-2 bd-highlight" data-toggle="tooltip" data-placement="bottom" title="${btn[3]}">${btn[1]}</button>`; logger.debug( + 'instance', `Create button for "${btn[1]}" with id "${btn[2]} at the right"` ); } else if (btn[0] == 'sleft') { @@ -80,62 +105,59 @@ function createButtonList(list) { <button id="${btn[2]}" type="button" class="btn btn-secondary p-2 bd-highlight" data-toggle="tooltip" data-placement="bottom" title="${btn[3]}">${btn[1]}</button>`; logger.debug( + 'instance', `Create button for "${btn[1]}" with id "${btn[2]} at the right"` ); } else { - logger.warn(`Unknown button type ${btn[0]} in top bar builder`); + logger.warn( + 'instance', + `Unknown button type ${btn[0]} in top bar builder` + ); } }); - document.getElementById( - 'buttonPanelListLeft' - ).innerHTML = `${renderHtmlLeft}${renderHtmlSLeft} - <h5 class="text-capitalize font-weight-bold text-center p-2 mr-auto ml-auto bd-highlight align-middle" - style="-webkit-user-select: none; -webkit-app-region: drag;"> - lektor-app admin iterface</h5> - ${renderHtmlRight}`; + document.getElementById('buttonPanelListLeft').innerHTML = ` + <div class="btn-group" role="group">${renderHtmlLeft}</div> + <div class="btn-group" role="group">${renderHtmlSLeft}</div> + <div class="p-1 bd-highlight mb-1 mr-auto ml-auto" style="width: 60%;"> + <input id="filterInput" type="text" class="form-control filterInput" placeholder="Filter..."> + </div> + <div class="btn-group" role="group">${renderHtmlRight}</div>`; } /* Create the left panel */ ipcRenderer.on('reload-db-responce', (event, arg) => { - var karaList = ''; - logger.debug(`Web page got reload-db`); + logger.debug('instance', `Web page got reload-db`); + document.getElementById('panelLeft').innerHTML = ''; arg.forEach(kara => { - karaList += `<div class="card p-2 bd-highlight shadow-none d-flex flex-row bd-highlight mb-3 border border-info karaCard"> - <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b>${kara.language}</b></span> - <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b>${kara.cat}</b></span> - <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b>${kara.type}</b></span> - <div class="karaElement p-2 bd-highlight mr-auto"><b>${kara.source}<br> ${kara.title}</b> <i>[${kara.author}]</i></div> - <div class="karaElement p-2 bd-highlight"> - <div class="d-flex flex-row bd-highlight mb-3 btn-group karaActionBtnGroup" role="group"> - <button class="btn btn-outline-light karaActionBtn"><i class="fas fa-plus"></i></button> - <button class="btn btn-outline-light karaActionBtn"><i class="fas fa-level-up-alt"></i></button> - </div> - </div> - </div>`; + ejs.renderFile( + __dirname + '/views/karaListItem.ejs', + { kara: kara }, + (err, data) => { + if (err) logger.error('instance', err); + document.getElementById('panelLeft').innerHTML = ` + ${document.getElementById('panelLeft').innerHTML} + ${data}`; + } + ); }); - document.getElementById('panelLeft').innerHTML = karaList; }); /* Create the right panel: the queue */ ipcRenderer.on('reload-queue-responce', (event, arg) => { - var karaList = ''; - logger.debug(`Web page got reload-queue`); + logger.debug('instance', `Web page got reload-queue`); + document.getElementById('panelRight').innerHTML = ''; arg.forEach(kara => { - karaList += `<div class="card p-2 bd-highlight shadow-none d-flex flex-row bd-highlight mb-3 border border-info karaCard"> - <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b>${kara.language}</b></span> - <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b>${kara.cat}</b></span> - <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b>${kara.type}</b></span> - <div class="karaElement p-2 bd-highlight mr-auto"><b>${kara.source}<br> ${kara.title}</b> <i>[${kara.author}]</i></div> - <span class="karaElement p-3 bd-highlight"><b>${kara.position}</b></span> - <div class="karaElement p-2 bd-highlight"> - <div class="d-flex flex-row bd-highlight mb-3 btn-group karaActionBtnGroup" role="group"> - <button class="btn btn-outline-light karaActionBtn"><i class="fas fa-minus"></i></button> - <button class="btn btn-outline-light karaActionBtn"><i class="fas fa-play"></i></button> - </div> - </div> - </div>`; + ejs.renderFile( + __dirname + '/views/karaListItem.ejs', + { kara: kara }, + (err, data) => { + if (err) logger.error('instance', err); + document.getElementById('panelRight').innerHTML = ` + ${document.getElementById('panelRight').innerHTML} + ${data}`; + } + ); }); - document.getElementById('panelRight').innerHTML = karaList; }); diff --git a/instance/views/karaListItem.ejs b/instance/views/karaListItem.ejs new file mode 100644 index 0000000000000000000000000000000000000000..0d3c1ec9ffe25c3d1ffd87942eae179c68b40b24 --- /dev/null +++ b/instance/views/karaListItem.ejs @@ -0,0 +1,17 @@ +<%# vim: ts=4 syntax=html + The template for the kara card in lists %> +<li class="card p-2 bd-highlight shadow-none d-flex flex-row bd-highlight mb-3 karaCard"> + <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b><%= kara.language %></b></span> + <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b><%= kara.cat %></b></span> + <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b><%= kara.type %></b></span> + <span class="karaElement p-2 bd-highlight mr-auto"><b><%= kara.source %><br> <%= kara.title %></b> <i>[<%= kara.author %>]</i></span> + <% if (kara.hasOwnProperty('position')) { %> + <span class="karaElement p-3 bd-highlight"><b><%= kara.position %></b></span> + <% } %> + <div class="karaElement p-2 bd-highlight"> + <div class="d-flex flex-row bd-highlight mb-3 btn-group karaActionBtnGroup" role="group"> + <button class="btn btn-outline-light karaActionBtn"><i class="fas fa-plus"></i></button> + <button class="btn btn-outline-light karaActionBtn"><i class="fas fa-level-up-alt"></i></button> + </div> + </div> +</li> diff --git a/main.js b/main.js index 8cd34fa1bc8f7f8329ba697d4fa41491bba712f4..eb5711dc438396462673a5cf607752139a7fce25 100644 --- a/main.js +++ b/main.js @@ -1,3 +1,4 @@ +<<<<<<< HEAD const logger = require.main.require('./common/logger.js'); const electron = require('electron'); const { app, BrowserWindow, ipcRenderer } = require('electron'); @@ -7,6 +8,15 @@ const { fork, spawn } = require('child_process'); const fs = require('fs'); const db = require.main.require('./common/db.js'); const lkt = require.main.require('./common/lkt.js'); +======= +const logger = require.main.require('./common/logger.js'), + electron = require('electron'), + { app, BrowserWindow, globalShortcut, ipcMain } = require('electron'), + { fork, spawn } = require('child_process'), + fs = require('fs'), + db = require.main.require('./common/db.js'), + lkt = require.main.require('./common/lkt.js'); +>>>>>>> origin/master var tail = require('tail').Tail; var client; /* Sub process for the express server */ var lektor; /* Sub process, the lektord player */ @@ -14,6 +24,8 @@ var lektor_closed = false; /* Is lektord closed? */ var myDb = new db('/home/kara/kara.db'); +var win = null; /* The main window */ + /********************** * Reinit the logfile * **********************/ @@ -30,9 +42,10 @@ tail.on('line', function (data) { function createInstanceWindow() { /* Main window */ - const win = new BrowserWindow({ + win = new BrowserWindow({ width: 1280, height: 720, + hasShadow: false, frame: false, menuBarVisible: true, webPreferences: { @@ -42,6 +55,24 @@ function createInstanceWindow() { win.loadFile('instance/index.html'); } +function createKurisuWindow() { + /* Main window */ + const kurisu = new BrowserWindow({ + width: 1280, + title: 'Kurisu', + height: 720, + frame: false, + parent: win, + webPreferences: { + nodeIntegration: true, + }, + }); + kurisu.loadURL('https://dev-kurisu.iiens.net'); + kurisu.once('ready-to-show', () => { + kurisu.show(); + }); +} + /****************************** * The end of the application * ******************************/ @@ -51,7 +82,10 @@ ipcMain.on('close-app', (evt, arg) => { }); app.on('quit', () => { - logger.info('Send SIGTERM to express process, lektord and tailler process'); + logger.info( + 'main', + 'Send SIGTERM to express process, lektord and tailler process' + ); client.kill('SIGTERM'); if (!lektor_closed) { lektor.kill('SIGTERM'); @@ -63,7 +97,7 @@ app.on('quit', () => { *********************************/ app.on('ready', () => { - logger.info('Main window is ready'); + logger.info('main', 'Main window is ready'); createInstanceWindow(); client = fork('client/main.js'); lektor = spawn('lektord', ['-F']); @@ -72,7 +106,7 @@ app.on('ready', () => { if (win === null) { return; } - logger.info('Reloading DB'); + logger.info('main', 'Reloading DB'); let contents = win.webContents; myDb.all().then(karas => { contents.send('reload-db-responce', karas); @@ -93,63 +127,90 @@ app.on('ready', () => { if (!line) return; switch (line[0]) { case '*': - logger.warn(line.replace(/^\* (.*)$/g, '$1')); + logger.warn( + 'lektord', + line.replace(/^\* (.*)$/g, '$1') + ); break; case '!': - logger.error(line.replace(/^! (.*)$/g, '$1')); + logger.error( + 'lektord', + line.replace(/^! (.*)$/g, '$1') + ); break; case '.': if (line.length >= 2 && line[1] != '.') { - logger.info(line.replace(/^\. (.*)$/g, '$1')); + logger.info( + 'lektord', + line.replace(/^\. (.*)$/g, '$1') + ); break; } /* Fallthrough case */ default: - logger.debug(line.replace(/^\.\.\. (.*)$/g, '\t$1')); + logger.debug( + 'lektord', + line.replace(/^\.\.\. (.*)$/g, '\t$1') + ); break; } }); }); setTimeout(() => {lkt.idleActualisation(ipcRenderer);},500); lektor.on('close', code => { - logger.warn(`Lektor exited with code ${code}`); + logger.warn('main', `Lektor exited with code ${code}`); lektor_closed = true; app.quit(); }); }); +/*************** + * Kurisu View * + ***************/ + +ipcMain.on('toggle-kurisu', (event, arg) => { + logger.debug('main', 'Toggle kurisu view'); + createKurisuWindow(); +}); + /********************************* * Messages from the main window * *********************************/ ipcMain.on('cmd-play', (event, arg) => { lkt.commandPlay().then(arg => { - logger.debug('Returned from cmd-play'); + logger.debug('main', 'Returned from cmd-play'); }); }); ipcMain.on('cmd-stop', (event, arg) => { lkt.commandStop().then(arg => { - logger.debug('Returned from cmd-stop'); + logger.debug('main', 'Returned from cmd-stop'); }); }); ipcMain.on('cmd-clear', (event, arg) => { lkt.commandClear().then(arg => { - logger.debug('Cleared queue with cmd-clear'); + logger.debug('main', 'Cleared queue with cmd-clear'); }); }); /* Fill the pannel with the content of the DB. * The `arg` is the HTML object of the pannel */ ipcMain.on('reload-db-request', (event, arg) => { - logger.info('Reloading the DB content'); - myDb.all().then(karas => { + logger.info('main', 'Reloading the DB content'); + var callback = karas => { event.reply('reload-db-responce', karas); - }); + }; + if (arg) { + logger.debug('main', `Reload DB with search '${arg}'`); + myDb.search(arg, 0, 15).then(callback); + } else { + myDb.all(0, 15).then(callback); + } }); /* Send the queue to the webpage when asked to */ ipcMain.on('reload-queue-request', (event, arg) => { - logger.info('Reloading next karas in queue'); + logger.info('main', 'Reloading next karas in queue'); myDb.queue(0, 100).then(karas => { event.reply('reload-queue-responce', karas); }); diff --git a/style/css/instance.css b/style/css/instance.css index b7b6a356bb2c5bbfaefbd99cb7009ac6ffabbf01..a7b997213a6a819fcae72d5475c83b41719ab0e6 100644 --- a/style/css/instance.css +++ b/style/css/instance.css @@ -21,6 +21,32 @@ button { -webkit-transition: none; } +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + outline: none !important; + box-shadow: none !important; + border-color: transparent !important; +} + +#filterInput { + background-color: #2b3e50 !important; + color: white; +} + #mainFrame { height: 100%; display: flex; @@ -44,8 +70,10 @@ button { width: 100%; margin-left: 0px; margin-right: 0px; + margin-top: 0px !important; flex-grow: 1; overflow: hidden; + border-top: 0px !important; padding: 0px !important; } diff --git a/test/test_db.js b/test/test_db.js index ba3fad0a1290216ec30266cc0b99f888d3f96976..36094fa67c790738100a9a3a851ae052ae052a41 100644 --- a/test/test_db.js +++ b/test/test_db.js @@ -3,5 +3,5 @@ const KaraDatabase = require.main.require('./common/db.js'); var myDb = new KaraDatabase("/home/kara/kara.db"); -myDb.search(`kubat`).then( val => logger.log("debug", val) ) +myDb.search(`kubat`).then( val => logger.debug("test", val) ) myDb.close()