Speicherversion auf 2. Unfertige UIs hinzugefügt. Wird nächste Woche nach gepusht. SQL geupdatet.
environments/production/deployments/15
Theenoro 2019-09-01 19:33:40 +02:00
parent 61aa2131a9
commit 72a9f6c0eb
21 changed files with 1561 additions and 970 deletions

2
.gitignore vendored
View File

@ -62,3 +62,5 @@ npm-debug.log*
yarn-debug.log*
yarn-error.log*
build/
.vscode/

View File

@ -948,3 +948,39 @@ button.success:hover {
#settings-frame .form-group input {
width: 100%;
}
#tasks-frame {
display: flex;
}
#tasks-frame #tasks {
width: 25em;
}
#tasks-frame #dates {
width: 8em;
}
#tasks-frame #info {
width: 100%;
}
#notes-frame {
min-height: 100vh;
display: flex;
}
#notes-frame #notes-list {
width: 200px;
border-right: 1px solid #454545;
}
#notes-frame #notes-list .note.heigh {
border-color: #DD0000;
}
#notes-frame #notes-list .note.normal {
border-color: #DDDD00;
}
#notes-frame #notes-list .note.low {
border-color: #00DD55;
}
#notes-frame #notes-edit {
padding: 10px;
}
#notes-frame #notes-edit textarea {
width: calc(100vw - 450px);
height: 300px;
}

View File

@ -1,6 +1,6 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"short_name": "WBM",
"name": "Wochenbericht Manager",
"icons": [
{
"src": "favicon.ico",

View File

@ -0,0 +1,75 @@
import {DB} from './../storage'
export class Mig_0_1{
constructor(){
var res = DB.cdb.exec("SELECT * FROM settings WHERE ke='version'");
if(res.length == 0){
console.log("UPDATE STORAGE")
this.mig_tasks();
}
}
mig_tasks(){
// TODO: MIGRATION TOOL FOR SAVE VERSION 1
DB.cdb.exec("CREATE TABLE IF NOT EXISTS days_have_tasks(day_id INTEGER ,task_id INTEGER);");
var res = DB.cdb.exec("SELECT * FROM days")[0].values;
console.log(res)
if(res.length>0){
for(var i = 0;i<res.length;i++){
// 5 = taskList
//console.log(res[i][5])
var tasks_for_day = res[i][5].split(',');
// 0 = Tag ID
var day_id = res[i][0];
for(var j = 0;j<tasks_for_day.length;j++){
console.log(tasks_for_day[j])
var sql2 = "INSERT INTO days_have_tasks VALUES ( "+day_id+","+tasks_for_day[j]+");";
//console.log(sql2)
DB.cdb.exec(sql2);
}
}
}
this.deleteOldTaskColumn();
}
deleteOldTaskColumn(){
//var sql = `ALTER TABLE "days" DROP COLUMN "taskList";`
var sql = `
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS new_days(
id INTEGER PRIMARY KEY AUTOINCREMENT,
date DATETIME ,
startTime DATETIME ,
breakTime INTEGER ,
endTime DATETIME
);
INSERT INTO new_days(id,date,startTime,breakTime,endTime)
SELECT id,date,startTime,breakTime,endTime
FROM days;
DROP TABLE days;
ALTER TABLE new_days RENAME TO days;
COMMIT;
PRAGMA foreign_keys=on;
`
DB.cdb.exec(sql);
this.addNotesTable();
}
addNotesTable(){
var sql = `CREATE TABLE notes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date DATETIME ,
title TEXT,
text TEXT,
priority TEXT
);`
DB.cdb.exec(sql);
this.updateVersion();
}
updateVersion(){
var sql = `INSERT INTO settings (ke,val) VALUES ("version","2")`
DB.cdb.exec(sql);
}
}

View File

@ -0,0 +1,8 @@
export class Migration {
constructor() {
}
}

View File

@ -21,17 +21,26 @@ export class DB{
date DATETIME ,
startTime DATETIME ,
breakTime INTEGER ,
endTime DATETIME ,
taskList TEXT
endTime DATETIME
);
CREATE TABLE tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
taskName TEXT not NULL
);
CREATE TABLE IF NOT EXISTS days_have_tasks(day_id INTEGER ,task_id INTEGER);
CREATE TABLE notes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date DATETIME ,
title TEXT,
text TEXT,
priority TEXT
);
INSERT INTO settings (ke,val)
VALUES ('name','Max');
INSERT INTO settings (ke,val)
VALUES ('start','2018-08-01');
INSERT INTO settings (ke,val)
VALUES ('version','2');
`)
DB.loaded = true;
DB.__load()
@ -88,10 +97,10 @@ export class DB{
Log.debug('export database');
var data = DB.cdb.export();
var buffer = new Buffer(data);
console.log(buffer);
//console.log(buffer);
var blob = new Blob([buffer],{type:'application/x-sqlite3'});
console.log(blob);
console.log(window.URL.createObjectURL(blob));
//console.log(blob);
//console.log(window.URL.createObjectURL(blob));
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
var fileName = "wbm.sqlite";
@ -112,19 +121,32 @@ export class DB{
static loadDate(date){
//var re = DB.cdb.exec("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'");
//console.log(re)
console.log(date)
Log.debug('load from date:'+date.getTime())
// get date
var sql = `SELECT * FROM days WHERE date=:date;`;
var stmt = DB.cdb.prepare(sql);
var res = stmt.getAsObject({":date":date.getTime()})
// clear statement memory
stmt.free();
Log.debug(JSON.stringify(res));
if(Object.keys(res).length === 0){
return {breakTime: 0, date: null,startTime:null, endTime: null, taskList:[]}
}else{
var tasks = res.taskList.split(',');
var sql2 = `SELECT * FROM days_have_tasks WHERE day_id=:id`
var stmt2 = DB.cdb.prepare(sql2);
var tasks = [];
tasks.push(stmt2.getAsObject({":id":res.id}).task_id);
while (stmt2.step()) tasks.push(stmt2.get()[1]);
stmt2.free();
//return {breakTime: 0, date: null,startTime:null, endTime: null, taskList:[]}
//return 0;
//var tasks = resu.taskList.split(',');
sql = `SELECT * FROM tasks WHERE id=:id`;
for ( var task in tasks){
stmt = DB.cdb.prepare(sql);
tasks[task] = stmt.getAsObject({":id":tasks[task]}).taskName;
@ -142,17 +164,24 @@ export class DB{
var res;
var tasks = args.taskList;
var taskss = []
console.log(tasks);
//console.log(tasks);
for(var t in tasks){
if(typeof tasks[t] === 'undefined'){
continue;
}
tasks[t] = tasks[t].trim();
/**
* @INFO: search for TASK name
*/
sql = `SELECT * FROM tasks WHERE taskName=:task`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject({':task':tasks[t]});
stmt.free();
console.log(res);
//console.log(res);
/**
* @INFO: if task is not found add it as new task
* into the tasks table and research the taskname again
*/
if(Object.keys(res).length === 0){
sql = `INSERT INTO tasks(taskName) VALUES(:task);`;
stmt = DB.cdb.prepare(sql);
@ -168,31 +197,150 @@ export class DB{
stmt.free();
console.log(res);
}
/**
* @INFO: store the task id in taskss[t]
*
*/
taskss[t]= res.id;
}
/**
* @INFO: get the choosen date
*/
sql = `SELECT * FROM days WHERE date=:date;`;
stmt = DB.cdb.prepare(sql);
console.log(args);
res = stmt.getAsObject({":date":args.date})
stmt.free()
/**
* @INFO: CHECK IF DATE EXISTS
*/
if(Object.keys(res).length === 0){
/**
* @TODO: rework if date not exists
*/
Log.debug('added new entry');
Log.debug(JSON.stringify(args))
sql = `INSERT INTO days(date,startTime,breakTime,endTime,taskList) VALUES(:date,:startTime,:breakTime,:endTime,:taskList);`;
sql = `INSERT INTO days(date,startTime,breakTime,endTime) VALUES(:date,:startTime,:breakTime,:endTime);`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject(
{
":date":args.date,
":startTime":args.startTime,
":breakTime":args.breakTime,
":endTime":args.endTime,
":taskList":taskss.join()
":endTime":args.endTime
/*":taskList":taskss.join()*/
}
)
stmt.free()
sql = `SELECT * FROM days WHERE date=:date;`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject({
":date":args.date
});
/* DAY ID */
var d_id = res.id;
/**
* @INFO:
* for each day insert into days_have_tasks the tasks and the day id
*/
for(var i = 0;i<taskss.length;i++){
sql = `INSERT INTO days_have_tasks(day_id,task_id) VALUES(:did,:task);`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject(
{
":did":d_id,
":task":taskss[i]
}
)
stmt.free()
}
}else{
/**
* @INFO: get DATE ID
* @TODO: rewrite it as a external method
*/
sql = `SELECT * FROM days WHERE date=:date;`
stmt = DB.cdb.prepare(sql);
var id = stmt.getAsObject({":date":args.date}).id;
stmt.free()
sql = `SELECT * FROM days_have_tasks WHERE day_id=:id`
stmt = DB.cdb.prepare(sql);
var day_tasks = stmt.getAsObject({":id":id});
var old_tasks = [];
// load all old tasks in array
old_tasks.push(day_tasks.task_id)
while (stmt.step()) old_tasks.push(stmt.get()[1]);
stmt.free();
for(var x = 0;x<old_tasks.length;x++){
var t = taskss.indexOf(old_tasks[x])
if(t===-1){
sql = `DELETE FROM days_have_tasks WHERE day_id=:id AND task_id=:t_id;`
stmt = DB.cdb.prepare(sql);
stmt.getAsObject({":id":id,":t_id":old_tasks[x]});
}
}
/**
* @INFO
* ALL USED TASKS @var - taskss
*
* SELECT
*/
for(var i = 0;i<taskss.length;i++){
sql = `SELECT * FROM days_have_tasks WHERE day_id=:id AND task_id=:tid;`
stmt = DB.cdb.prepare(sql);
var tid = taskss[i];
var res = stmt.getAsObject({":id":id,":tid":tid});
stmt.free()
/**
* ADD TASK TO DAY
*/
if(typeof res.day_id == "undefined"){
var taskID = taskss[i];
/**
* @INFO: relate day_id and task_id in days_have_tasks
*/
sql = `INSERT INTO days_have_tasks(day_id,task_id) VALUES(:did,:task);`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject(
{
":did":id,
":task":taskID
}
)
stmt.free()
}
}
/** DELETE NOT USED TASKS */
/** @TODO: DELETE NOT USED TASKS FOR DAY */
/*
sql = `SELECT * FROM days_have_tasks WHERE day_id=:id AND task_id NOT IN :tid;`
stmt = DB.cdb.prepare(sql);
var tid = taskss[i];
var res = stmt.getAsObject({":id":id,":tid":"\"("+taskss.join('","')+")\""});
console.log(res);
stmt.free()
*/
/** */
Log.debug('update entry');
Log.debug(JSON.stringify(args))
sql = `UPDATE days SET startTime=:startTime,breakTime=:breakTime,endTime=:endTime,taskList=:taskList WHERE date=:date;`;
@ -240,4 +388,11 @@ export class DB{
stmt.free();
return "";
}
/**
* RES MAPPING
*/
static resMap(res){
}
}

View File

@ -94,7 +94,7 @@ export class Calender extends React.Component {
var res = DB.loadDate(date)
Log.debug('LOAD RES')
console.log(res)
Log.debug(JSON.stringify(res))
if(res.date === null){
@ -152,7 +152,7 @@ export class Calender extends React.Component {
//ipcRenderer.send('saveDate',s)
}
entryChange(e){
console.log(e.target.attributes.getNamedItem("data-key").value+" "+e.target.value);
//console.log(e.target.attributes.getNamedItem("data-key").value+" "+e.target.value);
var tmp = this.state.taskList
tmp[e.target.attributes.getNamedItem("data-key").value] = e.target.value
this.setState({taskList: tmp});
@ -180,7 +180,7 @@ export class Calender extends React.Component {
}else{
}
console.log(moment(this.state.date).diff(moment(DB.loadSettings('start').val),'week'));
//console.log(moment(this.state.date).diff(moment(DB.loadSettings('start').val),'week'));
////console.log(moment(this.state.endTime).format('HH:mm:ss'))
var loc = {blank: 'Datum auswählen...', headerFormat: 'ddd, MMM Do', todayLabel: { long: 'Heute', }, locale: require('date-fns/locale/de'), weekdays: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], weekStartsOn: 1 }
return ( <div id="editor-frame">

View File

View File

@ -26,7 +26,10 @@ export class FileLoader extends React.Component {
super(props);
this.handleFileSelect = this.handleFileSelect.bind(this);
this.createNew = this.createNew.bind(this);
this.state = {upBTN:null}
this.upload = this.upload.bind(this);
this.loadWBM = this.loadWBM.bind(this)
}
b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || '';
@ -69,10 +72,10 @@ export class FileLoader extends React.Component {
reader.onload = (function (theFile) {
return function (e) {
// Render thumbnail.
console.log(e.target.result)
console.log(theFile)
//console.log(e.target.result)
//console.log(theFile)
var blob = me.b64toBlob(e.target.result.split('base64,')[1],theFile.type);
console.log(blob)
//console.log(blob)
//var fi = new FileReader();
//var f_ = fi.readAsDataURL(e.target.result);
var uInt8Array = new Uint8Array(convertDataURIToBinary(e.target.result));
@ -90,13 +93,21 @@ export class FileLoader extends React.Component {
createNew(){
DB.newDB();
}
upload(e){
this.setState({upBTN:e})
}
loadWBM(e){
this.state.upBTN.click();
}
render() {
return (
<div id="fileloader-frame">
<div className="contents">
<button onClick={this.createNew}>Neue Wochenberichtsmappe</button>
<hr/>
<input type="file" id="files" name="files[]" onChange={this.handleFileSelect}/>
<button onClick={this.loadWBM}> 📂 Bestehende Wochenberichtsmappe laden</button>
<input ref={this.upload} type="file" id="files" name="files[]" onChange={this.handleFileSelect} style={{display:"none"}}/>
<output id="list"></output>
<hr/>
Erstellt von:<br/><a rel="noopener noreferrer" target="_blank" href="https://lucajaents.ch">Luca Jäntsch</a>

View File

@ -1,6 +1,7 @@
import React from 'react';
import {FileLoader} from './fileLoader'
import {DB} from './../static/storage'
import { Migrate } from './migrate';
//import 'react-infinite-calendar/styles.css'; // only needs to be imported once
var me;
@ -22,14 +23,13 @@ export class Home extends React.Component {
if(DB.loaded === false){
return <FileLoader/>
}else{
return ""
return (<div><Migrate/></div>)
}
}
render(){
return (
<div id="home-frame">
<this.DbLoaded/>
</div>);
}
}

View File

@ -0,0 +1,46 @@
import React from 'react';
import {
FileLoader
} from './fileLoader'
import {
DB
} from './../static/storage'
import {Mig_0_1} from '../static/migration-sc/0-1'
//import 'react-infinite-calendar/styles.css'; // only needs to be imported once
var me;
export class Migrate extends React.Component {
constructor(props) {
super(props);
this.state = {
saveVersion: "0",
}
}
componentDidMount(){
var res = DB.cdb.exec("SELECT * FROM settings WHERE ke='version'");
console.log(res);
if(res.length==0){
new Mig_0_1();
}else{
var version = res[0].values[0][2];
this.setState({saveVersion:version});
switch(version){
case "2":
console.log('All up to date')
break;
default:
break;
}
}
}
render() {
return (
<div id = "migrate-frame" >
Deine Speicher Version: {this.state.saveVersion} - Derzeitige Programm Version
</div>);
}
}

View File

@ -5,9 +5,12 @@ import {Calender} from './calender';
import {Generator} from './generator';
import {Print} from './print';
import {Settings} from './settings';
import {WorkTimes} from './worktimes';
import {TasksUI} from './tasks';
import {DB} from './../static/storage'
import { Notify } from '../static/notify';
import { Notes } from './notes';
export class Nav extends React.Component {
constructor(props) {
@ -54,14 +57,18 @@ export class Nav extends React.Component {
WBM
</div>
<button onClick={()=>{this.setState({tab:(<Home/>)})}}>Home</button>
<button onClick={()=>{this.setState({tab:(<Notes/>)})}}>Notizen</button>
<button onClick={()=>{DB.exportDB()}}>Exportieren </button>
<button onClick={()=>{this.setState({tab:(<Calender/>)})}}>Kalender</button>
<button onClick={()=>{this.setState({tab:(<TasksUI/>)})}}>Tasks</button>
<button onClick={()=>{this.setState({tab:(<WorkTimes/>)})}}>Arbeitszeiten</button>
<button onClick={()=>{this.setState({tab:(<Generator/>)})}}>Generator</button>
<button onClick={()=>{this.setState({tab:(<Print/>)})}}>Drucken</button>
<button onClick={()=>{this.setState({tab:(<Settings/>)})}}>Einstellungen</button>
<hr/>
Erstellt von:<br/><a target="_blank" rel="noopener noreferrer" href="https://lucajaents.ch">Luca Jäntsch</a>
<a href='https://ko-fi.com/W7W511YSC' target='_blank'><img height='36' style={{border:0+"px",height:36+'px'}} src='https://az743702.vo.msecnd.net/cdn/kofi5.png?v=2' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>
</div>
<div id="content">
{this.state.tab}

View File

@ -0,0 +1,87 @@
import React from 'react';
import { DB } from '../static/storage';
const moment = require('moment');
export class Notes extends React.Component {
constructor(props) {
super(props);
var x = new Date();
this.state = {
notes:[],
date: moment(x).format("YYYY-MM-DD"),
time:moment(x).format("HH:MM"),
title:"-",
text:"---",
priority:"low"
}
this.chDate = this.chDate.bind(this);
this.chTime = this.chTime.bind(this);
this.chTitle = this.chTitle.bind(this);
this.chText = this.chText.bind(this);
this.chPriority = this.chPriority.bind(this);
this.save = this.save.bind(this);
this.delete = this.delete.bind(this);
}
componentDidMount(){
var sql = "SELECT * FROM notes;"
var stmt = DB.cdb.exec(sql);
/*var res = stmt.getAsObject(
{}
)
var dates = [];
dates.push(res.date);
while (stmt.step()) dates.push(stmt.get()[0]);
this.setState({dates:dates});*/
}
chDate(e){
var d = e.target.value;
this.setState({date:d});
}
chTime(e){
var t = e.target.value;
this.setState({time:t})
}
chTitle(e){
var t = e.target.value;
this.setState({title:t});
}
chText(e){
var t = e.target.value;
this.setState({text:t});
}
chPriority(e){
var p = e.target.value;
this.setState({priority:p})
}
delete(e){
}
save(e){
console.log("SAVE");
console.log(this.state.date);
var sql = `INSERT INTO notes ()`
}
render() {
return (
<div id="notes-frame">
<div id="notes-list">
</div>
<div id="notes-edit">
<button onClick={this.save}>Speichern</button><button onClick={this.delete}>Löschen</button>
<hr/>
Datum:<input type="date" value={this.state.date} onChange={this.chDate}/><br/>
Zeit:<input type="time" value={this.state.time} onChange={this.chTime}/><br/>
Titel:<input type="text" value={this.state.title} onChange={this.chTitle}/><br/>
Dringlichkeit:<select value={this.state.priority} onChange={this.chPriority}>
<option value="heigh">Hoch</option>
<option value="normal">Normal</option>
<option value="low">Niedrig</option>
</select><br/>
<textarea value={this.state.text} onChange={this.chText}></textarea>
</div>
</div>);
}
}

View File

@ -31,7 +31,12 @@ export class Modi_Week{
weeks[week].num = moment(md[1]).diff(moment(anfang).startOf('isoWeek'),'weeks')+1;
weeks[week].end = "";
}
var tasks = md[5].split(',');
sql = `SELECT * FROM days_have_tasks WHERE day_id=`+md[0];
var ts = DB.cdb.exec(sql);
var tasks = []
for(var x in ts[0].values){
tasks.push(ts[0].values[x][1]);
}
for(var t in tasks){
sql = 'SELECT * FROM tasks WHERE id=:id';
var stmt = DB.cdb.prepare(sql);

View File

@ -49,6 +49,7 @@ export class Settings extends React.Component {
</label>
<input class="form-control" id="name" name="name" type="date" onChange={this.onChangeStart} value={this.state.start} />
</div>
<hr/>
<button onClick={this.save}>Speichern</button>
</div>);
}

View File

@ -0,0 +1,94 @@
import React from 'react';
import {FileLoader} from './fileLoader'
import {DB} from './../static/storage'
const moment = require('moment');
//import 'react-infinite-calendar/styles.css'; // only needs to be imported once
var me;
export class TasksUI extends React.Component {
constructor(props) {
super(props);
this.state = {
tasks:[{name:"",count:0,tid:0}],
dates:[],
selDate:"-",
taskss:""
}
this.onTaskClick = this.onTaskClick.bind(this);
this.loadDay = this.loadDay.bind(this);
}
componentDidMount(){
var sql = "SELECT dt.task_id,t.taskName , COUNT(dt.day_id) FROM days_have_tasks as dt,tasks as t WHERE dt.task_id=t.id GROUP BY dt.task_id;";
var tmp = DB.cdb.exec(sql);
if(tmp.length>0){
tmp = tmp[0].values
console.log(tmp)
var tt = [];
for(var t in tmp){
tt.push({tid:tmp[t][0],name:tmp[t][1],count:tmp[t][2]});
}
this.setState({tasks:tt});
}
}
onTaskClick(e){
var val = e.target.attributes.getNamedItem("data-value").value;
console.log(val);
var sql = "SELECT days.date FROM days_have_tasks as dt, days WHERE dt.day_id = days.id AND dt.task_id=:task_id ;"
var stmt = DB.cdb.prepare(sql);
var res = stmt.getAsObject(
{
":task_id":val
}
)
var dates = [];
dates.push(res.date);
while (stmt.step()) dates.push(stmt.get()[0]);
this.setState({dates:dates});
// console.log(moment(stmt.get()[0]).format('DD.MM.YYYY'));
stmt.free();
}
loadDay(e){
var val = e.target.attributes.getNamedItem("data-value").value;
var today = DB.loadDate(new Date(val/1));
this.setState({
selDate:val,
taskss:today.taskList.join(", ")
})
}
render(){
console.log(this.state.tasks)
return (
<div id="tasks-frame">
<table id="tasks">
<tbody>
<tr><th>Aufgaben Name</th><th>Anzahl</th></tr>
{Object.keys(this.state.tasks).map((item,val) => (
<tr data-value={this.state.tasks[item].tid} onClick={this.onTaskClick}>
<td data-value={this.state.tasks[item].tid}>{this.state.tasks[item].name}</td><td data-value={this.state.tasks[item].tid}>{this.state.tasks[item].count}</td>
</tr>)
)}
</tbody>
</table>
<table id="dates">
<tbody>
<tr><th>Datum</th></tr>
{this.state.dates.map((val)=>(
<tr><td><div onClick={this.loadDay} data-value={val}>{moment(val).format('DD.MM.YYYY')}</div></td></tr>
)
)}
</tbody>
</table>
<div id="info">
Date:{moment(this.state.selDate/1).format('DD.MM.YYYY')}<br/>
Aufgabe(n):{this.state.taskss}
</div>
</div>);
}
}

View File

@ -0,0 +1,24 @@
import React from 'react';
import {
FileLoader
} from './fileLoader'
import {
DB
} from './../static/storage'
//import 'react-infinite-calendar/styles.css'; // only needs to be imported once
var me;
export class WorkTimes extends React.Component {
constructor(props) {
super(props);
this.state = {
rel: false
}
}
render() {
return ( <div id = "home-frame" >
</div>);
}
}

View File

@ -167,3 +167,5 @@ button.btn, button {
@import './fileloader.less';
@import './print.less';
@import './settings.less';
@import './tasks.less';
@import './notes.less';

View File

@ -0,0 +1,26 @@
#notes-frame{
min-height:100vh;
display:flex;
#notes-list{
width: 200px;
border-right: 1px solid #454545;
.note{
&.heigh{
border-color: #DD0000;
}
&.normal{
border-color: #DDDD00;
}
&.low{
border-color: #00DD55;
}
}
}
#notes-edit{
padding: 10px;
textarea{
width: ~"calc(100vw - 450px)";
height: 300px;
}
}
}

View File

@ -0,0 +1,12 @@
#tasks-frame{
display:flex;
#tasks{
width: 25em;
}
#dates{
width:8em;
}
#info{
width: 100%;
}
}