Compare commits

...

380 Commits

Author SHA1 Message Date
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 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 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 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 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 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
354 changed files with 24512 additions and 16549 deletions
+3
View File
@@ -0,0 +1,3 @@
# These are supported funding model platforms
github: [zadam]
+1
View File
@@ -1,6 +1,7 @@
.DS_Store
node_modules/
dist/
src/public/app-dist/
npm-debug.log
yarn-error.log
*.db
-3
View File
@@ -6,9 +6,6 @@
<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>
+10 -34
View File
@@ -57,7 +57,6 @@
<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">
@@ -131,21 +130,17 @@
<index id="38" parent="7" name="sqlite_autoindex_attributes_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>attributeId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<index id="39" parent="7" name="IDX_attributes_noteId_index">
<ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="40" parent="7" name="IDX_attributes_name_value">
<ColNames>name
value</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="41" parent="7" name="IDX_attributes_value_index">
<ColNames>value</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<key id="42" parent="7">
<ColNames>attributeId</ColNames>
@@ -212,17 +207,14 @@ value</ColNames>
<index id="54" parent="8" name="sqlite_autoindex_branches_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>branchId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<index id="55" parent="8" name="IDX_branches_noteId_parentNoteId">
<ColNames>noteId
parentNoteId</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="56" parent="8" name="IDX_branches_parentNoteId">
<ColNames>parentNoteId</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<key id="57" parent="8">
<ColNames>branchId</ColNames>
@@ -253,7 +245,6 @@ parentNoteId</ColNames>
<index id="62" parent="9" name="sqlite_autoindex_note_contents_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="63" parent="9">
@@ -284,7 +275,6 @@ parentNoteId</ColNames>
<index id="68" parent="10" name="sqlite_autoindex_note_revision_contents_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>noteRevisionId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="69" parent="10">
@@ -369,28 +359,22 @@ parentNoteId</ColNames>
<index id="84" parent="11" name="sqlite_autoindex_note_revisions_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>noteRevisionId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<index id="85" parent="11" name="IDX_note_revisions_noteId">
<ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="86" parent="11" name="IDX_note_revisions_utcDateLastEdited">
<ColNames>utcDateLastEdited</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="87" parent="11" name="IDX_note_revisions_utcDateCreated">
<ColNames>utcDateCreated</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="88" parent="11" name="IDX_note_revisions_dateLastEdited">
<ColNames>dateLastEdited</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="89" parent="11" name="IDX_note_revisions_dateCreated">
<ColNames>dateCreated</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<key id="90" parent="11">
<ColNames>noteRevisionId</ColNames>
@@ -477,36 +461,28 @@ parentNoteId</ColNames>
<index id="105" parent="12" name="sqlite_autoindex_notes_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<index id="106" parent="12" name="IDX_notes_title">
<ColNames>title</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="107" parent="12" name="IDX_notes_type">
<ColNames>type</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="108" parent="12" name="IDX_notes_isDeleted">
<ColNames>isDeleted</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="109" parent="12" name="IDX_notes_dateCreated">
<ColNames>dateCreated</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="110" parent="12" name="IDX_notes_dateModified">
<ColNames>dateModified</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="111" parent="12" name="IDX_notes_utcDateCreated">
<ColNames>utcDateCreated</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<index id="112" parent="12" name="IDX_notes_utcDateModified">
<ColNames>utcDateModified</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<key id="113" parent="12">
<ColNames>noteId</ColNames>
@@ -547,7 +523,6 @@ parentNoteId</ColNames>
<index id="120" parent="13" name="sqlite_autoindex_options_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>name</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="121" parent="13">
@@ -583,7 +558,6 @@ parentNoteId</ColNames>
<index id="127" parent="14" name="sqlite_autoindex_recent_notes_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<key id="128" parent="14">
@@ -604,12 +578,10 @@ parentNoteId</ColNames>
<index id="131" parent="15" name="sqlite_autoindex_source_ids_1">
<NameSurrogate>1</NameSurrogate>
<ColNames>sourceId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<index id="132" parent="15" name="IDX_source_ids_utcDateCreated">
<ColNames>utcDateCreated</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<key id="133" parent="15">
<ColNames>sourceId</ColNames>
@@ -663,22 +635,26 @@ parentNoteId</ColNames>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<column id="145" parent="18" name="utcSyncDate">
<column id="145" parent="18" name="isSynced">
<Position>5</Position>
<DataType>INTEGER|0s</DataType>
<NotNull>1</NotNull>
<DefaultExpression>0</DefaultExpression>
</column>
<column id="146" parent="18" name="utcSyncDate">
<Position>6</Position>
<DataType>TEXT|0s</DataType>
<NotNull>1</NotNull>
</column>
<index id="146" parent="18" name="IDX_sync_entityName_entityId">
<index id="147" parent="18" name="IDX_sync_entityName_entityId">
<ColNames>entityName
entityId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique>
</index>
<index id="147" parent="18" name="IDX_sync_utcSyncDate">
<index id="148" parent="18" name="IDX_sync_utcSyncDate">
<ColNames>utcSyncDate</ColNames>
<ColumnCollations></ColumnCollations>
</index>
<key id="148" parent="18">
<key id="149" parent="18">
<ColNames>id</ColNames>
<Primary>1</Primary>
</key>
+1 -1
View File
@@ -1,4 +1,4 @@
FROM node:12.14.0-alpine
FROM node:12.16.2-alpine
# Create app directory
WORKDIR /usr/src/app
+2 -2
View File
@@ -11,11 +11,11 @@ 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/node_modules/@felixrieseberg/spellchecker/build/Release/*
rm -r $SRC_DIR/src/public/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/
cp bin/deps/linux-x64/spellchecker/* $SRC_DIR/node_modules/@felixrieseberg/spellchecker/build/Release/
./node_modules/.bin/electron-packager $SRC_DIR --asar --out=dist --executable-name=trilium --platform=linux --arch=x64 --overwrite
+2 -4
View File
@@ -13,15 +13,13 @@ 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/*
rm -r $SRC_DIR/node_modules/@felixrieseberg/spellchecker/build/Release/*
rm -r $SRC_DIR/node_modules/keyboard-layout/build/Release/*
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/
cp bin/deps/mac-x64/spellchecker/* $SRC_DIR/node_modules/@felixrieseberg/spellchecker/build/Release/
cp bin/deps/mac-x64/keyboard-layout-manager.node $SRC_DIR/node_modules/keyboard-layout/build/Release/
rm -r $SRC_DIR/src/public/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
+1 -1
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
PKG_DIR=dist/trilium-linux-x64-server
NODE_VERSION=12.14.0
NODE_VERSION=12.16.2
if [ "$1" != "DONTCOPY" ]
then
+2 -5
View File
@@ -13,16 +13,13 @@ 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/*
rm -r $SRC_DIR/node_modules/@felixrieseberg/spellchecker/build/Release/*
rm -r $SRC_DIR/node_modules/keyboard-layout/build/Release/*
rm -r $SRC_DIR/node_modules/cld/build/Release/*
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/
cp bin/deps/win-x64/spellchecker/* $SRC_DIR/node_modules/@felixrieseberg/spellchecker/build/Release/
cp bin/deps/win-x64/keyboard-layout-manager.node $SRC_DIR/node_modules/keyboard-layout/build/Release/
rm -r $SRC_DIR/src/public/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
+7 -4
View File
@@ -22,11 +22,14 @@ 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)
rm -r $DIR/node_modules/cld/deps
(cd $DIR && npm install --only=prod && npm run webpack)
find $DIR/libraries -name "*.map" -type f -delete
find $DIR/libraries -name "hunspell.lib" -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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -2
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
+1 -1
View File
@@ -8,7 +8,7 @@ instanceName=
[Network]
# 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 random free port
# 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
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
@@ -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`
);
+16 -15
View File
@@ -1,16 +1,8 @@
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,
`utcSyncDate` TEXT NOT NULL);
CREATE TABLE IF NOT EXISTS "source_ids" (
`sourceId` TEXT NOT NULL,
`utcDateCreated` TEXT NOT NULL,
PRIMARY KEY(`sourceId`)
);
CREATE INDEX IDX_source_ids_utcDateCreated
on source_ids (utcDateCreated);
CREATE TABLE IF NOT EXISTS "api_tokens"
(
apiTokenId TEXT PRIMARY KEY NOT NULL,
@@ -27,13 +19,6 @@ CREATE TABLE IF NOT EXISTS "options"
utcDateCreated TEXT not null,
utcDateModified TEXT NOT NULL
);
CREATE UNIQUE INDEX `IDX_sync_entityName_entityId` ON `sync` (
`entityName`,
`entityId`
);
CREATE INDEX `IDX_sync_utcSyncDate` ON `sync` (
`utcSyncDate`
);
CREATE TABLE IF NOT EXISTS "note_contents" (
`noteId` TEXT NOT NULL,
`content` TEXT NULL DEFAULT NULL,
@@ -72,6 +57,8 @@ CREATE INDEX `IDX_note_revisions_utcDateCreated` ON `note_revisions` (`utcDateCr
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",
@@ -130,3 +117,17 @@ CREATE INDEX IDX_attributes_noteId_index
on attributes (noteId);
CREATE INDEX IDX_attributes_value_index
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`
);
+1 -1
View File
@@ -293,7 +293,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+31 -5
View File
@@ -272,6 +272,32 @@
<tr>
<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>
@@ -352,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#line29">line 29</a>
<a href="entities_attribute.js.html">entities/attribute.js</a>, <a href="entities_attribute.js.html#line30">line 30</a>
</li></ul></dd>
@@ -467,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>
@@ -569,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>
@@ -671,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>
@@ -741,7 +767,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+101 -76
View File
@@ -351,69 +351,6 @@
<h4 class="name" id="refreshTree"><span class="type-signature"></span>refreshTree<span class="type-signature"></span></h4>
<div class="description">
Trigger tree refresh in all connected clients. This is required when some tree change happens in
the backend.
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line394">line 394</a>
</li></ul></dd>
</dl>
<h4 class="name" id="startNote"><span class="type-signature"></span>startNote<span class="type-signature"></span></h4>
@@ -1117,6 +1054,8 @@ JSON MIME type. See also createNewNote() for more options.
<dt class="important tag-deprecated">Deprecated:</dt><dd><ul class="dummy"><li>please use createNote() API method instead</li></ul></dd>
@@ -1129,7 +1068,7 @@ JSON MIME type. See also createNewNote() for more options.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line258">line 258</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line259">line 259</a>
</li></ul></dd>
@@ -1815,7 +1754,7 @@ JSON MIME type. See also createNewNote() for more options.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line399">line 399</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line398">line 398</a>
</li></ul></dd>
@@ -2279,7 +2218,7 @@ JSON MIME type. See also createNewNote() for more options.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line314">line 314</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line315">line 315</a>
</li></ul></dd>
@@ -3047,7 +2986,7 @@ if some action needs to happen on only one specific instance.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line341">line 341</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line342">line 342</a>
</li></ul></dd>
@@ -3700,7 +3639,7 @@ if some action needs to happen on only one specific instance.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line305">line 305</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line306">line 306</a>
</li></ul></dd>
@@ -3806,7 +3745,7 @@ if some action needs to happen on only one specific instance.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line322">line 322</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line323">line 323</a>
</li></ul></dd>
@@ -3984,7 +3923,7 @@ if some action needs to happen on only one specific instance.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line332">line 332</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line333">line 333</a>
</li></ul></dd>
@@ -4139,7 +4078,7 @@ if some action needs to happen on only one specific instance.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line350">line 350</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line351">line 351</a>
</li></ul></dd>
@@ -4289,7 +4228,93 @@ if some action needs to happen on only one specific instance.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line297">line 297</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line298">line 298</a>
</li></ul></dd>
</dl>
<h4 class="name" id="refreshTree"><span class="type-signature"></span>refreshTree<span class="signature">()</span><span class="type-signature"></span></h4>
<dl class="details">
<dt class="important tag-deprecated">Deprecated:</dt><dd><ul class="dummy"><li>- this is now no-op since all the changes should be gracefully handled per widget</li></ul></dd>
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line393">line 393</a>
</li></ul></dd>
@@ -4792,7 +4817,7 @@ This method looks similar to toggleNoteInParent() but differs because we're look
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line371">line 371</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line372">line 372</a>
</li></ul></dd>
@@ -4925,7 +4950,7 @@ This method looks similar to toggleNoteInParent() but differs because we're look
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line357">line 357</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line358">line 358</a>
</li></ul></dd>
@@ -5300,7 +5325,7 @@ transactional by default.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line384">line 384</a>
<a href="services_backend_script_api.js.html">services/backend_script_api.js</a>, <a href="services_backend_script_api.js.html#line385">line 385</a>
</li></ul></dd>
@@ -5374,7 +5399,7 @@ transactional by default.
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+132 -7
View File
@@ -250,6 +250,32 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
<tr>
<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>
@@ -330,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#line30">line 30</a>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line25">line 25</a>
</li></ul></dd>
@@ -397,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>
@@ -445,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>
@@ -481,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>
@@ -518,7 +643,7 @@ Each note can have multiple (at least one) branches, meaning it can be placed in
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+1 -1
View File
@@ -218,7 +218,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+93 -67
View File
@@ -293,6 +293,32 @@
<tr>
<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>isErased</code></td>
@@ -442,7 +468,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line43">line 43</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line44">line 44</a>
</li></ul></dd>
@@ -557,7 +583,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line540">line 540</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line548">line 548</a>
</li></ul></dd>
@@ -659,7 +685,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line868">line 868</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line876">line 876</a>
</li></ul></dd>
@@ -837,7 +863,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line436">line 436</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line444">line 444</a>
</li></ul></dd>
@@ -1037,7 +1063,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line254">line 254</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line262">line 262</a>
</li></ul></dd>
@@ -1215,7 +1241,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line447">line 447</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line455">line 455</a>
</li></ul></dd>
@@ -1321,7 +1347,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line814">line 814</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line822">line 822</a>
</li></ul></dd>
@@ -1423,7 +1449,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line842">line 842</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line850">line 850</a>
</li></ul></dd>
@@ -1529,7 +1555,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line828">line 828</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line836">line 836</a>
</li></ul></dd>
@@ -1635,7 +1661,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line74">line 74</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line75">line 75</a>
</li></ul></dd>
@@ -1737,7 +1763,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line714">line 714</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line722">line 722</a>
</li></ul></dd>
@@ -1970,7 +1996,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line737">line 737</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line745">line 745</a>
</li></ul></dd>
@@ -2168,7 +2194,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line775">line 775</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line783">line 783</a>
</li></ul></dd>
@@ -2366,7 +2392,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line784">line 784</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line792">line 792</a>
</li></ul></dd>
@@ -2468,7 +2494,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line109">line 109</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line111">line 111</a>
</li></ul></dd>
@@ -2619,7 +2645,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line591">line 591</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line599">line 599</a>
</li></ul></dd>
@@ -2786,7 +2812,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line293">line 293</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line301">line 301</a>
</li></ul></dd>
@@ -2953,7 +2979,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line277">line 277</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line285">line 285</a>
</li></ul></dd>
@@ -3108,7 +3134,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line615">line 615</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line623">line 623</a>
</li></ul></dd>
@@ -3220,7 +3246,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line801">line 801</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line809">line 809</a>
</li></ul></dd>
@@ -3322,7 +3348,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line236">line 236</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line244">line 244</a>
</li></ul></dd>
@@ -3529,7 +3555,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line212">line 212</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line220">line 220</a>
</li></ul></dd>
@@ -3707,7 +3733,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line458">line 458</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line466">line 466</a>
</li></ul></dd>
@@ -3862,7 +3888,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line597">line 597</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line605">line 605</a>
</li></ul></dd>
@@ -4029,7 +4055,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line285">line 285</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line293">line 293</a>
</li></ul></dd>
@@ -4184,7 +4210,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line621">line 621</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line629">line 629</a>
</li></ul></dd>
@@ -4339,7 +4365,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line609">line 609</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line617">line 617</a>
</li></ul></dd>
@@ -4506,7 +4532,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line309">line 309</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line317">line 317</a>
</li></ul></dd>
@@ -4661,7 +4687,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line649">line 649</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line657">line 657</a>
</li></ul></dd>
@@ -4819,7 +4845,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line633">line 633</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line641">line 641</a>
</li></ul></dd>
@@ -4925,7 +4951,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line854">line 854</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line862">line 862</a>
</li></ul></dd>
@@ -5080,7 +5106,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line603">line 603</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line611">line 611</a>
</li></ul></dd>
@@ -5247,7 +5273,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line332">line 332</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line340">line 340</a>
</li></ul></dd>
@@ -5414,7 +5440,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line301">line 301</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line309">line 309</a>
</li></ul></dd>
@@ -5569,7 +5595,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line639">line 639</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line647">line 647</a>
</li></ul></dd>
@@ -5739,7 +5765,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line317">line 317</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line325">line 325</a>
</li></ul></dd>
@@ -5890,7 +5916,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line627">line 627</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line635">line 635</a>
</li></ul></dd>
@@ -6000,7 +6026,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line791">line 791</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line799">line 799</a>
</li></ul></dd>
@@ -6102,7 +6128,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line183">line 183</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line191">line 191</a>
</li></ul></dd>
@@ -6208,7 +6234,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line245">line 245</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line253">line 253</a>
</li></ul></dd>
@@ -6386,7 +6412,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line418">line 418</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line426">line 426</a>
</li></ul></dd>
@@ -6492,7 +6518,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line821">line 821</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line829">line 829</a>
</li></ul></dd>
@@ -6647,7 +6673,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line567">line 567</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line575">line 575</a>
</li></ul></dd>
@@ -6825,7 +6851,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line427">line 427</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line435">line 435</a>
</li></ul></dd>
@@ -6980,7 +7006,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line573">line 573</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line581">line 581</a>
</li></ul></dd>
@@ -7135,7 +7161,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line585">line 585</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line593">line 593</a>
</li></ul></dd>
@@ -7290,7 +7316,7 @@ Use when inheritance is not needed and/or in batch/performance sensitive operati
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line579">line 579</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line587">line 587</a>
</li></ul></dd>
@@ -7401,7 +7427,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line340">line 340</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line348">line 348</a>
</li></ul></dd>
@@ -7529,7 +7555,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line889">line 889</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line897">line 897</a>
</li></ul></dd>
@@ -7635,7 +7661,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line173">line 173</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line181">line 181</a>
</li></ul></dd>
@@ -7741,7 +7767,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line165">line 165</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line173">line 173</a>
</li></ul></dd>
@@ -7847,7 +7873,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line160">line 160</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line168">line 168</a>
</li></ul></dd>
@@ -7953,7 +7979,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line155">line 155</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line163">line 163</a>
</li></ul></dd>
@@ -8059,7 +8085,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line178">line 178</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line186">line 186</a>
</li></ul></dd>
@@ -8165,7 +8191,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line346">line 346</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line354">line 354</a>
</li></ul></dd>
@@ -8394,7 +8420,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line524">line 524</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line532">line 532</a>
</li></ul></dd>
@@ -8592,7 +8618,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line700">line 700</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line708">line 708</a>
</li></ul></dd>
@@ -8790,7 +8816,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line709">line 709</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line717">line 717</a>
</li></ul></dd>
@@ -9019,7 +9045,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line490">line 490</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line498">line 498</a>
</li></ul></dd>
@@ -9121,7 +9147,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line116">line 116</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line122">line 122</a>
</li></ul></dd>
@@ -9223,7 +9249,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line150">line 150</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line158">line 158</a>
</li></ul></dd>
@@ -9421,7 +9447,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line682">line 682</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line690">line 690</a>
</li></ul></dd>
@@ -9619,7 +9645,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line691">line 691</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line699">line 699</a>
</li></ul></dd>
@@ -9879,7 +9905,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line473">line 473</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line481">line 481</a>
</li></ul></dd>
@@ -10108,7 +10134,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line663">line 663</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line671">line 671</a>
</li></ul></dd>
@@ -10337,7 +10363,7 @@ Cache is note instance scoped.
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line673">line 673</a>
<a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line681">line 681</a>
</li></ul></dd>
@@ -10407,7 +10433,7 @@ Cache is note instance scoped.
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+2 -2
View File
@@ -744,7 +744,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#line104">line 104</a>
<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>
@@ -814,7 +814,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+1 -1
View File
@@ -316,7 +316,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+1 -1
View File
@@ -293,7 +293,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+1 -1
View File
@@ -75,7 +75,7 @@ module.exports = ApiToken;</code></pre>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+18 -11
View File
@@ -44,6 +44,7 @@ const sql = require('../services/sql');
* @property {int} position
* @property {boolean} isInheritable
* @property {boolean} isDeleted
* @property {string|null} deleteId - ID identifying delete transaction
* @property {string} utcDateCreated
* @property {string} utcDateModified
*
@@ -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);
}
/**
@@ -143,6 +136,20 @@ class Attribute extends Entity {
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>
@@ -161,7 +168,7 @@ module.exports = Attribute;</code></pre>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+20 -13
View File
@@ -44,6 +44,7 @@ const sql = require('../services/sql');
* @property {string} prefix
* @property {boolean} isExpanded
* @property {boolean} isDeleted
* @property {string|null} deleteId - ID identifying delete transaction
* @property {string} utcDateModified
* @property {string} utcDateCreated
*
@@ -53,18 +54,16 @@ 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() {
@@ -92,9 +91,17 @@ class Branch extends Entity {
}
}
// cannot be static!
updatePojo(pojo) {
delete pojo.origParentNoteId;
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
});
}
}
@@ -114,7 +121,7 @@ module.exports = Branch;</code></pre>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+1 -1
View File
@@ -102,7 +102,7 @@ module.exports = Entity;</code></pre>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+22 -14
View File
@@ -52,6 +52,7 @@ const RELATION_DEFINITION = 'relation-definition';
* @property {int} contentLength - length of content
* @property {boolean} isProtected - true if note is protected
* @property {boolean} isDeleted - true if note is deleted
* @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)
@@ -63,7 +64,7 @@ const RELATION_DEFINITION = 'relation-definition';
class Note extends Entity {
static get entityName() { return "notes"; }
static get primaryKeyName() { return "noteId"; }
static get hashedProperties() { return ["noteId", "title", "type", "isProtected", "isDeleted"]; }
static get hashedProperties() { return ["noteId", "title", "type", "mime", "isProtected", "isDeleted", "deleteId"]; }
/**
* @param row - object containing database row from "notes" table
@@ -122,21 +123,26 @@ class Note extends Entity {
this.content = "";
}
}
if (this.isStringNote()) {
this.content = this.content === null
? ""
: this.content.toString("UTF-8");
}
}
return 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);
}
@@ -146,9 +152,11 @@ class Note extends Entity {
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.length;
this.contentLength = content.byteLength;
await this.save();
this.content = content;
@@ -157,7 +165,7 @@ class Note extends Entity {
noteId: this.noteId,
content: content,
utcDateModified: dateUtils.utcNowDateTime(),
hash: utils.hash(this.noteId + "|" + content)
hash: utils.hash(this.noteId + "|" + content.toString())
};
if (this.isProtected) {
@@ -831,9 +839,9 @@ class Note extends Entity {
SELECT *
FROM attributes
WHERE noteId = ? AND
isDeleted = 0 AND
type = 'relation' AND
name IN ('internalLink', 'imageLink', 'relationMapLink')`, [this.noteId]);
isDeleted = 0 AND
type = 'relation' AND
name IN ('internalLink', 'imageLink', 'relationMapLink', 'includeNoteLink')`, [this.noteId]);
}
/**
@@ -982,7 +990,7 @@ module.exports = Note;</code></pre>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
@@ -76,7 +76,7 @@ class NoteRevision extends Entity {
}
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) */
@@ -117,15 +117,16 @@ class NoteRevision extends Entity {
this.content = "";
}
}
if (this.isStringNote()) {
this.content = this.content === null
? ""
: this.content.toString("UTF-8");
}
}
return this.content;
if (this.isStringNote()) {
return this.content === null
? ""
: this.content.toString("UTF-8");
}
else {
return this.content;
}
}
/** @returns {Promise} */
@@ -198,7 +199,7 @@ module.exports = NoteRevision;</code></pre>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+1 -1
View File
@@ -82,7 +82,7 @@ module.exports = Option;</code></pre>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
@@ -75,7 +75,7 @@ module.exports = RecentNote;</code></pre>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+1 -1
View File
@@ -1089,7 +1089,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+1 -1
View File
@@ -56,7 +56,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
@@ -276,6 +276,7 @@ function BackendScriptApi(currentNote, apiParams) {
/**
* @method
* @deprecated please use createNote() API method instead
*
* @param {string} parentNoteId - create new note under this parent
* @param {string} title
@@ -414,12 +415,10 @@ function BackendScriptApi(currentNote, apiParams) {
this.sql = sql;
/**
* Trigger tree refresh in all connected clients. This is required when some tree change happens in
* the backend.
*
* @returns {Promise&lt;void>}
* @method
* @deprecated - this is now no-op since all the changes should be gracefully handled per widget
*/
this.refreshTree = ws.refreshTree;
this.refreshTree = () => {};
/**
* @return {{syncVersion, appVersion, buildRevision, dbVersion, dataDirectory, buildDate}|*} - object representing basic info about running Trilium version
@@ -444,7 +443,7 @@ module.exports = BackendScriptApi;
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+170 -10
View File
@@ -183,7 +183,65 @@
<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#line6">line 6</a>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line11">line 11</a>
</li></ul></dd>
</dl>
<h4 class="name" id="isDeleted"><span class="type-signature"></span>isDeleted<span class="type-signature"></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#line23">line 23</a>
</li></ul></dd>
@@ -241,7 +299,7 @@
<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#line16">line 16</a>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line21">line 21</a>
</li></ul></dd>
@@ -299,7 +357,7 @@
<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#line8">line 8</a>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line13">line 13</a>
</li></ul></dd>
@@ -357,7 +415,7 @@
<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#line12">line 12</a>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line17">line 17</a>
</li></ul></dd>
@@ -415,7 +473,7 @@
<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#line10">line 10</a>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line15">line 15</a>
</li></ul></dd>
@@ -473,7 +531,7 @@
<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#line14">line 14</a>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line19">line 19</a>
</li></ul></dd>
@@ -549,7 +607,109 @@
<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#line20">line 20</a>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line27">line 27</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type"><a href="NoteShort.html">NoteShort</a></span>
</dd>
</dl>
<h4 class="name" id="getParentNote"><span class="type-signature">(async) </span>getParentNote<span class="signature">()</span><span class="type-signature"> &rarr; {<a href="NoteShort.html">NoteShort</a>}</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#line32">line 32</a>
</li></ul></dd>
@@ -651,7 +811,7 @@
<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#line25">line 25</a>
<a href="entities_branch.js.html">entities/branch.js</a>, <a href="entities_branch.js.html#line37">line 37</a>
</li></ul></dd>
@@ -719,13 +879,13 @@
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteFull.html">NoteFull</a></li><li><a href="NoteShort.html">NoteShort</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="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteComplement.html">NoteComplement</a></li><li><a href="NoteShort.html">NoteShort</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</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
+522
View File
@@ -0,0 +1,522 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Class: NoteComplement</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Class: NoteComplement</h1>
<section>
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>NoteComplement<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">Complements the NoteShort with the main note content and other extra attributes</div>
</header>
<article>
<div class="container-overview">
<h2>Constructor</h2>
<h4 class="name" id="NoteComplement"><span class="type-signature"></span>new NoteComplement<span class="signature">()</span><span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note_complement.js.html">entities/note_complement.js</a>, <a href="entities_note_complement.js.html#line5">line 5</a>
</li></ul></dd>
</dl>
</div>
<h3 class="subsection-title">Members</h3>
<h4 class="name" id="content"><span class="type-signature"></span>content<span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note_complement.js.html">entities/note_complement.js</a>, <a href="entities_note_complement.js.html#line10">line 10</a>
</li></ul></dd>
</dl>
<h4 class="name" id="dateCreated"><span class="type-signature"></span>dateCreated<span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note_complement.js.html">entities/note_complement.js</a>, <a href="entities_note_complement.js.html#line13">line 13</a>
</li></ul></dd>
</dl>
<h4 class="name" id="dateModified"><span class="type-signature"></span>dateModified<span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note_complement.js.html">entities/note_complement.js</a>, <a href="entities_note_complement.js.html#line16">line 16</a>
</li></ul></dd>
</dl>
<h4 class="name" id="noteId"><span class="type-signature"></span>noteId<span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note_complement.js.html">entities/note_complement.js</a>, <a href="entities_note_complement.js.html#line7">line 7</a>
</li></ul></dd>
</dl>
<h4 class="name" id="utcDateCreated"><span class="type-signature"></span>utcDateCreated<span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note_complement.js.html">entities/note_complement.js</a>, <a href="entities_note_complement.js.html#line19">line 19</a>
</li></ul></dd>
</dl>
<h4 class="name" id="utcDateModified"><span class="type-signature"></span>utcDateModified<span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="entities_note_complement.js.html">entities/note_complement.js</a>, <a href="entities_note_complement.js.html#line22">line 22</a>
</li></ul></dd>
</dl>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteComplement.html">NoteComplement</a></li><li><a href="NoteShort.html">NoteShort</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>
File diff suppressed because it is too large Load Diff
+17 -9
View File
@@ -29,6 +29,11 @@
<pre class="prettyprint source linenums"><code>class Attribute {
constructor(treeCache, row) {
this.treeCache = treeCache;
this.update(row);
}
update(row) {
/** @param {string} attributeId */
this.attributeId = row.attributeId;
/** @param {string} noteId */
@@ -43,12 +48,6 @@
this.position = row.position;
/** @param {boolean} isInheritable */
this.isInheritable = row.isInheritable;
/** @param {boolean} isDeleted */
this.isDeleted = row.isDeleted;
/** @param {string} utcDateCreated */
this.utcDateCreated = row.utcDateCreated;
/** @param {string} utcDateModified */
this.utcDateModified = row.utcDateModified;
}
/** @returns {NoteShort} */
@@ -56,8 +55,17 @@
return await this.treeCache.getNote(this.noteId);
}
get jsonValue() {
try {
return JSON.parse(this.value);
}
catch (e) {
return null;
}
}
get toString() {
return `Attribute(attributeId=${this.attributeId}, type=${this.type}, name=${this.name})`;
return `Attribute(attributeId=${this.attributeId}, type=${this.type}, name=${this.name}, value=${this.value})`;
}
}
@@ -71,13 +79,13 @@ export default Attribute;</code></pre>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteFull.html">NoteFull</a></li><li><a href="NoteShort.html">NoteShort</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="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteComplement.html">NoteComplement</a></li><li><a href="NoteShort.html">NoteShort</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+14 -2
View File
@@ -30,6 +30,11 @@
class Branch {
constructor(treeCache, row) {
this.treeCache = treeCache;
this.update(row);
}
update(row) {
/** @param {string} primary key */
this.branchId = row.branchId;
/** @param {string} */
@@ -42,6 +47,8 @@ class Branch {
this.prefix = row.prefix;
/** @param {boolean} */
this.isExpanded = !!row.isExpanded;
/** @param {boolean} */
this.isDeleted = !!row.isDeleted;
}
/** @returns {NoteShort} */
@@ -49,6 +56,11 @@ class Branch {
return this.treeCache.getNote(this.noteId);
}
/** @returns {NoteShort} */
async getParentNote() {
return this.treeCache.getNote(this.parentNoteId);
}
/** @returns {boolean} true if it's top level, meaning its parent is root note */
isTopLevel() {
return this.parentNoteId === 'root';
@@ -69,13 +81,13 @@ export default Branch;</code></pre>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteFull.html">NoteFull</a></li><li><a href="NoteShort.html">NoteShort</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="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteComplement.html">NoteComplement</a></li><li><a href="NoteShort.html">NoteShort</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
@@ -0,0 +1,76 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: entities/note_complement.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: entities/note_complement.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>/**
* Complements the NoteShort with the main note content and other extra attributes
*/
class NoteComplement {
constructor(row) {
/** @param {string} */
this.noteId = row.noteId;
/** @param {string} */
this.content = row.content;
/** @param {string} */
this.dateCreated = row.dateCreated;
/** @param {string} */
this.dateModified = row.dateModified;
/** @param {string} */
this.utcDateCreated = row.utcDateCreated;
/** @param {string} */
this.utcDateModified = row.utcDateModified;
}
}
export default NoteComplement;</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteComplement.html">NoteComplement</a></li><li><a href="NoteShort.html">NoteShort</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>
+227 -106
View File
@@ -41,30 +41,15 @@ class NoteShort {
/**
* @param {TreeCache} treeCache
* @param {Object.&lt;string, Object>} row
* @param {Branch[]} branches - all relevant branches, i.e. where this note is either child or parent
*/
constructor(treeCache, row, branches) {
constructor(treeCache, row) {
this.treeCache = treeCache;
/** @param {string} */
this.noteId = row.noteId;
/** @param {string} */
this.title = row.title;
/** @param {int} */
this.contentLength = row.contentLength;
/** @param {boolean} */
this.isProtected = row.isProtected;
/** @param {string} one of 'text', 'code', 'file' or 'render' */
this.type = row.type;
/** @param {string} content-type, e.g. "application/json" */
this.mime = row.mime;
/** @param {boolean} */
this.isDeleted = row.isDeleted;
/** @param {boolean} */
this.archived = row.archived;
/** @param {string} */
this.cssClass = row.cssClass;
/** @param {string} */
this.iconClass = row.iconClass;
/** @type {string[]} */
this.attributes = [];
/** @type {string[]} */
this.targetRelations = [];
/** @type {string[]} */
this.parents = [];
@@ -77,19 +62,24 @@ class NoteShort {
/** @type {Object.&lt;string, string>} */
this.childToBranch = {};
for (const branch of branches) {
if (this.noteId === branch.noteId) {
this.parents.push(branch.parentNoteId);
this.parentToBranch[branch.parentNoteId] = branch.branchId;
}
else if (this.noteId === branch.parentNoteId) {
this.children.push(branch.noteId);
this.childToBranch[branch.noteId] = branch.branchId;
}
else {
throw new Error(`Unknown branch ${branch.branchId} for note ${this.noteId}`);
}
}
this.update(row);
}
update(row) {
/** @param {string} */
this.noteId = row.noteId;
/** @param {string} */
this.title = row.title;
/** @param {int} */
this.contentLength = row.contentLength;
/** @param {boolean} */
this.isProtected = !!row.isProtected;
/** @param {string} one of 'text', 'code', 'file' or 'render' */
this.type = row.type;
/** @param {string} content-type, e.g. "application/json" */
this.mime = row.mime;
/** @param {boolean} */
this.isDeleted = row.isDeleted;
}
addParent(parentNoteId, branchId) {
@@ -141,8 +131,13 @@ class NoteShort {
}
}
/** @returns {Promise&lt;Branch[]>} */
async getBranches() {
/** @returns {string[]} */
getBranchIds() {
return Object.values(this.parentToBranch);
}
/** @returns {Branch[]} */
getBranches() {
const branchIds = Object.values(this.parentToBranch);
return this.treeCache.getBranches(branchIds);
@@ -153,8 +148,8 @@ class NoteShort {
return this.children.length > 0;
}
/** @returns {Promise&lt;Branch[]>} */
async getChildBranches() {
/** @returns {Branch[]} */
getChildBranches() {
// don't use Object.values() to guarantee order
const branchIds = this.children.map(childNoteId => this.childToBranch[childNoteId]);
@@ -166,9 +161,9 @@ class NoteShort {
return this.parents;
}
/** @returns {Promise&lt;NoteShort[]>} */
async getParentNotes() {
return await this.treeCache.getNotes(this.parents);
/** @returns {NoteShort[]} */
getParentNotes() {
return this.treeCache.getNotesFromCache(this.parents);
}
/** @returns {string[]} */
@@ -184,126 +179,249 @@ class NoteShort {
/**
* @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
* @returns {Attribute[]} all note's attributes, including inherited ones
*/
async getAttributes(type, name) {
if (!this.__attributeCache) {
this.__attributeCache = (await server.get('notes/' + this.noteId + '/attributes'))
.map(attrRow => new Attribute(this.treeCache, attrRow));
getOwnedAttributes(type, name) {
const attrs = this.attributes
.map(attributeId => this.treeCache.attributes[attributeId])
.filter(attr => !!attr);
return this.__filterAttrs(attrs, type, name)
}
/**
* @param {string} [type] - (optional) attribute type to filter
* @param {string} [name] - (optional) attribute name to filter
* @returns {Attribute[]} all note's attributes, including inherited ones
*/
getAttributes(type, name) {
const ownedAttributes = this.getOwnedAttributes();
const attrArrs = [
ownedAttributes
];
for (const templateAttr of ownedAttributes.filter(oa => oa.type === 'relation' &amp;&amp; oa.name === 'template')) {
const templateNote = this.treeCache.getNoteFromCache(templateAttr.value);
if (templateNote) {
attrArrs.push(templateNote.getAttributes());
}
}
if (this.noteId !== 'root') {
for (const parentNote of this.getParentNotes()) {
// these virtual parent-child relationships are also loaded into frontend tree cache
if (parentNote.type !== 'search') {
attrArrs.push(parentNote.getInheritableAttributes());
}
}
}
const attributes = attrArrs.flat();
return this.__filterAttrs(attributes, type, name);
}
__filterAttrs(attributes, type, 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.slice();
return attributes.filter(attr => attr.type === type &amp;&amp; attr.name === name);
} else if (type) {
return attributes.filter(attr => attr.type === type);
} else if (name) {
return attributes.filter(attr => attr.name === name);
} else {
return attributes;
}
}
getInheritableAttributes() {
const attrs = this.getAttributes();
return attrs.filter(attr => attr.isInheritable);
}
/**
* @param {string} [name] - label name to filter
* @returns {Promise&lt;Attribute[]>} all note's labels (attributes with type label), including inherited ones
* @returns {Attribute[]} all note's labels (attributes with type label), including inherited ones
*/
async getLabels(name) {
return await this.getAttributes(LABEL, name);
getOwnedLabels(name) {
return this.getOwnedAttributes(LABEL, name);
}
/**
* @param {string} [name] - label name to filter
* @returns {Promise&lt;Attribute[]>} all note's label definitions, including inherited ones
* @returns {Attribute[]} all note's labels (attributes with type label), including inherited ones
*/
async getLabelDefinitions(name) {
return await this.getAttributes(LABEL_DEFINITION, name);
getLabels(name) {
return this.getAttributes(LABEL, name);
}
/**
* @param {string} [name] - label name to filter
* @returns {Attribute[]} all note's label definitions, including inherited ones
*/
getLabelDefinitions(name) {
return this.getAttributes(LABEL_DEFINITION, name);
}
/**
* @param {string} [name] - relation name to filter
* @returns {Promise&lt;Attribute[]>} all note's relations (attributes with type relation), including inherited ones
* @returns {Attribute[]} all note's relations (attributes with type relation), including inherited ones
*/
async getRelations(name) {
return await this.getAttributes(RELATION, name);
getOwnedRelations(name) {
return this.getOwnedAttributes(RELATION, name);
}
/**
* @param {string} [name] - relation name to filter
* @returns {Promise&lt;Attribute[]>} all note's relation definitions including inherited ones
* @returns {Attribute[]} all note's relations (attributes with type relation), including inherited ones
*/
async getRelationDefinitions(name) {
return await this.getAttributes(RELATION_DEFINITION, name);
getRelations(name) {
return this.getAttributes(RELATION, name);
}
/**
* @param {string} [name] - relation name to filter
* @returns {Attribute[]} all note's relation definitions including inherited ones
*/
getRelationDefinitions(name) {
return this.getAttributes(RELATION_DEFINITION, 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 (including inherited)
* @returns {boolean} true if note has an attribute with given type and name (including inherited)
*/
async hasAttribute(type, name) {
return !!await this.getAttribute(type, name);
hasAttribute(type, name) {
return !!this.getAttribute(type, name);
}
/**
* @param {string} type - attribute type (label, relation, etc.)
* @param {string} name - attribute name
* @returns {Promise&lt;Attribute>} attribute of given type and name. If there's more such attributes, first is returned. Returns null if there's no such attribute belonging to this note.
* @returns {boolean} true if note has an attribute with given type and name (including inherited)
*/
async getAttribute(type, name) {
const attributes = await this.getAttributes();
return attributes.find(attr => attr.type === type &amp;&amp; attr.name === name);
hasOwnedAttribute(type, name) {
return !!this.getOwnedAttribute(type, name);
}
/**
* @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 {Attribute} attribute of given type and name. If there's more such attributes, first is returned. Returns null if there's no such attribute belonging to this note.
*/
async getAttributeValue(type, name) {
const attr = await this.getAttribute(type, name);
getOwnedAttribute(type, name) {
const attributes = this.getOwnedAttributes(type, name);
return attributes.length > 0 ? attributes[0] : 0;
}
/**
* @param {string} type - attribute type (label, relation, etc.)
* @param {string} name - attribute name
* @returns {Attribute} attribute of given type and name. If there's more such attributes, first is returned. Returns null if there's no such attribute belonging to this note.
*/
getAttribute(type, name) {
const attributes = this.getAttributes(type, name);
return attributes.length > 0 ? attributes[0] : 0;
}
/**
* @param {string} type - attribute type (label, relation, etc.)
* @param {string} name - attribute name
* @returns {string} attribute value of given type and name or null if no such attribute exists.
*/
getOwnedAttributeValue(type, name) {
const attr = this.getOwnedAttribute(type, name);
return attr ? attr.value : null;
}
/**
* @param {string} type - attribute type (label, relation, etc.)
* @param {string} name - attribute name
* @returns {string} attribute value of given type and name or null if no such attribute exists.
*/
getAttributeValue(type, name) {
const attr = this.getAttribute(type, name);
return attr ? attr.value : null;
}
/**
* @param {string} name - label name
* @returns {Promise&lt;boolean>} true if label exists (including inherited)
* @returns {boolean} true if label exists (excluding inherited)
*/
async hasLabel(name) { return await this.hasAttribute(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); }
hasOwnedLabel(name) { return this.hasOwnedAttribute(LABEL, name); }
/**
* @param {string} name - label name
* @returns {Promise&lt;Attribute>} label if it exists, null otherwise
* @returns {boolean} true if label exists (including inherited)
*/
async getLabel(name) { return await this.getAttribute(LABEL, name); }
hasLabel(name) { return this.hasAttribute(LABEL, name); }
/**
* @param {string} name - relation name
* @returns {Promise&lt;Attribute>} relation if it exists, null otherwise
* @returns {boolean} true if relation exists (excluding inherited)
*/
async getRelation(name) { return await this.getAttribute(RELATION, name); }
hasOwnedRelation(name) { return this.hasOwnedAttribute(RELATION, name); }
/**
* @param {string} name - relation name
* @returns {boolean} true if relation exists (including inherited)
*/
hasRelation(name) { return this.hasAttribute(RELATION, name); }
/**
* @param {string} name - label name
* @returns {Promise&lt;string>} label value if label exists, null otherwise
* @returns {Attribute} label if it exists, null otherwise
*/
async getLabelValue(name) { return await this.getAttributeValue(LABEL, name); }
getOwnedLabel(name) { return this.getOwnedAttribute(LABEL, name); }
/**
* @param {string} name - label name
* @returns {Attribute} label if it exists, null otherwise
*/
getLabel(name) { return this.getAttribute(LABEL, name); }
/**
* @param {string} name - relation name
* @returns {Promise&lt;string>} relation value if relation exists, null otherwise
* @returns {Attribute} relation if it exists, null otherwise
*/
async getRelationValue(name) { return await this.getAttributeValue(RELATION, name); }
getOwnedRelation(name) { return this.getOwnedAttribute(RELATION, name); }
/**
* @param {string} name - relation name
* @returns {Attribute} relation if it exists, null otherwise
*/
getRelation(name) { return this.getAttribute(RELATION, name); }
/**
* @param {string} name - label name
* @returns {string} label value if label exists, null otherwise
*/
getOwnedLabelValue(name) { return this.getOwnedAttributeValue(LABEL, name); }
/**
* @param {string} name - label name
* @returns {string} label value if label exists, null otherwise
*/
getLabelValue(name) { return this.getAttributeValue(LABEL, name); }
/**
* @param {string} name - relation name
* @returns {string} relation value if relation exists, null otherwise
*/
getOwnedRelationValue(name) { return this.getOwnedAttributeValue(RELATION, name); }
/**
* @param {string} name - relation name
* @returns {string} relation value if relation exists, null otherwise
*/
getRelationValue(name) { return this.getAttributeValue(RELATION, name); }
/**
* @param {string} name
@@ -320,7 +438,7 @@ class NoteShort {
* @returns {Promise&lt;NoteShort[]>}
*/
async getRelationTargets(name) {
const relations = await this.getRelations(name);
const relations = this.getRelations(name);
const targets = [];
for (const relation of relations) {
@@ -334,18 +452,18 @@ class NoteShort {
* Clear note's attributes cache to force fresh reload for next attribute request.
* Cache is note instance scoped.
*/
invalidate__attributeCache() {
invalidateAttributeCache() {
this.__attributeCache = null;
}
/**
* Get relations which target this note
*
* @returns {Promise&lt;Attribute[]>}
* @returns {Attribute[]}
*/
async getTargetRelations() {
return (await server.get('notes/' + this.noteId + '/target-relations'))
.map(attrRow => new Attribute(this.treeCache, attrRow));
getTargetRelations() {
return this.targetRelations
.map(attributeId => this.treeCache.attributes[attributeId]);
}
get toString() {
@@ -355,11 +473,14 @@ class NoteShort {
get dto() {
const dto = Object.assign({}, this);
delete dto.treeCache;
delete dto.archived;
delete dto.__attributeCache;
return dto;
}
getCssClass() {
const labels = this.getLabels('cssClass');
return labels.map(l => l.value).join(' ');
}
}
export default NoteShort;</code></pre>
@@ -372,13 +493,13 @@ export default NoteShort;</code></pre>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteFull.html">NoteFull</a></li><li><a href="NoteShort.html">NoteShort</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="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteComplement.html">NoteComplement</a></li><li><a href="NoteShort.html">NoteShort</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+3 -3
View File
@@ -303,7 +303,7 @@
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line72">line 72</a>
<a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line76">line 76</a>
</li></ul></dd>
@@ -333,13 +333,13 @@
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteFull.html">NoteFull</a></li><li><a href="NoteShort.html">NoteShort</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="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteComplement.html">NoteComplement</a></li><li><a href="NoteShort.html">NoteShort</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+2 -2
View File
@@ -50,13 +50,13 @@
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteFull.html">NoteFull</a></li><li><a href="NoteShort.html">NoteShort</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="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteComplement.html">NoteComplement</a></li><li><a href="NoteShort.html">NoteShort</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
@@ -32,13 +32,16 @@ import utils from './utils.js';
import toastService from './toast.js';
import linkService from './link.js';
import treeCache from './tree_cache.js';
import noteDetailService from './note_detail.js';
import noteTooltipService from './note_tooltip.js';
import protectedSessionService from './protected_session.js';
import dateNotesService from './date_notes.js';
import StandardWidget from '../widgets/standard_widget.js';
import CollapsibleWidget from '../widgets/collapsible_widget.js';
import ws from "./ws.js";
import hoistedNoteService from "./hoisted_note.js";
import appContext from "./app_context.js";
import TabAwareWidget from "../widgets/tab_aware_widget.js";
import TabCachingWidget from "../widgets/tab_caching_widget.js";
import BasicWidget from "../widgets/basic_widget.js";
/**
* This is the main frontend API interface for scripts. It's published in the local "api" object.
@@ -46,7 +49,7 @@ import hoistedNoteService from "./hoisted_note.js";
* @constructor
* @hideconstructor
*/
function FrontendScriptApi(startNote, currentNote, originEntity = null, tabContext = null, $container = null) {
function FrontendScriptApi(startNote, currentNote, originEntity = null, $container = null) {
const $pluginButtons = $("#plugin-buttons");
/** @property {jQuery} container of all the rendered script content */
@@ -62,11 +65,17 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, tabConte
// to keep consistency with backend API
this.dayjs = dayjs;
/** @property {TabContext|null} - experimental! */
this.tabContext = tabContext;
/** @property {CollapsibleWidget} */
this.CollapsibleWidget = CollapsibleWidget;
/** @property {StandardWidget} */
this.StandardWidget = StandardWidget;
/** @property {TabAwareWidget} */
this.TabAwareWidget = TabAwareWidget;
/** @property {TabCachingWidget} */
this.TabCachingWidget = TabCachingWidget;
/** @property {BasicWidget} */
this.BasicWidget = BasicWidget;
/**
* Activates note in the tree and in the note detail.
@@ -75,14 +84,8 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, tabConte
* @param {string} notePath (or noteId)
* @returns {Promise&lt;void>}
*/
this.activateNote = async (notePath, noteLoadedListener) => {
await treeService.activateNote(notePath, async () => {
await treeService.scrollToActiveNote();
if (noteLoadedListener) {
noteLoadedListener();
}
});
this.activateNote = async notePath => {
await appContext.tabManager.getActiveTabContext().setNote(notePath);
};
/**
@@ -94,7 +97,8 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, tabConte
this.activateNewNote = async notePath => {
await ws.waitForMaxKnownSyncId();
await treeService.activateNote(notePath, noteDetailService.focusAndSelectTitle);
await appContext.tabManager.getActiveTabContext().setNote(notePath);
appContext.triggerEvent('focusAndSelectTitle');
};
/**
@@ -172,9 +176,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, tabConte
currentNoteId: currentNote.noteId,
originEntityName: "notes", // currently there's no other entity on frontend which can trigger event
originEntityId: originEntity ? originEntity.noteId : null
}, {
'trilium-source-id': "script"
});
}, "script");
if (ret.success) {
// wait until all the changes done in the script has been synced to frontend before continuing
@@ -292,28 +294,10 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, tabConte
this.showError = toastService.showError;
/**
* Refresh tree
*
* @method
* @returns {Promise&lt;void>}
* @deprecated - this is now no-op since all the changes should be gracefully handled per widget
*/
this.refreshTree = treeService.reload;
/**
* Refresh active tab
*
* @method
* @returns {Promise&lt;void>}
*/
this.refreshActiveTab = noteDetailService.reload;
/**
* Refresh current tab
*
* @method
* @returns {Promise&lt;void>}
*/
this.refreshAllTabs = noteDetailService.reloadAllTabs;
this.refreshTree = () => {};
/**
* Create note link (jQuery object) for given note.
@@ -327,49 +311,30 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, tabConte
/**
* Adds given text to the editor cursor
*
* @param {string} text
* @param {string} text - this must be clear text, HTML is not supported.
* @method
*/
this.addTextToActiveTabEditor = linkService.addTextToEditor;
this.addTextToActiveTabEditor = text => appContext.triggerCommand('addTextToActiveEditor', {text});
/**
* @method
* @returns {NoteFull} active note (loaded into right pane)
* @returns {NoteShort} active note (loaded into right pane)
*/
this.getActiveTabNote = noteDetailService.getActiveTabNote;
this.getActiveTabNote = () => appContext.tabManager.getActiveTabNote();
/**
* See https://ckeditor.com/docs/ckeditor5/latest/api/module_core_editor_editor-Editor.html for a documentation on the returned instance.
*
* @method
* @returns {Editor|null} CKEditor instance or null (e.g. if active note is not a text note)
* @param callback - method receiving "textEditor" instance
*/
this.getActiveTabTextEditor = noteDetailService.getActiveEditor;
this.getActiveTabTextEditor = callback => appContext.triggerCommand('executeInActiveEditor', {callback});
/**
* @method
* @returns {Promise&lt;string|null>} returns note path of active note or null if there isn't active note
*/
this.getActiveTabNotePath = noteDetailService.getActiveTabNotePath;
/**
* This method checks whether user navigated away from the note from which the scripts has been started.
* This is necessary because script execution is async and by the time it is finished, the user might have
* already navigated away from this page - the end result would be that script might return data for the wrong
* note.
*
* @method
* @return {boolean} returns true if the original note is still loaded, false if user switched to another
*/
this.isNoteStillActive = () => {
return tabContext.note &amp;&amp; this.originEntity.noteId === tabContext.note.noteId;
};
/**
* @method
* @param {function} func - callback called on note change as user is typing (not necessarily tied to save event)
*/
this.onNoteChange = noteDetailService.onNoteChange;
this.getActiveTabNotePath = () => appContext.tabManager.getActiveTabNotePath();
/**
* @method
@@ -378,9 +343,32 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, tabConte
this.setupElementTooltip = noteTooltipService.setupElementTooltip;
/**
* @deprecated use protectNote and protectSubtree instead
* @method
*/
this.protectActiveNote = protectedSessionService.protectNoteAndSendToServer;
this.protectActiveNote = async () => {
const activeNote = appContext.tabManager.getActiveTabNote();
await protectedSessionService.protectNote(activeNote.noteId, true, false);
};
/**
* @method
* @param {string} noteId
* @param {boolean} protect - true to protect note, false to unprotect
*/
this.protectNote = async (noteId, protect) => {
await protectedSessionService.protectNote(noteId, protect, false);
};
/**
* @method
* @param {string} noteId
* @param {boolean} protect - true to protect subtree, false to unprotect
*/
this.protectSubTree = async (noteId, protect) => {
await protectedSessionService.protectNote(noteId, protect, true);
};
/**
* Returns date-note for today. If it doesn't exist, it is automatically created.
@@ -455,13 +443,13 @@ export default FrontendScriptApi;</code></pre>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteFull.html">NoteFull</a></li><li><a href="NoteShort.html">NoteShort</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="Branch.html">Branch</a></li><li><a href="FrontendScriptApi.html">FrontendScriptApi</a></li><li><a href="NoteComplement.html">NoteComplement</a></li><li><a href="NoteShort.html">NoteShort</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a>
</footer>
<script> prettyPrint(); </script>
+6 -3
View File
@@ -26,9 +26,9 @@ app.on('ready', async () => {
await sqlInit.dbConnection;
// if schema doesn't exist -> setup process
// if schema exists, then we need to wait until the migration process is finished
if (await sqlInit.schemaExists()) {
// if db is not initialized -> setup process
// if db is initialized, then we need to wait until the migration process is finished
if (await sqlInit.isDbInitialized()) {
await sqlInit.dbReady;
await windowService.createMainWindow();
@@ -44,4 +44,7 @@ app.on('will-quit', () => {
globalShortcut.unregisterAll();
});
// this is to disable electron warning spam in the dev console (local development only)
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true';
require('./src/www');
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 797 KiB

After

Width:  |  Height:  |  Size: 912 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
+173 -178
View File
@@ -1,9 +1,9 @@
/*
* !!!!!!! This stylesheet is heavily modified compared to the original for similarity with in-editor look !!!!!!!
* This is used for printing and tar HTML export
*
* CKEditor 5 (v15.0.0) content styles.
* Generated on Wed, 27 Nov 2019 13:26:13 GMT.
* CKEditor 5 (v17.0.0) content styles.
* Generated on Fri, 13 Mar 2020 13:27:10 GMT.
* For more information, check out https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/content-styles.html
*/
@@ -16,204 +16,71 @@
--ck-highlight-pen-red: #e91313;
--ck-image-style-spacing: 1.5em;
--ck-todo-list-checkmark-size: 16px;
font-family: Arial, Sans-Serif;
}
/* ckeditor5-list/theme/todolist.css */
.todo-list {
list-style: none;
}
/* ckeditor5-list/theme/todolist.css */
.todo-list li {
margin-bottom: 5px;
}
/* ckeditor5-list/theme/todolist.css */
.todo-list li .todo-list {
margin-top: 5px;
}
/* ckeditor5-list/theme/todolist.css */
.todo-list .todo-list__label > input {
-webkit-appearance: none;
display: inline-block;
position: relative;
width: var(--ck-todo-list-checkmark-size);
height: var(--ck-todo-list-checkmark-size);
vertical-align: middle;
border: 0;
left: -25px;
margin-right: -15px;
right: 0;
margin-left: 0;
}
/* ckeditor5-list/theme/todolist.css */
.todo-list .todo-list__label > input::before {
/* ckeditor5-image/theme/imageresize.css */
.ck-content .image.image_resized {
max-width: 100%;
display: block;
position: absolute;
box-sizing: border-box;
content: '';
}
/* ckeditor5-image/theme/imageresize.css */
.ck-content .image.image_resized img {
width: 100%;
height: 100%;
border: 1px solid hsl(0, 0%, 20%);
border-radius: 2px;
transition: 250ms ease-in-out box-shadow, 250ms ease-in-out background, 250ms ease-in-out border;
}
/* ckeditor5-list/theme/todolist.css */
.todo-list .todo-list__label > input::after {
/* ckeditor5-image/theme/imageresize.css */
.ck-content .image.image_resized > figcaption {
display: block;
position: absolute;
box-sizing: content-box;
pointer-events: none;
content: '';
left: calc( var(--ck-todo-list-checkmark-size) / 3 );
top: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
width: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
height: calc( var(--ck-todo-list-checkmark-size) / 2.6 );
border-style: solid;
border-color: transparent;
border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;
transform: rotate(45deg);
}
/* ckeditor5-list/theme/todolist.css */
.todo-list .todo-list__label > input[checked]::before {
border-color: hsl(126, 64%, 41%);
}
/* ckeditor5-list/theme/todolist.css */
.todo-list .todo-list__label > input[checked]::after {
border-color: hsl(126, 64%, 41%);
}
/* ckeditor5-list/theme/todolist.css */
.todo-list .todo-list__label .todo-list__label__description {
vertical-align: middle;
/* ckeditor5-basic-styles/theme/code.css */
.ck-content code {
background-color: hsla(0, 0%, 78%, 0.3);
padding: .15em;
border-radius: 2px;
}
/* ckeditor5-image/theme/image.css */
.image {
.ck-content .image {
display: table;
clear: both;
text-align: center;
margin: 1em auto;
}
/* ckeditor5-image/theme/image.css */
.image > img {
.ck-content .image > img {
display: block;
margin: 0 auto;
max-width: 100%;
min-width: 50px;
}
/* ckeditor5-block-quote/theme/blockquote.css */
blockquote {
overflow: hidden;
padding-right: 1.5em;
padding-left: 1.5em;
margin-left: 0;
margin-right: 0;
font-style: italic;
border-left: solid 5px hsl(0, 0%, 80%);
}
/* ckeditor5-block-quote/theme/blockquote.css */
.ck-content[dir="rtl"] blockquote {
border-left: 0;
border-right: solid 5px hsl(0, 0%, 80%);
}
/* ckeditor5-image/theme/imageresize.css */
.image.image_resized {
max-width: 100%;
display: block;
box-sizing: border-box;
}
/* ckeditor5-image/theme/imageresize.css */
.image.image_resized img {
width: 100%;
}
/* ckeditor5-image/theme/imageresize.css */
.image.image_resized > figcaption {
display: block;
}
/* ckeditor5-image/theme/imagestyle.css */
.image-style-side,
.image-style-align-left,
.image-style-align-center,
.image-style-align-right {
.ck-content .image-style-side,
.ck-content .image-style-align-left,
.ck-content .image-style-align-center,
.ck-content .image-style-align-right {
max-width: 50%;
}
/* ckeditor5-image/theme/imagestyle.css */
.image-style-side {
.ck-content .image-style-side {
float: right;
margin-left: var(--ck-image-style-spacing);
}
/* ckeditor5-image/theme/imagestyle.css */
.image-style-align-left {
.ck-content .image-style-align-left {
float: left;
margin-right: var(--ck-image-style-spacing);
}
/* ckeditor5-image/theme/imagestyle.css */
.image-style-align-center {
.ck-content .image-style-align-center {
margin-left: auto;
margin-right: auto;
}
/* ckeditor5-image/theme/imagestyle.css */
.image-style-align-right {
.ck-content .image-style-align-right {
float: right;
margin-left: var(--ck-image-style-spacing);
}
/* ckeditor5-media-embed/theme/mediaembed.css */
.media {
clear: both;
margin: 1em 0;
display: block;
min-width: 15em;
}
/* ckeditor5-table/theme/table.css */
.table {
display: table;
margin: 0;
}
/* ckeditor5-table/theme/table.css */
.table table {
border-collapse: collapse;
border-spacing: 0;
border: 1px double hsl(0, 0%, 70%);
}
/* ckeditor5-table/theme/table.css */
.table table td,
.table table th {
min-width: 2em;
padding: .4em;
border: 1px solid #d9d9d9;
}
/* ckeditor5-table/theme/table.css */
.table table th {
font-weight: bold;
background-color: #f5f5f5;
text-align: left;
}
/* ckeditor5-highlight/theme/highlight.css */
.marker-yellow {
background-color: var(--ck-highlight-marker-yellow);
}
/* ckeditor5-highlight/theme/highlight.css */
.marker-green {
background-color: var(--ck-highlight-marker-green);
}
/* ckeditor5-highlight/theme/highlight.css */
.marker-pink {
background-color: var(--ck-highlight-marker-pink);
}
/* ckeditor5-highlight/theme/highlight.css */
.marker-blue {
background-color: var(--ck-highlight-marker-blue);
}
/* ckeditor5-highlight/theme/highlight.css */
.pen-red {
color: var(--ck-highlight-pen-red);
background-color: transparent;
}
/* ckeditor5-highlight/theme/highlight.css */
.pen-green {
color: var(--ck-highlight-pen-green);
background-color: transparent;
}
/* ckeditor5-page-break/theme/pagebreak.css */
.page-break {
.ck-content .page-break {
position: relative;
clear: both;
padding: 5px 0;
@@ -222,14 +89,14 @@ blockquote {
justify-content: center;
}
/* ckeditor5-page-break/theme/pagebreak.css */
.page-break::after {
.ck-content .page-break::after {
content: '';
position: absolute;
border-bottom: 2px dashed hsl(0, 0%, 77%);
width: 100%;
}
/* ckeditor5-page-break/theme/pagebreak.css */
.page-break__label {
.ck-content .page-break__label {
position: relative;
z-index: 1;
padding: .3em .6em;
@@ -248,14 +115,122 @@ blockquote {
-ms-user-select: none;
user-select: none;
}
/* ckeditor5-basic-styles/theme/code.css */
code {
background-color: hsla(0, 0%, 78%, 0.3);
padding: .15em;
/* ckeditor5-block-quote/theme/blockquote.css */
.ck-content blockquote {
overflow: hidden;
padding-right: 1.5em;
padding-left: 1.5em;
margin-left: 0;
margin-right: 0;
font-style: italic;
border-left: solid 5px hsl(0, 0%, 80%);
}
/* ckeditor5-block-quote/theme/blockquote.css */
.ck-content[dir="rtl"] blockquote {
border-left: 0;
border-right: solid 5px hsl(0, 0%, 80%);
}
/* ckeditor5-media-embed/theme/mediaembed.css */
.ck-content .media {
clear: both;
margin: 1em 0;
display: block;
min-width: 15em;
}
/* ckeditor5-table/theme/table.css */
.ck-content .table {
margin: 1em auto;
display: table;
}
/* ckeditor5-table/theme/table.css */
.ck-content .table table {
border-collapse: collapse;
border-spacing: 0;
width: 100%;
height: 100%;
border: 1px double hsl(0, 0%, 70%);
}
/* ckeditor5-table/theme/table.css */
.ck-content .table table td,
.ck-content .table table th {
min-width: 2em;
padding: .4em;
border-color: hsl(0, 0%, 75%);
}
/* ckeditor5-table/theme/table.css */
.ck-content .table table th {
font-weight: bold;
background: hsla(0, 0%, 0%, 5%);
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list {
list-style: none;
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list li {
margin-bottom: 5px;
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list li .todo-list {
margin-top: 5px;
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label > input {
-webkit-appearance: none;
display: inline-block;
position: relative;
width: var(--ck-todo-list-checkmark-size);
height: var(--ck-todo-list-checkmark-size);
vertical-align: middle;
border: 0;
left: -25px;
margin-right: -15px;
right: 0;
margin-left: 0;
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label > input::before {
display: block;
position: absolute;
box-sizing: border-box;
content: '';
width: 100%;
height: 100%;
border: 1px solid hsl(0, 0%, 20%);
border-radius: 2px;
transition: 250ms ease-in-out box-shadow, 250ms ease-in-out background, 250ms ease-in-out border;
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label > input::after {
display: block;
position: absolute;
box-sizing: content-box;
pointer-events: none;
content: '';
left: calc( var(--ck-todo-list-checkmark-size) / 3 );
top: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
width: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
height: calc( var(--ck-todo-list-checkmark-size) / 2.6 );
border-style: solid;
border-color: transparent;
border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;
transform: rotate(45deg);
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label > input[checked]::before {
background: hsl(126, 64%, 41%);
border-color: hsl(126, 64%, 41%);
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label > input[checked]::after {
border-color: hsl(0, 0%, 100%);
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label .todo-list__label__description {
vertical-align: middle;
}
/* ckeditor5-image/theme/imagecaption.css */
.image > figcaption {
.ck-content .image > figcaption {
display: table-caption;
caption-side: bottom;
word-break: break-word;
@@ -265,15 +240,41 @@ code {
font-size: .75em;
outline-offset: -1px;
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .marker-yellow {
background-color: var(--ck-highlight-marker-yellow);
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .marker-green {
background-color: var(--ck-highlight-marker-green);
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .marker-pink {
background-color: var(--ck-highlight-marker-pink);
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .marker-blue {
background-color: var(--ck-highlight-marker-blue);
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .pen-red {
color: var(--ck-highlight-pen-red);
background-color: transparent;
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .pen-green {
color: var(--ck-highlight-pen-green);
background-color: transparent;
}
/* ckeditor5-horizontal-line/theme/horizontalline.css */
hr {
.ck-content hr {
border-width: 1px 0 0;
border-style: solid;
border-color: hsl(0, 0%, 37%);
margin: 0;
}
/* ckeditor5-code-block/theme/codeblock.css */
pre {
.ck-content pre {
padding: 1em;
color: #353535;
background: hsla(0, 0%, 78%, 0.3);
@@ -287,24 +288,18 @@ pre {
min-width: 200px;
}
/* ckeditor5-code-block/theme/codeblock.css */
pre code {
.ck-content pre code {
background: unset;
padding: 0;
border-radius: 0;
}
.ck-widget__selection-handle {
display: none;
}
@media print {
/* ckeditor5-page-break/theme/pagebreak.css */
.page-break {
.ck-content .page-break {
padding: 0;
}
/* ckeditor5-page-break/theme/pagebreak.css */
.page-break::after {
.ck-content .page-break::after {
display: none;
}
}
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+5 -1
View File
@@ -46,10 +46,11 @@
const errors = new eslint().verify(text, {
root: true,
parserOptions: {
ecmaVersion: 2017
ecmaVersion: 2019
},
extends: ['eslint:recommended', 'airbnb-base'],
env: {
'browser': true,
'node': true
},
rules: {
@@ -62,6 +63,9 @@
'no-unused-vars': ['warn', { vars: 'local', args: 'after-used' }],
'no-nested-ternary': 'off',
'no-underscore-dangle': ['error', {'allow': ['_super', '_lookupFactory']}]
},
globals: {
"api": "readonly"
}
});
+2 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+417 -183
View File
@@ -1,5 +1,5 @@
/*!
* jQuery JavaScript Library v3.3.1
* jQuery JavaScript Library v3.4.1
* https://jquery.com/
*
* Includes Sizzle.js
@@ -9,7 +9,7 @@
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2018-01-20T17:24Z
* Date: 2019-05-01T21:04Z
*/
( function( global, factory ) {
@@ -91,20 +91,33 @@ var isWindow = function isWindow( obj ) {
var preservedScriptAttributes = {
type: true,
src: true,
nonce: true,
noModule: true
};
function DOMEval( code, doc, node ) {
function DOMEval( code, node, doc ) {
doc = doc || document;
var i,
var i, val,
script = doc.createElement( "script" );
script.text = code;
if ( node ) {
for ( i in preservedScriptAttributes ) {
if ( node[ i ] ) {
script[ i ] = node[ i ];
// Support: Firefox 64+, Edge 18+
// Some browsers don't support the "nonce" property on scripts.
// On the other hand, just using `getAttribute` is not enough as
// the `nonce` attribute is reset to an empty string whenever it
// becomes browsing-context connected.
// See https://github.com/whatwg/html/issues/2369
// See https://html.spec.whatwg.org/#nonce-attributes
// The `node.getAttribute` check was added for the sake of
// `jQuery.globalEval` so that it can fake a nonce-containing node
// via an object.
val = node[ i ] || node.getAttribute && node.getAttribute( i );
if ( val ) {
script.setAttribute( i, val );
}
}
}
@@ -129,7 +142,7 @@ function toType( obj ) {
var
version = "3.3.1",
version = "3.4.1",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -258,25 +271,28 @@ jQuery.extend = jQuery.fn.extend = function() {
// Extend the base object
for ( name in options ) {
src = target[ name ];
copy = options[ name ];
// Prevent Object.prototype pollution
// Prevent never-ending loop
if ( target === copy ) {
if ( name === "__proto__" || target === copy ) {
continue;
}
// Recurse if we're merging plain objects or arrays
if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
( copyIsArray = Array.isArray( copy ) ) ) ) {
src = target[ name ];
if ( copyIsArray ) {
copyIsArray = false;
clone = src && Array.isArray( src ) ? src : [];
// Ensure proper type for the source value
if ( copyIsArray && !Array.isArray( src ) ) {
clone = [];
} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
clone = {};
} else {
clone = src && jQuery.isPlainObject( src ) ? src : {};
clone = src;
}
copyIsArray = false;
// Never move original objects, clone them
target[ name ] = jQuery.extend( deep, clone, copy );
@@ -329,9 +345,6 @@ jQuery.extend( {
},
isEmptyObject: function( obj ) {
/* eslint-disable no-unused-vars */
// See https://github.com/eslint/eslint/issues/6125
var name;
for ( name in obj ) {
@@ -341,8 +354,8 @@ jQuery.extend( {
},
// Evaluates a script in a global context
globalEval: function( code ) {
DOMEval( code );
globalEval: function( code, options ) {
DOMEval( code, { nonce: options && options.nonce } );
},
each: function( obj, callback ) {
@@ -498,14 +511,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
* Sizzle CSS Selector Engine v2.3.3
* Sizzle CSS Selector Engine v2.3.4
* https://sizzlejs.com/
*
* Copyright jQuery Foundation and other contributors
* Copyright JS Foundation and other contributors
* Released under the MIT license
* http://jquery.org/license
* https://js.foundation/
*
* Date: 2016-08-08
* Date: 2019-04-08
*/
(function( window ) {
@@ -539,6 +552,7 @@ var i,
classCache = createCache(),
tokenCache = createCache(),
compilerCache = createCache(),
nonnativeSelectorCache = createCache(),
sortOrder = function( a, b ) {
if ( a === b ) {
hasDuplicate = true;
@@ -600,8 +614,7 @@ var i,
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
rdescend = new RegExp( whitespace + "|>" ),
rpseudo = new RegExp( pseudos ),
ridentifier = new RegExp( "^" + identifier + "$" ),
@@ -622,6 +635,7 @@ var i,
whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
},
rhtml = /HTML$/i,
rinputs = /^(?:input|select|textarea|button)$/i,
rheader = /^h\d$/i,
@@ -676,9 +690,9 @@ var i,
setDocument();
},
disabledAncestor = addCombinator(
inDisabledFieldset = addCombinator(
function( elem ) {
return elem.disabled === true && ("form" in elem || "label" in elem);
return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
},
{ dir: "parentNode", next: "legend" }
);
@@ -791,18 +805,22 @@ function Sizzle( selector, context, results, seed ) {
// Take advantage of querySelectorAll
if ( support.qsa &&
!compilerCache[ selector + " " ] &&
(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
!nonnativeSelectorCache[ selector + " " ] &&
(!rbuggyQSA || !rbuggyQSA.test( selector )) &&
if ( nodeType !== 1 ) {
newContext = context;
newSelector = selector;
// qSA looks outside Element context, which is not what we want
// Thanks to Andrew Dupont for this workaround technique
// Support: IE <=8
// Support: IE 8 only
// Exclude object elements
} else if ( context.nodeName.toLowerCase() !== "object" ) {
(nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
newSelector = selector;
newContext = context;
// qSA considers elements outside a scoping root when evaluating child or
// descendant combinators, which is not what we want.
// In such cases, we work around the behavior by prefixing every selector in the
// list with an ID selector referencing the scope context.
// Thanks to Andrew Dupont for this technique.
if ( nodeType === 1 && rdescend.test( selector ) ) {
// Capture the context ID, setting it first if necessary
if ( (nid = context.getAttribute( "id" )) ) {
@@ -824,17 +842,16 @@ function Sizzle( selector, context, results, seed ) {
context;
}
if ( newSelector ) {
try {
push.apply( results,
newContext.querySelectorAll( newSelector )
);
return results;
} catch ( qsaError ) {
} finally {
if ( nid === expando ) {
context.removeAttribute( "id" );
}
try {
push.apply( results,
newContext.querySelectorAll( newSelector )
);
return results;
} catch ( qsaError ) {
nonnativeSelectorCache( selector, true );
} finally {
if ( nid === expando ) {
context.removeAttribute( "id" );
}
}
}
@@ -998,7 +1015,7 @@ function createDisabledPseudo( disabled ) {
// Where there is no isDisabled, check manually
/* jshint -W018 */
elem.isDisabled !== !disabled &&
disabledAncestor( elem ) === disabled;
inDisabledFieldset( elem ) === disabled;
}
return elem.disabled === disabled;
@@ -1055,10 +1072,13 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
// documentElement is verified for cases where it doesn't yet exist
// (such as loading iframes in IE - #4833)
var documentElement = elem && (elem.ownerDocument || elem).documentElement;
return documentElement ? documentElement.nodeName !== "HTML" : false;
var namespace = elem.namespaceURI,
docElem = (elem.ownerDocument || elem).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
// https://bugs.jquery.com/ticket/4833
return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
};
/**
@@ -1480,11 +1500,8 @@ Sizzle.matchesSelector = function( elem, expr ) {
setDocument( elem );
}
// Make sure that attribute selectors are quoted
expr = expr.replace( rattributeQuotes, "='$1']" );
if ( support.matchesSelector && documentIsHTML &&
!compilerCache[ expr + " " ] &&
!nonnativeSelectorCache[ expr + " " ] &&
( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
@@ -1498,7 +1515,9 @@ Sizzle.matchesSelector = function( elem, expr ) {
elem.document && elem.document.nodeType !== 11 ) {
return ret;
}
} catch (e) {}
} catch (e) {
nonnativeSelectorCache( expr, true );
}
}
return Sizzle( expr, document, null, [ elem ] ).length > 0;
@@ -1957,7 +1976,7 @@ Expr = Sizzle.selectors = {
"contains": markFunction(function( text ) {
text = text.replace( runescape, funescape );
return function( elem ) {
return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
};
}),
@@ -2096,7 +2115,11 @@ Expr = Sizzle.selectors = {
}),
"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
var i = argument < 0 ? argument + length : argument;
var i = argument < 0 ?
argument + length :
argument > length ?
length :
argument;
for ( ; --i >= 0; ) {
matchIndexes.push( i );
}
@@ -3146,18 +3169,18 @@ jQuery.each( {
return siblings( elem.firstChild );
},
contents: function( elem ) {
if ( nodeName( elem, "iframe" ) ) {
return elem.contentDocument;
}
if ( typeof elem.contentDocument !== "undefined" ) {
return elem.contentDocument;
}
// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
// Treat the template element as a regular one in browsers that
// don't support it.
if ( nodeName( elem, "template" ) ) {
elem = elem.content || elem;
}
// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
// Treat the template element as a regular one in browsers that
// don't support it.
if ( nodeName( elem, "template" ) ) {
elem = elem.content || elem;
}
return jQuery.merge( [], elem.childNodes );
return jQuery.merge( [], elem.childNodes );
}
}, function( name, fn ) {
jQuery.fn[ name ] = function( until, selector ) {
@@ -4466,6 +4489,26 @@ var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
var documentElement = document.documentElement;
var isAttached = function( elem ) {
return jQuery.contains( elem.ownerDocument, elem );
},
composed = { composed: true };
// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
// Check attachment across shadow DOM boundaries when possible (gh-3504)
// Support: iOS 10.0-10.2 only
// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
// leading to errors. We need to check for `getRootNode`.
if ( documentElement.getRootNode ) {
isAttached = function( elem ) {
return jQuery.contains( elem.ownerDocument, elem ) ||
elem.getRootNode( composed ) === elem.ownerDocument;
};
}
var isHiddenWithinTree = function( elem, el ) {
// isHiddenWithinTree might be called from jQuery#filter function;
@@ -4480,7 +4523,7 @@ var isHiddenWithinTree = function( elem, el ) {
// Support: Firefox <=43 - 45
// Disconnected elements can have computed display: none, so first confirm that elem is
// in the document.
jQuery.contains( elem.ownerDocument, elem ) &&
isAttached( elem ) &&
jQuery.css( elem, "display" ) === "none";
};
@@ -4522,7 +4565,8 @@ function adjustCSS( elem, prop, valueParts, tween ) {
unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
// Starting value computation is required for potential unit mismatches
initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
initialInUnit = elem.nodeType &&
( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
rcssNum.exec( jQuery.css( elem, prop ) );
if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
@@ -4669,7 +4713,7 @@ jQuery.fn.extend( {
} );
var rcheckableType = ( /^(?:checkbox|radio)$/i );
var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
@@ -4741,7 +4785,7 @@ function setGlobalEval( elems, refElements ) {
var rhtml = /<|&#?\w+;/;
function buildFragment( elems, context, scripts, selection, ignored ) {
var elem, tmp, tag, wrap, contains, j,
var elem, tmp, tag, wrap, attached, j,
fragment = context.createDocumentFragment(),
nodes = [],
i = 0,
@@ -4805,13 +4849,13 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
continue;
}
contains = jQuery.contains( elem.ownerDocument, elem );
attached = isAttached( elem );
// Append to fragment
tmp = getAll( fragment.appendChild( elem ), "script" );
// Preserve script evaluation history
if ( contains ) {
if ( attached ) {
setGlobalEval( tmp );
}
@@ -4854,8 +4898,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
div.innerHTML = "<textarea>x</textarea>";
support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
} )();
var documentElement = document.documentElement;
var
@@ -4871,8 +4913,19 @@ function returnFalse() {
return false;
}
// Support: IE <=9 - 11+
// focus() and blur() are asynchronous, except when they are no-op.
// So expect focus to be synchronous when the element is already active,
// and blur to be synchronous when the element is not already active.
// (focus and blur are always synchronous in other supported browsers,
// this just defines when we can count on it).
function expectSync( elem, type ) {
return ( elem === safeActiveElement() ) === ( type === "focus" );
}
// Support: IE <=9 only
// See #13393 for more info
// Accessing document.activeElement can throw unexpectedly
// https://bugs.jquery.com/ticket/13393
function safeActiveElement() {
try {
return document.activeElement;
@@ -5172,9 +5225,10 @@ jQuery.event = {
while ( ( handleObj = matched.handlers[ j++ ] ) &&
!event.isImmediatePropagationStopped() ) {
// Triggered event must either 1) have no namespace, or 2) have namespace(s)
// a subset or equal to those in the bound event (both can have no namespace).
if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
// If the event is namespaced, then each handler is only invoked if it is
// specially universal or its namespaces are a superset of the event's.
if ( !event.rnamespace || handleObj.namespace === false ||
event.rnamespace.test( handleObj.namespace ) ) {
event.handleObj = handleObj;
event.data = handleObj.data;
@@ -5298,39 +5352,51 @@ jQuery.event = {
// Prevent triggered image.load events from bubbling to window.load
noBubble: true
},
focus: {
// Fire native event if possible so blur/focus sequence is correct
trigger: function() {
if ( this !== safeActiveElement() && this.focus ) {
this.focus();
return false;
}
},
delegateType: "focusin"
},
blur: {
trigger: function() {
if ( this === safeActiveElement() && this.blur ) {
this.blur();
return false;
}
},
delegateType: "focusout"
},
click: {
// For checkbox, fire native event so checked state will be right
trigger: function() {
if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
this.click();
return false;
// Utilize native event to ensure correct state for checkable inputs
setup: function( data ) {
// For mutual compressibility with _default, replace `this` access with a local var.
// `|| data` is dead code meant only to preserve the variable through minification.
var el = this || data;
// Claim the first handler
if ( rcheckableType.test( el.type ) &&
el.click && nodeName( el, "input" ) ) {
// dataPriv.set( el, "click", ... )
leverageNative( el, "click", returnTrue );
}
// Return false to allow normal processing in the caller
return false;
},
trigger: function( data ) {
// For mutual compressibility with _default, replace `this` access with a local var.
// `|| data` is dead code meant only to preserve the variable through minification.
var el = this || data;
// Force setup before triggering a click
if ( rcheckableType.test( el.type ) &&
el.click && nodeName( el, "input" ) ) {
leverageNative( el, "click" );
}
// Return non-false to allow normal event-path propagation
return true;
},
// For cross-browser consistency, don't fire native .click() on links
// For cross-browser consistency, suppress native .click() on links
// Also prevent it if we're currently inside a leveraged native-event stack
_default: function( event ) {
return nodeName( event.target, "a" );
var target = event.target;
return rcheckableType.test( target.type ) &&
target.click && nodeName( target, "input" ) &&
dataPriv.get( target, "click" ) ||
nodeName( target, "a" );
}
},
@@ -5347,6 +5413,93 @@ jQuery.event = {
}
};
// Ensure the presence of an event listener that handles manually-triggered
// synthetic events by interrupting progress until reinvoked in response to
// *native* events that it fires directly, ensuring that state changes have
// already occurred before other listeners are invoked.
function leverageNative( el, type, expectSync ) {
// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
if ( !expectSync ) {
if ( dataPriv.get( el, type ) === undefined ) {
jQuery.event.add( el, type, returnTrue );
}
return;
}
// Register the controller as a special universal handler for all event namespaces
dataPriv.set( el, type, false );
jQuery.event.add( el, type, {
namespace: false,
handler: function( event ) {
var notAsync, result,
saved = dataPriv.get( this, type );
if ( ( event.isTrigger & 1 ) && this[ type ] ) {
// Interrupt processing of the outer synthetic .trigger()ed event
// Saved data should be false in such cases, but might be a leftover capture object
// from an async native handler (gh-4350)
if ( !saved.length ) {
// Store arguments for use when handling the inner native event
// There will always be at least one argument (an event object), so this array
// will not be confused with a leftover capture object.
saved = slice.call( arguments );
dataPriv.set( this, type, saved );
// Trigger the native event and capture its result
// Support: IE <=9 - 11+
// focus() and blur() are asynchronous
notAsync = expectSync( this, type );
this[ type ]();
result = dataPriv.get( this, type );
if ( saved !== result || notAsync ) {
dataPriv.set( this, type, false );
} else {
result = {};
}
if ( saved !== result ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
return result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
// (focus or blur), assume that the surrogate already propagated from triggering the
// native event and prevent that from happening again here.
// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
// bubbling surrogate propagates *after* the non-bubbling base), but that seems
// less bad than duplication.
} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
event.stopPropagation();
}
// If this is a native event triggered above, everything is now in order
// Fire an inner synthetic event with the original arguments
} else if ( saved.length ) {
// ...and capture the result
dataPriv.set( this, type, {
value: jQuery.event.trigger(
// Support: IE <=9 - 11+
// Extend with the prototype to reset the above stopImmediatePropagation()
jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
saved.slice( 1 ),
this
)
} );
// Abort handling of the native event
event.stopImmediatePropagation();
}
}
} );
}
jQuery.removeEvent = function( elem, type, handle ) {
// This "if" is needed for plain objects
@@ -5459,6 +5612,7 @@ jQuery.each( {
shiftKey: true,
view: true,
"char": true,
code: true,
charCode: true,
key: true,
keyCode: true,
@@ -5505,6 +5659,33 @@ jQuery.each( {
}
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
jQuery.event.special[ type ] = {
// Utilize native event if possible so blur/focus sequence is correct
setup: function() {
// Claim the first handler
// dataPriv.set( this, "focus", ... )
// dataPriv.set( this, "blur", ... )
leverageNative( this, type, expectSync );
// Return false to allow normal processing in the caller
return false;
},
trigger: function() {
// Force setup before trigger
leverageNative( this, type );
// Return non-false to allow normal event-path propagation
return true;
},
delegateType: delegateType
};
} );
// Create mouseenter/leave events using mouseover/out and event-time checks
// so that event delegation works in jQuery.
// Do the same for pointerenter/pointerleave and pointerover/pointerout
@@ -5755,11 +5936,13 @@ function domManip( collection, args, callback, ignored ) {
if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
// Optional AJAX dependency, but won't run scripts if not present
if ( jQuery._evalUrl ) {
jQuery._evalUrl( node.src );
if ( jQuery._evalUrl && !node.noModule ) {
jQuery._evalUrl( node.src, {
nonce: node.nonce || node.getAttribute( "nonce" )
} );
}
} else {
DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node );
DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
}
}
}
@@ -5781,7 +5964,7 @@ function remove( elem, selector, keepData ) {
}
if ( node.parentNode ) {
if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
if ( keepData && isAttached( node ) ) {
setGlobalEval( getAll( node, "script" ) );
}
node.parentNode.removeChild( node );
@@ -5799,7 +5982,7 @@ jQuery.extend( {
clone: function( elem, dataAndEvents, deepDataAndEvents ) {
var i, l, srcElements, destElements,
clone = elem.cloneNode( true ),
inPage = jQuery.contains( elem.ownerDocument, elem );
inPage = isAttached( elem );
// Fix IE cloning issues
if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
@@ -6095,8 +6278,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// Support: IE 9 only
// Detect overflow:scroll screwiness (gh-3699)
// Support: Chrome <=64
// Don't get tricked when zoom affects offsetWidth (gh-4029)
div.style.position = "absolute";
scrollboxSizeVal = div.offsetWidth === 36 || "absolute";
scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
documentElement.removeChild( container );
@@ -6167,7 +6352,7 @@ function curCSS( elem, name, computed ) {
if ( computed ) {
ret = computed.getPropertyValue( name ) || computed[ name ];
if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
if ( ret === "" && !isAttached( elem ) ) {
ret = jQuery.style( elem, name );
}
@@ -6223,30 +6408,13 @@ function addGetHookIf( conditionFn, hookFn ) {
}
var
var cssPrefixes = [ "Webkit", "Moz", "ms" ],
emptyStyle = document.createElement( "div" ).style,
vendorProps = {};
// Swappable if display is none or starts with table
// except "table", "table-cell", or "table-caption"
// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
rcustomProp = /^--/,
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform = {
letterSpacing: "0",
fontWeight: "400"
},
cssPrefixes = [ "Webkit", "Moz", "ms" ],
emptyStyle = document.createElement( "div" ).style;
// Return a css property mapped to a potentially vendor prefixed property
// Return a vendor-prefixed property or undefined
function vendorPropName( name ) {
// Shortcut for names that are not vendor prefixed
if ( name in emptyStyle ) {
return name;
}
// Check for vendor prefixed names
var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
i = cssPrefixes.length;
@@ -6259,16 +6427,33 @@ function vendorPropName( name ) {
}
}
// Return a property mapped along what jQuery.cssProps suggests or to
// a vendor prefixed property.
// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
function finalPropName( name ) {
var ret = jQuery.cssProps[ name ];
if ( !ret ) {
ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
var final = jQuery.cssProps[ name ] || vendorProps[ name ];
if ( final ) {
return final;
}
return ret;
if ( name in emptyStyle ) {
return name;
}
return vendorProps[ name ] = vendorPropName( name ) || name;
}
var
// Swappable if display is none or starts with table
// except "table", "table-cell", or "table-caption"
// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
rcustomProp = /^--/,
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform = {
letterSpacing: "0",
fontWeight: "400"
};
function setPositiveNumber( elem, value, subtract ) {
// Any relative (+/-) values have already been
@@ -6340,7 +6525,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
delta -
extra -
0.5
) );
// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
// Use an explicit zero to avoid NaN (gh-3964)
) ) || 0;
}
return delta;
@@ -6350,9 +6538,16 @@ function getWidthOrHeight( elem, dimension, extra ) {
// Start with computed style
var styles = getStyles( elem ),
// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
// Fake content-box until we know it's needed to know the true value.
boxSizingNeeded = !support.boxSizingReliable() || extra,
isBorderBox = boxSizingNeeded &&
jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
valueIsBorderBox = isBorderBox,
val = curCSS( elem, dimension, styles ),
isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
valueIsBorderBox = isBorderBox;
offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
// Support: Firefox <=54
// Return a confounding non-pixel value or feign ignorance, as appropriate.
@@ -6363,22 +6558,29 @@ function getWidthOrHeight( elem, dimension, extra ) {
val = "auto";
}
// Check for style in case a browser which returns unreliable values
// for getComputedStyle silently falls back to the reliable elem.style
valueIsBorderBox = valueIsBorderBox &&
( support.boxSizingReliable() || val === elem.style[ dimension ] );
// Fall back to offsetWidth/offsetHeight when value is "auto"
// This happens for inline elements with no explicit setting (gh-3571)
// Support: Android <=4.1 - 4.3 only
// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
if ( val === "auto" ||
!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) {
// Support: IE 9-11 only
// Also use offsetWidth/offsetHeight for when box sizing is unreliable
// We use getClientRects() to check for hidden/disconnected.
// In those cases, the computed value can be trusted to be border-box
if ( ( !support.boxSizingReliable() && isBorderBox ||
val === "auto" ||
!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
elem.getClientRects().length ) {
val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];
isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
// offsetWidth/offsetHeight provide border-box values
valueIsBorderBox = true;
// Where available, offsetWidth/offsetHeight approximate border box dimensions.
// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
// retrieved value as a content box dimension.
valueIsBorderBox = offsetProp in elem;
if ( valueIsBorderBox ) {
val = elem[ offsetProp ];
}
}
// Normalize "" and auto
@@ -6424,6 +6626,13 @@ jQuery.extend( {
"flexGrow": true,
"flexShrink": true,
"fontWeight": true,
"gridArea": true,
"gridColumn": true,
"gridColumnEnd": true,
"gridColumnStart": true,
"gridRow": true,
"gridRowEnd": true,
"gridRowStart": true,
"lineHeight": true,
"opacity": true,
"order": true,
@@ -6479,7 +6688,9 @@ jQuery.extend( {
}
// If a number was passed in, add the unit (except for certain CSS properties)
if ( type === "number" ) {
// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
// "px" to a few hardcoded values.
if ( type === "number" && !isCustomProp ) {
value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
}
@@ -6579,18 +6790,29 @@ jQuery.each( [ "height", "width" ], function( i, dimension ) {
set: function( elem, value, extra ) {
var matches,
styles = getStyles( elem ),
isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
subtract = extra && boxModelAdjustment(
elem,
dimension,
extra,
isBorderBox,
styles
);
// Only read styles.position if the test has a chance to fail
// to avoid forcing a reflow.
scrollboxSizeBuggy = !support.scrollboxSize() &&
styles.position === "absolute",
// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
boxSizingNeeded = scrollboxSizeBuggy || extra,
isBorderBox = boxSizingNeeded &&
jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
subtract = extra ?
boxModelAdjustment(
elem,
dimension,
extra,
isBorderBox,
styles
) :
0;
// Account for unreliable border-box dimensions by comparing offset* to computed and
// faking a content-box to get border and padding (gh-3699)
if ( isBorderBox && support.scrollboxSize() === styles.position ) {
if ( isBorderBox && scrollboxSizeBuggy ) {
subtract -= Math.ceil(
elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
parseFloat( styles[ dimension ] ) -
@@ -6758,9 +6980,9 @@ Tween.propHooks = {
// Use .style if available and use plain properties where available.
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 &&
( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
jQuery.cssHooks[ tween.prop ] ) ) {
} else if ( tween.elem.nodeType === 1 && (
jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
tween.elem[ tween.prop ] = tween.now;
@@ -8467,6 +8689,10 @@ jQuery.param = function( a, traditional ) {
encodeURIComponent( value == null ? "" : value );
};
if ( a == null ) {
return "";
}
// If an array was passed in, assume that it is an array of form elements.
if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
@@ -8969,12 +9195,14 @@ jQuery.extend( {
if ( !responseHeaders ) {
responseHeaders = {};
while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
.concat( match[ 2 ] );
}
}
match = responseHeaders[ key.toLowerCase() ];
match = responseHeaders[ key.toLowerCase() + " " ];
}
return match == null ? null : match;
return match == null ? null : match.join( ", " );
},
// Raw string
@@ -9363,7 +9591,7 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
} );
jQuery._evalUrl = function( url ) {
jQuery._evalUrl = function( url, options ) {
return jQuery.ajax( {
url: url,
@@ -9373,7 +9601,16 @@ jQuery._evalUrl = function( url ) {
cache: true,
async: false,
global: false,
"throws": true
// Only evaluate the response if it is successful (gh-4126)
// dataFilter is not invoked for failure responses, so using it instead
// of the default converter is kludgy but it works.
converters: {
"text script": function() {}
},
dataFilter: function( response ) {
jQuery.globalEval( response, options );
}
} );
};
@@ -9656,24 +9893,21 @@ jQuery.ajaxPrefilter( "script", function( s ) {
// Bind script tag hack transport
jQuery.ajaxTransport( "script", function( s ) {
// This transport only deals with cross domain requests
if ( s.crossDomain ) {
// This transport only deals with cross domain or forced-by-attrs requests
if ( s.crossDomain || s.scriptAttrs ) {
var script, callback;
return {
send: function( _, complete ) {
script = jQuery( "<script>" ).prop( {
charset: s.scriptCharset,
src: s.url
} ).on(
"load error",
callback = function( evt ) {
script = jQuery( "<script>" )
.attr( s.scriptAttrs || {} )
.prop( { charset: s.scriptCharset, src: s.url } )
.on( "load error", callback = function( evt ) {
script.remove();
callback = null;
if ( evt ) {
complete( evt.type === "error" ? 404 : 200, evt.type );
}
}
);
} );
// Use native DOM manipulation to avoid our domManip AJAX trickery
document.head.appendChild( script[ 0 ] );
+2 -2
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -7
View File
File diff suppressed because one or more lines are too long
+642 -551
View File
File diff suppressed because it is too large Load Diff
-3
View File
File diff suppressed because one or more lines are too long
+78 -92
View File
@@ -24,26 +24,10 @@
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(function () {
return (root.returnExportsGlobal = factory());
});
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like enviroments that support module.exports,
// like Node.
module.exports = factory();
} else {
// Browser globals
root.Springy = factory();
}
}(this, function() {
window.Springy = function() {
const Springy = {};
var Springy = {};
var Graph = Springy.Graph = function() {
const Graph = Springy.Graph = function () {
this.nodeSet = {};
this.nodes = [];
this.edges = [];
@@ -54,25 +38,25 @@
this.eventListeners = [];
};
var Node = Springy.Node = function(id, data) {
const Node = Springy.Node = function (id, data) {
this.id = id;
this.data = (data !== undefined) ? data : {};
// Data fields used by layout algorithm in this file:
// this.data.mass
// Data used by default renderer in springyui.js
// this.data.label
// Data fields used by layout algorithm in this file:
// this.data.mass
// Data used by default renderer in springyui.js
// this.data.label
};
var Edge = Springy.Edge = function(id, source, target, data) {
const Edge = Springy.Edge = function (id, source, target, data) {
this.id = id;
this.source = source;
this.target = target;
this.data = (data !== undefined) ? data : {};
// Edge data field used by layout alorithm
// this.data.length
// this.data.type
// Edge data field used by layout alorithm
// this.data.length
// this.data.type
};
Graph.prototype.addNode = function(node) {
@@ -89,15 +73,15 @@
Graph.prototype.addNodes = function() {
// accepts variable number of arguments, where each argument
// is a string that becomes both node identifier and label
for (var i = 0; i < arguments.length; i++) {
var name = arguments[i];
var node = new Node(name, {label:name});
for (let i = 0; i < arguments.length; i++) {
const name = arguments[i];
const node = new Node(name, {label: name});
this.addNode(node);
}
};
Graph.prototype.addEdge = function(edge) {
var exists = false;
let exists = false;
this.edges.forEach(function(e) {
if (edge.id === e.id) { exists = true; }
});
@@ -129,30 +113,30 @@
Graph.prototype.addEdges = function() {
// accepts variable number of arguments, where each argument
// is a triple [nodeid1, nodeid2, attributes]
for (var i = 0; i < arguments.length; i++) {
var e = arguments[i];
var node1 = this.nodeSet[e[0]];
for (let i = 0; i < arguments.length; i++) {
const e = arguments[i];
const node1 = this.nodeSet[e[0]];
if (node1 == undefined) {
throw new TypeError("invalid node name: " + e[0]);
}
var node2 = this.nodeSet[e[1]];
const node2 = this.nodeSet[e[1]];
if (node2 == undefined) {
throw new TypeError("invalid node name: " + e[1]);
}
var attr = e[2];
const attr = e[2];
this.newEdge(node1, node2, attr);
}
};
Graph.prototype.newNode = function(data) {
var node = new Node(this.nextNodeId++, data);
const node = new Node(this.nextNodeId++, data);
this.addNode(node);
return node;
};
Graph.prototype.newEdge = function(source, target, data) {
var edge = new Edge(this.nextEdgeId++, source, target, data);
const edge = new Edge(this.nextEdgeId++, source, target, data);
this.addEdge(edge);
return edge;
};
@@ -210,7 +194,7 @@
delete this.nodeSet[node.id];
}
for (var i = this.nodes.length - 1; i >= 0; i--) {
for (let i = this.nodes.length - 1; i >= 0; i--) {
if (this.nodes[i].id === node.id) {
this.nodes.splice(i, 1);
}
@@ -221,7 +205,7 @@
// removes edges associated with a given node
Graph.prototype.detachNode = function(node) {
var tmpEdges = this.edges.slice();
const tmpEdges = this.edges.slice();
tmpEdges.forEach(function(e) {
if (e.source.id === node.id || e.target.id === node.id) {
this.removeEdge(e);
@@ -233,17 +217,17 @@
// remove a node and it's associated edges from the graph
Graph.prototype.removeEdge = function(edge) {
for (var i = this.edges.length - 1; i >= 0; i--) {
for (let i = this.edges.length - 1; i >= 0; i--) {
if (this.edges[i].id === edge.id) {
this.edges.splice(i, 1);
}
}
for (var x in this.adjacency) {
for (var y in this.adjacency[x]) {
var edges = this.adjacency[x][y];
for (const x in this.adjacency) {
for (const y in this.adjacency[x]) {
const edges = this.adjacency[x][y];
for (var j=edges.length - 1; j>=0; j--) {
for (let j = edges.length - 1; j >= 0; j--) {
if (this.adjacency[x][y][j].id === edge.id) {
this.adjacency[x][y].splice(j, 1);
}
@@ -276,28 +260,28 @@
}
*/
Graph.prototype.merge = function(data) {
var nodes = [];
const nodes = [];
data.nodes.forEach(function(n) {
nodes.push(this.addNode(new Node(n.id, n.data)));
}, this);
data.edges.forEach(function(e) {
var from = nodes[e.from];
var to = nodes[e.to];
const from = nodes[e.from];
const to = nodes[e.to];
var id = (e.directed)
? (id = e.type + "-" + from.id + "-" + to.id)
let id = (e.directed)
? (e.type + "-" + from.id + "-" + to.id)
: (from.id < to.id) // normalise id for non-directed edges
? e.type + "-" + from.id + "-" + to.id
: e.type + "-" + to.id + "-" + from.id;
var edge = this.addEdge(new Edge(id, from, to, e.data));
const edge = this.addEdge(new Edge(id, from, to, e.data));
edge.data.type = e.type;
}, this);
};
Graph.prototype.filterNodes = function(fn) {
var tmpNodes = this.nodes.slice();
const tmpNodes = this.nodes.slice();
tmpNodes.forEach(function(n) {
if (!fn(n)) {
this.removeNode(n);
@@ -306,7 +290,7 @@
};
Graph.prototype.filterEdges = function(fn) {
var tmpEdges = this.edges.slice();
const tmpEdges = this.edges.slice();
tmpEdges.forEach(function(e) {
if (!fn(e)) {
this.removeEdge(e);
@@ -326,9 +310,10 @@
};
// -----------
var Layout = Springy.Layout = {};
Layout.ForceDirected = function(graph, stiffness, repulsion, damping, minEnergyThreshold, maxSpeed) {
const Layout = Springy.Layout = {};
Layout.ForceDirected = function(graph, stopCheckerCallback, stiffness, repulsion, damping, minEnergyThreshold, maxSpeed) {
this.graph = graph;
this.stopCheckerCallback = stopCheckerCallback || (() => false);
this.stiffness = stiffness; // spring stiffness constant
this.repulsion = repulsion; // repulsion constant
this.damping = damping; // velocity damping factor
@@ -341,7 +326,7 @@
Layout.ForceDirected.prototype.point = function(node) {
if (!(node.id in this.nodePoints)) {
var mass = (node.data.mass !== undefined) ? node.data.mass : 1.0;
const mass = (node.data.mass !== undefined) ? node.data.mass : 1.0;
this.nodePoints[node.id] = new Layout.ForceDirected.Point(Vector.random(), mass);
}
@@ -350,11 +335,11 @@
Layout.ForceDirected.prototype.spring = function(edge) {
if (!(edge.id in this.edgeSprings)) {
var length = (edge.data.length !== undefined) ? edge.data.length : 1.0;
const length = (edge.data.length !== undefined) ? edge.data.length : 1.0;
var existingSpring = false;
let existingSpring = false;
var from = this.graph.getEdges(edge.source, edge.target);
const from = this.graph.getEdges(edge.source, edge.target);
from.forEach(function(e) {
if (existingSpring === false && e.id in this.edgeSprings) {
existingSpring = this.edgeSprings[e.id];
@@ -365,8 +350,8 @@
return new Layout.ForceDirected.Spring(existingSpring.point1, existingSpring.point2, 0.0, 0.0);
}
var to = this.graph.getEdges(edge.target, edge.source);
from.forEach(function(e){
const to = this.graph.getEdges(edge.target, edge.source);
to.forEach(function(e){
if (existingSpring === false && e.id in this.edgeSprings) {
existingSpring = this.edgeSprings[e.id];
}
@@ -386,7 +371,7 @@
// callback should accept two arguments: Node, Point
Layout.ForceDirected.prototype.eachNode = function(callback) {
var t = this;
const t = this;
this.graph.nodes.forEach(function(n){
callback.call(t, n, t.point(n));
});
@@ -394,7 +379,7 @@
// callback should accept two arguments: Edge, Spring
Layout.ForceDirected.prototype.eachEdge = function(callback) {
var t = this;
const t = this;
this.graph.edges.forEach(function(e){
callback.call(t, e, t.spring(e));
});
@@ -402,7 +387,7 @@
// callback should accept one argument: Spring
Layout.ForceDirected.prototype.eachSpring = function(callback) {
var t = this;
const t = this;
this.graph.edges.forEach(function(e){
callback.call(t, t.spring(e));
});
@@ -413,12 +398,11 @@
Layout.ForceDirected.prototype.applyCoulombsLaw = function() {
this.eachNode(function(n1, point1) {
this.eachNode(function(n2, point2) {
if (point1 !== point2)
{
var d = point1.p.subtract(point2.p);
var distance = d.magnitude() + 0.1; // avoid massive forces at small distances (and divide by zero)
if (point1 !== point2) {
const d = point1.p.subtract(point2.p);
const distance = d.magnitude() + 0.1; // avoid massive forces at small distances (and divide by zero)
var direction = d.normalise();
const direction = d.normalise();
// apply force to each end point
point1.applyForce(direction.multiply(this.repulsion).divide(distance * distance * distance * 0.5));
@@ -430,9 +414,9 @@
Layout.ForceDirected.prototype.applyHookesLaw = function() {
this.eachSpring(function(spring){
var d = spring.point2.p.subtract(spring.point1.p); // the direction of the spring
var displacement = spring.length - d.magnitude();
var direction = d.normalise();
const d = spring.point2.p.subtract(spring.point1.p); // the direction of the spring
const displacement = spring.length - d.magnitude();
const direction = d.normalise();
// apply force to each end point
spring.point1.applyForce(direction.multiply(spring.k * displacement * -0.5));
@@ -442,7 +426,7 @@
Layout.ForceDirected.prototype.attractToCentre = function() {
this.eachNode(function(node, point) {
var direction = point.p.multiply(-1.0);
const direction = point.p.multiply(-1.0);
point.applyForce(direction.multiply(this.repulsion / 50.0));
});
};
@@ -470,9 +454,9 @@
// Calculate the total kinetic energy of the system
Layout.ForceDirected.prototype.totalEnergy = function(timestep) {
var energy = 0.0;
let energy = 0.0;
this.eachNode(function(node, point) {
var speed = point.v.magnitude();
const speed = point.v.magnitude();
energy += 0.5 * point.m * speed * speed;
});
@@ -484,7 +468,7 @@
* In case it's running then the call is ignored, and none of the callbacks passed is ever executed.
*/
Layout.ForceDirected.prototype.start = function(onRenderStop) {
var t = this;
const t = this;
if (this._started) return;
this._started = true;
@@ -493,12 +477,16 @@
function step() {
t.tick(0.03);
if (t.stopCheckerCallback()) {
onRenderStop();
}
// stop simulation when energy of the system goes below a threshold
if (t._stop || t.totalEnergy() < t.minEnergyThreshold) {
t._started = false;
onRenderStop();
} else {
requestIdleCallback(step, { timeout: 10 });
requestIdleCallback(step, { timeout: 30 });
}
}
@@ -519,11 +507,11 @@
// Find the nearest point to a particular position
Layout.ForceDirected.prototype.nearest = function(pos) {
var min = {node: null, point: null, distance: null};
var t = this;
let min = {node: null, point: null, distance: null};
const t = this;
this.graph.nodes.forEach(function(n){
var point = t.point(n);
var distance = point.p.subtract(pos).magnitude();
const point = t.point(n);
const distance = point.p.subtract(pos).magnitude();
if (min.distance === null || distance < min.distance) {
min = {node: n, point: point, distance: distance};
@@ -535,8 +523,8 @@
// returns [bottomleft, topright]
Layout.ForceDirected.prototype.getBoundingBox = function() {
var bottomleft = new Vector(-2,-2);
var topright = new Vector(2,2);
const bottomleft = new Vector(-2, -2);
const topright = new Vector(2, 2);
this.eachNode(function(n, point) {
if (point.p.x < bottomleft.x) {
@@ -553,14 +541,14 @@
}
});
var padding = topright.subtract(bottomleft).multiply(0.07); // ~5% padding
const padding = topright.subtract(bottomleft).multiply(0.07); // ~5% padding
return {bottomleft: bottomleft.subtract(padding), topright: topright.add(padding)};
};
// Vector
var Vector = Springy.Vector = function(x, y) {
const Vector = Springy.Vector = function(x, y) {
this.x = x;
this.y = y;
};
@@ -629,10 +617,8 @@
/**
* Renderer handles the layout rendering loop
*/
var Renderer = Springy.Renderer = function(layout, onRenderStop) {
const Renderer = Springy.Renderer = function (layout) {
this.layout = layout;
this.onRenderStop = onRenderStop;
this.layout.graph.addGraphListener(this);
};
@@ -657,8 +643,8 @@
this.layout.stop();
};
var isEmpty = function(obj) {
for (var k in obj) {
const isEmpty = function(obj) {
for (const k in obj) {
if (obj.hasOwnProperty(k)) {
return false;
}
@@ -667,4 +653,4 @@
};
return Springy;
}));
}();
+3137 -1399
View File
File diff suppressed because it is too large Load Diff
+41 -38
View File
@@ -2,7 +2,7 @@
"name": "trilium",
"productName": "Trilium Notes",
"description": "Trilium Notes",
"version": "0.40.2",
"version": "0.41.3-beta",
"license": "AGPL-3.0-only",
"main": "electron.js",
"bin": {
@@ -14,75 +14,78 @@
},
"scripts": {
"start-server": "TRILIUM_ENV=dev node ./src/www",
"start-electron": "TRILIUM_ENV=dev electron . --disable-gpu",
"start-electron": "TRILIUM_ENV=dev electron .",
"build-backend-docs": "./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/backend_api src/entities/*.js src/services/backend_script_api.js",
"build-frontend-docs": "./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/javascripts/entities/*.js src/public/javascripts/services/frontend_script_api.js",
"build-docs": "npm run build-backend-docs && npm run build-frontend-docs"
"build-frontend-docs": "./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/app/entities/*.js src/public/app/services/frontend_script_api.js",
"build-docs": "npm run build-backend-docs && npm run build-frontend-docs",
"webpack": "npx webpack -c webpack-desktop.config.js && npx webpack -c webpack-mobile.config.js && npx webpack -c webpack-setup.config.js"
},
"dependencies": {
"async-mutex": "0.1.4",
"axios": "0.19.1",
"async-mutex": "0.2.1",
"axios": "0.19.2",
"body-parser": "1.19.0",
"cls-hooked": "4.2.2",
"commonmark": "0.29.1",
"cookie-parser": "1.4.4",
"csurf": "1.10.0",
"dayjs": "1.8.19",
"cookie-parser": "1.4.5",
"csurf": "1.11.0",
"dayjs": "1.8.24",
"debug": "4.1.1",
"ejs": "2.7.4",
"ejs": "3.0.2",
"electron-debug": "3.0.1",
"electron-dl": "2.0.0",
"electron-dl": "3.0.0",
"electron-find": "1.0.6",
"electron-spellchecker": "2.2.1",
"electron-window-state": "5.0.3",
"express": "4.17.1",
"express-session": "1.17.0",
"file-type": "13.0.3",
"fs-extra": "8.1.0",
"helmet": "3.21.2",
"file-type": "14.1.4",
"fs-extra": "9.0.0",
"helmet": "3.22.0",
"html": "1.0.0",
"html2plaintext": "2.1.2",
"http-proxy-agent": "3.0.0",
"https-proxy-agent": "4.0.0",
"http-proxy-agent": "4.0.1",
"https-proxy-agent": "5.0.0",
"image-type": "4.1.0",
"imagemin": "7.0.1",
"imagemin-giflossy": "5.1.10",
"imagemin-mozjpeg": "8.0.0",
"imagemin-pngquant": "8.0.0",
"ini": "1.3.5",
"jimp": "0.9.3",
"is-svg": "4.2.1",
"jimp": "0.10.2",
"mime-types": "2.1.26",
"moment": "2.24.0",
"multer": "1.4.2",
"node-abi": "2.13.0",
"open": "7.0.0",
"pngjs": "3.4.0",
"node-abi": "2.15.0",
"open": "7.0.3",
"portscanner": "2.2.0",
"rand-token": "0.4.0",
"rcedit": "2.1.0",
"rimraf": "3.0.0",
"rand-token": "1.0.1",
"rcedit": "2.1.1",
"rimraf": "3.0.2",
"sanitize-filename": "1.6.3",
"sax": "1.2.4",
"semver": "7.1.1",
"semver": "7.3.2",
"serve-favicon": "2.5.0",
"session-file-store": "1.3.1",
"simple-node-logger": "18.12.23",
"sqlite": "3.0.3",
"session-file-store": "1.4.0",
"simple-node-logger": "18.12.24",
"sqlite": "4.0.7",
"sqlite3": "4.1.1",
"string-similarity": "4.0.1",
"tar-stream": "2.1.0",
"turndown": "5.0.3",
"tar-stream": "2.1.2",
"turndown": "6.0.0",
"turndown-plugin-gfm": "1.0.2",
"unescape": "1.0.1",
"ws": "7.2.1"
"ws": "7.2.3",
"yauzl": "^2.10.0",
"yazl": "^2.5.1"
},
"devDependencies": {
"electron": "6.0.12",
"electron-builder": "21.2.0",
"electron-packager": "14.1.1",
"electron-rebuild": "1.8.8",
"jsdoc": "3.6.3",
"lorem-ipsum": "2.0.3"
"electron": "9.0.0-beta.16",
"electron-builder": "22.4.1",
"electron-packager": "14.2.1",
"electron-rebuild": "1.10.1",
"jsdoc": "3.6.4",
"lorem-ipsum": "2.0.3",
"webpack": "5.0.0-beta.14",
"webpack-cli": "4.0.0-beta.8"
},
"optionalDependencies": {
"electron-installer-debian": "2.0.1"
+16 -10
View File
@@ -45,11 +45,7 @@ class Attribute extends Entity {
* @returns {Promise<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);
}
/**
@@ -64,11 +60,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);
}
/**
@@ -116,6 +108,20 @@ class Attribute extends Entity {
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;
+17 -11
View File
@@ -28,16 +28,14 @@ class Branch extends Entity {
// 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", "deleteId", "prefix"]; }
constructor(row = {}) {
super(row);
// used to detect move in note tree
this.origParentNoteId = this.parentNoteId;
/** @returns {Promise<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<Note|null>} */
async getParentNote() {
return await repository.getNote(this.parentNoteId);
}
async beforeSaving() {
@@ -65,9 +63,17 @@ class Branch extends Entity {
}
}
// cannot be static!
updatePojo(pojo) {
delete pojo.origParentNoteId;
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
});
}
}
+11
View File
@@ -6,12 +6,15 @@ const RecentNote = require('../entities/recent_note');
const ApiToken = require('../entities/api_token');
const Option = require('../entities/option');
const repository = require('../services/repository');
const cls = require('../services/cls');
const ENTITY_NAME_TO_ENTITY = {
"attributes": Attribute,
"branches": Branch,
"notes": Note,
"note_contents": Note,
"note_revisions": NoteRevision,
"note_revision_contents": NoteRevision,
"recent_notes": RecentNote,
"options": Option,
"api_tokens": ApiToken,
@@ -30,9 +33,13 @@ function createEntityFromRow(row) {
if (row.attributeId) {
entity = new Attribute(row);
cls.setEntityToCache('attributes', row.attributeId, entity);
}
else if (row.noteRevisionId) {
entity = new NoteRevision(row);
cls.setEntityToCache('note_revisions', row.noteRevisionId, entity);
}
else if (row.branchId && row.notePath) {
entity = new RecentNote(row);
@@ -42,9 +49,13 @@ function createEntityFromRow(row) {
}
else if (row.branchId) {
entity = new Branch(row);
cls.setEntityToCache('branches', row.branchId, entity);
}
else if (row.noteId) {
entity = new Note(row);
cls.setEntityToCache('notes', row.noteId, entity);
}
else if (row.name) {
entity = new Option(row);
+11 -10
View File
@@ -36,7 +36,7 @@ const RELATION_DEFINITION = 'relation-definition';
class Note extends Entity {
static get entityName() { return "notes"; }
static get primaryKeyName() { return "noteId"; }
static get hashedProperties() { return ["noteId", "title", "type", "isProtected", "isDeleted", "deleteId"]; }
static get hashedProperties() { return ["noteId", "title", "type", "mime", "isProtected", "isDeleted", "deleteId"]; }
/**
* @param row - object containing database row from "notes" table
@@ -95,15 +95,16 @@ class Note extends Entity {
this.content = "";
}
}
if (this.isStringNote()) {
this.content = this.content === null
? ""
: this.content.toString("UTF-8");
}
}
return this.content;
if (this.isStringNote()) {
return this.content === null
? ""
: this.content.toString("UTF-8");
}
else {
return this.content;
}
}
/** @returns {Promise<*>} */
@@ -810,8 +811,8 @@ class Note extends Entity {
SELECT *
FROM attributes
WHERE noteId = ? AND
isDeleted = 0 AND
type = 'relation' AND
isDeleted = 0 AND
type = 'relation' AND
name IN ('internalLink', 'imageLink', 'relationMapLink', 'includeNoteLink')`, [this.noteId]);
}
+9 -8
View File
@@ -48,7 +48,7 @@ class NoteRevision extends Entity {
}
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) */
@@ -89,15 +89,16 @@ class NoteRevision extends Entity {
this.content = "";
}
}
if (this.isStringNote()) {
this.content = this.content === null
? ""
: this.content.toString("UTF-8");
}
}
return this.content;
if (this.isStringNote()) {
return this.content === null
? ""
: this.content.toString("UTF-8");
}
else {
return this.content;
}
}
/** @returns {Promise} */
+144
View File
@@ -0,0 +1,144 @@
import appContext from "./services/app_context.js";
import utils from './services/utils.js';
import noteTooltipService from './services/note_tooltip.js';
import bundleService from "./services/bundle.js";
import noteAutocompleteService from './services/note_autocomplete.js';
import macInit from './services/mac_init.js';
import contextMenu from "./services/context_menu.js";
import DesktopLayout from "./widgets/desktop_layout.js";
import glob from "./services/glob.js";
glob.setupGlobs();
if (utils.isElectron()) {
utils.dynamicRequire('electron').ipcRenderer.on('globalShortcut', async function(event, actionName) {
appContext.triggerCommand(actionName);
});
}
$('[data-toggle="tooltip"]').tooltip({
html: true
});
macInit.init();
bundleService.getWidgetBundlesByParent().then(widgetBundles => {
const desktopLayout = new DesktopLayout(widgetBundles);
appContext.setLayout(desktopLayout);
appContext.start();
});
noteTooltipService.setupGlobalTooltip();
noteAutocompleteService.init();
if (utils.isElectron()) {
const electron = utils.dynamicRequire('electron');
const {webContents} = electron.remote.getCurrentWindow();
webContents.on('context-menu', (event, params) => {
const {editFlags} = params;
const hasText = params.selectionText.trim().length > 0;
const isMac = process.platform === "darwin";
const platformModifier = isMac ? 'Meta' : 'Ctrl';
const items = [];
if (params.misspelledWord) {
for (const suggestion of params.dictionarySuggestions) {
items.push({
title: suggestion,
command: "replaceMisspelling",
spellingSuggestion: suggestion,
uiIcon: "empty"
});
}
items.push({
title: `Add "${params.misspelledWord}" to dictionary`,
uiIcon: "plus",
handler: () => webContents.session.addWordToSpellCheckerDictionary(params.misspelledWord)
});
items.push({ title: `----` });
}
if (params.isEditable) {
items.push({
enabled: editFlags.canCut && hasText,
title: `Cut <kbd>${platformModifier}+X`,
uiIcon: "cut",
handler: () => webContents.cut()
});
}
if (params.isEditable || hasText) {
items.push({
enabled: editFlags.canCopy && hasText,
title: `Copy <kbd>${platformModifier}+C`,
uiIcon: "copy",
handler: () => webContents.copy()
});
}
if (params.linkURL.length !== 0 && params.mediaType === 'none') {
items.push({
title: `Copy link`,
uiIcon: "copy",
handler: () => {
electron.clipboard.write({
bookmark: params.linkText,
text: params.linkURL
});
}
});
}
if (params.isEditable) {
items.push({
enabled: editFlags.canPaste,
title: `Paste <kbd>${platformModifier}+V`,
uiIcon: "paste",
handler: () => webContents.paste()
});
}
if (params.isEditable) {
items.push({
enabled: editFlags.canPaste,
title: `Paste as plain text <kbd>${platformModifier}+Shift+V`,
uiIcon: "paste",
handler: () => webContents.pasteAndMatchStyle()
});
}
if (hasText) {
const shortenedSelection = params.selectionText.length > 15
? (params.selectionText.substr(0, 13) + "…")
: params.selectionText;
items.push({
enabled: editFlags.canPaste,
title: `Search for "${shortenedSelection}" with DuckDuckGo`,
uiIcon: "search-alt",
handler: () => electron.shell.openExternal(`https://duckduckgo.com/?q=${encodeURIComponent(params.selectionText)}`)
});
}
if (items.length === 0) {
return;
}
contextMenu.show({
x: params.x,
y: params.y,
items,
selectMenuItemHandler: ({command, spellingSuggestion}) => {
if (command === 'replaceMisspelling') {
webContents.insertText(spellingSuggestion);
}
}
});
});
}
@@ -10,8 +10,6 @@ const $buildRevision = $("#build-revision");
const $dataDirectory = $("#data-directory");
export async function showDialog() {
utils.closeActiveDialog();
const appInfo = await server.get('app-info');
$appVersion.text(appInfo.appVersion);
@@ -22,7 +20,5 @@ export async function showDialog() {
$buildRevision.attr('href', 'https://github.com/zadam/trilium/commit/' + appInfo.buildRevision);
$dataDirectory.text(appInfo.dataDirectory);
glob.activeDialog = $dialog;
$dialog.modal();
utils.openDialog($dialog);
}
+92
View File
@@ -0,0 +1,92 @@
import treeService from '../services/tree.js';
import noteAutocompleteService from "../services/note_autocomplete.js";
import utils from "../services/utils.js";
const $dialog = $("#add-link-dialog");
const $form = $("#add-link-form");
const $autoComplete = $("#add-link-note-autocomplete");
const $linkTitle = $("#link-title");
const $addLinkTitleSettings = $("#add-link-title-settings");
const $addLinkTitleFormGroup = $("#add-link-title-form-group");
/** @var TextTypeWidget */
let textTypeWidget;
export async function showDialog(widget) {
textTypeWidget = widget;
$addLinkTitleSettings.toggle(!textTypeWidget.hasSelection());
updateTitleFormGroupVisibility();
$addLinkTitleSettings.find('input[type=radio]').on('change', updateTitleFormGroupVisibility);
// with selection hyper link is implied
if (textTypeWidget.hasSelection()) {
$addLinkTitleSettings.find("input[value='hyper-link']").prop("checked", true);
}
else {
$addLinkTitleSettings.find("input[value='reference-link']").prop("checked", true);
}
utils.openDialog($dialog);
$autoComplete.val('').trigger('focus');
$linkTitle.val('');
async function setDefaultLinkTitle(noteId) {
const noteTitle = await treeService.getNoteTitle(noteId);
$linkTitle.val(noteTitle);
}
noteAutocompleteService.initNoteAutocomplete($autoComplete);
$autoComplete.on('autocomplete:selected', function(event, suggestion, dataset) {
if (!suggestion.path) {
return false;
}
const noteId = treeService.getNoteIdFromNotePath(suggestion.path);
if (noteId) {
setDefaultLinkTitle(noteId);
}
});
$autoComplete.on('autocomplete:cursorchanged', function(event, suggestion, dataset) {
const noteId = treeService.getNoteIdFromNotePath(suggestion.path);
if (noteId) {
setDefaultLinkTitle(noteId);
}
});
noteAutocompleteService.showRecentNotes($autoComplete);
}
function getLinkType() {
return $addLinkTitleSettings.find('input[type=radio]:checked').val();
}
function updateTitleFormGroupVisibility() {
const visible = getLinkType() === 'hyper-link';
$addLinkTitleFormGroup.toggle(visible);
}
$form.on('submit', () => {
const notePath = $autoComplete.getSelectedPath();
if (notePath) {
$dialog.modal('hide');
const linkTitle = getLinkType() === 'reference-link' ? null : $linkTitle.val();
textTypeWidget.addLink(notePath, linkTitle);
}
else {
console.error("No path to add link.");
}
return false;
});
@@ -1,13 +1,12 @@
import noteDetailService from '../services/note_detail.js';
import server from '../services/server.js';
import toastService from "../services/toast.js";
import treeUtils from "../services/tree_utils.js";
import treeService from "../services/tree.js";
import attributeAutocompleteService from "../services/attribute_autocomplete.js";
import utils from "../services/utils.js";
import linkService from "../services/link.js";
import libraryLoader from "../services/library_loader.js";
import noteAutocompleteService from "../services/note_autocomplete.js";
import treeService from "../services/tree.js";
import appContext from "../services/app_context.js";
const $dialog = $("#attributes-dialog");
const $saveAttributesButton = $("#save-attributes-button");
@@ -65,7 +64,7 @@ function AttributesModel() {
for (const attr of ownedAttributes) {
attr.labelValue = attr.type === 'label' ? attr.value : '';
attr.relationValue = attr.type === 'relation' ? (await treeUtils.getNoteTitle(attr.value)) : '';
attr.relationValue = attr.type === 'relation' ? (await treeService.getNoteTitle(attr.value)) : '';
attr.selectedPath = attr.type === 'relation' ? attr.value : '';
attr.labelDefinition = (attr.type === 'label-definition' && attr.value) ? attr.value : {
labelType: "text",
@@ -93,7 +92,7 @@ function AttributesModel() {
}
this.loadAttributes = async function() {
const noteId = noteDetailService.getActiveTabNoteId();
const noteId = appContext.tabManager.getActiveTabNoteId();
const attributes = await server.get('notes/' + noteId + '/attributes');
@@ -139,7 +138,7 @@ function AttributesModel() {
self.updateAttributePositions();
const noteId = noteDetailService.getActiveTabNoteId();
const noteId = appContext.tabManager.getActiveTabNoteId();
const attributesToSave = self.ownedAttributes()
.map(attribute => attribute())
@@ -150,7 +149,7 @@ function AttributesModel() {
attr.value = attr.labelValue;
}
else if (attr.type === 'relation') {
attr.value = treeUtils.getNoteIdFromNotePath(attr.selectedPath);
attr.value = treeService.getNoteIdFromNotePath(attr.selectedPath);
}
else if (attr.type === 'label-definition') {
attr.value = attr.labelDefinition;
@@ -170,13 +169,6 @@ function AttributesModel() {
await showAttributes(attributes);
toastService.showMessage("Attributes have been saved.");
const ctx = noteDetailService.getActiveTabContext();
ctx.attributes.refreshAttributes();
noteDetailService.reload();
treeService.reload();
};
function addLastEmptyRow() {
@@ -287,8 +279,6 @@ function initKoPlugins() {
}
export async function showDialog() {
utils.closeActiveDialog();
await libraryLoader.requireLibrary(libraryLoader.KNOCKOUT);
// lazily apply bindings on first use
@@ -300,11 +290,9 @@ export async function showDialog() {
ko.applyBindings(attributesModel, $dialog[0]);
}
glob.activeDialog = $dialog;
await attributesModel.loadAttributes();
$dialog.modal();
utils.openDialog($dialog);
}
$dialog.on('focus', '.attribute-name', function (e) {
@@ -6,11 +6,7 @@ const $backendLogTextArea = $("#backend-log-textarea");
const $refreshBackendLog = $("#refresh-backend-log-button");
export async function showDialog() {
utils.closeActiveDialog();
glob.activeDialog = $dialog;
$dialog.modal();
utils.openDialog($dialog);
load();
}
@@ -1,7 +1,6 @@
import treeService from '../services/tree.js';
import server from '../services/server.js';
import treeCache from "../services/tree_cache.js";
import treeUtils from "../services/tree_utils.js";
import toastService from "../services/toast.js";
import utils from "../services/utils.js";
@@ -12,15 +11,17 @@ const $noteTitle = $('#branch-prefix-note-title');
let branchId;
export async function showDialog(node) {
utils.closeActiveDialog();
export async function showDialog(notePath) {
const {noteId, parentNoteId} = treeService.getNoteIdAndParentIdFromNotePath(notePath);
glob.activeDialog = $dialog;
if (!noteId || !parentNoteId) {
return;
}
branchId = node.data.branchId;
branchId = await treeCache.getBranchId(parentNoteId, noteId);
const branch = treeCache.getBranch(branchId);
if (branch.noteId === 'root') {
if (!branch || branch.noteId === 'root') {
return;
}
@@ -30,11 +31,11 @@ export async function showDialog(node) {
return;
}
$dialog.modal();
utils.openDialog($dialog);
$treePrefixInput.val(branch.prefix);
const noteTitle = await treeUtils.getNoteTitle(node.data.noteId);
const noteTitle = await treeService.getNoteTitle(noteId);
$noteTitle.text(" - " + noteTitle);
}
@@ -44,8 +45,6 @@ async function savePrefix() {
await server.put('branches/' + branchId + '/set-prefix', { prefix: prefix });
await treeService.setPrefix(branchId, prefix);
$dialog.modal('hide');
toastService.showMessage("Branch prefix has been saved.");

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