mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-30 18:05:55 +01:00 
			
		
		
		
	Compare commits
	
		
			25 Commits
		
	
	
		
			v0.52.0-be
			...
			v0.52.3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | fac9fef652 | ||
|  | f0ab1fb5a1 | ||
|  | df3fdb59c5 | ||
|  | 23e9bcfdc5 | ||
|  | 96c4934c00 | ||
|  | 31fb02f810 | ||
|  | e206d9cc68 | ||
|  | 2d33f570f4 | ||
|  | 15f8173add | ||
|  | 7609bc78ec | ||
|  | b4ac41eff8 | ||
|  | de1c76ee3c | ||
|  | ec4fac421b | ||
|  | f587e0dfd9 | ||
|  | b5214e6cea | ||
|  | 5fbaed61c1 | ||
|  | 8fcc76ad6d | ||
|  | 15a9ff4450 | ||
|  | 0a4f419e5e | ||
|  | 7fa531b3d6 | ||
|  | 3cfca27b54 | ||
|  | 103aa95ccf | ||
|  | 339a6d7817 | ||
|  | 93dd9274e7 | ||
|  | ca35527aeb | 
| @@ -22,7 +22,7 @@ RUN set -x \ | ||||
|     && apk del .build-dependencies | ||||
|  | ||||
| # Some setup tools need to be kept | ||||
| RUN apk add --no-cache su-exec | ||||
| RUN apk add --no-cache su-exec shadow | ||||
|  | ||||
| # Bundle app source | ||||
| COPY . . | ||||
|   | ||||
| @@ -131,6 +131,78 @@ | ||||
|  | ||||
|          | ||||
|              | ||||
| <h4 class="name" id="__private"><span class="type-signature"></span>__private<span class="type-signature"> :Object</span></h4> | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| <div class="description"> | ||||
|     This object contains "at your risk" and "no BC guarantees" objects for advanced use cases. | ||||
| </div> | ||||
|  | ||||
|  | ||||
|  | ||||
|     <h5>Type:</h5> | ||||
|     <ul> | ||||
|         <li> | ||||
|              | ||||
| <span class="param-type">Object</span> | ||||
|  | ||||
|  | ||||
|         </li> | ||||
|     </ul> | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| <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#line435">line 435</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
| </dl> | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|          | ||||
|              | ||||
| <h4 class="name" id="axios"><span class="type-signature"></span>axios<span class="type-signature"></span></h4> | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -93,7 +93,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line21">line 21</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line23">line 23</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -204,7 +204,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line92">line 92</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line94">line 94</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -279,7 +279,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line118">line 118</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line120">line 120</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -347,7 +347,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line65">line 65</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line67">line 67</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -415,7 +415,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line67">line 67</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line69">line 69</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -486,7 +486,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line81">line 81</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line83">line 83</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -554,7 +554,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line76">line 76</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line78">line 78</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -622,7 +622,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line59">line 59</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line61">line 61</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -690,7 +690,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line63">line 63</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line65">line 65</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -758,7 +758,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line55">line 55</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line57">line 57</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -833,7 +833,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line123">line 123</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line125">line 125</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -901,7 +901,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line94">line 94</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line96">line 96</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -969,7 +969,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line88">line 88</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line90">line 90</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -1037,7 +1037,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line90">line 90</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line92">line 92</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -1112,7 +1112,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line128">line 128</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line130">line 130</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -1180,7 +1180,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line104">line 104</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line106">line 106</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -1248,7 +1248,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line57">line 57</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line59">line 59</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -1316,7 +1316,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line61">line 61</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line63">line 63</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -1384,7 +1384,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line69">line 69</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line71">line 71</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -1452,7 +1452,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line71">line 71</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line73">line 73</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -1528,7 +1528,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line405">line 405</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line407">line 407</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -1630,7 +1630,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1023">line 1023</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1025">line 1025</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -1830,7 +1830,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1135">line 1135</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1137">line 1137</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -1914,7 +1914,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line945">line 945</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line947">line 947</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -2020,7 +2020,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line865">line 865</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line867">line 867</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -2194,7 +2194,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line523">line 523</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line525">line 525</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -2394,7 +2394,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line336">line 336</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line338">line 338</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -2572,7 +2572,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line534">line 534</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line536">line 536</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -2683,7 +2683,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line150">line 150</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line152">line 152</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -2785,7 +2785,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line170">line 170</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line172">line 172</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -2887,7 +2887,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line160">line 160</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line162">line 162</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -2989,7 +2989,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line184">line 184</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line186">line 186</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -3091,7 +3091,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line218">line 218</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line220">line 220</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -3199,7 +3199,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line660">line 660</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line662">line 662</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -3305,7 +3305,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line229">line 229</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line231">line 231</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -3456,7 +3456,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line465">line 465</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line467">line 467</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -3626,7 +3626,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line555">line 555</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line557">line 557</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -3781,7 +3781,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line489">line 489</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line491">line 491</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -3951,7 +3951,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line563">line 563</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line565">line 565</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -4057,7 +4057,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line629">line 629</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line631">line 631</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -4259,7 +4259,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line604">line 604</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line606">line 606</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -4437,7 +4437,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line545">line 545</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line547">line 547</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -4595,7 +4595,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line471">line 471</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line473">line 473</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -4765,7 +4765,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line571">line 571</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line573">line 573</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -4920,7 +4920,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line495">line 495</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line497">line 497</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -5090,7 +5090,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line579">line 579</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line581">line 581</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -5245,7 +5245,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line483">line 483</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line485">line 485</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -5415,7 +5415,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line595">line 595</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line597">line 597</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -5570,7 +5570,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line507">line 507</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line509">line 509</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -5679,7 +5679,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line142">line 142</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line144">line 144</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -5781,7 +5781,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line155">line 155</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line157">line 157</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -5932,7 +5932,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line477">line 477</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line479">line 479</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -6102,7 +6102,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line587">line 587</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line589">line 589</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -6257,7 +6257,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line501">line 501</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line503">line 503</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -6366,7 +6366,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line315">line 315</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line317">line 317</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -6475,7 +6475,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line808">line 808</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line810">line 810</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -6577,7 +6577,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line787">line 787</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line789">line 789</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -6679,7 +6679,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line756">line 756</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line758">line 758</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -6781,7 +6781,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line907">line 907</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line909">line 909</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -6888,7 +6888,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line891">line 891</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line893">line 893</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -6990,7 +6990,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line165">line 165</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line167">line 167</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -7141,7 +7141,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line441">line 441</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line443">line 443</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -7319,7 +7319,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line514">line 514</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line516">line 516</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -7474,7 +7474,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line447">line 447</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line449">line 449</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -7629,7 +7629,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line459">line 459</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line461">line 461</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -7784,7 +7784,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line453">line 453</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line455">line 455</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -7934,7 +7934,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line966">line 966</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line968">line 968</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -8040,7 +8040,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line304">line 304</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line306">line 306</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -8146,7 +8146,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line296">line 296</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line298">line 298</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -8252,7 +8252,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line291">line 291</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line293">line 293</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -8358,7 +8358,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line286">line 286</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line288">line 288</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -8464,7 +8464,7 @@ This method can be significantly faster than the getAttribute() | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line310">line 310</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line312">line 312</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -8856,7 +8856,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1010">line 1010</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1012">line 1012</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -9036,7 +9036,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1101">line 1101</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1103">line 1103</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -9216,7 +9216,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1109">line 1109</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1111">line 1111</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -9363,6 +9363,111 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
|      | ||||
|  | ||||
|      | ||||
|     <h4 class="name" id="saveNoteRevision"><span class="type-signature"></span>saveNoteRevision<span class="signature">()</span><span class="type-signature"> → {<a href="NoteRevision.html">NoteRevision</a>|null}</span></h4> | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| <dl class="details"> | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1172">line 1172</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
| </dl> | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| <h5>Returns:</h5> | ||||
|  | ||||
|          | ||||
|  | ||||
|  | ||||
| <dl> | ||||
|     <dt> | ||||
|         Type | ||||
|     </dt> | ||||
|     <dd> | ||||
|          | ||||
| <span class="param-type"><a href="NoteRevision.html">NoteRevision</a></span> | ||||
| | | ||||
|  | ||||
| <span class="param-type">null</span> | ||||
|  | ||||
|  | ||||
|     </dd> | ||||
| </dl> | ||||
|  | ||||
|      | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|          | ||||
|              | ||||
|  | ||||
|      | ||||
|  | ||||
|      | ||||
|     <h4 class="name" id="setAttribute"><span class="type-signature"></span>setAttribute<span class="signature">(type, name, value<span class="signature-attributes">opt</span>)</span><span class="type-signature"></span></h4> | ||||
|      | ||||
|  | ||||
| @@ -9538,7 +9643,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line979">line 979</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line981">line 981</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -9718,7 +9823,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1085">line 1085</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1087">line 1087</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -9878,7 +9983,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1093">line 1093</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1095">line 1095</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -10120,7 +10225,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1052">line 1052</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1054">line 1054</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -10331,7 +10436,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1068">line 1068</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1070">line 1070</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
| @@ -10542,7 +10647,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1077">line 1077</a> | ||||
|         <a href="becca_entities_note.js.html">becca/entities/note.js</a>, <a href="becca_entities_note.js.html#line1079">line 1079</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
|   | ||||
| @@ -37,6 +37,8 @@ const entityChangesService = require('../../services/entity_changes'); | ||||
| const AbstractEntity = require("./abstract_entity"); | ||||
| const NoteRevision = require("./note_revision"); | ||||
| const TaskContext = require("../../services/task_context.js"); | ||||
| const optionService = require("../../services/options.js"); | ||||
| const noteRevisionService = require("../../services/note_revisions.js"); | ||||
|  | ||||
| const LABEL = 'label'; | ||||
| const RELATION = 'relation'; | ||||
| @@ -1192,6 +1194,41 @@ class Note extends AbstractEntity { | ||||
|         return !(this.noteId in this.becca.notes); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return {NoteRevision|null} | ||||
|      */ | ||||
|     saveNoteRevision() { | ||||
|         const content = this.getContent(); | ||||
|  | ||||
|         if (!content || (Buffer.isBuffer(content) && content.byteLength === 0)) { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         const contentMetadata = this.getContentMetadata(); | ||||
|  | ||||
|         const noteRevision = new NoteRevision({ | ||||
|             noteId: this.noteId, | ||||
|             // title and text should be decrypted now | ||||
|             title: this.title, | ||||
|             type: this.type, | ||||
|             mime: this.mime, | ||||
|             isProtected: false, // will be fixed in the protectNoteRevisions() call | ||||
|             utcDateLastEdited: this.utcDateModified > contentMetadata.utcDateModified | ||||
|                 ? this.utcDateModified | ||||
|                 : contentMetadata.utcDateModified, | ||||
|             utcDateCreated: dateUtils.utcNowDateTime(), | ||||
|             utcDateModified: dateUtils.utcNowDateTime(), | ||||
|             dateLastEdited: this.dateModified > contentMetadata.dateModified | ||||
|                 ? this.dateModified | ||||
|                 : contentMetadata.dateModified, | ||||
|             dateCreated: dateUtils.localNowDateTime() | ||||
|         }).save(); | ||||
|  | ||||
|         noteRevision.setContent(content); | ||||
|  | ||||
|         return noteRevision; | ||||
|     } | ||||
|  | ||||
|     beforeSaving() { | ||||
|         super.beforeSaving(); | ||||
|  | ||||
|   | ||||
| @@ -454,6 +454,15 @@ function BackendScriptApi(currentNote, apiParams) { | ||||
|      * @return {{syncVersion, appVersion, buildRevision, dbVersion, dataDirectory, buildDate}|*} - object representing basic info about running Trilium version | ||||
|      */ | ||||
|     this.getAppInfo = () => appInfo | ||||
|  | ||||
|     /** | ||||
|      * This object contains "at your risk" and "no BC guarantees" objects for advanced use cases. | ||||
|      * | ||||
|      * @type {{becca: Becca}} | ||||
|      */ | ||||
|     this.__private = { | ||||
|         becca | ||||
|     } | ||||
| } | ||||
|  | ||||
| module.exports = BackendScriptApi; | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -395,7 +395,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#line104">line 104</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line124">line 124</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
|  | ||||
|   | ||||
| @@ -129,6 +129,26 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Open a note in a new split. | ||||
|      * | ||||
|      * @param {string} notePath (or noteId) | ||||
|      * @param {boolean} activate - set to true to activate the new split, false to stay on the current split | ||||
|      * @return {Promise<void>} | ||||
|      */ | ||||
|     this.openSplitWithNote = async (notePath, activate) => { | ||||
|         await ws.waitForMaxKnownEntityChangeId(); | ||||
|  | ||||
|         const subContexts = appContext.tabManager.getActiveContext().getSubContexts(); | ||||
|         const {ntxId} = subContexts[subContexts.length - 1]; | ||||
|  | ||||
|         appContext.triggerCommand("openNewNoteSplit", {ntxId, notePath}); | ||||
|  | ||||
|         if (activate) { | ||||
|             appContext.triggerEvent('focusAndSelectTitle'); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * @typedef {Object} ToolbarButtonOptions | ||||
|      * @property {string} title | ||||
| @@ -412,7 +432,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | ||||
|     this.getActiveTabTextEditor = callback => { | ||||
|         console.warn("api.getActiveTabTextEditor() is deprecated, use getActiveContextTextEditor() instead."); | ||||
|  | ||||
|         return appContext.tabManager.getActiveContextTextEditor(callback); | ||||
|         return appContext.tabManager.getActiveContext()?.getTextEditor(callback); | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
| @@ -421,7 +441,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | ||||
|      * @method | ||||
|      * @returns {Promise<CKEditor>} instance of CKEditor | ||||
|      */ | ||||
|     this.getActiveContextTextEditor = () => appContext.tabManager.getActiveContextTextEditor(); | ||||
|     this.getActiveContextTextEditor = () => appContext.tabManager.getActiveContext()?.getTextEditor(); | ||||
|  | ||||
|     /** | ||||
|      * See https://codemirror.net/doc/manual.html#api | ||||
| @@ -429,7 +449,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | ||||
|      * @method | ||||
|      * @returns {Promise<CodeMirror>} instance of CodeMirror | ||||
|      */ | ||||
|     this.getActiveContextCodeEditor = () => appContext.tabManager.getActiveContextCodeEditor(); | ||||
|     this.getActiveContextCodeEditor = () => appContext.tabManager.getActiveContext()?.getCodeEditor(); | ||||
|  | ||||
|     /** | ||||
|      * Get access to the widget handling note detail. Methods like `getWidgetType()` and `getTypeWidget()` to get to the | ||||
|   | ||||
							
								
								
									
										2
									
								
								libraries/ckeditor/ckeditor.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								libraries/ckeditor/ckeditor.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -1,70 +0,0 @@ | ||||
| /** | ||||
|  * Returns a function, that, as long as it continues to be invoked, will not | ||||
|  * be triggered. The function will be called after it stops being called for | ||||
|  * N milliseconds. If `immediate` is passed, trigger the function on the | ||||
|  * leading edge, instead of the trailing. The function also has a property 'clear' | ||||
|  * that is a function which will clear the timer to prevent previously scheduled executions. | ||||
|  * | ||||
|  * @source underscore.js | ||||
|  * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/ | ||||
|  * @param {Function} function to wrap | ||||
|  * @param {Number} timeout in ms (`100`) | ||||
|  * @param {Boolean} whether to execute at the beginning (`false`) | ||||
|  * @api public | ||||
|  */ | ||||
| function debounce(func, wait_ms, immediate){ | ||||
|   var timeout, args, context, timestamp, result; | ||||
|   if (null == wait_ms) wait_ms = 100; | ||||
|  | ||||
|   function later() { | ||||
|     var last = Date.now() - timestamp; | ||||
|  | ||||
|     if (last < wait_ms && last >= 0) { | ||||
|       timeout = setTimeout(later, wait_ms - last); | ||||
|     } else { | ||||
|       timeout = null; | ||||
|       if (!immediate) { | ||||
|         result = func.apply(context, args); | ||||
|         context = args = null; | ||||
|       } | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   var debounced = function(){ | ||||
|     context = this; | ||||
|     args = arguments; | ||||
|     timestamp = Date.now(); | ||||
|     var callNow = immediate && !timeout; | ||||
|     if (!timeout) timeout = setTimeout(later, wait_ms); | ||||
|     if (callNow) { | ||||
|       result = func.apply(context, args); | ||||
|       context = args = null; | ||||
|     } | ||||
|  | ||||
|     return result; | ||||
|   }; | ||||
|  | ||||
|   debounced.clear = function() { | ||||
|     if (timeout) { | ||||
|       clearTimeout(timeout); | ||||
|       timeout = null; | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   debounced.flush = function() { | ||||
|     if (timeout) { | ||||
|       result = func.apply(context, args); | ||||
|       context = args = null; | ||||
|  | ||||
|       clearTimeout(timeout); | ||||
|       timeout = null; | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   return debounced; | ||||
| }; | ||||
|  | ||||
| // Adds compatibility for ES modules | ||||
| debounce.debounce = debounce; | ||||
|  | ||||
| export default debounce; | ||||
							
								
								
									
										46
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										46
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,12 +1,12 @@ | ||||
| { | ||||
|   "name": "trilium", | ||||
|   "version": "0.51.2", | ||||
|   "version": "0.52.1-beta", | ||||
|   "lockfileVersion": 2, | ||||
|   "requires": true, | ||||
|   "packages": { | ||||
|     "": { | ||||
|       "name": "trilium", | ||||
|       "version": "0.51.2", | ||||
|       "version": "0.52.1-beta", | ||||
|       "hasInstallScript": true, | ||||
|       "license": "AGPL-3.0-only", | ||||
|       "dependencies": { | ||||
| @@ -21,7 +21,7 @@ | ||||
|         "commonmark": "0.30.0", | ||||
|         "cookie-parser": "1.4.6", | ||||
|         "csurf": "1.11.0", | ||||
|         "dayjs": "1.11.2", | ||||
|         "dayjs": "1.11.3", | ||||
|         "ejs": "3.1.8", | ||||
|         "electron-debug": "3.2.0", | ||||
|         "electron-dl": "3.3.1", | ||||
| @@ -65,7 +65,7 @@ | ||||
|         "tmp": "0.2.1", | ||||
|         "turndown": "7.1.1", | ||||
|         "unescape": "1.0.1", | ||||
|         "ws": "8.6.0", | ||||
|         "ws": "8.7.0", | ||||
|         "yauzl": "2.10.0" | ||||
|       }, | ||||
|       "bin": { | ||||
| @@ -82,7 +82,7 @@ | ||||
|         "jsdoc": "3.6.10", | ||||
|         "lorem-ipsum": "2.0.4", | ||||
|         "rcedit": "3.0.1", | ||||
|         "webpack": "5.72.1", | ||||
|         "webpack": "5.73.0", | ||||
|         "webpack-cli": "4.9.2" | ||||
|       }, | ||||
|       "optionalDependencies": { | ||||
| @@ -3115,9 +3115,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/dayjs": { | ||||
|       "version": "1.11.2", | ||||
|       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", | ||||
|       "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" | ||||
|       "version": "1.11.3", | ||||
|       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz", | ||||
|       "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==" | ||||
|     }, | ||||
|     "node_modules/debug": { | ||||
|       "version": "4.3.4", | ||||
| @@ -10252,9 +10252,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/webpack": { | ||||
|       "version": "5.72.1", | ||||
|       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", | ||||
|       "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", | ||||
|       "version": "5.73.0", | ||||
|       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", | ||||
|       "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@types/eslint-scope": "^3.7.3", | ||||
| @@ -10594,9 +10594,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/ws": { | ||||
|       "version": "8.6.0", | ||||
|       "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", | ||||
|       "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", | ||||
|       "version": "8.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", | ||||
|       "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", | ||||
|       "engines": { | ||||
|         "node": ">=10.0.0" | ||||
|       }, | ||||
| @@ -13271,9 +13271,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "dayjs": { | ||||
|       "version": "1.11.2", | ||||
|       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", | ||||
|       "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" | ||||
|       "version": "1.11.3", | ||||
|       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz", | ||||
|       "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==" | ||||
|     }, | ||||
|     "debug": { | ||||
|       "version": "4.3.4", | ||||
| @@ -18776,9 +18776,9 @@ | ||||
|       "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" | ||||
|     }, | ||||
|     "webpack": { | ||||
|       "version": "5.72.1", | ||||
|       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", | ||||
|       "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", | ||||
|       "version": "5.73.0", | ||||
|       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", | ||||
|       "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@types/eslint-scope": "^3.7.3", | ||||
| @@ -19028,9 +19028,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "ws": { | ||||
|       "version": "8.6.0", | ||||
|       "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", | ||||
|       "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", | ||||
|       "version": "8.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", | ||||
|       "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", | ||||
|       "requires": {} | ||||
|     }, | ||||
|     "xdg-basedir": { | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   "name": "trilium", | ||||
|   "productName": "Trilium Notes", | ||||
|   "description": "Trilium Notes", | ||||
|   "version": "0.52.0-beta", | ||||
|   "version": "0.52.3", | ||||
|   "license": "AGPL-3.0-only", | ||||
|   "main": "electron.js", | ||||
|   "bin": { | ||||
| @@ -36,7 +36,7 @@ | ||||
|     "commonmark": "0.30.0", | ||||
|     "cookie-parser": "1.4.6", | ||||
|     "csurf": "1.11.0", | ||||
|     "dayjs": "1.11.2", | ||||
|     "dayjs": "1.11.3", | ||||
|     "ejs": "3.1.8", | ||||
|     "electron-debug": "3.2.0", | ||||
|     "electron-dl": "3.3.1", | ||||
| @@ -80,7 +80,7 @@ | ||||
|     "tmp": "0.2.1", | ||||
|     "turndown": "7.1.1", | ||||
|     "unescape": "1.0.1", | ||||
|     "ws": "8.6.0", | ||||
|     "ws": "8.7.0", | ||||
|     "yauzl": "2.10.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
| @@ -94,7 +94,7 @@ | ||||
|     "jsdoc": "3.6.10", | ||||
|     "lorem-ipsum": "2.0.4", | ||||
|     "rcedit": "3.0.1", | ||||
|     "webpack": "5.72.1", | ||||
|     "webpack": "5.73.0", | ||||
|     "webpack-cli": "4.9.2" | ||||
|   }, | ||||
|   "optionalDependencies": { | ||||
|   | ||||
| @@ -5,9 +5,9 @@ const AbstractEntity = require("./abstract_entity"); | ||||
| const sql = require("../../services/sql"); | ||||
| const dateUtils = require("../../services/date_utils"); | ||||
| const utils = require("../../services/utils.js"); | ||||
| const TaskContext = require("../../services/task_context.js"); | ||||
| const cls = require("../../services/cls.js"); | ||||
| const log = require("../../services/log.js"); | ||||
| const TaskContext = require("../../services/task_context"); | ||||
| const cls = require("../../services/cls"); | ||||
| const log = require("../../services/log"); | ||||
|  | ||||
| /** | ||||
|  * Branch represents a relationship between a child note and its parent note. Trilium allows a note to have multiple | ||||
| @@ -137,6 +137,18 @@ class Branch extends AbstractEntity { | ||||
|  | ||||
|         taskContext.increaseProgressCount(); | ||||
|  | ||||
|         const note = this.getNote(); | ||||
|  | ||||
|         if (!taskContext.noteDeletionHandlerTriggered) { | ||||
|             const parentBranches = note.getParentBranches(); | ||||
|  | ||||
|             if (parentBranches.length === 1 && parentBranches[0] === this) { | ||||
|                 // needs to be run before branches and attributes are deleted and thus attached relations disappear | ||||
|                 const handlers = require("../../services/handlers"); | ||||
|                 handlers.runAttachedRelations(note, 'runOnNoteDeletion', note); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (this.branchId === 'root' | ||||
|             || this.noteId === 'root' | ||||
|             || this.noteId === cls.getHoistedNoteId()) { | ||||
| @@ -146,7 +158,6 @@ class Branch extends AbstractEntity { | ||||
|  | ||||
|         this.markAsDeleted(deleteId); | ||||
|  | ||||
|         const note = this.getNote(); | ||||
|         const notDeletedBranches = note.getParentBranches(); | ||||
|  | ||||
|         if (notDeletedBranches.length === 0) { | ||||
|   | ||||
| @@ -8,7 +8,7 @@ const dateUtils = require('../../services/date_utils'); | ||||
| const entityChangesService = require('../../services/entity_changes'); | ||||
| const AbstractEntity = require("./abstract_entity"); | ||||
| const NoteRevision = require("./note_revision"); | ||||
| const TaskContext = require("../../services/task_context.js"); | ||||
| const TaskContext = require("../../services/task_context"); | ||||
|  | ||||
| const LABEL = 'label'; | ||||
| const RELATION = 'relation'; | ||||
| @@ -1133,6 +1133,10 @@ class Note extends AbstractEntity { | ||||
|      * @param {TaskContext} [taskContext] | ||||
|      */ | ||||
|     deleteNote(deleteId, taskContext) { | ||||
|         if (this.isDeleted) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (!deleteId) { | ||||
|             deleteId = utils.randomString(10); | ||||
|         } | ||||
| @@ -1141,6 +1145,11 @@ class Note extends AbstractEntity { | ||||
|             taskContext = new TaskContext('no-progress-reporting'); | ||||
|         } | ||||
|  | ||||
|         // needs to be run before branches and attributes are deleted and thus attached relations disappear | ||||
|         const handlers = require("../../services/handlers"); | ||||
|         handlers.runAttachedRelations(this, 'runOnNoteDeletion', this); | ||||
|         taskContext.noteDeletionHandlerTriggered = true; | ||||
|  | ||||
|         for (const branch of this.getParentBranches()) { | ||||
|             branch.deleteBranch(deleteId, taskContext); | ||||
|         } | ||||
| @@ -1164,6 +1173,41 @@ class Note extends AbstractEntity { | ||||
|         return !(this.noteId in this.becca.notes); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return {NoteRevision|null} | ||||
|      */ | ||||
|     saveNoteRevision() { | ||||
|         const content = this.getContent(); | ||||
|  | ||||
|         if (!content || (Buffer.isBuffer(content) && content.byteLength === 0)) { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         const contentMetadata = this.getContentMetadata(); | ||||
|  | ||||
|         const noteRevision = new NoteRevision({ | ||||
|             noteId: this.noteId, | ||||
|             // title and text should be decrypted now | ||||
|             title: this.title, | ||||
|             type: this.type, | ||||
|             mime: this.mime, | ||||
|             isProtected: false, // will be fixed in the protectNoteRevisions() call | ||||
|             utcDateLastEdited: this.utcDateModified > contentMetadata.utcDateModified | ||||
|                 ? this.utcDateModified | ||||
|                 : contentMetadata.utcDateModified, | ||||
|             utcDateCreated: dateUtils.utcNowDateTime(), | ||||
|             utcDateModified: dateUtils.utcNowDateTime(), | ||||
|             dateLastEdited: this.dateModified > contentMetadata.dateModified | ||||
|                 ? this.dateModified | ||||
|                 : contentMetadata.dateModified, | ||||
|             dateCreated: dateUtils.localNowDateTime() | ||||
|         }).save(); | ||||
|  | ||||
|         noteRevision.setContent(content); | ||||
|  | ||||
|         return noteRevision; | ||||
|     } | ||||
|  | ||||
|     beforeSaving() { | ||||
|         super.beforeSaving(); | ||||
|  | ||||
|   | ||||
							
								
								
									
										70
									
								
								src/public/app/services/debounce.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/public/app/services/debounce.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| /** | ||||
|  * Returns a function, that, as long as it continues to be invoked, will not | ||||
|  * be triggered. The function will be called after it stops being called for | ||||
|  * N milliseconds. If `immediate` is passed, trigger the function on the | ||||
|  * leading edge, instead of the trailing. The function also has a property 'clear' | ||||
|  * that is a function which will clear the timer to prevent previously scheduled executions. | ||||
|  * | ||||
|  * @source underscore.js | ||||
|  * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/ | ||||
|  * @param {Function} function to wrap | ||||
|  * @param {Number} timeout in ms (`100`) | ||||
|  * @param {Boolean} whether to execute at the beginning (`false`) | ||||
|  * @api public | ||||
|  */ | ||||
| function debounce(func, wait_ms, immediate){ | ||||
|     var timeout, args, context, timestamp, result; | ||||
|     if (null == wait_ms) wait_ms = 100; | ||||
|  | ||||
|     function later() { | ||||
|         var last = Date.now() - timestamp; | ||||
|  | ||||
|         if (last < wait_ms && last >= 0) { | ||||
|             timeout = setTimeout(later, wait_ms - last); | ||||
|         } else { | ||||
|             timeout = null; | ||||
|             if (!immediate) { | ||||
|                 result = func.apply(context, args); | ||||
|                 context = args = null; | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     var debounced = function(){ | ||||
|         context = this; | ||||
|         args = arguments; | ||||
|         timestamp = Date.now(); | ||||
|         var callNow = immediate && !timeout; | ||||
|         if (!timeout) timeout = setTimeout(later, wait_ms); | ||||
|         if (callNow) { | ||||
|             result = func.apply(context, args); | ||||
|             context = args = null; | ||||
|         } | ||||
|  | ||||
|         return result; | ||||
|     }; | ||||
|  | ||||
|     debounced.clear = function() { | ||||
|         if (timeout) { | ||||
|             clearTimeout(timeout); | ||||
|             timeout = null; | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     debounced.flush = function() { | ||||
|         if (timeout) { | ||||
|             result = func.apply(context, args); | ||||
|             context = args = null; | ||||
|  | ||||
|             clearTimeout(timeout); | ||||
|             timeout = null; | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     return debounced; | ||||
| }; | ||||
|  | ||||
| // Adds compatibility for ES modules | ||||
| debounce.debounce = debounce; | ||||
|  | ||||
| export default debounce; | ||||
| @@ -101,6 +101,26 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Open a note in a new split. | ||||
|      * | ||||
|      * @param {string} notePath (or noteId) | ||||
|      * @param {boolean} activate - set to true to activate the new split, false to stay on the current split | ||||
|      * @return {Promise<void>} | ||||
|      */ | ||||
|     this.openSplitWithNote = async (notePath, activate) => { | ||||
|         await ws.waitForMaxKnownEntityChangeId(); | ||||
|  | ||||
|         const subContexts = appContext.tabManager.getActiveContext().getSubContexts(); | ||||
|         const {ntxId} = subContexts[subContexts.length - 1]; | ||||
|  | ||||
|         appContext.triggerCommand("openNewNoteSplit", {ntxId, notePath}); | ||||
|  | ||||
|         if (activate) { | ||||
|             appContext.triggerEvent('focusAndSelectTitle'); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * @typedef {Object} ToolbarButtonOptions | ||||
|      * @property {string} title | ||||
|   | ||||
| @@ -248,6 +248,13 @@ class NoteContext extends Component { | ||||
|             ntxId: this.ntxId | ||||
|         })); | ||||
|     } | ||||
|  | ||||
|     async getTypeWidget() { | ||||
|         return new Promise(resolve => appContext.triggerCommand('executeWithTypeWidget', { | ||||
|             resolve, | ||||
|             ntxId: this.ntxId | ||||
|         })); | ||||
|     } | ||||
| } | ||||
|  | ||||
| export default NoteContext; | ||||
|   | ||||
| @@ -24,8 +24,8 @@ async function createNote(parentNotePath, options = {}) { | ||||
|         options.saveSelection = false; | ||||
|     } | ||||
|  | ||||
|     if (options.saveSelection && utils.isCKEditorInitialized()) { | ||||
|         [options.title, options.content] = parseSelectedHtml(window.cutToNote.getSelectedHtml()); | ||||
|     if (options.saveSelection) { | ||||
|         [options.title, options.content] = parseSelectedHtml(options.textEditor.getSelectedHtml()); | ||||
|     } | ||||
|  | ||||
|     const parentNoteId = treeService.getNoteIdFromNotePath(parentNotePath); | ||||
| @@ -46,9 +46,9 @@ async function createNote(parentNotePath, options = {}) { | ||||
|         mime: options.mime | ||||
|     }); | ||||
|  | ||||
|     if (options.saveSelection && utils.isCKEditorInitialized()) { | ||||
|     if (options.saveSelection) { | ||||
|         // we remove the selection only after it was saved to server to make sure we don't lose anything | ||||
|         window.cutToNote.removeSelection(); | ||||
|         options.textEditor.removeSelection(); | ||||
|     } | ||||
|  | ||||
|     await ws.waitForMaxKnownEntityChangeId(); | ||||
|   | ||||
| @@ -306,7 +306,8 @@ export default class TabManager extends Component { | ||||
|                 const mainNoteContexts = this.getNoteContexts().filter(nc => nc.isMainContext()); | ||||
|  | ||||
|                 if (mainNoteContexts.length === 1) { | ||||
|                     mainNoteContexts[0].setEmpty(); | ||||
|                     await this.clearLastMainNoteContext(noteContextToRemove); | ||||
|  | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
| @@ -317,7 +318,7 @@ export default class TabManager extends Component { | ||||
|             const noteContextsToRemove = noteContextToRemove.getSubContexts(); | ||||
|             const ntxIdsToRemove = noteContextsToRemove.map(nc => nc.ntxId); | ||||
|  | ||||
|             await this.triggerEvent('beforeTabRemove', { ntxIds: ntxIdsToRemove }); | ||||
|             await this.triggerEvent('beforeNoteContextRemove', { ntxIds: ntxIdsToRemove }); | ||||
|  | ||||
|             if (!noteContextToRemove.isMainContext()) { | ||||
|                 await this.activateNoteContext(noteContextToRemove.getMainContext().ntxId); | ||||
| @@ -336,6 +337,30 @@ export default class TabManager extends Component { | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             this.removeNoteContexts(noteContextsToRemove); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     async clearLastMainNoteContext(noteContextToClear) { | ||||
|         noteContextToClear.setEmpty(); | ||||
|  | ||||
|         // activate main split | ||||
|         await this.activateNoteContext(noteContextToClear.ntxId); | ||||
|  | ||||
|         // remove all other splits | ||||
|         const noteContextsToRemove = noteContextToClear.getSubContexts() | ||||
|             .filter(ntx => ntx.ntxId !== noteContextToClear.ntxId); | ||||
|  | ||||
|         const ntxIdsToRemove = noteContextsToRemove.map(ntx => ntx.ntxId); | ||||
|  | ||||
|         await this.triggerEvent('beforeNoteContextRemove', {ntxIds: ntxIdsToRemove}); | ||||
|  | ||||
|         this.removeNoteContexts(noteContextsToRemove); | ||||
|     } | ||||
|  | ||||
|     removeNoteContexts(noteContextsToRemove) { | ||||
|         const ntxIdsToRemove = noteContextsToRemove.map(nc => nc.ntxId); | ||||
|  | ||||
|         this.children = this.children.filter(nc => !ntxIdsToRemove.includes(nc.ntxId)); | ||||
|  | ||||
|         this.recentlyClosedTabs.push(noteContextsToRemove); | ||||
| @@ -343,7 +368,6 @@ export default class TabManager extends Component { | ||||
|         this.triggerEvent('noteContextRemoved', {ntxIds: ntxIdsToRemove}); | ||||
|  | ||||
|         this.tabsUpdate.scheduleUpdate(); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     tabReorderEvent({ntxIdsInOrder}) { | ||||
|   | ||||
| @@ -280,7 +280,7 @@ function isHtmlEmpty(html) { | ||||
|  | ||||
| async function clearBrowserCache() { | ||||
|     if (isElectron()) { | ||||
|         const win = utils.dynamicRequire('@electron/remote').getCurrentWindow(); | ||||
|         const win = dynamicRequire('@electron/remote').getCurrentWindow(); | ||||
|         await win.webContents.session.clearCache(); | ||||
|     } | ||||
| } | ||||
| @@ -292,10 +292,6 @@ function copySelectionToClipboard() { | ||||
|     } | ||||
| } | ||||
|  | ||||
| function isCKEditorInitialized() { | ||||
|     return !!(window && window.cutToNote); | ||||
| } | ||||
|  | ||||
| function dynamicRequire(moduleName) { | ||||
|     if (typeof __non_webpack_require__ !== 'undefined') { | ||||
|         return __non_webpack_require__(moduleName); | ||||
| @@ -405,7 +401,6 @@ export default { | ||||
|     clearBrowserCache, | ||||
|     normalizeShortcut, | ||||
|     copySelectionToClipboard, | ||||
|     isCKEditorInitialized, | ||||
|     dynamicRequire, | ||||
|     timeLimit, | ||||
|     initHelpDropdown, | ||||
|   | ||||
| @@ -233,6 +233,9 @@ const ATTR_HELP = { | ||||
|         "runOnNoteCreation": "executes when note is created on backend", | ||||
|         "runOnNoteTitleChange": "executes when note title is changed (includes note creation as well)", | ||||
|         "runOnNoteChange": "executes when note is changed (includes note creation as well)", | ||||
|         "runOnNoteDeletion": "executes when note is being deleted", | ||||
|         "runOnBranchCreation": "executes when a branch is created. Branch is a link between parent note and child note and is created e.g. when cloning or moving note.", | ||||
|         "runOnBranchDeletion": "executes when a branch is deleted. Branch is a link between parent note and child note and is deleted e.g. when moving note (old branch/link is deleted).", | ||||
|         "runOnChildNoteCreation": "executes when new note is created under this note", | ||||
|         "runOnAttributeCreation": "executes when new attribute is created under this note", | ||||
|         "runOnAttributeChange": "executes when attribute is changed under this note", | ||||
|   | ||||
| @@ -216,7 +216,7 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     async beforeTabRemoveEvent({ntxIds}) { | ||||
|     async beforeNoteContextRemoveEvent({ntxIds}) { | ||||
|         if (this.isNoteContext(ntxIds)) { | ||||
|             await this.spacedUpdate.updateNowIfNecessary(); | ||||
|         } | ||||
| @@ -327,7 +327,8 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { | ||||
|         // without await as this otherwise causes deadlock through component mutex | ||||
|         noteCreateService.createNote(appContext.tabManager.getActiveContextNotePath(), { | ||||
|             isProtected: note.isProtected, | ||||
|             saveSelection: true | ||||
|             saveSelection: true, | ||||
|             textEditor: await this.noteContext.getTextEditor() | ||||
|         }); | ||||
|     } | ||||
|  | ||||
| @@ -341,4 +342,16 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { | ||||
|             this.refresh(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     async executeWithTypeWidgetEvent({resolve, ntxId}) { | ||||
|         if (!this.isNoteContext(ntxId)) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         await this.initialized; | ||||
|  | ||||
|         await this.getWidgetType(); | ||||
|  | ||||
|         resolve(this.getTypeWidget()); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -87,7 +87,7 @@ export default class NoteTitleWidget extends NoteContextAwareWidget { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     async beforeTabRemoveEvent({ntxIds}) { | ||||
|     async beforeNoteContextRemoveEvent({ntxIds}) { | ||||
|         if (this.isNoteContext(ntxIds)) { | ||||
|             await this.spacedUpdate.updateNowIfNecessary(); | ||||
|         } | ||||
|   | ||||
| @@ -134,8 +134,6 @@ const TPL = ` | ||||
|                             Delete note</a> | ||||
|                         <a class="dropdown-item" href="#" data-action-add="deleteNoteRevisions"> | ||||
|                             Delete note revisions</a> | ||||
|                         <a class="dropdown-item" href="#" data-action-add="moveNote"> | ||||
|                             Delete note revisions</a> | ||||
|                         <a class="dropdown-item" href="#" data-action-add="deleteLabel"> | ||||
|                             Delete label</a> | ||||
|                         <a class="dropdown-item" href="#" data-action-add="deleteRelation"> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ import libraryLoader from "../../services/library_loader.js"; | ||||
| import TypeWidget from "./type_widget.js"; | ||||
| import utils from '../../services/utils.js'; | ||||
| import froca from "../../services/froca.js"; | ||||
| import debounce from "../../../../../libraries/lodash.debounce.js"; | ||||
| import debounce from "../../services/debounce.js"; | ||||
|  | ||||
| const {sleep} = utils; | ||||
|  | ||||
|   | ||||
| @@ -359,7 +359,9 @@ pre:not(.CodeMirror-line) { | ||||
|  | ||||
| .go-to-selected-note-button.disabled, .go-to-selected-note-button.disabled:hover { | ||||
|     cursor: inherit; | ||||
|     color: var(--button-disabled-background-color) !important; | ||||
|     color: var(--button-disabled-text-color) !important; | ||||
|     background-color: var(--button-disabled-background-color) !important; | ||||
|     text-decoration: none; | ||||
| } | ||||
|  | ||||
| .note-autocomplete-input { | ||||
| @@ -966,3 +968,8 @@ input { | ||||
| .note-split.full-content-width { | ||||
|     max-width: 999999px; | ||||
| } | ||||
|  | ||||
| button.close:hover { | ||||
|     text-shadow: none; | ||||
|     color: currentColor; | ||||
| } | ||||
|   | ||||
| @@ -21,10 +21,11 @@ | ||||
|     --more-accented-background-color: #777; | ||||
|  | ||||
|     --button-background-color: transparent; | ||||
|     --button-disabled-background-color: #222; | ||||
|     --button-border-color: #ccc; | ||||
|     --button-text-color: currentColor; | ||||
|     --button-border-radius: 5px; | ||||
|     --button-disabled-background-color: transparent; | ||||
|     --button-disabled-text-color: #999; | ||||
|  | ||||
|     --primary-button-background-color: #888; | ||||
|     --primary-button-text-color: white; | ||||
|   | ||||
| @@ -25,10 +25,11 @@ html { | ||||
|     --more-accented-background-color: #ddd; | ||||
|  | ||||
|     --button-background-color: transparent; | ||||
|     --button-disabled-background-color: #ddd; | ||||
|     --button-border-color: #ddd; | ||||
|     --button-text-color: black; | ||||
|     --button-border-radius: 5px; | ||||
|     --button-disabled-background-color: #ddd; | ||||
|     --button-disabled-text-color: black; | ||||
|  | ||||
|     --primary-button-background-color: #6c757d; | ||||
|     --primary-button-text-color: white; | ||||
|   | ||||
| @@ -170,7 +170,6 @@ span.fancytree-active .fancytree-title { | ||||
| } | ||||
|  | ||||
| span.fancytree-selected { | ||||
|     color: var(--hover-item-text-color) !important; | ||||
|     border-color: var(--main-border-color) !important; | ||||
|     border-radius: 5px; | ||||
| } | ||||
|   | ||||
| @@ -21,7 +21,8 @@ function updateFile(req) { | ||||
|         return [404, `Note ${noteId} doesn't exist.`]; | ||||
|     } | ||||
|  | ||||
|     noteRevisionService.createNoteRevision(note); | ||||
|     note.saveNoteRevision(); | ||||
|     noteRevisionService.protectNoteRevisions(note); | ||||
|  | ||||
|     note.mime = file.mimetype.toLowerCase(); | ||||
|     note.save(); | ||||
|   | ||||
| @@ -97,7 +97,8 @@ function restoreNoteRevision(req) { | ||||
|     if (noteRevision) { | ||||
|         const note = noteRevision.getNote(); | ||||
|  | ||||
|         noteRevisionService.createNoteRevision(note); | ||||
|         note.saveNoteRevision(); | ||||
|         noteRevisionService.protectNoteRevisions(note); | ||||
|  | ||||
|         note.title = noteRevision.title; | ||||
|         note.setContent(noteRevision.getContent()); | ||||
|   | ||||
| @@ -206,7 +206,7 @@ function changeTitle(req) { | ||||
|     const noteTitleChanged = note.title !== title; | ||||
|  | ||||
|     if (noteTitleChanged) { | ||||
|         noteService.saveNoteRevision(note); | ||||
|         noteService.saveNoteRevisionIfNeeded(note); | ||||
|     } | ||||
|  | ||||
|     note.title = title; | ||||
| @@ -294,7 +294,8 @@ function uploadModifiedFile(req) { | ||||
|  | ||||
|     log.info(`Updating note '${noteId}' with content from ${filePath}`); | ||||
|  | ||||
|     noteRevisionService.createNoteRevision(note); | ||||
|     note.saveNoteRevision(); | ||||
|     noteRevisionService.protectNoteRevisions(note); | ||||
|  | ||||
|     const fileContent = fs.readFileSync(filePath); | ||||
|  | ||||
|   | ||||
| @@ -9,15 +9,16 @@ const noteRevisionService = require("../../services/note_revisions"); | ||||
| const branchService = require("../../services/branches"); | ||||
| const cloningService = require("../../services/cloning"); | ||||
| const {formatAttrForSearch} = require("../../services/attribute_formatter"); | ||||
| const utils = require("../../services/utils.js"); | ||||
|  | ||||
| async function searchFromNoteInt(note) { | ||||
| function searchFromNoteInt(note) { | ||||
|     let searchResultNoteIds; | ||||
|  | ||||
|     const searchScript = note.getRelationValue('searchScript'); | ||||
|     const searchString = note.getLabelValue('searchString'); | ||||
|  | ||||
|     if (searchScript) { | ||||
|         searchResultNoteIds = await searchFromRelation(note, 'searchScript'); | ||||
|         searchResultNoteIds = searchFromRelation(note, 'searchScript'); | ||||
|     } else { | ||||
|         const searchContext = new SearchContext({ | ||||
|             fastSearch: note.hasLabel('fastSearch'), | ||||
| @@ -61,7 +62,9 @@ async function searchFromNote(req) { | ||||
|  | ||||
| const ACTION_HANDLERS = { | ||||
|     deleteNote: (action, note) => { | ||||
|         note.markAsDeleted(); | ||||
|         const deleteId = 'searchbulkaction-' + utils.randomString(10); | ||||
|  | ||||
|         note.deleteNote(deleteId); | ||||
|     }, | ||||
|     deleteNoteRevisions: (action, note) => { | ||||
|         noteRevisionService.eraseNoteRevisions(note.getNoteRevisions().map(rev => rev.noteRevisionId)); | ||||
| @@ -149,7 +152,7 @@ function getActions(note) { | ||||
|         .filter(a => !!a); | ||||
| } | ||||
|  | ||||
| async function searchAndExecute(req) { | ||||
| function searchAndExecute(req) { | ||||
|     const note = becca.getNote(req.params.noteId); | ||||
|  | ||||
|     if (!note) { | ||||
| @@ -165,7 +168,7 @@ async function searchAndExecute(req) { | ||||
|         return [400, `Note ${req.params.noteId} is not a search note.`] | ||||
|     } | ||||
|  | ||||
|     const searchResultNoteIds = await searchFromNoteInt(note); | ||||
|     const searchResultNoteIds = searchFromNoteInt(note); | ||||
|  | ||||
|     const actions = getActions(note); | ||||
|  | ||||
|   | ||||
| @@ -426,6 +426,15 @@ function BackendScriptApi(currentNote, apiParams) { | ||||
|      * @return {{syncVersion, appVersion, buildRevision, dbVersion, dataDirectory, buildDate}|*} - object representing basic info about running Trilium version | ||||
|      */ | ||||
|     this.getAppInfo = () => appInfo | ||||
|  | ||||
|     /** | ||||
|      * This object contains "at your risk" and "no BC guarantees" objects for advanced use cases. | ||||
|      * | ||||
|      * @type {{becca: Becca}} | ||||
|      */ | ||||
|     this.__private = { | ||||
|         becca | ||||
|     } | ||||
| } | ||||
|  | ||||
| module.exports = BackendScriptApi; | ||||
|   | ||||
| @@ -1 +1 @@ | ||||
| module.exports = { buildDate:"2022-05-27T22:06:07+02:00", buildRevision: "8905148dbcdf0118078a880e295563023ac20783" }; | ||||
| module.exports = { buildDate:"2022-06-13T23:41:52+02:00", buildRevision: "f0ab1fb5a1c45bf15eae46a72b46ebf132eee531" }; | ||||
|   | ||||
| @@ -50,7 +50,7 @@ module.exports = [ | ||||
|     { type: 'label', name: 'shareDisallowRobotIndexing' }, | ||||
|     { type: 'label', name: 'displayRelations' }, | ||||
|     { type: 'label', name: 'hideRelations' }, | ||||
|     { type: 'label', name: 'titleTemplate' }, | ||||
|     { type: 'label', name: 'titleTemplate', isDangerous: true }, | ||||
|  | ||||
|     // relation names | ||||
|     { type: 'relation', name: 'internalLink' }, | ||||
| @@ -60,6 +60,9 @@ module.exports = [ | ||||
|     { type: 'relation', name: 'runOnNoteCreation', isDangerous: true }, | ||||
|     { type: 'relation', name: 'runOnNoteTitleChange', isDangerous: true }, | ||||
|     { type: 'relation', name: 'runOnNoteChange', isDangerous: true }, | ||||
|     { type: 'relation', name: 'runOnNoteDeletion', isDangerous: true }, | ||||
|     { type: 'relation', name: 'runOnBranchCreation', isDangerous: true }, | ||||
|     { type: 'relation', name: 'runOnBranchDeletion', isDangerous: true }, | ||||
|     { type: 'relation', name: 'runOnChildNoteCreation', isDangerous: true }, | ||||
|     { type: 'relation', name: 'runOnAttributeCreation', isDangerous: true }, | ||||
|     { type: 'relation', name: 'runOnAttributeChange', isDangerous: true }, | ||||
|   | ||||
| @@ -367,6 +367,9 @@ class ConsistencyChecks { | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|         if (sqlInit.getDbSize() < 500000) { | ||||
|             // querying for "content IS NULL" is expensive since content is not indexed. See e.g. https://github.com/zadam/trilium/issues/2887 | ||||
|  | ||||
|             this.findAndFixIssues(` | ||||
|                         SELECT notes.noteId, notes.type, notes.mime | ||||
|                         FROM notes | ||||
| @@ -387,6 +390,7 @@ class ConsistencyChecks { | ||||
|                         logError(`Note ${noteId} content is null even though it is not deleted`); | ||||
|                     } | ||||
|                 }); | ||||
|         } | ||||
|  | ||||
|         this.findAndFixIssues(` | ||||
|                     SELECT note_revisions.noteRevisionId | ||||
|   | ||||
| @@ -49,6 +49,7 @@ eventService.subscribe([ eventService.ENTITY_CHANGED, eventService.ENTITY_DELETE | ||||
|         } | ||||
|     } | ||||
|     else if (entityName === 'notes') { | ||||
|         // ENTITY_DELETED won't trigger anything since all branches/attributes are already deleted at this point | ||||
|         runAttachedRelations(entity, 'runOnNoteChange', entity); | ||||
|     } | ||||
| }); | ||||
| @@ -94,6 +95,9 @@ eventService.subscribe(eventService.ENTITY_CREATED, ({ entityName, entity }) => | ||||
|             handleSortedAttribute(entity); | ||||
|         } | ||||
|     } | ||||
|     else if (entityName === 'branches') { | ||||
|         runAttachedRelations(entity.getNote(), 'runOnBranchCreation', entity); | ||||
|     } | ||||
|     else if (entityName === 'notes') { | ||||
|         runAttachedRelations(entity, 'runOnNoteCreation', entity); | ||||
|     } | ||||
| @@ -167,4 +171,12 @@ eventService.subscribe(eventService.ENTITY_DELETED, ({ entityName, entity }) => | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
|  | ||||
|     if (entityName === 'branches') { | ||||
|         runAttachedRelations(entity.getNote(), 'runOnBranchDeletion', entity); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| module.exports = { | ||||
|     runAttachedRelations | ||||
| }; | ||||
|   | ||||
| @@ -68,7 +68,7 @@ function updateImage(noteId, uploadBuffer, originalName) { | ||||
|  | ||||
|     const note = becca.getNote(noteId); | ||||
|  | ||||
|     noteRevisionService.createNoteRevision(note); | ||||
|     note.saveNoteRevision(); | ||||
|     noteRevisionService.protectNoteRevisions(note); | ||||
|  | ||||
|     note.setLabel('originalFileName', originalName); | ||||
|   | ||||
| @@ -98,25 +98,25 @@ const DEFAULT_KEYBOARD_ACTIONS = [ | ||||
|     }, | ||||
|     { | ||||
|         actionName: "moveNoteUp", | ||||
|         defaultShortcuts: ["CommandOrControl+Up"], | ||||
|         defaultShortcuts: isMac ? ["Alt+Up"] : ["CommandOrControl+Up"], | ||||
|         description: "Move note up", | ||||
|         scope: "note-tree" | ||||
|     }, | ||||
|     { | ||||
|         actionName: "moveNoteDown", | ||||
|         defaultShortcuts: ["CommandOrControl+Down"], | ||||
|         defaultShortcuts: isMac ? ["Alt+Down"] : ["CommandOrControl+Down"], | ||||
|         description: "Move note down", | ||||
|         scope: "note-tree" | ||||
|     }, | ||||
|     { | ||||
|         actionName: "moveNoteUpInHierarchy", | ||||
|         defaultShortcuts: ["CommandOrControl+Left"], | ||||
|         defaultShortcuts: isMac ? ["Alt+Left"] : ["CommandOrControl+Left"], | ||||
|         description: "Move note up in hierarchy", | ||||
|         scope: "note-tree" | ||||
|     }, | ||||
|     { | ||||
|         actionName: "moveNoteDownInHierarchy", | ||||
|         defaultShortcuts: ["CommandOrControl+Right"], | ||||
|         defaultShortcuts: isMac ? ["Alt+Right"] : ["CommandOrControl+Right"], | ||||
|         description: "Move note down in hierarchy", | ||||
|         scope: "note-tree" | ||||
|     }, | ||||
|   | ||||
| @@ -102,7 +102,7 @@ function isDbUpToDate() { | ||||
| async function migrateIfNecessary() { | ||||
|     const currentDbVersion = getDbVersion(); | ||||
|  | ||||
|     if (currentDbVersion > appInfo.dbVersion) { | ||||
|     if (currentDbVersion > appInfo.dbVersion && process.env.TRILIUM_IGNORE_DB_VERSION !== 'true') { | ||||
|         log.error(`Current DB version ${currentDbVersion} is newer than app db version ${appInfo.dbVersion} which means that it was created by newer and incompatible version of Trilium. Upgrade to latest version of Trilium to resolve this issue.`); | ||||
|  | ||||
|         utils.crash(); | ||||
|   | ||||
| @@ -1,9 +1,8 @@ | ||||
| "use strict"; | ||||
|  | ||||
| const NoteRevision = require('../becca/entities/note_revision'); | ||||
| const dateUtils = require('./date_utils'); | ||||
| const log = require('./log'); | ||||
| const sql = require('./sql'); | ||||
| const protectedSession = require("./protected_session"); | ||||
|  | ||||
| /** | ||||
|  * @param {Note} note | ||||
| @@ -11,6 +10,12 @@ const sql = require('./sql'); | ||||
| function protectNoteRevisions(note) { | ||||
|     for (const revision of note.getNoteRevisions()) { | ||||
|         if (note.isProtected !== revision.isProtected) { | ||||
|             if (!protectedSession.isProtectedSessionAvailable()) { | ||||
|                 log.error("Protected session is not available to fix note revisions."); | ||||
|  | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             try { | ||||
|                 const content = revision.getContent(); | ||||
|  | ||||
| @@ -30,46 +35,6 @@ function protectNoteRevisions(note) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @param {Note} note | ||||
|  * @return {NoteRevision|null} | ||||
|  */ | ||||
| function createNoteRevision(note) { | ||||
|     if (note.hasLabel("disableVersioning")) { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     const content = note.getContent(); | ||||
|  | ||||
|     if (!content || (Buffer.isBuffer(content) && content.byteLength === 0)) { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     const contentMetadata = note.getContentMetadata(); | ||||
|  | ||||
|     const noteRevision = new NoteRevision({ | ||||
|         noteId: note.noteId, | ||||
|         // title and text should be decrypted now | ||||
|         title: note.title, | ||||
|         type: note.type, | ||||
|         mime: note.mime, | ||||
|         isProtected: false, // will be fixed in the protectNoteRevisions() call | ||||
|         utcDateLastEdited: note.utcDateModified > contentMetadata.utcDateModified | ||||
|             ? note.utcDateModified | ||||
|             : contentMetadata.utcDateModified, | ||||
|         utcDateCreated: dateUtils.utcNowDateTime(), | ||||
|         utcDateModified: dateUtils.utcNowDateTime(), | ||||
|         dateLastEdited: note.dateModified > contentMetadata.dateModified | ||||
|             ? note.dateModified | ||||
|             : contentMetadata.dateModified, | ||||
|         dateCreated: dateUtils.localNowDateTime() | ||||
|     }).save(); | ||||
|  | ||||
|     noteRevision.setContent(content); | ||||
|  | ||||
|     return noteRevision; | ||||
| } | ||||
|  | ||||
| function eraseNoteRevisions(noteRevisionIdsToErase) { | ||||
|     if (noteRevisionIdsToErase.length === 0) { | ||||
|         return; | ||||
| @@ -86,6 +51,5 @@ function eraseNoteRevisions(noteRevisionIdsToErase) { | ||||
|  | ||||
| module.exports = { | ||||
|     protectNoteRevisions, | ||||
|     createNoteRevision, | ||||
|     eraseNoteRevisions | ||||
| }; | ||||
|   | ||||
| @@ -491,7 +491,7 @@ function saveLinks(note, content) { | ||||
|     return content; | ||||
| } | ||||
|  | ||||
| function saveNoteRevision(note) { | ||||
| function saveNoteRevisionIfNeeded(note) { | ||||
|     // files and images are versioned separately | ||||
|     if (note.type === 'file' || note.type === 'image' || note.hasLabel('disableVersioning')) { | ||||
|         return; | ||||
| @@ -508,7 +508,7 @@ function saveNoteRevision(note) { | ||||
|     const msSinceDateCreated = now.getTime() - dateUtils.parseDateTime(note.utcDateCreated).getTime(); | ||||
|  | ||||
|     if (!existingNoteRevisionId && msSinceDateCreated >= noteRevisionSnapshotTimeInterval * 1000) { | ||||
|         noteRevisionService.createNoteRevision(note); | ||||
|         note.saveNoteRevision(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -519,7 +519,7 @@ function updateNote(noteId, noteUpdates) { | ||||
|         throw new Error(`Note '${noteId}' is not available for change!`); | ||||
|     } | ||||
|  | ||||
|     saveNoteRevision(note); | ||||
|     saveNoteRevisionIfNeeded(note); | ||||
|  | ||||
|     // if protected status changed, then we need to encrypt/decrypt the content anyway | ||||
|     if (['file', 'image'].includes(note.type) && note.isProtected !== noteUpdates.isProtected) { | ||||
| @@ -910,6 +910,6 @@ module.exports = { | ||||
|     triggerNoteTitleChanged, | ||||
|     eraseDeletedNotesNow, | ||||
|     eraseNotesWithDeleteId, | ||||
|     saveNoteRevision, | ||||
|     saveNoteRevisionIfNeeded, | ||||
|     downloadImages | ||||
| }; | ||||
|   | ||||
| @@ -83,7 +83,7 @@ function lex(str) { | ||||
|             continue; | ||||
|         } | ||||
|         else if (!quotes) { | ||||
|             if (!fulltextEnded && currentWord === 'note' && chr === '.') { | ||||
|             if (!fulltextEnded && currentWord === 'note' && chr === '.' && i + 1 < str.length) { | ||||
|                 fulltextEnded = true; | ||||
|             } | ||||
|  | ||||
|   | ||||
| @@ -78,6 +78,10 @@ function findResultsWithExpression(expression, searchContext) { | ||||
|  | ||||
|     const searchResults = noteSet.notes | ||||
|         .map(note => { | ||||
|             if (note.isDeleted) { | ||||
|                 return null; | ||||
|             } | ||||
|  | ||||
|             const notePathArray = executionContext.noteIdToNotePath[note.noteId] || beccaService.getSomePath(note); | ||||
|  | ||||
|             if (!notePathArray) { | ||||
| @@ -85,7 +89,8 @@ function findResultsWithExpression(expression, searchContext) { | ||||
|             } | ||||
|  | ||||
|             return new SearchResult(notePathArray); | ||||
|         }); | ||||
|         }) | ||||
|         .filter(note => !!note); | ||||
|  | ||||
|     for (const res of searchResults) { | ||||
|         res.computeScore(searchContext.highlightedTokens); | ||||
|   | ||||
| @@ -242,9 +242,9 @@ function transactional(func) { | ||||
|         return ret; | ||||
|     } | ||||
|     catch (e) { | ||||
|         const entityChanges = cls.getAndClearEntityChangeIds(); | ||||
|         const entityChangeIds = cls.getAndClearEntityChangeIds(); | ||||
|  | ||||
|         if (entityChanges.length > 0) { | ||||
|         if (entityChangeIds.length > 0) { | ||||
|             log.info("Transaction rollback dirtied the becca, forcing reload."); | ||||
|  | ||||
|             require('../becca/becca_loader').load(); | ||||
|   | ||||
| @@ -178,7 +178,11 @@ dbReady.then(() => { | ||||
|     setInterval(() => optimize(), 10 * 60 * 60 * 1000); | ||||
| }); | ||||
|  | ||||
| log.info("DB size: " + sql.getValue("SELECT page_count * page_size / 1000 as size FROM pragma_page_count(), pragma_page_size()") + " KB"); | ||||
| function getDbSize() { | ||||
|     return sql.getValue("SELECT page_count * page_size / 1000 as size FROM pragma_page_count(), pragma_page_size()"); | ||||
| } | ||||
|  | ||||
| log.info(`DB size: ${getDbSize()} KB`); | ||||
|  | ||||
| module.exports = { | ||||
|     dbReady, | ||||
| @@ -186,5 +190,6 @@ module.exports = { | ||||
|     isDbInitialized, | ||||
|     createInitialDatabase, | ||||
|     createDatabaseForSync, | ||||
|     setDbAsInitialized | ||||
|     setDbAsInitialized, | ||||
|     getDbSize | ||||
| }; | ||||
|   | ||||
| @@ -10,6 +10,7 @@ class TaskContext { | ||||
|         this.taskId = taskId; | ||||
|         this.taskType = taskType; | ||||
|         this.data = data; | ||||
|         this.noteDeletionHandlerTriggered = false; | ||||
|  | ||||
|         // progressCount is meant to represent just some progress - to indicate the task is not stuck | ||||
|         this.progressCount = -1; // we're incrementing immediatelly | ||||
|   | ||||
| @@ -1,4 +1,7 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| [[ ! -z "${USER_UID}" ]] && usermod -u ${USER_UID} node || echo "No USER_UID specified, leaving 1000" | ||||
| [[ ! -z "${USER_GID}" ]] && groupmod -g ${USER_GID} node || echo "No USER_GID specified, leaving 1000" | ||||
|  | ||||
| chown -R node:node /home/node | ||||
| su-exec node node ./src/www | ||||
|   | ||||
		Reference in New Issue
	
	Block a user