mirror of
https://github.com/FliegendeWurst/telegram_notes_bot.git
synced 2024-11-22 02:44:58 +00:00
Export the necessary scripts instead of copy+paste
This commit is contained in:
parent
f63d078831
commit
3a258f5e90
511
notes/!!!meta.json
Normal file
511
notes/!!!meta.json
Normal file
@ -0,0 +1,511 @@
|
|||||||
|
{
|
||||||
|
"formatVersion": 1,
|
||||||
|
"appVersion": "0.46.9",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "vP5DkrdHVvv0",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0"
|
||||||
|
],
|
||||||
|
"title": "Implementation",
|
||||||
|
"notePosition": 50,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 1,
|
||||||
|
"type": "text",
|
||||||
|
"mime": "text/html",
|
||||||
|
"attributes": [],
|
||||||
|
"format": "html",
|
||||||
|
"dirFileName": "Implementation",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "dDCKmKnFWfrk",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"dDCKmKnFWfrk"
|
||||||
|
],
|
||||||
|
"title": "attribute changed",
|
||||||
|
"notePosition": 0,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "code",
|
||||||
|
"mime": "application/javascript;env=backend",
|
||||||
|
"attributes": [],
|
||||||
|
"dataFileName": "attribute changed.js",
|
||||||
|
"dirFileName": "attribute changed",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "Xv1GdWl4UvVO",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"dDCKmKnFWfrk",
|
||||||
|
"Xv1GdWl4UvVO"
|
||||||
|
],
|
||||||
|
"title": "reconcileAssignments",
|
||||||
|
"notePosition": 0,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "code",
|
||||||
|
"mime": "application/javascript;env=backend",
|
||||||
|
"attributes": [],
|
||||||
|
"dataFileName": "reconcileAssignments.js"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "1d9ya4XfzQP2",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"1d9ya4XfzQP2"
|
||||||
|
],
|
||||||
|
"title": "button",
|
||||||
|
"notePosition": 10,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "code",
|
||||||
|
"mime": "application/javascript;env=frontend",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "run",
|
||||||
|
"value": "frontendStartup",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataFileName": "button.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "hvYOnJwamlAm",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"hvYOnJwamlAm"
|
||||||
|
],
|
||||||
|
"title": "CSS",
|
||||||
|
"notePosition": 20,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "code",
|
||||||
|
"mime": "text/css",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "appCss",
|
||||||
|
"value": "",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataFileName": "CSS.css"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "wYT6EyWoF0Qg",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"wYT6EyWoF0Qg"
|
||||||
|
],
|
||||||
|
"title": "task template",
|
||||||
|
"notePosition": 30,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "text",
|
||||||
|
"mime": "text/html",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "label:tag",
|
||||||
|
"value": "promoted,multi,text",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "cssClass",
|
||||||
|
"value": "todo",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "label:location",
|
||||||
|
"value": "promoted,single,text",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 30
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "label:todoDate",
|
||||||
|
"value": "promoted,single,date",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 40
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "label:todoTime",
|
||||||
|
"value": "promoted,single,text",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "label:doneDate",
|
||||||
|
"value": "promoted,single,date",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 60
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "label:canceled",
|
||||||
|
"value": "promoted,single,boolean",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 70
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"format": "html",
|
||||||
|
"dataFileName": "task template.html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "zzJx2J4CLv9y",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"zzJx2J4CLv9y"
|
||||||
|
],
|
||||||
|
"title": "new_reminder handler",
|
||||||
|
"notePosition": 40,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "code",
|
||||||
|
"mime": "application/javascript;env=backend",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "customRequestHandler",
|
||||||
|
"value": "new_reminder",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "relation",
|
||||||
|
"name": "targetTemplate",
|
||||||
|
"value": "LBDjD6rGxw6I",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 10
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataFileName": "new_reminder handler.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "UNuCNmOMROgz",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"UNuCNmOMROgz"
|
||||||
|
],
|
||||||
|
"title": "task_alerts handler",
|
||||||
|
"notePosition": 50,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "code",
|
||||||
|
"mime": "application/javascript;env=backend",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "customRequestHandler",
|
||||||
|
"value": "task_alerts",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "relation",
|
||||||
|
"name": "targetTemplate",
|
||||||
|
"value": "wYT6EyWoF0Qg",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "relation",
|
||||||
|
"name": "targetTemplateReminder",
|
||||||
|
"value": "LBDjD6rGxw6I",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 30
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "relation",
|
||||||
|
"name": "targetTemplateReminderDaily",
|
||||||
|
"value": "7Wzjk70ySoKm",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 40
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataFileName": "task_alerts handler.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "LBDjD6rGxw6I",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"LBDjD6rGxw6I"
|
||||||
|
],
|
||||||
|
"title": "reminder template",
|
||||||
|
"notePosition": 60,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "text",
|
||||||
|
"mime": "text/html",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"type": "relation",
|
||||||
|
"name": "template",
|
||||||
|
"value": "wYT6EyWoF0Qg",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "reminder",
|
||||||
|
"value": "true",
|
||||||
|
"isInheritable": true,
|
||||||
|
"position": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "iconClass",
|
||||||
|
"value": "bx bx-alarm",
|
||||||
|
"isInheritable": true,
|
||||||
|
"position": 30
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "cssClass",
|
||||||
|
"value": "reminder",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 40
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"format": "html",
|
||||||
|
"dataFileName": "reminder template.html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "7Wzjk70ySoKm",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"7Wzjk70ySoKm"
|
||||||
|
],
|
||||||
|
"title": "daily reminder template",
|
||||||
|
"notePosition": 61,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "text",
|
||||||
|
"mime": "text/html",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "iconClass",
|
||||||
|
"value": "bx bx-alarm",
|
||||||
|
"isInheritable": true,
|
||||||
|
"position": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "cssClass",
|
||||||
|
"value": "reminder",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "label:todoTime",
|
||||||
|
"value": "promoted,single,text",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 30
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "reminder",
|
||||||
|
"value": "true",
|
||||||
|
"isInheritable": true,
|
||||||
|
"position": 40
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"format": "html",
|
||||||
|
"dataFileName": "daily reminder template.html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "XE5kBjusNVkY",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"XE5kBjusNVkY"
|
||||||
|
],
|
||||||
|
"title": "attribute sync button",
|
||||||
|
"notePosition": 80,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "code",
|
||||||
|
"mime": "application/javascript;env=frontend",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "run",
|
||||||
|
"value": "frontendStartup",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 10
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataFileName": "attribute sync button.js",
|
||||||
|
"dirFileName": "attribute sync button",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"isClone": true,
|
||||||
|
"noteId": "Xv1GdWl4UvVO",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"XE5kBjusNVkY",
|
||||||
|
"Xv1GdWl4UvVO"
|
||||||
|
],
|
||||||
|
"title": "reconcileAssignments",
|
||||||
|
"prefix": "",
|
||||||
|
"dataFileName": "reconcileAssignments.clone.html",
|
||||||
|
"type": "text",
|
||||||
|
"format": "html"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "X5pzYZriILAz",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"X5pzYZriILAz"
|
||||||
|
],
|
||||||
|
"title": "event template",
|
||||||
|
"notePosition": 90,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "text",
|
||||||
|
"mime": "text/html",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "label:location",
|
||||||
|
"value": "promoted,single,text",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "label:startTime",
|
||||||
|
"value": "promoted,single,text",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "label:endTime",
|
||||||
|
"value": "promoted,single,text",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 30
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "iconClass",
|
||||||
|
"value": "bx bx-calendar-event",
|
||||||
|
"isInheritable": true,
|
||||||
|
"position": 40
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "label:uid",
|
||||||
|
"value": "single,text",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 50
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"format": "html",
|
||||||
|
"dataFileName": "event template.html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "Qfv3H8TfLqzA",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"Qfv3H8TfLqzA"
|
||||||
|
],
|
||||||
|
"title": "new_event handler",
|
||||||
|
"notePosition": 100,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "code",
|
||||||
|
"mime": "application/javascript;env=backend",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "customRequestHandler",
|
||||||
|
"value": "new_event",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "relation",
|
||||||
|
"name": "targetTemplate",
|
||||||
|
"value": "X5pzYZriILAz",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 20
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataFileName": "new_event handler.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isClone": false,
|
||||||
|
"noteId": "rvu9Tix6GYYx",
|
||||||
|
"notePath": [
|
||||||
|
"vP5DkrdHVvv0",
|
||||||
|
"rvu9Tix6GYYx"
|
||||||
|
],
|
||||||
|
"title": "event_alerts handler",
|
||||||
|
"notePosition": 110,
|
||||||
|
"prefix": null,
|
||||||
|
"isExpanded": 0,
|
||||||
|
"type": "code",
|
||||||
|
"mime": "application/javascript;env=backend",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"type": "label",
|
||||||
|
"name": "customRequestHandler",
|
||||||
|
"value": "event_alerts",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "relation",
|
||||||
|
"name": "targetTemplateEvent",
|
||||||
|
"value": "X5pzYZriILAz",
|
||||||
|
"isInheritable": false,
|
||||||
|
"position": 10
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataFileName": "event_alerts handler.js"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"noImport": true,
|
||||||
|
"dataFileName": "navigation.html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"noImport": true,
|
||||||
|
"dataFileName": "index.html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"noImport": true,
|
||||||
|
"dataFileName": "style.css"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
7
notes/Implementation/CSS.css
Normal file
7
notes/Implementation/CSS.css
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
span.fancytree-node.todo .fancytree-title {
|
||||||
|
color: red !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.fancytree-node.done .fancytree-title {
|
||||||
|
color: green !important;
|
||||||
|
}
|
48
notes/Implementation/attribute changed.js
Normal file
48
notes/Implementation/attribute changed.js
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
if (!["task", "location", "tag", "todoDate", "doneDate"].includes(api.originEntity.name)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const note = await api.originEntity.getNote();
|
||||||
|
|
||||||
|
const attributes = await note.getAttributes();
|
||||||
|
|
||||||
|
if (attributes.filter(attr => attr.type === 'label' && attr.name === 'reminder').map(attr => attr.value).length() > 0) {
|
||||||
|
api.log("ignoring");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const todoDate = await note.getLabelValue('todoDate');
|
||||||
|
const doneDate = await note.getLabelValue('doneDate');
|
||||||
|
const canceled = !!(await note.getLabelValue('canceled'));
|
||||||
|
const isTaskDone = !!doneDate;
|
||||||
|
|
||||||
|
const canceledRootNote = await api.getNoteWithLabel('taskDoneRoot');
|
||||||
|
await api.toggleNoteInParent(canceled, note.noteId, canceledRootNote.noteId);
|
||||||
|
|
||||||
|
const doneRootNote = await api.getNoteWithLabel('taskDoneRoot');
|
||||||
|
await api.toggleNoteInParent(isTaskDone && !canceled, note.noteId, doneRootNote.noteId);
|
||||||
|
|
||||||
|
const todoRootNote = await api.getNoteWithLabel('taskTodoRoot');
|
||||||
|
await api.toggleNoteInParent(!isTaskDone && !canceled, note.noteId, todoRootNote.noteId);
|
||||||
|
|
||||||
|
const location = await note.getLabelValue('location');
|
||||||
|
const locationRootNote = await api.getNoteWithLabel('taskLocationRoot');
|
||||||
|
|
||||||
|
await reconcileAssignments(note, locationRootNote, location ? [location] : [], 'taskLocationNote', isTaskDone);
|
||||||
|
|
||||||
|
const tags = attributes.filter(attr => attr.type === 'label' && attr.name === 'tag').map(attr => attr.value);
|
||||||
|
const tagRootNote = await api.getNoteWithLabel('taskTagRoot');
|
||||||
|
|
||||||
|
await reconcileAssignments(note, tagRootNote, tags, 'taskTagNote', isTaskDone);
|
||||||
|
|
||||||
|
await note.toggleLabel(isTaskDone || canceled, "cssClass", "done");
|
||||||
|
|
||||||
|
const doneTargetNoteId = isTaskDone ? (await api.getDateNote(doneDate)).noteId : null;
|
||||||
|
await api.setNoteToParent(note.noteId, 'DONE', doneTargetNoteId);
|
||||||
|
|
||||||
|
await note.toggleLabel(!isTaskDone && !canceled, "cssClass", "todo");
|
||||||
|
|
||||||
|
const todoTargetNoteId = (!isTaskDone && !canceled && todoDate) ? (await api.getDateNote(todoDate)).noteId : null;
|
||||||
|
await api.setNoteToParent(note.noteId, 'TODO', todoTargetNoteId);
|
||||||
|
|
||||||
|
api.refreshTree();
|
@ -0,0 +1,25 @@
|
|||||||
|
module.exports = async function(note, categoryRootNote, assignedCategories, labelName, isTaskDone) {
|
||||||
|
const found = {};
|
||||||
|
|
||||||
|
for (const categoryNote of await categoryRootNote.getChildNotes()) {
|
||||||
|
const label = await categoryNote.getLabel(labelName);
|
||||||
|
|
||||||
|
if (label) {
|
||||||
|
found[label.value] = !isTaskDone && assignedCategories.includes(label.value);
|
||||||
|
|
||||||
|
await api.toggleNoteInParent(found[label.value], note.noteId, categoryNote.noteId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isTaskDone) {
|
||||||
|
for (const assignedCategory of assignedCategories) {
|
||||||
|
if (!found[assignedCategory]) {
|
||||||
|
const categoryNote = (await api.createNote(categoryRootNote.noteId, assignedCategory, "", {
|
||||||
|
attributes: [ { type: "label", name: labelName, value: assignedCategory } ]
|
||||||
|
})).note;
|
||||||
|
|
||||||
|
await api.ensureNoteIsPresentInParent(note.noteId, categoryNote.noteId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
44
notes/Implementation/attribute sync button.js
Normal file
44
notes/Implementation/attribute sync button.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
api.addButtonToToolbar({
|
||||||
|
title: 'Sync task',
|
||||||
|
icon: 'sync',
|
||||||
|
action: async () => {
|
||||||
|
await api.runOnBackend(async (noteId) => {
|
||||||
|
const note = await api.getNote(noteId);
|
||||||
|
const attributes = await note.getAttributes();
|
||||||
|
const todoDate = await note.getLabelValue('todoDate');
|
||||||
|
const doneDate = await note.getLabelValue('doneDate');
|
||||||
|
const canceled = !!(await note.getLabelValue('canceled'));
|
||||||
|
api.log(canceled);
|
||||||
|
const isTaskDone = !!doneDate;
|
||||||
|
|
||||||
|
const canceledRootNote = await api.getNoteWithLabel('taskCanceledRoot');
|
||||||
|
await api.toggleNoteInParent(canceled, note.noteId, canceledRootNote.noteId);
|
||||||
|
|
||||||
|
const doneRootNote = await api.getNoteWithLabel('taskDoneRoot');
|
||||||
|
await api.toggleNoteInParent(isTaskDone && !canceled, note.noteId, doneRootNote.noteId);
|
||||||
|
|
||||||
|
const todoRootNote = await api.getNoteWithLabel('taskTodoRoot');
|
||||||
|
await api.toggleNoteInParent(!isTaskDone && !canceled, note.noteId, todoRootNote.noteId);
|
||||||
|
|
||||||
|
const location = await note.getLabelValue('location');
|
||||||
|
const locationRootNote = await api.getNoteWithLabel('taskLocationRoot');
|
||||||
|
|
||||||
|
await reconcileAssignments(note, locationRootNote, location ? [location] : [], 'taskLocationNote', isTaskDone);
|
||||||
|
|
||||||
|
const tags = attributes.filter(attr => attr.type === 'label' && attr.name === 'tag').map(attr => attr.value);
|
||||||
|
const tagRootNote = await api.getNoteWithLabel('taskTagRoot');
|
||||||
|
|
||||||
|
await reconcileAssignments(note, tagRootNote, tags, 'taskTagNote', isTaskDone);
|
||||||
|
|
||||||
|
await note.toggleLabel(isTaskDone || canceled, "cssClass", "done");
|
||||||
|
|
||||||
|
const doneTargetNoteId = (isTaskDone && !canceled) ? (await api.getDateNote(doneDate)).noteId : null;
|
||||||
|
await api.setNoteToParent(note.noteId, 'DONE', doneTargetNoteId);
|
||||||
|
|
||||||
|
await note.toggleLabel(!isTaskDone && !canceled, "cssClass", "todo");
|
||||||
|
|
||||||
|
const todoTargetNoteId = ((!isTaskDone || canceled) && todoDate) ? (await api.getDateNote(todoDate)).noteId : null;
|
||||||
|
await api.setNoteToParent(note.noteId, 'TODO', todoTargetNoteId);
|
||||||
|
}, [api.getActiveTabNote().noteId]);
|
||||||
|
}
|
||||||
|
});
|
@ -0,0 +1,16 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="../../style.css">
|
||||||
|
<base target="_parent">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="ck-content">
|
||||||
|
<h1>reconcileAssignments</h1>
|
||||||
|
|
||||||
|
<p>This is a clone of a note. Go to its <a href="../attribute%20changed/reconcileAssignments.js">primary location</a>.</p>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
19
notes/Implementation/button.js
Normal file
19
notes/Implementation/button.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
api.addButtonToToolbar({
|
||||||
|
title: 'New task',
|
||||||
|
icon: 'check',
|
||||||
|
shortcut: 'alt+n',
|
||||||
|
action: async () => {
|
||||||
|
// creating notes is backend (server) responsibility so we need to pass
|
||||||
|
// the control there
|
||||||
|
const taskNoteId = await api.runOnServer(async () => {
|
||||||
|
const todoRootNote = await api.getNoteWithLabel('taskTodoRoot');
|
||||||
|
const resp = await api.createTextNote(todoRootNote.noteId, 'new task', '');
|
||||||
|
|
||||||
|
return resp.note.noteId;
|
||||||
|
});
|
||||||
|
|
||||||
|
await api.waitUntilSynced();
|
||||||
|
// we got an ID of newly created note and we want to immediatelly display it
|
||||||
|
await api.activateNewNote(taskNoteId);
|
||||||
|
}
|
||||||
|
});
|
15
notes/Implementation/daily reminder template.html
Normal file
15
notes/Implementation/daily reminder template.html
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="../style.css">
|
||||||
|
<base target="_parent">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="ck-content">
|
||||||
|
<h1>daily reminder template</h1>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
15
notes/Implementation/event template.html
Normal file
15
notes/Implementation/event template.html
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="../style.css">
|
||||||
|
<base target="_parent">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="ck-content">
|
||||||
|
<h1>event template</h1>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
@ -1,11 +1,3 @@
|
|||||||
// Create as JS Backend note and add these attributes:
|
|
||||||
// ~targetTemplateEvent=@event template (this note is described below)
|
|
||||||
// #customRequestHandler=event_alerts
|
|
||||||
// Create another note (event template) with this promoted attributes:
|
|
||||||
// startTime
|
|
||||||
// Optionally add:
|
|
||||||
// endTime, location
|
|
||||||
|
|
||||||
const {req, res} = api;
|
const {req, res} = api;
|
||||||
|
|
||||||
const targetTemplate = await api.currentNote.getRelationValue("targetTemplateEvent");
|
const targetTemplate = await api.currentNote.getRelationValue("targetTemplateEvent");
|
||||||
@ -21,4 +13,4 @@ for (const event of events) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
res.send(eventsData);
|
res.send(eventsData);
|
54
notes/Implementation/new_event handler.js
Normal file
54
notes/Implementation/new_event handler.js
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
function formatTime(startTime) {
|
||||||
|
return startTime.getFullYear().toString() + "-" + (startTime.getMonth() + 1).toString().padStart(2, "0") + "-" + startTime.getDate().toString().padStart(2, "0") + "T" + startTime.getHours().toString().padStart(2, "0") + ":" + startTime.getMinutes().toString().padStart(2, "0") + ":" + startTime.getSeconds().toString().padStart(2, "0");
|
||||||
|
}
|
||||||
|
|
||||||
|
const {req, res} = api;
|
||||||
|
|
||||||
|
const uid = req.body["uid"];
|
||||||
|
const name = req.body["name"];
|
||||||
|
const summary = req.body["summary"];
|
||||||
|
const location = req.body["location"];
|
||||||
|
const fileName = req.body["fileName"];
|
||||||
|
const fileData = req.body["fileData"];
|
||||||
|
const startTime = new Date(req.body["startTime"]);
|
||||||
|
const endTime = new Date(req.body["endTime"]);
|
||||||
|
|
||||||
|
const year = startTime.getFullYear();
|
||||||
|
var month = startTime.getMonth() + 1;
|
||||||
|
var day = startTime.getDate();
|
||||||
|
|
||||||
|
if (month < 10) {
|
||||||
|
month = '0' + month;
|
||||||
|
}
|
||||||
|
if (day < 10) {
|
||||||
|
day = '0' + day;
|
||||||
|
}
|
||||||
|
|
||||||
|
const eventDateStr = year + "-" + month + "-" + day;
|
||||||
|
const dayNote = await api.getDateNote(eventDateStr);
|
||||||
|
|
||||||
|
const targetTemplate = await api.currentNote.getRelationValue('targetTemplate');
|
||||||
|
const options = {
|
||||||
|
"parentNoteId": dayNote.noteId,
|
||||||
|
"title": name,
|
||||||
|
"content": summary,
|
||||||
|
"type": "text"
|
||||||
|
};
|
||||||
|
const resp = await api.createNewNote(options);
|
||||||
|
const note = resp.note;
|
||||||
|
await note.setAttribute("relation", "template", targetTemplate);
|
||||||
|
await note.setAttribute("label", "uid", uid);
|
||||||
|
await note.setAttribute("label", "location", location);
|
||||||
|
const startTimeStr = formatTime(startTime);
|
||||||
|
await note.setAttribute("label", "startTime", startTimeStr);
|
||||||
|
await note.setAttribute("label", "endTime", formatTime(endTime));
|
||||||
|
const fileOptions = {
|
||||||
|
"parentNoteId": note.noteId,
|
||||||
|
"title": fileName,
|
||||||
|
"content": fileData,
|
||||||
|
"type": "file",
|
||||||
|
"mime": "text/calendar"
|
||||||
|
};
|
||||||
|
await api.createNewNote(fileOptions);
|
||||||
|
|
||||||
|
res.sendStatus(200);
|
@ -1,12 +1,3 @@
|
|||||||
// Create as JS Backend note with these attributes:
|
|
||||||
// ~targetTemplate=@reminder template
|
|
||||||
// #customRequestHandler=new_reminder
|
|
||||||
// Create a new note (reminder template) with these promoted attributes:
|
|
||||||
// todoDate: date
|
|
||||||
// todoTime: text
|
|
||||||
// doneDate: date
|
|
||||||
// reminder = true
|
|
||||||
|
|
||||||
Date.prototype.addHours = function(h) {
|
Date.prototype.addHours = function(h) {
|
||||||
this.setTime(this.getTime() + (h*60*60*1000));
|
this.setTime(this.getTime() + (h*60*60*1000));
|
||||||
return this;
|
return this;
|
||||||
@ -46,6 +37,8 @@ if (day < 10) {
|
|||||||
const todayDateStr = year + "-" + month + "-" + day;
|
const todayDateStr = year + "-" + month + "-" + day;
|
||||||
const todayNote = await api.getDateNote(todayDateStr);
|
const todayNote = await api.getDateNote(todayDateStr);
|
||||||
|
|
||||||
|
//const templateNoteId = 'LBDjD6rGxw6I';
|
||||||
|
//const templateNote = await api.getNote('LBDjD6rGxw6I');
|
||||||
const targetTemplate = await api.currentNote.getAttributeValue('relation', 'targetTemplate');
|
const targetTemplate = await api.currentNote.getAttributeValue('relation', 'targetTemplate');
|
||||||
const resp = await api.createNote(
|
const resp = await api.createNote(
|
||||||
todayNote.noteId,
|
todayNote.noteId,
|
15
notes/Implementation/reminder template.html
Normal file
15
notes/Implementation/reminder template.html
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="../style.css">
|
||||||
|
<base target="_parent">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="ck-content">
|
||||||
|
<h1>reminder template</h1>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
15
notes/Implementation/task template.html
Normal file
15
notes/Implementation/task template.html
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="../style.css">
|
||||||
|
<base target="_parent">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="ck-content">
|
||||||
|
<h1>task template</h1>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
56
notes/Implementation/task_alerts handler.js
Normal file
56
notes/Implementation/task_alerts handler.js
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
const {req, res} = api;
|
||||||
|
|
||||||
|
const today = new Date().toISOString().substr(0, 10);
|
||||||
|
|
||||||
|
const targetTemplate = await api.currentNote.getRelationValue('targetTemplate');
|
||||||
|
const tasks = await api.getNotesWithLabel("template", targetTemplate);
|
||||||
|
|
||||||
|
let tasksData = [];
|
||||||
|
|
||||||
|
for (const task of tasks) {
|
||||||
|
const todoDate = task.getAttribute("label", "todoDate");
|
||||||
|
if (!todoDate || todoDate["value"] < today) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tasksData.push({
|
||||||
|
attributes: await task.getAttributes(),
|
||||||
|
...task
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const targetTemplateReminder = await api.currentNote.getRelationValue('targetTemplateReminder');
|
||||||
|
const reminders = await api.getNotesWithLabel("template", targetTemplateReminder);
|
||||||
|
for (const task of reminders) {
|
||||||
|
const todoDate = task.getAttribute("label", "todoDate");
|
||||||
|
if (!todoDate || todoDate["value"] < today) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tasksData.push({
|
||||||
|
attributes: await task.getAttributes(),
|
||||||
|
...task
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const targetTemplateReminderDaily = await api.currentNote.getRelationValue('targetTemplateReminderDaily');
|
||||||
|
const remindersDaily = await api.getNotesWithLabel("template", targetTemplateReminderDaily);
|
||||||
|
for (const task of remindersDaily) {
|
||||||
|
const attributes = await task.getAttributes();
|
||||||
|
attributes.push({
|
||||||
|
"type": "label",
|
||||||
|
"name": "todoDate",
|
||||||
|
"value": today,
|
||||||
|
// API compliance
|
||||||
|
"attributeId": "",
|
||||||
|
"noteId": "",
|
||||||
|
"position": 0,
|
||||||
|
"utcDateModified": "2021-04-23 08:20:14.295Z",
|
||||||
|
"isDeleted": false,
|
||||||
|
"isInheritable": false
|
||||||
|
});
|
||||||
|
tasksData.push({
|
||||||
|
attributes: attributes,
|
||||||
|
...task
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
res.send(tasksData);
|
11
notes/index.html
Normal file
11
notes/index.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
<frameset cols="25%,75%">
|
||||||
|
<frame name="navigation" src="navigation.html">
|
||||||
|
<frame name="detail" src="Implementation/attribute%20changed.js">
|
||||||
|
</frameset>
|
||||||
|
</html>
|
49
notes/navigation.html
Normal file
49
notes/navigation.html
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<ul>
|
||||||
|
<li>Implementation
|
||||||
|
<ul>
|
||||||
|
<li><a href="Implementation/attribute%20changed.js" target="detail">attribute changed</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="Implementation/attribute%20changed/reconcileAssignments.js" target="detail">reconcileAssignments</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="Implementation/button.js" target="detail">button</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="Implementation/CSS.css" target="detail">CSS</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="Implementation/task%20template.html" target="detail">task template</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="Implementation/new_reminder%20handler.js" target="detail">new_reminder handler</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="Implementation/task_alerts%20handler.js" target="detail">task_alerts handler</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="Implementation/reminder%20template.html" target="detail">reminder template</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="Implementation/daily%20reminder%20template.html" target="detail">daily reminder template</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="Implementation/attribute%20sync%20button.js" target="detail">attribute sync button</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="Implementation/attribute%20changed/reconcileAssignments.js" target="detail">reconcileAssignments</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="Implementation/event%20template.html" target="detail">event template</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="Implementation/new_event%20handler.js" target="detail">new_event handler</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="Implementation/event_alerts%20handler.js" target="detail">event_alerts handler</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
339
notes/style.css
Normal file
339
notes/style.css
Normal file
@ -0,0 +1,339 @@
|
|||||||
|
/* !!!!!! TRILIUM CUSTOM CHANGES !!!!!! */
|
||||||
|
|
||||||
|
.printed-content .ck-widget__selection-handle, .printed-content .ck-widget__type-around { /* gets rid of triangles: https://github.com/zadam/trilium/issues/1129 */
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CKEditor 5 (v24.0.0) content styles.
|
||||||
|
* Generated on Thu, 10 Dec 2020 08:15:26 GMT.
|
||||||
|
* For more information, check out https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/content-styles.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--ck-color-mention-background: hsla(341, 100%, 30%, 0.1);
|
||||||
|
--ck-color-mention-text: hsl(341, 100%, 30%);
|
||||||
|
--ck-highlight-marker-blue: hsl(201, 97%, 72%);
|
||||||
|
--ck-highlight-marker-green: hsl(120, 93%, 68%);
|
||||||
|
--ck-highlight-marker-pink: hsl(345, 96%, 73%);
|
||||||
|
--ck-highlight-marker-yellow: hsl(60, 97%, 73%);
|
||||||
|
--ck-highlight-pen-green: hsl(112, 100%, 27%);
|
||||||
|
--ck-highlight-pen-red: hsl(0, 85%, 49%);
|
||||||
|
--ck-image-style-spacing: 1.5em;
|
||||||
|
--ck-todo-list-checkmark-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ckeditor5-image/theme/imageresize.css */
|
||||||
|
.ck-content .image.image_resized {
|
||||||
|
max-width: 100%;
|
||||||
|
display: block;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
/* ckeditor5-image/theme/imageresize.css */
|
||||||
|
.ck-content .image.image_resized img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
/* ckeditor5-image/theme/imageresize.css */
|
||||||
|
.ck-content .image.image_resized > figcaption {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
/* ckeditor5-image/theme/imagestyle.css */
|
||||||
|
.ck-content .image-style-side {
|
||||||
|
float: right;
|
||||||
|
margin-left: var(--ck-image-style-spacing);
|
||||||
|
max-width: 50%;
|
||||||
|
}
|
||||||
|
/* ckeditor5-image/theme/imagestyle.css */
|
||||||
|
.ck-content .image-style-align-left {
|
||||||
|
float: left;
|
||||||
|
margin-right: var(--ck-image-style-spacing);
|
||||||
|
}
|
||||||
|
/* ckeditor5-image/theme/imagestyle.css */
|
||||||
|
.ck-content .image-style-align-center {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
/* ckeditor5-image/theme/imagestyle.css */
|
||||||
|
.ck-content .image-style-align-right {
|
||||||
|
float: right;
|
||||||
|
margin-left: var(--ck-image-style-spacing);
|
||||||
|
}
|
||||||
|
/* ckeditor5-image/theme/image.css */
|
||||||
|
.ck-content .image {
|
||||||
|
display: table;
|
||||||
|
clear: both;
|
||||||
|
text-align: center;
|
||||||
|
margin: 1em auto;
|
||||||
|
}
|
||||||
|
/* ckeditor5-image/theme/image.css */
|
||||||
|
.ck-content .image img {
|
||||||
|
display: block;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 100%;
|
||||||
|
min-width: 50px;
|
||||||
|
}
|
||||||
|
/* ckeditor5-image/theme/imagecaption.css */
|
||||||
|
.ck-content .image > figcaption {
|
||||||
|
display: table-caption;
|
||||||
|
caption-side: bottom;
|
||||||
|
word-break: break-word;
|
||||||
|
color: hsl(0, 0%, 20%);
|
||||||
|
background-color: hsl(0, 0%, 97%);
|
||||||
|
padding: .6em;
|
||||||
|
font-size: .75em;
|
||||||
|
outline-offset: -1px;
|
||||||
|
}
|
||||||
|
/* ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .marker-yellow {
|
||||||
|
background-color: var(--ck-highlight-marker-yellow);
|
||||||
|
}
|
||||||
|
/* ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .marker-green {
|
||||||
|
background-color: var(--ck-highlight-marker-green);
|
||||||
|
}
|
||||||
|
/* ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .marker-pink {
|
||||||
|
background-color: var(--ck-highlight-marker-pink);
|
||||||
|
}
|
||||||
|
/* ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .marker-blue {
|
||||||
|
background-color: var(--ck-highlight-marker-blue);
|
||||||
|
}
|
||||||
|
/* ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .pen-red {
|
||||||
|
color: var(--ck-highlight-pen-red);
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
/* ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .pen-green {
|
||||||
|
color: var(--ck-highlight-pen-green);
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
/* ckeditor5-font/theme/fontsize.css */
|
||||||
|
.ck-content .text-tiny {
|
||||||
|
font-size: .7em;
|
||||||
|
}
|
||||||
|
/* ckeditor5-font/theme/fontsize.css */
|
||||||
|
.ck-content .text-small {
|
||||||
|
font-size: .85em;
|
||||||
|
}
|
||||||
|
/* ckeditor5-font/theme/fontsize.css */
|
||||||
|
.ck-content .text-big {
|
||||||
|
font-size: 1.4em;
|
||||||
|
}
|
||||||
|
/* ckeditor5-font/theme/fontsize.css */
|
||||||
|
.ck-content .text-huge {
|
||||||
|
font-size: 1.8em;
|
||||||
|
}
|
||||||
|
/* ckeditor5-block-quote/theme/blockquote.css */
|
||||||
|
.ck-content blockquote {
|
||||||
|
overflow: hidden;
|
||||||
|
padding-right: 1.5em;
|
||||||
|
padding-left: 1.5em;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
font-style: italic;
|
||||||
|
border-left: solid 5px hsl(0, 0%, 80%);
|
||||||
|
}
|
||||||
|
/* ckeditor5-block-quote/theme/blockquote.css */
|
||||||
|
.ck-content[dir="rtl"] blockquote {
|
||||||
|
border-left: 0;
|
||||||
|
border-right: solid 5px hsl(0, 0%, 80%);
|
||||||
|
}
|
||||||
|
/* ckeditor5-basic-styles/theme/code.css */
|
||||||
|
.ck-content code {
|
||||||
|
background-color: hsla(0, 0%, 78%, 0.3);
|
||||||
|
padding: .15em;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
/* ckeditor5-table/theme/table.css */
|
||||||
|
.ck-content .table {
|
||||||
|
margin: 1em auto;
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
/* ckeditor5-table/theme/table.css */
|
||||||
|
.ck-content .table table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border: 1px double hsl(0, 0%, 70%);
|
||||||
|
}
|
||||||
|
/* ckeditor5-table/theme/table.css */
|
||||||
|
.ck-content .table table td,
|
||||||
|
.ck-content .table table th {
|
||||||
|
min-width: 2em;
|
||||||
|
padding: .4em;
|
||||||
|
border: 1px solid hsl(0, 0%, 75%);
|
||||||
|
}
|
||||||
|
/* ckeditor5-table/theme/table.css */
|
||||||
|
.ck-content .table table th {
|
||||||
|
font-weight: bold;
|
||||||
|
background: hsla(0, 0%, 0%, 5%);
|
||||||
|
}
|
||||||
|
/* ckeditor5-table/theme/table.css */
|
||||||
|
.ck-content[dir="rtl"] .table th {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
/* ckeditor5-table/theme/table.css */
|
||||||
|
.ck-content[dir="ltr"] .table th {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
/* ckeditor5-page-break/theme/pagebreak.css */
|
||||||
|
.ck-content .page-break {
|
||||||
|
position: relative;
|
||||||
|
clear: both;
|
||||||
|
padding: 5px 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
/* ckeditor5-page-break/theme/pagebreak.css */
|
||||||
|
.ck-content .page-break::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
border-bottom: 2px dashed hsl(0, 0%, 77%);
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
/* ckeditor5-page-break/theme/pagebreak.css */
|
||||||
|
.ck-content .page-break__label {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
padding: .3em .6em;
|
||||||
|
display: block;
|
||||||
|
text-transform: uppercase;
|
||||||
|
border: 1px solid hsl(0, 0%, 77%);
|
||||||
|
border-radius: 2px;
|
||||||
|
font-family: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;
|
||||||
|
font-size: 0.75em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: hsl(0, 0%, 20%);
|
||||||
|
background: hsl(0, 0%, 100%);
|
||||||
|
box-shadow: 2px 2px 1px hsla(0, 0%, 0%, 0.15);
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
/* ckeditor5-media-embed/theme/mediaembed.css */
|
||||||
|
.ck-content .media {
|
||||||
|
clear: both;
|
||||||
|
margin: 1em 0;
|
||||||
|
display: block;
|
||||||
|
min-width: 15em;
|
||||||
|
}
|
||||||
|
/* ckeditor5-list/theme/todolist.css */
|
||||||
|
.ck-content .todo-list {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
/* ckeditor5-list/theme/todolist.css */
|
||||||
|
.ck-content .todo-list li {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
/* ckeditor5-list/theme/todolist.css */
|
||||||
|
.ck-content .todo-list li .todo-list {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
/* ckeditor5-list/theme/todolist.css */
|
||||||
|
.ck-content .todo-list .todo-list__label > input {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
width: var(--ck-todo-list-checkmark-size);
|
||||||
|
height: var(--ck-todo-list-checkmark-size);
|
||||||
|
vertical-align: middle;
|
||||||
|
border: 0;
|
||||||
|
left: -25px;
|
||||||
|
margin-right: -15px;
|
||||||
|
right: 0;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
/* ckeditor5-list/theme/todolist.css */
|
||||||
|
.ck-content .todo-list .todo-list__label > input::before {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
box-sizing: border-box;
|
||||||
|
content: '';
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border: 1px solid hsl(0, 0%, 20%);
|
||||||
|
border-radius: 2px;
|
||||||
|
transition: 250ms ease-in-out box-shadow, 250ms ease-in-out background, 250ms ease-in-out border;
|
||||||
|
}
|
||||||
|
/* ckeditor5-list/theme/todolist.css */
|
||||||
|
.ck-content .todo-list .todo-list__label > input::after {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
box-sizing: content-box;
|
||||||
|
pointer-events: none;
|
||||||
|
content: '';
|
||||||
|
left: calc( var(--ck-todo-list-checkmark-size) / 3 );
|
||||||
|
top: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
|
||||||
|
width: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
|
||||||
|
height: calc( var(--ck-todo-list-checkmark-size) / 2.6 );
|
||||||
|
border-style: solid;
|
||||||
|
border-color: transparent;
|
||||||
|
border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;
|
||||||
|
transform: rotate(45deg);
|
||||||
|
}
|
||||||
|
/* ckeditor5-list/theme/todolist.css */
|
||||||
|
.ck-content .todo-list .todo-list__label > input[checked]::before {
|
||||||
|
background: hsl(126, 64%, 41%);
|
||||||
|
border-color: hsl(126, 64%, 41%);
|
||||||
|
}
|
||||||
|
/* ckeditor5-list/theme/todolist.css */
|
||||||
|
.ck-content .todo-list .todo-list__label > input[checked]::after {
|
||||||
|
border-color: hsl(0, 0%, 100%);
|
||||||
|
}
|
||||||
|
/* ckeditor5-list/theme/todolist.css */
|
||||||
|
.ck-content .todo-list .todo-list__label .todo-list__label__description {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
/* ckeditor5-html-embed/theme/htmlembed.css */
|
||||||
|
.ck-content .raw-html-embed {
|
||||||
|
margin: 1em auto;
|
||||||
|
min-width: 15em;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
/* ckeditor5-horizontal-line/theme/horizontalline.css */
|
||||||
|
.ck-content hr {
|
||||||
|
margin: 15px 0;
|
||||||
|
height: 4px;
|
||||||
|
background: hsl(0, 0%, 87%);
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
/* ckeditor5-code-block/theme/codeblock.css */
|
||||||
|
.ck-content pre {
|
||||||
|
padding: 1em;
|
||||||
|
color: hsl(0, 0%, 20.8%);
|
||||||
|
background: hsla(0, 0%, 78%, 0.3);
|
||||||
|
border: 1px solid hsl(0, 0%, 77%);
|
||||||
|
border-radius: 2px;
|
||||||
|
text-align: left;
|
||||||
|
direction: ltr;
|
||||||
|
tab-size: 4;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
font-style: normal;
|
||||||
|
min-width: 200px;
|
||||||
|
}
|
||||||
|
/* ckeditor5-code-block/theme/codeblock.css */
|
||||||
|
.ck-content pre code {
|
||||||
|
background: unset;
|
||||||
|
padding: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
/* ckeditor5-mention/theme/mention.css */
|
||||||
|
.ck-content .mention {
|
||||||
|
background: var(--ck-color-mention-background);
|
||||||
|
color: var(--ck-color-mention-text);
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
/* ckeditor5-page-break/theme/pagebreak.css */
|
||||||
|
.ck-content .page-break {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
/* ckeditor5-page-break/theme/pagebreak.css */
|
||||||
|
.ck-content .page-break::after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
@ -1,29 +0,0 @@
|
|||||||
// Create as JS Backend note with attributes:
|
|
||||||
// ~targetTemplate=@task template (included in Trilium task manager)
|
|
||||||
// #customRequestHandler=task_alerts
|
|
||||||
// ~targetTemplateReminder=@reminder template (see new_reminder.js)
|
|
||||||
|
|
||||||
const {req, res} = api;
|
|
||||||
|
|
||||||
const targetTemplate = await api.currentNote.getRelationValue('targetTemplate');
|
|
||||||
const tasks = await api.getNotesWithLabel("template", targetTemplate);
|
|
||||||
|
|
||||||
let tasksData = [];
|
|
||||||
|
|
||||||
for (const task of tasks) {
|
|
||||||
tasksData.push({
|
|
||||||
attributes: await task.getAttributes(),
|
|
||||||
...task
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const targetTemplateReminder = await api.currentNote.getRelationValue('targetTemplateReminder');
|
|
||||||
const reminders = await api.getNotesWithLabel("template", targetTemplateReminder);
|
|
||||||
for (const task of reminders) {
|
|
||||||
tasksData.push({
|
|
||||||
attributes: await task.getAttributes(),
|
|
||||||
...task
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
res.send(tasksData);
|
|
Loading…
Reference in New Issue
Block a user