mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-29 17:26:38 +01:00 
			
		
		
		
	Compare commits
	
		
			35 Commits
		
	
	
		
			v0.30.2-be
			...
			v0.30.7
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | cdb17ae937 | ||
|  | c240fb9896 | ||
|  | 4b41eddf44 | ||
|  | b51ac112a2 | ||
|  | c2e3a3fe04 | ||
|  | b2052a6ccd | ||
|  | a07479cd5a | ||
|  | 3820384f51 | ||
|  | 0610576e5a | ||
|  | efac7701eb | ||
|  | 27cee1cf33 | ||
|  | b4c6d9f800 | ||
|  | 24c8b39d8e | ||
|  | 0144dc12df | ||
|  | 65684550a8 | ||
|  | 6d09931a39 | ||
|  | 37d2a7939c | ||
|  | a432ad7483 | ||
|  | ae17e4dc60 | ||
|  | 02eddc347a | ||
|  | ee58bf3d5c | ||
|  | ecbaffa5f3 | ||
|  | fe86c09f22 | ||
|  | c8e01d6cce | ||
|  | 7c404f03db | ||
|  | ed1cf6aad5 | ||
|  | 9703fd61e2 | ||
|  | 16790e388b | ||
|  | b48474998b | ||
|  | 95d8f07458 | ||
|  | e628c30c89 | ||
|  | 52a8aae74f | ||
|  | 54b5898582 | ||
|  | 64974d75d5 | ||
|  | bd118027fb | 
							
								
								
									
										2
									
								
								db/migrations/0126__fill_sync_for_note_contents.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								db/migrations/0126__fill_sync_for_note_contents.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | INSERT OR REPLACE INTO sync (entityName, entityId, sourceId, syncDate) | ||||||
|  | SELECT 'note_contents', noteContentId, '', '2019-03-02T18:07:29.182Z' FROM note_contents; | ||||||
							
								
								
									
										6
									
								
								db/migrations/0127__fix_inconsistent_isProtected.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								db/migrations/0127__fix_inconsistent_isProtected.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | UPDATE notes SET title = 'Recovered protected note', isProtected = 0 WHERE noteId IN ( | ||||||
|  |     SELECT noteId FROM notes JOIN note_contents USING(noteId) | ||||||
|  |     WHERE notes.isProtected = 1 | ||||||
|  |       AND note_contents.isProtected = 0 | ||||||
|  |       AND notes.isDeleted = 0 | ||||||
|  | ) | ||||||
| @@ -350,7 +350,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line30">line 30</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line32">line 32</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -535,7 +535,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line304">line 304</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line308">line 308</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -700,7 +700,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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#line177">line 177</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -876,7 +876,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line315">line 315</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line319">line 319</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -980,7 +980,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line602">line 602</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line606">line 606</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1080,7 +1080,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line630">line 630</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line634">line 634</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1184,7 +1184,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line616">line 616</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line620">line 620</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1288,7 +1288,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line80">line 80</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line82">line 82</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1388,7 +1388,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line491">line 491</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line495">line 495</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1619,7 +1619,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line514">line 514</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line518">line 518</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1815,7 +1815,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line552">line 552</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line556">line 556</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2011,7 +2011,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line561">line 561</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line565">line 565</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2111,7 +2111,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line87">line 87</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line89">line 89</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2260,7 +2260,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line402">line 402</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line406">line 406</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2425,7 +2425,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line198">line 198</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line202">line 202</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2590,7 +2590,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line190">line 190</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line194">line 194</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2743,7 +2743,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line414">line 414</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line418">line 418</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2851,7 +2851,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line577">line 577</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line581">line 581</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2955,7 +2955,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line595">line 595</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line599">line 599</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3055,7 +3055,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line63">line 63</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line65">line 65</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3155,7 +3155,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line158">line 158</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line162">line 162</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3259,7 +3259,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line642">line 642</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line646">line 646</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3412,7 +3412,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line408">line 408</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line412">line 412</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3577,7 +3577,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line214">line 214</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line218">line 218</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3742,7 +3742,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line206">line 206</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line210">line 210</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3895,7 +3895,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line426">line 426</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line430">line 430</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4051,7 +4051,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line420">line 420</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line424">line 424</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4159,7 +4159,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line568">line 568</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line572">line 572</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4259,7 +4259,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line139">line 139</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line143">line 143</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4367,7 +4367,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line586">line 586</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line590">line 590</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4467,7 +4467,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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#line169">line 169</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4643,7 +4643,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line295">line 295</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line299">line 299</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4747,7 +4747,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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#line613">line 613</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4900,7 +4900,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line390">line 390</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line394">line 394</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5053,7 +5053,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line396">line 396</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line400">line 400</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5162,7 +5162,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line222">line 222</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line226">line 226</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5244,7 +5244,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line129">line 129</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line131">line 131</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5348,7 +5348,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line121">line 121</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line123">line 123</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5452,7 +5452,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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#line118">line 118</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5556,7 +5556,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line111">line 111</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line113">line 113</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5660,7 +5660,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line134">line 134</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line136">line 136</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5764,7 +5764,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line227">line 227</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line231">line 231</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5991,7 +5991,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line373">line 373</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line377">line 377</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6187,7 +6187,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line477">line 477</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line481">line 481</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6383,7 +6383,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line486">line 486</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line490">line 490</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6610,7 +6610,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line347">line 347</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line351">line 351</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6710,7 +6710,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line94">line 94</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line96">line 96</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6810,7 +6810,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line106">line 106</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line108">line 108</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -7006,7 +7006,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line459">line 459</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line463">line 463</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -7202,7 +7202,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line468">line 468</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line472">line 472</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -7460,7 +7460,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line330">line 330</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line334">line 334</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -7687,7 +7687,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line440">line 440</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line444">line 444</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -7914,7 +7914,7 @@ Cache is note instance scoped. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line450">line 450</a> |         <a href="entities_note.js.html">entities/note.js</a>, <a href="entities_note.js.html#line454">line 454</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
|   | |||||||
| @@ -41,6 +41,8 @@ const LABEL_DEFINITION = 'label-definition'; | |||||||
| const RELATION = 'relation'; | const RELATION = 'relation'; | ||||||
| const RELATION_DEFINITION = 'relation-definition'; | const RELATION_DEFINITION = 'relation-definition'; | ||||||
|  |  | ||||||
|  | const STRING_MIME_TYPES = ["application/x-javascript"]; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * This represents a Note which is a central object in the Trilium Notes project. |  * This represents a Note which is a central object in the Trilium Notes project. | ||||||
|  * |  * | ||||||
| @@ -132,7 +134,7 @@ class Note extends Entity { | |||||||
|  |  | ||||||
|     /** @returns {Promise} */ |     /** @returns {Promise} */ | ||||||
|     async setJsonContent(content) { |     async setJsonContent(content) { | ||||||
|         await this.setContent(JSON.stringify(content)); |         await this.setContent(JSON.stringify(content, null, '\t')); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** @returns {boolean} true if this note is the root of the note tree. Root note has "root" noteId */ |     /** @returns {boolean} true if this note is the root of the note tree. Root note has "root" noteId */ | ||||||
| @@ -160,7 +162,9 @@ class Note extends Entity { | |||||||
|  |  | ||||||
|     /** @returns {boolean} true if the note has string content (not binary) */ |     /** @returns {boolean} true if the note has string content (not binary) */ | ||||||
|     isStringNote() { |     isStringNote() { | ||||||
|         return ["text", "code", "relation-map", "search"].includes(this.type) || this.mime.startsWith('text/'); |         return ["text", "code", "relation-map", "search"].includes(this.type) | ||||||
|  |             || this.mime.startsWith('text/') | ||||||
|  |             || STRING_MIME_TYPES.includes(this.mime); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** @returns {string} JS script environment - either "frontend" or "backend" */ |     /** @returns {string} JS script environment - either "frontend" or "backend" */ | ||||||
| @@ -709,6 +713,7 @@ class Note extends Entity { | |||||||
|         delete pojo.isContentAvailable; |         delete pojo.isContentAvailable; | ||||||
|         delete pojo.__attributeCache; |         delete pojo.__attributeCache; | ||||||
|         delete pojo.titleCipherText; |         delete pojo.titleCipherText; | ||||||
|  |         delete pojo.noteContent; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1244,7 +1244,7 @@ | |||||||
|      |      | ||||||
|  |  | ||||||
|      |      | ||||||
|     <h4 class="name" id="getCodeMimeTypes"><span class="type-signature"></span>getCodeMimeTypes<span class="signature">()</span><span class="type-signature"> → {array}</span></h4> |     <h4 class="name" id="getActiveNote"><span class="type-signature"></span>getActiveNote<span class="signature">()</span><span class="type-signature"> → {<a href="NoteFull.html">NoteFull</a>}</span></h4> | ||||||
|      |      | ||||||
|  |  | ||||||
|      |      | ||||||
| @@ -1292,7 +1292,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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#line236">line 236</a> |         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line211">line 211</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1319,7 +1319,7 @@ | |||||||
|  |  | ||||||
|          |          | ||||||
| <div class="param-desc"> | <div class="param-desc"> | ||||||
|     list of currently used code mime types |     active note (loaded into right pane) | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1330,7 +1330,7 @@ | |||||||
|     </dt> |     </dt> | ||||||
|     <dd> |     <dd> | ||||||
|          |          | ||||||
| <span class="param-type">array</span> | <span class="param-type"><a href="NoteFull.html">NoteFull</a></span> | ||||||
|  |  | ||||||
|  |  | ||||||
|     </dd> |     </dd> | ||||||
| @@ -1348,7 +1348,7 @@ | |||||||
|      |      | ||||||
|  |  | ||||||
|      |      | ||||||
|     <h4 class="name" id="getCurrentNoteContent"><span class="type-signature"></span>getCurrentNoteContent<span class="signature">()</span><span class="type-signature"> → {string}</span></h4> |     <h4 class="name" id="getActiveNoteContent"><span class="type-signature"></span>getActiveNoteContent<span class="signature">()</span><span class="type-signature"> → {string}</span></h4> | ||||||
|      |      | ||||||
|  |  | ||||||
|      |      | ||||||
| @@ -1423,7 +1423,7 @@ | |||||||
|  |  | ||||||
|          |          | ||||||
| <div class="param-desc"> | <div class="param-desc"> | ||||||
|     content of currently loaded note in the editor (HTML, code etc.) |     content of active note (loaded into right pane) | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1452,6 +1452,110 @@ | |||||||
|      |      | ||||||
|  |  | ||||||
|      |      | ||||||
|  |     <h4 class="name" id="getCodeMimeTypes"><span class="type-signature"></span>getCodeMimeTypes<span class="signature">()</span><span class="type-signature"> → {array}</span></h4> | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <dl class="details"> | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |     <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#line242">line 242</a> | ||||||
|  |     </li></ul></dd> | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|  | </dl> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <h5>Returns:</h5> | ||||||
|  |  | ||||||
|  |          | ||||||
|  | <div class="param-desc"> | ||||||
|  |     list of currently used code mime types | ||||||
|  | </div> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <dl> | ||||||
|  |     <dt> | ||||||
|  |         Type | ||||||
|  |     </dt> | ||||||
|  |     <dd> | ||||||
|  |          | ||||||
|  | <span class="param-type">array</span> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     </dd> | ||||||
|  | </dl> | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |          | ||||||
|  |              | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |      | ||||||
|     <h4 class="name" id="getDefaultCodeMimeTypes"><span class="type-signature"></span>getDefaultCodeMimeTypes<span class="signature">()</span><span class="type-signature"> → {array}</span></h4> |     <h4 class="name" id="getDefaultCodeMimeTypes"><span class="type-signature"></span>getDefaultCodeMimeTypes<span class="signature">()</span><span class="type-signature"> → {array}</span></h4> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1500,7 +1604,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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#line230">line 230</a> |         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line236">line 236</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1860,7 +1964,7 @@ otherwise (by e.g. createNoteLink()) | |||||||
|      |      | ||||||
|  |  | ||||||
|      |      | ||||||
|     <h4 class="name" id="isNoteStillLoaded"><span class="type-signature"></span>isNoteStillLoaded<span class="signature">()</span><span class="type-signature"> → {boolean}</span></h4> |     <h4 class="name" id="isNoteStillActive"><span class="type-signature"></span>isNoteStillActive<span class="signature">()</span><span class="type-signature"> → {boolean}</span></h4> | ||||||
|      |      | ||||||
|  |  | ||||||
|      |      | ||||||
| @@ -1915,7 +2019,7 @@ note. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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#line216">line 216</a> |         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line222">line 222</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2068,7 +2172,7 @@ note. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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#line224">line 224</a> |         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line230">line 230</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2255,7 +2359,7 @@ note. | |||||||
|      |      | ||||||
|  |  | ||||||
|      |      | ||||||
|     <h4 class="name" id="protectCurrentNote"><span class="type-signature"></span>protectCurrentNote<span class="signature">()</span><span class="type-signature"></span></h4> |     <h4 class="name" id="protectActiveNote"><span class="type-signature"></span>protectActiveNote<span class="signature">()</span><span class="type-signature"></span></h4> | ||||||
|      |      | ||||||
|  |  | ||||||
|      |      | ||||||
| @@ -2303,7 +2407,7 @@ note. | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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#line253">line 253</a> |         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line259">line 259</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2719,7 +2823,7 @@ Internally this serializes the anonymous function into string and sends it to ba | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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#line242">line 242</a> |         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line248">line 248</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2850,7 +2954,7 @@ Internally this serializes the anonymous function into string and sends it to ba | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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#line248">line 248</a> |         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line254">line 254</a> | ||||||
|     </li></ul></dd> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
|   | |||||||
| @@ -228,9 +228,15 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null) { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @method |      * @method | ||||||
|      * @returns {string} content of currently loaded note in the editor (HTML, code etc.) |      * @returns {string} content of active note (loaded into right pane) | ||||||
|      */ |      */ | ||||||
|     this.getCurrentNoteContent = noteDetailService.getCurrentNoteContent; |     this.getActiveNoteContent = noteDetailService.getCurrentNoteContent; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @method | ||||||
|  |      * @returns {NoteFull} active note (loaded into right pane) | ||||||
|  |      */ | ||||||
|  |     this.getActiveNote = noteDetailService.getCurrentNote; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * This method checks whether user navigated away from the note from which the scripts has been started. |      * This method checks whether user navigated away from the note from which the scripts has been started. | ||||||
| @@ -241,7 +247,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null) { | |||||||
|      * @method |      * @method | ||||||
|      * @return {boolean} returns true if the original note is still loaded, false if user switched to another |      * @return {boolean} returns true if the original note is still loaded, false if user switched to another | ||||||
|      */ |      */ | ||||||
|     this.isNoteStillLoaded = () => { |     this.isNoteStillActive = () => { | ||||||
|         return this.originEntity.noteId === noteDetailService.getCurrentNoteId(); |         return this.originEntity.noteId === noteDetailService.getCurrentNoteId(); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -278,7 +284,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null) { | |||||||
|     /** |     /** | ||||||
|      * @method |      * @method | ||||||
|      */ |      */ | ||||||
|     this.protectCurrentNote = protectedSessionService.protectNoteAndSendToServer; |     this.protectActiveNote = protectedSessionService.protectNoteAndSendToServer; | ||||||
| } | } | ||||||
|  |  | ||||||
| export default FrontendScriptApi;</code></pre> | export default FrontendScriptApi;</code></pre> | ||||||
|   | |||||||
							
								
								
									
										4779
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4779
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -2,7 +2,7 @@ | |||||||
|   "name": "trilium", |   "name": "trilium", | ||||||
|   "productName": "Trilium Notes", |   "productName": "Trilium Notes", | ||||||
|   "description": "Trilium Notes", |   "description": "Trilium Notes", | ||||||
|   "version": "0.30.2-beta", |   "version": "0.30.7", | ||||||
|   "license": "AGPL-3.0-only", |   "license": "AGPL-3.0-only", | ||||||
|   "main": "electron.js", |   "main": "electron.js", | ||||||
|   "bin": { |   "bin": { | ||||||
| @@ -37,7 +37,7 @@ | |||||||
|     "express-session": "1.15.6", |     "express-session": "1.15.6", | ||||||
|     "file-type": "10.8.0", |     "file-type": "10.8.0", | ||||||
|     "fs-extra": "7.0.1", |     "fs-extra": "7.0.1", | ||||||
|     "get-port": "4.1.0", |     "get-port": "4.2.0", | ||||||
|     "helmet": "3.15.1", |     "helmet": "3.15.1", | ||||||
|     "html": "1.0.0", |     "html": "1.0.0", | ||||||
|     "image-type": "3.0.0", |     "image-type": "3.0.0", | ||||||
| @@ -62,7 +62,7 @@ | |||||||
|     "session-file-store": "1.2.0", |     "session-file-store": "1.2.0", | ||||||
|     "simple-node-logger": "18.12.22", |     "simple-node-logger": "18.12.22", | ||||||
|     "sqlite": "3.0.2", |     "sqlite": "3.0.2", | ||||||
|     "tar-stream": "2.0.0", |     "tar-stream": "2.0.1", | ||||||
|     "turndown": "5.0.3", |     "turndown": "5.0.3", | ||||||
|     "unescape": "1.0.1", |     "unescape": "1.0.1", | ||||||
|     "ws": "6.1.4", |     "ws": "6.1.4", | ||||||
|   | |||||||
| @@ -106,7 +106,7 @@ class Note extends Entity { | |||||||
|  |  | ||||||
|     /** @returns {Promise} */ |     /** @returns {Promise} */ | ||||||
|     async setJsonContent(content) { |     async setJsonContent(content) { | ||||||
|         await this.setContent(JSON.stringify(content)); |         await this.setContent(JSON.stringify(content, null, '\t')); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** @returns {boolean} true if this note is the root of the note tree. Root note has "root" noteId */ |     /** @returns {boolean} true if this note is the root of the note tree. Root note has "root" noteId */ | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#fafafa" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-shield"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path></svg> | <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#000000" stroke-opacity="0.03" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-shield"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path></svg> | ||||||
| Before Width: | Height: | Size: 274 B After Width: | Height: | Size: 296 B | 
| @@ -17,7 +17,8 @@ import link from './services/link.js'; | |||||||
| import messagingService from './services/messaging.js'; | import messagingService from './services/messaging.js'; | ||||||
| import noteDetailService from './services/note_detail.js'; | import noteDetailService from './services/note_detail.js'; | ||||||
| import noteType from './services/note_type.js'; | import noteType from './services/note_type.js'; | ||||||
| import protected_session from './services/protected_session.js'; | import protectedSessionService from './services/protected_session.js'; | ||||||
|  | import protectedSessionHolder from './services/protected_session_holder.js'; | ||||||
| import searchNotesService from './services/search_notes.js'; | import searchNotesService from './services/search_notes.js'; | ||||||
| import FrontendScriptApi from './services/frontend_script_api.js'; | import FrontendScriptApi from './services/frontend_script_api.js'; | ||||||
| import ScriptContext from './services/script_context.js'; | import ScriptContext from './services/script_context.js'; | ||||||
| @@ -52,6 +53,8 @@ window.glob.getCurrentNote = noteDetailService.getCurrentNote; | |||||||
| window.glob.requireLibrary = libraryLoader.requireLibrary; | window.glob.requireLibrary = libraryLoader.requireLibrary; | ||||||
| window.glob.ESLINT = libraryLoader.ESLINT; | window.glob.ESLINT = libraryLoader.ESLINT; | ||||||
|  |  | ||||||
|  | protectedSessionHolder.setProtectedSessionId(null); | ||||||
|  |  | ||||||
| window.onerror = function (msg, url, lineNo, columnNo, error) { | window.onerror = function (msg, url, lineNo, columnNo, error) { | ||||||
|     const string = msg.toLowerCase(); |     const string = msg.toLowerCase(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -137,6 +137,10 @@ function linkTypeChanged() { | |||||||
|  |  | ||||||
| $linkTypes.change(linkTypeChanged); | $linkTypes.change(linkTypeChanged); | ||||||
|  |  | ||||||
|  | // return back focus to note text detail after quitting add link | ||||||
|  | // the problem is that cursor position is reset | ||||||
|  | $dialog.on("hidden.bs.modal", () => noteDetailText.focus()); | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
|     showDialog |     showDialog | ||||||
| }; | }; | ||||||
| @@ -79,7 +79,7 @@ $form.submit(() => { | |||||||
| function exportBranch(branchId, type, format, version) { | function exportBranch(branchId, type, format, version) { | ||||||
|     exportId = utils.randomString(10); |     exportId = utils.randomString(10); | ||||||
|  |  | ||||||
|     const url = utils.getHost() + `/api/notes/${branchId}/export/${type}/${format}/${version}/${exportId}?protectedSessionId=` + encodeURIComponent(protectedSessionHolder.getProtectedSessionId()); |     const url = utils.getHost() + `/api/notes/${branchId}/export/${type}/${format}/${version}/${exportId}`; | ||||||
|  |  | ||||||
|     utils.download(url); |     utils.download(url); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ async function executeBundle(bundle, originEntity) { | |||||||
|         }.call(apiContext)); |         }.call(apiContext)); | ||||||
|     } |     } | ||||||
|     catch (e) { |     catch (e) { | ||||||
|         infoService.showAndLogError(`Execution of script "${bundle.note.title}" (${bundle.note.noteId}) failed with error: ${e.message}`); |         infoService.showAndLogError(`Execution of ${bundle.noteId} failed with error: ${e.message}`); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| const $contextMenuContainer = $("#context-menu-container"); | const $contextMenuContainer = $("#context-menu-container"); | ||||||
|  |  | ||||||
|  | let dateContextMenuOpenedMs = 0; | ||||||
|  |  | ||||||
| function initContextMenu(event, itemContainer, selectContextMenuItem) { | function initContextMenu(event, itemContainer, selectContextMenuItem) { | ||||||
|     event.stopPropagation(); |     event.stopPropagation(); | ||||||
|  |  | ||||||
| @@ -55,6 +57,8 @@ function initContextMenu(event, itemContainer, selectContextMenuItem) { | |||||||
|         top = event.pageY - 10; |         top = event.pageY - 10; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     dateContextMenuOpenedMs = Date.now(); | ||||||
|  |  | ||||||
|     $contextMenuContainer.css({ |     $contextMenuContainer.css({ | ||||||
|         display: "block", |         display: "block", | ||||||
|         top: top, |         top: top, | ||||||
| @@ -62,8 +66,18 @@ function initContextMenu(event, itemContainer, selectContextMenuItem) { | |||||||
|     }).addClass("show"); |     }).addClass("show"); | ||||||
| } | } | ||||||
|  |  | ||||||
| $(document).click(() => $contextMenuContainer.hide()); | $(document).click(() => hideContextMenu()); | ||||||
|  |  | ||||||
|  | function hideContextMenu() { | ||||||
|  |     // this date checking comes from change in FF66 - https://github.com/zadam/trilium/issues/468 | ||||||
|  |     // "contextmenu" event also triggers "click" event which depending on the timing can close just opened context menu | ||||||
|  |     // we might filter out right clicks, but then it's better if even right clicks close the context menu | ||||||
|  |     if (Date.now() - dateContextMenuOpenedMs > 300) { | ||||||
|  |         $contextMenuContainer.hide(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
|     initContextMenu |     initContextMenu, | ||||||
|  |     hideContextMenu | ||||||
| } | } | ||||||
| @@ -200,9 +200,15 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null) { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @method |      * @method | ||||||
|      * @returns {string} content of currently loaded note in the editor (HTML, code etc.) |      * @returns {string} content of active note (loaded into right pane) | ||||||
|      */ |      */ | ||||||
|     this.getCurrentNoteContent = noteDetailService.getCurrentNoteContent; |     this.getActiveNoteContent = noteDetailService.getCurrentNoteContent; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @method | ||||||
|  |      * @returns {NoteFull} active note (loaded into right pane) | ||||||
|  |      */ | ||||||
|  |     this.getActiveNote = noteDetailService.getCurrentNote; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * This method checks whether user navigated away from the note from which the scripts has been started. |      * This method checks whether user navigated away from the note from which the scripts has been started. | ||||||
| @@ -213,7 +219,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null) { | |||||||
|      * @method |      * @method | ||||||
|      * @return {boolean} returns true if the original note is still loaded, false if user switched to another |      * @return {boolean} returns true if the original note is still loaded, false if user switched to another | ||||||
|      */ |      */ | ||||||
|     this.isNoteStillLoaded = () => { |     this.isNoteStillActive = () => { | ||||||
|         return this.originEntity.noteId === noteDetailService.getCurrentNoteId(); |         return this.originEntity.noteId === noteDetailService.getCurrentNoteId(); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -250,7 +256,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null) { | |||||||
|     /** |     /** | ||||||
|      * @method |      * @method | ||||||
|      */ |      */ | ||||||
|     this.protectCurrentNote = protectedSessionService.protectNoteAndSendToServer; |     this.protectActiveNote = protectedSessionService.protectNoteAndSendToServer; | ||||||
| } | } | ||||||
|  |  | ||||||
| export default FrontendScriptApi; | export default FrontendScriptApi; | ||||||
| @@ -117,7 +117,10 @@ async function saveNote() { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     note.title = $noteTitle.val(); |     note.title = $noteTitle.val(); | ||||||
|     note.noteContent.content = getCurrentNoteContent(note); |  | ||||||
|  |     if (note.noteContent != null) { // might be null for file/image | ||||||
|  |         note.noteContent.content = getCurrentNoteContent(note); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // it's important to set the flag back to false immediatelly after retrieving title and content |     // it's important to set the flag back to false immediatelly after retrieving title and content | ||||||
|     // otherwise we might overwrite another change (especially async code) |     // otherwise we might overwrite another change (especially async code) | ||||||
|   | |||||||
| @@ -51,8 +51,7 @@ $openButton.click(() => { | |||||||
|  |  | ||||||
| function getFileUrl() { | function getFileUrl() { | ||||||
|     // electron needs absolute URL so we extract current host, port, protocol |     // electron needs absolute URL so we extract current host, port, protocol | ||||||
|     return utils.getHost() + "/api/notes/" + noteDetailService.getCurrentNoteId() |     return utils.getHost() + "/api/notes/" + noteDetailService.getCurrentNoteId(); | ||||||
|         + "/download?protectedSessionId=" + encodeURIComponent(protectedSessionHolder.getProtectedSessionId()); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
|   | |||||||
| @@ -62,8 +62,7 @@ $copyToClipboardButton.click(() => { | |||||||
|  |  | ||||||
| function getFileUrl() { | function getFileUrl() { | ||||||
|     // electron needs absolute URL so we extract current host, port, protocol |     // electron needs absolute URL so we extract current host, port, protocol | ||||||
|     return utils.getHost() + "/api/notes/" + noteDetailService.getCurrentNoteId() |     return utils.getHost() + "/api/notes/" + noteDetailService.getCurrentNoteId() + "/download"; | ||||||
|         + "/download?protectedSessionId=" + encodeURIComponent(protectedSessionHolder.getProtectedSessionId()); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
|   | |||||||
| @@ -1,9 +1,10 @@ | |||||||
| import utils from "./utils.js"; | import utils from "./utils.js"; | ||||||
| import optionsInitService from './options_init.js'; | import optionsInitService from './options_init.js'; | ||||||
|  |  | ||||||
|  | const PROTECTED_SESSION_ID_KEY = 'protectedSessionId'; | ||||||
|  |  | ||||||
| let lastProtectedSessionOperationDate = null; | let lastProtectedSessionOperationDate = null; | ||||||
| let protectedSessionTimeout = null; | let protectedSessionTimeout = null; | ||||||
| let protectedSessionId = null; |  | ||||||
|  |  | ||||||
| optionsInitService.optionsReady.then(options => protectedSessionTimeout = options.protectedSessionTimeout); | optionsInitService.optionsReady.then(options => protectedSessionTimeout = options.protectedSessionTimeout); | ||||||
|  |  | ||||||
| @@ -18,15 +19,16 @@ function setProtectedSessionTimeout(encSessTimeout) { | |||||||
| } | } | ||||||
|  |  | ||||||
| function getProtectedSessionId() { | function getProtectedSessionId() { | ||||||
|     return protectedSessionId; |     return utils.getCookie(PROTECTED_SESSION_ID_KEY); | ||||||
| } | } | ||||||
|  |  | ||||||
| function setProtectedSessionId(id) { | function setProtectedSessionId(id) { | ||||||
|     protectedSessionId = id; |     // using session cookie so that it disappears after browser/tab is closed | ||||||
|  |     utils.setSessionCookie(PROTECTED_SESSION_ID_KEY, id); | ||||||
| } | } | ||||||
|  |  | ||||||
| function resetProtectedSession() { | function resetProtectedSession() { | ||||||
|     protectedSessionId = null; |     utils.setSessionCookie(PROTECTED_SESSION_ID_KEY, null); | ||||||
|  |  | ||||||
|     // most secure solution - guarantees nothing remained in memory |     // most secure solution - guarantees nothing remained in memory | ||||||
|     // since this expires because user doesn't use the app, it shouldn't be disruptive |     // since this expires because user doesn't use the app, it shouldn't be disruptive | ||||||
| @@ -34,12 +36,12 @@ function resetProtectedSession() { | |||||||
| } | } | ||||||
|  |  | ||||||
| function isProtectedSessionAvailable() { | function isProtectedSessionAvailable() { | ||||||
|     return protectedSessionId !== null; |     return !!utils.getCookie(PROTECTED_SESSION_ID_KEY); | ||||||
| } | } | ||||||
|  |  | ||||||
| function touchProtectedSession() { | function touchProtectedSession() { | ||||||
|     if (isProtectedSessionAvailable()) { |     if (isProtectedSessionAvailable()) { | ||||||
|         lastProtectedSessionOperationDate = new Date(); |         setProtectedSessionId(utils.getCookie(PROTECTED_SESSION_ID_KEY)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -14,6 +14,8 @@ function getHeaders() { | |||||||
|     // so hypothetical protectedSessionId becomes protectedsessionid on the backend |     // so hypothetical protectedSessionId becomes protectedsessionid on the backend | ||||||
|     // also avoiding using underscores instead of dashes since nginx filters them out by default |     // also avoiding using underscores instead of dashes since nginx filters them out by default | ||||||
|     return { |     return { | ||||||
|  |         // protectedSessionId is normally carried in cookie, but for electron AJAX requests we bypass | ||||||
|  |         // HTTP so no cookies and we need to pass it here explicitly | ||||||
|         'trilium-protected-session-id': protectedSessionId, |         'trilium-protected-session-id': protectedSessionId, | ||||||
|         'trilium-source-id': glob.sourceId |         'trilium-source-id': glob.sourceId | ||||||
|     }; |     }; | ||||||
|   | |||||||
| @@ -417,6 +417,9 @@ function initFancyTree(tree) { | |||||||
|             const node = data.node; |             const node = data.node; | ||||||
|             const noteId = node.data.noteId; |             const noteId = node.data.noteId; | ||||||
|  |  | ||||||
|  |             // click event won't propagate so let's close context menu manually | ||||||
|  |             contextMenuWidget.hideContextMenu(); | ||||||
|  |  | ||||||
|             setCurrentNotePathToHash(node); |             setCurrentNotePathToHash(node); | ||||||
|  |  | ||||||
|             noteDetailService.switchToNote(noteId); |             noteDetailService.switchToNote(noteId); | ||||||
|   | |||||||
| @@ -164,11 +164,23 @@ function isDesktop() { | |||||||
|         || (!window.device && !/Mobi/.test(navigator.userAgent)); |         || (!window.device && !/Mobi/.test(navigator.userAgent)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // cookie code below works for simple use cases only - ASCII only | ||||||
|  | // not setting path so that cookies do not leak into other websites if multiplexed with reverse proxy | ||||||
|  |  | ||||||
| function setCookie(name, value) { | function setCookie(name, value) { | ||||||
|     const date = new Date(Date.now() + 10 * 365 * 24 * 60 * 60 * 1000); |     const date = new Date(Date.now() + 10 * 365 * 24 * 60 * 60 * 1000); | ||||||
|     const expires = "; expires=" + date.toUTCString(); |     const expires = "; expires=" + date.toUTCString(); | ||||||
|  |  | ||||||
|     document.cookie = name + "=" + (value || "")  + expires + "; path=/"; |     document.cookie = name + "=" + (value || "")  + expires + ";"; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function setSessionCookie(name, value) { | ||||||
|  |     document.cookie = name + "=" + (value || "") + ";"; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function getCookie(name) { | ||||||
|  |     const valueMatch = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); | ||||||
|  |     return valueMatch ? valueMatch[2] : null; | ||||||
| } | } | ||||||
|  |  | ||||||
| function getNoteTypeClass(type) { | function getNoteTypeClass(type) { | ||||||
| @@ -213,6 +225,8 @@ export default { | |||||||
|     isMobile, |     isMobile, | ||||||
|     isDesktop, |     isDesktop, | ||||||
|     setCookie, |     setCookie, | ||||||
|  |     setSessionCookie, | ||||||
|  |     getCookie, | ||||||
|     getNoteTypeClass, |     getNoteTypeClass, | ||||||
|     getMimeTypeClass |     getMimeTypeClass | ||||||
| }; | }; | ||||||
| @@ -910,4 +910,9 @@ a.external:after, a[href^="http://"]:after, a[href^="https://"]:after { | |||||||
|     font-size: smaller; |     font-size: smaller; | ||||||
|     content: "\2197"; |     content: "\2197"; | ||||||
|     vertical-align: top; |     vertical-align: top; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .card { | ||||||
|  |     background-color: inherit !important; | ||||||
|  |     border-color: var(--main-border-color) !important; | ||||||
| } | } | ||||||
| @@ -17,9 +17,13 @@ async function getRecentChanges() { | |||||||
|             dateModifiedTo DESC  |             dateModifiedTo DESC  | ||||||
|         LIMIT 1000`); |         LIMIT 1000`); | ||||||
|  |  | ||||||
|     if (!protectedSessionService.isProtectedSessionAvailable()) { |     for (const change of recentChanges) { | ||||||
|         for (const change of recentChanges) { |         if (change.current_isProtected) { | ||||||
|             if (change.current_isProtected) { |             if (protectedSessionService.isProtectedSessionAvailable()) { | ||||||
|  |                 change.title = protectedSessionService.decryptNoteTitle(change.noteId, change.title); | ||||||
|  |                 change.current_title = protectedSessionService.decryptNoteTitle(change.noteId, change.current_title); | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|                 change.title = change.current_title = "[Protected]"; |                 change.title = change.current_title = "[Protected]"; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -4,8 +4,8 @@ const build = require('./build'); | |||||||
| const packageJson = require('../../package'); | const packageJson = require('../../package'); | ||||||
| const {TRILIUM_DATA_DIR} = require('./data_dir'); | const {TRILIUM_DATA_DIR} = require('./data_dir'); | ||||||
|  |  | ||||||
| const APP_DB_VERSION = 125; | const APP_DB_VERSION = 127; | ||||||
| const SYNC_VERSION = 5; | const SYNC_VERSION = 6; | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|     appVersion: packageJson.version, |     appVersion: packageJson.version, | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| module.exports = { buildDate:"2019-02-28T22:33:33+01:00", buildRevision: "b5283d58bb937dacd8a890a40e09657c6d489364" }; | module.exports = { buildDate:"2019-03-30T20:13:53+01:00", buildRevision: "c240fb98967d11ea3925c2c39b44138bb8e46f58" }; | ||||||
|   | |||||||
| @@ -357,6 +357,13 @@ async function findLogicIssues() { | |||||||
|  |  | ||||||
|             logFix(`Removed link ${linkId} because target note ${targetNoteId} is also deleted.`); |             logFix(`Removed link ${linkId} because target note ${targetNoteId} is also deleted.`); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|  |     await findIssues(` | ||||||
|  |           SELECT noteId | ||||||
|  |           FROM notes | ||||||
|  |           JOIN note_contents USING(noteId) | ||||||
|  |           WHERE notes.isDeleted = 0 AND notes.isProtected != note_contents.isProtected`, | ||||||
|  |         ({noteId}) => `Note ${noteId} has inconsistent isProtected in notes and note_contents tables`); | ||||||
| } | } | ||||||
|  |  | ||||||
| async function runSyncRowChecks(entityName, key) { | async function runSyncRowChecks(entityName, key) { | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ const messagingService = require('./messaging'); | |||||||
| const ApiToken = require('../entities/api_token'); | const ApiToken = require('../entities/api_token'); | ||||||
| const Branch = require('../entities/branch'); | const Branch = require('../entities/branch'); | ||||||
| const Note = require('../entities/note'); | const Note = require('../entities/note'); | ||||||
|  | const NoteContent = require('../entities/note_content'); | ||||||
| const Attribute = require('../entities/attribute'); | const Attribute = require('../entities/attribute'); | ||||||
| const NoteRevision = require('../entities/note_revision'); | const NoteRevision = require('../entities/note_revision'); | ||||||
| const RecentNote = require('../entities/recent_note'); | const RecentNote = require('../entities/recent_note'); | ||||||
| @@ -33,6 +34,7 @@ async function getHashes() { | |||||||
|  |  | ||||||
|     const hashes = { |     const hashes = { | ||||||
|         notes: await getHash(Note), |         notes: await getHash(Note), | ||||||
|  |         note_contents: await getHash(NoteContent), | ||||||
|         branches: await getHash(Branch), |         branches: await getHash(Branch), | ||||||
|         note_revisions: await getHash(NoteRevision), |         note_revisions: await getHash(NoteRevision), | ||||||
|         recent_notes: await getHash(RecentNote), |         recent_notes: await getHash(RecentNote), | ||||||
|   | |||||||
| @@ -116,7 +116,7 @@ async function getDateNote(dateStr) { | |||||||
|             dateNote = await createNote(monthNote.noteId, noteTitle); |             dateNote = await createNote(monthNote.noteId, noteTitle); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         await attributeService.createLabel(dateNote.noteId, DATE_LABEL, dateStr); |         await attributeService.createLabel(dateNote.noteId, DATE_LABEL, dateStr.substr(0, 10)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return dateNote; |     return dateNote; | ||||||
|   | |||||||
| @@ -54,7 +54,7 @@ async function exportToOpml(exportContext, branch, version, res) { | |||||||
|     res.setHeader('Content-Type', 'text/x-opml'); |     res.setHeader('Content-Type', 'text/x-opml'); | ||||||
|  |  | ||||||
|     res.write(`<?xml version="1.0" encoding="UTF-8"?> |     res.write(`<?xml version="1.0" encoding="UTF-8"?> | ||||||
| <opml version="1.0"> | <opml version="${version}"> | ||||||
| <head> | <head> | ||||||
| <title>Trilium export</title> | <title>Trilium export</title> | ||||||
| </head> | </head> | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ const imageType = require('image-type'); | |||||||
| const sanitizeFilename = require('sanitize-filename'); | const sanitizeFilename = require('sanitize-filename'); | ||||||
|  |  | ||||||
| async function saveImage(buffer, originalName, parentNoteId, shrinkImageSwitch) { | async function saveImage(buffer, originalName, parentNoteId, shrinkImageSwitch) { | ||||||
|     const finalImageBuffer = shrinkImageSwitch ? await shrinkImage(buffer) : buffer; |     const finalImageBuffer = shrinkImageSwitch ? await shrinkImage(buffer, originalName) : buffer; | ||||||
|  |  | ||||||
|     const imageFormat = imageType(finalImageBuffer); |     const imageFormat = imageType(finalImageBuffer); | ||||||
|  |  | ||||||
| @@ -41,14 +41,14 @@ async function saveImage(buffer, originalName, parentNoteId, shrinkImageSwitch) | |||||||
|     }; |     }; | ||||||
| } | } | ||||||
|  |  | ||||||
| async function shrinkImage(buffer) { | async function shrinkImage(buffer, originalName) { | ||||||
|     const resizedImage = await resize(buffer); |     const resizedImage = await resize(buffer); | ||||||
|     let finalImageBuffer; |     let finalImageBuffer; | ||||||
|  |  | ||||||
|     try { |     try { | ||||||
|         finalImageBuffer = await optimize(resizedImage); |         finalImageBuffer = await optimize(resizedImage); | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|         log.error(e.message + e.stack); |         log.error("Failed to optimize image '" + originalName + "\nStack: " + e.stack); | ||||||
|         finalImageBuffer = resizedImage; |         finalImageBuffer = resizedImage; | ||||||
|     } |     } | ||||||
|     return finalImageBuffer; |     return finalImageBuffer; | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ const imageService = require('../../services/image'); | |||||||
| const protectedSessionService = require('../protected_session'); | const protectedSessionService = require('../protected_session'); | ||||||
| const commonmark = require('commonmark'); | const commonmark = require('commonmark'); | ||||||
| const path = require('path'); | const path = require('path'); | ||||||
|  | const mimeTypes = require('mime-types'); | ||||||
|  |  | ||||||
| const CODE_MIME_TYPES = { | const CODE_MIME_TYPES = { | ||||||
|     'text/plain': true, |     'text/plain': true, | ||||||
| @@ -47,21 +48,23 @@ const CODE_MIME_TYPES = { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| async function importSingleFile(importContext, file, parentNote) { | async function importSingleFile(importContext, file, parentNote) { | ||||||
|  |     const mime = mimeTypes.lookup(file.originalname); | ||||||
|  |  | ||||||
|     if (importContext.textImportedAsText) { |     if (importContext.textImportedAsText) { | ||||||
|         if (file.mimetype === 'text/html') { |         if (mime === 'text/html') { | ||||||
|             return await importHtml(importContext, file, parentNote); |             return await importHtml(importContext, file, parentNote); | ||||||
|         } else if (['text/markdown', 'text/x-markdown'].includes(file.mimetype)) { |         } else if (['text/markdown', 'text/x-markdown'].includes(mime)) { | ||||||
|             return await importMarkdown(importContext, file, parentNote); |             return await importMarkdown(importContext, file, parentNote); | ||||||
|         } else if (file.mimetype === 'text/plain') { |         } else if (mime === 'text/plain') { | ||||||
|             return await importPlainText(importContext, file, parentNote); |             return await importPlainText(importContext, file, parentNote); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (importContext.codeImportedAsCode && file.mimetype in CODE_MIME_TYPES) { |     if (importContext.codeImportedAsCode && mime in CODE_MIME_TYPES) { | ||||||
|         return await importCodeNote(importContext, file, parentNote); |         return await importCodeNote(importContext, file, parentNote); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (["image/jpeg", "image/gif", "image/png"].includes(file.mimetype)) { |     if (["image/jpeg", "image/gif", "image/png"].includes(mime)) { | ||||||
|         return await importImage(file, parentNote, importContext); |         return await importImage(file, parentNote, importContext); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -84,7 +87,7 @@ async function importFile(importContext, file, parentNote) { | |||||||
|         target: 'into', |         target: 'into', | ||||||
|         isProtected: parentNote.isProtected && protectedSessionService.isProtectedSessionAvailable(), |         isProtected: parentNote.isProtected && protectedSessionService.isProtectedSessionAvailable(), | ||||||
|         type: 'file', |         type: 'file', | ||||||
|         mime: file.mimetype, |         mime: mimeTypes.lookup(originalName), | ||||||
|         attributes: [ |         attributes: [ | ||||||
|             { type: "label", name: "originalFileName", value: originalName }, |             { type: "label", name: "originalFileName", value: originalName }, | ||||||
|             { type: "label", name: "fileSize", value: size } |             { type: "label", name: "fileSize", value: size } | ||||||
| @@ -99,7 +102,8 @@ async function importFile(importContext, file, parentNote) { | |||||||
| async function importCodeNote(importContext, file, parentNote) { | async function importCodeNote(importContext, file, parentNote) { | ||||||
|     const title = getFileNameWithoutExtension(file.originalname); |     const title = getFileNameWithoutExtension(file.originalname); | ||||||
|     const content = file.buffer.toString("UTF-8"); |     const content = file.buffer.toString("UTF-8"); | ||||||
|     const mime = CODE_MIME_TYPES[file.mimetype] === true ? file.mimetype : CODE_MIME_TYPES[file.mimetype]; |     const detectedMime = mimeTypes.lookup(file.originalname); | ||||||
|  |     const mime = CODE_MIME_TYPES[detectedMime] === true ? detectedMime : CODE_MIME_TYPES[detectedMime]; | ||||||
|  |  | ||||||
|     const {note} = await noteService.createNote(parentNote.noteId, title, content, { |     const {note} = await noteService.createNote(parentNote.noteId, title, content, { | ||||||
|         type: 'code', |         type: 'code', | ||||||
|   | |||||||
| @@ -95,7 +95,8 @@ async function createNewNote(parentNoteId, noteData) { | |||||||
|  |  | ||||||
|     note.noteContent = await new NoteContent({ |     note.noteContent = await new NoteContent({ | ||||||
|         noteId: note.noteId, |         noteId: note.noteId, | ||||||
|         content: noteData.content |         content: noteData.content, | ||||||
|  |         isProtected: noteData.isProtected | ||||||
|     }).save(); |     }).save(); | ||||||
|  |  | ||||||
|     const branch = await new Branch({ |     const branch = await new Branch({ | ||||||
| @@ -332,19 +333,21 @@ async function updateNote(noteId, noteUpdates) { | |||||||
|  |  | ||||||
|     const noteTitleChanged = note.title !== noteUpdates.title; |     const noteTitleChanged = note.title !== noteUpdates.title; | ||||||
|  |  | ||||||
|     noteUpdates.noteContent.content = await saveLinks(note, noteUpdates.noteContent.content); |  | ||||||
|  |  | ||||||
|     note.title = noteUpdates.title; |     note.title = noteUpdates.title; | ||||||
|     note.isProtected = noteUpdates.isProtected; |     note.isProtected = noteUpdates.isProtected; | ||||||
|     await note.save(); |     await note.save(); | ||||||
|  |  | ||||||
|     if (note.type !== 'file' && note.type !== 'image') { |     const noteContent = await note.getNoteContent(); | ||||||
|         const noteContent = await note.getNoteContent(); |  | ||||||
|  |     if (!['file', 'image'].includes(note.type)) { | ||||||
|  |         noteUpdates.noteContent.content = await saveLinks(note, noteUpdates.noteContent.content); | ||||||
|  |  | ||||||
|         noteContent.content = noteUpdates.noteContent.content; |         noteContent.content = noteUpdates.noteContent.content; | ||||||
|         noteContent.isProtected = noteUpdates.isProtected; |  | ||||||
|         await noteContent.save(); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     noteContent.isProtected = noteUpdates.isProtected; | ||||||
|  |     await noteContent.save(); | ||||||
|  |  | ||||||
|     if (noteTitleChanged) { |     if (noteTitleChanged) { | ||||||
|         await triggerNoteTitleChanged(note); |         await triggerNoteTitleChanged(note); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -15,7 +15,8 @@ function setDataKey(decryptedDataKey) { | |||||||
| } | } | ||||||
|  |  | ||||||
| function setProtectedSessionId(req) { | function setProtectedSessionId(req) { | ||||||
|     cls.namespace.set('protectedSessionId', req.headers['trilium-protected-session-id']); |     // cookies is the main storage but for electron header is used when bypassing HTTP | ||||||
|  |     cls.namespace.set('protectedSessionId', req.headers['trilium-protected-session-id'] || req.cookies.protectedSessionId); | ||||||
| } | } | ||||||
|  |  | ||||||
| function getProtectedSessionId() { | function getProtectedSessionId() { | ||||||
| @@ -62,7 +63,9 @@ function decryptNoteContent(noteContent) { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     try { |     try { | ||||||
|         noteContent.content = dataEncryptionService.decrypt(getDataKey(), noteContent.content); |         if (noteContent.content != null) { | ||||||
|  |             noteContent.content = dataEncryptionService.decrypt(getDataKey(), noteContent.content.toString()); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     catch (e) { |     catch (e) { | ||||||
|         e.message = `Cannot decrypt note content for noteContentId=${noteContent.noteContentId}: ` + e.message; |         e.message = `Cannot decrypt note content for noteContentId=${noteContent.noteContentId}: ` + e.message; | ||||||
| @@ -83,12 +86,17 @@ function decryptNoteRevision(hist) { | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (hist.title) { |     try { | ||||||
|         hist.title = dataEncryptionService.decryptString(dataKey, hist.title); |         if (hist.title) { | ||||||
|     } |             hist.title = dataEncryptionService.decryptString(dataKey, hist.title); | ||||||
|  |         } | ||||||
|  |  | ||||||
|     if (hist.content) { |         if (hist.content) { | ||||||
|         hist.content = dataEncryptionService.decryptString(dataKey, hist.content); |             hist.content = dataEncryptionService.decryptString(dataKey, hist.content); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     catch (e) { | ||||||
|  |         throw new Error(`Decryption failed for note ${hist.noteId}: ` + e.message + " " + e.stack); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -65,10 +65,10 @@ async function executeScript(script, params, startNoteId, currentNoteId, originE | |||||||
|  |  | ||||||
|     const bundle = await getScriptBundle(currentNote); |     const bundle = await getScriptBundle(currentNote); | ||||||
|  |  | ||||||
|     return await executeBundle(bundle, startNote, originEntity); |     return await executeBundle(bundle, { startNote, originEntity }); | ||||||
| } | } | ||||||
|  |  | ||||||
| async function execute(ctx, script, params = []) { | async function execute(ctx, script) { | ||||||
|     // scripts run as "server" sourceId so clients recognize the changes as "foreign" and update themselves |     // scripts run as "server" sourceId so clients recognize the changes as "foreign" and update themselves | ||||||
|     cls.namespace.set('sourceId', sourceIdService.getCurrentSourceId()); |     cls.namespace.set('sourceId', sourceIdService.getCurrentSourceId()); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,7 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export2.dtd"> |  | ||||||
| <en-export export-date="20181101T193909Z" application="Evernote/Windows" version="6.x"> |  | ||||||
| <note><title>Note</title><content><![CDATA[<?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"> |  | ||||||
|  |  | ||||||
| <en-note><div>this is a note in a notebook in a stack</div></en-note>]]></content><created>20181101T193703Z</created><updated>20181101T193712Z</updated><note-attributes><author>Adam Zivner</author><source>desktop.win</source><source-application>evernote.win32</source-application></note-attributes></note></en-export> |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user