mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 18:36:30 +01:00 
			
		
		
		
	Compare commits
	
		
			27 Commits
		
	
	
		
			v0.52.0-be
			...
			v0.52.4
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | e7db262559 | ||
|  | 3faae63b84 | ||
|  | 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 |     && apk del .build-dependencies | ||||||
|  |  | ||||||
| # Some setup tools need to be kept | # 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 | # Bundle app source | ||||||
| COPY . . | 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> | <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> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -204,7 +204,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -279,7 +279,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -347,7 +347,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -415,7 +415,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -486,7 +486,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -554,7 +554,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -622,7 +622,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -690,7 +690,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -758,7 +758,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -833,7 +833,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -901,7 +901,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -969,7 +969,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1037,7 +1037,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1112,7 +1112,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1180,7 +1180,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1248,7 +1248,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1316,7 +1316,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1384,7 +1384,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1452,7 +1452,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1528,7 +1528,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1630,7 +1630,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1830,7 +1830,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -1914,7 +1914,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2020,7 +2020,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2194,7 +2194,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2394,7 +2394,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2572,7 +2572,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2683,7 +2683,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2785,7 +2785,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2887,7 +2887,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -2989,7 +2989,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3091,7 +3091,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3199,7 +3199,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3305,7 +3305,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3456,7 +3456,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3626,7 +3626,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3781,7 +3781,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -3951,7 +3951,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4057,7 +4057,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4259,7 +4259,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4437,7 +4437,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4595,7 +4595,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4765,7 +4765,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -4920,7 +4920,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5090,7 +5090,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5245,7 +5245,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5415,7 +5415,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5570,7 +5570,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5679,7 +5679,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5781,7 +5781,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -5932,7 +5932,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6102,7 +6102,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6257,7 +6257,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6366,7 +6366,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6475,7 +6475,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6577,7 +6577,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6679,7 +6679,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6781,7 +6781,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6888,7 +6888,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -6990,7 +6990,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -7141,7 +7141,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -7319,7 +7319,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -7474,7 +7474,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -7629,7 +7629,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -7784,7 +7784,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -7934,7 +7934,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -8040,7 +8040,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -8146,7 +8146,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -8252,7 +8252,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -8358,7 +8358,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
| @@ -8464,7 +8464,7 @@ This method can be significantly faster than the getAttribute() | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="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> |     </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> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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> |     </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> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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> |     </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> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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> |     </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> |     <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> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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> |     </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> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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> |     </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> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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> |     </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> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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> |     </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> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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> |     </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> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <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> |     </li></ul></dd> | ||||||
|      |      | ||||||
|  |  | ||||||
|   | |||||||
| @@ -37,6 +37,8 @@ const entityChangesService = require('../../services/entity_changes'); | |||||||
| const AbstractEntity = require("./abstract_entity"); | const AbstractEntity = require("./abstract_entity"); | ||||||
| const NoteRevision = require("./note_revision"); | const NoteRevision = require("./note_revision"); | ||||||
| const TaskContext = require("../../services/task_context.js"); | const TaskContext = require("../../services/task_context.js"); | ||||||
|  | const optionService = require("../../services/options.js"); | ||||||
|  | const noteRevisionService = require("../../services/note_revisions.js"); | ||||||
|  |  | ||||||
| const LABEL = 'label'; | const LABEL = 'label'; | ||||||
| const RELATION = 'relation'; | const RELATION = 'relation'; | ||||||
| @@ -1192,6 +1194,41 @@ class Note extends AbstractEntity { | |||||||
|         return !(this.noteId in this.becca.notes); |         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() { |     beforeSaving() { | ||||||
|         super.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 |      * @return {{syncVersion, appVersion, buildRevision, dbVersion, dataDirectory, buildDate}|*} - object representing basic info about running Trilium version | ||||||
|      */ |      */ | ||||||
|     this.getAppInfo = () => appInfo |     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; | module.exports = BackendScriptApi; | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -395,7 +395,7 @@ | |||||||
|      |      | ||||||
|     <dt class="tag-source">Source:</dt> |     <dt class="tag-source">Source:</dt> | ||||||
|     <dd class="tag-source"><ul class="dummy"><li> |     <dd class="tag-source"><ul class="dummy"><li> | ||||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#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> |     </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 |      * @typedef {Object} ToolbarButtonOptions | ||||||
|      * @property {string} title |      * @property {string} title | ||||||
| @@ -412,7 +432,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | |||||||
|     this.getActiveTabTextEditor = callback => { |     this.getActiveTabTextEditor = callback => { | ||||||
|         console.warn("api.getActiveTabTextEditor() is deprecated, use getActiveContextTextEditor() instead."); |         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 |      * @method | ||||||
|      * @returns {Promise<CKEditor>} instance of CKEditor |      * @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 |      * See https://codemirror.net/doc/manual.html#api | ||||||
| @@ -429,7 +449,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | |||||||
|      * @method |      * @method | ||||||
|      * @returns {Promise<CodeMirror>} instance of CodeMirror |      * @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 |      * 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", |   "name": "trilium", | ||||||
|   "version": "0.51.2", |   "version": "0.52.3", | ||||||
|   "lockfileVersion": 2, |   "lockfileVersion": 2, | ||||||
|   "requires": true, |   "requires": true, | ||||||
|   "packages": { |   "packages": { | ||||||
|     "": { |     "": { | ||||||
|       "name": "trilium", |       "name": "trilium", | ||||||
|       "version": "0.51.2", |       "version": "0.52.3", | ||||||
|       "hasInstallScript": true, |       "hasInstallScript": true, | ||||||
|       "license": "AGPL-3.0-only", |       "license": "AGPL-3.0-only", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
| @@ -21,7 +21,7 @@ | |||||||
|         "commonmark": "0.30.0", |         "commonmark": "0.30.0", | ||||||
|         "cookie-parser": "1.4.6", |         "cookie-parser": "1.4.6", | ||||||
|         "csurf": "1.11.0", |         "csurf": "1.11.0", | ||||||
|         "dayjs": "1.11.2", |         "dayjs": "1.11.3", | ||||||
|         "ejs": "3.1.8", |         "ejs": "3.1.8", | ||||||
|         "electron-debug": "3.2.0", |         "electron-debug": "3.2.0", | ||||||
|         "electron-dl": "3.3.1", |         "electron-dl": "3.3.1", | ||||||
| @@ -65,7 +65,7 @@ | |||||||
|         "tmp": "0.2.1", |         "tmp": "0.2.1", | ||||||
|         "turndown": "7.1.1", |         "turndown": "7.1.1", | ||||||
|         "unescape": "1.0.1", |         "unescape": "1.0.1", | ||||||
|         "ws": "8.6.0", |         "ws": "8.7.0", | ||||||
|         "yauzl": "2.10.0" |         "yauzl": "2.10.0" | ||||||
|       }, |       }, | ||||||
|       "bin": { |       "bin": { | ||||||
| @@ -82,7 +82,7 @@ | |||||||
|         "jsdoc": "3.6.10", |         "jsdoc": "3.6.10", | ||||||
|         "lorem-ipsum": "2.0.4", |         "lorem-ipsum": "2.0.4", | ||||||
|         "rcedit": "3.0.1", |         "rcedit": "3.0.1", | ||||||
|         "webpack": "5.72.1", |         "webpack": "5.73.0", | ||||||
|         "webpack-cli": "4.9.2" |         "webpack-cli": "4.9.2" | ||||||
|       }, |       }, | ||||||
|       "optionalDependencies": { |       "optionalDependencies": { | ||||||
| @@ -3115,9 +3115,9 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/dayjs": { |     "node_modules/dayjs": { | ||||||
|       "version": "1.11.2", |       "version": "1.11.3", | ||||||
|       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", |       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz", | ||||||
|       "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" |       "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==" | ||||||
|     }, |     }, | ||||||
|     "node_modules/debug": { |     "node_modules/debug": { | ||||||
|       "version": "4.3.4", |       "version": "4.3.4", | ||||||
| @@ -10252,9 +10252,9 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/webpack": { |     "node_modules/webpack": { | ||||||
|       "version": "5.72.1", |       "version": "5.73.0", | ||||||
|       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", |       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", | ||||||
|       "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", |       "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "@types/eslint-scope": "^3.7.3", |         "@types/eslint-scope": "^3.7.3", | ||||||
| @@ -10594,9 +10594,9 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/ws": { |     "node_modules/ws": { | ||||||
|       "version": "8.6.0", |       "version": "8.7.0", | ||||||
|       "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", |       "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", | ||||||
|       "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", |       "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", | ||||||
|       "engines": { |       "engines": { | ||||||
|         "node": ">=10.0.0" |         "node": ">=10.0.0" | ||||||
|       }, |       }, | ||||||
| @@ -13271,9 +13271,9 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "dayjs": { |     "dayjs": { | ||||||
|       "version": "1.11.2", |       "version": "1.11.3", | ||||||
|       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", |       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz", | ||||||
|       "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" |       "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==" | ||||||
|     }, |     }, | ||||||
|     "debug": { |     "debug": { | ||||||
|       "version": "4.3.4", |       "version": "4.3.4", | ||||||
| @@ -18776,9 +18776,9 @@ | |||||||
|       "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" |       "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" | ||||||
|     }, |     }, | ||||||
|     "webpack": { |     "webpack": { | ||||||
|       "version": "5.72.1", |       "version": "5.73.0", | ||||||
|       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", |       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", | ||||||
|       "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", |       "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "requires": { |       "requires": { | ||||||
|         "@types/eslint-scope": "^3.7.3", |         "@types/eslint-scope": "^3.7.3", | ||||||
| @@ -19028,9 +19028,9 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "ws": { |     "ws": { | ||||||
|       "version": "8.6.0", |       "version": "8.7.0", | ||||||
|       "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", |       "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", | ||||||
|       "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", |       "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", | ||||||
|       "requires": {} |       "requires": {} | ||||||
|     }, |     }, | ||||||
|     "xdg-basedir": { |     "xdg-basedir": { | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|   "name": "trilium", |   "name": "trilium", | ||||||
|   "productName": "Trilium Notes", |   "productName": "Trilium Notes", | ||||||
|   "description": "Trilium Notes", |   "description": "Trilium Notes", | ||||||
|   "version": "0.52.0-beta", |   "version": "0.52.4", | ||||||
|   "license": "AGPL-3.0-only", |   "license": "AGPL-3.0-only", | ||||||
|   "main": "electron.js", |   "main": "electron.js", | ||||||
|   "bin": { |   "bin": { | ||||||
| @@ -36,7 +36,7 @@ | |||||||
|     "commonmark": "0.30.0", |     "commonmark": "0.30.0", | ||||||
|     "cookie-parser": "1.4.6", |     "cookie-parser": "1.4.6", | ||||||
|     "csurf": "1.11.0", |     "csurf": "1.11.0", | ||||||
|     "dayjs": "1.11.2", |     "dayjs": "1.11.3", | ||||||
|     "ejs": "3.1.8", |     "ejs": "3.1.8", | ||||||
|     "electron-debug": "3.2.0", |     "electron-debug": "3.2.0", | ||||||
|     "electron-dl": "3.3.1", |     "electron-dl": "3.3.1", | ||||||
| @@ -80,7 +80,7 @@ | |||||||
|     "tmp": "0.2.1", |     "tmp": "0.2.1", | ||||||
|     "turndown": "7.1.1", |     "turndown": "7.1.1", | ||||||
|     "unescape": "1.0.1", |     "unescape": "1.0.1", | ||||||
|     "ws": "8.6.0", |     "ws": "8.7.0", | ||||||
|     "yauzl": "2.10.0" |     "yauzl": "2.10.0" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
| @@ -94,7 +94,7 @@ | |||||||
|     "jsdoc": "3.6.10", |     "jsdoc": "3.6.10", | ||||||
|     "lorem-ipsum": "2.0.4", |     "lorem-ipsum": "2.0.4", | ||||||
|     "rcedit": "3.0.1", |     "rcedit": "3.0.1", | ||||||
|     "webpack": "5.72.1", |     "webpack": "5.73.0", | ||||||
|     "webpack-cli": "4.9.2" |     "webpack-cli": "4.9.2" | ||||||
|   }, |   }, | ||||||
|   "optionalDependencies": { |   "optionalDependencies": { | ||||||
|   | |||||||
| @@ -5,9 +5,9 @@ const AbstractEntity = require("./abstract_entity"); | |||||||
| const sql = require("../../services/sql"); | const sql = require("../../services/sql"); | ||||||
| const dateUtils = require("../../services/date_utils"); | const dateUtils = require("../../services/date_utils"); | ||||||
| const utils = require("../../services/utils.js"); | const utils = require("../../services/utils.js"); | ||||||
| const TaskContext = require("../../services/task_context.js"); | const TaskContext = require("../../services/task_context"); | ||||||
| const cls = require("../../services/cls.js"); | const cls = require("../../services/cls"); | ||||||
| const log = require("../../services/log.js"); | const log = require("../../services/log"); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Branch represents a relationship between a child note and its parent note. Trilium allows a note to have multiple |  * 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(); |         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' |         if (this.branchId === 'root' | ||||||
|             || this.noteId === 'root' |             || this.noteId === 'root' | ||||||
|             || this.noteId === cls.getHoistedNoteId()) { |             || this.noteId === cls.getHoistedNoteId()) { | ||||||
| @@ -146,7 +158,6 @@ class Branch extends AbstractEntity { | |||||||
|  |  | ||||||
|         this.markAsDeleted(deleteId); |         this.markAsDeleted(deleteId); | ||||||
|  |  | ||||||
|         const note = this.getNote(); |  | ||||||
|         const notDeletedBranches = note.getParentBranches(); |         const notDeletedBranches = note.getParentBranches(); | ||||||
|  |  | ||||||
|         if (notDeletedBranches.length === 0) { |         if (notDeletedBranches.length === 0) { | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ const dateUtils = require('../../services/date_utils'); | |||||||
| const entityChangesService = require('../../services/entity_changes'); | const entityChangesService = require('../../services/entity_changes'); | ||||||
| const AbstractEntity = require("./abstract_entity"); | const AbstractEntity = require("./abstract_entity"); | ||||||
| const NoteRevision = require("./note_revision"); | const NoteRevision = require("./note_revision"); | ||||||
| const TaskContext = require("../../services/task_context.js"); | const TaskContext = require("../../services/task_context"); | ||||||
|  |  | ||||||
| const LABEL = 'label'; | const LABEL = 'label'; | ||||||
| const RELATION = 'relation'; | const RELATION = 'relation'; | ||||||
| @@ -1133,6 +1133,10 @@ class Note extends AbstractEntity { | |||||||
|      * @param {TaskContext} [taskContext] |      * @param {TaskContext} [taskContext] | ||||||
|      */ |      */ | ||||||
|     deleteNote(deleteId, taskContext) { |     deleteNote(deleteId, taskContext) { | ||||||
|  |         if (this.isDeleted) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!deleteId) { |         if (!deleteId) { | ||||||
|             deleteId = utils.randomString(10); |             deleteId = utils.randomString(10); | ||||||
|         } |         } | ||||||
| @@ -1141,6 +1145,11 @@ class Note extends AbstractEntity { | |||||||
|             taskContext = new TaskContext('no-progress-reporting'); |             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()) { |         for (const branch of this.getParentBranches()) { | ||||||
|             branch.deleteBranch(deleteId, taskContext); |             branch.deleteBranch(deleteId, taskContext); | ||||||
|         } |         } | ||||||
| @@ -1164,6 +1173,41 @@ class Note extends AbstractEntity { | |||||||
|         return !(this.noteId in this.becca.notes); |         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() { |     beforeSaving() { | ||||||
|         super.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 |      * @typedef {Object} ToolbarButtonOptions | ||||||
|      * @property {string} title |      * @property {string} title | ||||||
|   | |||||||
| @@ -248,6 +248,13 @@ class NoteContext extends Component { | |||||||
|             ntxId: this.ntxId |             ntxId: this.ntxId | ||||||
|         })); |         })); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     async getTypeWidget() { | ||||||
|  |         return new Promise(resolve => appContext.triggerCommand('executeWithTypeWidget', { | ||||||
|  |             resolve, | ||||||
|  |             ntxId: this.ntxId | ||||||
|  |         })); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| export default NoteContext; | export default NoteContext; | ||||||
|   | |||||||
| @@ -24,8 +24,8 @@ async function createNote(parentNotePath, options = {}) { | |||||||
|         options.saveSelection = false; |         options.saveSelection = false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (options.saveSelection && utils.isCKEditorInitialized()) { |     if (options.saveSelection) { | ||||||
|         [options.title, options.content] = parseSelectedHtml(window.cutToNote.getSelectedHtml()); |         [options.title, options.content] = parseSelectedHtml(options.textEditor.getSelectedHtml()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const parentNoteId = treeService.getNoteIdFromNotePath(parentNotePath); |     const parentNoteId = treeService.getNoteIdFromNotePath(parentNotePath); | ||||||
| @@ -46,9 +46,9 @@ async function createNote(parentNotePath, options = {}) { | |||||||
|         mime: options.mime |         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 |         // 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(); |     await ws.waitForMaxKnownEntityChangeId(); | ||||||
|   | |||||||
| @@ -306,7 +306,8 @@ export default class TabManager extends Component { | |||||||
|                 const mainNoteContexts = this.getNoteContexts().filter(nc => nc.isMainContext()); |                 const mainNoteContexts = this.getNoteContexts().filter(nc => nc.isMainContext()); | ||||||
|  |  | ||||||
|                 if (mainNoteContexts.length === 1) { |                 if (mainNoteContexts.length === 1) { | ||||||
|                     mainNoteContexts[0].setEmpty(); |                     await this.clearLastMainNoteContext(noteContextToRemove); | ||||||
|  |  | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -317,7 +318,7 @@ export default class TabManager extends Component { | |||||||
|             const noteContextsToRemove = noteContextToRemove.getSubContexts(); |             const noteContextsToRemove = noteContextToRemove.getSubContexts(); | ||||||
|             const ntxIdsToRemove = noteContextsToRemove.map(nc => nc.ntxId); |             const ntxIdsToRemove = noteContextsToRemove.map(nc => nc.ntxId); | ||||||
|  |  | ||||||
|             await this.triggerEvent('beforeTabRemove', { ntxIds: ntxIdsToRemove }); |             await this.triggerEvent('beforeNoteContextRemove', { ntxIds: ntxIdsToRemove }); | ||||||
|  |  | ||||||
|             if (!noteContextToRemove.isMainContext()) { |             if (!noteContextToRemove.isMainContext()) { | ||||||
|                 await this.activateNoteContext(noteContextToRemove.getMainContext().ntxId); |                 await this.activateNoteContext(noteContextToRemove.getMainContext().ntxId); | ||||||
| @@ -336,16 +337,39 @@ export default class TabManager extends Component { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             this.children = this.children.filter(nc => !ntxIdsToRemove.includes(nc.ntxId)); |             this.removeNoteContexts(noteContextsToRemove); | ||||||
|  |  | ||||||
|             this.recentlyClosedTabs.push(noteContextsToRemove); |  | ||||||
|  |  | ||||||
|             this.triggerEvent('noteContextRemoved', {ntxIds: ntxIdsToRemove}); |  | ||||||
|  |  | ||||||
|             this.tabsUpdate.scheduleUpdate(); |  | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     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); | ||||||
|  |  | ||||||
|  |         this.triggerEvent('noteContextRemoved', {ntxIds: ntxIdsToRemove}); | ||||||
|  |  | ||||||
|  |         this.tabsUpdate.scheduleUpdate(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     tabReorderEvent({ntxIdsInOrder}) { |     tabReorderEvent({ntxIdsInOrder}) { | ||||||
|         const order = {}; |         const order = {}; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -280,7 +280,7 @@ function isHtmlEmpty(html) { | |||||||
|  |  | ||||||
| async function clearBrowserCache() { | async function clearBrowserCache() { | ||||||
|     if (isElectron()) { |     if (isElectron()) { | ||||||
|         const win = utils.dynamicRequire('@electron/remote').getCurrentWindow(); |         const win = dynamicRequire('@electron/remote').getCurrentWindow(); | ||||||
|         await win.webContents.session.clearCache(); |         await win.webContents.session.clearCache(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -292,10 +292,6 @@ function copySelectionToClipboard() { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| function isCKEditorInitialized() { |  | ||||||
|     return !!(window && window.cutToNote); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function dynamicRequire(moduleName) { | function dynamicRequire(moduleName) { | ||||||
|     if (typeof __non_webpack_require__ !== 'undefined') { |     if (typeof __non_webpack_require__ !== 'undefined') { | ||||||
|         return __non_webpack_require__(moduleName); |         return __non_webpack_require__(moduleName); | ||||||
| @@ -405,7 +401,6 @@ export default { | |||||||
|     clearBrowserCache, |     clearBrowserCache, | ||||||
|     normalizeShortcut, |     normalizeShortcut, | ||||||
|     copySelectionToClipboard, |     copySelectionToClipboard, | ||||||
|     isCKEditorInitialized, |  | ||||||
|     dynamicRequire, |     dynamicRequire, | ||||||
|     timeLimit, |     timeLimit, | ||||||
|     initHelpDropdown, |     initHelpDropdown, | ||||||
|   | |||||||
| @@ -233,6 +233,9 @@ const ATTR_HELP = { | |||||||
|         "runOnNoteCreation": "executes when note is created on backend", |         "runOnNoteCreation": "executes when note is created on backend", | ||||||
|         "runOnNoteTitleChange": "executes when note title is changed (includes note creation as well)", |         "runOnNoteTitleChange": "executes when note title is changed (includes note creation as well)", | ||||||
|         "runOnNoteChange": "executes when note 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", |         "runOnChildNoteCreation": "executes when new note is created under this note", | ||||||
|         "runOnAttributeCreation": "executes when new attribute is created under this note", |         "runOnAttributeCreation": "executes when new attribute is created under this note", | ||||||
|         "runOnAttributeChange": "executes when attribute is changed 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)) { |         if (this.isNoteContext(ntxIds)) { | ||||||
|             await this.spacedUpdate.updateNowIfNecessary(); |             await this.spacedUpdate.updateNowIfNecessary(); | ||||||
|         } |         } | ||||||
| @@ -327,7 +327,8 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { | |||||||
|         // without await as this otherwise causes deadlock through component mutex |         // without await as this otherwise causes deadlock through component mutex | ||||||
|         noteCreateService.createNote(appContext.tabManager.getActiveContextNotePath(), { |         noteCreateService.createNote(appContext.tabManager.getActiveContextNotePath(), { | ||||||
|             isProtected: note.isProtected, |             isProtected: note.isProtected, | ||||||
|             saveSelection: true |             saveSelection: true, | ||||||
|  |             textEditor: await this.noteContext.getTextEditor() | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -341,4 +342,16 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { | |||||||
|             this.refresh(); |             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)) { |         if (this.isNoteContext(ntxIds)) { | ||||||
|             await this.spacedUpdate.updateNowIfNecessary(); |             await this.spacedUpdate.updateNowIfNecessary(); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -134,8 +134,6 @@ const TPL = ` | |||||||
|                             Delete note</a> |                             Delete note</a> | ||||||
|                         <a class="dropdown-item" href="#" data-action-add="deleteNoteRevisions"> |                         <a class="dropdown-item" href="#" data-action-add="deleteNoteRevisions"> | ||||||
|                             Delete note revisions</a> |                             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"> |                         <a class="dropdown-item" href="#" data-action-add="deleteLabel"> | ||||||
|                             Delete label</a> |                             Delete label</a> | ||||||
|                         <a class="dropdown-item" href="#" data-action-add="deleteRelation"> |                         <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 TypeWidget from "./type_widget.js"; | ||||||
| import utils from '../../services/utils.js'; | import utils from '../../services/utils.js'; | ||||||
| import froca from "../../services/froca.js"; | import froca from "../../services/froca.js"; | ||||||
| import debounce from "../../../../../libraries/lodash.debounce.js"; | import debounce from "../../services/debounce.js"; | ||||||
|  |  | ||||||
| const {sleep} = utils; | const {sleep} = utils; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -359,7 +359,9 @@ pre:not(.CodeMirror-line) { | |||||||
|  |  | ||||||
| .go-to-selected-note-button.disabled, .go-to-selected-note-button.disabled:hover { | .go-to-selected-note-button.disabled, .go-to-selected-note-button.disabled:hover { | ||||||
|     cursor: inherit; |     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 { | .note-autocomplete-input { | ||||||
| @@ -966,3 +968,8 @@ input { | |||||||
| .note-split.full-content-width { | .note-split.full-content-width { | ||||||
|     max-width: 999999px; |     max-width: 999999px; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | button.close:hover { | ||||||
|  |     text-shadow: none; | ||||||
|  |     color: currentColor; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -21,10 +21,11 @@ | |||||||
|     --more-accented-background-color: #777; |     --more-accented-background-color: #777; | ||||||
|  |  | ||||||
|     --button-background-color: transparent; |     --button-background-color: transparent; | ||||||
|     --button-disabled-background-color: #222; |  | ||||||
|     --button-border-color: #ccc; |     --button-border-color: #ccc; | ||||||
|     --button-text-color: currentColor; |     --button-text-color: currentColor; | ||||||
|     --button-border-radius: 5px; |     --button-border-radius: 5px; | ||||||
|  |     --button-disabled-background-color: transparent; | ||||||
|  |     --button-disabled-text-color: #999; | ||||||
|  |  | ||||||
|     --primary-button-background-color: #888; |     --primary-button-background-color: #888; | ||||||
|     --primary-button-text-color: white; |     --primary-button-text-color: white; | ||||||
|   | |||||||
| @@ -25,10 +25,11 @@ html { | |||||||
|     --more-accented-background-color: #ddd; |     --more-accented-background-color: #ddd; | ||||||
|  |  | ||||||
|     --button-background-color: transparent; |     --button-background-color: transparent; | ||||||
|     --button-disabled-background-color: #ddd; |  | ||||||
|     --button-border-color: #ddd; |     --button-border-color: #ddd; | ||||||
|     --button-text-color: black; |     --button-text-color: black; | ||||||
|     --button-border-radius: 5px; |     --button-border-radius: 5px; | ||||||
|  |     --button-disabled-background-color: #ddd; | ||||||
|  |     --button-disabled-text-color: black; | ||||||
|  |  | ||||||
|     --primary-button-background-color: #6c757d; |     --primary-button-background-color: #6c757d; | ||||||
|     --primary-button-text-color: white; |     --primary-button-text-color: white; | ||||||
|   | |||||||
| @@ -170,7 +170,6 @@ span.fancytree-active .fancytree-title { | |||||||
| } | } | ||||||
|  |  | ||||||
| span.fancytree-selected { | span.fancytree-selected { | ||||||
|     color: var(--hover-item-text-color) !important; |  | ||||||
|     border-color: var(--main-border-color) !important; |     border-color: var(--main-border-color) !important; | ||||||
|     border-radius: 5px; |     border-radius: 5px; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -15,7 +15,9 @@ function exportBranch(req, res) { | |||||||
|         const message = `Cannot export branch ${branchId} since it does not exist.`; |         const message = `Cannot export branch ${branchId} since it does not exist.`; | ||||||
|         log.error(message); |         log.error(message); | ||||||
|  |  | ||||||
|         res.status(500).send(message); |         res.setHeader("Content-Type", "text/plain") | ||||||
|  |             .status(500) | ||||||
|  |             .send(message); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -41,7 +43,9 @@ function exportBranch(req, res) { | |||||||
|  |  | ||||||
|         log.error(message + e.stack); |         log.error(message + e.stack); | ||||||
|  |  | ||||||
|         res.status(500).send(message); |         res.setHeader("Content-Type", "text/plain") | ||||||
|  |             .status(500) | ||||||
|  |             .send(message); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -21,7 +21,8 @@ function updateFile(req) { | |||||||
|         return [404, `Note ${noteId} doesn't exist.`]; |         return [404, `Note ${noteId} doesn't exist.`]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     noteRevisionService.createNoteRevision(note); |     note.saveNoteRevision(); | ||||||
|  |     noteRevisionService.protectNoteRevisions(note); | ||||||
|  |  | ||||||
|     note.mime = file.mimetype.toLowerCase(); |     note.mime = file.mimetype.toLowerCase(); | ||||||
|     note.save(); |     note.save(); | ||||||
| @@ -47,7 +48,9 @@ function downloadNoteFile(noteId, res, contentDisposition = true) { | |||||||
|     const note = becca.getNote(noteId); |     const note = becca.getNote(noteId); | ||||||
|  |  | ||||||
|     if (!note) { |     if (!note) { | ||||||
|         return res.status(404).send(`Note ${noteId} doesn't exist.`); |         return res.setHeader("Content-Type", "text/plain") | ||||||
|  |             .status(404) | ||||||
|  |             .send(`Note ${noteId} doesn't exist.`); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (note.isProtected && !protectedSessionService.isProtectedSessionAvailable()) { |     if (note.isProtected && !protectedSessionService.isProtectedSessionAvailable()) { | ||||||
|   | |||||||
| @@ -33,7 +33,9 @@ function returnImage(req, res) { | |||||||
|             res.set("Cache-Control", "no-cache, no-store, must-revalidate"); |             res.set("Cache-Control", "no-cache, no-store, must-revalidate"); | ||||||
|             res.send(svg); |             res.send(svg); | ||||||
|         } catch(err) { |         } catch(err) { | ||||||
|             res.status(500).send("there was an error parsing excalidraw to svg"); |             res.setHeader("Content-Type", "text/plain") | ||||||
|  |                 .status(500) | ||||||
|  |                 .send("there was an error parsing excalidraw to svg"); | ||||||
|         } |         } | ||||||
|     } else { |     } else { | ||||||
|         res.set('Content-Type', image.mime); |         res.set('Content-Type', image.mime); | ||||||
|   | |||||||
| @@ -65,11 +65,15 @@ function downloadNoteRevision(req, res) { | |||||||
|     const noteRevision = becca.getNoteRevision(req.params.noteRevisionId); |     const noteRevision = becca.getNoteRevision(req.params.noteRevisionId); | ||||||
|  |  | ||||||
|     if (noteRevision.noteId !== req.params.noteId) { |     if (noteRevision.noteId !== req.params.noteId) { | ||||||
|         return res.status(400).send(`Note revision ${req.params.noteRevisionId} does not belong to note ${req.params.noteId}`); |         return res.setHeader("Content-Type", "text/plain") | ||||||
|  |             .status(400) | ||||||
|  |             .send(`Note revision ${req.params.noteRevisionId} does not belong to note ${req.params.noteId}`); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (noteRevision.isProtected && !protectedSessionService.isProtectedSessionAvailable()) { |     if (noteRevision.isProtected && !protectedSessionService.isProtectedSessionAvailable()) { | ||||||
|         return res.status(401).send("Protected session not available"); |         return res.setHeader("Content-Type", "text/plain") | ||||||
|  |             .status(401) | ||||||
|  |             .send("Protected session not available"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const filename = getRevisionFilename(noteRevision); |     const filename = getRevisionFilename(noteRevision); | ||||||
| @@ -97,7 +101,8 @@ function restoreNoteRevision(req) { | |||||||
|     if (noteRevision) { |     if (noteRevision) { | ||||||
|         const note = noteRevision.getNote(); |         const note = noteRevision.getNote(); | ||||||
|  |  | ||||||
|         noteRevisionService.createNoteRevision(note); |         note.saveNoteRevision(); | ||||||
|  |         noteRevisionService.protectNoteRevisions(note); | ||||||
|  |  | ||||||
|         note.title = noteRevision.title; |         note.title = noteRevision.title; | ||||||
|         note.setContent(noteRevision.getContent()); |         note.setContent(noteRevision.getContent()); | ||||||
|   | |||||||
| @@ -206,7 +206,7 @@ function changeTitle(req) { | |||||||
|     const noteTitleChanged = note.title !== title; |     const noteTitleChanged = note.title !== title; | ||||||
|  |  | ||||||
|     if (noteTitleChanged) { |     if (noteTitleChanged) { | ||||||
|         noteService.saveNoteRevision(note); |         noteService.saveNoteRevisionIfNeeded(note); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     note.title = title; |     note.title = title; | ||||||
| @@ -294,7 +294,8 @@ function uploadModifiedFile(req) { | |||||||
|  |  | ||||||
|     log.info(`Updating note '${noteId}' with content from ${filePath}`); |     log.info(`Updating note '${noteId}' with content from ${filePath}`); | ||||||
|  |  | ||||||
|     noteRevisionService.createNoteRevision(note); |     note.saveNoteRevision(); | ||||||
|  |     noteRevisionService.protectNoteRevisions(note); | ||||||
|  |  | ||||||
|     const fileContent = fs.readFileSync(filePath); |     const fileContent = fs.readFileSync(filePath); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,15 +9,16 @@ const noteRevisionService = require("../../services/note_revisions"); | |||||||
| const branchService = require("../../services/branches"); | const branchService = require("../../services/branches"); | ||||||
| const cloningService = require("../../services/cloning"); | const cloningService = require("../../services/cloning"); | ||||||
| const {formatAttrForSearch} = require("../../services/attribute_formatter"); | const {formatAttrForSearch} = require("../../services/attribute_formatter"); | ||||||
|  | const utils = require("../../services/utils.js"); | ||||||
|  |  | ||||||
| async function searchFromNoteInt(note) { | function searchFromNoteInt(note) { | ||||||
|     let searchResultNoteIds; |     let searchResultNoteIds; | ||||||
|  |  | ||||||
|     const searchScript = note.getRelationValue('searchScript'); |     const searchScript = note.getRelationValue('searchScript'); | ||||||
|     const searchString = note.getLabelValue('searchString'); |     const searchString = note.getLabelValue('searchString'); | ||||||
|  |  | ||||||
|     if (searchScript) { |     if (searchScript) { | ||||||
|         searchResultNoteIds = await searchFromRelation(note, 'searchScript'); |         searchResultNoteIds = searchFromRelation(note, 'searchScript'); | ||||||
|     } else { |     } else { | ||||||
|         const searchContext = new SearchContext({ |         const searchContext = new SearchContext({ | ||||||
|             fastSearch: note.hasLabel('fastSearch'), |             fastSearch: note.hasLabel('fastSearch'), | ||||||
| @@ -61,7 +62,9 @@ async function searchFromNote(req) { | |||||||
|  |  | ||||||
| const ACTION_HANDLERS = { | const ACTION_HANDLERS = { | ||||||
|     deleteNote: (action, note) => { |     deleteNote: (action, note) => { | ||||||
|         note.markAsDeleted(); |         const deleteId = 'searchbulkaction-' + utils.randomString(10); | ||||||
|  |  | ||||||
|  |         note.deleteNote(deleteId); | ||||||
|     }, |     }, | ||||||
|     deleteNoteRevisions: (action, note) => { |     deleteNoteRevisions: (action, note) => { | ||||||
|         noteRevisionService.eraseNoteRevisions(note.getNoteRevisions().map(rev => rev.noteRevisionId)); |         noteRevisionService.eraseNoteRevisions(note.getNoteRevisions().map(rev => rev.noteRevisionId)); | ||||||
| @@ -149,7 +152,7 @@ function getActions(note) { | |||||||
|         .filter(a => !!a); |         .filter(a => !!a); | ||||||
| } | } | ||||||
|  |  | ||||||
| async function searchAndExecute(req) { | function searchAndExecute(req) { | ||||||
|     const note = becca.getNote(req.params.noteId); |     const note = becca.getNote(req.params.noteId); | ||||||
|  |  | ||||||
|     if (!note) { |     if (!note) { | ||||||
| @@ -165,7 +168,7 @@ async function searchAndExecute(req) { | |||||||
|         return [400, `Note ${req.params.noteId} is not a search note.`] |         return [400, `Note ${req.params.noteId} is not a search note.`] | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const searchResultNoteIds = await searchFromNoteInt(note); |     const searchResultNoteIds = searchFromNoteInt(note); | ||||||
|  |  | ||||||
|     const actions = getActions(note); |     const actions = getActions(note); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -49,7 +49,9 @@ function handleRequest(req, res) { | |||||||
|             catch (e) { |             catch (e) { | ||||||
|                 log.error(`Custom handler ${note.noteId} failed with ${e.message}`); |                 log.error(`Custom handler ${note.noteId} failed with ${e.message}`); | ||||||
|  |  | ||||||
|                 res.status(500).send(e.message); |                 res.setHeader("Content-Type", "text/plain") | ||||||
|  |                     .status(500) | ||||||
|  |                     .send(e.message); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         else if (attr.name === 'customResourceProvider') { |         else if (attr.name === 'customResourceProvider') { | ||||||
| @@ -65,7 +67,9 @@ function handleRequest(req, res) { | |||||||
|     const message = `No handler matched for custom ${path} request.`; |     const message = `No handler matched for custom ${path} request.`; | ||||||
|  |  | ||||||
|     log.info(message); |     log.info(message); | ||||||
|     res.status(404).send(message); |     res.setHeader("Content-Type", "text/plain") | ||||||
|  |         .status(404) | ||||||
|  |         .send(message); | ||||||
| } | } | ||||||
|  |  | ||||||
| function register(router) { | function register(router) { | ||||||
|   | |||||||
| @@ -120,6 +120,10 @@ function apiResultHandler(req, res, result) { | |||||||
|  |  | ||||||
| function send(res, statusCode, response) { | function send(res, statusCode, response) { | ||||||
|     if (typeof response === 'string') { |     if (typeof response === 'string') { | ||||||
|  |         if (statusCode >= 400) { | ||||||
|  |             res.setHeader("Content-Type", "text/plain"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         res.status(statusCode).send(response); |         res.status(statusCode).send(response); | ||||||
|  |  | ||||||
|         return response.length; |         return response.length; | ||||||
| @@ -167,7 +171,9 @@ function route(method, path, middleware, routeHandler, resultHandler, transactio | |||||||
|                         .catch(e => { |                         .catch(e => { | ||||||
|                             log.error(`${method} ${path} threw exception: ` + e.stack); |                             log.error(`${method} ${path} threw exception: ` + e.stack); | ||||||
|  |  | ||||||
|                             res.status(500).send(e.message); |                             res.setHeader("Content-Type", "text/plain") | ||||||
|  |                                 .status(500) | ||||||
|  |                                 .send(e.message); | ||||||
|                         }); |                         }); | ||||||
|                 } |                 } | ||||||
|                 else { |                 else { | ||||||
| @@ -180,7 +186,9 @@ function route(method, path, middleware, routeHandler, resultHandler, transactio | |||||||
|         catch (e) { |         catch (e) { | ||||||
|             log.error(`${method} ${path} threw exception: ` + e.stack); |             log.error(`${method} ${path} threw exception: ` + e.stack); | ||||||
|  |  | ||||||
|             res.status(500).send(e.message); |             res.setHeader("Content-Type", "text/plain") | ||||||
|  |                 .status(500) | ||||||
|  |                 .send(e.message); | ||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -88,17 +88,23 @@ function checkEtapiToken(req, res, next) { | |||||||
| function reject(req, res, message) { | function reject(req, res, message) { | ||||||
|     log.info(`${req.method} ${req.path} rejected with 401 ${message}`); |     log.info(`${req.method} ${req.path} rejected with 401 ${message}`); | ||||||
|  |  | ||||||
|     res.status(401).send(message); |     res.setHeader("Content-Type", "text/plain") | ||||||
|  |         .status(401) | ||||||
|  |         .send(message); | ||||||
| } | } | ||||||
|  |  | ||||||
| function checkCredentials(req, res, next) { | function checkCredentials(req, res, next) { | ||||||
|     if (!sqlInit.isDbInitialized()) { |     if (!sqlInit.isDbInitialized()) { | ||||||
|         res.status(400).send('Database is not initialized yet.'); |         res.setHeader("Content-Type", "text/plain") | ||||||
|  |             .status(400) | ||||||
|  |             .send('Database is not initialized yet.'); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!passwordService.isPasswordSet()) { |     if (!passwordService.isPasswordSet()) { | ||||||
|         res.status(400).send('Password has not been set yet. Please set a password and repeat the action'); |         res.setHeader("Content-Type", "text/plain") | ||||||
|  |             .status(400) | ||||||
|  |             .send('Password has not been set yet. Please set a password and repeat the action'); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -109,7 +115,9 @@ function checkCredentials(req, res, next) { | |||||||
|     // username is ignored |     // username is ignored | ||||||
|  |  | ||||||
|     if (!passwordEncryptionService.verifyPassword(password)) { |     if (!passwordEncryptionService.verifyPassword(password)) { | ||||||
|         res.status(401).send('Incorrect password'); |         res.setHeader("Content-Type", "text/plain") | ||||||
|  |             .status(401) | ||||||
|  |             .send('Incorrect password'); | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|         next(); |         next(); | ||||||
|   | |||||||
| @@ -426,6 +426,15 @@ function BackendScriptApi(currentNote, apiParams) { | |||||||
|      * @return {{syncVersion, appVersion, buildRevision, dbVersion, dataDirectory, buildDate}|*} - object representing basic info about running Trilium version |      * @return {{syncVersion, appVersion, buildRevision, dbVersion, dataDirectory, buildDate}|*} - object representing basic info about running Trilium version | ||||||
|      */ |      */ | ||||||
|     this.getAppInfo = () => appInfo |     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; | module.exports = BackendScriptApi; | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| module.exports = { buildDate:"2022-05-27T22:06:07+02:00", buildRevision: "8905148dbcdf0118078a880e295563023ac20783" }; | module.exports = { buildDate:"2022-07-01T00:11:53+02:00", buildRevision: "3faae63b849a1fabc31b823bb7af3a84d32256a7" }; | ||||||
|   | |||||||
| @@ -50,7 +50,7 @@ module.exports = [ | |||||||
|     { type: 'label', name: 'shareDisallowRobotIndexing' }, |     { type: 'label', name: 'shareDisallowRobotIndexing' }, | ||||||
|     { type: 'label', name: 'displayRelations' }, |     { type: 'label', name: 'displayRelations' }, | ||||||
|     { type: 'label', name: 'hideRelations' }, |     { type: 'label', name: 'hideRelations' }, | ||||||
|     { type: 'label', name: 'titleTemplate' }, |     { type: 'label', name: 'titleTemplate', isDangerous: true }, | ||||||
|  |  | ||||||
|     // relation names |     // relation names | ||||||
|     { type: 'relation', name: 'internalLink' }, |     { type: 'relation', name: 'internalLink' }, | ||||||
| @@ -60,6 +60,9 @@ module.exports = [ | |||||||
|     { type: 'relation', name: 'runOnNoteCreation', isDangerous: true }, |     { type: 'relation', name: 'runOnNoteCreation', isDangerous: true }, | ||||||
|     { type: 'relation', name: 'runOnNoteTitleChange', isDangerous: true }, |     { type: 'relation', name: 'runOnNoteTitleChange', isDangerous: true }, | ||||||
|     { type: 'relation', name: 'runOnNoteChange', 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: 'runOnChildNoteCreation', isDangerous: true }, | ||||||
|     { type: 'relation', name: 'runOnAttributeCreation', isDangerous: true }, |     { type: 'relation', name: 'runOnAttributeCreation', isDangerous: true }, | ||||||
|     { type: 'relation', name: 'runOnAttributeChange', isDangerous: true }, |     { type: 'relation', name: 'runOnAttributeChange', isDangerous: true }, | ||||||
|   | |||||||
| @@ -367,26 +367,30 @@ class ConsistencyChecks { | |||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|         this.findAndFixIssues(` |         if (sqlInit.getDbSize() < 500000) { | ||||||
|                     SELECT notes.noteId, notes.type, notes.mime |             // querying for "content IS NULL" is expensive since content is not indexed. See e.g. https://github.com/zadam/trilium/issues/2887 | ||||||
|                     FROM notes |  | ||||||
|                       JOIN note_contents USING (noteId) |  | ||||||
|                     WHERE isDeleted = 0 |  | ||||||
|                       AND isProtected = 0 |  | ||||||
|                       AND content IS NULL`, |  | ||||||
|             ({noteId, type, mime}) => { |  | ||||||
|                 if (this.autoFix) { |  | ||||||
|                     const note = becca.getNote(noteId); |  | ||||||
|                     const blankContent = getBlankContent(false, type, mime); |  | ||||||
|                     note.setContent(blankContent); |  | ||||||
|  |  | ||||||
|                     this.reloadNeeded = true; |             this.findAndFixIssues(` | ||||||
|  |                         SELECT notes.noteId, notes.type, notes.mime | ||||||
|  |                         FROM notes | ||||||
|  |                                  JOIN note_contents USING (noteId) | ||||||
|  |                         WHERE isDeleted = 0 | ||||||
|  |                           AND isProtected = 0 | ||||||
|  |                           AND content IS NULL`, | ||||||
|  |                 ({noteId, type, mime}) => { | ||||||
|  |                     if (this.autoFix) { | ||||||
|  |                         const note = becca.getNote(noteId); | ||||||
|  |                         const blankContent = getBlankContent(false, type, mime); | ||||||
|  |                         note.setContent(blankContent); | ||||||
|  |  | ||||||
|                     logFix(`Note ${noteId} content was set to "${blankContent}" since it was null even though it is not deleted`); |                         this.reloadNeeded = true; | ||||||
|                 } else { |  | ||||||
|                     logError(`Note ${noteId} content is null even though it is not deleted`); |                         logFix(`Note ${noteId} content was set to "${blankContent}" since it was null even though it is not deleted`); | ||||||
|                 } |                     } else { | ||||||
|             }); |                         logError(`Note ${noteId} content is null even though it is not deleted`); | ||||||
|  |                     } | ||||||
|  |                 }); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         this.findAndFixIssues(` |         this.findAndFixIssues(` | ||||||
|                     SELECT note_revisions.noteRevisionId |                     SELECT note_revisions.noteRevisionId | ||||||
|   | |||||||
| @@ -49,6 +49,7 @@ eventService.subscribe([ eventService.ENTITY_CHANGED, eventService.ENTITY_DELETE | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     else if (entityName === 'notes') { |     else if (entityName === 'notes') { | ||||||
|  |         // ENTITY_DELETED won't trigger anything since all branches/attributes are already deleted at this point | ||||||
|         runAttachedRelations(entity, 'runOnNoteChange', entity); |         runAttachedRelations(entity, 'runOnNoteChange', entity); | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
| @@ -94,6 +95,9 @@ eventService.subscribe(eventService.ENTITY_CREATED, ({ entityName, entity }) => | |||||||
|             handleSortedAttribute(entity); |             handleSortedAttribute(entity); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     else if (entityName === 'branches') { | ||||||
|  |         runAttachedRelations(entity.getNote(), 'runOnBranchCreation', entity); | ||||||
|  |     } | ||||||
|     else if (entityName === 'notes') { |     else if (entityName === 'notes') { | ||||||
|         runAttachedRelations(entity, 'runOnNoteCreation', entity); |         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); |     const note = becca.getNote(noteId); | ||||||
|  |  | ||||||
|     noteRevisionService.createNoteRevision(note); |     note.saveNoteRevision(); | ||||||
|     noteRevisionService.protectNoteRevisions(note); |     noteRevisionService.protectNoteRevisions(note); | ||||||
|  |  | ||||||
|     note.setLabel('originalFileName', originalName); |     note.setLabel('originalFileName', originalName); | ||||||
|   | |||||||
| @@ -98,25 +98,25 @@ const DEFAULT_KEYBOARD_ACTIONS = [ | |||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|         actionName: "moveNoteUp", |         actionName: "moveNoteUp", | ||||||
|         defaultShortcuts: ["CommandOrControl+Up"], |         defaultShortcuts: isMac ? ["Alt+Up"] : ["CommandOrControl+Up"], | ||||||
|         description: "Move note up", |         description: "Move note up", | ||||||
|         scope: "note-tree" |         scope: "note-tree" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|         actionName: "moveNoteDown", |         actionName: "moveNoteDown", | ||||||
|         defaultShortcuts: ["CommandOrControl+Down"], |         defaultShortcuts: isMac ? ["Alt+Down"] : ["CommandOrControl+Down"], | ||||||
|         description: "Move note down", |         description: "Move note down", | ||||||
|         scope: "note-tree" |         scope: "note-tree" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|         actionName: "moveNoteUpInHierarchy", |         actionName: "moveNoteUpInHierarchy", | ||||||
|         defaultShortcuts: ["CommandOrControl+Left"], |         defaultShortcuts: isMac ? ["Alt+Left"] : ["CommandOrControl+Left"], | ||||||
|         description: "Move note up in hierarchy", |         description: "Move note up in hierarchy", | ||||||
|         scope: "note-tree" |         scope: "note-tree" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|         actionName: "moveNoteDownInHierarchy", |         actionName: "moveNoteDownInHierarchy", | ||||||
|         defaultShortcuts: ["CommandOrControl+Right"], |         defaultShortcuts: isMac ? ["Alt+Right"] : ["CommandOrControl+Right"], | ||||||
|         description: "Move note down in hierarchy", |         description: "Move note down in hierarchy", | ||||||
|         scope: "note-tree" |         scope: "note-tree" | ||||||
|     }, |     }, | ||||||
|   | |||||||
| @@ -102,7 +102,7 @@ function isDbUpToDate() { | |||||||
| async function migrateIfNecessary() { | async function migrateIfNecessary() { | ||||||
|     const currentDbVersion = getDbVersion(); |     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.`); |         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(); |         utils.crash(); | ||||||
|   | |||||||
| @@ -1,9 +1,8 @@ | |||||||
| "use strict"; | "use strict"; | ||||||
|  |  | ||||||
| const NoteRevision = require('../becca/entities/note_revision'); |  | ||||||
| const dateUtils = require('./date_utils'); |  | ||||||
| const log = require('./log'); | const log = require('./log'); | ||||||
| const sql = require('./sql'); | const sql = require('./sql'); | ||||||
|  | const protectedSession = require("./protected_session"); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @param {Note} note |  * @param {Note} note | ||||||
| @@ -11,6 +10,12 @@ const sql = require('./sql'); | |||||||
| function protectNoteRevisions(note) { | function protectNoteRevisions(note) { | ||||||
|     for (const revision of note.getNoteRevisions()) { |     for (const revision of note.getNoteRevisions()) { | ||||||
|         if (note.isProtected !== revision.isProtected) { |         if (note.isProtected !== revision.isProtected) { | ||||||
|  |             if (!protectedSession.isProtectedSessionAvailable()) { | ||||||
|  |                 log.error("Protected session is not available to fix note revisions."); | ||||||
|  |  | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             try { |             try { | ||||||
|                 const content = revision.getContent(); |                 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) { | function eraseNoteRevisions(noteRevisionIdsToErase) { | ||||||
|     if (noteRevisionIdsToErase.length === 0) { |     if (noteRevisionIdsToErase.length === 0) { | ||||||
|         return; |         return; | ||||||
| @@ -86,6 +51,5 @@ function eraseNoteRevisions(noteRevisionIdsToErase) { | |||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|     protectNoteRevisions, |     protectNoteRevisions, | ||||||
|     createNoteRevision, |  | ||||||
|     eraseNoteRevisions |     eraseNoteRevisions | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -491,7 +491,7 @@ function saveLinks(note, content) { | |||||||
|     return content; |     return content; | ||||||
| } | } | ||||||
|  |  | ||||||
| function saveNoteRevision(note) { | function saveNoteRevisionIfNeeded(note) { | ||||||
|     // files and images are versioned separately |     // files and images are versioned separately | ||||||
|     if (note.type === 'file' || note.type === 'image' || note.hasLabel('disableVersioning')) { |     if (note.type === 'file' || note.type === 'image' || note.hasLabel('disableVersioning')) { | ||||||
|         return; |         return; | ||||||
| @@ -508,7 +508,7 @@ function saveNoteRevision(note) { | |||||||
|     const msSinceDateCreated = now.getTime() - dateUtils.parseDateTime(note.utcDateCreated).getTime(); |     const msSinceDateCreated = now.getTime() - dateUtils.parseDateTime(note.utcDateCreated).getTime(); | ||||||
|  |  | ||||||
|     if (!existingNoteRevisionId && msSinceDateCreated >= noteRevisionSnapshotTimeInterval * 1000) { |     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!`); |         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 protected status changed, then we need to encrypt/decrypt the content anyway | ||||||
|     if (['file', 'image'].includes(note.type) && note.isProtected !== noteUpdates.isProtected) { |     if (['file', 'image'].includes(note.type) && note.isProtected !== noteUpdates.isProtected) { | ||||||
| @@ -910,6 +910,6 @@ module.exports = { | |||||||
|     triggerNoteTitleChanged, |     triggerNoteTitleChanged, | ||||||
|     eraseDeletedNotesNow, |     eraseDeletedNotesNow, | ||||||
|     eraseNotesWithDeleteId, |     eraseNotesWithDeleteId, | ||||||
|     saveNoteRevision, |     saveNoteRevisionIfNeeded, | ||||||
|     downloadImages |     downloadImages | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -83,7 +83,7 @@ function lex(str) { | |||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|         else if (!quotes) { |         else if (!quotes) { | ||||||
|             if (!fulltextEnded && currentWord === 'note' && chr === '.') { |             if (!fulltextEnded && currentWord === 'note' && chr === '.' && i + 1 < str.length) { | ||||||
|                 fulltextEnded = true; |                 fulltextEnded = true; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -78,6 +78,10 @@ function findResultsWithExpression(expression, searchContext) { | |||||||
|  |  | ||||||
|     const searchResults = noteSet.notes |     const searchResults = noteSet.notes | ||||||
|         .map(note => { |         .map(note => { | ||||||
|  |             if (note.isDeleted) { | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             const notePathArray = executionContext.noteIdToNotePath[note.noteId] || beccaService.getSomePath(note); |             const notePathArray = executionContext.noteIdToNotePath[note.noteId] || beccaService.getSomePath(note); | ||||||
|  |  | ||||||
|             if (!notePathArray) { |             if (!notePathArray) { | ||||||
| @@ -85,7 +89,8 @@ function findResultsWithExpression(expression, searchContext) { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             return new SearchResult(notePathArray); |             return new SearchResult(notePathArray); | ||||||
|         }); |         }) | ||||||
|  |         .filter(note => !!note); | ||||||
|  |  | ||||||
|     for (const res of searchResults) { |     for (const res of searchResults) { | ||||||
|         res.computeScore(searchContext.highlightedTokens); |         res.computeScore(searchContext.highlightedTokens); | ||||||
|   | |||||||
| @@ -242,9 +242,9 @@ function transactional(func) { | |||||||
|         return ret; |         return ret; | ||||||
|     } |     } | ||||||
|     catch (e) { |     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."); |             log.info("Transaction rollback dirtied the becca, forcing reload."); | ||||||
|  |  | ||||||
|             require('../becca/becca_loader').load(); |             require('../becca/becca_loader').load(); | ||||||
|   | |||||||
| @@ -178,7 +178,11 @@ dbReady.then(() => { | |||||||
|     setInterval(() => optimize(), 10 * 60 * 60 * 1000); |     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 = { | module.exports = { | ||||||
|     dbReady, |     dbReady, | ||||||
| @@ -186,5 +190,6 @@ module.exports = { | |||||||
|     isDbInitialized, |     isDbInitialized, | ||||||
|     createInitialDatabase, |     createInitialDatabase, | ||||||
|     createDatabaseForSync, |     createDatabaseForSync, | ||||||
|     setDbAsInitialized |     setDbAsInitialized, | ||||||
|  |     getDbSize | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ class TaskContext { | |||||||
|         this.taskId = taskId; |         this.taskId = taskId; | ||||||
|         this.taskType = taskType; |         this.taskType = taskType; | ||||||
|         this.data = data; |         this.data = data; | ||||||
|  |         this.noteDeletionHandlerTriggered = false; | ||||||
|  |  | ||||||
|         // progressCount is meant to represent just some progress - to indicate the task is not stuck |         // progressCount is meant to represent just some progress - to indicate the task is not stuck | ||||||
|         this.progressCount = -1; // we're incrementing immediatelly |         this.progressCount = -1; // we're incrementing immediatelly | ||||||
|   | |||||||
| @@ -39,9 +39,9 @@ function register(router) { | |||||||
|         addNoIndexHeader(note, res); |         addNoIndexHeader(note, res); | ||||||
|  |  | ||||||
|         if (note.hasLabel('shareRaw') || ['image', 'file'].includes(note.type)) { |         if (note.hasLabel('shareRaw') || ['image', 'file'].includes(note.type)) { | ||||||
|             res.setHeader('Content-Type', note.mime); |             res.setHeader('Content-Type', note.mime) | ||||||
|  |                 .send(note.getContent()); | ||||||
|  |  | ||||||
|             res.send(note.getContent()); |  | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -83,7 +83,9 @@ function register(router) { | |||||||
|         const note = shaca.getNote(noteId); |         const note = shaca.getNote(noteId); | ||||||
|  |  | ||||||
|         if (!note) { |         if (!note) { | ||||||
|             return res.status(404).send(`Note '${noteId}' not found`); |             return res.setHeader("Content-Type", "text/plain") | ||||||
|  |                 .status(404) | ||||||
|  |                 .send(`Note '${noteId}' not found`); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         addNoIndexHeader(note, res); |         addNoIndexHeader(note, res); | ||||||
| @@ -98,7 +100,9 @@ function register(router) { | |||||||
|         const note = shaca.getNote(noteId); |         const note = shaca.getNote(noteId); | ||||||
|  |  | ||||||
|         if (!note) { |         if (!note) { | ||||||
|             return res.status(404).send(`Note '${noteId}' not found`); |             return res.setHeader("Content-Type", "text/plain") | ||||||
|  |                 .status(404) | ||||||
|  |                 .send(`Note '${noteId}' not found`); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         addNoIndexHeader(note, res); |         addNoIndexHeader(note, res); | ||||||
| @@ -122,10 +126,14 @@ function register(router) { | |||||||
|         const image = shaca.getNote(req.params.noteId); |         const image = shaca.getNote(req.params.noteId); | ||||||
|  |  | ||||||
|         if (!image) { |         if (!image) { | ||||||
|             return res.status(404).send(`Note '${req.params.noteId}' not found`); |             return res.setHeader('Content-Type', 'text/plain') | ||||||
|  |                 .status(404) | ||||||
|  |                 .send(`Note '${req.params.noteId}' not found`); | ||||||
|         } |         } | ||||||
|         else if (!["image", "canvas"].includes(image.type)) { |         else if (!["image", "canvas"].includes(image.type)) { | ||||||
|             return res.status(400).send("Requested note is not a shareable image"); |             return res.setHeader('Content-Type', 'text/plain') | ||||||
|  |                 .status(400) | ||||||
|  |                 .send("Requested note is not a shareable image"); | ||||||
|         } else if (image.type === "canvas") { |         } else if (image.type === "canvas") { | ||||||
|             /** |             /** | ||||||
|              * special "image" type. the canvas is actually type application/json |              * special "image" type. the canvas is actually type application/json | ||||||
| @@ -141,7 +149,9 @@ function register(router) { | |||||||
|                 res.set("Cache-Control", "no-cache, no-store, must-revalidate"); |                 res.set("Cache-Control", "no-cache, no-store, must-revalidate"); | ||||||
|                 res.send(svg); |                 res.send(svg); | ||||||
|             } catch(err) { |             } catch(err) { | ||||||
|                 res.status(500).send("there was an error parsing excalidraw to svg"); |                 res.setHeader('Content-Type', 'text/plain') | ||||||
|  |                     .status(500) | ||||||
|  |                     .send("there was an error parsing excalidraw to svg"); | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             // normal image |             // normal image | ||||||
| @@ -159,7 +169,9 @@ function register(router) { | |||||||
|         const note = shaca.getNote(noteId); |         const note = shaca.getNote(noteId); | ||||||
|  |  | ||||||
|         if (!note) { |         if (!note) { | ||||||
|             return res.status(404).send(`Note '${noteId}' not found`); |             return res.setHeader('Content-Type', 'text/plain') | ||||||
|  |                 .status(404) | ||||||
|  |                 .send(`Note '${noteId}' not found`); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         addNoIndexHeader(note, res); |         addNoIndexHeader(note, res); | ||||||
|   | |||||||
| @@ -1,4 +1,7 @@ | |||||||
| #!/bin/sh | #!/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 | chown -R node:node /home/node | ||||||
| su-exec node node ./src/www | su-exec node node ./src/www | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user