Compare commits

..

1741 Commits

Author SHA1 Message Date
zadam
37da0adb8a release 0.42.2 2020-05-12 16:46:45 +02:00
zadam
4f50864ec8 better UX when deleting notes - focus in note tree is moved to the next/previous note 2020-05-12 13:40:42 +02:00
zadam
30b9ef8604 fix tab title of deleted note 2020-05-12 12:45:32 +02:00
zadam
b063b4c528 read only view images should not overflow 2020-05-12 12:28:59 +02:00
zadam
e08b0141a4 when expanding/collpasing, set the flag also to the tree cache 2020-05-12 10:52:07 +02:00
zadam
9d8b8e26a1 attach extension to download file if note present 2020-05-12 10:28:31 +02:00
zadam
cb70109ee7 fix creating new promoted attributes, closes #1008
(cherry picked from commit 2e0fb8aaf1)
2020-05-12 00:00:59 +02:00
zadam
e541abbd60 disable hiding the body to not hide the noscript element 2020-05-11 22:44:10 +02:00
Naveen M V
940a70adc5 Fix regex bug (#1005)
(cherry picked from commit 9a662f76da)
2020-05-11 22:06:39 +02:00
zadam
88e8eb7e9c fixed context menu positioning when scaling is active 2020-05-11 20:08:55 +02:00
zadam
b365c186a1 fixed clicking on links in read only view 2020-05-11 19:38:14 +02:00
zadam
64c9734f05 transform setup.js to the webpacked version in the build 2020-05-08 20:50:53 +02:00
zadam
48c843c087 fix setup on server edition 2020-05-08 10:24:57 +02:00
zadam
0e4eec10b9 added "restore this revision" button 2020-05-07 23:34:13 +02:00
zadam
a3661cb763 fix display of buttons for revisions when there is none 2020-05-07 23:14:21 +02:00
zadam
115879ec4a fix note revisions displaying wrong tooltip 2020-05-07 23:02:46 +02:00
zadam
df11b076bc release 0.42.1 2020-05-06 23:24:13 +02:00
MeIchthys
54ecd2ee75 Prevent td text from overlapping th text (#1002)
This makes all of the Note Info sections more consistent with each other. It prevents overlapping of text when the window is displayed in a small-width environment.
2020-05-06 23:12:28 +02:00
zadam
2369bcf9fc fixes for image download 2020-05-06 23:11:34 +02:00
zadam
5d8808a2ad fix renaming existing attributes + added new label autoReadOnlyDisabled to control automatic setting to readOnly mode 2020-05-06 21:41:14 +02:00
zadam
62b993f06f fix closing tab by mouse 2020-05-06 21:24:51 +02:00
zadam
8aa5608085 fix "Render note" and "Execute script" buttons + refactoring around data-trigger-command handling 2020-05-06 00:00:14 +02:00
zadam
b452d7e5c5 Merge remote-tracking branch 'origin/stable' 2020-05-06 00:00:01 +02:00
zadam
9b9d6d86d0 remove debugging console.log 2020-05-05 22:51:53 +02:00
zadam
7f2755d4a0 refresh button state change on note update 2020-05-05 22:18:09 +02:00
zadam
3b268cc8eb fix selecting note title after creation, closes #997 2020-05-05 21:42:18 +02:00
zadam
6dfe335707 added global menu item to open new empty window + some refactoring 2020-05-05 19:30:03 +02:00
zadam
c7125d2b50 createNoteAfter should have saveSelection: false 2020-05-05 19:09:01 +02:00
zadam
e8a33a5ee7 fix note title not updating when changing the title 2020-05-05 18:56:12 +02:00
zadam
deb0b24c4c release 0.42.0-beta 2020-05-04 21:59:14 +02:00
zadam
cafcb67a8a remove dangling autocompletes after closing the tab 2020-05-04 21:58:40 +02:00
zadam
4c6e9480e4 revert #980 because of performance issues 2020-05-04 21:49:03 +02:00
zadam
109bead1c7 removed unnecessary async/awaits 2020-05-04 10:19:11 +02:00
zadam
ae1220b970 remove debug 2020-05-04 10:04:50 +02:00
zadam
b89a2df462 fix image being redownloaded from localhost 2020-05-04 10:03:54 +02:00
zadam
8b5536ee3a note title widget and protected session entering fixes 2020-05-03 22:49:20 +02:00
zadam
647790885d downgrade sqlite3 library which has issues with electron build 2020-05-03 21:27:24 +02:00
zadam
227c3e4dcc fixes for offline downloading of images 2020-05-03 14:33:59 +02:00
zadam
4eb2407c73 fix folder icon for hidden included images 2020-05-03 13:59:49 +02:00
zadam
43e12fbea2 small fixes for collapse/expand 2020-05-03 13:52:12 +02:00
zadam
2a3091f788 reimplemented expand/collapse differently for better performance 2020-05-03 13:15:08 +02:00
zadam
742df25bc2 collapse/expand only folder notes 2020-05-03 09:49:56 +02:00
zadam
9be1d1f697 add note attribute cache to speed up tree loading 2020-05-02 18:19:41 +02:00
zadam
ed52f93bbb tree settings popup fixes 2020-05-02 13:52:02 +02:00
zadam
3466a19397 protection against recursive expansion of search notes 2020-05-02 12:16:48 +02:00
zadam
fe53e2351c basic implementation of note tree's config 2020-05-02 00:28:40 +02:00
zadam
5c35b870eb added titles with full date time including timezone offset also to note revisions dialog/widget 2020-05-01 00:01:53 +02:00
zadam
90d091aedb make note tree initial load non-lazy 2020-04-30 23:58:34 +02:00
zadam
0a05a40186 fix expand subtree's conflict with auto-lazy loading 2020-04-30 23:09:25 +02:00
zadam
7482ed063b Merge remote-tracking branch 'origin/stable' 2020-04-29 23:27:39 +02:00
zadam
70e343f2fc fix showing deleted notes in "recent changes" dialog, closes #994 2020-04-29 23:25:34 +02:00
zadam
358f3a7291 implement "expand subtree" contet menu, closes #993 2020-04-29 23:13:05 +02:00
zadam
6161b1c193 Merge remote-tracking branch 'origin/stable' 2020-04-29 22:27:46 +02:00
zadam
94b57dadd7 removed link context menu on JS-only links 2020-04-29 22:27:22 +02:00
zadam
81fbefb9cd added scripts for running trilium as "portable" 2020-04-29 21:55:57 +02:00
zadam
6d6695e3a9 ckeditor 19 2020-04-29 17:29:32 +02:00
zadam
4c308ad68f moved protected note switch to "note actions", added shadow to protected note title 2020-04-29 00:01:07 +02:00
zadam
989a003d2f borderless title bar buttons 2020-04-28 21:55:54 +02:00
zadam
ccdb41841e release 0.41.6 2020-04-27 23:46:48 +02:00
zadam
0a94622413 fix drag and drop in the tree, closes #984 2020-04-27 23:39:10 +02:00
zadam
5769587305 experimental hiding of images if they are included in the parent note 2020-04-27 23:27:45 +02:00
zadam
ffbfccb701 extra window now works in browsers too 2020-04-27 22:29:39 +02:00
zadam
56ce23fc36 fix collapsing of note revisions 2020-04-27 22:13:32 +02:00
zadam
cba7e5a59f fix collapsing of note revisions 2020-04-27 21:44:25 +02:00
zadam
86cf8f3202 fix download/export 2020-04-27 20:58:31 +02:00
zadam
907cdd8fcb fixes for extra window 2020-04-26 23:11:52 +02:00
zadam
7ea53d468e use local dates in the recent changes 2020-04-26 14:39:13 +02:00
zadam
586d6b4557 in web version use local client time instead of server time for recording dateModified etc. 2020-04-26 14:26:57 +02:00
zadam
8f68ff1932 tweaks for the code preview 2020-04-26 12:06:54 +02:00
zadam
a1ea2c9115 read only code notes WIP 2020-04-26 11:38:30 +02:00
zadam
e8ce81a133 organize widgets a bit 2020-04-26 09:40:02 +02:00
zadam
aff12950f0 Merge remote-tracking branch 'origin/master' into m42
# Conflicts:
#	src/public/app/services/app_context.js
2020-04-25 23:53:19 +02:00
zadam
75c58cbf79 refactored layouts for extra window 2020-04-25 23:52:13 +02:00
zadam
87a1e98fa2 default search should look also into attribute names and values, #980 2020-04-25 22:10:56 +02:00
zadam
d1eacbb574 more robust entering protected session and the following protection of a note 2020-04-25 17:15:57 +02:00
zadam
71d248cd87 touch protected session during note update 2020-04-25 11:09:07 +02:00
zadam
ac608b9334 small text changes 2020-04-24 21:21:22 +02:00
zadam
32020d78b5 prototype for new app window 2020-04-23 23:08:15 +02:00
zadam
ff853c7d0a implement lazy loading of tabs which speeds up especially initial startup with many tabs 2020-04-22 23:09:35 +02:00
zadam
8526cb2315 added collapsible widgets to the docs 2020-04-21 23:14:55 +02:00
zadam
dc89f72e75 fix display of text notes in note revisions 2020-04-21 22:59:37 +02:00
zadam
657ff16267 fix build webpack 2020-04-20 23:14:50 +02:00
zadam
ed759f5585 release 0.41.5 2020-04-20 22:40:02 +02:00
zadam
a86177bb59 release 0.41.5 2020-04-20 22:39:23 +02:00
zadam
9f1b3cc892 note paths widget has context menu too 2020-04-20 22:38:37 +02:00
zadam
8473f72ec8 fix support of multiple languages for spellchecking + list all available languages, closes #974 2020-04-20 22:26:31 +02:00
zadam
666d202a3a deps updates 2020-04-19 09:42:10 +02:00
zadam
988fae50cb fix help links and displayed shortcuts, closes #971 2020-04-18 11:14:09 +02:00
zadam
98bbd17920 release 0.41.4-beta 2020-04-15 23:00:13 +02:00
zadam
dadcc93ae3 focus and select title after creating a note 2020-04-15 22:06:52 +02:00
zadam
48e19d0149 fix webpack buidl 2020-04-15 21:49:36 +02:00
zadam
f97c9e3619 release 0.41.3-beta 2020-04-14 22:19:56 +02:00
zadam
61167f6646 make sure to close sqlite connection on exit 2020-04-14 22:15:55 +02:00
zadam
29cec8112e fix setup of new document, closes #966 2020-04-14 21:57:42 +02:00
zadam
48aadc8309 fix parsing of includeNote, closes #963 2020-04-13 18:12:41 +02:00
zadam
b2508db9af release 0.41.2-beta 2020-04-13 10:30:11 +02:00
zadam
87510fd72b include note styling changes 2020-04-13 10:13:03 +02:00
zadam
339f212e4c added webpack 2020-04-12 14:22:51 +02:00
zadam
3c311cd2a4 loading indicator and optimisations for mobile 2020-04-11 22:06:04 +02:00
zadam
b5bf581bd9 don't select tree node when dragging 2020-04-11 15:09:38 +02:00
zadam
242f139be4 allow specifying include note widget size 2020-04-11 11:49:58 +02:00
zadam
6c76d862d2 fix creating link with selection -> must by hyper link, closes #959 2020-04-11 09:47:19 +02:00
zadam
62bc05134e sqlite upgrade 2020-04-09 21:20:14 +02:00
zadam
50d3928dd5 release 0.41.1-beta 2020-04-08 22:10:55 +02:00
zadam
44d641617e fix relation map in demo document 2020-04-08 22:09:32 +02:00
zadam
f3b84e5185 use ckeditor content styles also for read only notes, tooltips and book notes 2020-04-08 21:38:11 +02:00
zadam
34b8979016 make note paths work better with hoisted note 2020-04-08 20:38:50 +02:00
zadam
6c188982b3 added some logging 2020-04-08 11:07:38 +02:00
zadam
1175a8ee49 display last noteId in the note path widget as well 2020-04-08 10:19:15 +02:00
zadam
9c04ef9fb7 note path widget tweaks 2020-04-08 10:13:11 +02:00
zadam
6cc3e3cdf6 note paths is now on the left side and showing current path 2020-04-07 22:53:03 +02:00
zadam
f8bd55374f support for included notes and reference links also in read only text views 2020-04-07 21:28:40 +02:00
zadam
3ccb1c6ac1 refactoring to editable_text 2020-04-07 21:04:28 +02:00
zadam
d34d265d01 API docs update 2020-04-07 19:19:20 +02:00
zadam
c063f75f48 fix ZIP import of notes with included note 2020-04-06 22:46:11 +02:00
zadam
2d1f3b7633 renamed text preview to read only text 2020-04-06 22:21:09 +02:00
zadam
3772d97dfa basic text preview implemented 2020-04-06 22:08:54 +02:00
zadam
5c0355718f repository has now first level cache 2020-04-06 20:59:04 +02:00
zadam
081693f263 not generating externalLink labels anymore since there can be too many and benefit is too small 2020-04-05 16:06:13 +02:00
zadam
8d312515dd small fixes 2020-04-05 15:35:01 +02:00
zadam
7bd05415fa revert fancytree upgrade which caused some issues (tree duplication) 2020-04-05 12:56:25 +02:00
zadam
8d7687f354 fix copying template's content, closes #943 2020-04-05 12:28:16 +02:00
zadam
42128c007f fix "search in subtree", closes #941 2020-04-04 22:49:30 +02:00
zadam
dfb97d64f7 fix showing promoted notes, closes #944 2020-04-04 22:40:32 +02:00
zadam
b1bed18331 significantly faster sync with transactions 2020-04-04 21:49:57 +02:00
zadam
ae50c9847d sync refactorings, added logging for performance tracking 2020-04-04 14:57:19 +02:00
zadam
6201dd70a0 small fixes in consistency_checks 2020-04-04 09:46:49 +02:00
zadam
451c408063 small fixes 2020-04-03 19:34:22 +02:00
zadam
3bbb213f82 fixes for web clipper 2020-04-02 22:55:11 +02:00
zadam
bab657e43d release 0.41.0-beta 2020-03-31 22:12:31 +02:00
zadam
4b24d9562c fix visibility of panels after startup with hidden state 2020-03-31 22:09:05 +02:00
zadam
a73739d03e small fixes 2020-03-31 21:47:15 +02:00
zadam
4485650cbc library upgrades 2020-03-31 20:52:41 +02:00
zadam
58f610b2c6 fix mobile frontend 2020-03-29 23:10:45 +02:00
zadam
5024454914 better activation behavior when move notes 2020-03-29 22:54:14 +02:00
zadam
ca0e36ea81 fix render type non-scrolling 2020-03-29 22:27:05 +02:00
zadam
c9b2ff05e9 book notes don't display images as separate children if the image is included in the parent text note, #892 2020-03-29 22:15:09 +02:00
zadam
0973498fe9 small fixes 2020-03-29 20:37:40 +02:00
zadam
189202b1f6 added context menu "recent changes in subtree" 2020-03-29 19:43:04 +02:00
zadam
cc298b1e7a recent changes respect hoisted note state 2020-03-29 19:37:34 +02:00
zadam
f8bd6183bf fix default document 2020-03-29 18:53:32 +02:00
zadam
ef60cb5395 fix placing notes onto relation map by drag & drop 2020-03-29 18:49:30 +02:00
zadam
b10c083560 check for images happens before other methods in utils.isHtmlEmpty() 2020-03-29 17:11:44 +02:00
zadam
8eeb395523 updated sqlite binaries from linux & mac 2020-03-29 17:06:35 +02:00
zadam
084882a50e fixes in ckeditor build 2020-03-29 15:58:18 +02:00
zadam
7c04521e9c Merge remote-tracking branch 'origin/stable'
# Conflicts:
#	src/public/javascripts/mobile.js
#	src/public/stylesheets/mobile.css
2020-03-29 15:41:27 +02:00
zadam
0a0de7312c release 0.40.7 2020-03-28 20:58:20 +01:00
zadam
37255243f7 allow user to see their username in the options #934 2020-03-28 19:55:02 +01:00
zadam
b4b22d9353 workaround for overflowing component wrapper in landscape mobile frontend, fixes #933 2020-03-28 19:39:14 +01:00
zadam
d3eb640aa2 fix upload image from mobile frontend, closes #931 2020-03-28 19:25:19 +01:00
zadam
78d431387b updated win64 sqlite binary 2020-03-27 21:47:22 +01:00
zadam
c4bc53da59 updates to the demo document 2020-03-26 22:22:18 +01:00
zadam
34de8fb874 improved reference link handling 2020-03-26 20:40:15 +01:00
zadam
5a6ab68144 added a progress screen for setup of a new document 2020-03-26 17:47:56 +01:00
zadam
c4e5b35187 changed demo.tar to demo.zip 2020-03-26 17:05:17 +01:00
zadam
2e55d544f1 db setup fixes 2020-03-26 16:59:40 +01:00
zadam
b778985b5e minor fixes and upgrades 2020-03-26 16:21:17 +01:00
zadam
f9a79fa00f improvements and logging to local image storage 2020-03-25 21:01:42 +01:00
zadam
ef61e22f1f local image storage fixes 2020-03-25 18:21:55 +01:00
zadam
8a92786012 save paste images locally WIP 2020-03-25 11:28:44 +01:00
zadam
a856463173 correctly handle clicks on reference links 2020-03-23 20:18:54 +01:00
zadam
cb168218fb proper handling of deleted notes 2020-03-23 16:39:03 +01:00
zadam
978575498c reference insertion is now immediate 2020-03-23 12:31:10 +01:00
zadam
8584de27ab mentions also insert reference links 2020-03-22 18:27:13 +01:00
zadam
a36d6bf9be add link dialog now allows switching between reference link and normal hyperlink 2020-03-22 11:41:00 +01:00
zadam
9b17e9976e basic implementation of reference link functionality 2020-03-21 21:04:34 +01:00
zadam
d927865cbd fix import zip corner case where there are 2 independent notes with the same name 2020-03-21 15:14:44 +01:00
zadam
6de0b19569 add image through "include note" will just insert image instead of standard include note element, #922 2020-03-21 10:38:27 +01:00
zadam
84d7097b1a Merge remote-tracking branch 'origin/stable' 2020-03-21 10:05:15 +01:00
zadam
8ccc48c25d images in include note should have max 100% width, #922 2020-03-21 09:52:13 +01:00
zadam
438da7cfbb two pass import from zip file to guarantee that meta file is loaded before other files are process 2020-03-20 22:13:29 +01:00
zadam
af5c4b5859 zip import using yazl 2020-03-20 21:57:16 +01:00
zadam
04360381b6 reimplement export with yazl 2020-03-20 16:55:35 +01:00
zadam
45e2dc96fb export subtrees in ZIP instead of TAR format because of more widespread support (especially unicode) 2020-03-19 20:07:27 +01:00
zadam
ff426fc1fc added more placement points for custom widgets 2020-03-19 17:15:14 +01:00
zadam
6dfc2755e7 ckeditor 18 2020-03-19 16:29:48 +01:00
zadam
789f12ac8f Merge remote-tracking branch 'origin/stable' 2020-03-19 09:44:00 +01:00
zadam
9a1a76605a fix OPML export of book notes, closes #919 2020-03-19 09:42:41 +01:00
zadam
debce78c7f load ancestors and templates when receiving sync from backend 2020-03-19 09:18:36 +01:00
zadam
48c57c7ce7 always keep all the ancestors in the cache WIP 2020-03-18 22:42:29 +01:00
zadam
4a89df7ebf always keep all the ancestors in the tree WIP 2020-03-18 22:35:54 +01:00
zadam
6295a1825d fixes in setting/opening tabs 2020-03-18 10:08:16 +01:00
zadam
280955b3a2 fix events from keyboard shortcuts 2020-03-17 22:49:43 +01:00
zadam
72cc54a83f fixed global create new day note 2020-03-17 21:39:26 +01:00
zadam
c3b44b9a91 fixed & improved history navigation - context menu now indicates current, "future" and "past" items 2020-03-17 21:15:57 +01:00
zadam
8a9875ecfa fix filling or targetRelations during backend2frontend sync 2020-03-17 18:38:49 +01:00
zadam
9230b07adb focus created note 2020-03-17 12:48:09 +01:00
zadam
5a6066dcd1 fix "create note after" keyboard shortcut 2020-03-17 12:28:02 +01:00
zadam
d4d54c5f01 fix createNoteInto keyboard shortcut 2020-03-17 11:28:41 +01:00
zadam
141d4593ca fix loading of custom widgets 2020-03-16 23:25:52 +01:00
zadam
a7ddc33b6d sorting of widgets 2020-03-16 22:14:18 +01:00
zadam
173030e02e basic support for custom widgets 2020-03-16 21:16:09 +01:00
zadam
8ae78a9e23 Create FUNDING.yml 2020-03-16 08:25:20 +01:00
zadam
babc27f824 update dayjs 2020-03-16 08:21:53 +01:00
zadam
2c7eb723d5 fix note hoisting 2020-03-15 22:11:42 +01:00
zadam
40247a591e fix delete shortcut in note tree and protect notes recursively 2020-03-15 22:09:48 +01:00
zadam
3a4d32f163 fix clone-to, move-to keyboard shortcuts 2020-03-15 21:52:04 +01:00
zadam
7f2c859b94 fix detail font size setting 2020-03-15 21:40:26 +01:00
zadam
a5764c269f pdf preview is now also available in include note, book etc. 2020-03-15 21:35:43 +01:00
zadam
6a1bfdeab9 fix autobook switching back to text 2020-03-15 21:31:25 +01:00
zadam
6de0f75931 fix switching notes in the passive tabs 2020-03-15 18:57:03 +01:00
zadam
fcf72262bd Merge remote-tracking branch 'origin/stable' 2020-03-15 18:23:21 +01:00
zadam
114017147f fix load results isEmpty method 2020-03-15 17:18:50 +01:00
zadam
a717ee00fb release 0.40.6 2020-03-15 11:21:43 +01:00
zadam
f5e27278ab fix migration script to preserve sync IDs 2020-03-15 11:19:30 +01:00
zadam
2cc0442ef2 fix new tab open hiding 2020-03-15 11:08:16 +01:00
zadam
687a466a35 Merge remote-tracking branch 'origin/stable' 2020-03-15 09:57:57 +01:00
zadam
20c24e26cc added entity constructors for "content" tables 2020-03-14 21:09:07 +01:00
zadam
3bafc396fc fix consistency checks 2020-03-14 13:13:27 +01:00
zadam
08606f7d88 Merge remote-tracking branch 'origin/stable'
# Conflicts:
#	src/services/sync_table.js
2020-03-14 12:58:47 +01:00
zadam
3fa3e912a4 not sending ping to clients after every sync addition, only after commit which significantly speeds up imports 2020-03-14 12:39:55 +01:00
zadam
44219e7ccc do not load the note content during ENEX import again since it's already available 2020-03-13 22:23:44 +01:00
zadam
48abd765c6 fix sync issues 2020-03-11 22:43:20 +01:00
zadam
2d38706ba8 wip 2020-03-10 23:33:39 +01:00
zadam
8d45662bee clear history in the code mirror after setting a value, closes #766 2020-03-10 22:51:44 +01:00
zadam
dc4024b6de Merge remote-tracking branch 'origin/stable'
# Conflicts:
#	src/public/javascripts/services/note_detail_code.js
2020-03-10 22:51:02 +01:00
zadam
5b67854cbe clear history in the code mirror after setting a value, closes #766 2020-03-10 22:48:21 +01:00
zadam
72745aca29 fix unnecessary scroll to parent when opening new tab 2020-03-10 22:25:57 +01:00
zadam
e6e41adad0 fix backend to frontend sync with waitForSyncId() 2020-03-10 21:33:03 +01:00
zadam
bcbf1b79c3 fixed waitForSync 2020-03-09 22:32:26 +01:00
zadam
1d78432df4 Merge remote-tracking branch 'origin/stable' 2020-03-09 22:16:43 +01:00
zadam
c6d912dcb7 sync only changes with isSynced = true 2020-03-09 21:34:03 +01:00
zadam
eb287917c1 set sync.isSynced correctly 2020-03-09 21:28:41 +01:00
zadam
da53c1eaa8 updated schema.sql 2020-03-09 21:23:11 +01:00
zadam
c67613a557 Merge remote-tracking branch 'origin/stable' 2020-03-09 21:00:38 +01:00
zadam
0ca107ff48 fix event listener for resize 2020-03-09 21:00:31 +01:00
zadam
73bf2dcb02 added isSynced to sync table to allow forward compatibility with 0.41 2020-03-09 20:56:43 +01:00
zadam
719f10981e fix sync 2020-03-08 22:00:12 +01:00
zadam
1774f48d07 fix sync 2020-03-08 21:59:19 +01:00
zadam
deb67d6275 release 0.40.5 2020-03-08 21:05:52 +01:00
zadam
bafd829ff6 updated electron 9.0 binary dependencies 2020-03-08 20:17:28 +01:00
zadam
e7aa84435b render PDF preview in electron for pdf notes 2020-03-08 18:06:24 +01:00
zadam
493d088d80 better back/forward navigation 2020-03-08 17:17:18 +01:00
zadam
5f4d963580 better back/forward navigation WIP 2020-03-08 11:41:42 +01:00
zadam
5114f3f782 fixes after merge 2020-03-08 09:38:49 +01:00
zadam
53f5df4e88 Merge remote-tracking branch 'origin/stable'
# Conflicts:
#	src/public/javascripts/desktop.js
#	src/public/stylesheets/style.css
#	src/views/details/image.ejs
#	src/views/details/relation_map.ejs
2020-03-08 09:26:34 +01:00
zadam
e4039ea5e1 fixed printing relation map 2020-03-08 09:24:03 +01:00
zadam
95fef8d2e5 fixes after merge 2020-03-07 22:29:49 +01:00
zadam
7105b61aab Merge remote-tracking branch 'origin/stable'
# Conflicts:
#	src/public/javascripts/desktop.js
#	src/views/desktop.ejs
#	src/views/mobile.ejs
2020-03-07 22:21:55 +01:00
zadam
78a50be663 don't print control buttons 2020-03-07 22:18:12 +01:00
zadam
3d3ad3b99b include themes.css for printing to have default CSS variables available 2020-03-07 22:14:07 +01:00
zadam
0d9cdcac85 load appropriate styles for printing book notes, closes #899 2020-03-07 22:01:34 +01:00
zadam
c4f7bb37db removed sidebar widget settings 2020-03-07 21:34:39 +01:00
zadam
81ec85083a link map widget always rendered centered map 2020-03-07 20:41:03 +01:00
zadam
62da383623 only one update 2020-03-07 15:01:48 +01:00
zadam
8513e0201c collapsed state is now synchronized across tab-cached instances 2020-03-07 14:31:25 +01:00
zadam
abd60581be right pane is now scrollable 2020-03-07 14:18:58 +01:00
zadam
aff02184f8 removed last tab should activate second to last 2020-03-07 13:57:31 +01:00
zadam
8909d175d0 event fixes 2020-03-07 13:40:46 +01:00
zadam
091eb8f791 event fixes WIP 2020-03-06 23:34:39 +01:00
zadam
e10d23289e event fixes WIP 2020-03-06 22:17:07 +01:00
zadam
26599f057c collapsible widget remember their collapsed state 2020-03-01 20:49:11 +01:00
zadam
4e0e2e8926 fixes in side pane toggling 2020-03-01 20:11:40 +01:00
zadam
9c631e4398 Merge remote-tracking branch 'origin/master' into m41
# Conflicts:
#	.idea/dataSources/a2c75661-f9e2-478f-a69f-6a9409e69997.xml
#	src/public/stylesheets/desktop.css
2020-03-01 19:20:08 +01:00
zadam
687539cc95 fix zen mode 2020-03-01 19:16:30 +01:00
zadam
03e0c98066 migrated desktop CSS to the desktop layout 2020-03-01 19:06:26 +01:00
zadam
77f358b846 migrated mobile CSS to the mobile layout 2020-03-01 18:57:13 +01:00
zadam
4c82e882e0 bit better right pane layout 2020-03-01 18:47:20 +01:00
zadam
0f4ba43463 mobile frontend is working again 2020-03-01 15:19:16 +01:00
zadam
f15239c006 mobile layout fixes 2020-03-01 12:50:02 +01:00
zadam
ed1b5e3843 mobile layout fixes 2020-03-01 12:05:10 +01:00
zadam
607bdfef92 mobile global buttons 2020-03-01 11:53:02 +01:00
zadam
4f744564f2 start of mobile layout 2020-03-01 11:04:42 +01:00
zadam
f64b343d8d ref 2020-03-01 10:41:23 +01:00
zadam
47b803920b keep body hidden until rendered 2020-02-29 22:13:54 +01:00
zadam
8888d04878 fixes 2020-02-29 22:04:46 +01:00
zadam
49398f5374 refactoring of component event system + little docs 2020-02-29 19:43:19 +01:00
zadam
95d1952896 wip 2020-02-29 16:26:46 +01:00
zadam
3ab2b41e8c open links in new tab without activation 2020-02-29 15:00:35 +01:00
zadam
e5155130e7 ckeditor with table/cell properties 2020-02-29 14:32:26 +01:00
zadam
724ba352e6 refactored existing context menus 2020-02-29 13:03:05 +01:00
zadam
1239293435 spell check context menu 2020-02-29 11:28:30 +01:00
zadam
16f42dd4ab use electron 8 spellchecker instead of electron-spellchecker, WIP 2020-02-28 22:07:08 +01:00
zadam
350331e2ef fix 500px constant height of relation maps, closes #882 2020-02-28 15:20:54 +01:00
zadam
a2d6a5c3e9 fixes 2020-02-28 11:46:35 +01:00
zadam
cb35284d37 wip 2020-02-28 00:31:12 +01:00
zadam
2af37640d8 small refactoring of search code 2020-02-28 00:11:34 +01:00
zadam
4bd298a55b refactor data-kb-command 2020-02-27 23:12:22 +01:00
zadam
cd4b1235a7 wip 2020-02-27 14:35:12 +01:00
zadam
5e3c85f891 fix issues 2020-02-27 12:41:15 +01:00
zadam
b2a3e1cc04 fixed double refresh of note detail 2020-02-27 12:26:42 +01:00
zadam
d71763aedb title row spacing 2020-02-27 10:08:21 +01:00
zadam
368d0c55da refactoring of layout finished 2020-02-27 10:03:14 +01:00
zadam
637010577b layout changes WIP 2020-02-27 00:58:10 +01:00
zadam
7bcae9981b unified/simplified protecting notes & subtree 2020-02-26 16:37:17 +01:00
zadam
3752cf8cba layout fixes 2020-02-25 19:19:10 +01:00
zadam
7270bf287d fixes and right pane layout changes 2020-02-25 16:31:44 +01:00
zadam
d821ea4095 fix closing all tabs except current 2020-02-25 12:32:21 +01:00
zadam
41d1d83dc2 fix showing/hiding of type widgets 2020-02-25 12:24:37 +01:00
zadam
a2fe110400 unified global variable handling between mobile and desktop 2020-02-25 11:02:59 +01:00
zadam
fdc99bb6f9 adapt merged changes from master 2020-02-25 10:47:49 +01:00
zadam
36eac6badd Merge remote-tracking branch 'origin/master' into m41
# Conflicts:
#	src/public/javascripts/mobile.js
#	src/public/stylesheets/style.css
2020-02-25 09:42:27 +01:00
zadam
7cac2521ef fix css class handling 2020-02-25 09:40:49 +01:00
zadam
e8a9e49e9e release 0.40.4 2020-02-24 22:59:22 +01:00
zadam
fb55cdaea6 release 0.40.4 2020-02-24 22:58:18 +01:00
zadam
b9b2cc8364 make sure $rendered is always jquery object 2020-02-24 22:55:12 +01:00
zadam
8dfdd090f5 use note's css class also in book and included note, closes #879 2020-02-24 22:46:27 +01:00
zadam
fe7705524a fix include note in mobile frontend, closes #878 2020-02-24 22:37:45 +01:00
zadam
8e77d729e5 ckeditor 17 2020-02-20 17:01:18 +01:00
zadam
2b1b7774f8 make images in text notes rendered responsively in a book, fixes #871 2020-02-19 22:24:31 +01:00
zadam
2d58019d6e allow to setup web version as a sync client 2020-02-19 22:10:40 +01:00
zadam
fe31f08c0d show setup window if DB is not initialized 2020-02-19 22:09:49 +01:00
zadam
d9fb36a9a6 fixes 2020-02-19 22:09:02 +01:00
zadam
52f4876f2d camelCase keyboard action names 2020-02-19 20:54:14 +01:00
zadam
ad7a55d305 always autofix note_contents.content = NULL sync issue after note erasion 2020-02-19 19:51:36 +01:00
zadam
2e3534dfb7 small fixes 2020-02-18 22:16:20 +01:00
zadam
d288c1b052 small fixes 2020-02-17 22:47:50 +01:00
zadam
f2cf361acf small fixes 2020-02-17 22:38:46 +01:00
zadam
e7af24c139 small fixes 2020-02-17 22:14:39 +01:00
zadam
9797942b8e small cleanups 2020-02-17 19:42:52 +01:00
zadam
32d60a7eb9 refactored tree context menu to reduce duplication 2020-02-16 22:56:40 +01:00
zadam
4330dc47a0 converted tree_keybindings.js into proper commands 2020-02-16 22:14:28 +01:00
zadam
8ca9ad3497 fixes 2020-02-16 20:09:59 +01:00
zadam
a679fedb58 refactored keyboard actions into commands 2020-02-16 19:54:11 +01:00
zadam
880f4ad711 renamed Listener() to Event() 2020-02-16 19:23:49 +01:00
zadam
e000fb4579 appContext is now component 2020-02-16 19:21:17 +01:00
zadam
22c042e21f remove appContext as copied dependency across components 2020-02-16 18:11:32 +01:00
zadam
2c3f07521d fixes 2020-02-16 11:22:37 +01:00
zadam
e06f3ef97e refactorings for add link and include note 2020-02-16 10:50:48 +01:00
zadam
7e41a2750c refactored KB handling and add link dialog 2020-02-15 22:12:05 +01:00
zadam
b2a48a1f3a fix clone notes dialog 2020-02-15 18:41:32 +01:00
zadam
e1bf4dcbc9 basic executor / command mechanism 2020-02-15 10:41:21 +01:00
zadam
6d847d22d3 components now track their parent 2020-02-15 09:43:47 +01:00
zadam
9337564075 boxicons 2.0.5 2020-02-15 09:16:23 +01:00
zadam
2fa41b44c5 fix branch prefix dialog 2020-02-14 21:21:47 +01:00
zadam
8d2c2202fa refactoring and fixes for saved note 2020-02-14 20:18:09 +01:00
zadam
380bb0cd01 fix deleting 2020-02-12 22:25:52 +01:00
zadam
789f62267c changes in note detail handling 2020-02-12 22:09:25 +01:00
zadam
25553c9e67 simplification of sync event API 2020-02-12 20:31:31 +01:00
zadam
81a54cd4a0 messaging now uses mutex so each component processes only single message at each time 2020-02-12 20:07:04 +01:00
zadam
1d2fc773c2 fix for delete note sync etc. 2020-02-10 20:57:56 +01:00
zadam
7767edd82f fixes 2020-02-09 22:31:52 +01:00
zadam
99ea238c3f frontend sync fixes 2020-02-09 21:53:10 +01:00
zadam
826c434630 fixes in closing tabs and elsewhere 2020-02-09 21:13:05 +01:00
zadam
4401a8e1e8 Merge branch 'master' into m41
# Conflicts:
#	src/public/javascripts/dialogs/add_link.js
#	src/public/javascripts/dialogs/export.js
#	src/public/javascripts/dialogs/import.js
#	src/public/javascripts/dialogs/note_info.js
#	src/public/javascripts/services/search_notes.js
2020-02-09 18:54:56 +01:00
zadam
4ce4ac9584 release 0.40.3 2020-02-09 10:48:23 +01:00
zadam
88bd65c679 external links are also parsed and label is created for them, closes #851 2020-02-09 10:45:07 +01:00
zadam
9eab3026bb display advanced item in the tree context menu in the middle to avoid being hidden, closes #853 2020-02-09 10:15:35 +01:00
zadam
7abaedbf31 add possibility to change clipper parent to a fixed note instead of day notes, fixes #854 2020-02-09 10:12:02 +01:00
zadam
402718d293 return focus to the previously focused element after closing the dialog, fixes #861 2020-02-09 10:00:13 +01:00
zadam
990a84c202 Merge remote-tracking branch 'origin/master' 2020-02-09 08:38:47 +01:00
zadam
d8e181a828 Merge branch 'stable'
# Conflicts:
#	package.json
#	src/services/build.js
2020-02-09 08:38:29 +01:00
zadam
4ec671d199 fixes in enabling / disabling widgets in runtime 2020-02-08 21:54:39 +01:00
zadam
9f4a514562 fix setting path 2020-02-08 21:23:42 +01:00
zadam
18ee239362 fixes 2020-02-08 20:53:07 +01:00
zadam
08687b76ea fix title bar buttons visibility 2020-02-08 18:25:07 +01:00
zadam
60d07a6871 fix duplicated cached widgets 2020-02-08 17:44:34 +01:00
zadam
81f4966a1a fixes, cleaned up noise in the developer console 2020-02-08 10:40:58 +01:00
zadam
9acf723a9a fixes 2020-02-07 22:19:35 +01:00
zadam
47f7f5f4d9 refactoring 2020-02-07 21:43:02 +01:00
zadam
14d6372bd8 moved tab related stuff to tab manager from app context 2020-02-07 21:08:55 +01:00
zadam
6d912c4897 removed dependency on note tree widget from app context 2020-02-07 20:56:49 +01:00
zadam
62e1284790 untangled tabrow dependencies 2020-02-06 22:39:31 +01:00
zadam
d79ae261e1 refactored layout out of app context 2020-02-06 21:47:31 +01:00
zadam
92f6558e55 the whole view is now composed from a single root widget 2020-02-06 21:16:02 +01:00
zadam
8d49249ed7 fix lazy initialization of the sidebar 2020-02-06 20:04:43 +01:00
zadam
d1bb62c40e fixes 2020-02-05 22:46:20 +01:00
zadam
42017fde5f refactored access to options on frontend 2020-02-05 22:08:45 +01:00
zadam
786bbbc160 sidebars are now represented as widgets 2020-02-04 22:46:17 +01:00
zadam
0cc013c13f left sidebar can now be also collapsible 2020-02-04 20:42:40 +01:00
zadam
c5475765e5 disable --disable-gpu flag 2020-02-03 22:41:01 +01:00
zadam
9ea91f821c update to electron 8 2020-02-03 22:23:23 +01:00
zadam
b757dfcf79 various fixes and small refactorings 2020-02-03 21:56:45 +01:00
zadam
44ddcdd852 various widget optimizations for faster note switching 2020-02-03 21:16:33 +01:00
zadam
66204811cf refactored note creation methods into a separate service 2020-02-03 20:07:34 +01:00
zadam
822a8509b3 fix 2020-02-02 22:33:50 +01:00
zadam
9f62490a75 refactorings of note creation code 2020-02-02 22:32:44 +01:00
zadam
b63ecba695 clean up tree service WIP 2020-02-02 22:04:28 +01:00
zadam
d5ae3802d1 various widget refactorings 2020-02-02 21:16:20 +01:00
zadam
7c6cd63a53 various widget refactorings 2020-02-02 20:02:08 +01:00
zadam
62a80ef016 standard widget => collapsible widget 2020-02-02 18:46:50 +01:00
zadam
27ab55d26a fixed switch between autobook and text 2020-02-02 11:44:08 +01:00
zadam
34150e7177 fix inserting link 2020-02-02 11:14:44 +01:00
zadam
b946599320 Merge remote-tracking branch 'origin/master' into m41
# Conflicts:
#	src/public/javascripts/services/tree.js
2020-02-02 10:45:27 +01:00
zadam
3cd4be4e48 removed note detail service 2020-02-02 10:41:43 +01:00
zadam
96e2b9bc18 fix tree keyboard shortcuts propagating outside of tree 2020-02-02 10:10:37 +01:00
jasontan056
adb8caa8a2 Fix corner case preventing notes from being created before ckeditor is initialized (#849)
* Pass deleteId to deleteBranch in ensureNoteIsAbsentFromParent

* Add checks for whether window.cutToNote is defined.

* check ckEditor initialized.
2020-02-02 09:28:19 +01:00
zadam
0054a32dc7 treecache now manages reloading when starting protected session 2020-02-01 22:29:32 +01:00
zadam
513ce1a183 Merge branch 'master' into m41
# Conflicts:
#	src/public/javascripts/services/sidebar.js
#	src/public/javascripts/services/tab_context.js
#	src/public/javascripts/services/tree.js
2020-02-01 20:01:30 +01:00
zadam
9f38ea6ee7 update tab title upon its change 2020-02-01 19:25:37 +01:00
zadam
0e13678f7c note complement is now loaded through tree cache 2020-02-01 18:29:18 +01:00
zadam
f0cbca2838 lazy loading of note complement 2020-02-01 11:33:31 +01:00
zadam
f6f7836b8e renamed notefull to notecomplement 2020-02-01 11:15:58 +01:00
zadam
7651c53363 release 0.40.2 2020-02-01 10:17:51 +01:00
zadam
0f25c8a95f autobook should not be active on the mobile interface 2020-02-01 10:17:03 +01:00
zadam
1a49894adf fix tree loading on mobile interface, closes #839 2020-02-01 10:04:18 +01:00
zadam
bd8c078fb9 Merge remote-tracking branch 'origin/master' 2020-02-01 09:30:14 +01:00
zadam
6e060b87b8 fix date parsing in local timezone, closes #845 2020-02-01 09:29:56 +01:00
jasontan056
2375b170ba Pass deleteId to deleteBranch in ensureNoteIsAbsentFromParent (#846) 2020-02-01 09:05:23 +01:00
zadam
eeedb91ef7 sync are sent upon DB commit 2020-01-31 22:32:24 +01:00
zadam
05b51c0f68 frontend sync through websocket 2020-01-31 20:52:31 +01:00
zadam
8bf794f13b wip 2020-01-30 22:38:31 +01:00
zadam
48b401164a wip 2020-01-29 22:32:22 +01:00
zadam
b65631be7e tree change listener and others 2020-01-29 21:38:58 +01:00
zadam
439b45b0b8 refactored entity reloading 2020-01-29 20:14:02 +01:00
zadam
976b2aa6f5 got rid of "origParentNoteId" since it's not needed anymore 2020-01-28 22:39:44 +01:00
zadam
88213c1bbd attributes are now updated only if their type and name does not change, in case of relation not even value must change. If they do, the old attribute is deleted and new is created instead 2020-01-28 22:37:06 +01:00
zadam
d2e3aedf7f moving notes across parents now deletes the old branch and creates new which makes detecting changes much easier 2020-01-28 22:15:33 +01:00
zadam
368d3b1b97 wip 2020-01-28 21:54:28 +01:00
zadam
9301679707 wip 2020-01-27 22:58:03 +01:00
zadam
865f7e1ee1 fix propagating note reloads 2020-01-27 20:07:33 +01:00
zadam
c243d2e85c sync changes wip 2020-01-26 11:41:40 +01:00
zadam
97a35d6fba wip 2020-01-26 10:42:24 +01:00
zadam
3f0974d3d2 smaller fixes 2020-01-25 18:29:32 +01:00
zadam
48a7c0235f fixed iconClass and cssClass 2020-01-25 14:48:53 +01:00
zadam
ac7d5f2e81 fixes, separation of notefull from noteshort 2020-01-25 14:37:12 +01:00
zadam
516e6c35da fixes 2020-01-25 13:46:55 +01:00
zadam
7cad386a56 frontend attribute cache refactoring WIP 2020-01-25 13:27:23 +01:00
zadam
60c908cd63 frontend attribute cache refactoring WIP 2020-01-25 11:52:45 +01:00
zadam
52a907651e reduce unnecessary tab activation events 2020-01-25 10:25:06 +01:00
zadam
3254b551d8 merged tree utils into tree service 2020-01-25 09:56:08 +01:00
zadam
7a62d1636b fixes 2020-01-24 22:30:17 +01:00
zadam
7d9b720ea8 fix note switching in current tab 2020-01-24 21:15:40 +01:00
zadam
ba500a3a80 fixes 2020-01-24 20:15:53 +01:00
zadam
606d5afcab refactoring of note detail API 2020-01-24 17:54:47 +01:00
zadam
4b66765cc1 refactoring 2020-01-24 15:44:24 +01:00
zadam
8651e47118 small fixes 2020-01-22 22:29:55 +01:00
zadam
34bc02965f book and search fixes 2020-01-22 22:05:28 +01:00
zadam
eacefeb08b converted remaining type widgets 2020-01-22 21:38:00 +01:00
zadam
11a61325f9 removed last global keyboard handlers 2020-01-22 20:48:56 +01:00
zadam
370c63986d converting more keyboard shortcuts 2020-01-22 19:41:19 +01:00
zadam
d103b16d9a updated generate-cert script, #835 2020-01-22 19:12:03 +01:00
zadam
c63bb7ce8a converted more keyboard actions 2020-01-21 22:54:16 +01:00
zadam
af5c623671 simplification of triggering events from links 2020-01-21 22:08:41 +01:00
zadam
55d1f9e9f0 import & export fixed 2020-01-21 21:43:23 +01:00
zadam
96a7b4e45e fix dialogs 2020-01-21 20:54:00 +01:00
zadam
c83ca78565 keyboard handlers for dialogs 2020-01-20 22:35:52 +01:00
zadam
c5eac8f438 keyboard handlers for tabs 2020-01-20 20:51:22 +01:00
zadam
9bc1f5af45 WIP 2020-01-19 22:05:45 +01:00
zadam
423a70d102 saving note detail 2020-01-19 21:40:23 +01:00
zadam
562c729ed6 more refactorings 2020-01-19 21:24:14 +01:00
zadam
0760dc742b refactored tab activation 2020-01-19 21:12:53 +01:00
zadam
1098d75ce0 synchronous events, updating title works fully 2020-01-19 20:18:02 +01:00
zadam
bd8e5f255b wip 2020-01-19 19:33:35 +01:00
zadam
8da094cd3c events for updating title (no saving yet) 2020-01-19 18:05:06 +01:00
zadam
44dc3c28de Merge branch 'master' into m41 2020-01-19 17:29:45 +01:00
zadam
828cce0d78 release 0.40.1 2020-01-19 15:45:06 +01:00
zadam
49c0d3199d progress 2020-01-19 15:44:18 +01:00
zadam
416d733510 got rid of .renderTo(), tab caching widgets use hidden marker element 2020-01-19 15:36:42 +01:00
zadam
6de4914ea6 extracted widgets from note title 2020-01-19 13:19:40 +01:00
zadam
9f1e777e6d introduction of refreshWithNote 2020-01-19 11:37:24 +01:00
zadam
adb9ce5e93 empty widget type works 2020-01-19 11:20:02 +01:00
zadam
746181689f component => type widget refactoring 2020-01-19 11:03:34 +01:00
zadam
a99c016818 file note layout tweaks 2020-01-19 10:29:21 +01:00
zadam
37f279fab0 Merge branch 'master' into m41
# Conflicts:
#	src/public/javascripts/services/entrypoints.js
2020-01-19 09:30:38 +01:00
zadam
ab535bf147 fixes of the new CopyWithoutFormatting 2020-01-19 09:25:35 +01:00
Heniker
1876664dfb add hotkey to copy contents with line breaks, fixes #349 (#831) 2020-01-19 09:16:36 +01:00
zadam
1690248e24 migration script to fix contentLength = -1 in new notes 2020-01-19 09:08:33 +01:00
zadam
cbeb8ea17e fix setting contentLength 2020-01-19 09:03:26 +01:00
zadam
e355b449c4 code and file note types now sort of work now as well 2020-01-19 09:02:18 +01:00
zadam
4fdea77c57 fix setting contentLength 2020-01-19 09:01:51 +01:00
zadam
9a13edd490 release 0.39.6 2020-01-18 20:52:14 +01:00
zadam
6d276582cb switching notes and tabs now work for most widgets 2020-01-18 20:49:49 +01:00
zadam
493730dff6 working note type and note paths widgets 2020-01-18 19:46:30 +01:00
zadam
b00a9f4415 progress 2020-01-18 18:01:16 +01:00
zadam
b25c1d6fa8 Merge branch 'master' into m41 2020-01-18 09:25:18 +01:00
zadam
c9113ae752 Merge branch 'stable' 2020-01-18 09:24:39 +01:00
zadam
0ec11d29ba fix creating root calendar note when missing, #752 2020-01-18 08:59:46 +01:00
zadam
a6cd25071e more robust handling of sync error, fixes #830 2020-01-18 08:48:36 +01:00
zadam
97b13ae91d refactroring WIP 2020-01-16 22:44:36 +01:00
zadam
0178232f26 more tab row refactoring 2020-01-15 22:35:15 +01:00
zadam
cc138ef9f8 more tab row refactoring 2020-01-15 22:27:52 +01:00
zadam
1552c3804d tab row refactoring WIP 2020-01-15 22:11:30 +01:00
zadam
7963de0abc continuing refactoring 2020-01-15 21:36:01 +01:00
zadam
f98a20928c widgetized standard toolbar 2020-01-15 20:10:54 +01:00
zadam
209b1610f6 widgetizing tab pane 2020-01-15 19:40:17 +01:00
zadam
bd0f7d3680 move components 2020-01-14 21:52:18 +01:00
zadam
f852e1de81 removed sidebar code 2020-01-14 21:48:19 +01:00
zadam
c9770573b2 converting sidebar widgets to normal widgets 2020-01-14 21:23:32 +01:00
zadam
23701219e1 added TabCachingWidget 2020-01-14 20:27:40 +01:00
zadam
c9bc4ad108 widgetizing note detail WIP 2020-01-13 21:48:44 +01:00
zadam
8b9c235465 widgetizing promoted attributes 2020-01-13 20:25:56 +01:00
zadam
20fdeee048 better error handling for search notes 2020-01-13 19:35:06 +01:00
zadam
657d01da95 fix 2020-01-12 23:05:31 +01:00
zadam
17e2627a34 more refactoring ... 2020-01-12 23:03:55 +01:00
zadam
bf7541bfb9 more refactoring ... 2020-01-12 20:15:05 +01:00
zadam
9d81bf030d tab row widgetizing 2020-01-12 19:05:09 +01:00
zadam
f25d735b9d further tab management moved to app context 2020-01-12 12:48:17 +01:00
zadam
4d16018f6c fixes 2020-01-12 12:37:44 +01:00
zadam
5e11840137 moved tab management to app context 2020-01-12 12:30:30 +01:00
zadam
61474defff widgetizing tree WIP 2020-01-12 11:15:23 +01:00
zadam
b12e38c231 widgetizing tree WIP 2020-01-12 10:35:33 +01:00
zadam
d1f679ab90 refactoring clipboard WIP 2020-01-12 09:57:28 +01:00
zadam
0f8a7bad06 moved tree initialization into the widget 2020-01-12 09:12:13 +01:00
zadam
9e031dcd60 start of the refactoring to widget system 2020-01-11 21:19:56 +01:00
zadam
51c3f98dde pane rename 2020-01-11 18:33:43 +01:00
zadam
a79a063d17 release 0.40.0-beta 2020-01-11 09:54:31 +01:00
zadam
5e91b1b5e0 package updates 2020-01-11 09:50:05 +01:00
zadam
7877443fb4 Merge branch 'stable' 2020-01-11 09:41:42 +01:00
zadam
759e47bfcf using included note should create a relation, closes #820 2020-01-10 21:41:00 +01:00
zadam
67bdffb27b expose text editor instance and method to add text to editor, closes #819 2020-01-10 20:10:17 +01:00
zadam
3386dace3b provide context menu in text editor also with disabled spellcheck 2020-01-10 19:56:27 +01:00
zadam
f3a2e2cbde Merge branch 'stable' 2020-01-08 21:39:17 +01:00
zadam
3cf3fc13b9 release 0.39.5 2020-01-08 21:01:24 +01:00
zadam
2b69abf8ab fix filter parser for >=, <=, *=* 2020-01-08 20:23:41 +01:00
zadam
3e49a7dbfa all consistency checkers have now fixers 2020-01-08 19:28:22 +01:00
zadam
4c7c3105e8 Merge branch 'stable'
# Conflicts:
#	src/services/notes.js
2020-01-07 22:29:54 +01:00
zadam
f782d2bef9 don't empty script area on save 2020-01-07 22:29:15 +01:00
zadam
ccaa9eae3a fix context submenus, closes #810 2020-01-07 20:53:41 +01:00
zadam
24c5388e0c protection against text note initialization race conditions 2020-01-07 19:48:26 +01:00
zadam
1cd2711097 Merge branch 'stable' 2020-01-05 20:02:19 +01:00
zadam
f0dfe7d552 release 0.39.4 2020-01-04 22:01:20 +01:00
zadam
3b8b4da149 task context progress fixes 2020-01-04 21:59:28 +01:00
zadam
2150619d62 activateNewNote does not reload whole tree anymore 2020-01-04 21:53:49 +01:00
zadam
acb76e0630 added notification to empty book notes otherwise they look suspiciously empty 2020-01-04 21:24:39 +01:00
zadam
fdb46f9329 fallback image saving without optimization will still compress image 2020-01-04 20:10:30 +01:00
zadam
ca587cccf6 book note type has automatically empty mime type 2020-01-04 19:34:01 +01:00
zadam
571772069a force SQLite to choose particular index for attribute search since it sometimes led to very inefficient query plans 2020-01-04 19:22:16 +01:00
zadam
79e7762c72 indent data notes 2020-01-04 18:44:54 +01:00
zadam
d025cfee1b empty note with just included note should be saved, closes #807 2020-01-04 13:22:07 +01:00
zadam
7793552443 fix display of show sidebar button 2020-01-04 10:05:03 +01:00
zadam
f377a84fa1 hide/show button z-index tweak 2020-01-04 09:21:42 +01:00
zadam
b8f2797abf better behavior of note info widget in tight width 2020-01-04 09:04:08 +01:00
zadam
54d89a9f47 allow configuring the time period before deleted notes are erased (and changed the default to 7 days) 2020-01-03 22:32:49 +01:00
zadam
1699646b39 fix undelete info messages 2020-01-03 21:32:41 +01:00
zadam
94a0a31f17 refactoring of tree handling to recommended fancytree 2020-01-03 21:15:45 +01:00
zadam
10219fb9dd Merge branch 'stable' 2020-01-03 20:13:13 +01:00
zadam
50431dd55a hide "show/hide sidebar" button in zen mode, fixes #805 2020-01-03 20:12:19 +01:00
zadam
17b23d92ef delete/undelete fixes 2020-01-03 13:41:44 +01:00
zadam
14f3c783f2 undelete note WIP 2020-01-03 13:14:43 +01:00
zadam
c1d0a1e07b undelete note WIP 2020-01-03 10:48:36 +01:00
zadam
1d3608b7bf fix recent note dialog for deleted notes 2020-01-03 09:04:38 +01:00
zadam
d0c655f66a fix removeAttribute to take into account attribute name, closes #804 2020-01-03 08:55:13 +01:00
zadam
ac75fd2ca3 focus and activate should work together 2020-01-02 19:07:50 +01:00
zadam
3b98428c8c change order of execution to mitigate race conditions 2020-01-02 19:03:54 +01:00
zadam
7d877d0fef release 0.39.3 2020-01-02 10:43:41 +01:00
zadam
cb79f2c7eb updated ckeditor build to support cuttonote 2020-01-02 10:38:29 +01:00
zadam
547a5714ae fancytree 2.34.0 2020-01-01 23:13:49 +01:00
zadam
82420fe5f6 reactivate "cut to note", closes #795 2020-01-01 22:59:51 +01:00
zadam
395913d1bb API docs update 2020-01-01 22:03:27 +01:00
zadam
f3a29b55ba remove @child🧒sorted label from calendar root in demo document since currently @sorted is added automatically in the code, closes #799 2020-01-01 20:58:59 +01:00
zadam
232321f3a4 fix searching multi-valued attributes, closes #800 2020-01-01 20:49:26 +01:00
zadam
51dddb0bbb fix scrolling behavior in firefox 2020-01-01 19:57:57 +01:00
zadam
8b9bf6e46f expand to note to be able to activate note 2020-01-01 19:46:27 +01:00
zadam
631a75deec release 0.39.2-beta 2019-12-30 19:48:54 +01:00
zadam
3f1d0e5872 small template refactoring 2019-12-30 19:46:48 +01:00
zadam
0fe91d0184 include note feature 2019-12-30 19:32:45 +01:00
zadam
2f711a12f8 added "include note" widget to text notes, WIP 2019-12-29 23:46:40 +01:00
zadam
64f32ba38f fix zen mode with new layout, closes #794 2019-12-29 20:48:24 +01:00
zadam
7db4859fb9 Merge remote-tracking branch 'origin/master' 2019-12-29 10:19:11 +01:00
zadam
eee9fcae5c set timeout for the initial sync seed request 2019-12-29 10:19:00 +01:00
zadam
9c4a976342 added some statistic scripts to demo document 2019-12-28 21:52:35 +01:00
zadam
e4a09c6207 fix left pane scrolling, closes #788 2019-12-28 21:37:13 +01:00
zadam
d467db2227 unify API for creating note links 2019-12-28 21:10:02 +01:00
zadam
b8d6ff0542 reset file inputs to allow reuploading the same file again 2019-12-28 19:29:52 +01:00
zadam
a9b8e65c9b force scrolling when width of the content overflows 2019-12-28 19:18:44 +01:00
zadam
bb8b563ece relaunch app after successful sync 2019-12-28 12:55:53 +01:00
zadam
05a8ffb944 small fixes 2019-12-28 10:28:12 +01:00
zadam
2502646a64 release 0.39.1-beta 2019-12-27 21:21:57 +01:00
zadam
3d95d69f80 styling hack for the design to look correct in both FF and chrome 2019-12-27 21:18:14 +01:00
zadam
df751f5d67 fix icon 2019-12-27 21:11:56 +01:00
zadam
4f06b6de78 fix registration of global shortcuts, fixes #786 2019-12-27 20:28:27 +01:00
zadam
d2177cd517 fix detection of desktop build in setup page, closes #787 2019-12-27 20:22:46 +01:00
zadam
0affcf5ad2 move electron-installer-debian to optional dependencies since it can't be installed on windows, #783 2019-12-26 10:02:55 +01:00
zadam
7a416b107b fix electron dep issue in the server version, closes #784 2019-12-25 19:38:28 +01:00
zadam
1ff124dab7 release 0.39.0-beta 2019-12-25 12:18:52 +01:00
zadam
4cb511bad0 fix import with style.css 2019-12-25 12:09:49 +01:00
zadam
73c8d145fa tar export fixes + added code block example to the demo document 2019-12-25 11:56:55 +01:00
zadam
ab79f24729 added content style to tar html export as well 2019-12-25 11:34:45 +01:00
zadam
cec71f65b3 load ckeditor content style for printing to have more similar look to the in-editor, #782 2019-12-25 10:59:45 +01:00
zadam
f75c008154 more sync recovery fixes 2019-12-24 17:49:44 +01:00
zadam
474baa7d95 sync recovery fixes 2019-12-24 16:00:31 +01:00
zadam
a155b6e8d5 create separate window for setup and then main window 2019-12-24 14:42:03 +01:00
zadam
229974e543 added option to enable native title bar (disabled by default) 2019-12-24 12:10:32 +01:00
zadam
6fc19bfb93 Merge branch 'stable' 2019-12-24 11:55:27 +01:00
zadam
ccaa108faa release 0.38.3 2019-12-24 10:51:51 +01:00
zadam
0a72383495 make opening new links from ckeditor more consistent for internal and external links, closes #779 2019-12-24 10:49:16 +01:00
zadam
d389100611 properly cleanup sidebar content after closing tab 2019-12-23 21:46:37 +01:00
zadam
ea7257a5b2 cleaned up experimental attribute pane 2019-12-23 21:13:56 +01:00
zadam
0ebc947fbd visual tweaks 2019-12-23 21:05:47 +01:00
zadam
c89514f9bb saving size and visibility state of the panes 2019-12-23 20:34:29 +01:00
zadam
e0368e395c removed left and right sidebar sizing options 2019-12-23 19:45:59 +01:00
zadam
6986c201dd removed hideTabRowForOneTab option 2019-12-23 19:39:48 +01:00
zadam
bcf163f8a1 css alignment 2019-12-23 17:12:17 +01:00
zadam
15aaead7b9 show/hide switcher for the sidebar 2019-12-23 16:48:34 +01:00
zadam
d29c5c4758 sidebar pulled outside of the tab content and added splitter 2019-12-23 15:50:24 +01:00
zadam
81e2baeee5 blur title buttons after clicking 2019-12-23 13:46:26 +01:00
zadam
4cececafc9 added title bar buttons 2019-12-23 13:34:54 +01:00
zadam
7c8e7a3f4b frameless design with tabs on top, split for left panel 2019-12-23 11:52:45 +01:00
zadam
613d5f93e8 convert css grid design to flex based one 2019-12-23 08:52:57 +01:00
zadam
4f5b23fbf8 tar file export now sets mtime to tar records based on utcDateCreated of a note, closes #487 2019-12-22 10:57:55 +01:00
zadam
a37b9cfc7b steel blue tweaks in demo document 2019-12-21 15:48:36 +01:00
zadam
2bc18bc214 use main border color for tab border 2019-12-21 15:37:51 +01:00
zadam
f31a998c5d path list contains a button to add a new path, closes #611 2019-12-21 13:55:13 +01:00
zadam
5552917533 Merge branch 'stable' 2019-12-21 13:39:12 +01:00
zadam
a9702aa6a2 fix empty checkbox visibility, closes #775 2019-12-21 12:37:24 +01:00
zadam
d1941cc650 Merge branch 'stable' 2019-12-20 21:00:30 +01:00
zadam
f98fa4098f clearer WS error message 2019-12-20 20:17:58 +01:00
zadam
5350496ed4 fix creating note from global ctrl+alt+p shortcut, closes #773 2019-12-20 20:13:21 +01:00
zadam
b62d79044a fix creating note from relation map, closes #771 2019-12-20 19:02:52 +01:00
zadam
0db3722ec2 package updates 2019-12-20 18:04:05 +01:00
zadam
d47403c0e7 implemented sync hash check recovery process 2019-12-18 22:58:30 +01:00
zadam
77311954a1 added sectors for contect check computation 2019-12-18 22:24:13 +01:00
zadam
b7cf4fe96b more general filter parsing 2019-12-18 20:51:48 +01:00
zadam
6d9b702d4c Merge branch 'master' into stable 2019-12-18 20:49:24 +01:00
zadam
6e4c30571c release 0.38.2 2019-12-18 20:21:06 +01:00
zadam
5988776b7e styling of active button 2019-12-18 20:16:11 +01:00
zadam
384da60953 fix regex for parsing out the filters 2019-12-18 19:56:53 +01:00
zadam
21fab412cb sync error mitigation 2019-12-17 22:17:03 +01:00
zadam
eb4dfbad92 sync fixes 2019-12-16 22:47:07 +01:00
zadam
aff9ce97ee small sync fixes 2019-12-16 22:00:44 +01:00
zadam
b0a3f828fb release 0.38.1-beta 2019-12-10 23:09:02 +01:00
zadam
76f5736255 update demo document 2019-12-10 23:08:50 +01:00
zadam
a82066d899 ability to define a keyboard shortcut for paste markdown, closes #761 2019-12-10 23:04:18 +01:00
zadam
45c5287d53 protection against note switching race conditions 2019-12-10 22:35:24 +01:00
zadam
dce54c7af3 run consistency checks on demand 2019-12-10 22:03:00 +01:00
zadam
ee15db0ae1 for title/content search does not make sense to search for protected notes 2019-12-10 21:40:53 +01:00
zadam
c48dbb0913 more debugging info for problems after sync 2019-12-10 21:31:24 +01:00
zadam
882ebdbd8f revert unicode regex since it's still not supported by ff 2019-12-09 23:08:32 +01:00
zadam
6f32d6fabe new mechanism to wait for sync after interaction with backend in Script API using api.waitForMaxKnownSyncId() 2019-12-09 23:07:45 +01:00
zadam
1e123f2390 sql console tweaks 2019-12-09 21:31:38 +01:00
zadam
b29155775e Merge branch 'stable'
# Conflicts:
#	package-lock.json
2019-12-09 20:23:22 +01:00
zadam
b821ed28fc refactor mention setup 2019-12-09 20:09:55 +01:00
zadam
fdb8959aa1 move mime types loading to avoid race conditions 2019-12-09 20:06:36 +01:00
zadam
7554cb057b support unicode characters in filters without quotes, fixes #757 2019-12-09 19:38:48 +01:00
zadam
fab959539a ability to run multiple queries (and get multiple result sets) from SQL console 2019-12-08 11:20:44 +01:00
zadam
afe44a6fe8 Merge branch 'stable' 2019-12-08 10:37:19 +01:00
zadam
7ed526beb7 fix clipper, closes #752 2019-12-08 09:41:31 +01:00
zadam
af695802e3 codeNotesMimeTypes option has not been created for new documents, fixes #755 2019-12-08 09:12:42 +01:00
zadam
156f040880 added "backend log" dialog 2019-12-05 21:25:36 +01:00
zadam
cf6f04defb better port error logging 2019-12-04 22:59:26 +01:00
zadam
a890b91079 release 0.38.0-beta 2019-12-04 22:40:31 +01:00
zadam
e0aabe4f9c fix docs 2019-12-04 22:40:20 +01:00
zadam
01cd9d8fb3 ckeditor 16 with code blocks plugin 2019-12-04 21:21:07 +01:00
zadam
af10f0f52a API docs updates 2019-12-03 22:53:17 +01:00
zadam
aa5ede5039 Merge branch 'stable' 2019-12-03 22:52:37 +01:00
zadam
21e77c83fc release 0.37.8 2019-12-03 22:31:20 +01:00
zadam
b0310e34e2 fix CSS loading from subdomain, #741 2019-12-03 22:13:02 +01:00
zadam
9812b9c272 (mostly) backwards compatible .createNote() backend API 2019-12-03 21:31:46 +01:00
zadam
92d5f91aa6 Merge branch 'stable' 2019-12-03 20:33:42 +01:00
zadam
b0368c7f17 Merge remote-tracking branch 'origin/master' 2019-12-03 20:32:01 +01:00
zadam
8e1f8c869b new @parentCount virtual search attribute, closes #738 2019-12-03 20:31:34 +01:00
nil0x42
4688cda493 [DOC] createNewNote(): Add missing render type (#740) 2019-12-03 19:49:27 +01:00
zadam
761c51069a use max-height for promoted attributes, #739 2019-12-03 19:47:53 +01:00
zadam
4dc285d84f serve favicon from relative path 2019-12-03 19:31:58 +01:00
zadam
0e2f8b5734 don't set date modified on erasing 2019-12-03 19:10:40 +01:00
zadam
a1402c7c66 release 0.37.7 2019-12-02 23:09:42 +01:00
zadam
6ba3e5ab7f backport fix from master to avoid doubled attributes inherited from multiple paths 2019-12-02 23:07:19 +01:00
zadam
f740e52ebf correctly respect label @disableVersioning
(cherry picked from commit dc063983ea)
2019-12-02 23:06:06 +01:00
zadam
e9454e4db7 fix SQL console scrolling
(cherry picked from commit 749bb90713)
2019-12-02 23:05:05 +01:00
zadam
749bb90713 fix SQL console scrolling 2019-12-02 23:04:22 +01:00
zadam
eb8c296e62 attempt to make updating clients via websocket faster 2019-12-02 22:27:06 +01:00
zadam
dc063983ea correctly respect label @disableVersioning 2019-12-02 20:21:52 +01:00
zadam
2595c3ac31 fix attribute loading CTE + don't duplicate attributes in case of cloning, fixes #735 2019-12-02 20:10:10 +01:00
zadam
9cb8bc5dd8 generate document now creates note revisions as well 2019-12-02 19:52:58 +01:00
zadam
3b690f5456 mini optimizations 2019-12-01 15:01:09 +01:00
zadam
7ef2e7769f added index to source_ids 2019-12-01 14:39:24 +01:00
zadam
4c07ac4c4c optimized edited notes on day query 2019-12-01 14:30:59 +01:00
zadam
35cd7f3261 optimization of recursive CTE attribute query 2019-12-01 13:29:39 +01:00
zadam
8c3e2e5eb7 better placement of slow query detection 2019-12-01 12:51:47 +01:00
zadam
d57caee0d3 drop unnecessary indexes 2019-12-01 12:38:07 +01:00
zadam
6e83980784 aligning frontend attributes API with the backend one 2019-12-01 12:22:22 +01:00
zadam
295af1f43e adding file length limit to tar export 2019-12-01 11:49:14 +01:00
zadam
ed2afe5c20 Merge branch 'stable' 2019-12-01 11:32:33 +01:00
zadam
bfc7570e14 don't convert MD to HTML if "import markdown as text" is not selected, closes #733 2019-12-01 11:27:22 +01:00
zadam
d9b9d730bb moving from inherited attribute queries to owned one where it makes sense 2019-12-01 11:10:04 +01:00
zadam
ba8a8dca7b adding more "owned" attribute methods to Note entity 2019-12-01 10:57:28 +01:00
zadam
29eb5a8435 Merge branch 'stable'
# Conflicts:
#	src/services/notes.js
#	src/tools/generate_document.js
2019-12-01 10:32:30 +01:00
zadam
5de92171a7 use owned attributes where it's a better fit 2019-12-01 10:28:05 +01:00
zadam
29c5e394ab generate document now creates also labels and relations 2019-12-01 10:20:18 +01:00
zadam
07b3d11fe5 fix generate new document script 2019-12-01 09:19:16 +01:00
zadam
67663fba50 fixes 2019-11-30 11:36:36 +01:00
zadam
995ebbf577 removed foreign keys PRAGMAs since foreign key constraints are not used anymore 2019-11-30 10:41:53 +01:00
zadam
d0e6be3e0c entity stat as part of consistency checks 2019-11-30 09:15:08 +01:00
zadam
01370a5968 fix anonymization according to latest schema 2019-11-29 21:42:24 +01:00
zadam
6c561b5764 rename API .createNote() to .createNewNote() to allow future backwards compatibility 2019-11-28 22:35:55 +01:00
zadam
2953f1bdb8 adding some standard classes for tree items 2019-11-28 22:05:27 +01:00
zadam
1c057cac75 small script API additions 2019-11-27 23:07:10 +01:00
zadam
0415efd33b create year/month/date labels/relation only when the note is created 2019-11-27 19:42:10 +01:00
zadam
e58dc829f5 bootstrap 4.4.0 2019-11-27 18:59:42 +01:00
zadam
90d10c1ff3 Merge branch 'stable'
# Conflicts:
#	package-lock.json
#	src/public/javascripts/services/tree_context_menu.js
#	src/services/import/enex.js
2019-11-27 18:54:49 +01:00
zadam
5b30291601 release 0.37.6 2019-11-26 22:50:08 +01:00
zadam
5193f073e9 if there's no updated field use created #725 2019-11-26 22:47:54 +01:00
zadam
6c7d8a9667 preserve dateCreated and dateModified in ENEX import, fixes #725 2019-11-26 22:02:21 +01:00
zadam
5e9bedd903 fixed sidebar switch in the options dialog 2019-11-26 20:46:49 +01:00
zadam
e712990c03 don't remove active tab after deleting note to preserve tab state, fixes #727 2019-11-26 20:42:34 +01:00
zadam
91487b338a make the context menu scrollable when exceeding total window height, closes #723 2019-11-26 19:55:52 +01:00
zadam
3ff24d53e5 fix decrypting note titles on the server installation, closes #724 2019-11-26 19:49:52 +01:00
zadam
94c904fb40 fix context menu over root, closes #726 2019-11-26 19:42:47 +01:00
zadam
5f258fbbbf release 0.37.5 2019-11-25 22:46:15 +01:00
zadam
56c7b7f5bd API docs update 2019-11-25 22:45:09 +01:00
zadam
bf9ad976b9 fixing non-root path issues, #404 2019-11-25 21:44:46 +01:00
zadam
19206d1e0d backend API note creation updates 2019-11-25 21:24:41 +01:00
zadam
420be6d8c6 fix demo document relation map and shortcuts before db initialization 2019-11-24 22:42:54 +01:00
zadam
dbd2040bee shortcut fixes 2019-11-24 22:15:33 +01:00
zadam
1e979d71c7 changed note selection in tree using keyboard - now only sibling nodes are selected 2019-11-24 22:01:10 +01:00
zadam
6bbd4c59bc reduce flicker of "create new day note" 2019-11-24 21:40:50 +01:00
zadam
3a54d00e2b added shortcut filter in the options dialog 2019-11-24 20:20:13 +01:00
zadam
499c9a7381 separated some context menu items into "advanced" 2019-11-24 20:00:54 +01:00
zadam
cd139bdd76 note can be activated through 'keyboardShortcut' label 2019-11-24 18:32:18 +01:00
zadam
60c3b5cccc Merge remote-tracking branch 'origin/master' 2019-11-24 14:10:19 +01:00
zadam
540f9f933a update demo.tar with correct system links 2019-11-24 14:10:11 +01:00
Benoit Stahl
a59943094e this input is text (#719) 2019-11-24 10:44:09 +01:00
zadam
c400a7143c reorganization of shortcuts in the options 2019-11-24 10:40:18 +01:00
zadam
1f37d00e42 updating also shortcuts in element titles 2019-11-24 10:14:30 +01:00
zadam
d21e824343 binding remaining actions 2019-11-24 09:50:19 +01:00
zadam
ff3f0ee0a0 Merge branch 'stable' 2019-11-23 23:07:07 +01:00
zadam
01ff34b5d4 moving edit branch prefix, search in subtree and toggle note hoisting to global entrypoints instead of being tree specific 2019-11-23 23:06:25 +01:00
zadam
0cde7ede24 updated note menu with current shortcuts 2019-11-23 22:56:35 +01:00
zadam
92cb723d0c updated inapp help with current shortcuts 2019-11-23 22:17:08 +01:00
zadam
e4bec265c1 system links (internal, image, relation map) should follow camelCase convention used for other attributes 2019-11-23 20:54:49 +01:00
zadam
434d8ef48c added extra autofixers for completely missing note_contents or note_revision_contents row 2019-11-23 19:56:52 +01:00
zadam
c8ba07a4ae fix migration script in case of not fully consistent database (missing note_contents for note). closes #717 2019-11-23 11:13:57 +01:00
zadam
4da6234911 Merge branch 'stable' 2019-11-22 22:59:08 +01:00
zadam
38e7649ac3 release 0.37.4 2019-11-22 22:38:03 +01:00
zadam
ff0245f05f dynamically translating kbd based on actions 2019-11-22 22:35:59 +01:00
zadam
7a2c7edd7e allow multiple instances of @in operator, closes #716 2019-11-22 21:17:46 +01:00
zadam
98c81faedb Merge branch 'stable' 2019-11-22 20:36:47 +01:00
zadam
cfb850acb2 download fixes for the sub-domain web deployment 2019-11-22 20:35:17 +01:00
zadam
a16aaf7a81 fix setup on non-root paths #404 2019-11-22 20:24:49 +01:00
zadam
465c3b87a7 tree keyboard shortcuts 2019-11-21 22:24:07 +01:00
zadam
0e5028acd3 support global shortcuts with global: prefix 2019-11-21 21:12:07 +01:00
zadam
00c295e4bf upgrade to electron 8.0.0-beta.3 2019-11-21 19:36:34 +01:00
zadam
7084ed4fb1 Merge branch 'stable' 2019-11-20 23:11:21 +01:00
zadam
587134c2f8 separators and fixes 2019-11-20 23:10:41 +01:00
zadam
5fac2c7633 saving options keyboard shortcuts 2019-11-20 22:48:32 +01:00
zadam
08a518479b keyboard shortcuts options pane 2019-11-20 21:35:18 +01:00
zadam
522f71cb91 fix tree clipboard 2019-11-20 19:24:23 +01:00
zadam
bcdfb47939 Merge branch 'stable' 2019-11-19 23:34:35 +01:00
zadam
667471e7bb toggle zen mode in the global menu 2019-11-19 23:33:07 +01:00
zadam
d357943ebb release 0.37.3 2019-11-19 23:05:54 +01:00
zadam
07043fb177 switch search in subtree to ctrl+shift+s to stay consistent with ctrl+s 2019-11-19 23:04:43 +01:00
zadam
3c4ec7fe1a keyboard shortcuts WIP 2019-11-19 23:02:54 +01:00
zadam
1f8d382b1f added "search in subtree" context menu, #534 2019-11-19 21:11:20 +01:00
zadam
4bd7438fca shortcuts WIP 2019-11-19 20:53:04 +01:00
zadam
0ae9c8da17 Merge branch 'stable' 2019-11-19 19:32:49 +01:00
zadam
61e8cbbcba add log for content hash failures 2019-11-19 19:07:14 +01:00
zadam
86c5dd6494 fix recent changes, closes #713 2019-11-19 19:02:16 +01:00
zadam
f921562346 Merge branch 'm38'
# Conflicts:
#	docs/backend_api/Note.html
#	docs/frontend_api/NoteShort.html
#	src/services/import/enex.js
2019-11-18 23:26:29 +01:00
zadam
c5acb7fc9b release 0.37.2 2019-11-18 23:04:09 +01:00
zadam
643d9077fc configurable keyboard shortcuts WIP 2019-11-18 23:01:31 +01:00
zadam
b4709e8ee5 "distraction free mode" renamed to more standard "zen mode" 2019-11-18 19:32:27 +01:00
zadam
a1181623b7 hide sidebar button styling 2019-11-17 11:58:05 +01:00
zadam
73a6c66379 header styling changes 2019-11-17 11:39:06 +01:00
zadam
1d5daa8dfd action icons now have hover border as well 2019-11-17 11:30:11 +01:00
zadam
834e1f7253 fix activating tab when app was closed last time with "new tab" 2019-11-17 10:24:06 +01:00
zadam
c141f4b2c0 tab row styling change 2019-11-17 10:22:26 +01:00
zadam
1a87190f43 added IN operator to search, closes #534 2019-11-17 09:07:35 +01:00
zadam
a1262aaaf3 release 0.37.1-beta 2019-11-16 19:09:52 +01:00
zadam
1838f097e5 added getAllNotePaths, fixes #708 2019-11-16 19:07:32 +01:00
zadam
95d0ad1cad simpler ENEX parsing 2019-11-16 18:13:00 +01:00
zadam
767aaa18f4 fix OPML import 2019-11-16 18:04:13 +01:00
zadam
8a7228146c simpler ENEX parsing 2019-11-16 17:56:49 +01:00
zadam
f9b5e473f2 added missing options 2019-11-16 17:03:18 +01:00
zadam
3d294c5163 refactoring of note creation APIs WIP 2019-11-16 17:00:22 +01:00
zadam
60231de0ed refactoring of note creation APIs WIP 2019-11-16 12:28:47 +01:00
zadam
35e9df6170 fixes in the handling of cssClass and iconClass when working with newly created / single note 2019-11-16 11:23:28 +01:00
zadam
13c0411533 refactoring of note creation APIs WIP 2019-11-16 11:09:52 +01:00
zadam
c5e040c4a4 updated demo document with icon classes 2019-11-16 09:57:19 +01:00
zadam
e00ab5dbf9 new "iconClass" property on note_short, now together with cssClass respecting template relationship, #707 2019-11-16 08:59:27 +01:00
zadam
95c37cfdd1 release 0.37.0-beta 2019-11-14 23:12:28 +01:00
zadam
de02e9e889 redesign of createNote APIs, WIP 2019-11-14 23:10:56 +01:00
zadam
e143becb7a styling changes 2019-11-14 20:27:28 +01:00
zadam
c0eb30472e note and note_content has been needlesly updated when utcDateModified has been the same 2019-11-13 22:33:19 +01:00
zadam
8b320bb85f force note sync now really forces update on other instances by updating utcDateModified 2019-11-13 22:32:14 +01:00
zadam
d93b9b8a23 force note sync now syncs also note revision contents and attributes 2019-11-13 21:53:04 +01:00
zadam
69b53fdfb3 expander styling again 2019-11-13 21:46:52 +01:00
zadam
920d71a5a6 small fixes 2019-11-13 20:28:14 +01:00
zadam
d4a277321c styling of mobile expanders 2019-11-13 19:38:34 +01:00
zadam
4068691078 better expander positioning 2019-11-12 23:02:47 +01:00
zadam
86d7e139a4 correctly handle 0 notes to erase 2019-11-12 22:26:25 +01:00
zadam
44add751b2 fix horizontal wrap of pre elements 2019-11-12 22:22:49 +01:00
zadam
c49c69f824 fix migration script 2019-11-12 21:32:35 +01:00
zadam
7bd1d8feb4 fix setting isErased after note migration 2019-11-11 23:37:46 +01:00
zadam
4ba7e74b58 fix note revision's isErased initial value after migration 2019-11-11 23:26:46 +01:00
zadam
4cda661c1b add move to dialog 2019-11-11 22:57:51 +01:00
zadam
5b4a2bd71c Merge branch 'stable'
# Conflicts:
#	src/entities/note.js
2019-11-11 20:43:00 +01:00
zadam
a808e12d31 fix .setAttribute in stable, #703 2019-11-11 20:42:03 +01:00
zadam
1f3f9a4037 release 0.36.5 2019-11-10 22:20:54 +01:00
zadam
77ac8df1e6 keyboard shortcut ctrl+shift+c for "clone to..." dialog 2019-11-10 22:19:22 +01:00
zadam
b53e2a3570 clone to notes now has overview of notes to clone and is available from context menu 2019-11-10 22:06:43 +01:00
zadam
7539e6a616 Merge branch 'stable'
# Conflicts:
#	src/services/consistency_checks.js
2019-11-10 21:35:11 +01:00
zadam
b5a0cadcf4 fix showing up of render note help view if no renderNote relations have been found 2019-11-10 21:34:15 +01:00
zadam
b8db842788 added frontend API methods to refresh tabs 2019-11-10 19:34:15 +01:00
zadam
dea5195223 fix setNoteToParent and deprecate it 2019-11-10 19:29:51 +01:00
zadam
c3ea2ae1b3 added new auto fixers to consistency checks 2019-11-10 14:16:12 +01:00
zadam
1fddd6f318 added non-autoFix variants to fixer methods 2019-11-10 11:43:33 +01:00
zadam
466a4802b6 introduced 'autoFixConsistencyIssues' option to control whether consistency issues should be auto fixed or note 2019-11-10 11:25:41 +01:00
zadam
8f2d2b189c Merge branch 'stable' 2019-11-10 11:24:08 +01:00
zadam
0837cabb41 fix module name for prompt dialog, fixes #698 2019-11-10 10:10:49 +01:00
zadam
5646218be8 release 0.36.4 2019-11-09 21:19:34 +01:00
zadam
169551c6a8 note revisions as a bootstrap list instead of <select> 2019-11-09 20:59:49 +01:00
zadam
3a1c80c189 refactoring of legacy js events 2019-11-09 17:45:22 +01:00
zadam
31bcc037f1 refactoring of legacy js events 2019-11-09 17:39:48 +01:00
zadam
179d530ea9 note revision sync fix 2019-11-09 16:51:51 +01:00
zadam
da92809299 Merge branch 'stable' 2019-11-09 15:33:04 +01:00
zadam
c2ebd4b308 show notes in a book including their prefix, closes #695 2019-11-09 15:31:47 +01:00
zadam
9b24ae0600 erasing note revisions 2019-11-09 15:21:14 +01:00
zadam
7cd75cebfc fix icons in context menu 2019-11-09 13:32:06 +01:00
zadam
664485ccd5 file revisions preview 2019-11-09 13:01:05 +01:00
zadam
60ac1a04f4 uploading new file revisions 2019-11-09 11:58:52 +01:00
zadam
7c7beb5502 added contentLength to note entity 2019-11-09 09:36:08 +01:00
zadam
5aa5ec3af1 downloading note revisions 2019-11-09 08:53:13 +01:00
zadam
58a857cf79 note revisions for images, WIP 2019-11-08 23:09:57 +01:00
zadam
712f67e983 uploading new image revisions, WIP 2019-11-08 22:34:30 +01:00
zadam
3149dff880 Merge branch 'stable' 2019-11-08 19:11:18 +01:00
zadam
d58e98e361 fix not being able to rename a note when in auto-book mode, closes #694 2019-11-07 23:25:58 +01:00
zadam
744855d4f5 linking notes through CKEditor mentiones 2019-11-07 22:43:01 +01:00
zadam
8a9f2ff1d8 Merge remote-tracking branch 'origin/master' 2019-11-07 20:09:57 +01:00
zadam
f539aedd25 Merge branch 'stable' 2019-11-07 20:09:40 +01:00
zadam
05547845cb including confirm and prompt dialog to mobile frontend to allow deleting notes, closes #689 2019-11-07 19:58:40 +01:00
zadam
9b905563c3 fix ensureNoteIsAbsentFromParent, closes #691 2019-11-07 19:51:38 +01:00
zadam
894c888d87 including ckeditor mentions plugin for easy linking 2019-11-06 22:58:32 +01:00
zadam
34d4274032 separate cloning dialog 2019-11-05 23:11:25 +01:00
zadam
b685d7ffb5 simplification of "add link" dialog 2019-11-05 22:40:44 +01:00
zadam
d87c469fbb Merge branch 'stable' 2019-11-05 22:28:27 +01:00
zadam
d8730f1722 release 0.36.3 2019-11-05 21:49:16 +01:00
zadam
72fda89360 fix loading of the search note results 2019-11-05 21:47:22 +01:00
zadam
7075842954 expose bindGlobalShortcut to frontend script API 2019-11-05 21:26:54 +01:00
zadam
a2c78e2c5c disabling link map animation, closes #684 2019-11-05 20:59:20 +01:00
zadam
9c9ef1c7b4 added more careful handling of search note operations, fixes #683 2019-11-04 22:41:06 +01:00
zadam
df40accdd4 fix bug when context menu sometimes does not show up, closes #682 2019-11-04 20:20:21 +01:00
zadam
b67aa99b86 small fixes in context menu item visibility 2019-11-04 19:37:03 +01:00
zadam
5ecb881cec options template is handled directly in the option classes which fixes multiple binding of elements inside options dialog 2019-11-03 19:06:22 +01:00
zadam
fcb6a06d68 fix refreshing notes after import / delete
(cherry picked from commit 5b5ab0b044)
2019-11-03 18:34:07 +01:00
zadam
5b5ab0b044 fix refreshing notes after import / delete 2019-11-03 18:33:43 +01:00
zadam
ab04bde5fb options UI for image quality 2019-11-03 17:59:11 +01:00
zadam
c9e4261930 options for basic image quality control 2019-11-03 11:43:04 +01:00
zadam
9ea8209d4e separating some options to "startup" options which allows not creating new DB version for each new option 2019-11-03 10:43:40 +01:00
zadam
56e50cc850 boxicons 2019-11-02 13:50:17 +01:00
zadam
fc87bcf10c using boxicons instead of jam icons WIP 2019-11-02 12:17:00 +01:00
zadam
b471d51cb4 reloading of notes in tree cache when attribute changes 2019-11-02 08:04:22 +01:00
zadam
b7b583ff04 use decryptString() 2019-11-02 07:50:23 +01:00
zadam
475fddeec1 fixes 2019-11-01 23:05:33 +01:00
zadam
2af86927b0 added flag for the erased notes 2019-11-01 22:09:51 +01:00
zadam
2e58e32112 note revision sync and other fixes 2019-11-01 20:00:56 +01:00
zadam
5c05963bd9 Merge branch 'stable' 2019-11-01 19:21:55 +01:00
zadam
4e5e3e4675 note revisions changes WIP 2019-11-01 19:21:48 +01:00
zadam
f7c59700a5 release 0.36.2 2019-10-31 22:04:44 +01:00
zadam
f1a7fce277 fix creating branch without isExpanded, fixes initial document initialization 2019-10-31 22:02:55 +01:00
zadam
cf53cbf1dd moving out note revision content into separate table, refactoring, WIP 2019-10-31 21:58:34 +01:00
zadam
1a182d1b58 final fix for the ws issue 2019-10-30 19:43:17 +01:00
zadam
8bd52f349a small refactorings and defensive programming in note cache 2019-10-29 20:54:08 +01:00
zadam
68faa47c6f fix not sending latest syncs to client 2019-10-29 20:19:28 +01:00
zadam
2f2a14d4b8 shoutouts in the README 2019-10-29 19:59:19 +01:00
zadam
a2a53deb94 fancytree 2.33.0 2019-10-29 19:07:05 +01:00
zadam
d50e072ea4 fix not-updating lastSyncId in ws handler 2019-10-29 19:03:39 +01:00
zadam
904eb25f64 fix persistent toasts lingering after disposal in DOM 2019-10-29 18:59:56 +01:00
zadam
205081c804 actual fix for the not disappearing toasts 2019-10-28 20:44:11 +01:00
zadam
c4d5060a0b fix non disappearing persistent toast 2019-10-28 20:26:40 +01:00
zadam
5bba18191f small fixes 2019-10-28 19:45:36 +01:00
zadam
5e3538669d sending ws messages doesn't need await 2019-10-28 18:42:22 +01:00
zadam
23c449ca0c fix ordering of new notes 2019-10-27 22:39:38 +01:00
zadam
b7344329f4 date note fixes 2019-10-27 22:13:38 +01:00
zadam
e04845335b fixed search notes with new treecache 2019-10-27 19:17:32 +01:00
zadam
86a330c8c3 delete notes are now in cache as well which allows simplified update of the tree after deletion 2019-10-26 22:50:46 +02:00
zadam
f82e99b5ed fix "clone note after" 2019-10-26 21:14:06 +02:00
zadam
bdf42749f3 fixes 2019-10-26 20:48:56 +02:00
zadam
7ccbf45569 update to ckeditor 15 2019-10-26 10:09:48 +02:00
zadam
c0b30e603a updated API docs 2019-10-26 10:00:26 +02:00
zadam
d3c957768f branches in tree cache should always be loaded if some branchId reference exists 2019-10-26 09:58:00 +02:00
zadam
ed9ecf2a57 simplification of tree cache 2019-10-26 09:51:08 +02:00
zadam
22d48b0586 sync update persistent notification 2019-10-25 22:20:14 +02:00
zadam
edc23940d0 promise for loaded note cache 2019-10-25 21:57:08 +02:00
zadam
c72ea2ed60 changes in retrieval of initial note tree and then updates 2019-10-25 21:47:14 +02:00
zadam
4570319517 WS debugging messages and small changes 2019-10-24 23:02:29 +02:00
zadam
69d739400c refresh notes/branches sorted 2019-10-22 22:27:32 +02:00
zadam
ec7c0f0723 added sync mutex to ping messages 2019-10-22 21:59:51 +02:00
zadam
3de124748d fix a bug where render note content could be set to null during renaming 2019-10-21 22:56:43 +02:00
zadam
41d47c5d33 release 0.36.1-beta 2019-10-21 21:59:17 +02:00
zadam
132360b46b expose note hoisting to frontend API, closes #663 2019-10-21 21:22:53 +02:00
zadam
f0496cb42c generating simple frame based index page in html export 2019-10-21 21:00:27 +02:00
zadam
1522297700 generate navigation file in the tar export 2019-10-20 19:02:48 +02:00
zadam
2a5ab3a5e1 script can wait until the sync data has been applied 2019-10-20 17:49:58 +02:00
zadam
358fd13c8d small refactorings 2019-10-20 13:09:00 +02:00
zadam
2305ad7405 reloading notes after script changes 2019-10-20 12:29:34 +02:00
zadam
78f5b7b288 rename info service to toast service 2019-10-20 10:00:18 +02:00
zadam
1903c59163 scripts should have different sourceId 2019-10-19 15:12:25 +02:00
zadam
b16c2d19b6 duplicate (single) note 2019-10-19 12:36:16 +02:00
zadam
00bb1236ce protect/unprotect tree reports progress via notifications 2019-10-19 09:58:18 +02:00
zadam
82bbf4173b fixes to delete notifications 2019-10-19 00:11:07 +02:00
zadam
9f4ca279aa delete progress 2019-10-18 23:19:16 +02:00
zadam
b890859025 further refactoring of export notifications 2019-10-18 22:44:03 +02:00
zadam
56e4f4f5ac refactor exportcontext to taskcontext 2019-10-18 22:27:38 +02:00
zadam
157bd3816d add hideTabRowForOneTab if missing, fixes #660 2019-10-18 21:04:20 +02:00
zadam
21588829c7 correctly use taskId in toasts 2019-10-17 21:15:27 +02:00
zadam
9689029c4b ImportContext generalized to TaskContext 2019-10-17 21:11:35 +02:00
zadam
992d174b23 import uses persistent toasts 2019-10-17 20:44:51 +02:00
zadam
8886e95847 replaced bootstrap-notify.min.js with bootstrap toasts 2019-10-17 20:03:05 +02:00
zadam
6d5762fac8 open update to 7.0 2019-10-16 19:42:42 +02:00
zadam
e9ab044e46 fix docker build 2019-10-15 21:53:46 +02:00
zadam
fda219d070 release 0.36.0-beta 2019-10-15 20:42:17 +02:00
zadam
2be1aca2f3 build fixes 2019-10-15 20:32:43 +02:00
zadam
1b318d6a30 fix tab cleanup 2019-10-15 19:42:39 +02:00
zadam
22c4859d42 grey out archived items in the tree 2019-10-15 19:16:44 +02:00
zadam
80a6361cf1 update to demo db 2019-10-14 12:11:27 +02:00
zadam
8439effeeb Merge remote-tracking branch 'origin/master' into master2 2019-10-14 12:06:18 +02:00
zadam
fafab95a07 auto-book has variable number of columns based on the right pane width 2019-10-14 12:06:10 +02:00
Johannes Wünsch
24c8e8fc2b fix gitpod (#658) 2019-10-14 11:55:12 +02:00
zadam
1923bf7dda added some basic book examples to demo document 2019-10-14 11:15:38 +02:00
zadam
2ee94a3a69 changed import progress notification so it shows up for drag & drop as well 2019-10-14 10:31:58 +02:00
zadam
2fb3a3eff9 force note sync will sync also note content 2019-10-11 21:24:49 +02:00
zadam
bcbbf4dc3e improvements to build process 2019-10-11 21:22:59 +02:00
zadam
7dc793920f fix spellcheck build on windows 2019-10-10 23:24:25 +02:00
zadam
0b43eceb2d Merge branch 'stable'
# Conflicts:
#	package-lock.json
#	package.json
2019-10-10 21:26:57 +02:00
zadam
85f736139b fix opening note revisions from the sidebar 2019-10-10 20:00:06 +02:00
zadam
98a6670cb4 prevent default context menu on tab right click, closes #656 2019-10-10 19:34:55 +02:00
zadam
a15be82f00 release 0.35.2 2019-10-09 23:09:38 +02:00
zadam
6c3809e1db calendar widget styling for dark themes
(cherry picked from commit c9432990b7)
2019-10-09 23:07:15 +02:00
zadam
33a2cd21a3 fix double import of auto generated link relations
(cherry picked from commit 144e75da9e)
2019-10-09 23:05:52 +02:00
zadam
3eebce22e7 fix incorrect import of relations from tar
(cherry picked from commit 8d14a0d687)
2019-10-09 23:05:51 +02:00
zadam
adae0625b9 rename var so it's not misleading
(cherry picked from commit dd147a7209)
2019-10-09 23:05:14 +02:00
Arne
5063cfb979 BackendAPI: Return Note created within createNoteAndRefresh (#647)
(cherry picked from commit 334a38c493)
2019-10-09 23:05:14 +02:00
zadam
0835930a8a fix creating child in relation map, closes #655 2019-10-09 23:04:01 +02:00
zadam
c9432990b7 calendar widget styling for dark themes 2019-10-08 20:25:54 +02:00
zadam
9ad521822d mac spellchecker build 2019-10-07 22:17:22 +02:00
zadam
824fb08511 Merge remote-tracking branch 'origin/master' 2019-10-07 20:58:58 +02:00
zadam
cc4c15daf0 spellchecker binaries for windows 2019-10-07 20:58:48 +02:00
Logan Gorence
7718778013 Fix typo in note export screen. (#654) 2019-10-07 08:49:53 +02:00
zadam
a25260353d spellcheck binaries for linux-x64 2019-10-06 22:33:19 +02:00
zadam
c1e8a4b384 spell check support + small options tabs reorganization 2019-10-06 21:35:26 +02:00
zadam
3f2229d9e1 better handling of not detected mime type 2019-10-06 18:28:53 +02:00
FliegendeWurst
8561227622 Import: use upload mime type if mime cannot be detected from filename (#651) 2019-10-06 18:23:39 +02:00
zadam
8859e2ac40 fix opening links from book 2019-10-06 12:33:47 +02:00
zadam
7423b2f4fd book handling of protected notes 2019-10-06 11:21:12 +02:00
zadam
d23e9f1bc4 tar import will sort notes if there is no meta file 2019-10-06 09:49:47 +02:00
zadam
516277a478 added "auto book" displayed on the empty text pages as a replacement for children overview 2019-10-05 20:27:30 +02:00
zadam
cbc7710d81 removed children overview (will be replaced by book) 2019-10-05 12:06:06 +02:00
zadam
ea71e96f72 ability to set book zoom level via label 2019-10-05 12:01:00 +02:00
zadam
59d1cb1833 expand all children button 2019-10-05 11:22:42 +02:00
zadam
7c54ba63ce render notes in book 2019-10-05 10:55:29 +02:00
zadam
5892b5b851 nested note rendering in book 2019-10-05 09:33:31 +02:00
zadam
02eb737b9d book has now zoom 2019-10-04 22:21:14 +02:00
zadam
144e75da9e fix double import of auto generated link relations 2019-10-02 23:28:29 +02:00
zadam
8d14a0d687 fix incorrect import of relations from tar 2019-10-02 23:22:58 +02:00
zadam
dec2c218f7 basic book rendering of code and image notes 2019-10-02 19:40:22 +02:00
zadam
dd147a7209 rename var so it's not misleading 2019-10-01 21:42:36 +02:00
zadam
c3fabcb666 Merge remote-tracking branch 'origin/master' 2019-10-01 21:41:26 +02:00
zadam
35e825b376 fix tooltips 2019-10-01 21:41:20 +02:00
Arne
334a38c493 BackendAPI: Return Note created within createNoteAndRefresh (#647) 2019-10-01 21:40:57 +02:00
zadam
8ec01c73cd skeleton implementation of new "book" note type 2019-10-01 21:11:11 +02:00
zadam
0ef6634d41 release 0.35.1 2019-09-30 22:18:23 +02:00
zadam
f6fc24d11d use GFM extensions for markdown export, closes #638 2019-09-30 20:56:32 +02:00
zadam
ed24e32305 fix typo in shell, closes #639 2019-09-30 20:43:56 +02:00
zadam
86df60bb74 "code as code" and "text as text" import settings are respected also with tar import 2019-09-30 20:22:09 +02:00
zadam
42cf02e9a4 library updates 2019-09-30 19:35:00 +02:00
zadam
3add997b49 release 0.35.0-beta 2019-09-09 21:32:48 +02:00
zadam
649862b01c fixed mobile layout 2019-09-09 21:31:50 +02:00
zadam
f5228f87f0 widgets can have a help link with title 2019-09-09 21:23:04 +02:00
zadam
76f3e87790 small fixes 2019-09-09 20:29:07 +02:00
zadam
30c56cd8af template can now contain also content 2019-09-08 16:57:41 +02:00
zadam
16be0c1014 calendar now indicates whether date note already exists or not + tooltip 2019-09-08 16:30:33 +02:00
zadam
c82de8b6b2 calendar widget implementation 2019-09-08 16:06:42 +02:00
zadam
d3f2b71803 calendar widget setup 2019-09-08 13:08:01 +02:00
zadam
f3955bcbdc various small fixes 2019-09-08 11:25:57 +02:00
zadam
90afb2a1ee improvements in widgets rendering - individual widget render is now async while composing them together to the sidebar is sync which solves some race problems 2019-09-08 09:40:29 +02:00
zadam
2dae9b9621 note revisions widget shows content length 2019-09-08 09:17:16 +02:00
zadam
521a9b0b2c link map will try to display max possible number of links 2019-09-07 22:36:08 +02:00
zadam
2cfe9b3c03 note revision widget displays only date and time, no time offset 2019-09-07 22:03:08 +02:00
zadam
45ee959c11 date notes are now created with template relations 2019-09-07 21:40:18 +02:00
zadam
3bf8546d51 added getOwnedAttribute() without attr inheritance which can speed up bulk operations significantly 2019-09-07 20:43:59 +02:00
zadam
ca8b603bd9 fix attr invalidation after note change 2019-09-07 13:09:32 +02:00
zadam
faae11f070 template attributes don't need isInheritable flag to take effect 2019-09-07 11:00:15 +02:00
zadam
b069436039 added "edited notes on date" widget 2019-09-07 10:11:59 +02:00
zadam
e828ef370d note short can lazy load note content 2019-09-06 23:36:08 +02:00
zadam
50a0400616 fix note type selection 2019-09-06 22:18:03 +02:00
zadam
0226b1e9a8 fixes 2019-09-06 20:50:57 +02:00
zadam
135102d2b5 fixes to note loading. Sidebar flickers way less after note change 2019-09-04 22:45:12 +02:00
zadam
a17b8a053e refactoring of note loading 2019-09-04 22:13:22 +02:00
zadam
fdc86bab50 lazy loading of opened tabs to speed up initial startup 2019-09-04 21:30:11 +02:00
zadam
f885388bf7 avoid overflowing of long mime type 2019-09-03 22:06:49 +02:00
zadam
aa96b33bc2 initial load of tabs can run partially asynchronously to speed things up 2019-09-03 22:01:45 +02:00
zadam
e36d636f93 cloned notes are less conspicuous in the tree with only asterisk after a title 2019-09-03 21:34:20 +02:00
zadam
2e05cb1764 similar notes is getting updated automatically after the title change 2019-09-03 21:31:39 +02:00
zadam
9404e27cba similar notes is async'd a bit to not block the event loop too much 2019-09-03 21:16:14 +02:00
zadam
494ec0b051 introduction of @isArchived special filter. Fulltext now by default filters with @!isArchived, label search without filtering for archived 2019-09-03 20:16:38 +02:00
zadam
36b575c286 optimize length of type/mime type labels 2019-09-02 22:08:50 +02:00
zadam
d1992b061c fix drag & drop for chrome and code editor 2019-09-02 21:58:03 +02:00
zadam
a79aec85b5 speedup of similar notes widget 2019-09-02 21:36:24 +02:00
zadam
76dce5197f fix inline markdown import dialog 2019-09-02 21:23:55 +02:00
zadam
5d80df398b removed event log 2019-09-02 20:30:28 +02:00
zadam
a6f57d7761 recent changes now display also newly created notes without any revisions, some extra improvements to the dialog 2019-09-02 20:26:18 +02:00
zadam
a981df6282 fix dialog opening 2019-09-02 19:56:52 +02:00
zadam
ae8a2bfb1b updated demo document based on changes in tar format 2019-09-01 22:43:16 +02:00
zadam
15a2fe2570 fixes in import & export related to the protected session 2019-09-01 22:09:55 +02:00
zadam
8dadc7e518 allow deleting notes including all the clones, closes #629 2019-09-01 20:57:25 +02:00
zadam
c614bc3263 importing a note now creates internal link relations 2019-09-01 20:35:55 +02:00
zadam
1e50d88166 clones in export are now also md/html pages with link to the primary location 2019-09-01 16:46:36 +02:00
zadam
c9cc2cb4f3 refactoring of similar notes path handling 2019-09-01 13:42:10 +02:00
zadam
c8a5c71ec2 tweaks to similar notes + missing options init 2019-09-01 11:37:43 +02:00
zadam
55356963dd improvements to similar notes - now using dice's coefficient for better results 2019-09-01 11:33:45 +02:00
zadam
0e867a995f include linux-x64 pngquant binary to fix build issues 2019-09-01 10:11:29 +02:00
zadam
3ca37b2f42 widget can be also enabled/disabled using labels 2019-09-01 09:52:07 +02:00
zadam
0c78fda531 collpase type and mime to same row in note info widget 2019-09-01 09:16:08 +02:00
zadam
7c60080772 basic implementation of "similar notes" widget 2019-09-01 08:58:13 +02:00
zadam
bf5a31dcdb strip out HTML headers during the import 2019-08-31 22:52:07 +02:00
zadam
a5e38165ef remove H1 from the text during import if it matches note title 2019-08-31 22:45:57 +02:00
zadam
fe6f19e611 imported notes from tar now have correct links even without meta file 2019-08-31 22:39:25 +02:00
zadam
576a07bcb7 export to tar now preserves image and note links 2019-08-31 11:15:32 +02:00
zadam
4be7ac7ae1 export fixing links WIP 2019-08-31 10:12:42 +02:00
zadam
a81b00e130 fix link map zoom after reload and some tweaks to springy 2019-08-30 22:01:49 +02:00
zadam
d4e27c1b76 fixed CSS lazy loading (same file could be loaded multiple times) 2019-08-30 21:22:52 +02:00
zadam
be477f178b custom per-theme modal backdrop color 2019-08-30 20:34:32 +02:00
zadam
de95b92f90 link map tweaks 2019-08-30 20:15:59 +02:00
zadam
89ed9027da updated export + image link parsing fix 2019-08-29 23:11:59 +02:00
zadam
1c0b55e422 fixes to link parsing and tweaks 2019-08-29 23:08:30 +02:00
zadam
10d089240a updated DB schema and initial options 2019-08-29 22:32:53 +02:00
zadam
84b1f1f24e text editor now support font size, color, background 2019-08-29 22:20:08 +02:00
zadam
c8f59ea547 options UI for selecting support code note MIME types 2019-08-29 21:08:53 +02:00
zadam
9d958e1860 link map is kept centered on the active note box 2019-08-28 23:08:05 +02:00
zadam
ec06b940f4 when hovering over a note, outgoing and incoming connections are highlighted, set limit 3 seconds to the layout 2019-08-28 22:16:12 +02:00
zadam
f331172c7d fixes & tweaks 2019-08-28 21:15:16 +02:00
zadam
650d9e0b27 state management fixes 2019-08-28 20:29:10 +02:00
zadam
ff1d312a43 link map fixes 2019-08-27 22:47:10 +02:00
zadam
a4acbf3aea fixes for link map 2019-08-27 22:19:32 +02:00
zadam
242bea236f removed link remnants 2019-08-27 21:24:31 +02:00
zadam
ca2f14a2d0 extracted link map into a service 2019-08-27 20:20:00 +02:00
zadam
48a654630f added checkboxes/todo lists and image resize, closes #264, #587 2019-08-27 19:50:57 +02:00
zadam
cf5c1c1be1 implemented new way of adding extra languages to note type picker 2019-08-26 21:43:28 +02:00
zadam
0558c30b56 updated to ckeditor 12.4.0 2019-08-26 20:34:50 +02:00
zadam
36c87b7fa0 renamed "messagingService" to "ws" 2019-08-26 20:21:43 +02:00
zadam
d039a5f24e widgets are respecting positions 2019-08-26 20:19:14 +02:00
zadam
3e3d111d76 lazy loading of note detail components 2019-08-26 19:49:19 +02:00
zadam
ecb485c8bc removed frontend APIs to modify code note types 2019-08-25 23:12:58 +02:00
zadam
02ab59c9e0 render note type dropdown lazily 2019-08-25 23:09:22 +02:00
zadam
8e4e0bd543 fix global ko references 2019-08-25 22:31:02 +02:00
zadam
bbe0e9e425 lazy loading of knockout (used only in attribute dialog) 2019-08-25 21:59:54 +02:00
zadam
24a3f814ed fix ctrl+enter in sql console 2019-08-25 21:55:36 +02:00
zadam
233a50dbb7 reimplementation of note type with jquery only 2019-08-25 21:48:56 +02:00
zadam
6d8f11d533 fix code editor sometimes not rendering 2019-08-25 19:11:42 +02:00
zadam
4e4beb26c6 codemirro 5.48.4 2019-08-25 18:46:32 +02:00
zadam
1f092c2656 widgets now use options object 2019-08-25 17:41:08 +02:00
zadam
9622b046e0 refactored options_init to options on frontend 2019-08-25 17:36:13 +02:00
zadam
f9abea83f3 refactoring of access to options in frontend 2019-08-22 23:31:02 +02:00
zadam
b84542064c saving of widget configuration 2019-08-22 22:14:01 +02:00
zadam
8ab2c924c4 widget ordering WIP 2019-08-22 20:58:43 +02:00
zadam
4b9415a619 widget config WIP 2019-08-21 23:16:13 +02:00
zadam
c11479de58 options split into individual classes 2019-08-21 20:24:37 +02:00
zadam
dddb02a286 sorting widgets in options WIP 2019-08-20 23:30:19 +02:00
zadam
fab4c59f9b using dynamic import for dialogs and widgets to speed up initial load 2019-08-20 21:40:47 +02:00
zadam
b818f020a7 option to configure if sidebar should be enabled in new tab 2019-08-19 23:29:42 +02:00
zadam
9888850c22 resizing sidebar in options 2019-08-19 23:02:19 +02:00
zadam
04209182c1 options dialog view split up 2019-08-19 21:55:08 +02:00
zadam
02c9dabcff added "what links here" widget 2019-08-19 20:59:40 +02:00
zadam
c9d0b8cc40 link fixes 2019-08-19 20:19:42 +02:00
zadam
3cb421143f Link entity migrated to Attribute, WIP 2019-08-19 20:12:00 +02:00
zadam
fd9b79e115 loading of custom widgets 2019-08-17 11:28:36 +02:00
zadam
53c4bb8a94 refactor widget constructor 2019-08-17 10:45:20 +02:00
zadam
723fc42d88 reverted some experimental changes regarding sidebar resizing 2019-08-17 09:21:30 +02:00
zadam
1882b089ab delete confirmation lists notes for deletion in a UL list, #438 2019-08-17 09:00:53 +02:00
zadam
ad7a6c4d79 Merge remote-tracking branch 'origin/master' 2019-08-17 08:49:42 +02:00
zadam
48e0e797da hide tabContent during tab init to prevent flickering 2019-08-17 08:49:39 +02:00
parsehex
fbb77d3e55 List note titles in delete confirmation (#619)
* list note titles in delete confirmation

* typo
2019-08-17 08:49:08 +02:00
zadam
d1d8e54d20 fixed state persisting and loading 2019-08-16 21:52:36 +02:00
zadam
f259c60b54 state is now applied to sidebar widgets 2019-08-16 21:29:44 +02:00
zadam
aa981d3cd4 convert other widgets to StandardWidget base class 2019-08-15 21:18:33 +02:00
zadam
f8118444f9 introduced a StandardWidget base class 2019-08-15 21:08:41 +02:00
zadam
59da25ef55 sidebar & widget state management WIP 2019-08-15 10:04:03 +02:00
zadam
61520bc3b3 Merge branch 'stable'
# Conflicts:
#	package-lock.json
#	package.json
2019-08-15 08:52:34 +02:00
zadam
5406b09f3a release 0.34.3 2019-08-13 21:48:56 +02:00
zadam
90f1bfb3e4 electron 6.0.2 2019-08-13 21:48:45 +02:00
zadam
f30eec7737 make sure all keyboard shortcuts use utility methods to not break mobile frontend 2019-08-12 22:41:53 +02:00
zadam
493cd1a7e0 better behavior of activateNote frontend script 2019-08-12 22:25:42 +02:00
zadam
dfa1ab65c6 allow requiring native node modules from backend scripts 2019-08-12 20:41:38 +02:00
zadam
963ed32ce4 allow user to choose theme during initial setup 2019-08-11 10:28:49 +02:00
zadam
de4733e848 updating attributes widget based on sync data changes 2019-08-06 23:20:27 +02:00
zadam
bfbc124e78 widgets can now listen to sync data changes 2019-08-06 22:39:27 +02:00
zadam
fcd87b3e2d instantiate widgets dynamically 2019-08-06 21:36:54 +02:00
zadam
7bee93bb73 allow showing inherited attributes in the sidebar as well 2019-08-06 20:43:07 +02:00
zadam
c0c36d10e5 add attributes to the sidebar and remove them from the bottom 2019-08-06 20:05:05 +02:00
zadam
6e260ee563 Merge branch 'stable' 2019-08-06 19:28:11 +02:00
zadam
b1075d956f release 0.34.2 2019-08-01 21:37:59 +02:00
zadam
4dd6352aec use overflow-wrap instead of word-break which doesn't break words unless they really don't fit 2019-08-01 21:36:55 +02:00
zadam
6fe8bde720 package updates 2019-08-01 21:26:09 +02:00
zadam
0556ab5e66 Merge branch 'stable'
# Conflicts:
#	package.json
2019-07-30 22:11:20 +02:00
zadam
7060700225 fix mobile tree not expanding automatically on load 2019-07-30 21:18:43 +02:00
zadam
385b79ad34 Merge remote-tracking branch 'origin/t35'
# Conflicts:
#	src/views/tabs.ejs
2019-07-28 22:38:02 +02:00
zadam
b8509c487d release 0.34.1 2019-07-28 15:02:36 +02:00
zadam
083dee9bdd note activation from API will also scroll to it / focus 2019-07-28 14:47:35 +02:00
zadam
0c2dd6aa35 fix distraction free mode 2019-07-28 14:36:40 +02:00
zadam
743c15aacc fix code editor in mobile 2019-07-28 14:23:41 +02:00
zadam
263bff903c mobile frontend shows only the active tab 2019-07-28 14:08:05 +02:00
zadam
741dfaf2de hide tab row in distraction free mode 2019-07-28 13:50:46 +02:00
zadam
e4e4f73638 styling card header 2019-07-28 13:45:50 +02:00
zadam
85e4bd817b note revisions sidebar 2019-07-25 22:31:09 +02:00
zadam
78ffac8232 logging API auth rejections 2019-07-25 21:05:16 +02:00
zadam
b488adc330 sidebar POC WIP 2019-07-24 22:52:51 +02:00
zadam
a06bd877c9 Merge branch 'master' into t35 2019-07-24 21:25:21 +02:00
zadam
b3834324f6 fix sync proxy with TLS 2019-07-24 20:47:41 +02:00
zadam
d351134b75 Merge branch 'master' into t35 2019-07-22 22:46:47 +02:00
zadam
ea0835561c option to use node's http client for sync without proxy 2019-07-22 22:46:06 +02:00
zadam
b0c0c5f56b release 0.34.0-beta 2019-07-21 21:57:35 +02:00
zadam
849fad0421 link map in sidebar POC 2019-07-21 21:55:48 +02:00
zadam
eb28a3b0c9 note info sidebar widget 2019-07-21 11:32:38 +02:00
zadam
5283b489dc sidebar skeleton 2019-07-21 10:17:08 +02:00
zadam
d54f848572 use dev icon in dev environment 2019-07-21 09:14:56 +02:00
zadam
1ac0c4f874 fix scrollbar styling in both ff and chrome (white corner in dark themes when both scrollbars are present) 2019-07-20 22:14:40 +02:00
zadam
3850f52401 add ResizeObserver to tabs with fallback for older firefox 2019-07-20 22:01:50 +02:00
zadam
6d5f8e0562 added web clipper to readme 2019-07-20 14:27:36 +02:00
zadam
04633bdf3a set clip type from the incoming param 2019-07-19 21:03:47 +02:00
zadam
97219aa12e removed unused clipper image API (migrated to clippings) 2019-07-18 22:35:16 +02:00
zadam
e825abf893 Merge remote-tracking branch 'origin/master' 2019-07-18 20:20:45 +02:00
zadam
63b655cff4 package updates 2019-07-18 20:20:38 +02:00
Yevhen Kolomeiko
0524942d11 fix typo (#592) 2019-07-12 07:16:37 +02:00
zadam
b5d75f183a update to ckeditor 12.3.1 2019-07-11 22:30:40 +02:00
zadam
706fc647ff Merge branch 'stable'
# Conflicts:
#	package.json
2019-07-11 22:27:27 +02:00
zadam
13e9f9f9e7 release 0.33.7 2019-07-11 20:55:56 +02:00
zadam
a76dcb44ae improvements in the exported file extensions 2019-07-11 20:54:57 +02:00
zadam
b9373806cf fix doubling of extension 2019-07-11 20:40:40 +02:00
zadam
9de2927304 image import/export related fixes 2019-07-10 23:01:30 +02:00
zadam
c3e1126489 backported image fixes 2019-07-10 20:38:27 +02:00
zadam
3413c9ed64 backport notePath handling fixes from master 2019-07-10 20:35:01 +02:00
Xavier NUNN
dcebcb0e73 Add host option (#588)
* Added option to configure host

* Updated sample config
2019-07-09 22:50:20 +02:00
zadam
3d7a5f20e7 make it again possible to open notes through URL hash 2019-07-09 22:12:05 +02:00
zadam
6a99af64a8 added clipper protocol version 2019-07-07 22:27:06 +02:00
zadam
7d57961ab2 make clipper api authenticated for server and unauthenticated for local electron 2019-07-07 13:12:40 +02:00
zadam
95a773e5c9 clipper doesn't open new tab if the note is already loaded in existing tab 2019-07-07 11:15:55 +02:00
zadam
a912b2f23d choose port dynamically from range based on environment 2019-07-07 10:49:34 +02:00
zadam
36b581489c saving selections adds to the existing date note instead of creating new one each time 2019-07-06 23:54:48 +02:00
zadam
976684a3a8 save note in clipper 2019-07-06 16:48:06 +02:00
zadam
093dfb4a39 Merge branch 'stable' 2019-07-06 13:14:46 +02:00
zadam
ddf381f92d fixed duplicated notes after creating into a folder which wasn't yet loaded 2019-07-06 13:14:33 +02:00
zadam
2b44f3bc76 fixed websocket reconnection 2019-07-06 12:03:51 +02:00
zadam
7b1fdfabf8 upgrade ckeditor to 12.3.0 2019-07-04 19:53:10 +02:00
zadam
070e8d9647 Merge branch 'stable' 2019-07-03 20:51:34 +02:00
zadam
bf3360572a nest code editor instance to avoid visibility issues 2019-07-03 20:37:59 +02:00
zadam
e5036318af fix enter on title to the code editor 2019-07-03 20:29:55 +02:00
zadam
6d2394a9da release 0.33.6 2019-07-02 22:26:05 +02:00
zadam
427a266c57 Merge branch 'stable' 2019-07-02 21:56:23 +02:00
zadam
196264b8c2 use bootstrap modal to confirm note deletion which fixes #582 2019-07-02 21:54:37 +02:00
zadam
afe24866f0 some debug logging for duplicated nodes 2019-07-02 20:35:06 +02:00
zadam
d18a20cc06 fix focus issue from title to the text content with tab/enter 2019-07-02 20:28:57 +02:00
zadam
e94669de03 Merge branch 'stable' 2019-07-01 21:36:02 +02:00
zadam
9c91b0459e release 0.33.5 2019-06-30 21:47:04 +02:00
zadam
b161db064e choose only desired context menu items 2019-06-30 21:34:19 +02:00
zadam
ec4abe0d81 Merge branch 'stable' 2019-06-30 20:15:37 +02:00
zadam
af21dd4463 fix mobile text editor display 2019-06-30 20:14:57 +02:00
zadam
ef46727870 Merge branch 'stable' 2019-06-30 19:58:56 +02:00
zadam
1ea0d283de fix text instance sometimes remaining displayed when switching to e.g. image 2019-06-30 19:41:26 +02:00
zadam
ed380e09c9 context menu WIP 2019-06-30 18:56:46 +02:00
zadam
b5daa83d69 upgrades + removal of unused test 2019-06-30 11:22:10 +02:00
zadam
c4b957427d implement print, closes #581 2019-06-29 22:57:47 +02:00
zadam
2f3b256272 Merge branch 'stable' 2019-06-29 20:37:51 +02:00
zadam
6e3d8472e1 avoid duplicate key error 2019-06-28 21:50:15 +02:00
zadam
2a9f36a027 fix activating parent note after delete 2019-06-27 22:58:04 +02:00
zadam
cf3726289c attempt to fix the duplicate issue 2019-06-27 21:24:25 +02:00
zadam
c8e4a5c9e7 release 0.33.4 2019-06-26 21:20:30 +02:00
zadam
3851bedb57 Merge branch 't34' 2019-06-26 21:11:27 +02:00
zadam
a3951f1cce make sure autocomplete is closed when navigating to note 2019-06-26 21:08:54 +02:00
zadam
7c77ae758b fix frontend reload again 2019-06-26 20:49:17 +02:00
zadam
20d3d61cec release 0.33.3 2019-06-24 20:47:50 +02:00
zadam
1b831f94a9 fix orphan note autocomplete, closes #569 2019-06-24 20:45:35 +02:00
zadam
3f241553aa fix pngquant for linux-x64 2019-06-24 20:27:28 +02:00
zadam
8624c83108 use 127.0.0.1 instead of localhost, #577 2019-06-24 20:26:28 +02:00
zadam
d49cae9cea fix update of window title during note renaming 2019-06-24 20:12:04 +02:00
zadam
174128447b token auth to /login 2019-06-23 21:22:08 +02:00
zadam
5d213eea7e basic webp support 2019-06-23 15:22:05 +02:00
zadam
f45e25172b opening links from the clipper 2019-06-23 13:25:00 +02:00
zadam
ec87856ef4 save image 2019-06-23 12:16:26 +02:00
zadam
6feb7ad1d5 selection clipping now supports images 2019-06-23 11:25:15 +02:00
zadam
6833e84d55 fix pngquant for linux-x64 2019-06-23 09:10:06 +02:00
zadam
154a575701 cleanup + context menu clip now works 2019-06-22 19:49:48 +02:00
zadam
504b2e2c4a Merge pull request #574 from maurerit/master
Build failed without python for arm
2019-06-21 09:10:17 +02:00
Matt Maurer
2c5292222f Build failed without python for arm 2019-06-20 23:45:31 +00:00
zadam
989da8877b added link map 2019-06-20 10:20:44 +02:00
zadam
70591eadd5 release 0.33.2-beta 2019-06-20 09:39:11 +02:00
zadam
fead3cd7ad fix note export/import/branch prefix to use right-clicked note as opposed to current active 2019-06-20 09:37:18 +02:00
zadam
a7cf3cdf05 fix unloading protected session after the timeout, fixes #571 2019-06-19 22:23:55 +02:00
zadam
5372f71faa hide menu bar 2019-06-19 20:45:19 +02:00
zadam
3b76939f17 distinction between unfocused active and hovered node - unfocused active has dashed border 2019-06-17 22:30:26 +02:00
zadam
c827d38f39 when single note is selected and it's the same that was right clicked for context menu, then we treat it as no-selection action 2019-06-17 22:25:22 +02:00
zadam
1e7586fae4 context menu items are now disabled when there are selected notes and the item does not support actions on multiple items 2019-06-17 20:34:00 +02:00
zadam
ee89111bfb fix clipboard operation for single nodes 2019-06-16 18:07:22 +02:00
zadam
288b3077b2 context menu items are now disabled when there are selected notes and the item does not support actions on multiple items 2019-06-16 12:06:06 +02:00
zadam
5c1922ac9f release 0.33.1-beta 2019-06-16 11:13:37 +02:00
zadam
93f1d46104 fix tree activation/focus after deleting node 2019-06-16 11:12:07 +02:00
zadam
c5daaf541a active note has also border to make it more prominent 2019-06-16 10:53:30 +02:00
zadam
12b17b1e9e fix ctrl+. to switch focus to note tree 2019-06-16 10:41:22 +02:00
zadam
ad46ba7d0f fix fancytree navigation bug before official release, use unminified build in the meantime 2019-06-16 09:44:23 +02:00
zadam
44f592c6cb fix reload 2019-06-16 09:15:37 +02:00
zadam
943b35fb7d fix delete with keyboard and context menu regarding the selection 2019-06-13 22:55:06 +02:00
zadam
f1967fd466 fix unhoisting note 2019-06-13 22:45:55 +02:00
zadam
ce2404b18a add link to link map to README 2019-06-12 22:10:05 +02:00
zadam
cdd53a39f1 release 0.33.0-beta 2019-06-12 21:45:05 +02:00
zadam
c646019536 ignore electron error 2019-06-12 21:44:33 +02:00
zadam
c8049f0efe small fixes 2019-06-12 19:59:52 +02:00
zadam
f2c497049b node updated to 12, electron to 6 2019-06-11 21:56:21 +02:00
zadam
d713274ae2 link map tweaks 2019-06-11 21:52:00 +02:00
zadam
a72eeb9a98 check sync version before setting up the sync, fixes #559 2019-06-11 20:42:06 +02:00
zadam
41cdd5c640 npm updates 2019-06-10 23:00:50 +02:00
zadam
4cde65d171 close currently active dialog if a different one is activated 2019-06-10 22:45:03 +02:00
zadam
27659805f6 redesign of drag & drop, separation of active, focused and active notes in the tree, fixes #565 2019-06-10 21:47:08 +02:00
zadam
8ab081a3fd configuration of displayed link types + max number of links 2019-06-10 14:33:59 +02:00
zadam
ccbb2e2e12 link map visual tweaks 2019-06-10 11:22:52 +02:00
zadam
2bf2ec5a6c link map WIP 2019-06-09 21:48:30 +02:00
zadam
4329675c60 dynamic display of link map 2019-06-09 19:18:14 +02:00
zadam
412b0377e9 added panzoom to link map 2019-06-09 11:50:11 +02:00
zadam
69e48ff4d7 fix links table reference 2019-06-09 11:16:00 +02:00
zadam
4cacd1dfa2 Merge branch 'stable'
# Conflicts:
#	libraries/ckeditor/ckeditor.js
#	libraries/ckeditor/ckeditor.js.map
2019-06-09 10:20:45 +02:00
zadam
0c8ad1b46e disable media embed in ckeditor, fixes #564 2019-06-09 09:58:25 +02:00
zadam
d3ac7b0939 fix disappearing expander in some cases, closes #562 2019-06-07 22:37:10 +02:00
zadam
e0306d4ad7 ckeditor upgraded to 12.2.0 2019-06-06 21:33:59 +02:00
zadam
1f3d726048 Merge branch 'stable'
# Conflicts:
#	package-lock.json
2019-06-06 21:24:25 +02:00
zadam
f3ed7e936d focus input on shown modal in branch prefix dialog, fixes #560 2019-06-06 21:16:12 +02:00
zadam
547ad7221d release 0.32.4 2019-06-05 22:53:34 +02:00
zadam
97a258c0c6 include sync version in sync seed request, #559 2019-06-05 22:50:03 +02:00
zadam
19a154c2f4 fix direct migration from 0.30 to 0.32, closes #557 2019-06-05 22:07:12 +02:00
zadam
b389ec5ea3 enter/leave protected session button is not refreshed after entering from note detail (not dialog), fixes #555
(cherry picked from commit 0a0663be69)
2019-06-05 21:42:58 +02:00
zadam
412375e92f import should recognize all suported code note file types, fixes #554 2019-06-05 21:27:07 +02:00
zadam
4b96ada781 link map WIP 2019-06-04 22:57:10 +02:00
zadam
87b16f3325 link map WIP 2019-06-03 22:55:59 +02:00
zadam
0a0663be69 enter/leave protected session button is not refreshed after entering from note detail (not dialog), fixes #555 2019-06-03 20:36:37 +02:00
zadam
7eed076674 link router/loading 2019-06-02 17:12:18 +02:00
zadam
b5143c152b link map empty dialog 2019-06-02 15:35:57 +02:00
zadam
6ef8a4c018 Merge branch 'next'
# Conflicts:
#	package.json
2019-06-02 15:22:15 +02:00
zadam
ebd26f85bd release 0.32.3 2019-06-02 14:04:32 +02:00
zadam
fbfb7b3b30 sync endpoints should not set csrf cookie, #541 2019-06-02 13:52:31 +02:00
zadam
cfb313b60e sync endpoints should not set csrf cookie, #541 2019-06-02 13:47:59 +02:00
zadam
54e37dea20 codemirror updated to 5.47.0 2019-06-02 09:59:07 +02:00
zadam
5b14358620 fix folder status rendering issues when opening not-yet-loaded notes 2019-06-01 20:54:39 +02:00
zadam
c4669cbaa3 fallback to display empty tab if the requested note doesn't exist anymore 2019-06-01 20:32:11 +02:00
zadam
74b41c9911 tree reloads should preserve activated node, fixes #552 2019-06-01 14:12:27 +02:00
zadam
d08a36174d attribute sync should trigger note reload, fixes #551 2019-06-01 12:14:09 +02:00
zadam
e845b80e10 fancytree upgrade to 2.31.0 2019-05-31 18:50:41 +02:00
zadam
b0303ef529 updated sqlite binaries for electron 6 / node 12 2019-05-31 18:46:23 +02:00
zadam
68f67ec6ee package upgrades 2019-05-31 18:39:18 +02:00
zadam
20ae67f510 Merge branch 'master' into next
# Conflicts:
#	package-lock.json
#	package.json
2019-05-31 18:30:16 +02:00
zadam
237749e4af make recent notes dialog scrollable 2019-05-30 20:58:01 +02:00
zadam
15f4782947 make node activation after load clearer 2019-05-30 20:55:39 +02:00
zadam
d48efd1925 FIXME 2019-05-29 23:34:23 +02:00
zadam
883d726622 release 0.32.2-beta 2019-05-29 23:14:59 +02:00
zadam
0a0cac5f41 added extra logging for debugging CSRF issues 2019-05-29 23:13:15 +02:00
zadam
012a18be00 put tabContext into frontend script API 2019-05-29 21:48:48 +02:00
zadam
890c00d4ba make frontendStartup event deterministic after the tree and tabs are loaded, fixes #543 2019-05-29 21:10:28 +02:00
zadam
bb43014230 hide search help tooltip on executed search 2019-05-29 20:27:48 +02:00
zadam
53a995fecb fix database anonymization 2019-05-29 19:57:50 +02:00
zadam
8d3262d232 fix setting the title bar when switching note 2019-05-29 19:55:05 +02:00
zadam
373ec4ac50 Merge pull request #542 from spantaleev/exit-on-sigint
Exit on SIGINT
2019-05-29 19:40:04 +02:00
zadam
3fdecee95f fix bug with unresponsive tree after tree reload 2019-05-28 20:22:16 +02:00
Slavi Pantaleev
86b9f5a8b0 Exit on SIGINT
Pressing Ctrl+C used to not exit the application
(at least when running the Docker image).

Explicitly catching the `SIGINT` interrupt signal and exiting
fixes the problem.

We currently make it exit immediately as soon as the signal arrives.

In the future, it may be preferable to do dispatch some event and
try to exit more gracefully (finish any ongoing synchronization work,
etc.)
Still, I think it's better to exit directly than to not do anything at
all, in which case `SIGKILL` is likely to follow and kill the process
even more abruptly.
2019-05-28 13:38:32 +03:00
zadam
873b60b00d release 0.32.1-beta 2019-05-27 21:39:43 +02:00
zadam
fc58086f6e fix super long line in code editor blowing up / overflowing the content grid cell width 2019-05-27 21:02:09 +02:00
zadam
40cec31099 schema update 2019-05-27 19:34:18 +02:00
zadam
33733d3ab7 use node 12 for server/docker builds 2019-05-27 19:12:34 +02:00
zadam
f08bf0be15 upgrade to electron 6.0.0-beta.4 2019-05-23 19:59:23 +02:00
zadam
296cb7236f Merge branch 'stable'
# Conflicts:
#	package.json
#	src/services/build.js
2019-05-23 19:32:04 +02:00
zadam
d614967d62 release 0.32.0-beta 2019-05-22 22:28:35 +02:00
zadam
35648b9f37 fix protected shield background visibility 2019-05-22 22:26:55 +02:00
zadam
494a980ecb fixes for drag & create new note in relation map 2019-05-22 22:22:29 +02:00
zadam
810aa8c2fb tab height tweak 2019-05-22 22:09:53 +02:00
zadam
027b3eaed8 fix tab dragging issue 2019-05-22 21:59:14 +02:00
zadam
dedc1e708f fix redirect after login 2019-05-22 21:25:13 +02:00
zadam
79956b5676 mobile web fixes 2019-05-22 20:53:59 +02:00
zadam
48b1aece4d fix history navigation 2019-05-21 22:35:01 +02:00
zadam
eee75bd2e8 fix node focus after hoisting 2019-05-21 22:07:08 +02:00
zadam
29828f8e8f fix recent notes (db & sync version increase) 2019-05-21 21:47:28 +02:00
zadam
ced02b42b5 new card for tab operation in built-in help 2019-05-21 20:43:03 +02:00
zadam
3fe9218ea8 refactoring/cleanup 2019-05-21 20:24:40 +02:00
zadam
ff5ea8b311 style change to active tab 2019-05-21 19:54:57 +02:00
zadam
32fae5e9e8 same note in different tabs are synced 2019-05-20 22:25:04 +02:00
zadam
48b4488a58 deleting a note will close all tabs containing the note 2019-05-20 21:50:01 +02:00
zadam
aead6a44de render notes should now return elements to append instead of modifying DOM directly 2019-05-19 21:52:28 +02:00
zadam
f59f08fa0e fix note paths 2019-05-19 21:22:35 +02:00
zadam
119d7367da tree fixes 2019-05-19 18:21:29 +02:00
zadam
ddb99a0917 ctrl+enter should work only on tab detail 2019-05-19 16:56:16 +02:00
zadam
ecfba95841 calendar root can now have datePattern and monthPattern to define the names 2019-05-19 11:30:17 +02:00
zadam
597eb5a300 ctrl+alt+p will create new note in a new tab 2019-05-19 10:46:19 +02:00
zadam
f3e7e6bbe7 fix render note attributes 2019-05-19 10:30:00 +02:00
zadam
722380e7b8 fix access to editor instance if active note is not text 2019-05-19 09:13:13 +02:00
zadam
8c46e96397 tab styling tweaks 2019-05-19 08:47:00 +02:00
zadam
f22cc37df7 middle click can now open links in new tab (and close tab) 2019-05-15 21:50:27 +02:00
zadam
dd1fc23fe8 work on hash & history 2019-05-14 22:29:47 +02:00
zadam
f9f4148e8c release 0.31.6 2019-05-13 23:12:12 +02:00
zadam
2178f82324 fixes to mobile version (WIP) 2019-05-13 23:08:59 +02:00
zadam
79d779dee8 setup cssClass for both note tab and content, #524 2019-05-13 22:08:06 +02:00
zadam
93c0469aa0 Merge branch 'stable'
# Conflicts:
#	src/public/javascripts/dialogs/add_link.js
2019-05-13 21:42:52 +02:00
zadam
81d10fa605 fix focusing the text editor component after adding a link, closes #523 2019-05-13 21:13:04 +02:00
zadam
75ef766649 fix retrieving "many rows", closes #525 2019-05-13 20:40:00 +02:00
zadam
fab8b77794 configurable hiding of tab row for one tab 2019-05-12 21:45:30 +02:00
zadam
8b030a2323 new tab now has note autocomplete 2019-05-12 17:28:20 +02:00
zadam
14c420b782 new tab infrastructure 2019-05-12 12:58:55 +02:00
zadam
637547a3fa add new tab button, WIP 2019-05-12 10:59:53 +02:00
zadam
c39c1baa4d further simplification 2019-05-12 10:21:27 +02:00
zadam
b9edd0ecc7 tabs simplification 2019-05-12 10:11:41 +02:00
zadam
2dec8f1ad6 hoisting note now seems to work correctly in relation to tabs 2019-05-11 21:27:27 +02:00
zadam
bd97df5ee9 refactored chrome tabs into "tab row" 2019-05-11 19:44:58 +02:00
zadam
8a501521e8 some refactoring etc. 2019-05-11 19:27:33 +02:00
zadam
be68391c37 store "openTabs" session 2019-05-10 21:43:40 +02:00
zadam
89d4be504d tree active note now follows switched tabs (without changing scroll position) 2019-05-09 21:30:08 +02:00
zadam
0a2acbe4be npm package upgrades 2019-05-08 20:19:31 +02:00
zadam
a7a42ff4af use notePath in tabContext 2019-05-08 20:14:41 +02:00
zadam
bacf163c96 NoteContext => TabContext 2019-05-08 19:55:24 +02:00
zadam
db7e083a21 ctrl-click opens new tab 2019-05-08 19:10:45 +02:00
zadam
8eaf44735a context menu on link to open in new tab 2019-05-07 22:33:53 +02:00
zadam
bfc61f8b36 tab bar is automatically hidden for only one tab 2019-05-07 22:14:35 +02:00
zadam
4ea27e604f context menu on tab and "close all except for this tab" 2019-05-07 21:34:01 +02:00
zadam
aef0e552a0 ctrl+tab and ctrl+shift+tab can be used to switch tabs 2019-05-07 21:04:07 +02:00
zadam
d36bff2a97 protected session in a dialog now works, proper reloading 2019-05-05 20:45:07 +02:00
zadam
61696f0287 protected session in a component now works 2019-05-05 19:48:30 +02:00
zadam
9a97fe09ee note actions now work again 2019-05-05 18:24:59 +02:00
zadam
b1d0cef33b tabs WIP 2019-05-05 10:59:34 +02:00
zadam
7f0c92c56b attributes and children overview working again 2019-05-04 22:44:25 +02:00
zadam
b21568806a Merge branch 'stable' into tabs 2019-05-04 20:49:42 +02:00
zadam
80fb89b794 release 0.31.5 2019-05-04 20:25:14 +02:00
zadam
47d28b4eef fix protecting files/images 2019-05-04 16:05:28 +02:00
zadam
a9762c5139 fix incorrect switch between protected/unprotected states causing content not being encrypted, fixes #510 2019-05-04 14:46:17 +02:00
zadam
32439ed006 tabs WIP 2019-05-04 14:34:03 +02:00
zadam
ff41904d72 convert more note details to new style 2019-05-04 00:16:41 +02:00
zadam
39093cbc4c basic opening and switching tabs 2019-05-03 21:50:14 +02:00
zadam
c7b5784123 context menu refactoring 2019-05-03 20:27:38 +02:00
zadam
3e22804a76 Merge branch 'stable' into tabs 2019-05-03 19:59:47 +02:00
zadam
7ce98b0b28 release 0.31.4 2019-05-02 22:25:48 +02:00
zadam
0d11cadc18 tabs wip 2019-05-02 22:24:43 +02:00
zadam
63ab82a076 tabs wip 2019-05-01 23:06:18 +02:00
zadam
7e03f14e01 tabs wip 2019-05-01 22:19:29 +02:00
zadam
c9183f8bd4 #note-detail-wrapper => .note-tab-content 2019-05-01 10:17:17 +02:00
zadam
bc2d1f1ef9 changes in grid for tabs 2019-05-01 09:52:45 +02:00
zadam
e7c053d273 split out themes.css 2019-05-01 08:57:44 +02:00
zadam
3ccf553fda initial experiments with tabs 2019-04-30 22:31:12 +02:00
zadam
6d2eb7b187 fix paragraph button overflowing over text, closes #502 2019-04-29 21:52:28 +02:00
zadam
7234324112 dropdowns and buttons now respect main font sizing 2019-04-29 21:31:19 +02:00
zadam
8205cdc288 fix creation of top level note, closes #501 2019-04-29 21:18:12 +02:00
zadam
29931bbddf release 0.31.3 2019-04-28 22:58:27 +02:00
zadam
68cd4c9a31 focused cell background tweak 2019-04-28 22:02:24 +02:00
zadam
f4b986e1c1 added global menu item for fullscreen toggle 2019-04-28 21:59:29 +02:00
zadam
c0496ebef3 f11 can now toggle Trilium window to/from fullscreen 2019-04-28 21:52:25 +02:00
zadam
6aa30a4c74 steel blue theme updated with link color 2019-04-28 21:43:56 +02:00
zadam
3035a948b9 less hacky way to implement distraction free mode which also fixes scrollbar 2019-04-28 21:24:13 +02:00
zadam
7880cf62fe open links from render note 2019-04-28 17:44:00 +02:00
zadam
ff76ba7d1b better theming of CKEditor through CSS variables (mostly) 2019-04-28 17:37:28 +02:00
zadam
06be593fe4 crash if the DB has newer version than the application 2019-04-23 21:27:45 +02:00
zadam
91e3eb8ae7 create "series" docker tag 2019-04-23 20:20:42 +02:00
zadam
f7dd3558a7 release 0.31.2-beta 2019-04-22 22:53:04 +02:00
zadam
eac5ec6e26 added searchForNote(s) also to frontend API 2019-04-22 22:52:09 +02:00
zadam
f273b4334e implemented @limit for search 2019-04-22 18:08:33 +02:00
zadam
15eaf67189 fix broken history navigation 2019-04-22 17:13:24 +02:00
zadam
983d9c4319 fix merge issue 2019-04-22 17:05:04 +02:00
zadam
a88a00b60e Merge branch 'stable'
# Conflicts:
#	package-lock.json
#	package.json
#	src/public/javascripts/services/note_detail_file.js
#	src/services/build.js
2019-04-22 16:29:16 +02:00
zadam
a44f43b133 release 0.30.8 2019-04-22 15:02:39 +02:00
zadam
69677b15fe fix broken file download 2019-04-22 15:01:05 +02:00
zadam
2573c3b8a6 sync frontend dayjs to 1.8.12 2019-04-22 14:15:30 +02:00
zadam
0b0e9f2953 from now on, "latest" docker tag won't point to beta releases, closes #476 2019-04-21 12:48:16 +02:00
zadam
1990c9399e removed FTS5 completely 2019-04-21 12:03:13 +02:00
zadam
151641b659 fulltext search now doesn't use FTS5, closes #489 2019-04-21 11:54:13 +02:00
zadam
36c6376220 create trilium data directory if it doesn't exist, closes #491 2019-04-21 09:05:55 +02:00
zadam
f0e22b70f6 tree reload doesn't necessarily re-activates the note 2019-04-20 21:14:48 +02:00
zadam
225e893461 fix closing of tooltips 2019-04-20 09:39:39 +02:00
zadam
064a11d872 don't allow deleting hoisted note + other related fixes, closes #488 2019-04-16 21:40:04 +02:00
zadam
3760835608 added noscript to make it clear that Trilium requires JavaScript 2019-04-15 21:30:26 +02:00
zadam
e7ac2ec4ed add noscript to setup 2019-04-15 21:28:21 +02:00
zadam
8da8dfc543 if the resized and optimized image is larger than original, then keep the original 2019-04-15 21:12:47 +02:00
zadam
6b3c8b4bac Merge remote-tracking branch 'origin/master' 2019-04-15 21:08:38 +02:00
zadam
25fe78012f upgrade to ckeditor 12.1.0 which fixes some upload issues 2019-04-15 21:08:31 +02:00
zadam
147d79c65c release 0.31.1-beta 2019-04-14 21:18:22 +02:00
zadam
6fddd2bd62 Merge pull request #485 from fbartels/docker-compose
add example docker-compose
2019-04-14 20:22:55 +02:00
zadam
77c9b64dc7 re-enable animation for expanding since it seems to fix fancytree rendering glitches 2019-04-14 19:43:44 +02:00
zadam
47cb7c7f5e not refreshing tree after sort operation because it messes with everything ... 2019-04-14 18:32:56 +02:00
zadam
1bd769827d faster opening of the date notes (no animation) 2019-04-14 18:16:15 +02:00
Felix Bartels
288ec88c2f add example docker-compose
Signed-off-by: Felix Bartels <felix@host-consultants.de>
2019-04-14 15:24:35 +02:00
zadam
71916b5e28 empty icon for some menu actions do de-emphasize less important items 2019-04-14 13:51:21 +02:00
zadam
b2d4330692 added button for reloading frontend 2019-04-14 12:48:50 +02:00
zadam
253a6ef081 added date note APIs to frontend script API 2019-04-14 12:24:48 +02:00
zadam
e1e020c1a4 more reliable reimplementation of "create day sub note" 2019-04-14 12:18:52 +02:00
zadam
2b4413a1bd exposing tree cache methods to reload note's parents/children to frontend API 2019-04-13 22:56:45 +02:00
zadam
dae674a7cd tree cache reloading 2019-04-13 22:10:16 +02:00
zadam
751bf94758 don't change sourceId for script execution which forces full tree reloads because it is annoying 2019-04-13 19:45:50 +02:00
zadam
4b934a4a81 fix sync / fulltext issue 2019-04-13 19:34:19 +02:00
zadam
7e374e795b fill sync rows to fix sync issues 2019-04-13 10:30:16 +02:00
zadam
be378f71b0 sync checks for note_contents 2019-04-13 10:13:47 +02:00
zadam
27f74489fd fix login/logout redirects when not in the document root 2019-04-11 22:04:36 +02:00
zadam
ae8f4ffbbe minor sync fix for fulltext 2019-04-11 21:44:35 +02:00
zadam
896776516b fix in page search in browser (didn't appear after ctrl+f) 2019-04-09 21:16:18 +02:00
zadam
a27525af9e frontend API additions 2019-04-09 21:13:47 +02:00
zadam
83b4382787 missing cert and key error message 2019-04-08 20:08:29 +02:00
zadam
ef1b32d586 search error handling & sanitize input for default fulltext 2019-04-02 22:52:42 +02:00
zadam
fe3a0bc756 new find-in-page dialog (using electron-find) which actually works 2019-04-02 21:44:56 +02:00
zadam
2259e1d44d make sure to wait for DB connection to be up before starting ... 2019-04-02 19:42:41 +02:00
zadam
9ca4a016eb fix linux server build 2019-04-01 23:11:06 +02:00
zadam
2978a262f7 release 0.31.0-beta 2019-04-01 21:50:32 +02:00
zadam
f47f3461e6 show local date in revisions dialog + make it larger 2019-04-01 21:49:27 +02:00
zadam
06202c31e4 note info shows local date instead of utc date 2019-04-01 21:43:45 +02:00
zadam
925dc258a6 fix menu text color in dark themes 2019-04-01 21:38:21 +02:00
zadam
3670800a51 set cookie header only for electron calls 2019-04-01 21:18:11 +02:00
zadam
90a331b989 some style fixes and refactoring for tree context menu 2019-04-01 21:11:20 +02:00
zadam
a4c8bdeda2 fix decryption of protected note revisions 2019-03-31 22:54:38 +02:00
zadam
5bda254184 allow searching with noteId & fix combining fulltext and other conditions with OR 2019-03-31 22:23:50 +02:00
zadam
26621c0318 short search help in the tooltip 2019-03-31 21:19:10 +02:00
zadam
c6806256fd import doesn't need a full tree reload 2019-03-31 19:13:17 +02:00
zadam
f00e1235f9 tar import can now process files with out of order directories 2019-03-31 18:53:29 +02:00
zadam
51bede6541 fix detection of sync connection issue with new error code 2019-03-31 18:36:12 +02:00
zadam
75dbaa4b77 fix csrf protection on electron build 2019-03-31 12:49:42 +02:00
zadam
bec6576620 fix note cleanup 2019-03-31 11:27:19 +02:00
zadam
44551e0e8c electron build now waits for the migration before opening the window 2019-03-31 11:21:44 +02:00
zadam
67553cb40e fix ordering of note migrations 2019-03-30 22:20:18 +01:00
zadam
7cafbda7cd migration for inconsistent isProtected status across notes and note_contents 2019-03-30 22:12:18 +01:00
zadam
9a5a085103 Merge branch 'stable'
# Conflicts:
#	package-lock.json
#	src/public/javascripts/services/server.js
#	src/services/app_info.js
#	src/services/notes.js
2019-03-30 22:11:03 +01:00
zadam
cdb17ae937 release 0.30.7 2019-03-30 20:13:53 +01:00
zadam
c240fb9896 migration for inconsistent isProtected status across notes and note_contents 2019-03-30 20:09:38 +01:00
zadam
4b41eddf44 fix creating note directly as protected 2019-03-30 19:24:53 +01:00
zadam
b51ac112a2 fix loading of protected session in electron, #469 2019-03-30 18:00:08 +01:00
zadam
a1ac609b34 search input tooltip WIP 2019-03-30 17:41:53 +01:00
zadam
66e2a12f3d rename "current" to "active" based on recent refactorings 2019-03-30 10:15:19 +01:00
zadam
9f69294f7f Merge pull request #466 from capi/ctrl-shift-l
Add Ctrl+Shift+L to pre-select "add to note"
2019-03-30 10:13:31 +01:00
zadam
a5fc8d5329 moved libraries and images out of src folder 2019-03-30 09:39:58 +01:00
zadam
7bbf797caf saved search note now has refresh button, closes #369 2019-03-30 00:12:32 +01:00
zadam
f479c0e10e when note is created, it's automatically present in all cloned parents as well 2019-03-29 23:55:28 +01:00
zadam
0f32154b91 Merge remote-tracking branch 'origin/stable'
# Conflicts:
#	src/public/javascripts/services/context_menu.js
2019-03-29 23:37:36 +01:00
zadam
f2019ee5f9 slightly nicer search detail 2019-03-29 23:28:41 +01:00
zadam
89b8e2bb08 redesign of search input. Saved search is now saved under active note and doesn't need page reload 2019-03-29 23:24:41 +01:00
zadam
8fb6edad67 fix consistency checks for fulltext 2019-03-29 22:08:04 +01:00
zadam
c2e3a3fe04 release 0.30.6 2019-03-28 23:17:24 +01:00
zadam
b2052a6ccd release 0.30.6 2019-03-28 23:01:52 +01:00
zadam
a07479cd5a release 0.30.6 2019-03-28 22:49:34 +01:00
zadam
3820384f51 release 0.30.6 2019-03-28 22:35:43 +01:00
zadam
0610576e5a 0.30.6 2019-03-28 22:35:36 +01:00
zadam
efac7701eb release 0.30.6 2019-03-28 22:31:59 +01:00
zadam
905eb303bc fix protected note switching 2019-03-28 21:17:40 +01:00
zadam
27cee1cf33 fix closing of context menu on FF66, closes #468
(cherry picked from commit 3c56d29fca)
2019-03-28 20:57:11 +01:00
zadam
3c56d29fca fix closing of context menu on FF66, closes #468 2019-03-28 20:54:17 +01:00
zadam
946dae72d9 implemented consistency check for note fulltext based on hashes 2019-03-27 21:27:29 +01:00
zadam
58f71c7300 some design explanations on special handling of content 2019-03-27 21:16:13 +01:00
zadam
07e9013152 content migration fixes 2019-03-27 21:04:25 +01:00
zadam
29c60581a6 yet another refactoring of working with note's payload/content 2019-03-26 22:24:04 +01:00
zadam
4bdcf32475 repository now uses upsert instead of insert/replace 2019-03-25 22:06:17 +01:00
Martin Carpella
44c742e839 Add Ctrl+Shift+L to pre-select "add to note" 2019-03-25 21:09:15 +01:00
zadam
001bd1d004 fix csrf path so that it's valid only for current path and not whole (sub)domain 2019-03-24 23:03:30 +01:00
zadam
6c7e2f0aa1 moved "About" from options dialog to a separate dialog under global menu 2019-03-24 23:01:33 +01:00
zadam
9fc5d328b4 added CSRF protection using csurf express middleware, fixes #455 2019-03-24 22:41:53 +01:00
zadam
f6413d095c update schema -> fix creating new database from scratch 2019-03-24 21:06:38 +01:00
zadam
d66ad4319e fix focused table cell background color, closes #458 2019-03-24 20:16:05 +01:00
zadam
251fcaeb48 support for superscript and subscript, closes #462 2019-03-24 19:58:13 +01:00
zadam
3311c6336c exposed searchForNotes to backend script API 2019-03-20 22:51:13 +01:00
zadam
fc13e1fa6a added possibility to search by attached script returning note ids + some refactorings 2019-03-20 22:28:54 +01:00
zadam
9ca680f842 handle empty search note 2019-03-20 21:01:00 +01:00
zadam
616829464f refactoring of context menu items, got rid of ContextMenuItemsContainer 2019-03-19 22:56:37 +01:00
zadam
0267468cd5 deleting without reloading the whole tree (at least on frontend) 2019-03-18 23:03:41 +01:00
zadam
ca0d17d93a cloning is now done without reloading the whole tree 2019-03-18 22:33:19 +01:00
zadam
3f656ea76f refactoring and fix icon assignment 2019-03-18 22:10:10 +01:00
zadam
1faf2c6ecd fixes for some note moving edge cases, closes #454 2019-03-18 21:59:53 +01:00
zadam
33f2aaa650 note type context submenu now works end to end 2019-03-17 12:19:23 +01:00
zadam
177caec011 note type context submenu WIP 2019-03-17 11:38:27 +01:00
zadam
62650a4545 refactoring of router search code into service 2019-03-16 22:19:01 +01:00
zadam
81dc907afc ordering of search results 2019-03-16 20:52:21 +01:00
zadam
3ee33e1024 refactoring of joins for search 2019-03-16 19:57:39 +01:00
zadam
2326eb85f1 filter reimplementation, WIP 2019-03-16 16:52:58 +01:00
zadam
0885e60b80 removed obsolete isoDateXXX API methods 2019-03-14 20:49:10 +01:00
zadam
ef40c66344 renamed currentNote to activeNote to be consistent with frontend API 2019-03-14 20:21:27 +01:00
zadam
0d0464549f notes are now created with correct local dates 2019-03-13 22:43:59 +01:00
zadam
b68b0fe783 Merge branch 'master' into dev31 2019-03-13 21:53:41 +01:00
zadam
b4c6d9f800 using now session cookies to store protectedSessionId 2019-03-13 21:53:09 +01:00
zadam
24c8b39d8e release 0.30.5 2019-03-12 22:21:35 +01:00
zadam
0144dc12df current note as in note loaded into right pane is now called "active note" in frontend API 2019-03-12 21:52:19 +01:00
zadam
65684550a8 updated API docs 2019-03-12 21:42:27 +01:00
zadam
6d09931a39 add getCurrentNote() frontend API, #444 2019-03-12 21:39:35 +01:00
zadam
1c41d459f0 renamed dates in code as well 2019-03-12 20:58:31 +01:00
zadam
f65fefe7b1 migration utc dates 2019-03-11 22:58:44 +01:00
zadam
0a906b5663 updated db schema 2019-03-11 20:36:19 +01:00
zadam
dd9b7bbbb5 fix fulltext search 2019-03-11 19:50:13 +01:00
zadam
d25a1e3ed9 initial work on note fulltext (schema changes, updating...) 2019-03-10 17:02:23 +01:00
zadam
05374becfd Merge branch 'master' into dev31 2019-03-10 10:11:01 +01:00
zadam
37d2a7939c fix background/border on quick help dialog, closes #440 2019-03-09 18:57:21 +01:00
zadam
a432ad7483 fix isProtected consistency for images and files + related consistency check 2019-03-08 22:25:12 +01:00
zadam
ae17e4dc60 release 0.30.4 2019-03-07 22:40:05 +01:00
zadam
02eddc347a fix export of protected notes to tar archive, fixes #432 2019-03-07 22:00:23 +01:00
zadam
ee58bf3d5c fix bundle execution error handling 2019-03-07 20:51:55 +01:00
zadam
ecbaffa5f3 return focus back to note detail after quitting add link dialog 2019-03-07 20:45:32 +01:00
zadam
fe86c09f22 make sure date label is always created with YYYY-MM-DD and not the rest of date time 2019-03-05 20:49:39 +01:00
zadam
c8e01d6cce pretty print JSON into note content 2019-03-05 20:44:50 +01:00
zadam
fd0bd5dd00 small fixes 2019-03-05 20:38:31 +01:00
zadam
cd6d4fb527 Merge pull request #420 from jkurei/master
Querying by dateCreated and dateModified virtual attributes
2019-03-05 19:47:17 +01:00
zadam
8ed6851e85 fix image upload for ckeditor v12 2019-03-04 22:58:47 +01:00
zadam
a6fd3bfb00 placeholder for note content 2019-03-04 22:39:44 +01:00
zadam
610dd8a783 upgrade to ckeditor 12.0.0 2019-03-04 22:36:46 +01:00
zadam
7c404f03db unused param 2019-03-04 22:18:27 +01:00
zadam
ed1cf6aad5 fix passing of startNote and originEntity to backend script API 2019-03-04 21:17:34 +01:00
zadam
9703fd61e2 protected note's shield background now looks better on the dark themes 2019-03-04 20:53:57 +01:00
zadam
16790e388b recent changes should show titles of protected notes correctly when in protected session 2019-03-04 20:44:20 +01:00
zadam
b48474998b release 0.30.3-beta 2019-03-03 20:47:50 +01:00
zadam
95d8f07458 debugging info for image shrinking 2019-03-03 20:41:03 +01:00
zadam
e628c30c89 fix OPML export to include correct OPML version 2019-03-03 19:43:30 +01:00
zadam
52a8aae74f moved test enex files to separate repo 2019-03-03 19:40:47 +01:00
zadam
54b5898582 detect mime types from the filename instead of relying on upload mime type 2019-03-03 00:25:31 +01:00
zadam
64974d75d5 added sync fill for note_contents 2019-03-02 19:59:32 +01:00
zadam
bd118027fb note content is also part of hash check 2019-03-02 12:40:46 +01:00
zadam
36de217835 release 0.30.2-beta 2019-02-28 22:33:33 +01:00
zadam
b5283d58bb nicer underlining under tooltip items 2019-02-28 22:32:54 +01:00
zadam
8414d97ffa improve logging a little bit 2019-02-27 22:15:52 +01:00
zadam
9f30d4e673 fix image caption editing (#422) 2019-02-26 22:59:38 +01:00
zadam
8e0d1fa0df better contrast of links on the dark theme 2019-02-26 22:51:33 +01:00
zadam
5b251b9977 added drag & drop files on note detail 2019-02-26 21:37:15 +01:00
zadam
8b3e721028 added "explodeArchives" option to the import dialog 2019-02-25 22:38:48 +01:00
zadam
7e2a2baa5d drag & drop now uses import code 2019-02-25 22:28:15 +01:00
zadam
003eed368b unify markdown mime to text/x-markdown 2019-02-25 21:57:11 +01:00
zadam
4b1cf05c0e import images 2019-02-25 21:22:57 +01:00
zadam
d9429c4f4b import plain text file as text/html 2019-02-24 13:10:47 +01:00
zadam
b7bd94b6b0 switchable image shrinking 2019-02-24 12:25:34 +01:00
zadam
51bbc10744 switchable image shrinking 2019-02-24 12:24:28 +01:00
zadam
fb5df33ee7 new import options in the dialog, tooltips 2019-02-24 11:36:01 +01:00
zadam
d8ba0ccd7d use formdata to pass text arguments during import instead of request path 2019-02-24 09:56:00 +01:00
zadam
886ea6c68c allow import of multiple files at the same time 2019-02-24 09:34:50 +01:00
jkurei
ec384fafce Querying by dateCreated and dateModified virtual attributes 2019-02-24 01:34:23 +01:00
zadam
936f85c09e drag & drop multi file upload to note tree 2019-02-23 20:33:27 +01:00
zadam
b25deea21d fixes for relative paths 2019-02-22 23:03:20 +01:00
zadam
cf5ec44303 another fix for debian package upload 2019-02-20 23:22:04 +01:00
zadam
6f956c2415 release 0.30.1-beta 2019-02-20 23:08:36 +01:00
zadam
3533160bef fix initial document setup 2019-02-20 23:07:57 +01:00
zadam
60cbfdcabd update API docs 2019-02-20 22:24:51 +01:00
zadam
604f036a54 fix debian package upload 2019-02-20 22:10:19 +01:00
zadam
dd4f3ec264 release 0.30.0-beta 2019-02-20 21:58:31 +01:00
zadam
ff67b8a0ba initial debian package support 2019-02-20 21:58:23 +01:00
zadam
1d5fb0b646 add possibility to create week note, closes #416 2019-02-19 22:49:57 +01:00
zadam
80931a318f exposing APIs to get month and year note, #416 2019-02-19 21:29:41 +01:00
zadam
16f16cb36a fixed API for Trilium Sender, closes #415 2019-02-19 21:24:35 +01:00
zadam
899f24cde5 minor node upgrades 2019-02-17 22:56:33 +01:00
zadam
9f29521ab8 disable caching of note autocomplete for more accurate results 2019-02-17 20:59:52 +01:00
zadam
c1ce0c6b22 avoid various HTTP server issues with slashes by putting notePath into the body with POST 2019-02-17 20:49:51 +01:00
zadam
a7fce33750 OPML v2 export 2019-02-16 23:58:42 +01:00
zadam
6fd8e73150 UI for export of OPML v2, WIP 2019-02-16 23:33:40 +01:00
zadam
1359dd86c2 OPML 2 import, closes #298, #286 2019-02-16 22:13:29 +01:00
zadam
a1b610fc50 full screen help dialog 2019-02-16 19:42:58 +01:00
zadam
c849d719e9 styling for external links 2019-02-16 18:49:57 +01:00
zadam
96de2e7008 fixed saved search 2019-02-15 21:21:26 +01:00
zadam
f140b77e7c fix migration script 2019-02-15 21:10:00 +01:00
zadam
22228de63b sync changes for note content 2019-02-15 00:15:09 +01:00
zadam
b0596c9eb2 removed noteId display in the note detail, #408 2019-02-14 20:57:56 +01:00
zadam
2a2319d434 created note info dialog, closes #408 2019-02-14 20:56:33 +01:00
zadam
dad47d115f fixes for SQL console schema view 2019-02-13 23:27:00 +01:00
zadam
502026359c help page, closes #273 2019-02-13 23:06:11 +01:00
zadam
47b0e4e4d3 Save electron window size and position, closes #186 2019-02-12 22:42:40 +01:00
zadam
6c927d9159 Merge remote-tracking branch 'origin/note-content' 2019-02-12 21:14:42 +01:00
zadam
ddc79b2517 release 0.29.1 2019-02-12 20:30:07 +01:00
zadam
4c2e12d2cb upgrade to bootstrap 4.3.0 2019-02-12 20:26:28 +01:00
zadam
14f7a8b7b9 safe import implementation 2019-02-11 23:45:58 +01:00
zadam
caa7dd9619 prettier progress count 2019-02-10 22:56:14 +01:00
zadam
8aa7e2d0a0 fixes in opml export and note content loading 2019-02-10 22:45:44 +01:00
zadam
6be8a3f343 added progress also to export 2019-02-10 22:30:55 +01:00
zadam
a097cefba7 import error handling 2019-02-10 19:53:57 +01:00
zadam
e4c78f3887 added ImportContext 2019-02-10 19:36:03 +01:00
zadam
5baa251944 more changes to import reporting through WS 2019-02-10 16:59:50 +01:00
zadam
cde68abec9 progress of tar import through WS 2019-02-10 16:36:25 +01:00
zadam
51175e3676 import/export refactorign 2019-02-10 15:33:56 +01:00
zadam
45ddfef30a new import dialog 2019-02-10 14:33:13 +01:00
zadam
1e1d78999e some help dialog content 2019-02-10 12:19:48 +01:00
zadam
92fcd7b345 sql console added to global menu and now has schema info 2019-02-10 10:38:18 +01:00
zadam
e04f1cd574 help button with no help dialog yet 2019-02-09 19:48:19 +01:00
zadam
176c3a5d51 added dev tools to global menu 2019-02-09 19:25:55 +01:00
zadam
c09570cf39 global menu 2019-02-09 19:17:16 +01:00
zadam
4a093000be note content refactoring, WIP 2019-02-08 21:01:26 +01:00
zadam
6952b643ae note content refactoring, WIP 2019-02-07 22:16:40 +01:00
zadam
c487a95bc7 note content refactoring, WIP 2019-02-06 21:29:23 +01:00
zadam
8884177d9f split out note's content into separate entity, WIP 2019-02-06 20:19:25 +01:00
zadam
8b250ed523 fix upload of the same file in succession, #388 2019-02-03 17:44:06 +01:00
zadam
d8b78d8025 check reference issues only for non deleted entities 2019-02-03 16:27:26 +01:00
zadam
42112b8053 fix consistency check 2019-02-03 16:22:45 +01:00
zadam
6cc0dd5a80 release 0.29.0-beta 2019-02-03 15:44:19 +01:00
zadam
afd5f4823f added Steel Blue theme to demo document 2019-02-03 15:39:27 +01:00
zadam
b0cf82c91b fix 2019-02-03 15:37:01 +01:00
zadam
6a67cdd5af appThemeClass is redundant 2019-02-03 15:35:37 +01:00
zadam
bad7b84993 error handling in custom request handler 2019-02-03 11:15:32 +01:00
zadam
d3ca6b5ae6 styling for scrollbar which looks ugly otherwise in dark themes 2019-02-03 10:21:28 +01:00
zadam
da5009f089 main border color CSS variable 2019-02-03 10:09:59 +01:00
zadam
c08524c977 fix CSS class of user theme 2019-02-03 00:12:57 +01:00
zadam
f89537037e small styling fixes 2019-02-02 23:51:00 +01:00
zadam
c153793766 added CSS variable for disabled button background 2019-02-02 23:26:39 +01:00
zadam
0aec5927d5 added missing labels customRequestHandler, customResourceProvider to autocomplete 2019-02-02 22:33:02 +01:00
zadam
8aea9a1801 added font family CSS variables to theming API 2019-02-02 20:45:38 +01:00
zadam
73247e3220 minor library updates 2019-02-02 19:21:30 +01:00
zadam
89344a6eda final fixes and refactorings for consistency checks 2019-02-02 12:41:20 +01:00
zadam
40d2e6ea83 refactoring consistency checks WIP 2019-02-02 11:26:27 +01:00
zadam
910cfe9a17 refactoring consistency checks WIP 2019-02-02 10:38:33 +01:00
zadam
e58a80fc00 consistency checks WIP 2019-02-02 09:26:57 +01:00
zadam
4a2319cb33 refactoring of consistency checks plus some autofixers 2019-02-01 22:48:51 +01:00
zadam
5619088c41 raise payload size limit to 500 MB #395 2019-01-29 21:19:08 +01:00
zadam
60271993eb Merge pull request #392 from jkurei/ios_favicon
Better icon for iOS' homescreen
2019-01-28 23:01:12 +01:00
jkurei
6695e8b011 Better icon for iOS' homescreen 2019-01-28 22:48:01 +01:00
zadam
707df18b93 added type and mime classes on body as well #383 2019-01-28 21:42:37 +01:00
zadam
90895f1288 added noteId to file view 2019-01-27 23:10:37 +01:00
zadam
ba1ca506af change in referencing CSS resources to allow easier relative linking 2019-01-27 22:34:41 +01:00
zadam
f90ed99a40 fix leaf node having angle bracket in dark & black themes, closes #387 2019-01-27 21:54:24 +01:00
zadam
67630b1a22 options now allow selecting user theme 2019-01-27 21:18:11 +01:00
zadam
2c1580ea65 appCss/appTheme are now loaded as external CSS files instead of inline styles 2019-01-27 17:01:37 +01:00
zadam
840a0b5f64 custom handler refactoring 2019-01-27 16:37:18 +01:00
zadam
b39f6ef7ad bug fixes for custom handlers 2019-01-27 15:47:40 +01:00
zadam
fb27088fcd smaller children overview font 2019-01-27 14:26:39 +01:00
azivner
76fbff68ba added readOnly attribute which puts text editor into readonly mode #371 2019-01-27 13:10:03 +01:00
azivner
54de4d236d custom HTTP handler which triggers associated script notes WIP, #356 2019-01-27 12:28:20 +01:00
azivner
e211dd65ad exit on detection of not supported node version, #324 2019-01-26 19:59:51 +01:00
azivner
a87f4d8653 search can be triggered from URL, closes #385 2019-01-25 22:18:34 +01:00
azivner
b59c175c2e add HTML header with UTF-8 meta encoding declaration to exported HTML files, fixes #384 2019-01-25 21:34:14 +01:00
azivner
580104c4c5 using trilium's confirm dialog, small refactoring 2019-01-24 22:18:31 +01:00
zadam
0fc3053b0a Merge pull request #377 from flurmbo/master
add confirm type change dialog when note not empty
2019-01-24 22:12:09 +01:00
Phil Marshall
929e0f69c2 add confirm type change dialog when note not empty 2019-01-23 15:15:24 -06:00
azivner
e70af1300a drag and drop moves multiple items only if CTRL is pressed, active note has now bold text for more differentiation from selected note 2019-01-23 21:13:04 +01:00
azivner
4d0e46021b Mac uses CMD+Left, CMD+Right for history navigation, closes #376 2019-01-23 20:15:33 +01:00
azivner
1a9a49b739 release 0.28.3 2019-01-22 23:01:32 +01:00
azivner
2ac560c56e text note should change its icon after having new note inserted into, fixes #361 2019-01-22 21:21:44 +01:00
azivner
c23387c0fb make search dialog more responsive in narrow sidebar, fixes #367 2019-01-22 20:54:00 +01:00
azivner
0ff250fe15 font sizes were not created for new documents - fix plus migration for existing ones 2019-01-22 20:34:45 +01:00
azivner
52b1e58b26 make tree selection more visually consistent 2019-01-22 20:23:54 +01:00
azivner
484715e440 fix icon in desktop linux build, fixes #372 2019-01-22 19:49:33 +01:00
azivner
9d42c3d802 release 0.28.2 2019-01-21 22:55:12 +01:00
azivner
c654172d33 auto fixer for "undeleted branch of deleted note" consistency check 2019-01-21 22:51:49 +01:00
azivner
e17b26c883 revert consistency checks refactoring for now 2019-01-21 22:46:27 +01:00
azivner
24d02d9cf5 fix in task manager script to not error out so much on deletion 2019-01-21 22:05:37 +01:00
azivner
7208a311ac check that note is not deleted before creating a branch 2019-01-21 21:55:40 +01:00
azivner
ad7355372b issue template 2019-01-21 19:55:07 +01:00
azivner
f18b5babad uncommented issue template 2019-01-20 16:47:49 +01:00
azivner
9831ec0ca9 added issue template 2019-01-20 16:46:56 +01:00
azivner
596544eca3 fix setNoteToParent API method, closes #360 2019-01-20 16:33:09 +01:00
azivner
1f853024ee more autofixers WIP 2019-01-19 09:57:51 +01:00
azivner
0308b13460 expose app info on the backend script api #345 2019-01-18 23:57:08 +01:00
azivner
06b8a82f70 refactoring of consistency checks + some auto fixers 2019-01-18 19:32:59 +01:00
azivner
91ca07929d before we clone the note we must make sure it's not deleted 2019-01-17 23:24:59 +01:00
azivner
afabaa5fdb workaround for hidden last line on mobile 2019-01-17 21:13:53 +01:00
azivner
a6fd3fa77c release 0.28.1-beta 2019-01-17 00:03:17 +01:00
azivner
58a2c08dcd release 0.28.1-beta 2019-01-16 23:58:10 +01:00
azivner
299bbff2f4 fix too large font on mobile 2019-01-16 23:57:09 +01:00
azivner
19d8947123 runOnNoteChange fires also on the frontend, closes #340 2019-01-16 22:52:32 +01:00
azivner
35edce7523 fix crazy clipboard operation on mac setup, closes #348 2019-01-16 22:03:30 +01:00
azivner
bc4cec69a5 use local dates to create day notes, closes #337 2019-01-15 23:46:01 +01:00
azivner
cce8c1b674 create top level note and collapse tree now work relative to hoisted note, closes #343 2019-01-15 20:30:54 +01:00
azivner
aa58788769 added basic DB size diagnostic log 2019-01-15 20:00:24 +01:00
azivner
6c62ab7a52 removing logging params for slow queries 2019-01-15 19:36:04 +01:00
azivner
d6ab638b30 fix file names in github release script 2019-01-15 00:10:47 +01:00
azivner
bd4db406de release 0.28.0-beta 2019-01-14 23:51:55 +01:00
azivner
e50f9cd0a3 fix device detection in setup 2019-01-14 23:50:45 +01:00
azivner
2b64cbce2c added dark theme (to have same set of themes as before) 2019-01-13 23:25:30 +01:00
azivner
2797c942ab changes to options dialog to allow configuring font size, closes #326 2019-01-13 22:03:06 +01:00
azivner
f1c3278874 store font size in options #326 2019-01-13 21:27:32 +01:00
azivner
424c22dcde split UI to 3 different font sizes #326 2019-01-13 21:16:51 +01:00
azivner
5c223dfd12 all fonts are relative so it's easier to scale them properly 2019-01-13 21:04:08 +01:00
azivner
6a3e7a5a8e generate css classes for each mime type, #328 2019-01-13 20:14:33 +01:00
azivner
f88cdac000 fixes for black theme for relation map and code notes 2019-01-13 20:03:28 +01:00
azivner
eeead90f32 improved theme support using CSS variables, #328 2019-01-13 18:57:46 +01:00
azivner
b607857409 fix weight tracker demo to use relations instead of hardcoded noteId, fixes #329 2019-01-13 12:21:17 +01:00
azivner
9268f88bc3 frontend scripts now have startNote, currentNote and targetNote as NoteShort entities which e.g. provides easy access to relations/labels 2019-01-13 12:16:05 +01:00
azivner
f7f0560a9f simplification of script bundles on backend 2019-01-13 11:56:50 +01:00
azivner
3d8905207e fixed export with non-ASCII characters in note title, fixes #285, #331 2019-01-13 10:22:17 +01:00
azivner
dbc312010b update fancytree to 2.30.2 2019-01-13 09:24:00 +01:00
azivner
b115a7cf19 delete note through its entity instead of manually with SQL, closes #303 2019-01-13 00:24:51 +01:00
azivner
348562352c fixes in ASAR build and zipping 2019-01-12 19:48:45 +01:00
azivner
70fd917e7c build desktop versions into ASAR, closes #271 2019-01-12 00:05:13 +01:00
zadam
d2b60764cd Merge pull request #289 from perissology/electron-builder
use electron-builder for dev install
2019-01-11 23:54:11 +01:00
azivner
581b1fdaa5 trigger runOnAttributeChange, runOnNoteChange on entity deletions as well 2019-01-11 23:43:22 +01:00
azivner
3c19a712c0 active protected state button has darker background and is disabled 2019-01-11 23:29:56 +01:00
azivner
cc27f16088 store iv directly in the respective columns 2019-01-11 23:04:51 +01:00
azivner
dffdb82288 after creating new note, it is focused and now also selected so renaming is super easy, #318 2019-01-10 22:46:08 +01:00
azivner
2b32addade release 0.27.4 2019-01-10 21:31:30 +01:00
azivner
0b251530fa open recent notes autocomplete by focus so it is then closed with blur, fixes #272 2019-01-10 21:04:06 +01:00
azivner
f5b933149a Merge remote-tracking branch 'origin/master' 2019-01-10 19:53:47 +01:00
azivner
48bbfb8bdb fix activating note by noteId when hoisting, fixes #320 2019-01-10 19:53:42 +01:00
zadam
889971c4d6 Merge pull request #312 from perissology/evernote-import
Fixes evernote import errors
2019-01-09 23:41:17 +01:00
azivner
0722494d41 fix saving JSON note with invalid JSON (previously in such a case content was not updated), fixes #307 2019-01-09 23:36:17 +01:00
azivner
4b977a3306 setup keyboard shortcuts on the setup page as well, closes #267 2019-01-09 22:08:24 +01:00
azivner
3ff3021acd shortcuts for mac should use cmd instead of ctrl, closes #290 2019-01-09 21:42:16 +01:00
azivner
99e56a9c42 make sure to save the search note before refreshing the tree 2019-01-09 19:54:32 +01:00
azivner
77279dfe16 fix anonymization 2019-01-09 19:49:02 +01:00
perissology
93f8050454 use resizedImage if image optimization fails 2019-01-09 06:29:49 -08:00
perissology
31cfede7a7 enex import: attempt to get correct mime from Buffer 2019-01-09 06:29:13 -08:00
azivner
c8ec86e537 allow refreshing saved note, closes #304 2019-01-08 23:32:03 +01:00
azivner
05aee884b6 fix saving search note content #304 2019-01-08 22:48:53 +01:00
azivner
012ba9e060 don't attempt to run protected notes outside of protected session, fixes #279 2019-01-08 21:21:49 +01:00
azivner
8e8fd88857 process only whitelisted mime types as an image, fixes #288 2019-01-08 20:45:34 +01:00
azivner
523ccdad6b reload note cache after import, closes #293 2019-01-08 20:19:41 +01:00
azivner
ded3f605be fix almost invisible buttons on options page, closes #297 2019-01-08 19:47:35 +01:00
perissology
62b44e3549 use electron-builder for npm install
This will build deps as required for electron as well as the os.

This fixes the missing binding error for sqlite3 when trying to run the
electron app after a fresh npm i
2019-01-08 06:50:48 -08:00
azivner
030d12a465 stretch sync login token validity to 5 minutes #277 2019-01-07 23:29:56 +01:00
azivner
4d15628840 Merge remote-tracking branch 'origin/master' 2019-01-07 23:17:45 +01:00
azivner
81b849898c stretch body to full window width, fixes #276 2019-01-07 23:17:12 +01:00
zadam
3824486b85 Merge pull request #275 from Lee303/Dockerfile-dependency-fix
Update Dockerfile
2019-01-07 22:49:27 +01:00
Lee Spottiswood
081ab00a0a Update Dockerfile 2019-01-07 21:21:23 +00:00
zadam
04f6af5c9a Merge pull request #270 from svenefftinge/master
Make contributions easier
2019-01-07 21:46:02 +01:00
Sven Efftinge
4dc1f1f6eb Added contribute section and gitpod config 2019-01-07 12:52:02 +00:00
azivner
3930a02123 tree now uses standard font size which effectively makes it a bit larger 2019-01-06 20:59:19 +01:00
azivner
3112de105e fancytree selection/hover colors are shades of gray, border is rounded 2019-01-06 18:58:12 +01:00
azivner
3b8d7b8fba release 0.27.3 2019-01-05 22:48:11 +01:00
azivner
9fca7f09a5 link to mobile frontend 2019-01-05 22:45:18 +01:00
azivner
fd39d6b3a9 using btn-secondary instead of btn-default since that doesn't exist in BS4 2019-01-05 21:51:27 +01:00
azivner
a103886ea5 responsive setup page 2019-01-05 21:49:40 +01:00
azivner
373408e401 fix Branch reference to parent note id after parent change 2019-01-05 19:25:22 +01:00
azivner
db44c1d8e6 border color tweaks 2019-01-05 11:49:17 +01:00
azivner
95a34c9e2d small tweaks of icon alignment 2019-01-05 11:41:09 +01:00
azivner
6ce401f260 release 0.27.2-beta 2019-01-04 23:33:32 +01:00
azivner
5d74dcd256 package-lock 2019-01-04 23:33:30 +01:00
azivner
5a9fc1697b electron 4.0.1 2019-01-04 23:32:14 +01:00
azivner
927415838c using enhanceTitle event instead of renderNode per https://github.com/mar10/fancytree/issues/927 2019-01-04 20:18:07 +01:00
azivner
d72fcefdc7 fix sync of deleted notes 2019-01-04 20:10:16 +01:00
azivner
0be173a8f7 lower lastSyncedPull if server max sync ID is lower 2019-01-04 18:58:46 +01:00
azivner
c3913a8735 updating the note cache after sync 2019-01-03 23:27:10 +01:00
azivner
e2dfe1b6de fixed setup page issues which caused wrong choice to be used in the wizard 2019-01-03 22:32:36 +01:00
azivner
fec3e47eb8 serialize binary note content into base64, incremented sync version 2019-01-03 22:13:58 +01:00
azivner
d72efd2450 removed unnecessary logging of data dir which is now logged as part of app info 2019-01-03 21:46:32 +01:00
azivner
ef1c840aa7 tiny fixes 2019-01-02 22:36:06 +01:00
azivner
1581464d8c fix layout - promoted attributes should never grow beyond its content 2019-01-02 20:21:34 +01:00
azivner
9de29584a4 added data directory to options -> about 2019-01-02 20:08:41 +01:00
azivner
9e2e6fb50c fixed glitch where "unhoist" button disappears after renaming the hoisted note 2019-01-02 19:26:01 +01:00
azivner
c85979b66b it should not be possible to add note after hoisted note 2019-01-02 18:59:08 +01:00
azivner
ecdc5865a6 release 0.27.1-beta 2019-01-01 20:54:23 +01:00
azivner
1771ddb787 responsive promoted attributes view and attribute overview to make sure note content is always visible. Fixes #262 2019-01-01 20:53:18 +01:00
azivner
3ab657fe46 created concept of "detail loaded listeners" which allow scripts to execute some action after the note detail has been loaded 2019-01-01 19:32:34 +01:00
azivner
8785dae753 force reload fancytree node when child is not found 2019-01-01 18:27:36 +01:00
azivner
2f1c5b29d4 update eslint 2019-01-01 18:06:52 +01:00
azivner
7135349a10 allow deleting protected notes outside of protected session 2019-01-01 17:04:21 +01:00
azivner
66c639d5e3 frontend API addition to protect current note 2019-01-01 15:39:13 +01:00
azivner
6704b755d8 attribute overview shows only owned attributes 2019-01-01 15:29:58 +01:00
azivner
cf96baad48 release 0.27.0-beta 2018-12-30 22:38:11 +01:00
azivner
32220476aa better behavior on default loading detail / switching between tree and detail 2018-12-30 22:36:39 +01:00
azivner
86bc84a2ad better detection of float parameter in label filters, fixes #265 2018-12-30 22:09:14 +01:00
azivner
de9e0c7929 lazy loading icon for both mobile and desktop 2018-12-30 21:13:35 +01:00
azivner
6963e662ef fix layout on chrome 2018-12-30 19:15:44 +01:00
azivner
7127822e8f placeholder for empty note content 2018-12-30 19:02:42 +01:00
azivner
0a35abf68f refresh note detail view after attribute save (from full dialog, not promoted notes), closes #261 2018-12-30 15:21:53 +01:00
azivner
3f8e8f8561 fix saving branch prefix, fixes #260 2018-12-29 10:35:44 +01:00
azivner
e02eca87b0 dont toggle panes note on the first load 2018-12-29 10:19:28 +01:00
azivner
2f680c4326 tweaks, fixes, refactorings, creating new note from detail, not tree 2018-12-29 10:04:59 +01:00
azivner
0b4a44a403 layout tweaks etc. 2018-12-29 09:13:52 +01:00
azivner
89299f865c api method to detect navigation away from current page 2018-12-29 08:40:35 +01:00
azivner
f6db9a50ab "switch to desktop version" button 2018-12-29 00:09:16 +01:00
azivner
78d9fac1e6 global actions context menu, logout 2018-12-28 23:57:11 +01:00
azivner
458ed1faff mobile detection 2018-12-28 23:47:06 +01:00
azivner
0657815de5 Merge branch 'master' into mobile 2018-12-28 22:31:51 +01:00
azivner
a608832681 change to relation map note type doesn't trigger content change, related issue #258 2018-12-28 22:31:06 +01:00
azivner
d2f72529b3 context menu with delete 2018-12-28 22:05:04 +01:00
azivner
28185af158 fix layout/scrolling issues in the tree 2018-12-28 20:36:18 +01:00
azivner
7aacd01ad7 separate css layout file for mobile and desktop 2018-12-28 19:47:02 +01:00
azivner
74cc34696e unifying expander icons in both desktop and mobile 2018-12-27 22:38:19 +01:00
azivner
d4baac0bb5 mobile fixes 2018-12-27 22:36:11 +01:00
azivner
35bc1421f1 cannot edit note title when not in protected session 2018-12-27 20:22:33 +01:00
azivner
d4db265fd9 non-modal protected session password form is now done separately as a kind of detail component. Also reworked branch prefix dialog input 2018-12-27 20:04:59 +01:00
azivner
1dad919de9 working protected session in mobile 2018-12-25 10:58:40 +01:00
azivner
246dfbdcb4 fix attribute loading for mobile 2018-12-24 23:08:43 +01:00
azivner
f8d32d64f5 content scrolling 2018-12-24 22:39:17 +01:00
azivner
5dea271d6f basic responsive layout 2018-12-24 20:38:38 +01:00
azivner
eeb62a6cf2 fix keyboard shortcut setup on mobile 2018-12-24 18:39:31 +01:00
azivner
35cf8026b0 activating note opens dialog with its detail 2018-12-24 12:49:27 +01:00
azivner
e0028ab6f1 mobile frontend WIP, removing extra dependencies 2018-12-24 10:10:36 +01:00
azivner
a32645cdeb fix scrolling to the top of detail after switching note 2018-12-24 09:47:00 +01:00
azivner
812f9f6fca initial work on mobile frontend 2018-12-23 22:28:57 +01:00
azivner
f7a670ec24 responsive login page 2018-12-23 11:06:11 +01:00
azivner
d0d24f0f4a unify ejs indentation to 4 spaces 2018-12-23 10:57:40 +01:00
azivner
042f9b7f2d fix positioning of protected session password dialog 2018-12-22 23:54:06 +01:00
azivner
2d260cdbed explicit node-abi required for 4.0.0 electron build 2018-12-22 23:10:03 +01:00
azivner
6a786cad83 updated API docs 2018-12-22 22:28:49 +01:00
azivner
67019b3d6c added attributes to frontend entity model 2018-12-22 22:16:32 +01:00
azivner
1db6e59077 tooltip related changes for scripting support 2018-12-22 20:57:09 +01:00
azivner
5e4770875e upgrade to bootstrap 4.2.1 2018-12-22 10:33:50 +01:00
azivner
e9a77f3f16 image sync fixes and 4.0.0 electron 2018-12-22 09:54:09 +01:00
azivner
cbec85f295 release 0.26.1 2018-12-20 19:54:09 +01:00
azivner
14bd5d301d fix broken image sync 2018-12-20 19:51:03 +01:00
azivner
321d0e8d64 explicit error handler for connection errors 2018-12-19 21:29:35 +01:00
azivner
84e1512031 added robots.txt to public root 2018-12-19 20:56:10 +01:00
881 changed files with 113186 additions and 97463 deletions

3
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,3 @@
# These are supported funding model platforms
github: [zadam]

2
.gitignore vendored
View File

@@ -1,9 +1,11 @@
.DS_Store
node_modules/
dist/
src/public/app-dist/
npm-debug.log
yarn-error.log
*.db
config.ini
cert.key
cert.crt
server-package.json

15
.gitpod.dockerfile Normal file
View File

@@ -0,0 +1,15 @@
FROM gitpod/workspace-full
RUN sudo apt-get update \
&& sudo apt-get install -yq --no-install-recommends \
libpng16-16 \
libpng-dev \
pkg-config \
autoconf \
libtool \
build-essential \
nasm \
libx11-dev \
libxkbfile-dev \
&& sudo rm -rf /var/lib/apt/lists/*

11
.gitpod.yml Normal file
View File

@@ -0,0 +1,11 @@
image:
file: .gitpod.dockerfile
tasks:
- before: nvm install 10 && nvm use 10
init: npm install
command: npm run start-server
ports:
- port: 8080
onOpen: open-preview

6
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,6 @@
# Default ignored files
/workspace.xml
# Datasource local storage ignored files
/dataSources.local.xml
/dataSources/

View File

@@ -6,5 +6,8 @@
<option name="TAB_SIZE" value="2" />
</value>
</option>
<JSCodeStyleSettings version="0">
<option name="USE_EXPLICIT_JS_EXTENSION" value="TRUE" />
</JSCodeStyleSettings>
</code_scheme>
</component>

5
.idea/dataSources.xml generated
View File

@@ -1,14 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="document.db" uuid="a2c75661-f9e2-478f-a69f-6a9409e69997">
<data-source source="LOCAL" name="SQLite - document.db" uuid="d0fd879f-1e1d-4d5c-9c21-0e5cf9ab2976">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/../trilium-data/document.db</jdbc-url>
<driver-properties>
<property name="enable_load_extension" value="true" />
</driver-properties>
</data-source>
</component>
</project>

View File

@@ -1,603 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<dataSource name="document.db">
<database-model serializer="dbm" dbms="SQLITE" family-id="SQLITE" format-version="4.14">
<root id="1">
<ServerVersion>3.16.1</ServerVersion>
</root>
<schema id="2" parent="1" name="main">
<Current>1</Current>
<Visible>1</Visible>
</schema>
<collation id="3" parent="1" name="BINARY"/>
<collation id="4" parent="1" name="NOCASE"/>
<collation id="5" parent="1" name="RTRIM"/>
<table id="6" parent="2" name="api_tokens"/>
<table id="7" parent="2" name="attributes"/>
<table id="8" parent="2" name="branches"/>
<table id="9" parent="2" name="event_log"/>
<table id="10" parent="2" name="links"/>
<table id="11" parent="2" name="note_revisions"/>
<table id="12" parent="2" name="notes"/>
<table id="13" parent="2" name="options"/>
<table id="14" parent="2" name="recent_notes"/>
<table id="15" parent="2" name="source_ids"/>
<table id="16" parent="2" name="sqlite_master">
<System>1</System>
</table>
<table id="17" parent="2" name="sqlite_sequence">
<System>1</System>
</table>
<table id="18" parent="2" name="sync"/>
<column id="19" parent="6" name="apiTokenId">
<Position>1</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="20" parent="6" name="token">
<Position>2</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="21" parent="6" name="dateCreated">
<Position>3</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="22" parent="6" name="isDeleted">
<Position>4</Position>
<DataType>INT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>0</DefaultExpression>
</column>
<column id="23" parent="6" name="hash">
<Position>5</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&quot;&quot;</DefaultExpression>
</column>
<index id="24" parent="6" name="sqlite_autoindex_api_tokens_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>apiTokenId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="25" parent="6">
<ColNames>apiTokenId</ColNames>
<Primary>1</Primary>
<UnderlyingIndexName>sqlite_autoindex_api_tokens_1</UnderlyingIndexName>
</key>
<column id="26" parent="7" name="attributeId">
<Position>1</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="27" parent="7" name="noteId">
<Position>2</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="28" parent="7" name="type">
<Position>3</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="29" parent="7" name="name">
<Position>4</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="30" parent="7" name="value">
<Position>5</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&apos;&apos;</DefaultExpression>
</column>
<column id="31" parent="7" name="position">
<Position>6</Position>
<DataType>INT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>0</DefaultExpression>
</column>
<column id="32" parent="7" name="dateCreated">
<Position>7</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="33" parent="7" name="dateModified">
<Position>8</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="34" parent="7" name="isDeleted">
<Position>9</Position>
<DataType>INT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="35" parent="7" name="hash">
<Position>10</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&quot;&quot;</DefaultExpression>
</column>
<column id="36" parent="7" name="isInheritable">
<Position>11</Position>
<DataType>int|0s</DataType>
<DefaultExpression>0</DefaultExpression>
</column>
<index id="37" parent="7" name="sqlite_autoindex_attributes_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>attributeId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="38" parent="7">
<ColNames>attributeId</ColNames>
<Primary>1</Primary>
<UnderlyingIndexName>sqlite_autoindex_attributes_1</UnderlyingIndexName>
</key>
<column id="39" parent="8" name="branchId">
<Position>1</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="40" parent="8" name="noteId">
<Position>2</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="41" parent="8" name="parentNoteId">
<Position>3</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="42" parent="8" name="notePosition">
<Position>4</Position>
<DataType>INTEGER|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="43" parent="8" name="prefix">
<Position>5</Position>
<DataType>TEXT|0s</DataType>
</column>
<column id="44" parent="8" name="isExpanded">
<Position>6</Position>
<DataType>BOOLEAN|0s</DataType>
</column>
<column id="45" parent="8" name="isDeleted">
<Position>7</Position>
<DataType>INTEGER|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>0</DefaultExpression>
</column>
<column id="46" parent="8" name="dateModified">
<Position>8</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="47" parent="8" name="hash">
<Position>9</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&quot;&quot;</DefaultExpression>
</column>
<column id="48" parent="8" name="dateCreated">
<Position>10</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&apos;1970-01-01T00:00:00.000Z&apos;</DefaultExpression>
</column>
<index id="49" parent="8" name="sqlite_autoindex_branches_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>branchId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<index id="50" parent="8" name="IDX_branches_noteId_parentNoteId">
<ColNames>noteId
parentNoteId</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="51" parent="8" name="IDX_branches_noteId">
<ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="52" parent="8" name="IDX_branches_parentNoteId">
<ColNames>parentNoteId</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<key id="53" parent="8">
<ColNames>branchId</ColNames>
<Primary>1</Primary>
<UnderlyingIndexName>sqlite_autoindex_branches_1</UnderlyingIndexName>
</key>
<column id="54" parent="9" name="eventId">
<Position>1</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="55" parent="9" name="noteId">
<Position>2</Position>
<DataType>TEXT|0s</DataType>
</column>
<column id="56" parent="9" name="comment">
<Position>3</Position>
<DataType>TEXT|0s</DataType>
</column>
<column id="57" parent="9" name="dateCreated">
<Position>4</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<index id="58" parent="9" name="sqlite_autoindex_event_log_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>eventId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="59" parent="9">
<ColNames>eventId</ColNames>
<Primary>1</Primary>
<UnderlyingIndexName>sqlite_autoindex_event_log_1</UnderlyingIndexName>
</key>
<column id="60" parent="10" name="linkId">
<Position>1</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="61" parent="10" name="noteId">
<Position>2</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="62" parent="10" name="targetNoteId">
<Position>3</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="63" parent="10" name="type">
<Position>4</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="64" parent="10" name="isDeleted">
<Position>5</Position>
<DataType>INTEGER|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>0</DefaultExpression>
</column>
<column id="65" parent="10" name="dateCreated">
<Position>6</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="66" parent="10" name="dateModified">
<Position>7</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="67" parent="10" name="hash">
<Position>8</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&quot;&quot;</DefaultExpression>
</column>
<index id="68" parent="10" name="sqlite_autoindex_links_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>linkId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="69" parent="10">
<ColNames>linkId</ColNames>
<Primary>1</Primary>
<UnderlyingIndexName>sqlite_autoindex_links_1</UnderlyingIndexName>
</key>
<column id="70" parent="11" name="noteRevisionId">
<Position>1</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="71" parent="11" name="noteId">
<Position>2</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="72" parent="11" name="title">
<Position>3</Position>
<DataType>TEXT|0s</DataType>
</column>
<column id="73" parent="11" name="content">
<Position>4</Position>
<DataType>TEXT|0s</DataType>
</column>
<column id="74" parent="11" name="isProtected">
<Position>5</Position>
<DataType>INT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>0</DefaultExpression>
</column>
<column id="75" parent="11" name="dateModifiedFrom">
<Position>6</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="76" parent="11" name="dateModifiedTo">
<Position>7</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="77" parent="11" name="type">
<Position>8</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&apos;&apos;</DefaultExpression>
</column>
<column id="78" parent="11" name="mime">
<Position>9</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&apos;&apos;</DefaultExpression>
</column>
<column id="79" parent="11" name="hash">
<Position>10</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&quot;&quot;</DefaultExpression>
</column>
<index id="80" parent="11" name="sqlite_autoindex_note_revisions_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>noteRevisionId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<index id="81" parent="11" name="IDX_note_revisions_noteId">
<ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="82" parent="11" name="IDX_note_revisions_dateModifiedFrom">
<ColNames>dateModifiedFrom</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="83" parent="11" name="IDX_note_revisions_dateModifiedTo">
<ColNames>dateModifiedTo</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<key id="84" parent="11">
<ColNames>noteRevisionId</ColNames>
<Primary>1</Primary>
<UnderlyingIndexName>sqlite_autoindex_note_revisions_1</UnderlyingIndexName>
</key>
<column id="85" parent="12" name="noteId">
<Position>1</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="86" parent="12" name="title">
<Position>2</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&quot;note&quot;</DefaultExpression>
</column>
<column id="87" parent="12" name="content">
<Position>3</Position>
<DataType>TEXT|0s</DataType>
<DefaultExpression>NULL</DefaultExpression>
</column>
<column id="88" parent="12" name="isProtected">
<Position>4</Position>
<DataType>INT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>0</DefaultExpression>
</column>
<column id="89" parent="12" name="type">
<Position>5</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&apos;text&apos;</DefaultExpression>
</column>
<column id="90" parent="12" name="mime">
<Position>6</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&apos;text/html&apos;</DefaultExpression>
</column>
<column id="91" parent="12" name="hash">
<Position>7</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&quot;&quot;</DefaultExpression>
</column>
<column id="92" parent="12" name="isDeleted">
<Position>8</Position>
<DataType>INT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>0</DefaultExpression>
</column>
<column id="93" parent="12" name="dateCreated">
<Position>9</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="94" parent="12" name="dateModified">
<Position>10</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<index id="95" parent="12" name="sqlite_autoindex_notes_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="96" parent="12">
<ColNames>noteId</ColNames>
<Primary>1</Primary>
<UnderlyingIndexName>sqlite_autoindex_notes_1</UnderlyingIndexName>
</key>
<column id="97" parent="13" name="name">
<Position>1</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="98" parent="13" name="value">
<Position>2</Position>
<DataType>TEXT|0s</DataType>
</column>
<column id="99" parent="13" name="dateModified">
<Position>3</Position>
<DataType>INT|0s</DataType>
</column>
<column id="100" parent="13" name="isSynced">
<Position>4</Position>
<DataType>INTEGER|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>0</DefaultExpression>
</column>
<column id="101" parent="13" name="hash">
<Position>5</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&quot;&quot;</DefaultExpression>
</column>
<column id="102" parent="13" name="dateCreated">
<Position>6</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&apos;1970-01-01T00:00:00.000Z&apos;</DefaultExpression>
</column>
<index id="103" parent="13" name="sqlite_autoindex_options_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>name</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="104" parent="13">
<ColNames>name</ColNames>
<Primary>1</Primary>
<UnderlyingIndexName>sqlite_autoindex_options_1</UnderlyingIndexName>
</key>
<column id="105" parent="14" name="branchId">
<Position>1</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="106" parent="14" name="notePath">
<Position>2</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="107" parent="14" name="hash">
<Position>3</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>&quot;&quot;</DefaultExpression>
</column>
<column id="108" parent="14" name="dateCreated">
<Position>4</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="109" parent="14" name="isDeleted">
<Position>5</Position>
<DataType>INT|0s</DataType>
</column>
<index id="110" parent="14" name="sqlite_autoindex_recent_notes_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>branchId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="111" parent="14">
<ColNames>branchId</ColNames>
<Primary>1</Primary>
<UnderlyingIndexName>sqlite_autoindex_recent_notes_1</UnderlyingIndexName>
</key>
<column id="112" parent="15" name="sourceId">
<Position>1</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="113" parent="15" name="dateCreated">
<Position>2</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<index id="114" parent="15" name="sqlite_autoindex_source_ids_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>sourceId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="115" parent="15">
<ColNames>sourceId</ColNames>
<Primary>1</Primary>
<UnderlyingIndexName>sqlite_autoindex_source_ids_1</UnderlyingIndexName>
</key>
<column id="116" parent="16" name="type">
<Position>1</Position>
<DataType>text|0s</DataType>
</column>
<column id="117" parent="16" name="name">
<Position>2</Position>
<DataType>text|0s</DataType>
</column>
<column id="118" parent="16" name="tbl_name">
<Position>3</Position>
<DataType>text|0s</DataType>
</column>
<column id="119" parent="16" name="rootpage">
<Position>4</Position>
<DataType>integer|0s</DataType>
</column>
<column id="120" parent="16" name="sql">
<Position>5</Position>
<DataType>text|0s</DataType>
</column>
<column id="121" parent="17" name="name">
<Position>1</Position>
</column>
<column id="122" parent="17" name="seq">
<Position>2</Position>
</column>
<column id="123" parent="18" name="id">
<Position>1</Position>
<DataType>INTEGER|0s</DataType>
<NotNull>1</NotNull>
<SequenceIdentity>1</SequenceIdentity>
</column>
<column id="124" parent="18" name="entityName">
<Position>2</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="125" parent="18" name="entityId">
<Position>3</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="126" parent="18" name="sourceId">
<Position>4</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="127" parent="18" name="syncDate">
<Position>5</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<index id="128" parent="18" name="IDX_sync_entityName_entityId">
<ColNames>entityName
entityId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<index id="129" parent="18" name="IDX_sync_syncDate">
<ColNames>syncDate</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<key id="130" parent="18">
<ColNames>id</ColNames>
<Primary>1</Primary>
</key>
</database-model>
</dataSource>

View File

@@ -1,2 +0,0 @@
#n:main
!<md> [0, 0, null, null, -2147483648, -2147483648]

View File

@@ -1,6 +1,7 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="JSUnfilteredForInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />

6
.idea/jsLibraryMappings.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<file url="PROJECT" libraries="{@types/jquery}" />
</component>
</project>

1
.idea/vcs.xml generated
View File

@@ -2,5 +2,6 @@
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

View File

@@ -1,11 +1,9 @@
FROM node:10.14.0-alpine
FROM node:12.16.3-alpine
# Create app directory
WORKDIR /usr/src/app
# Copy both package.json and package-lock.json
# where available (npm@5+)
COPY package.json package-lock.json ./
COPY server-package.json package.json
# Install app dependencies
RUN set -x \
@@ -17,6 +15,8 @@ RUN set -x \
libtool \
make \
nasm \
libpng-dev \
python \
&& npm install --production \
&& apk del .build-dependencies

View File

@@ -1,29 +1,31 @@
# Trilium Notes
[![Join the chat at https://gitter.im/trilium-notes/Lobby](https://badges.gitter.im/trilium-notes/Lobby.svg)](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases. See [screenshots](https://github.com/zadam/trilium/wiki/Screenshot-tour) for quick overview:
Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases. See [screenshots](https://github.com/zadam/trilium/wiki/Screenshot-tour) for quick overview:
![](https://raw.githubusercontent.com/wiki/zadam/trilium/images/screenshot.png)
## Features
* Notes can be arranged into arbitrarily deep tree. Single note can be placed into multiple places in the tree (see [cloning](https://github.com/zadam/trilium/wiki/Cloning-notes))
* Rich WYSIWYG note editing including e.g. tables and images with markdown [autoformat](https://github.com/zadam/trilium/wiki/Text-editor#autoformat)
* Rich WYSIWYG note editing including e.g. tables and images with markdown [autoformat](https://github.com/zadam/trilium/wiki/Text-notes#autoformat)
* Support for editing [notes with source code](https://github.com/zadam/trilium/wiki/Code-notes), including syntax highlighting
* Fast and easy [navigation between notes](https://github.com/zadam/trilium/wiki/Note-navigation), full text search and [note hoisting](https://github.com/zadam/trilium/wiki/Note-hoisting)
* Seamless [note versioning](https://github.com/zadam/trilium/wiki/Note-revisions)
* Note [attributes](https://github.com/zadam/trilium/wiki/Attributes) can be used for note organization, querying and advanced [scripting](https://github.com/zadam/trilium/wiki/Scripts)
* [Synchronization](https://github.com/zadam/trilium/wiki/Synchronization) with self-hosted sync server
* Strong [note encryption](https://github.com/zadam/trilium/wiki/Protected-notes) with per-note granularity
* [Relation maps](https://github.com/zadam/trilium/wiki/Relation-map) for visualizing notes and their relations
* [Relation maps](https://github.com/zadam/trilium/wiki/Relation-map) and [link maps](https://github.com/zadam/trilium/wiki/Link-map) for visualizing notes and their relations
* [Scripting](https://github.com/zadam/trilium/wiki/Scripts) - see [Advanced showcases](https://github.com/zadam/trilium/wiki/Advanced-showcases)
* Scales well in both usability and performance upwards of 100 000 notes
* Touch optimized [mobile frontend](https://github.com/zadam/trilium/wiki/Mobile-frontend) for smartphones and tablets
* [Night theme](https://github.com/zadam/trilium/wiki/Themes)
* [Evernote](https://github.com/zadam/trilium/wiki/Evernote-import) and [Markdown import & export](https://github.com/zadam/trilium/wiki/Markdown)
* [Web Clipper](https://github.com/zadam/trilium/wiki/Web-clipper) for easy saving of web content
## Builds
Trilium is provided as either desktop application (Linux, Windows, Mac) or web application hosted on your server (Linux).
Trilium is provided as either desktop application (Linux and Windows) or web application hosted on your server (Linux). Mac OS desktop build is available, but it is [unsupported](https://github.com/zadam/trilium/wiki/FAQ#mac-os-support).
* If you want to use Trilium on the desktop, download binary release for your platform from [latest release](https://github.com/zadam/trilium/releases/latest), unzip the package and run ```trilium``` executable.
* If you want to install Trilium on server, follow [this page](https://github.com/zadam/trilium/wiki/Server-installation).
@@ -33,4 +35,23 @@ Trilium is provided as either desktop application (Linux, Windows, Mac) or web a
[See wiki for complete list of documentation pages.](https://github.com/zadam/trilium/wiki/)
You can also read [Patterns of personal knowledge base](https://github.com/zadam/trilium/wiki/Patterns-of-personal-knowledge-base) to get some inspiration on how you might use Trilium.
You can also read [Patterns of personal knowledge base](https://github.com/zadam/trilium/wiki/Patterns-of-personal-knowledge-base) to get some inspiration on how you might use Trilium.
## Contribute
Use a browser based dev environment
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/zadam/trilium)
Or clone locally and run
```
npm install
npm run start-server
```
## Shoutouts
* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - best WYSIWYG editor on the market, very interactive and listening team
* [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. Trilium Notes would not be the same without it.
* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with support for huge amount of languages
* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library without competition. Used in [relation maps](https://github.com/zadam/trilium/wiki/Relation-map) and [link maps](https://github.com/zadam/trilium/wiki/Link-map)

7
bin/build-debian.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/usr/bin/env bash
echo "Packaging debian x64 distribution..."
VERSION=`jq -r ".version" package.json`
./node_modules/.bin/electron-installer-debian --config bin/deb-options.json --options.version=${VERSION} --arch amd64

View File

@@ -1,5 +1,12 @@
#!/usr/bin/env bash
VERSION=`jq -r ".version" package.json`
SERIES=${VERSION:0:4}-latest
sudo docker build -t zadam/trilium:latest -t zadam/trilium:$VERSION .
cat package.json | grep -v electron > server-package.json
sudo docker build -t zadam/trilium:$VERSION -t zadam/trilium:$SERIES .
if [[ $VERSION != *"beta"* ]]; then
sudo docker tag zadam/trilium:$VERSION zadam/trilium:latest
fi

View File

@@ -1,24 +1,44 @@
#!/usr/bin/env bash
SRC_DIR=./dist/trilium-linux-x64-src
if [ "$1" != "DONTCOPY" ]
then
./bin/copy-trilium.sh $SRC_DIR
fi
echo "Copying required linux-x64 binaries"
rm -r $SRC_DIR/node_modules/sqlite3/lib/binding/*
rm -r $SRC_DIR/node_modules/pngquant-bin/vendor/*
rm -r $SRC_DIR/src/public/app-dist/*.mobile.*
cp -r bin/deps/linux-x64/sqlite/* $SRC_DIR/node_modules/sqlite3/lib/binding/
cp bin/deps/linux-x64/image/pngquant $SRC_DIR/node_modules/pngquant-bin/vendor/
./node_modules/.bin/electron-packager $SRC_DIR --asar --out=dist --executable-name=trilium --platform=linux --arch=x64 --overwrite
BUILD_DIR=./dist/trilium-linux-x64
rm -rf $BUILD_DIR
# we build x64 as second so that we keep X64 binaries in node_modules for local development and server build
echo "Rebuilding binaries for linux-x64"
./node_modules/.bin/electron-rebuild --arch=x64
./node_modules/.bin/electron-packager . --out=dist --executable-name=trilium --platform=linux --arch=x64 --overwrite
mv "./dist/Trilium Notes-linux-x64" $BUILD_DIR
rm -r "$BUILD_DIR/resources/app/node_modules/sqlite3/lib/binding/*"
cp images/app-icons/png/128x128.png $BUILD_DIR/icon.png
cp -r bin/deps/linux-x64/sqlite/electron* "$BUILD_DIR/resources/app/node_modules/sqlite3/lib/binding/"
rm -r $BUILD_DIR/resources/app/bin/deps
# removing software WebGL binaries because they are pretty huge and not necessary
rm -r $BUILD_DIR/swiftshader
cp bin/tpl/portable-trilium.sh $BUILD_DIR/
chmod 755 $BUILD_DIR/portable-trilium.sh
echo "Packaging linux x64 electron distribution..."
VERSION=`jq -r ".version" package.json`
7z a $BUILD_DIR-${VERSION}.7z $BUILD_DIR
cd dist
tar cJf trilium-linux-x64-${VERSION}.tar.xz trilium-linux-x64
cd ..
bin/build-debian.sh

View File

@@ -1,27 +1,39 @@
#!/usr/bin/env bash
SRC_DIR=./dist/trilium-mac-x64-src
if [ "$1" != "DONTCOPY" ]
then
./bin/copy-trilium.sh $SRC_DIR
fi
echo "Copying required mac binaries"
rm -r $SRC_DIR/node_modules/sqlite3/lib/binding/*
rm -r $SRC_DIR/node_modules/mozjpeg/vendor/*
rm -r $SRC_DIR/node_modules/pngquant-bin/vendor/*
rm -r $SRC_DIR/node_modules/giflossy/vendor/*
cp -r bin/deps/mac-x64/sqlite/* $SRC_DIR/node_modules/sqlite3/lib/binding/
cp bin/deps/mac-x64/image/cjpeg $SRC_DIR/node_modules/mozjpeg/vendor/
cp bin/deps/mac-x64/image/pngquant $SRC_DIR/node_modules/pngquant-bin/vendor/
cp bin/deps/mac-x64/image/gifsicle $SRC_DIR/node_modules/giflossy/vendor/
rm -r $SRC_DIR/src/public/app-dist/*.mobile.*
./node_modules/.bin/electron-packager $SRC_DIR --asar --out=dist --executable-name=trilium --platform=darwin --arch=x64 --overwrite --icon=images/app-icons/mac/icon.icns
BUILD_DIR=./dist/trilium-mac-x64
rm -rf $BUILD_DIR
./node_modules/.bin/electron-packager . --out=dist --executable-name=trilium --platform=darwin --arch=x64 --overwrite --icon=src/public/images/app-icons/mac/icon.icns
# Mac build has by default useless directory level
mv "./dist/Trilium Notes-darwin-x64" $BUILD_DIR
echo "Copying required mac binaries"
MAC_RES_DIR=$BUILD_DIR/Trilium\ Notes.app/Contents/Resources/app
rm -r "$MAC_RES_DIR/node_modules/sqlite3/lib/binding/*"
cp -r bin/deps/mac-x64/sqlite/* "$MAC_RES_DIR/node_modules/sqlite3/lib/binding/"
cp bin/deps/mac-x64/image/cjpeg "$MAC_RES_DIR/node_modules/mozjpeg/vendor/"
cp bin/deps/mac-x64/image/pngquant "$MAC_RES_DIR/node_modules/pngquant-bin/vendor/"
cp bin/deps/mac-x64/image/gifsicle "$MAC_RES_DIR/node_modules/giflossy/vendor/"
rm -r "$MAC_RES_DIR/bin/deps"
echo "Packaging mac x64 electron distribution..."
echo "Zipping mac x64 electron distribution..."
VERSION=`jq -r ".version" package.json`
7z a $BUILD_DIR-${VERSION}.7z $BUILD_DIR
cd dist
rm trilium-mac-x64-${VERSION}.zip
zip -r9 --symlinks trilium-mac-x64-${VERSION}.zip trilium-mac-x64

View File

@@ -1,37 +1,32 @@
#!/usr/bin/env bash
PKG_DIR=dist/trilium-linux-x64-server
NODE_VERSION=10.14.1
NODE_VERSION=12.16.3
rm -r $PKG_DIR
mkdir $PKG_DIR
cd $PKG_DIR
if [ "$1" != "DONTCOPY" ]
then
./bin/copy-trilium.sh $PKG_DIR
fi
cd dist
wget https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz
tar xvfJ node-v${NODE_VERSION}-linux-x64.tar.xz
rm node-v${NODE_VERSION}-linux-x64.tar.xz
mv node-v${NODE_VERSION}-linux-x64 node
cp -r ../../node_modules/ ./
cp -r ../../src/ ./
cp -r ../../db/ ./
cp -r ../../package.json ./
cp -r ../../package-lock.json ./
cp -r ../../README.md ./
cp -r ../../LICENSE ./
cp -r ../../config-sample.ini ./
rm -r ./node_modules/electron*
rm -r ./node_modules/sqlite3/lib/binding/*
cp -r ../../bin/deps/linux-x64/sqlite/node* ./node_modules/sqlite3/lib/binding/
printf "#/bin/sh\n./node/bin/node src/www" > trilium.sh
chmod 755 trilium.sh
cd ..
VERSION=`jq -r ".version" ../package.json`
7z a trilium-linux-x64-server-${VERSION}.7z trilium-linux-x64-server
mv dist/node-v${NODE_VERSION}-linux-x64 $PKG_DIR/node
rm -r $PKG_DIR/node_modules/electron*
rm -r $PKG_DIR/node_modules/sqlite3/lib/binding/*
cp -r ./bin/deps/linux-x64/sqlite/node* $PKG_DIR/node_modules/sqlite3/lib/binding/
printf "#!/bin/sh\n./node/bin/node src/www" > $PKG_DIR/trilium.sh
chmod 755 $PKG_DIR/trilium.sh
VERSION=`jq -r ".version" package.json`
cd dist
tar cJf trilium-linux-x64-server-${VERSION}.tar.xz trilium-linux-x64-server

View File

@@ -1,25 +1,41 @@
#!/usr/bin/env bash
SRC_DIR=./dist/trilium-windows-x64-src
if [ "$1" != "DONTCOPY" ]
then
./bin/copy-trilium.sh $SRC_DIR
fi
echo "Copying required windows binaries"
rm -r $SRC_DIR/node_modules/sqlite3/lib/binding/*
rm -r $SRC_DIR/node_modules/mozjpeg/vendor/*
rm -r $SRC_DIR/node_modules/pngquant-bin/vendor/*
rm -r $SRC_DIR/node_modules/giflossy/vendor/*
cp -r bin/deps/win-x64/sqlite/* $SRC_DIR/node_modules/sqlite3/lib/binding/
cp bin/deps/win-x64/image/cjpeg.exe $SRC_DIR/node_modules/mozjpeg/vendor/
cp bin/deps/win-x64/image/pngquant.exe $SRC_DIR/node_modules/pngquant-bin/vendor/
cp bin/deps/win-x64/image/gifsicle.exe $SRC_DIR/node_modules/giflossy/vendor/
rm -r $SRC_DIR/src/public/app-dist/*.mobile.*
./node_modules/.bin/electron-packager $SRC_DIR --asar --out=dist --executable-name=trilium --platform=win32 --arch=x64 --overwrite --icon=images/app-icons/win/icon.ico
BUILD_DIR=./dist/trilium-windows-x64
rm -rf $BUILD_DIR
./node_modules/.bin/electron-packager . --out=dist --executable-name=trilium --platform=win32 --arch=x64 --overwrite --icon=src/public/images/app-icons/win/icon.ico
mv "./dist/Trilium Notes-win32-x64" $BUILD_DIR
echo "Copying required windows binaries"
WIN_RES_DIR=$BUILD_DIR/resources/app
cp -r bin/deps/win-x64/sqlite/* $WIN_RES_DIR/node_modules/sqlite3/lib/binding/
cp bin/deps/win-x64/image/cjpeg.exe $WIN_RES_DIR/node_modules/mozjpeg/vendor/
cp bin/deps/win-x64/image/pngquant.exe $WIN_RES_DIR/node_modules/pngquant-bin/vendor/
cp bin/deps/win-x64/image/gifsicle.exe $WIN_RES_DIR/node_modules/giflossy/vendor/
rm -r $WIN_RES_DIR/bin/deps
# removing software WebGL binaries because they are pretty huge and not necessary
rm -r $BUILD_DIR/swiftshader
echo "Packaging windows x64 electron distribution..."
cp bin/tpl/portable-trilium.bat $BUILD_DIR/
echo "Zipping windows x64 electron distribution..."
VERSION=`jq -r ".version" package.json`
7z a $BUILD_DIR-${VERSION}.7z $BUILD_DIR
cd dist
zip -r9 trilium-windows-x64-${VERSION}.zip trilium-windows-x64

View File

@@ -1,18 +1,23 @@
#!/usr/bin/env bash
rm -r node_modules
npm install
echo "Deleting existing builds"
rm -r dist/*
rm -rf dist/*
bin/build-win-x64.sh
SRC_DIR=dist/trilium-src
bin/build-mac-x64.sh
bin/copy-trilium.sh $SRC_DIR
# building X64 linux as the last so electron-rebuild will prepare X64 binaries for local development
bin/build-linux-x64.sh
# we'll just copy the same SRC dir to all the builds so we don't have to do npm install in each separately
cp -r $SRC_DIR ./dist/trilium-linux-x64-src
cp -r $SRC_DIR ./dist/trilium-linux-x64-server
cp -r $SRC_DIR ./dist/trilium-windows-x64-src
cp -r $SRC_DIR ./dist/trilium-mac-x64-src
bin/build-server.sh
bin/build-win-x64.sh DONTCOPY
bin/build-mac-x64.sh DONTCOPY
bin/build-linux-x64.sh DONTCOPY
bin/build-server.sh DONTCOPY

38
bin/copy-trilium.sh Executable file
View File

@@ -0,0 +1,38 @@
#!/usr/bin/env bash
if [[ $# -eq 0 ]] ; then
echo "Missing argument of target directory"
exit 1
fi
npm run webpack
DIR=$1
rm -rf $DIR
mkdir $DIR
echo "Copying Trilium to build directory $DIR"
cp -r images $DIR/
cp -r libraries $DIR/
cp -r src $DIR/
cp -r db $DIR/
cp -r package.json $DIR/
cp -r package-lock.json $DIR/
cp -r README.md $DIR/
cp -r LICENSE $DIR/
cp -r config-sample.ini $DIR/
cp -r electron.js $DIR/
cp webpack-* $DIR/
# run in subshell (so we return to original dir)
(cd $DIR && npm install --only=prod)
find $DIR/libraries -name "*.map" -type f -delete
rm -r $DIR/src/public/app
sed -i -e 's/app\/desktop.js/app-dist\/desktop.js/g' $DIR/src/views/desktop.ejs
sed -i -e 's/app\/mobile.js/app-dist\/mobile.js/g' $DIR/src/views/mobile.ejs
sed -i -e 's/app\/setup.js/app-dist\/setup.js/g' $DIR/src/views/setup.ejs

14
bin/deb-options.json Normal file
View File

@@ -0,0 +1,14 @@
{
"src": "dist/trilium-linux-x64",
"dest": "dist/",
"name": "trilium",
"productName": "Trilium Notes",
"genericName": "Note taker",
"description": "Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases.",
"sections": "misc",
"maintainer": "zadam.apps@gmail.com",
"homepage": "https://github.com/zadam/trilium",
"bin": "trilium",
"icon": "dist/trilium-linux-x64/icon.png",
"categories": [ "Office" ]
}

BIN
bin/deps/linux-x64/image/pngquant Executable file

Binary file not shown.

0
bin/deps/mac-x64/image/cjpeg Normal file → Executable file
View File

0
bin/deps/mac-x64/image/pngquant Normal file → Executable file
View File

0
bin/deps/win-x64/image/cjpeg.exe Normal file → Executable file
View File

0
bin/deps/win-x64/image/pngquant.exe Normal file → Executable file
View File

View File

@@ -12,5 +12,4 @@ fi
mkdir -p "$DIR"
cd "$DIR"
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 2000 -nodes
openssl req -newkey rsa:4096 -x509 -sha256 -days 3650 -nodes -out cert.crt -keyout key.key

View File

@@ -5,5 +5,12 @@ if [[ $# -eq 0 ]] ; then
exit 1
fi
sudo docker push zadam/trilium:latest
sudo docker push zadam/trilium:$1
VERSION=$1
SERIES=${VERSION:0:4}-latest
sudo docker push zadam/trilium:$VERSION
sudo docker push zadam/trilium:$SERIES
if [[ $1 != *"beta"* ]]; then
sudo docker push zadam/trilium:latest
fi

View File

@@ -1,5 +1,7 @@
#!/usr/bin/env bash
export GITHUB_REPO=trilium
if [[ $# -eq 0 ]] ; then
echo "Missing argument of new version"
exit 1
@@ -42,10 +44,11 @@ git push origin $TAG
bin/build.sh
LINUX_X64_BUILD=trilium-linux-x64-$VERSION.7z
WINDOWS_X64_BUILD=trilium-windows-x64-$VERSION.7z
MAC_X64_BUILD=trilium-mac-x64-$VERSION.7z
SERVER_BUILD=trilium-linux-x64-server-$VERSION.7z
LINUX_X64_BUILD=trilium-linux-x64-$VERSION.tar.xz
DEBIAN_X64_BUILD=trilium_${VERSION}_amd64.deb
WINDOWS_X64_BUILD=trilium-windows-x64-$VERSION.zip
MAC_X64_BUILD=trilium-mac-x64-$VERSION.zip
SERVER_BUILD=trilium-linux-x64-server-$VERSION.tar.xz
echo "Creating release in GitHub"
@@ -59,6 +62,13 @@ github-release release \
--tag $TAG \
--name "$TAG release" $EXTRA
echo "Uploading debian x64 package"
github-release upload \
--tag $TAG \
--name "$DEBIAN_X64_BUILD" \
--file "dist/$DEBIAN_X64_BUILD"
echo "Uploading linux x64 build"
github-release upload \

View File

@@ -0,0 +1,4 @@
SET DIR=%~dp0
SET TRILIUM_DATA_DIR=%DIR%\trilium-data
cd %DIR%
start trilium.exe

7
bin/tpl/portable-trilium.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/usr/bin/env sh
DIR=`dirname "$0"`
export TRILIUM_DATA_DIR="$DIR/trilium-data"
"$DIR/trilium"

View File

@@ -2,8 +2,13 @@
# Instance name can be used to distinguish between different instances
instanceName=
# Disable automatically generating desktop icon
# noDesktopIcon=true
[Network]
# port setting is relevant only for web deployments, desktop builds run on random free port
# host setting is relevant only for web deployments - set the host on which the server will listen
# host=0.0.0.0
# port setting is relevant only for web deployments, desktop builds run on a fixed port (changeable with TRILIUM_PORT environment variable)
port=8080
# true for TLS/SSL/HTTPS (secure), false for HTTP (unsecure).
https=false

Binary file not shown.

BIN
db/demo.zip Normal file

Binary file not shown.

View File

@@ -0,0 +1,62 @@
const sql = require('../../src/services/sql');
function prependIv(cipherText, ivText) {
const arr = ivText.split("").map(c => parseInt(c) || 0);
const iv = Buffer.from(arr);
const payload = Buffer.from(cipherText, 'base64');
const complete = Buffer.concat([iv, payload]);
return complete.toString('base64');
}
async function updateEncryptedDataKey() {
const encryptedDataKey = await sql.getValue("SELECT value FROM options WHERE name = 'encryptedDataKey'");
const encryptedDataKeyIv = await sql.getValue("SELECT value FROM options WHERE name = 'encryptedDataKeyIv'");
const newEncryptedDataKey = prependIv(encryptedDataKey, encryptedDataKeyIv);
await sql.execute("UPDATE options SET value = ? WHERE name = 'encryptedDataKey'", [newEncryptedDataKey]);
await sql.execute("DELETE FROM options WHERE name = 'encryptedDataKeyIv'");
await sql.execute("DELETE FROM sync WHERE entityName = 'options' AND entityId = 'encryptedDataKeyIv'");
}
async function updateNotes() {
const protectedNotes = await sql.getRows("SELECT noteId, title, content FROM notes WHERE isProtected = 1");
for (const note of protectedNotes) {
if (note.title !== null) {
note.title = prependIv(note.title, "0" + note.noteId);
}
if (note.content !== null) {
note.content = prependIv(note.content, "1" + note.noteId);
}
await sql.execute("UPDATE notes SET title = ?, content = ? WHERE noteId = ?", [note.title, note.content, note.noteId]);
}
}
async function updateNoteRevisions() {
const protectedNoteRevisions = await sql.getRows("SELECT noteRevisionId, title, content FROM note_revisions WHERE isProtected = 1");
for (const noteRevision of protectedNoteRevisions) {
if (noteRevision.title !== null) {
noteRevision.title = prependIv(noteRevision.title, "0" + noteRevision.noteRevisionId);
}
if (noteRevision.content !== null) {
noteRevision.content = prependIv(noteRevision.content, "1" + noteRevision.noteRevisionId);
}
await sql.execute("UPDATE note_revisions SET title = ?, content = ? WHERE noteRevisionId = ?", [noteRevision.title, noteRevision.content, noteRevision.noteRevisionId]);
}
}
module.exports = async () => {
await updateEncryptedDataKey();
await updateNotes();
await updateNoteRevisions();
};

View File

@@ -0,0 +1,8 @@
INSERT INTO options (name, value, dateCreated, dateModified, isSynced)
VALUES ('mainFontSize', '100', '2019-01-13T18:31:00.874Z', '2019-01-13T18:31:00.874Z', 0);
INSERT INTO options (name, value, dateCreated, dateModified, isSynced)
VALUES ('treeFontSize', '100', '2019-01-13T18:31:00.874Z', '2019-01-13T18:31:00.874Z', 0);
INSERT INTO options (name, value, dateCreated, dateModified, isSynced)
VALUES ('detailFontSize', '110', '2019-01-13T18:31:00.874Z', '2019-01-13T18:31:00.874Z', 0);

View File

@@ -0,0 +1,11 @@
INSERT INTO options (name, value, dateCreated, dateModified, isSynced)
SELECT 'mainFontSize', '100', '2019-01-13T18:31:00.874Z', '2019-01-13T18:31:00.874Z', 0
WHERE NOT EXISTS (SELECT 1 FROM options WHERE name = 'mainFontSize');
INSERT INTO options (name, value, dateCreated, dateModified, isSynced)
SELECT 'treeFontSize', '100', '2019-01-13T18:31:00.874Z', '2019-01-13T18:31:00.874Z', 0
WHERE NOT EXISTS (SELECT 1 FROM options WHERE name = 'treeFontSize');
INSERT INTO options (name, value, dateCreated, dateModified, isSynced)
SELECT 'detailFontSize', '110', '2019-01-13T18:31:00.874Z', '2019-01-13T18:31:00.874Z', 0
WHERE NOT EXISTS (SELECT 1 FROM options WHERE name = 'detailFontSize');

View File

@@ -0,0 +1,35 @@
CREATE TABLE IF NOT EXISTS "note_contents" (
`noteContentId` TEXT NOT NULL,
`noteId` TEXT NOT NULL,
`isProtected` INT NOT NULL DEFAULT 0,
`content` TEXT NULL DEFAULT NULL,
`hash` TEXT DEFAULT "" NOT NULL,
`dateCreated` TEXT NOT NULL,
`dateModified` TEXT NOT NULL,
PRIMARY KEY(`noteContentId`)
);
CREATE UNIQUE INDEX `IDX_note_contents_noteId` ON `note_contents` (`noteId`);
INSERT INTO note_contents (noteContentId, noteId, isProtected, content, dateCreated, dateModified)
SELECT 'C' || SUBSTR(noteId, 2), noteId, isProtected, content, dateCreated, dateModified FROM notes;
CREATE TABLE IF NOT EXISTS "notes_mig" (
`noteId` TEXT NOT NULL,
`title` TEXT NOT NULL DEFAULT "note",
`isProtected` INT NOT NULL DEFAULT 0,
`type` TEXT NOT NULL DEFAULT 'text',
`mime` TEXT NOT NULL DEFAULT 'text/html',
`hash` TEXT DEFAULT "" NOT NULL,
`isDeleted` INT NOT NULL DEFAULT 0,
`dateCreated` TEXT NOT NULL,
`dateModified` TEXT NOT NULL,
PRIMARY KEY(`noteId`)
);
INSERT INTO notes_mig (noteId, title, isProtected, isDeleted, dateCreated, dateModified, type, mime, hash)
SELECT noteId, title, isProtected, isDeleted, dateCreated, dateModified, type, mime, hash FROM notes;
DROP TABLE notes;
ALTER TABLE notes_mig RENAME TO notes;

View File

@@ -0,0 +1,2 @@
INSERT OR REPLACE INTO sync (entityName, entityId, sourceId, syncDate)
SELECT 'note_contents', noteContentId, '', '2019-03-02T18:07:29.182Z' FROM note_contents;

View File

@@ -0,0 +1,6 @@
UPDATE notes SET title = 'Recovered protected note', isProtected = 0 WHERE noteId IN (
SELECT noteId FROM notes JOIN note_contents USING(noteId)
WHERE notes.isProtected = 1
AND note_contents.isProtected = 0
AND notes.isDeleted = 0
)

View File

@@ -0,0 +1 @@
module.exports = async () => {};

View File

@@ -0,0 +1,236 @@
CREATE TABLE IF NOT EXISTS "sync_mig" (
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`entityName` TEXT NOT NULL,
`entityId` TEXT NOT NULL,
`sourceId` TEXT NOT NULL,
`utcSyncDate` TEXT NOT NULL);
INSERT INTO sync_mig (id, entityName, entityId, sourceId, utcSyncDate)
SELECT id, entityName, entityId, sourceId, REPLACE(syncDate, 'T', ' ') FROM sync;
DROP TABLE sync;
ALTER TABLE sync_mig RENAME TO sync;
CREATE TABLE IF NOT EXISTS "source_ids_mig" (
`sourceId` TEXT NOT NULL,
`utcDateCreated` TEXT NOT NULL,
PRIMARY KEY(`sourceId`)
);
INSERT INTO source_ids_mig (sourceId, utcDateCreated)
SELECT sourceId, REPLACE(dateCreated, 'T', ' ') FROM source_ids;
DROP TABLE source_ids;
ALTER TABLE source_ids_mig RENAME TO source_ids;
CREATE TABLE IF NOT EXISTS "note_revisions_mig" (
`noteRevisionId` TEXT NOT NULL PRIMARY KEY,
`noteId` TEXT NOT NULL,
`title` TEXT,
`content` TEXT,
`isProtected` INT NOT NULL DEFAULT 0,
`utcDateModifiedFrom` TEXT NOT NULL,
`utcDateModifiedTo` TEXT NOT NULL,
`dateModifiedFrom` TEXT NOT NULL,
`dateModifiedTo` TEXT NOT NULL,
type TEXT DEFAULT '' NOT NULL,
mime TEXT DEFAULT '' NOT NULL,
hash TEXT DEFAULT "" NOT NULL);
INSERT INTO note_revisions_mig (noteRevisionId, noteId, title, content, isProtected, utcDateModifiedFrom, utcDateModifiedTo, dateModifiedFrom, dateModifiedTo, type, mime, hash)
SELECT noteRevisionId, noteId, title, content, isProtected, REPLACE(dateModifiedFrom, 'T', ' '), REPLACE(dateModifiedTo, 'T', ' '), REPLACE(REPLACE(dateModifiedFrom, 'T', ' '), 'Z', '+0000'), REPLACE(REPLACE(dateModifiedTo, 'T', ' '), 'Z', '+0000'), type, mime, hash FROM note_revisions;
DROP TABLE note_revisions;
ALTER TABLE note_revisions_mig RENAME TO note_revisions;
CREATE TABLE IF NOT EXISTS "api_tokens_mig"
(
apiTokenId TEXT PRIMARY KEY NOT NULL,
token TEXT NOT NULL,
utcDateCreated TEXT NOT NULL,
isDeleted INT NOT NULL DEFAULT 0,
hash TEXT DEFAULT "" NOT NULL);
INSERT INTO api_tokens_mig (apiTokenId, token, utcDateCreated, isDeleted, hash)
SELECT apiTokenId, token, REPLACE(dateCreated, 'T', ' '), isDeleted, hash FROM api_tokens;
DROP TABLE api_tokens;
ALTER TABLE api_tokens_mig RENAME TO api_tokens;
CREATE TABLE IF NOT EXISTS "branches_mig" (
`branchId` TEXT NOT NULL,
`noteId` TEXT NOT NULL,
`parentNoteId` TEXT NOT NULL,
`notePosition` INTEGER NOT NULL,
`prefix` TEXT,
`isExpanded` BOOLEAN,
`isDeleted` INTEGER NOT NULL DEFAULT 0,
`utcDateModified` TEXT NOT NULL,
utcDateCreated TEXT NOT NULL,
hash TEXT DEFAULT "" NOT NULL,
PRIMARY KEY(`branchId`)
);
INSERT INTO branches_mig (branchId, noteId, parentNoteId, notePosition, prefix, isExpanded, isDeleted, utcDateModified, utcDateCreated, hash)
SELECT branchId, noteId, parentNoteId, notePosition, prefix, isExpanded, isDeleted, REPLACE(dateModified, 'T', ' '), REPLACE(dateCreated, 'T', ' '), hash FROM branches;
DROP TABLE branches;
ALTER TABLE branches_mig RENAME TO branches;
CREATE TABLE IF NOT EXISTS "recent_notes_mig" (
`branchId` TEXT NOT NULL PRIMARY KEY,
`notePath` TEXT NOT NULL,
hash TEXT DEFAULT "" NOT NULL,
`utcDateCreated` TEXT NOT NULL,
isDeleted INT
);
INSERT INTO recent_notes_mig (branchId, notePath, hash, utcDateCreated, isDeleted)
SELECT branchId, notePath, hash, REPLACE(dateCreated, 'T', ' '), isDeleted FROM recent_notes;
DROP TABLE recent_notes;
ALTER TABLE recent_notes_mig RENAME TO recent_notes;
CREATE TABLE IF NOT EXISTS "event_log_mig" (
`eventId` TEXT NOT NULL PRIMARY KEY,
`noteId` TEXT,
`comment` TEXT,
`utcDateCreated` TEXT NOT NULL
);
INSERT INTO event_log_mig (eventId, noteId, comment, utcDateCreated)
SELECT eventId, noteId, comment, REPLACE(dateCreated, 'T', ' ') FROM event_log;
DROP TABLE event_log;
ALTER TABLE event_log_mig RENAME TO event_log;
CREATE TABLE IF NOT EXISTS "options_mig"
(
name TEXT not null PRIMARY KEY,
value TEXT,
isSynced INTEGER default 0 not null,
hash TEXT default "" not null,
utcDateCreated TEXT not null,
utcDateModified TEXT NOT NULL
);
INSERT INTO options_mig (name, value, isSynced, hash, utcDateCreated, utcDateModified)
SELECT name, value, isSynced, hash, REPLACE(dateCreated, 'T', ' '), REPLACE(dateModified, 'T', ' ') FROM options;
DROP TABLE options;
ALTER TABLE options_mig RENAME TO options;
CREATE TABLE attributes_mig
(
attributeId TEXT not null primary key,
noteId TEXT not null,
type TEXT not null,
name TEXT not null,
value TEXT default '' not null,
position INT default 0 not null,
utcDateCreated TEXT not null,
utcDateModified TEXT not null,
isDeleted INT not null,
hash TEXT default "" not null,
isInheritable int DEFAULT 0 NULL);
INSERT INTO attributes_mig (attributeId, noteId, type, name, value, position, utcDateCreated, utcDateModified, isDeleted, hash, isInheritable)
SELECT attributeId, noteId, type, name, value, position, REPLACE(dateCreated, 'T', ' '), REPLACE(dateModified, 'T', ' '), isDeleted, hash, isInheritable FROM attributes;
DROP TABLE attributes;
ALTER TABLE attributes_mig RENAME TO attributes;
CREATE TABLE IF NOT EXISTS "links_mig" (
`linkId` TEXT NOT NULL,
`noteId` TEXT NOT NULL,
`targetNoteId` TEXT NOT NULL,
`type` TEXT NOT NULL,
`hash` TEXT DEFAULT "" NOT NULL,
`isDeleted` INTEGER NOT NULL DEFAULT 0,
`utcDateCreated` TEXT NOT NULL,
`utcDateModified` TEXT NOT NULL,
PRIMARY KEY(`linkId`)
);
INSERT INTO links_mig (linkId, noteId, targetNoteId, type, hash, isDeleted, utcDateCreated, utcDateModified)
SELECT linkId, noteId, targetNoteId, type, hash, isDeleted, REPLACE(dateCreated, 'T', ' '), REPLACE(dateModified, 'T', ' ') FROM links;
DROP TABLE links;
ALTER TABLE links_mig RENAME TO links;
CREATE TABLE IF NOT EXISTS "note_contents_mig" (
`noteContentId` TEXT NOT NULL,
`noteId` TEXT NOT NULL,
`isProtected` INT NOT NULL DEFAULT 0,
`content` TEXT NULL DEFAULT NULL,
`hash` TEXT DEFAULT "" NOT NULL,
`utcDateCreated` TEXT NOT NULL,
`utcDateModified` TEXT NOT NULL,
PRIMARY KEY(`noteContentId`)
);
INSERT INTO note_contents_mig (noteContentId, noteId, isProtected, content, hash, utcDateCreated, utcDateModified)
SELECT noteContentId, noteId, isProtected, content, hash, REPLACE(dateCreated, 'T', ' '), REPLACE(dateModified, 'T', ' ') FROM note_contents;
DROP TABLE note_contents;
ALTER TABLE note_contents_mig RENAME TO note_contents;
CREATE TABLE IF NOT EXISTS "notes_mig" (
`noteId` TEXT NOT NULL,
`title` TEXT NOT NULL DEFAULT "note",
`isProtected` INT NOT NULL DEFAULT 0,
`type` TEXT NOT NULL DEFAULT 'text',
`mime` TEXT NOT NULL DEFAULT 'text/html',
`hash` TEXT DEFAULT "" NOT NULL,
`isDeleted` INT NOT NULL DEFAULT 0,
`dateCreated` TEXT NOT NULL,
`dateModified` TEXT NOT NULL,
`utcDateCreated` TEXT NOT NULL,
`utcDateModified` TEXT NOT NULL,
PRIMARY KEY(`noteId`)
);
INSERT INTO notes_mig (noteId, title, isProtected, type, mime, hash, isDeleted, dateCreated, dateModified, utcDateCreated, utcDateModified)
SELECT noteId, title, isProtected, type, mime, hash, isDeleted, REPLACE(REPLACE(dateCreated, 'T', ' '), 'Z', '+0000'), REPLACE(REPLACE(dateModified, 'T', ' '), 'Z', '+0000'), REPLACE(dateCreated, 'T', ' '), REPLACE(dateModified, 'T', ' ') FROM notes;
DROP TABLE notes;
ALTER TABLE notes_mig RENAME TO notes;
CREATE UNIQUE INDEX `IDX_sync_entityName_entityId` ON `sync` (
`entityName`,
`entityId`
);
CREATE INDEX `IDX_sync_utcSyncDate` ON `sync` (
`utcSyncDate`
);
CREATE INDEX `IDX_note_revisions_noteId` ON `note_revisions` (
`noteId`
);
CREATE INDEX `IDX_note_revisions_dateModifiedFrom` ON `note_revisions` (
`utcDateModifiedFrom`
);
CREATE INDEX `IDX_note_revisions_dateModifiedTo` ON `note_revisions` (
`utcDateModifiedTo`
);
CREATE INDEX `IDX_branches_noteId` ON `branches` (
`noteId`
);
CREATE INDEX `IDX_branches_noteId_parentNoteId` ON `branches` (
`noteId`,
`parentNoteId`
);
CREATE INDEX IDX_branches_parentNoteId ON branches (parentNoteId);
CREATE INDEX IDX_attributes_name_value
on attributes (name, value);
CREATE INDEX IDX_links_noteId_index
on links (noteId);
CREATE INDEX IDX_links_targetNoteId_index
on links (targetNoteId);
CREATE INDEX IDX_attributes_name_index
on attributes (name);
CREATE INDEX IDX_attributes_noteId_index
on attributes (noteId);
CREATE INDEX IDX_attributes_value_index
on attributes (value);
CREATE UNIQUE INDEX `IDX_note_contents_noteId` ON `note_contents` (`noteId`);

View File

@@ -0,0 +1,13 @@
CREATE TABLE IF NOT EXISTS "note_contents_mig" (
`noteId` TEXT NOT NULL,
`content` TEXT NULL DEFAULT NULL,
`hash` TEXT DEFAULT "" NOT NULL,
`utcDateModified` TEXT NOT NULL,
PRIMARY KEY(`noteId`)
);
INSERT INTO note_contents_mig (noteId, content, hash, utcDateModified)
SELECT noteId, content, hash, utcDateModified FROM note_contents;
DROP TABLE note_contents;
ALTER TABLE note_contents_mig RENAME TO note_contents;

View File

@@ -0,0 +1,5 @@
const syncTableService = require('../../src/services/sync_table');
module.exports = async () => {
await syncTableService.fillAllSyncRows();
};

View File

@@ -0,0 +1 @@
DROP TABLE IF EXISTS note_fulltext;

View File

@@ -0,0 +1,4 @@
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
SELECT 'openTabs', '[{"notePath":"' || value || '","active": true,"tabId":"1111"}]', '2019-05-01T18:31:00.874Z', '2019-05-01T18:31:00.874Z', 0 FROM options WHERE name = 'startNotePath';
DELETE FROM options WHERE name = 'startNotePath';

View File

@@ -0,0 +1,2 @@
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('hideTabRowForOneTab', 'false', '2019-05-01T18:31:00.874Z', '2019-05-01T18:31:00.874Z', 0);

View File

@@ -0,0 +1,12 @@
drop table recent_notes;
create table recent_notes
(
noteId TEXT not null primary key,
notePath TEXT not null,
hash TEXT default "" not null,
utcDateCreated TEXT not null,
isDeleted INT
);
delete from sync where entityName = 'recent_notes';

View File

@@ -0,0 +1,10 @@
UPDATE links SET type = 'internal-link' WHERE type = 'hyper';
UPDATE links SET type = 'image-link' WHERE type = 'image';
UPDATE links SET type = 'relation-map-link' WHERE type = 'relation-map';
INSERT INTO attributes (attributeId, noteId, type, name, value, position, utcDateCreated, utcDateModified, isDeleted, hash, isInheritable)
SELECT linkId, noteId, 'relation', type, targetNoteId, 0, utcDateCreated, utcDateModified, isDeleted, hash, 0 FROM links;
UPDATE sync SET entityName = 'attributes' WHERE entityName = 'links';
DROP TABLE links;

View File

@@ -0,0 +1,5 @@
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('sidebarMinWidth', '350', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('sidebarWidthPercent', '25', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);

View File

@@ -0,0 +1,2 @@
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('showSidebarInNewTab', 'true', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);

View File

@@ -0,0 +1,14 @@
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('noteInfoWidget', '{"enabled":true,"expanded":true,"position":100}', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('attributesWidget', '{"enabled":true,"expanded":true,"position":200}', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('linkMapWidget', '{"enabled":true,"expanded":true,"position":300}', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('noteRevisionsWidget', '{"enabled":true,"expanded":true,"position":400}', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('whatLinksHereWidget', '{"enabled":false,"expanded":true,"position":500}', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);

View File

@@ -0,0 +1,5 @@
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('codeNotesMimeTypes', '["text/x-csrc","text/x-c++src","text/x-csharp","text/css","text/x-go","text/x-groovy","text/x-haskell","text/html","message/http","text/x-java","application/javascript;env=frontend","application/javascript;env=backend","application/json","text/x-kotlin","text/x-markdown","text/x-perl","text/x-php","text/x-python","text/x-ruby",null,"text/x-sql","text/x-swift","text/xml","text/x-yaml"]', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 1);
INSERT INTO sync (entityName, entityId, sourceId, utcSyncDate)
VALUES ('options' ,'codeNotesMimeTypes', 'SYNC_FILL', '2018-01-01T00:00:00.000Z');

View File

@@ -0,0 +1,2 @@
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('similarNotesWidget', '{"enabled":true,"expanded":true,"position":600}', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);

View File

@@ -0,0 +1 @@
DROP TABLE event_log;

View File

@@ -0,0 +1,2 @@
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('editedNotesWidget', '{"enabled":true,"expanded":true,"position":50}', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);

View File

@@ -0,0 +1,2 @@
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('calendarWidget', '{"enabled":true,"expanded":true,"position":20}', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);

View File

@@ -0,0 +1,5 @@
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('spellCheckEnabled', 'true', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
VALUES ('spellCheckLanguageCode', 'en-US', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0);

View File

@@ -0,0 +1,3 @@
INSERT INTO options (name, value, utcDateCreated, utcDateModified, isSynced)
SELECT 'hideTabRowForOneTab', 'false', '2019-05-01T18:31:00.874Z', '2019-05-01T18:31:00.874Z', 0
WHERE NOT EXISTS(SELECT 1 FROM options WHERE name = 'hideTabRowForOneTab');

View File

@@ -0,0 +1,22 @@
CREATE TABLE IF NOT EXISTS "mig_branches" (
`branchId` TEXT NOT NULL,
`noteId` TEXT NOT NULL,
`parentNoteId` TEXT NOT NULL,
`notePosition` INTEGER NOT NULL,
`prefix` TEXT,
`isExpanded` INTEGER NOT NULL DEFAULT 0,
`isDeleted` INTEGER NOT NULL DEFAULT 0,
`utcDateModified` TEXT NOT NULL,
utcDateCreated TEXT NOT NULL,
hash TEXT DEFAULT "" NOT NULL,
PRIMARY KEY(`branchId`));
INSERT INTO mig_branches (branchId, noteId, parentNoteId, notePosition, prefix, isExpanded, isDeleted, utcDateModified, utcDateCreated, hash)
SELECT branchId, noteId, parentNoteId, notePosition, prefix, COALESCE(isExpanded, 0), isDeleted, utcDateModified, utcDateCreated, hash FROM branches;
DROP TABLE branches;
ALTER TABLE mig_branches RENAME TO branches;
CREATE INDEX `IDX_branches_noteId` ON `branches` (`noteId`);
CREATE INDEX `IDX_branches_noteId_parentNoteId` ON `branches` (`noteId`,`parentNoteId`);
CREATE INDEX IDX_branches_parentNoteId ON branches (parentNoteId);

View File

@@ -0,0 +1,2 @@
UPDATE branches SET notePosition = notePosition * 10;
UPDATE attributes SET position = position * 10;

View File

@@ -0,0 +1,36 @@
CREATE TABLE IF NOT EXISTS "note_revisions_mig" (`noteRevisionId` TEXT NOT NULL PRIMARY KEY,
`noteId` TEXT NOT NULL,
`title` TEXT,
`contentLength` INT NOT NULL,
`isProtected` INT NOT NULL DEFAULT 0,
`utcDateLastEdited` TEXT NOT NULL,
`utcDateCreated` TEXT NOT NULL,
`utcDateModified` TEXT NOT NULL,
`dateLastEdited` TEXT NOT NULL,
`dateCreated` TEXT NOT NULL,
type TEXT DEFAULT '' NOT NULL,
mime TEXT DEFAULT '' NOT NULL,
hash TEXT DEFAULT '' NOT NULL);
CREATE TABLE IF NOT EXISTS "note_revision_contents" (`noteRevisionId` TEXT NOT NULL PRIMARY KEY,
`content` TEXT,
hash TEXT DEFAULT '' NOT NULL,
`utcDateModified` TEXT NOT NULL);
INSERT INTO note_revision_contents (noteRevisionId, content, hash, utcDateModified)
SELECT noteRevisionId, content, hash, utcDateModifiedTo FROM note_revisions;
INSERT INTO note_revisions_mig (noteRevisionId, noteId, title, contentLength, isProtected, utcDateLastEdited, utcDateCreated, utcDateModified, dateLastEdited, dateCreated, type, mime, hash)
SELECT noteRevisionId, noteId, title, COALESCE(LENGTH(content), 0), isProtected, utcDateModifiedFrom, utcDateModifiedTo, utcDateModifiedTo, dateModifiedFrom, dateModifiedTo, type, mime, hash FROM note_revisions;
DROP TABLE note_revisions;
ALTER TABLE note_revisions_mig RENAME TO note_revisions;
CREATE INDEX `IDX_note_revisions_noteId` ON `note_revisions` (`noteId`);
CREATE INDEX `IDX_note_revisions_utcDateCreated` ON `note_revisions` (`utcDateCreated`);
CREATE INDEX `IDX_note_revisions_utcDateLastEdited` ON `note_revisions` (`utcDateLastEdited`);
CREATE INDEX `IDX_note_revisions_dateCreated` ON `note_revisions` (`dateCreated`);
CREATE INDEX `IDX_note_revisions_dateLastEdited` ON `note_revisions` (`dateLastEdited`);
INSERT INTO sync (entityName, entityId, sourceId, utcSyncDate)
SELECT 'note_revision_contents', entityId, sourceId, utcSyncDate FROM sync WHERE entityName = 'note_revisions';

View File

@@ -0,0 +1,31 @@
CREATE TABLE IF NOT EXISTS "notes_mig" (
`noteId` TEXT NOT NULL,
`title` TEXT NOT NULL DEFAULT "note",
`isProtected` INT NOT NULL DEFAULT 0,
`type` TEXT NOT NULL DEFAULT 'text',
`mime` TEXT NOT NULL DEFAULT 'text/html',
`hash` TEXT DEFAULT "" NOT NULL,
`isDeleted` INT NOT NULL DEFAULT 0,
`isErased` INT NOT NULL DEFAULT 0,
`dateCreated` TEXT NOT NULL,
`dateModified` TEXT NOT NULL,
`utcDateCreated` TEXT NOT NULL,
`utcDateModified` TEXT NOT NULL,
PRIMARY KEY(`noteId`));
INSERT INTO notes_mig (noteId, title, isProtected, type, mime, hash, isDeleted, isErased, dateCreated, dateModified, utcDateCreated, utcDateModified)
SELECT noteId, title, isProtected, type, mime, hash, isDeleted, 0, dateCreated, dateModified, utcDateCreated, utcDateModified FROM notes;
DROP TABLE notes;
ALTER TABLE notes_mig RENAME TO notes;
UPDATE notes SET isErased = 1 WHERE isDeleted = 1
AND 1=(SELECT CASE WHEN content IS NULL THEN 1 ELSE 0 END FROM note_contents WHERE note_contents.noteId = notes.noteId);
CREATE INDEX `IDX_notes_isDeleted` ON `notes` (`isDeleted`);
CREATE INDEX `IDX_notes_title` ON `notes` (`title`);
CREATE INDEX `IDX_notes_type` ON `notes` (`type`);
CREATE INDEX `IDX_notes_dateCreated` ON `notes` (`dateCreated`);
CREATE INDEX `IDX_notes_dateModified` ON `notes` (`dateModified`);
CREATE INDEX `IDX_notes_utcDateModified` ON `notes` (`utcDateModified`);
CREATE INDEX `IDX_notes_utcDateCreated` ON `notes` (`utcDateCreated`);

View File

@@ -0,0 +1,34 @@
CREATE TABLE IF NOT EXISTS "notes_mig" (
`noteId` TEXT NOT NULL,
`title` TEXT NOT NULL DEFAULT "note",
`contentLength` INT NOT NULL,
`isProtected` INT NOT NULL DEFAULT 0,
`type` TEXT NOT NULL DEFAULT 'text',
`mime` TEXT NOT NULL DEFAULT 'text/html',
`hash` TEXT DEFAULT "" NOT NULL,
`isDeleted` INT NOT NULL DEFAULT 0,
`isErased` INT NOT NULL DEFAULT 0,
`dateCreated` TEXT NOT NULL,
`dateModified` TEXT NOT NULL,
`utcDateCreated` TEXT NOT NULL,
`utcDateModified` TEXT NOT NULL,
PRIMARY KEY(`noteId`));
INSERT INTO notes_mig (noteId, title, contentLength, isProtected, type, mime, hash, isDeleted, isErased, dateCreated, dateModified, utcDateCreated, utcDateModified)
SELECT noteId, title, -1, isProtected, type, mime, hash, isDeleted, isErased, dateCreated, dateModified, utcDateCreated, utcDateModified FROM notes;
DROP TABLE notes;
ALTER TABLE notes_mig RENAME TO notes;
UPDATE notes SET contentLength = COALESCE((SELECT COALESCE(LENGTH(content), 0) FROM note_contents WHERE note_contents.noteId = notes.noteId), -1);
CREATE INDEX `IDX_notes_isDeleted` ON `notes` (`isDeleted`);
CREATE INDEX `IDX_notes_title` ON `notes` (`title`);
CREATE INDEX `IDX_notes_type` ON `notes` (`type`);
CREATE INDEX `IDX_notes_dateCreated` ON `notes` (`dateCreated`);
CREATE INDEX `IDX_notes_dateModified` ON `notes` (`dateModified`);
CREATE INDEX `IDX_notes_utcDateModified` ON `notes` (`utcDateModified`);
CREATE INDEX `IDX_notes_utcDateCreated` ON `notes` (`utcDateCreated`);
-- should be OK since sync protocol changes so all instances must upgrade
UPDATE attributes SET isDeleted = 1 WHERE name = 'fileSize';

View File

@@ -0,0 +1,28 @@
CREATE TABLE IF NOT EXISTS "note_revisions_mig" (`noteRevisionId` TEXT NOT NULL PRIMARY KEY,
`noteId` TEXT NOT NULL,
`title` TEXT,
`contentLength` INT NOT NULL,
`isErased` INT NOT NULL DEFAULT 0,
`isProtected` INT NOT NULL DEFAULT 0,
`utcDateLastEdited` TEXT NOT NULL,
`utcDateCreated` TEXT NOT NULL,
`utcDateModified` TEXT NOT NULL,
`dateLastEdited` TEXT NOT NULL,
`dateCreated` TEXT NOT NULL,
type TEXT DEFAULT '' NOT NULL,
mime TEXT DEFAULT '' NOT NULL,
hash TEXT DEFAULT '' NOT NULL);
INSERT INTO note_revisions_mig (noteRevisionId, noteId, title, contentLength, isErased, isProtected, utcDateLastEdited, utcDateCreated, utcDateModified, dateLastEdited, dateCreated, type, mime, hash)
SELECT noteRevisionId, noteId, title, contentLength, 0, isProtected, utcDateLastEdited, utcDateCreated, utcDateModified, dateLastEdited, dateCreated, type, mime, hash FROM note_revisions;
DROP TABLE note_revisions;
ALTER TABLE note_revisions_mig RENAME TO note_revisions;
UPDATE note_revisions SET isErased = (SELECT isErased FROM notes WHERE notes.noteId = note_revisions.noteId);
CREATE INDEX `IDX_note_revisions_noteId` ON `note_revisions` (`noteId`);
CREATE INDEX `IDX_note_revisions_utcDateCreated` ON `note_revisions` (`utcDateCreated`);
CREATE INDEX `IDX_note_revisions_utcDateLastEdited` ON `note_revisions` (`utcDateLastEdited`);
CREATE INDEX `IDX_note_revisions_dateCreated` ON `note_revisions` (`dateCreated`);
CREATE INDEX `IDX_note_revisions_dateLastEdited` ON `note_revisions` (`dateLastEdited`);

View File

@@ -0,0 +1,3 @@
UPDATE attributes SET name = 'internalLink' WHERE name = 'internal-link';
UPDATE attributes SET name = 'imageLink' WHERE name = 'image-link';
UPDATE attributes SET name = 'relationMapLink' WHERE name = 'relation-map-link';

View File

@@ -0,0 +1,5 @@
DROP INDEX IF EXISTS IDX_attributes_name_index;
DROP INDEX IF EXISTS IDX_branches_noteId;
CREATE INDEX IDX_source_ids_utcDateCreated
on source_ids (utcDateCreated);

View File

@@ -0,0 +1,81 @@
CREATE TABLE IF NOT EXISTS "notes_mig" (
`noteId` TEXT NOT NULL,
`title` TEXT NOT NULL DEFAULT "note",
`contentLength` INT NOT NULL,
`isProtected` INT NOT NULL DEFAULT 0,
`type` TEXT NOT NULL DEFAULT 'text',
`mime` TEXT NOT NULL DEFAULT 'text/html',
`hash` TEXT DEFAULT "" NOT NULL,
`isDeleted` INT NOT NULL DEFAULT 0,
`deleteId` TEXT DEFAULT NULL,
`isErased` INT NOT NULL DEFAULT 0,
`dateCreated` TEXT NOT NULL,
`dateModified` TEXT NOT NULL,
`utcDateCreated` TEXT NOT NULL,
`utcDateModified` TEXT NOT NULL,
PRIMARY KEY(`noteId`));
INSERT INTO notes_mig (noteId, title, contentLength, isProtected, type, mime, hash, isDeleted, isErased, dateCreated, dateModified, utcDateCreated, utcDateModified)
SELECT noteId, title, -1, isProtected, type, mime, hash, isDeleted, isErased, dateCreated, dateModified, utcDateCreated, utcDateModified FROM notes;
DROP TABLE notes;
ALTER TABLE notes_mig RENAME TO notes;
CREATE INDEX `IDX_notes_isDeleted` ON `notes` (`isDeleted`);
CREATE INDEX `IDX_notes_title` ON `notes` (`title`);
CREATE INDEX `IDX_notes_type` ON `notes` (`type`);
CREATE INDEX `IDX_notes_dateCreated` ON `notes` (`dateCreated`);
CREATE INDEX `IDX_notes_dateModified` ON `notes` (`dateModified`);
CREATE INDEX `IDX_notes_utcDateModified` ON `notes` (`utcDateModified`);
CREATE INDEX `IDX_notes_utcDateCreated` ON `notes` (`utcDateCreated`);
CREATE TABLE IF NOT EXISTS "branches_mig" (
`branchId` TEXT NOT NULL,
`noteId` TEXT NOT NULL,
`parentNoteId` TEXT NOT NULL,
`notePosition` INTEGER NOT NULL,
`prefix` TEXT,
`isExpanded` INTEGER NOT NULL DEFAULT 0,
`isDeleted` INTEGER NOT NULL DEFAULT 0,
`deleteId` TEXT DEFAULT NULL,
`utcDateModified` TEXT NOT NULL,
utcDateCreated TEXT NOT NULL,
hash TEXT DEFAULT "" NOT NULL,
PRIMARY KEY(`branchId`));
INSERT INTO branches_mig (branchId, noteId, parentNoteId, notePosition, prefix, isExpanded, isDeleted, utcDateModified, utcDateCreated, hash)
SELECT branchId, noteId, parentNoteId, notePosition, prefix, isExpanded, isDeleted, utcDateModified, utcDateCreated, hash FROM branches;
DROP TABLE branches;
ALTER TABLE branches_mig RENAME TO branches;
CREATE INDEX `IDX_branches_noteId_parentNoteId` ON `branches` (`noteId`,`parentNoteId`);
CREATE INDEX IDX_branches_parentNoteId ON branches (parentNoteId);
CREATE TABLE IF NOT EXISTS "attributes_mig"
(
attributeId TEXT not null primary key,
noteId TEXT not null,
type TEXT not null,
name TEXT not null,
value TEXT default '' not null,
position INT default 0 not null,
utcDateCreated TEXT not null,
utcDateModified TEXT not null,
isDeleted INT not null,
`deleteId` TEXT DEFAULT NULL,
hash TEXT default "" not null,
isInheritable int DEFAULT 0 NULL);
INSERT INTO attributes_mig (attributeId, noteId, type, name, value, position, utcDateCreated, utcDateModified, isDeleted, hash, isInheritable)
SELECT attributeId, noteId, type, name, value, position, utcDateCreated, utcDateModified, isDeleted, hash, isInheritable FROM attributes;
DROP TABLE attributes;
ALTER TABLE attributes_mig RENAME TO attributes;
CREATE INDEX IDX_attributes_name_value
on attributes (name, value);
CREATE INDEX IDX_attributes_noteId_index
on attributes (noteId);
CREATE INDEX IDX_attributes_value_index
on attributes (value);

View File

@@ -0,0 +1 @@
UPDATE notes SET contentLength = COALESCE((SELECT COALESCE(LENGTH(content), 0) FROM note_contents WHERE note_contents.noteId = notes.noteId), -1);

View File

@@ -0,0 +1,22 @@
CREATE TABLE IF NOT EXISTS "sync_mig" (
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`entityName` TEXT NOT NULL,
`entityId` TEXT NOT NULL,
`sourceId` TEXT NOT NULL,
`isSynced` INTEGER default 0 not null,
`utcSyncDate` TEXT NOT NULL);
INSERT INTO sync_mig (id, entityName, entityId, sourceId, isSynced, utcSyncDate)
SELECT id, entityName, entityId, sourceId, 1, utcSyncDate FROM sync;
DROP TABLE sync;
ALTER TABLE sync_mig RENAME TO sync;
CREATE UNIQUE INDEX `IDX_sync_entityName_entityId` ON `sync` (
`entityName`,
`entityId`
);
CREATE INDEX `IDX_sync_utcSyncDate` ON `sync` (
`utcSyncDate`
);

View File

@@ -1,132 +1,133 @@
CREATE TABLE IF NOT EXISTS "sync" (
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`entityName` TEXT NOT NULL,
`entityId` TEXT NOT NULL,
`sourceId` TEXT NOT NULL,
`syncDate` TEXT NOT NULL);
CREATE UNIQUE INDEX `IDX_sync_entityName_entityId` ON `sync` (
`entityName`,
`entityId`
);
CREATE INDEX `IDX_sync_syncDate` ON `sync` (
`syncDate`
);
CREATE TABLE IF NOT EXISTS "source_ids" (
`sourceId` TEXT NOT NULL,
`dateCreated` TEXT NOT NULL,
PRIMARY KEY(`sourceId`)
);
CREATE TABLE IF NOT EXISTS "note_revisions" (
`noteRevisionId` TEXT NOT NULL PRIMARY KEY,
`noteId` TEXT NOT NULL,
`title` TEXT,
`content` TEXT,
`isProtected` INT NOT NULL DEFAULT 0,
`dateModifiedFrom` TEXT NOT NULL,
`dateModifiedTo` TEXT NOT NULL
, type TEXT DEFAULT '' NOT NULL, mime TEXT DEFAULT '' NOT NULL, hash TEXT DEFAULT "" NOT NULL);
CREATE INDEX `IDX_note_revisions_noteId` ON `note_revisions` (
`noteId`
);
CREATE INDEX `IDX_note_revisions_dateModifiedFrom` ON `note_revisions` (
`dateModifiedFrom`
);
CREATE INDEX `IDX_note_revisions_dateModifiedTo` ON `note_revisions` (
`dateModifiedTo`
`sourceId` TEXT NOT NULL,
`utcDateCreated` TEXT NOT NULL,
PRIMARY KEY(`sourceId`)
);
CREATE TABLE IF NOT EXISTS "api_tokens"
(
apiTokenId TEXT PRIMARY KEY NOT NULL,
token TEXT NOT NULL,
dateCreated TEXT NOT NULL,
isDeleted INT NOT NULL DEFAULT 0
, hash TEXT DEFAULT "" NOT NULL);
CREATE TABLE IF NOT EXISTS "branches" (
`branchId` TEXT NOT NULL,
`noteId` TEXT NOT NULL,
`parentNoteId` TEXT NOT NULL,
`notePosition` INTEGER NOT NULL,
`prefix` TEXT,
`isExpanded` BOOLEAN,
`isDeleted` INTEGER NOT NULL DEFAULT 0,
`dateModified` TEXT NOT NULL, hash TEXT DEFAULT "" NOT NULL, dateCreated TEXT NOT NULL DEFAULT '1970-01-01T00:00:00.000Z',
PRIMARY KEY(`branchId`)
);
CREATE INDEX `IDX_branches_noteId` ON `branches` (
`noteId`
);
CREATE INDEX `IDX_branches_noteId_parentNoteId` ON `branches` (
`noteId`,
`parentNoteId`
);
CREATE INDEX IDX_branches_parentNoteId ON branches (parentNoteId);
CREATE TABLE IF NOT EXISTS "recent_notes" (
`branchId` TEXT NOT NULL PRIMARY KEY,
`notePath` TEXT NOT NULL,
hash TEXT DEFAULT "" NOT NULL,
`dateCreated` TEXT NOT NULL,
isDeleted INT
);
CREATE TABLE IF NOT EXISTS "event_log" (
`eventId` TEXT NOT NULL PRIMARY KEY,
`noteId` TEXT,
`comment` TEXT,
`dateCreated` TEXT NOT NULL
);
utcDateCreated TEXT NOT NULL,
isDeleted INT NOT NULL DEFAULT 0,
hash TEXT DEFAULT "" NOT NULL);
CREATE TABLE IF NOT EXISTS "options"
(
name TEXT not null PRIMARY KEY,
value TEXT,
dateModified INT,
isSynced INTEGER default 0 not null,
hash TEXT default "" not null,
dateCreated TEXT default '1970-01-01T00:00:00.000Z' not null
utcDateCreated TEXT not null,
utcDateModified TEXT NOT NULL
);
CREATE TABLE attributes
CREATE TABLE IF NOT EXISTS "note_contents" (
`noteId` TEXT NOT NULL,
`content` TEXT NULL DEFAULT NULL,
`hash` TEXT DEFAULT "" NOT NULL,
`utcDateModified` TEXT NOT NULL,
PRIMARY KEY(`noteId`)
);
CREATE TABLE recent_notes
(
attributeId TEXT not null primary key,
noteId TEXT not null,
type TEXT not null,
name TEXT not null,
value TEXT default '' not null,
position INT default 0 not null,
dateCreated TEXT not null,
dateModified TEXT not null,
isDeleted INT not null,
hash TEXT default "" not null, isInheritable int DEFAULT 0 NULL);
CREATE INDEX IDX_attributes_name_value
on attributes (name, value);
noteId TEXT not null primary key,
notePath TEXT not null,
hash TEXT default "" not null,
utcDateCreated TEXT not null,
isDeleted INT
);
CREATE TABLE IF NOT EXISTS "note_revision_contents" (`noteRevisionId` TEXT NOT NULL PRIMARY KEY,
`content` TEXT,
hash TEXT DEFAULT '' NOT NULL,
`utcDateModified` TEXT NOT NULL);
CREATE TABLE IF NOT EXISTS "note_revisions" (`noteRevisionId` TEXT NOT NULL PRIMARY KEY,
`noteId` TEXT NOT NULL,
`title` TEXT,
`contentLength` INT NOT NULL,
`isErased` INT NOT NULL DEFAULT 0,
`isProtected` INT NOT NULL DEFAULT 0,
`utcDateLastEdited` TEXT NOT NULL,
`utcDateCreated` TEXT NOT NULL,
`utcDateModified` TEXT NOT NULL,
`dateLastEdited` TEXT NOT NULL,
`dateCreated` TEXT NOT NULL,
type TEXT DEFAULT '' NOT NULL,
mime TEXT DEFAULT '' NOT NULL,
hash TEXT DEFAULT '' NOT NULL);
CREATE INDEX `IDX_note_revisions_noteId` ON `note_revisions` (`noteId`);
CREATE INDEX `IDX_note_revisions_utcDateCreated` ON `note_revisions` (`utcDateCreated`);
CREATE INDEX `IDX_note_revisions_utcDateLastEdited` ON `note_revisions` (`utcDateLastEdited`);
CREATE INDEX `IDX_note_revisions_dateCreated` ON `note_revisions` (`dateCreated`);
CREATE INDEX `IDX_note_revisions_dateLastEdited` ON `note_revisions` (`dateLastEdited`);
CREATE INDEX IDX_source_ids_utcDateCreated
on source_ids (utcDateCreated);
CREATE TABLE IF NOT EXISTS "notes" (
`noteId` TEXT NOT NULL,
`title` TEXT NOT NULL DEFAULT "note",
`content` TEXT NULL DEFAULT NULL,
`isProtected` INT NOT NULL DEFAULT 0,
`type` TEXT NOT NULL DEFAULT 'text',
`mime` TEXT NOT NULL DEFAULT 'text/html',
`hash` TEXT DEFAULT "" NOT NULL,
`isDeleted` INT NOT NULL DEFAULT 0,
`dateCreated` TEXT NOT NULL,
`dateModified` TEXT NOT NULL,
PRIMARY KEY(`noteId`)
);
CREATE TABLE IF NOT EXISTS "links" (
`linkId` TEXT NOT NULL,
`noteId` TEXT NOT NULL,
`targetNoteId` TEXT NOT NULL,
`type` TEXT NOT NULL,
`hash` TEXT DEFAULT "" NOT NULL,
`isDeleted` INTEGER NOT NULL DEFAULT 0,
`dateCreated` TEXT NOT NULL,
`dateModified` TEXT NOT NULL,
PRIMARY KEY(`linkId`)
);
CREATE INDEX IDX_links_noteId_index
on links (noteId);
CREATE INDEX IDX_links_targetNoteId_index
on links (targetNoteId);
CREATE INDEX IDX_attributes_name_index
on attributes (name);
`noteId` TEXT NOT NULL,
`title` TEXT NOT NULL DEFAULT "note",
`contentLength` INT NOT NULL,
`isProtected` INT NOT NULL DEFAULT 0,
`type` TEXT NOT NULL DEFAULT 'text',
`mime` TEXT NOT NULL DEFAULT 'text/html',
`hash` TEXT DEFAULT "" NOT NULL,
`isDeleted` INT NOT NULL DEFAULT 0,
`deleteId` TEXT DEFAULT NULL,
`isErased` INT NOT NULL DEFAULT 0,
`dateCreated` TEXT NOT NULL,
`dateModified` TEXT NOT NULL,
`utcDateCreated` TEXT NOT NULL,
`utcDateModified` TEXT NOT NULL,
PRIMARY KEY(`noteId`));
CREATE INDEX `IDX_notes_isDeleted` ON `notes` (`isDeleted`);
CREATE INDEX `IDX_notes_title` ON `notes` (`title`);
CREATE INDEX `IDX_notes_type` ON `notes` (`type`);
CREATE INDEX `IDX_notes_dateCreated` ON `notes` (`dateCreated`);
CREATE INDEX `IDX_notes_dateModified` ON `notes` (`dateModified`);
CREATE INDEX `IDX_notes_utcDateModified` ON `notes` (`utcDateModified`);
CREATE INDEX `IDX_notes_utcDateCreated` ON `notes` (`utcDateCreated`);
CREATE TABLE IF NOT EXISTS "branches" (
`branchId` TEXT NOT NULL,
`noteId` TEXT NOT NULL,
`parentNoteId` TEXT NOT NULL,
`notePosition` INTEGER NOT NULL,
`prefix` TEXT,
`isExpanded` INTEGER NOT NULL DEFAULT 0,
`isDeleted` INTEGER NOT NULL DEFAULT 0,
`deleteId` TEXT DEFAULT NULL,
`utcDateModified` TEXT NOT NULL,
utcDateCreated TEXT NOT NULL,
hash TEXT DEFAULT "" NOT NULL,
PRIMARY KEY(`branchId`));
CREATE INDEX `IDX_branches_noteId_parentNoteId` ON `branches` (`noteId`,`parentNoteId`);
CREATE INDEX IDX_branches_parentNoteId ON branches (parentNoteId);
CREATE TABLE IF NOT EXISTS "attributes"
(
attributeId TEXT not null primary key,
noteId TEXT not null,
type TEXT not null,
name TEXT not null,
value TEXT default '' not null,
position INT default 0 not null,
utcDateCreated TEXT not null,
utcDateModified TEXT not null,
isDeleted INT not null,
`deleteId` TEXT DEFAULT NULL,
hash TEXT default "" not null,
isInheritable int DEFAULT 0 NULL);
CREATE INDEX IDX_attributes_name_value
on attributes (name, value);
CREATE INDEX IDX_attributes_noteId_index
on attributes (noteId);
on attributes (noteId);
CREATE INDEX IDX_attributes_value_index
on attributes (value);
on attributes (value);
CREATE TABLE IF NOT EXISTS "sync" (
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`entityName` TEXT NOT NULL,
`entityId` TEXT NOT NULL,
`sourceId` TEXT NOT NULL,
`isSynced` INTEGER default 0 not null,
`utcSyncDate` TEXT NOT NULL);
CREATE UNIQUE INDEX `IDX_sync_entityName_entityId` ON `sync` (
`entityName`,
`entityId`
);
CREATE INDEX `IDX_sync_utcSyncDate` ON `sync` (
`utcSyncDate`
);

17
docker-compose.yml Normal file
View File

@@ -0,0 +1,17 @@
version: '2.1'
services:
trilium:
build:
context: .
image: zadam/trilium
restart: always
environment:
- TRILIUM_DATA_DIR=/data
ports:
- "8080:8080"
volumes:
- trilium:/data
volumes:
trilium:

View File

@@ -28,7 +28,7 @@
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>ApiToken<span class="signature">(apiTokenId, token, isDeleted, dateCreated)</span><span class="type-signature"></span></h2>
<h2><span class="attribs"><span class="type-signature"></span></span>ApiToken<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">ApiToken is an entity representing token used to authenticate against Trilium API from client applications. Currently used only by Trilium Sender.</div>
@@ -45,7 +45,7 @@
<h4 class="name" id="ApiToken"><span class="type-signature"></span>new ApiToken<span class="signature">(apiTokenId, token, isDeleted, dateCreated)</span><span class="type-signature"></span></h4>
<h4 class="name" id="ApiToken"><span class="type-signature"></span>new ApiToken<span class="signature">()</span><span class="type-signature"></span></h4>
@@ -60,10 +60,15 @@
<h5>Parameters:</h5>
<h5 class="subsection-title">Properties:</h5>
<table class="params">
<table class="props">
<thead>
<tr>
@@ -154,7 +159,7 @@
<tr>
<td class="name"><code>dateCreated</code></td>
<td class="name"><code>utcDateCreated</code></td>
<td class="type">
@@ -180,8 +185,6 @@
<dl class="details">
@@ -239,6 +242,8 @@
</div>
@@ -282,13 +287,13 @@
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

View File

@@ -28,7 +28,7 @@
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>Attribute<span class="signature">(attributeId, noteId, type, name, value, position, isInheritable, isDeleted, dateCreated, dateModified)</span><span class="type-signature"></span></h2>
<h2><span class="attribs"><span class="type-signature"></span></span>Attribute<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">Attribute is key value pair owned by a note.</div>
@@ -45,7 +45,7 @@
<h4 class="name" id="Attribute"><span class="type-signature"></span>new Attribute<span class="signature">(attributeId, noteId, type, name, value, position, isInheritable, isDeleted, dateCreated, dateModified)</span><span class="type-signature"></span></h4>
<h4 class="name" id="Attribute"><span class="type-signature"></span>new Attribute<span class="signature">()</span><span class="type-signature"></span></h4>
@@ -60,10 +60,15 @@
<h5>Parameters:</h5>
<h5 class="subsection-title">Properties:</h5>
<table class="params">
<table class="props">
<thead>
<tr>
@@ -269,7 +274,33 @@
<tr>
<td class="name"><code>dateCreated</code></td>
<td class="name"><code>deleteId</code></td>
<td class="type">
<span class="param-type">string</span>
|
<span class="param-type">null</span>
</td>
<td class="description last">ID identifying delete transaction</td>
</tr>
<tr>
<td class="name"><code>utcDateCreated</code></td>
<td class="type">
@@ -292,7 +323,7 @@
<tr>
<td class="name"><code>dateModified</code></td>
<td class="name"><code>utcDateModified</code></td>
<td class="type">
@@ -318,8 +349,6 @@
<dl class="details">
@@ -349,7 +378,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_attribute.js.html">entities/attribute.js</a>, <a href="entities_attribute.js.html#line24">line 24</a>
<a href="entities_attribute.js.html">entities/attribute.js</a>, <a href="entities_attribute.js.html#line30">line 30</a>
</li></ul></dd>
@@ -377,6 +406,8 @@
</div>
@@ -462,7 +493,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_attribute.js.html">entities/attribute.js</a>, <a href="entities_attribute.js.html#line46">line 46</a>
<a href="entities_attribute.js.html">entities/attribute.js</a>, <a href="entities_attribute.js.html#line47">line 47</a>
</li></ul></dd>
@@ -485,6 +516,8 @@
<h5>Returns:</h5>
@@ -562,7 +595,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_attribute.js.html">entities/attribute.js</a>, <a href="entities_attribute.js.html#line57">line 57</a>
<a href="entities_attribute.js.html">entities/attribute.js</a>, <a href="entities_attribute.js.html#line54">line 54</a>
</li></ul></dd>
@@ -585,6 +618,8 @@
<h5>Returns:</h5>
@@ -662,7 +697,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_attribute.js.html">entities/attribute.js</a>, <a href="entities_attribute.js.html#line76">line 76</a>
<a href="entities_attribute.js.html">entities/attribute.js</a>, <a href="entities_attribute.js.html#line69">line 69</a>
</li></ul></dd>
@@ -685,6 +720,8 @@
<h5>Returns:</h5>
@@ -724,13 +761,13 @@
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

File diff suppressed because it is too large Load Diff

View File

@@ -28,7 +28,7 @@
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>Branch<span class="signature">(branchId, noteId, parentNoteId, notePosition, prefix, isExpanded, isDeleted, dateModified, dateCreated)</span><span class="type-signature"></span></h2>
<h2><span class="attribs"><span class="type-signature"></span></span>Branch<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">Branch represents note's placement in the tree - it's essentially pair of noteId and parentNoteId.
Each note can have multiple (at least one) branches, meaning it can be placed into multiple places in the tree.</div>
@@ -46,7 +46,7 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
<h4 class="name" id="Branch"><span class="type-signature"></span>new Branch<span class="signature">(branchId, noteId, parentNoteId, notePosition, prefix, isExpanded, isDeleted, dateModified, dateCreated)</span><span class="type-signature"></span></h4>
<h4 class="name" id="Branch"><span class="type-signature"></span>new Branch<span class="signature">()</span><span class="type-signature"></span></h4>
@@ -61,10 +61,15 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
<h5>Parameters:</h5>
<h5 class="subsection-title">Properties:</h5>
<table class="params">
<table class="props">
<thead>
<tr>
@@ -247,7 +252,33 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
<tr>
<td class="name"><code>dateModified</code></td>
<td class="name"><code>deleteId</code></td>
<td class="type">
<span class="param-type">string</span>
|
<span class="param-type">null</span>
</td>
<td class="description last">ID identifying delete transaction</td>
</tr>
<tr>
<td class="name"><code>utcDateModified</code></td>
<td class="type">
@@ -270,7 +301,7 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
<tr>
<td class="name"><code>dateCreated</code></td>
<td class="name"><code>utcDateCreated</code></td>
<td class="type">
@@ -296,8 +327,6 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
<dl class="details">
@@ -327,7 +356,7 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line24">line 24</a>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line25">line 25</a>
</li></ul></dd>
@@ -355,6 +384,8 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
</div>
@@ -392,7 +423,7 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
<h4 class="name" id="getNote"><span class="type-signature">(async) </span>getNote<span class="signature">()</span><span class="type-signature"> &rarr; {<a href="Note.html">Note</a>|null}</span></h4>
<h4 class="name" id="getNote"><span class="type-signature">(async) </span>getNote<span class="signature">()</span><span class="type-signature"> &rarr; {Promise.&lt;(<a href="Note.html">Note</a>|null)>}</span></h4>
@@ -440,7 +471,7 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line38">line 38</a>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line32">line 32</a>
</li></ul></dd>
@@ -463,6 +494,8 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
<h5>Returns:</h5>
@@ -474,10 +507,109 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
</dt>
<dd>
<span class="param-type"><a href="Note.html">Note</a></span>
|
<span class="param-type">Promise.&lt;(<a href="Note.html">Note</a>|null)></span>
<span class="param-type">null</span>
</dd>
</dl>
<h4 class="name" id="getParentNote"><span class="type-signature">(async) </span>getParentNote<span class="signature">()</span><span class="type-signature"> &rarr; {Promise.&lt;(<a href="Note.html">Note</a>|null)>}</span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line37">line 37</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">Promise.&lt;(<a href="Note.html">Note</a>|null)></span>
</dd>
@@ -505,13 +637,13 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

View File

@@ -178,6 +178,8 @@
</div>
@@ -210,13 +212,13 @@
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

View File

@@ -28,7 +28,7 @@
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>Link<span class="signature">(linkId, noteId, targetNoteId, type, isDeleted, dateModified, dateCreated)</span><span class="type-signature"></span></h2>
<h2><span class="attribs"><span class="type-signature"></span></span>Link<span class="signature">(linkId, noteId, targetNoteId, type, isDeleted, utcDateModified, utcDateCreated)</span><span class="type-signature"></span></h2>
<div class="class-description">This class represents link from one note to another in the form of hyperlink or image reference. Note that
this is different concept than attribute/relation.</div>
@@ -46,7 +46,7 @@ this is different concept than attribute/relation.</div>
<h4 class="name" id="Link"><span class="type-signature"></span>new Link<span class="signature">(linkId, noteId, targetNoteId, type, isDeleted, dateModified, dateCreated)</span><span class="type-signature"></span></h4>
<h4 class="name" id="Link"><span class="type-signature"></span>new Link<span class="signature">(linkId, noteId, targetNoteId, type, isDeleted, utcDateModified, utcDateCreated)</span><span class="type-signature"></span></h4>
@@ -201,7 +201,7 @@ this is different concept than attribute/relation.</div>
<tr>
<td class="name"><code>dateModified</code></td>
<td class="name"><code>utcDateModified</code></td>
<td class="type">
@@ -224,7 +224,7 @@ this is different concept than attribute/relation.</div>
<tr>
<td class="name"><code>dateCreated</code></td>
<td class="name"><code>utcDateCreated</code></td>
<td class="type">

File diff suppressed because it is too large Load Diff

View File

@@ -28,7 +28,7 @@
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>NoteRevision<span class="signature">(noteRevisionId, noteId, type, mime, title, content, isProtected, dateModifiedFrom, dateModifiedTo)</span><span class="type-signature"></span></h2>
<h2><span class="attribs"><span class="type-signature"></span></span>NoteRevision<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">NoteRevision represents snapshot of note's title and content at some point in the past. It's used for seamless note versioning.</div>
@@ -45,7 +45,7 @@
<h4 class="name" id="NoteRevision"><span class="type-signature"></span>new NoteRevision<span class="signature">(noteRevisionId, noteId, type, mime, title, content, isProtected, dateModifiedFrom, dateModifiedTo)</span><span class="type-signature"></span></h4>
<h4 class="name" id="NoteRevision"><span class="type-signature"></span>new NoteRevision<span class="signature">()</span><span class="type-signature"></span></h4>
@@ -60,10 +60,15 @@
<h5>Parameters:</h5>
<h5 class="subsection-title">Properties:</h5>
<table class="params">
<table class="props">
<thead>
<tr>
@@ -200,13 +205,36 @@
<tr>
<td class="name"><code>content</code></td>
<td class="name"><code>contentLength</code></td>
<td class="type">
<span class="param-type">string</span>
<span class="param-type">int</span>
</td>
<td class="description last"></td>
</tr>
<tr>
<td class="name"><code>isErased</code></td>
<td class="type">
<span class="param-type">boolean</span>
@@ -229,7 +257,7 @@
<td class="type">
<span class="param-type">string</span>
<span class="param-type">boolean</span>
@@ -246,7 +274,7 @@
<tr>
<td class="name"><code>dateModifiedFrom</code></td>
<td class="name"><code>dateLastEdited</code></td>
<td class="type">
@@ -269,7 +297,76 @@
<tr>
<td class="name"><code>dateModifiedTo</code></td>
<td class="name"><code>dateCreated</code></td>
<td class="type">
<span class="param-type">string</span>
</td>
<td class="description last"></td>
</tr>
<tr>
<td class="name"><code>utcDateLastEdited</code></td>
<td class="type">
<span class="param-type">string</span>
</td>
<td class="description last"></td>
</tr>
<tr>
<td class="name"><code>utcDateCreated</code></td>
<td class="type">
<span class="param-type">string</span>
</td>
<td class="description last"></td>
</tr>
<tr>
<td class="name"><code>utcDateModified</code></td>
<td class="type">
@@ -295,8 +392,6 @@
<dl class="details">
@@ -326,7 +421,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note_revision.js.html">entities/note_revision.js</a>, <a href="entities_note_revision.js.html#line22">line 22</a>
<a href="entities_note_revision.js.html">entities/note_revision.js</a>, <a href="entities_note_revision.js.html#line35">line 35</a>
</li></ul></dd>
@@ -354,6 +449,8 @@
</div>
@@ -383,6 +480,320 @@
<h3 class="subsection-title">Methods</h3>
<h4 class="name" id="getContent"><span class="type-signature">(async) </span>getContent<span class="signature">()</span><span class="type-signature"> &rarr; {Promise.&lt;*>}</span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note_revision.js.html">entities/note_revision.js</a>, <a href="entities_note_revision.js.html#line69">line 69</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">Promise.&lt;*></span>
</dd>
</dl>
<h4 class="name" id="isStringNote"><span class="type-signature"></span>isStringNote<span class="signature">()</span><span class="type-signature"> &rarr; {boolean}</span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note_revision.js.html">entities/note_revision.js</a>, <a href="entities_note_revision.js.html#line55">line 55</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<div class="param-desc">
true if the note has string content (not binary)
</div>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">boolean</span>
</dd>
</dl>
<h4 class="name" id="setContent"><span class="type-signature">(async) </span>setContent<span class="signature">()</span><span class="type-signature"> &rarr; {Promise}</span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note_revision.js.html">entities/note_revision.js</a>, <a href="entities_note_revision.js.html#line105">line 105</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">Promise</span>
</dd>
</dl>
@@ -397,13 +808,13 @@
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

View File

@@ -28,7 +28,7 @@
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>Option<span class="signature">(name, value, isSynced, dateModified, dateCreated)</span><span class="type-signature"></span></h2>
<h2><span class="attribs"><span class="type-signature"></span></span>Option<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">Option represents name-value pair, either directly configurable by the user or some system property.</div>
@@ -45,7 +45,7 @@
<h4 class="name" id="Option"><span class="type-signature"></span>new Option<span class="signature">(name, value, isSynced, dateModified, dateCreated)</span><span class="type-signature"></span></h4>
<h4 class="name" id="Option"><span class="type-signature"></span>new Option<span class="signature">()</span><span class="type-signature"></span></h4>
@@ -60,10 +60,15 @@
<h5>Parameters:</h5>
<h5 class="subsection-title">Properties:</h5>
<table class="params">
<table class="props">
<thead>
<tr>
@@ -154,7 +159,7 @@
<tr>
<td class="name"><code>dateModified</code></td>
<td class="name"><code>utcDateModified</code></td>
<td class="type">
@@ -177,7 +182,7 @@
<tr>
<td class="name"><code>dateCreated</code></td>
<td class="name"><code>utcDateCreated</code></td>
<td class="type">
@@ -203,8 +208,6 @@
<dl class="details">
@@ -234,7 +237,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_option.js.html">entities/option.js</a>, <a href="entities_option.js.html#line17">line 17</a>
<a href="entities_option.js.html">entities/option.js</a>, <a href="entities_option.js.html#line22">line 22</a>
</li></ul></dd>
@@ -262,6 +265,8 @@
</div>
@@ -305,13 +310,13 @@
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

View File

@@ -28,7 +28,7 @@
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>RecentNote<span class="signature">(branchId, notePath, isDeleted, dateModified)</span><span class="type-signature"></span></h2>
<h2><span class="attribs"><span class="type-signature"></span></span>RecentNote<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">RecentNote represents recently visited note.</div>
@@ -45,7 +45,7 @@
<h4 class="name" id="RecentNote"><span class="type-signature"></span>new RecentNote<span class="signature">(branchId, notePath, isDeleted, dateModified)</span><span class="type-signature"></span></h4>
<h4 class="name" id="RecentNote"><span class="type-signature"></span>new RecentNote<span class="signature">()</span><span class="type-signature"></span></h4>
@@ -60,10 +60,15 @@
<h5>Parameters:</h5>
<h5 class="subsection-title">Properties:</h5>
<table class="params">
<table class="props">
<thead>
<tr>
@@ -85,7 +90,7 @@
<tr>
<td class="name"><code>branchId</code></td>
<td class="name"><code>noteId</code></td>
<td class="type">
@@ -154,7 +159,7 @@
<tr>
<td class="name"><code>dateModified</code></td>
<td class="name"><code>utcDateModified</code></td>
<td class="type">
@@ -180,8 +185,6 @@
<dl class="details">
@@ -239,6 +242,8 @@
</div>
@@ -282,13 +287,13 @@
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

View File

@@ -34,25 +34,25 @@ const dateUtils = require('../services/date_utils');
/**
* ApiToken is an entity representing token used to authenticate against Trilium API from client applications. Currently used only by Trilium Sender.
*
* @param {string} apiTokenId - primary key
* @param {string} token
* @param {boolean} isDeleted - true if API token is deleted
* @param {string} dateCreated
* @property {string} apiTokenId - primary key
* @property {string} token
* @property {boolean} isDeleted - true if API token is deleted
* @property {string} utcDateCreated
*
* @extends Entity
*/
class ApiToken extends Entity {
static get entityName() { return "api_tokens"; }
static get primaryKeyName() { return "apiTokenId"; }
static get hashedProperties() { return ["apiTokenId", "token", "dateCreated", "isDeleted"]; }
static get hashedProperties() { return ["apiTokenId", "token", "utcDateCreated", "isDeleted"]; }
beforeSaving() {
if (!this.isDeleted) {
this.isDeleted = false;
}
if (!this.dateCreated) {
this.dateCreated = dateUtils.nowDate();
if (!this.utcDateCreated) {
this.utcDateCreated = dateUtils.utcNowDateTime();
}
super.beforeSaving();
@@ -69,13 +69,13 @@ module.exports = ApiToken;</code></pre>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

View File

@@ -36,23 +36,24 @@ const sql = require('../services/sql');
/**
* Attribute is key value pair owned by a note.
*
* @param {string} attributeId
* @param {string} noteId
* @param {string} type
* @param {string} name
* @param {string} value
* @param {int} position
* @param {boolean} isInheritable
* @param {boolean} isDeleted
* @param {string} dateCreated
* @param {string} dateModified
* @property {string} attributeId
* @property {string} noteId
* @property {string} type
* @property {string} name
* @property {string} value
* @property {int} position
* @property {boolean} isInheritable
* @property {boolean} isDeleted
* @property {string|null} deleteId - ID identifying delete transaction
* @property {string} utcDateCreated
* @property {string} utcDateModified
*
* @extends Entity
*/
class Attribute extends Entity {
static get entityName() { return "attributes"; }
static get primaryKeyName() { return "attributeId"; }
static get hashedProperties() { return ["attributeId", "noteId", "type", "name", "value", "isInheritable", "isDeleted", "dateCreated"]; }
static get hashedProperties() { return ["attributeId", "noteId", "type", "name", "value", "isInheritable", "isDeleted", "utcDateCreated"]; }
constructor(row) {
super(row);
@@ -72,11 +73,7 @@ class Attribute extends Entity {
* @returns {Promise&lt;Note|null>}
*/
async getNote() {
if (!this.__note) {
this.__note = await repository.getEntity("SELECT * FROM notes WHERE noteId = ?", [this.noteId]);
}
return this.__note;
return await repository.getNote(this.noteId);
}
/**
@@ -91,11 +88,7 @@ class Attribute extends Entity {
return null;
}
if (!this.__targetNote) {
this.__targetNote = await repository.getEntity("SELECT * FROM notes WHERE noteId = ?", [this.value]);
}
return this.__targetNote;
return await repository.getNote(this.value);
}
/**
@@ -107,6 +100,10 @@ class Attribute extends Entity {
async beforeSaving() {
if (!this.value) {
if (this.type === 'relation') {
throw new Error(`Cannot save relation ${this.name} since it does not target any note.`);
}
// null value isn't allowed
this.value = "";
}
@@ -123,16 +120,36 @@ class Attribute extends Entity {
this.isDeleted = false;
}
if (!this.dateCreated) {
this.dateCreated = dateUtils.nowDate();
if (!this.utcDateCreated) {
this.utcDateCreated = dateUtils.utcNowDateTime();
}
super.beforeSaving();
if (this.isChanged) {
this.dateModified = dateUtils.nowDate();
this.utcDateModified = dateUtils.utcNowDateTime();
}
}
// cannot be static!
updatePojo(pojo) {
delete pojo.isOwned;
delete pojo.__note;
}
createClone(type, name, value) {
return new Attribute({
noteId: this.noteId,
type: type,
name: name,
value: value,
position: this.position,
isInheritable: this.isInheritable,
isDeleted: false,
utcDateCreated: this.utcDateCreated,
utcDateModified: this.utcDateModified
});
}
}
module.exports = Attribute;</code></pre>
@@ -145,13 +162,13 @@ module.exports = Attribute;</code></pre>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

View File

@@ -37,15 +37,16 @@ const sql = require('../services/sql');
* Branch represents note's placement in the tree - it's essentially pair of noteId and parentNoteId.
* Each note can have multiple (at least one) branches, meaning it can be placed into multiple places in the tree.
*
* @param {string} branchId - primary key
* @param {string} noteId
* @param {string} parentNoteId
* @param {int} notePosition
* @param {string} prefix
* @param {boolean} isExpanded
* @param {boolean} isDeleted
* @param {string} dateModified
* @param {string} dateCreated
* @property {string} branchId - primary key
* @property {string} noteId
* @property {string} parentNoteId
* @property {int} notePosition
* @property {string} prefix
* @property {boolean} isExpanded
* @property {boolean} isDeleted
* @property {string|null} deleteId - ID identifying delete transaction
* @property {string} utcDateModified
* @property {string} utcDateCreated
*
* @extends Entity
*/
@@ -53,40 +54,55 @@ class Branch extends Entity {
static get entityName() { return "branches"; }
static get primaryKeyName() { return "branchId"; }
// notePosition is not part of hash because it would produce a lot of updates in case of reordering
static get hashedProperties() { return ["branchId", "noteId", "parentNoteId", "isDeleted", "prefix"]; }
static get hashedProperties() { return ["branchId", "noteId", "parentNoteId", "isDeleted", "deleteId", "prefix"]; }
constructor(row = {}) {
super(row);
// used to detect move in note tree
this.origParentNoteId = this.parentNoteId;
/** @returns {Promise&lt;Note|null>} */
async getNote() {
return await repository.getNote(this.noteId);
}
/** @returns {Note|null} */
async getNote() {
return await repository.getEntity("SELECT * FROM notes WHERE noteId = ?", [this.noteId]);
/** @returns {Promise&lt;Note|null>} */
async getParentNote() {
return await repository.getNote(this.parentNoteId);
}
async beforeSaving() {
if (this.notePosition === undefined) {
const maxNotePos = await sql.getValue('SELECT MAX(notePosition) FROM branches WHERE parentNoteId = ? AND isDeleted = 0', [this.parentNoteId]);
this.notePosition = maxNotePos === null ? 0 : maxNotePos + 1;
this.notePosition = maxNotePos === null ? 0 : maxNotePos + 10;
}
if (!this.isExpanded) {
this.isExpanded = false;
}
if (!this.isDeleted) {
this.isDeleted = false;
}
if (!this.dateCreated) {
this.dateCreated = dateUtils.nowDate();
if (!this.utcDateCreated) {
this.utcDateCreated = dateUtils.utcNowDateTime();
}
super.beforeSaving();
if (this.isChanged) {
this.dateModified = dateUtils.nowDate();
this.utcDateModified = dateUtils.utcNowDateTime();
}
}
createClone(parentNoteId, notePosition) {
return new Branch({
noteId: this.noteId,
parentNoteId: parentNoteId,
notePosition: notePosition,
prefix: this.prefix,
isExpanded: this.isExpanded,
isDeleted: false,
utcDateCreated: this.utcDateCreated,
utcDateModified: this.utcDateModified
});
}
}
module.exports = Branch;</code></pre>
@@ -99,13 +115,13 @@ module.exports = Branch;</code></pre>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

View File

@@ -36,7 +36,10 @@ class Entity {
*/
constructor(row = {}) {
for (const key in row) {
this[key] = row[key];
// ! is used when joint-fetching notes and note_contents objects for performance
if (!key.startsWith('!')) {
this[key] = row[key];
}
}
if ('isDeleted' in this) {
@@ -51,7 +54,13 @@ class Entity {
this.hash = this.generateHash();
this.isChanged = origHash !== this.hash;
if (this.forcedChange) {
this.isChanged = true;
delete this.forcedChange;
}
else {
this.isChanged = origHash !== this.hash;
}
}
generateIdIfNecessary() {
@@ -87,13 +96,13 @@ module.exports = Entity;</code></pre>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

View File

@@ -41,15 +41,15 @@ const dateUtils = require('../services/date_utils');
* @param {string} targetNoteId
* @param {string} type
* @param {boolean} isDeleted
* @param {string} dateModified
* @param {string} dateCreated
* @param {string} utcDateModified
* @param {string} utcDateCreated
*
* @extends Entity
*/
class Link extends Entity {
static get entityName() { return "links"; }
static get primaryKeyName() { return "linkId"; }
static get hashedProperties() { return ["linkId", "noteId", "targetNoteId", "type", "isDeleted", "dateCreated", "dateModified"]; }
static get hashedProperties() { return ["linkId", "noteId", "targetNoteId", "type", "isDeleted", "utcDateCreated", "utcDateModified"]; }
async getNote() {
return await repository.getEntity("SELECT * FROM notes WHERE noteId = ?", [this.noteId]);
@@ -64,14 +64,14 @@ class Link extends Entity {
this.isDeleted = false;
}
if (!this.dateCreated) {
this.dateCreated = dateUtils.nowDate();
if (!this.utcDateCreated) {
this.utcDateCreated = dateUtils.utcNowDateTime();
}
super.beforeSaving();
if (this.isChanged) {
this.dateModified = dateUtils.nowDate();
this.utcDateModified = dateUtils.utcNowDateTime();
}
}
}

View File

@@ -32,7 +32,10 @@ const Entity = require('./entity');
const Attribute = require('./attribute');
const protectedSessionService = require('../services/protected_session');
const repository = require('../services/repository');
const sql = require('../services/sql');
const utils = require('../services/utils');
const dateUtils = require('../services/date_utils');
const syncTableService = require('../services/sync_table');
const LABEL = 'label';
const LABEL_DEFINITION = 'label-definition';
@@ -46,18 +49,22 @@ const RELATION_DEFINITION = 'relation-definition';
* @property {string} type - one of "text", "code", "file" or "render"
* @property {string} mime - MIME type, e.g. "text/html"
* @property {string} title - note title
* @property {string} content - note content - e.g. HTML text for text notes, file payload for files
* @property {int} contentLength - length of content
* @property {boolean} isProtected - true if note is protected
* @property {boolean} isDeleted - true if note is deleted
* @property {string} dateCreated
* @property {string} dateModified
* @property {string|null} deleteId - ID identifying delete transaction
* @property {boolean} isErased - true if note's content is erased after it has been deleted
* @property {string} dateCreated - local date time (with offset)
* @property {string} dateModified - local date time (with offset)
* @property {string} utcDateCreated
* @property {string} utcDateModified
*
* @extends Entity
*/
class Note extends Entity {
static get entityName() { return "notes"; }
static get primaryKeyName() { return "noteId"; }
static get hashedProperties() { return ["noteId", "title", "content", "type", "isProtected", "isDeleted"]; }
static get hashedProperties() { return ["noteId", "title", "type", "mime", "isProtected", "isDeleted", "deleteId"]; }
/**
* @param row - object containing database row from "notes" table
@@ -66,7 +73,7 @@ class Note extends Entity {
super(row);
this.isProtected = !!this.isProtected;
/* true if content (meaning any kind of potentially encrypted content) is either not encrypted
/* true if content is either not encrypted
* or encrypted, but with available protected session (so effectively decrypted) */
this.isContentAvailable = true;
@@ -74,19 +81,110 @@ class Note extends Entity {
if (this.isProtected &amp;&amp; this.noteId) {
this.isContentAvailable = protectedSessionService.isProtectedSessionAvailable();
protectedSessionService.decryptNote(this);
if (this.isContentAvailable) {
this.title = protectedSessionService.decryptString(this.title);
}
else {
this.title = "[protected]";
}
}
this.setContent(this.content);
}
setContent(content) {
/*
* Note content has quite special handling - it's not a separate entity, but a lazily loaded
* part of Note entity with it's own sync. Reasons behind this hybrid design has been:
*
* - content can be quite large and it's not necessary to load it / fill memory for any note access even if we don't need a content, especially for bulk operations like search
* - changes in the note metadata or title should not trigger note content sync (so we keep separate utcDateModified and sync rows)
* - but to the user note content and title changes are one and the same - single dateModified (so all changes must go through Note and content is not a separate entity)
*/
/** @returns {Promise&lt;*>} */
async getContent(silentNotFoundError = false) {
if (this.content === undefined) {
const res = await sql.getRow(`SELECT content, hash FROM note_contents WHERE noteId = ?`, [this.noteId]);
if (!res) {
if (silentNotFoundError) {
return undefined;
}
else {
throw new Error("Cannot find note content for noteId=" + this.noteId);
}
}
this.content = res.content;
if (this.isProtected) {
if (this.isContentAvailable) {
this.content = this.content === null ? null : protectedSessionService.decrypt(this.content);
}
else {
this.content = "";
}
}
}
if (this.isStringNote()) {
return this.content === null
? ""
: this.content.toString("UTF-8");
}
else {
return this.content;
}
}
/** @returns {Promise&lt;*>} */
async getJsonContent() {
const content = await this.getContent();
if (!content || !content.trim()) {
return null;
}
return JSON.parse(content);
}
/** @returns {Promise} */
async setContent(content) {
if (content === null || content === undefined) {
throw new Error(`Cannot set null content to note ${this.noteId}`);
}
content = Buffer.isBuffer(content) ? content : Buffer.from(content);
// force updating note itself so that dateModified is represented correctly even for the content
this.forcedChange = true;
this.contentLength = content.byteLength;
await this.save();
this.content = content;
try {
this.jsonContent = JSON.parse(this.content);
const pojo = {
noteId: this.noteId,
content: content,
utcDateModified: dateUtils.utcNowDateTime(),
hash: utils.hash(this.noteId + "|" + content.toString())
};
if (this.isProtected) {
if (this.isContentAvailable) {
pojo.content = protectedSessionService.encrypt(pojo.content);
}
else {
throw new Error(`Cannot update content of noteId=${this.noteId} since we're out of protected session.`);
}
}
catch(e) {}
await sql.upsert("note_contents", "noteId", pojo);
await syncTableService.addNoteContentSync(this.noteId);
}
/** @returns {Promise} */
async setJsonContent(content) {
await this.setContent(JSON.stringify(content, null, '\t'));
}
/** @returns {boolean} true if this note is the root of the note tree. Root note has "root" noteId */
@@ -102,7 +200,9 @@ class Note extends Entity {
/** @returns {boolean} true if this note is JavaScript (code or attachment) */
isJavaScript() {
return (this.type === "code" || this.type === "file")
&amp;&amp; (this.mime.startsWith("application/javascript") || this.mime === "application/x-javascript");
&amp;&amp; (this.mime.startsWith("application/javascript")
|| this.mime === "application/x-javascript"
|| this.mime === "text/javascript");
}
/** @returns {boolean} true if this note is HTML */
@@ -110,6 +210,11 @@ class Note extends Entity {
return (this.type === "code" || this.type === "file" || this.type === "render") &amp;&amp; this.mime === "text/html";
}
/** @returns {boolean} true if the note has string content (not binary) */
isStringNote() {
return utils.isStringNote(this.type, this.mime);
}
/** @returns {string} JS script environment - either "frontend" or "backend" */
getScriptEnv() {
if (this.isHtml() || (this.isJavaScript() &amp;&amp; this.mime.endsWith('env=frontend'))) {
@@ -127,11 +232,47 @@ class Note extends Entity {
return null;
}
async loadOwnedAttributesToCache() {
this.__ownedAttributeCache = await repository.getEntities(`SELECT * FROM attributes WHERE isDeleted = 0 AND noteId = ?`, [this.noteId]);
return this.__ownedAttributeCache;
}
/**
* @returns {Promise&lt;Attribute[]>} attributes belonging to this specific note (excludes inherited attributes)
* This method is a faster variant of getAttributes() which looks for only owned attributes.
* Use when inheritance is not needed and/or in batch/performance sensitive operations.
*
* @param {string} [type] - (optional) attribute type to filter
* @param {string} [name] - (optional) attribute name to filter
* @returns {Promise&lt;Attribute[]>} note's "owned" attributes - excluding inherited ones
*/
async getOwnedAttributes() {
return await repository.getEntities(`SELECT * FROM attributes WHERE isDeleted = 0 AND noteId = ?`, [this.noteId]);
async getOwnedAttributes(type, name) {
if (!this.__ownedAttributeCache) {
await this.loadOwnedAttributesToCache();
}
if (type &amp;&amp; name) {
return this.__ownedAttributeCache.filter(attr => attr.type === type &amp;&amp; attr.name === name);
}
else if (type) {
return this.__ownedAttributeCache.filter(attr => attr.type === type);
}
else if (name) {
return this.__ownedAttributeCache.filter(attr => attr.name === name);
}
else {
return this.__ownedAttributeCache.slice();
}
}
/**
* @returns {Promise&lt;Attribute>} attribute belonging to this specific note (excludes inherited attributes)
*
* This method can be significantly faster than the getAttribute()
*/
async getOwnedAttribute(type, name) {
const attrs = await this.getOwnedAttributes(type, name);
return attrs.length > 0 ? attrs[0] : null;
}
/**
@@ -142,19 +283,26 @@ class Note extends Entity {
}
/**
* @param {string} [name] - attribute name to filter
* @param {string} [type] - (optional) attribute type to filter
* @param {string} [name] - (optional) attribute name to filter
* @returns {Promise&lt;Attribute[]>} all note's attributes, including inherited ones
*/
async getAttributes(name) {
async getAttributes(type, name) {
if (!this.__attributeCache) {
await this.loadAttributesToCache();
}
if (name) {
if (type &amp;&amp; name) {
return this.__attributeCache.filter(attr => attr.type === type &amp;&amp; attr.name === name);
}
else if (type) {
return this.__attributeCache.filter(attr => attr.type === type);
}
else if (name) {
return this.__attributeCache.filter(attr => attr.name === name);
}
else {
return this.__attributeCache;
return this.__attributeCache.slice();
}
}
@@ -163,7 +311,15 @@ class Note extends Entity {
* @returns {Promise&lt;Attribute[]>} all note's labels (attributes with type label), including inherited ones
*/
async getLabels(name) {
return (await this.getAttributes(name)).filter(attr => attr.type === LABEL);
return await this.getAttributes(LABEL, name);
}
/**
* @param {string} [name] - label name to filter
* @returns {Promise&lt;Attribute[]>} all note's labels (attributes with type label), excluding inherited ones
*/
async getOwnedLabels(name) {
return await this.getOwnedAttributes(LABEL, name);
}
/**
@@ -171,7 +327,7 @@ class Note extends Entity {
* @returns {Promise&lt;Attribute[]>} all note's label definitions, including inherited ones
*/
async getLabelDefinitions(name) {
return (await this.getAttributes(name)).filter(attr => attr.type === LABEL_DEFINITION);
return await this.getAttributes(LABEL_DEFINITION, name);
}
/**
@@ -179,7 +335,30 @@ class Note extends Entity {
* @returns {Promise&lt;Attribute[]>} all note's relations (attributes with type relation), including inherited ones
*/
async getRelations(name) {
return (await this.getAttributes(name)).filter(attr => attr.type === RELATION);
return await this.getAttributes(RELATION, name);
}
/**
* @param {string} [name] - relation name to filter
* @returns {Promise&lt;Attribute[]>} all note's relations (attributes with type relation), excluding inherited ones
*/
async getOwnedRelations(name) {
return await this.getOwnedAttributes(RELATION, name);
}
/**
* @param {string} [name] - relation name to filter
* @returns {Promise&lt;Note[]>}
*/
async getRelationTargets(name) {
const relations = await this.getRelations(name);
const targets = [];
for (const relation of relations) {
targets.push(await relation.getTargetNote());
}
return targets;
}
/**
@@ -187,7 +366,7 @@ class Note extends Entity {
* @returns {Promise&lt;Attribute[]>} all note's relation definitions including inherited ones
*/
async getRelationDefinitions(name) {
return (await this.getAttributes(name)).filter(attr => attr.type === RELATION_DEFINITION);
return await this.getAttributes(RELATION_DEFINITION, name);
}
/**
@@ -196,6 +375,7 @@ class Note extends Entity {
*/
invalidateAttributeCache() {
this.__attributeCache = null;
this.__ownedAttributeCache = null;
}
/** @returns {Promise&lt;void>} */
@@ -205,29 +385,33 @@ class Note extends Entity {
tree(noteId, level) AS (
SELECT ?, 0
UNION
SELECT branches.parentNoteId, tree.level + 1 FROM branches
SELECT branches.parentNoteId, tree.level + 1
FROM branches
JOIN tree ON branches.noteId = tree.noteId
JOIN notes ON notes.noteId = branches.parentNoteId
WHERE notes.isDeleted = 0
AND branches.isDeleted = 0
WHERE branches.isDeleted = 0
),
treeWithAttrs(noteId, level) AS (
SELECT * FROM tree
UNION
SELECT attributes.value, treeWithAttrs.level + 1 FROM attributes
SELECT attributes.value, treeWithAttrs.level FROM attributes
JOIN treeWithAttrs ON treeWithAttrs.noteId = attributes.noteId
WHERE attributes.isDeleted = 0
AND attributes.type = 'relation'
AND attributes.name = 'template'
AND (attributes.noteId = ? OR attributes.isInheritable = 1)
AND (treeWithAttrs.level = 0 OR attributes.isInheritable = 1)
)
SELECT attributes.* FROM attributes JOIN treeWithAttrs ON attributes.noteId = treeWithAttrs.noteId
WHERE attributes.isDeleted = 0 AND (attributes.isInheritable = 1 OR attributes.noteId = ?)
ORDER BY level, noteId, position`, [this.noteId, this.noteId, this.noteId]);
WHERE attributes.isDeleted = 0 AND (attributes.isInheritable = 1 OR treeWithAttrs.level = 0)
ORDER BY level, noteId, position`, [this.noteId]);
// attributes are ordered so that "closest" attributes are first
// we order by noteId so that attributes from same note stay together. Actual noteId ordering doesn't matter.
const filteredAttributes = attributes.filter((attr, index) => {
// if this exact attribute already appears then don't include it (can happen via cloning)
if (attributes.findIndex(it => it.attributeId === attr.attributeId) !== index) {
return false;
}
if (attr.isDefinition()) {
const firstDefinitionIndex = attributes.findIndex(el => el.type === attr.type &amp;&amp; el.name === attr.name);
@@ -271,6 +455,15 @@ class Note extends Entity {
return !!await this.getAttribute(type, name);
}
/**
* @param {string} type - attribute type (label, relation, etc.)
* @param {string} name - attribute name
* @returns {Promise&lt;boolean>} true if note has an attribute with given type and name (excluding inherited)
*/
async hasOwnedAttribute(type, name) {
return !!await this.getOwnedAttribute(type, name);
}
/**
* @param {string} type - attribute type (label, relation, etc.)
* @param {string} name - attribute name
@@ -285,7 +478,7 @@ class Note extends Entity {
/**
* @param {string} type - attribute type (label, relation, etc.)
* @param {string} name - attribute name
* @returns {Promise&lt;string>} attribute value of given type and name or null if no such attribute exists.
* @returns {Promise&lt;string|null>} attribute value of given type and name or null if no such attribute exists.
*/
async getAttributeValue(type, name) {
const attr = await this.getAttribute(type, name);
@@ -293,6 +486,17 @@ class Note extends Entity {
return attr ? attr.value : null;
}
/**
* @param {string} type - attribute type (label, relation, etc.)
* @param {string} name - attribute name
* @returns {Promise&lt;string|null>} attribute value of given type and name or null if no such attribute exists.
*/
async getOwnedAttributeValue(type, name) {
const attr = await this.getOwnedAttribute(type, name);
return attr ? attr.value : null;
}
/**
* Based on enabled, attribute is either set or removed.
*
@@ -312,7 +516,7 @@ class Note extends Entity {
}
/**
* Creates given attribute name-value pair if it doesn't exist.
* Update's given attribute's value or creates it if it doesn't exist
*
* @param {string} type - attribute type (label, relation, etc.)
* @param {string} name - attribute name
@@ -320,10 +524,18 @@ class Note extends Entity {
* @returns {Promise&lt;void>}
*/
async setAttribute(type, name, value) {
const attributes = await this.getOwnedAttributes();
let attr = attributes.find(attr => attr.type === type &amp;&amp; (value === undefined || attr.value === value));
const attributes = await this.loadOwnedAttributesToCache();
let attr = attributes.find(attr => attr.type === type &amp;&amp; attr.name === name);
if (!attr) {
if (attr) {
if (attr.value !== value) {
attr.value = value;
await attr.save();
this.invalidateAttributeCache();
}
}
else {
attr = new Attribute({
noteId: this.noteId,
type: type,
@@ -346,10 +558,10 @@ class Note extends Entity {
* @returns {Promise&lt;void>}
*/
async removeAttribute(type, name, value) {
const attributes = await this.getOwnedAttributes();
const attributes = await this.loadOwnedAttributesToCache();
for (const attribute of attributes) {
if (attribute.type === type &amp;&amp; (value === undefined || value === attribute.value)) {
if (attribute.type === type &amp;&amp; attribute.name === name &amp;&amp; (value === undefined || value === attribute.value)) {
attribute.isDeleted = true;
await attribute.save();
@@ -358,42 +570,124 @@ class Note extends Entity {
}
}
/**
* @return {Promise&lt;Attribute>}
*/
async addAttribute(type, name, value = "") {
const attr = new Attribute({
noteId: this.noteId,
type: type,
name: name,
value: value
});
await attr.save();
this.invalidateAttributeCache();
return attr;
}
async addLabel(name, value = "") {
return await this.addAttribute(LABEL, name, value);
}
async addRelation(name, targetNoteId) {
return await this.addAttribute(RELATION, name, targetNoteId);
}
/**
* @param {string} name - label name
* @returns {Promise&lt;boolean>} true if label exists (including inherited)
*/
async hasLabel(name) { return await this.hasAttribute(LABEL, name); }
/**
* @param {string} name - label name
* @returns {Promise&lt;boolean>} true if label exists (excluding inherited)
*/
async hasOwnedLabel(name) { return await this.hasOwnedAttribute(LABEL, name); }
/**
* @param {string} name - relation name
* @returns {Promise&lt;boolean>} true if relation exists (including inherited)
*/
async hasRelation(name) { return await this.hasAttribute(RELATION, name); }
/**
* @param {string} name - relation name
* @returns {Promise&lt;boolean>} true if relation exists (excluding inherited)
*/
async hasOwnedRelation(name) { return await this.hasOwnedAttribute(RELATION, name); }
/**
* @param {string} name - label name
* @returns {Promise&lt;Attribute>} label if it exists, null otherwise
* @returns {Promise&lt;Attribute|null>} label if it exists, null otherwise
*/
async getLabel(name) { return await this.getAttribute(LABEL, name); }
/**
* @param {string} name - label name
* @returns {Promise&lt;Attribute|null>} label if it exists, null otherwise
*/
async getOwnedLabel(name) { return await this.getOwnedAttribute(LABEL, name); }
/**
* @param {string} name - relation name
* @returns {Promise&lt;Attribute>} relation if it exists, null otherwise
* @returns {Promise&lt;Attribute|null>} relation if it exists, null otherwise
*/
async getRelation(name) { return await this.getAttribute(RELATION, name); }
/**
* @param {string} name - relation name
* @returns {Promise&lt;Attribute|null>} relation if it exists, null otherwise
*/
async getOwnedRelation(name) { return await this.getOwnedAttribute(RELATION, name); }
/**
* @param {string} name - label name
* @returns {Promise&lt;string>} label value if label exists, null otherwise
* @returns {Promise&lt;string|null>} label value if label exists, null otherwise
*/
async getLabelValue(name) { return await this.getAttributeValue(LABEL, name); }
/**
* @param {string} name - label name
* @returns {Promise&lt;string|null>} label value if label exists, null otherwise
*/
async getOwnedLabelValue(name) { return await this.getOwnedAttributeValue(LABEL, name); }
/**
* @param {string} name - relation name
* @returns {Promise&lt;string>} relation value if relation exists, null otherwise
* @returns {Promise&lt;string|null>} relation value if relation exists, null otherwise
*/
async getRelationValue(name) { return await this.getAttributeValue(RELATION, name); }
/**
* @param {string} name - relation name
* @returns {Promise&lt;string|null>} relation value if relation exists, null otherwise
*/
async getOwnedRelationValue(name) { return await this.getOwnedAttributeValue(RELATION, name); }
/**
* @param {string} name
* @returns {Promise&lt;Note>|null} target note of the relation or null (if target is empty or note was not found)
*/
async getRelationTarget(name) {
const relation = await this.getRelation(name);
return relation ? await repository.getNote(relation.value) : null;
}
/**
* @param {string} name
* @returns {Promise&lt;Note>|null} target note of the relation or null (if target is empty or note was not found)
*/
async getOwnedRelationTarget(name) {
const relation = await this.getOwnedRelation(name);
return relation ? await repository.getNote(relation.value) : null;
}
/**
* Based on enabled, label is either set or removed.
*
@@ -415,7 +709,7 @@ class Note extends Entity {
async toggleRelation(enabled, name, value) { return await this.toggleAttribute(RELATION, enabled, name, value); }
/**
* Create label name-value pair if it doesn't exist yet.
* Update's given label's value or creates it if it doesn't exist
*
* @param {string} name - label name
* @param {string} [value] - label value
@@ -424,7 +718,7 @@ class Note extends Entity {
async setLabel(name, value) { return await this.setAttribute(LABEL, name, value); }
/**
* Create relation name-value pair if it doesn't exist yet.
* Update's given relation's value or creates it if it doesn't exist
*
* @param {string} name - relation name
* @param {string} [value] - relation value (noteId)
@@ -451,24 +745,32 @@ class Note extends Entity {
async removeRelation(name, value) { return await this.removeAttribute(RELATION, name, value); }
/**
* @param {string} name
* @returns {Promise&lt;Note>|null} target note of the relation or null (if target is empty or note was not found)
* @return {Promise&lt;string[]>} return list of all descendant noteIds of this note. Returning just noteIds because number of notes can be huge. Includes also this note's noteId
*/
async getRelationTarget(name) {
const relation = await this.getRelation(name);
return relation ? await repository.getNote(relation.value) : null;
async getDescendantNoteIds() {
return await sql.getColumn(`
WITH RECURSIVE
tree(noteId) AS (
SELECT ?
UNION
SELECT branches.noteId FROM branches
JOIN tree ON branches.parentNoteId = tree.noteId
JOIN notes ON notes.noteId = branches.noteId
WHERE notes.isDeleted = 0
AND branches.isDeleted = 0
)
SELECT noteId FROM tree`, [this.noteId]);
}
/**
* Finds child notes with given attribute name and value. Only own attributes are considered, not inherited ones
* Finds descendant notes with given attribute name and value. Only own attributes are considered, not inherited ones
*
* @param {string} type - attribute type (label, relation, etc.)
* @param {string} name - attribute name
* @param {string} [value] - attribute value
* @returns {Promise&lt;Note[]>}
*/
async findChildNotesWithAttribute(type, name, value) {
async getDescendantNotesWithAttribute(type, name, value) {
const params = [this.noteId, name];
let valueCondition = "";
@@ -500,22 +802,22 @@ class Note extends Entity {
}
/**
* Finds notes with given label name and value. Only own labels are considered, not inherited ones
* Finds descendant notes with given label name and value. Only own labels are considered, not inherited ones
*
* @param {string} name - label name
* @param {string} [value] - label value
* @returns {Promise&lt;Note[]>}
*/
async findChildNotesWithLabel(name, value) { return await this.findChildNotesWithAttribute(LABEL, name, value); }
async getDescendantNotesWithLabel(name, value) { return await this.getDescendantNotesWithAttribute(LABEL, name, value); }
/**
* Finds notes with given relation name and value. Only own relations are considered, not inherited ones
* Finds descendant notes with given relation name and value. Only own relations are considered, not inherited ones
*
* @param {string} name - relation name
* @param {string} [value] - relation value
* @returns {Promise&lt;Note[]>}
*/
async findChildNotesWithRelation(name, value) { return await this.findChildNotesWithAttribute(RELATION, name, value); }
async getDescendantNotesWithRelation(name, value) { return await this.getDescendantNotesWithAttribute(RELATION, name, value); }
/**
* Returns note revisions of this note.
@@ -529,28 +831,17 @@ class Note extends Entity {
/**
* Get list of links coming out of this note.
*
* @returns {Promise&lt;Link[]>}
* @deprecated - not intended for general use
* @returns {Promise&lt;Attribute[]>}
*/
async getLinks() {
return await repository.getEntities("SELECT * FROM links WHERE noteId = ? AND isDeleted = 0", [this.noteId]);
}
/**
* Get list of links targetting this note.
*
* @returns {Promise&lt;Link[]>}
*/
async getTargetLinks() {
return await repository.getEntities("SELECT * FROM links WHERE targetNoteId = ? AND isDeleted = 0", [this.noteId]);
}
/**
* Return all links from this note, including deleted ones.
*
* @returns {Promise&lt;Link[]>}
*/
async getLinksWithDeleted() {
return await repository.getEntities("SELECT * FROM links WHERE noteId = ?", [this.noteId]);
return await repository.getEntities(`
SELECT *
FROM attributes
WHERE noteId = ? AND
isDeleted = 0 AND
type = 'relation' AND
name IN ('internalLink', 'imageLink', 'relationMapLink', 'includeNoteLink')`, [this.noteId]);
}
/**
@@ -607,32 +898,80 @@ class Note extends Entity {
AND parent_notes.isDeleted = 0`, [this.noteId]);
}
/**
* @return {Promise&lt;string[][]>} - array of notePaths (each represented by array of noteIds constituting the particular note path)
*/
async getAllNotePaths() {
if (this.noteId === 'root') {
return [['root']];
}
const notePaths = [];
for (const parentNote of await this.getParentNotes()) {
for (const parentPath of await parentNote.getAllNotePaths()) {
parentPath.push(this.noteId);
notePaths.push(parentPath);
}
}
return notePaths;
}
/**
* @param ancestorNoteId
* @return {Promise&lt;boolean>} - true if ancestorNoteId occurs in at least one of the note's paths
*/
async isDescendantOfNote(ancestorNoteId) {
const notePaths = await this.getAllNotePaths();
return notePaths.some(path => path.includes(ancestorNoteId));
}
beforeSaving() {
if (this.isJson() &amp;&amp; this.jsonContent) {
this.content = JSON.stringify(this.jsonContent, null, '\t');
}
// we do this here because encryption needs the note ID for the IV
this.generateIdIfNecessary();
if (this.isProtected) {
protectedSessionService.encryptNote(this);
}
if (!this.isDeleted) {
this.isDeleted = false;
}
if (!this.dateCreated) {
this.dateCreated = dateUtils.nowDate();
this.dateCreated = dateUtils.localNowDateTime();
}
if (!this.utcDateCreated) {
this.utcDateCreated = dateUtils.utcNowDateTime();
}
if (this.contentLength === undefined) {
this.contentLength = -1;
}
super.beforeSaving();
if (this.isChanged) {
this.dateModified = dateUtils.nowDate();
this.dateModified = dateUtils.localNowDateTime();
this.utcDateModified = dateUtils.utcNowDateTime();
}
}
// cannot be static!
updatePojo(pojo) {
if (pojo.isProtected) {
if (this.isContentAvailable) {
pojo.title = protectedSessionService.encrypt(pojo.title);
}
else {
// updating protected note outside of protected session means we will keep original ciphertexts
delete pojo.title;
}
}
delete pojo.isContentAvailable;
delete pojo.__attributeCache;
delete pojo.__ownedAttributeCache;
delete pojo.content;
/** zero references to contentHash, probably can be removed */
delete pojo.contentHash;
}
}
module.exports = Note;</code></pre>
@@ -645,13 +984,13 @@ module.exports = Note;</code></pre>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

View File

@@ -31,26 +31,34 @@
const Entity = require('./entity');
const protectedSessionService = require('../services/protected_session');
const repository = require('../services/repository');
const utils = require('../services/utils');
const sql = require('../services/sql');
const dateUtils = require('../services/date_utils');
const syncTableService = require('../services/sync_table');
/**
* NoteRevision represents snapshot of note's title and content at some point in the past. It's used for seamless note versioning.
*
* @param {string} noteRevisionId
* @param {string} noteId
* @param {string} type
* @param {string} mime
* @param {string} title
* @param {string} content
* @param {string} isProtected
* @param {string} dateModifiedFrom
* @param {string} dateModifiedTo
* @property {string} noteRevisionId
* @property {string} noteId
* @property {string} type
* @property {string} mime
* @property {string} title
* @property {int} contentLength
* @property {boolean} isErased
* @property {boolean} isProtected
* @property {string} dateLastEdited
* @property {string} dateCreated
* @property {string} utcDateLastEdited
* @property {string} utcDateCreated
* @property {string} utcDateModified
*
* @extends Entity
*/
class NoteRevision extends Entity {
static get entityName() { return "note_revisions"; }
static get primaryKeyName() { return "noteRevisionId"; }
static get hashedProperties() { return ["noteRevisionId", "noteId", "title", "content", "isProtected", "dateModifiedFrom", "dateModifiedTo"]; }
static get hashedProperties() { return ["noteRevisionId", "noteId", "title", "contentLength", "isErased", "isProtected", "dateLastEdited", "dateCreated", "utcDateLastEdited", "utcDateCreated", "utcDateModified"]; }
constructor(row) {
super(row);
@@ -58,20 +66,120 @@ class NoteRevision extends Entity {
this.isProtected = !!this.isProtected;
if (this.isProtected) {
protectedSessionService.decryptNoteRevision(this);
if (protectedSessionService.isProtectedSessionAvailable()) {
this.title = protectedSessionService.decryptString(this.title);
}
else {
this.title = "[Protected]";
}
}
}
async getNote() {
return await repository.getEntity("SELECT * FROM notes WHERE noteId = ?", [this.noteId]);
return await repository.getNote(this.noteId);
}
/** @returns {boolean} true if the note has string content (not binary) */
isStringNote() {
return utils.isStringNote(this.type, this.mime);
}
/*
* Note revision content has quite special handling - it's not a separate entity, but a lazily loaded
* part of NoteRevision entity with it's own sync. Reason behind this hybrid design is that
* content can be quite large and it's not necessary to load it / fill memory for any note access even
* if we don't need a content, especially for bulk operations like search.
*
* This is the same approach as is used for Note's content.
*/
/** @returns {Promise&lt;*>} */
async getContent(silentNotFoundError = false) {
if (this.content === undefined) {
const res = await sql.getRow(`SELECT content, hash FROM note_revision_contents WHERE noteRevisionId = ?`, [this.noteRevisionId]);
if (!res) {
if (silentNotFoundError) {
return undefined;
}
else {
throw new Error("Cannot find note revision content for noteRevisionId=" + this.noteRevisionId);
}
}
this.content = res.content;
if (this.isProtected) {
if (protectedSessionService.isProtectedSessionAvailable()) {
this.content = protectedSessionService.decrypt(this.content);
}
else {
this.content = "";
}
}
}
if (this.isStringNote()) {
return this.content === null
? ""
: this.content.toString("UTF-8");
}
else {
return this.content;
}
}
/** @returns {Promise} */
async setContent(content) {
// force updating note itself so that utcDateModified is represented correctly even for the content
this.forcedChange = true;
this.contentLength = content === null ? 0 : content.length;
await this.save();
this.content = content;
const pojo = {
noteRevisionId: this.noteRevisionId,
content: content,
utcDateModified: dateUtils.utcNowDateTime(),
hash: utils.hash(this.noteRevisionId + "|" + content)
};
if (this.isProtected) {
if (protectedSessionService.isProtectedSessionAvailable()) {
pojo.content = protectedSessionService.encrypt(pojo.content);
}
else {
throw new Error(`Cannot update content of noteRevisionId=${this.noteRevisionId} since we're out of protected session.`);
}
}
await sql.upsert("note_revision_contents", "noteRevisionId", pojo);
await syncTableService.addNoteRevisionContentSync(this.noteRevisionId);
}
beforeSaving() {
if (this.isProtected) {
protectedSessionService.encryptNoteRevision(this);
super.beforeSaving();
if (this.isChanged) {
this.utcDateModified = dateUtils.utcNowDateTime();
}
}
// cannot be static!
updatePojo(pojo) {
if (pojo.isProtected) {
if (protectedSessionService.isProtectedSessionAvailable()) {
pojo.title = protectedSessionService.encrypt(pojo.title);
}
else {
// updating protected note outside of protected session means we will keep original ciphertexts
delete pojo.title;
}
}
super.beforeSaving();
delete pojo.content;
}
}
@@ -85,13 +193,13 @@ module.exports = NoteRevision;</code></pre>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Link.html">Link</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ApiToken.html">ApiToken</a></li><li><a href="Attribute.html">Attribute</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li><li><a href="Branch.html">Branch</a></li><li><a href="Entity.html">Entity</a></li><li><a href="Note.html">Note</a></li><li><a href="NoteRevision.html">NoteRevision</a></li><li><a href="Option.html">Option</a></li><li><a href="RecentNote.html">RecentNote</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>

Some files were not shown because too many files have changed in this diff Show More