mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Support default permissions for object creation via frontend (#4233)
This commit is contained in:
		| @@ -455,7 +455,7 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">192</context> | ||||
|           <context context-type="linenumber">268</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="3797778920049399855" datatype="html"> | ||||
| @@ -519,7 +519,7 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">189</context> | ||||
|           <context context-type="linenumber">265</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6988090220128974198" datatype="html"> | ||||
| @@ -723,7 +723,7 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">641</context> | ||||
|           <context context-type="linenumber">691</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="2526035785704676448" datatype="html"> | ||||
| @@ -906,23 +906,23 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">204</context> | ||||
|           <context context-type="linenumber">280</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">257</context> | ||||
|           <context context-type="linenumber">333</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">294</context> | ||||
|           <context context-type="linenumber">370</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">345</context> | ||||
|           <context context-type="linenumber">421</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">379</context> | ||||
|           <context context-type="linenumber">455</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tasks/tasks.component.html</context> | ||||
| @@ -1081,7 +1081,7 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">415</context> | ||||
|           <context context-type="linenumber">491</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6457471243969293847" datatype="html"> | ||||
| @@ -1116,14 +1116,14 @@ | ||||
|         <source>Create new item</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">88</context> | ||||
|           <context context-type="linenumber">101</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5324147361912094446" datatype="html"> | ||||
|         <source>Edit item</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">92</context> | ||||
|           <context context-type="linenumber">105</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7314814725704332646" datatype="html"> | ||||
| @@ -1168,6 +1168,10 @@ | ||||
|           <context context-type="sourcefile">src/app/components/manage/management-list/management-list.component.html</context> | ||||
|           <context context-type="linenumber">10</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">135</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7878445132438733225" datatype="html"> | ||||
|         <source>Create new user group</source> | ||||
| @@ -1216,7 +1220,7 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">344</context> | ||||
|           <context context-type="linenumber">420</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1431416938026210429" datatype="html"> | ||||
| @@ -1299,15 +1303,15 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">230</context> | ||||
|           <context context-type="linenumber">306</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">320</context> | ||||
|           <context context-type="linenumber">396</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">406</context> | ||||
|           <context context-type="linenumber">482</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tasks/tasks.component.html</context> | ||||
| @@ -1382,7 +1386,7 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">295</context> | ||||
|           <context context-type="linenumber">371</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7046259383943324039" datatype="html"> | ||||
| @@ -1639,23 +1643,23 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">222</context> | ||||
|           <context context-type="linenumber">298</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">270</context> | ||||
|           <context context-type="linenumber">346</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">307</context> | ||||
|           <context context-type="linenumber">383</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">359</context> | ||||
|           <context context-type="linenumber">435</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">394</context> | ||||
|           <context context-type="linenumber">470</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="2784260611081866636" datatype="html"> | ||||
| @@ -1877,11 +1881,11 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">346</context> | ||||
|           <context context-type="linenumber">422</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">367</context> | ||||
|           <context context-type="linenumber">443</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1436831433675346331" datatype="html"> | ||||
| @@ -2017,6 +2021,10 @@ | ||||
|           <context context-type="sourcefile">src/app/components/common/input/permissions/permissions-form/permissions-form.component.html</context> | ||||
|           <context context-type="linenumber">25</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">150</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="2509141182388535183" datatype="html"> | ||||
|         <source>View</source> | ||||
| @@ -2043,6 +2051,14 @@ | ||||
|           <context context-type="sourcefile">src/app/components/common/input/permissions/permissions-form/permissions-form.component.html</context> | ||||
|           <context context-type="linenumber">50</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">160</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">187</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="239911470633002624" datatype="html"> | ||||
|         <source>Groups:</source> | ||||
| @@ -2054,6 +2070,14 @@ | ||||
|           <context context-type="sourcefile">src/app/components/common/input/permissions/permissions-form/permissions-form.component.html</context> | ||||
|           <context context-type="linenumber">58</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">170</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">197</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7585826646011739428" datatype="html"> | ||||
|         <source>Edit</source> | ||||
| @@ -2107,19 +2131,19 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">269</context> | ||||
|           <context context-type="linenumber">345</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">306</context> | ||||
|           <context context-type="linenumber">382</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">358</context> | ||||
|           <context context-type="linenumber">434</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">393</context> | ||||
|           <context context-type="linenumber">469</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="3728984448750213892" datatype="html"> | ||||
| @@ -2128,6 +2152,10 @@ | ||||
|           <context context-type="sourcefile">src/app/components/common/input/permissions/permissions-form/permissions-form.component.html</context> | ||||
|           <context context-type="linenumber">64</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">206</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="2722549756198502062" datatype="html"> | ||||
|         <source>Add item</source> | ||||
| @@ -2213,7 +2241,7 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">332</context> | ||||
|           <context context-type="linenumber">408</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8999708063434507268" datatype="html"> | ||||
| @@ -2742,23 +2770,23 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">221</context> | ||||
|           <context context-type="linenumber">297</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">259</context> | ||||
|           <context context-type="linenumber">335</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">296</context> | ||||
|           <context context-type="linenumber">372</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">347</context> | ||||
|           <context context-type="linenumber">423</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">382</context> | ||||
|           <context context-type="linenumber">458</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tasks/tasks.component.html</context> | ||||
| @@ -3155,19 +3183,19 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">746</context> | ||||
|           <context context-type="linenumber">796</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">798</context> | ||||
|           <context context-type="linenumber">848</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">857</context> | ||||
|           <context context-type="linenumber">907</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">915</context> | ||||
|           <context context-type="linenumber">965</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1181910457994920507" datatype="html"> | ||||
| @@ -3182,19 +3210,19 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">748</context> | ||||
|           <context context-type="linenumber">798</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">800</context> | ||||
|           <context context-type="linenumber">850</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">859</context> | ||||
|           <context context-type="linenumber">909</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">917</context> | ||||
|           <context context-type="linenumber">967</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5729001209753056399" datatype="html"> | ||||
| @@ -3634,7 +3662,7 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">199</context> | ||||
|           <context context-type="linenumber">275</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1233494216161906927" datatype="html"> | ||||
| @@ -3759,7 +3787,7 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">159</context> | ||||
|           <context context-type="linenumber">235</context> | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/rest/document.service.ts</context> | ||||
| @@ -3999,7 +4027,7 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">216</context> | ||||
|           <context context-type="linenumber">292</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="4104807402967139762" datatype="html"> | ||||
| @@ -4010,7 +4038,7 @@ | ||||
|         </context-group> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">212</context> | ||||
|           <context context-type="linenumber">288</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6965614903949668392" datatype="html"> | ||||
| @@ -4479,480 +4507,508 @@ | ||||
|           <context context-type="linenumber">130</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8222269449891326545" datatype="html"> | ||||
|         <source> Settings apply to this user account for objects (Tags, Mail Rules, etc.) created via the web UI </source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">139,141</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="4292903881380648974" datatype="html"> | ||||
|         <source>Default Owner</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">146</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1835394624061684099" datatype="html"> | ||||
|         <source>Default View Permissions</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">155</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="3748107313403519340" datatype="html"> | ||||
|         <source>Default Edit Permissions</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">182</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8901931207592071833" datatype="html"> | ||||
|         <source>Update checking</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">135</context> | ||||
|           <context context-type="linenumber">211</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7141691772243630313" datatype="html"> | ||||
|         <source> Update checking works by pinging the public <x id="START_LINK" ctype="x-a" equiv-text="<a href="https://api.github.com/repos/paperless-ngx/paperless-ngx/releases/latest" target="_blank" rel="noopener noreferrer">"/>GitHub API<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> for the latest release to determine whether a new version is available.<x id="LINE_BREAK" ctype="lb" equiv-text="<br/>"/> Actual updating of the app must still be performed manually. </source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">139,142</context> | ||||
|           <context context-type="linenumber">215,218</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5489945693955857309" datatype="html"> | ||||
|         <source><x id="START_EMPHASISED_TEXT" ctype="x-em" equiv-text=">"/>No tracking data is collected by the app in any way.<x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="</em>"/></source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">144,146</context> | ||||
|           <context context-type="linenumber">220,222</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5070799004079086984" datatype="html"> | ||||
|         <source>Enable update checking</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">146</context> | ||||
|           <context context-type="linenumber">222</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6645943458623480835" datatype="html"> | ||||
|         <source>Note that for users of third-party containers e.g. linuxserver.io this notification may be 'ahead' of the current third-party release.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">146</context> | ||||
|           <context context-type="linenumber">222</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8508424367627989968" datatype="html"> | ||||
|         <source>Bulk editing</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">150</context> | ||||
|           <context context-type="linenumber">226</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8158899674926420054" datatype="html"> | ||||
|         <source>Show confirmation dialogs</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">154</context> | ||||
|           <context context-type="linenumber">230</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6906812245033969309" datatype="html"> | ||||
|         <source>Deleting documents will always ask for confirmation.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">154</context> | ||||
|           <context context-type="linenumber">230</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="290238406234356122" datatype="html"> | ||||
|         <source>Apply on close</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">155</context> | ||||
|           <context context-type="linenumber">231</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="293524471897878391" datatype="html"> | ||||
|         <source>Enable notes</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">163</context> | ||||
|           <context context-type="linenumber">239</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5851560788527570644" datatype="html"> | ||||
|         <source>Notifications</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">171</context> | ||||
|           <context context-type="linenumber">247</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8545554728558600606" datatype="html"> | ||||
|         <source>Document processing</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">174</context> | ||||
|           <context context-type="linenumber">250</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="3656786776644872398" datatype="html"> | ||||
|         <source>Show notifications when new documents are detected</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">178</context> | ||||
|           <context context-type="linenumber">254</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6057053428592387613" datatype="html"> | ||||
|         <source>Show notifications when document processing completes successfully</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">179</context> | ||||
|           <context context-type="linenumber">255</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="370315664367425513" datatype="html"> | ||||
|         <source>Show notifications when document processing fails</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">180</context> | ||||
|           <context context-type="linenumber">256</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6838309441164918531" datatype="html"> | ||||
|         <source>Suppress notifications on dashboard</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">181</context> | ||||
|           <context context-type="linenumber">257</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="2741919327232918179" datatype="html"> | ||||
|         <source>This will suppress all messages about document processing status on the dashboard.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">181</context> | ||||
|           <context context-type="linenumber">257</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1595668988802980095" datatype="html"> | ||||
|         <source>Show warning when closing saved views with unsaved changes</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">195</context> | ||||
|           <context context-type="linenumber">271</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="9187755754633397589" datatype="html"> | ||||
|         <source> <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="visually-hidden">"/>Appears on<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/></source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">209,210</context> | ||||
|           <context context-type="linenumber">285,286</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7877440816920439876" datatype="html"> | ||||
|         <source>No saved views defined.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">226</context> | ||||
|           <context context-type="linenumber">302</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1292737233370901804" datatype="html"> | ||||
|         <source>Mail</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">239</context> | ||||
|           <context context-type="linenumber">315</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8913167930428886792" datatype="html"> | ||||
|         <source>Mail accounts</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">245</context> | ||||
|           <context context-type="linenumber">321</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1259421956660976189" datatype="html"> | ||||
|         <source>Add Account</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">250</context> | ||||
|           <context context-type="linenumber">326</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="2188854519574316630" datatype="html"> | ||||
|         <source>Server</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">258</context> | ||||
|           <context context-type="linenumber">334</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6235247415162820954" datatype="html"> | ||||
|         <source>No mail accounts defined.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">276</context> | ||||
|           <context context-type="linenumber">352</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5364020217520256833" datatype="html"> | ||||
|         <source>Mail rules</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">282</context> | ||||
|           <context context-type="linenumber">358</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1372022816709469401" datatype="html"> | ||||
|         <source>Add Rule</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">287</context> | ||||
|           <context context-type="linenumber">363</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6751234988479444294" datatype="html"> | ||||
|         <source>No mail rules defined.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">313</context> | ||||
|           <context context-type="linenumber">389</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8119815638230251386" datatype="html"> | ||||
|         <source>Users & Groups</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">327</context> | ||||
|           <context context-type="linenumber">403</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="2941198503117307737" datatype="html"> | ||||
|         <source>Add User</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">337</context> | ||||
|           <context context-type="linenumber">413</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="9124347207158517893" datatype="html"> | ||||
|         <source>Add Group</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">372</context> | ||||
|           <context context-type="linenumber">448</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="3066660568529853846" datatype="html"> | ||||
|         <source>Error retrieving groups</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">278</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1235706724900303689" datatype="html"> | ||||
|         <source>Error retrieving users</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">285</context> | ||||
|           <context context-type="linenumber">299</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5241231471117657636" datatype="html"> | ||||
|         <source>Error retrieving mail rules</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">309</context> | ||||
|           <context context-type="linenumber">325</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="3178554336792037159" datatype="html"> | ||||
|         <source>Error retrieving mail accounts</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">317</context> | ||||
|           <context context-type="linenumber">333</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1235706724900303689" datatype="html"> | ||||
|         <source>Error retrieving users</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">350</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5610279464668232148" datatype="html"> | ||||
|         <source>Saved view "<x id="PH" equiv-text="savedView.name"/>" deleted.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">523</context> | ||||
|           <context context-type="linenumber">553</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="3891152409365583719" datatype="html"> | ||||
|         <source>Settings saved</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">625</context> | ||||
|           <context context-type="linenumber">675</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7217000812750597833" datatype="html"> | ||||
|         <source>Settings were saved successfully.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">626</context> | ||||
|           <context context-type="linenumber">676</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="525012668859298131" datatype="html"> | ||||
|         <source>Settings were saved successfully. Reload is required to apply some changes.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">630</context> | ||||
|           <context context-type="linenumber">680</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8491974984518503778" datatype="html"> | ||||
|         <source>Reload now</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">631</context> | ||||
|           <context context-type="linenumber">681</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6839066544204061364" datatype="html"> | ||||
|         <source>Use system language</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">649</context> | ||||
|           <context context-type="linenumber">699</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7729897675462249787" datatype="html"> | ||||
|         <source>Use date format of display language</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">656</context> | ||||
|           <context context-type="linenumber">706</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5260584511980773458" datatype="html"> | ||||
|         <source>Error while storing settings on server.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">676</context> | ||||
|           <context context-type="linenumber">726</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="4510369340305901516" datatype="html"> | ||||
|         <source>Password has been changed, you will be logged out momentarily.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">718</context> | ||||
|           <context context-type="linenumber">768</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="2753185112875184719" datatype="html"> | ||||
|         <source>Saved user "<x id="PH" equiv-text="newUser.username"/>".</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">725</context> | ||||
|           <context context-type="linenumber">775</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="3471101514724661554" datatype="html"> | ||||
|         <source>Error saving user.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">736</context> | ||||
|           <context context-type="linenumber">786</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5565868288871970148" datatype="html"> | ||||
|         <source>Confirm delete user account</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">744</context> | ||||
|           <context context-type="linenumber">794</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8133663925694885325" datatype="html"> | ||||
|         <source>This operation will permanently delete this user account.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">745</context> | ||||
|           <context context-type="linenumber">795</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="857903183180440990" datatype="html"> | ||||
|         <source>Deleted user</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">754</context> | ||||
|           <context context-type="linenumber">804</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1942566571910298572" datatype="html"> | ||||
|         <source>Error deleting user.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">761</context> | ||||
|           <context context-type="linenumber">811</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5766640174051730159" datatype="html"> | ||||
|         <source>Saved group "<x id="PH" equiv-text="newGroup.name"/>".</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">779</context> | ||||
|           <context context-type="linenumber">829</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8382042988405122578" datatype="html"> | ||||
|         <source>Error saving group.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">788</context> | ||||
|           <context context-type="linenumber">838</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6538873300613683004" datatype="html"> | ||||
|         <source>Confirm delete user group</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">796</context> | ||||
|           <context context-type="linenumber">846</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7710984639498518244" datatype="html"> | ||||
|         <source>This operation will permanently delete this user group.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">797</context> | ||||
|           <context context-type="linenumber">847</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6834066329827670963" datatype="html"> | ||||
|         <source>Deleted group</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">806</context> | ||||
|           <context context-type="linenumber">856</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8850738980935204840" datatype="html"> | ||||
|         <source>Error deleting group.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">813</context> | ||||
|           <context context-type="linenumber">863</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6327501535846658797" datatype="html"> | ||||
|         <source>Saved account "<x id="PH" equiv-text="newMailAccount.name"/>".</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">836</context> | ||||
|           <context context-type="linenumber">886</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8067594003836508139" datatype="html"> | ||||
|         <source>Error saving account.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">847</context> | ||||
|           <context context-type="linenumber">897</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5641934153807844674" datatype="html"> | ||||
|         <source>Confirm delete mail account</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">855</context> | ||||
|           <context context-type="linenumber">905</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7176985344323395435" datatype="html"> | ||||
|         <source>This operation will permanently delete this mail account.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">856</context> | ||||
|           <context context-type="linenumber">906</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="4233826387148482123" datatype="html"> | ||||
|         <source>Deleted mail account</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">865</context> | ||||
|           <context context-type="linenumber">915</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6202503362522392111" datatype="html"> | ||||
|         <source>Error deleting mail account.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">874</context> | ||||
|           <context context-type="linenumber">924</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="123368655395433699" datatype="html"> | ||||
|         <source>Saved rule "<x id="PH" equiv-text="newMailRule.name"/>".</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">894</context> | ||||
|           <context context-type="linenumber">944</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8951124554918814321" datatype="html"> | ||||
|         <source>Error saving rule.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">905</context> | ||||
|           <context context-type="linenumber">955</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="3896080636020672118" datatype="html"> | ||||
|         <source>Confirm delete mail rule</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">913</context> | ||||
|           <context context-type="linenumber">963</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="2250372580580310337" datatype="html"> | ||||
|         <source>This operation will permanently delete this mail rule.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">914</context> | ||||
|           <context context-type="linenumber">964</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="9077981247971516916" datatype="html"> | ||||
|         <source>Deleted mail rule</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">923</context> | ||||
|           <context context-type="linenumber">973</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="2033194641751367552" datatype="html"> | ||||
|         <source>Error deleting mail rule.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">931</context> | ||||
|           <context context-type="linenumber">981</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5101757640976222639" datatype="html"> | ||||
| @@ -5702,21 +5758,21 @@ | ||||
|         <source>Successfully completed one-time migratration of settings to the database!</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">446</context> | ||||
|           <context context-type="linenumber">454</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5558341108007064934" datatype="html"> | ||||
|         <source>Unable to migrate settings to the database, please try saving manually.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">447</context> | ||||
|           <context context-type="linenumber">455</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1168781785897678748" datatype="html"> | ||||
|         <source>You can restart the tour from the settings page.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">521</context> | ||||
|           <context context-type="linenumber">529</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5037437391296624618" datatype="html"> | ||||
|   | ||||
| @@ -1,18 +1,20 @@ | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { CorrespondentEditDialogComponent } from './correspondent-edit-dialog.component' | ||||
| import { HttpClientTestingModule } from '@angular/common/http/testing' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { SettingsService } from 'src/app/services/settings.service' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { CorrespondentEditDialogComponent } from './correspondent-edit-dialog.component' | ||||
|  | ||||
| describe('CorrespondentEditDialogComponent', () => { | ||||
|   let component: CorrespondentEditDialogComponent | ||||
|   let settingsService: SettingsService | ||||
|   let fixture: ComponentFixture<CorrespondentEditDialogComponent> | ||||
|  | ||||
|   beforeEach(async () => { | ||||
| @@ -36,6 +38,8 @@ describe('CorrespondentEditDialogComponent', () => { | ||||
|     }).compileComponents() | ||||
|  | ||||
|     fixture = TestBed.createComponent(CorrespondentEditDialogComponent) | ||||
|     settingsService = TestBed.inject(SettingsService) | ||||
|     settingsService.currentUser = { id: 99, username: 'user99' } | ||||
|     component = fixture.componentInstance | ||||
|  | ||||
|     fixture.detectChanges() | ||||
|   | ||||
| @@ -1,18 +1,20 @@ | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { DocumentTypeEditDialogComponent } from './document-type-edit-dialog.component' | ||||
| import { HttpClientTestingModule } from '@angular/common/http/testing' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { SettingsService } from 'src/app/services/settings.service' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { DocumentTypeEditDialogComponent } from './document-type-edit-dialog.component' | ||||
|  | ||||
| describe('DocumentTypeEditDialogComponent', () => { | ||||
|   let component: DocumentTypeEditDialogComponent | ||||
|   let settingsService: SettingsService | ||||
|   let fixture: ComponentFixture<DocumentTypeEditDialogComponent> | ||||
|  | ||||
|   beforeEach(async () => { | ||||
| @@ -36,6 +38,8 @@ describe('DocumentTypeEditDialogComponent', () => { | ||||
|     }).compileComponents() | ||||
|  | ||||
|     fixture = TestBed.createComponent(DocumentTypeEditDialogComponent) | ||||
|     settingsService = TestBed.inject(SettingsService) | ||||
|     settingsService.currentUser = { id: 99, username: 'user99' } | ||||
|     component = fixture.componentInstance | ||||
|  | ||||
|     fixture.detectChanges() | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| import { | ||||
|   HttpClientTestingModule, | ||||
|   HttpTestingController, | ||||
|   HttpClientTestingModule, | ||||
| } from '@angular/common/http/testing' | ||||
| import { Component } from '@angular/core' | ||||
| import { | ||||
| @@ -16,19 +16,20 @@ import { | ||||
|   ReactiveFormsModule, | ||||
| } from '@angular/forms' | ||||
| import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { of } from 'rxjs' | ||||
| import { | ||||
|   DEFAULT_MATCHING_ALGORITHM, | ||||
|   MATCH_AUTO, | ||||
|   MATCH_NONE, | ||||
|   MATCH_ALL, | ||||
| } from 'src/app/data/matching-model' | ||||
| import { PaperlessTag } from 'src/app/data/paperless-tag' | ||||
| import { SETTINGS_KEYS } from 'src/app/data/paperless-uisettings' | ||||
| import { TagService } from 'src/app/services/rest/tag.service' | ||||
| import { UserService } from 'src/app/services/rest/user.service' | ||||
| import { SettingsService } from 'src/app/services/settings.service' | ||||
| import { EditDialogComponent, EditDialogMode } from './edit-dialog.component' | ||||
| import { | ||||
|   DEFAULT_MATCHING_ALGORITHM, | ||||
|   MATCH_ALL, | ||||
|   MATCH_AUTO, | ||||
|   MATCH_NONE, | ||||
| } from 'src/app/data/matching-model' | ||||
| import { of } from 'rxjs' | ||||
| import { environment } from 'src/environments/environment' | ||||
| import { EditDialogComponent, EditDialogMode } from './edit-dialog.component' | ||||
|  | ||||
| @Component({ | ||||
|   template: ` | ||||
| @@ -88,6 +89,7 @@ describe('EditDialogComponent', () => { | ||||
|   let component: TestComponent | ||||
|   let fixture: ComponentFixture<TestComponent> | ||||
|   let tagService: TagService | ||||
|   let settingsService: SettingsService | ||||
|   let activeModal: NgbActiveModal | ||||
|   let httpTestingController: HttpTestingController | ||||
|  | ||||
| @@ -110,18 +112,15 @@ describe('EditDialogComponent', () => { | ||||
|               }), | ||||
|           }, | ||||
|         }, | ||||
|         { | ||||
|           provide: SettingsService, | ||||
|           useValue: { | ||||
|             currentUser, | ||||
|           }, | ||||
|         }, | ||||
|         SettingsService, | ||||
|         TagService, | ||||
|       ], | ||||
|       imports: [HttpClientTestingModule, FormsModule, ReactiveFormsModule], | ||||
|     }).compileComponents() | ||||
|  | ||||
|     tagService = TestBed.inject(TagService) | ||||
|     settingsService = TestBed.inject(SettingsService) | ||||
|     settingsService.currentUser = currentUser | ||||
|     activeModal = TestBed.inject(NgbActiveModal) | ||||
|     httpTestingController = TestBed.inject(HttpTestingController) | ||||
|  | ||||
| @@ -149,7 +148,7 @@ describe('EditDialogComponent', () => { | ||||
|     expect(component.closeEnabled).toBeTruthy() | ||||
|   })) | ||||
|  | ||||
|   it('should set default owner when in create mode', () => { | ||||
|   it('should set default owner when in create mode if unset', () => { | ||||
|     component.dialogMode = EditDialogMode.CREATE | ||||
|     component.ngOnInit() | ||||
|     expect(component.objectForm.get('permissions_form').value.owner).toEqual( | ||||
| @@ -160,6 +159,32 @@ describe('EditDialogComponent', () => { | ||||
|     component.ngOnInit() | ||||
|   }) | ||||
|  | ||||
|   it('should set default perms when in create mode if set', () => { | ||||
|     component.dialogMode = EditDialogMode.CREATE | ||||
|     settingsService.set(SETTINGS_KEYS.DEFAULT_PERMS_OWNER, 11) | ||||
|     settingsService.set(SETTINGS_KEYS.DEFAULT_PERMS_VIEW_USERS, [1, 2]) | ||||
|     settingsService.set(SETTINGS_KEYS.DEFAULT_PERMS_VIEW_GROUPS, [3]) | ||||
|     settingsService.set(SETTINGS_KEYS.DEFAULT_PERMS_EDIT_USERS, [4]) | ||||
|     settingsService.set(SETTINGS_KEYS.DEFAULT_PERMS_EDIT_GROUPS, [5]) | ||||
|     component.ngOnInit() | ||||
|     expect(component.objectForm.get('permissions_form').value.owner).toEqual(11) | ||||
|     expect( | ||||
|       component.objectForm.get('permissions_form').value.set_permissions | ||||
|     ).toEqual({ | ||||
|       view: { | ||||
|         users: [1, 2], | ||||
|         groups: [3], | ||||
|       }, | ||||
|       change: { | ||||
|         users: [4], | ||||
|         groups: [5], | ||||
|       }, | ||||
|     }) | ||||
|     // cover optional chaining | ||||
|     component.objectForm.removeControl('permissions_form') | ||||
|     component.ngOnInit() | ||||
|   }) | ||||
|  | ||||
|   it('should detect if pattern required', () => { | ||||
|     expect(component.patternRequired).toBeFalsy() | ||||
|     component.objectForm.get('matching_algorithm').setValue(MATCH_AUTO) | ||||
|   | ||||
| @@ -14,6 +14,7 @@ import { AbstractPaperlessService } from 'src/app/services/rest/abstract-paperle | ||||
| import { UserService } from 'src/app/services/rest/user.service' | ||||
| import { PermissionsFormObject } from '../input/permissions/permissions-form/permissions-form.component' | ||||
| import { SettingsService } from 'src/app/services/settings.service' | ||||
| import { SETTINGS_KEYS } from 'src/app/data/paperless-uisettings' | ||||
|  | ||||
| export enum EditDialogMode { | ||||
|   CREATE = 0, | ||||
| @@ -67,6 +68,31 @@ export abstract class EditDialogComponent< | ||||
|         set_permissions: (this.object as ObjectWithPermissions).permissions, | ||||
|       } | ||||
|       this.objectForm.patchValue(this.object) | ||||
|     } else { | ||||
|       // defaults from settings | ||||
|       this.objectForm.patchValue({ | ||||
|         permissions_form: { | ||||
|           owner: this.settingsService.get(SETTINGS_KEYS.DEFAULT_PERMS_OWNER), | ||||
|           set_permissions: { | ||||
|             view: { | ||||
|               users: this.settingsService.get( | ||||
|                 SETTINGS_KEYS.DEFAULT_PERMS_VIEW_USERS | ||||
|               ), | ||||
|               groups: this.settingsService.get( | ||||
|                 SETTINGS_KEYS.DEFAULT_PERMS_VIEW_GROUPS | ||||
|               ), | ||||
|             }, | ||||
|             change: { | ||||
|               users: this.settingsService.get( | ||||
|                 SETTINGS_KEYS.DEFAULT_PERMS_EDIT_USERS | ||||
|               ), | ||||
|               groups: this.settingsService.get( | ||||
|                 SETTINGS_KEYS.DEFAULT_PERMS_EDIT_GROUPS | ||||
|               ), | ||||
|             }, | ||||
|           }, | ||||
|         }, | ||||
|       }) | ||||
|     } | ||||
|  | ||||
|     // wait to enable close button so it doesnt steal focus from input since its the first clickable element in the DOM | ||||
| @@ -76,11 +102,6 @@ export abstract class EditDialogComponent< | ||||
|  | ||||
|     this.userService.listAll().subscribe((r) => { | ||||
|       this.users = r.results | ||||
|       if (this.dialogMode === EditDialogMode.CREATE) { | ||||
|         this.objectForm.get('permissions_form')?.setValue({ | ||||
|           owner: this.settingsService.currentUser.id, | ||||
|         }) | ||||
|       } | ||||
|     }) | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,21 @@ | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { HttpClientTestingModule } from '@angular/common/http/testing' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { SettingsService } from 'src/app/services/settings.service' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { GroupEditDialogComponent } from './group-edit-dialog.component' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { PermissionsSelectComponent } from '../../permissions-select/permissions-select.component' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { GroupEditDialogComponent } from './group-edit-dialog.component' | ||||
|  | ||||
| describe('GroupEditDialogComponent', () => { | ||||
|   let component: GroupEditDialogComponent | ||||
|   let settingsService: SettingsService | ||||
|   let fixture: ComponentFixture<GroupEditDialogComponent> | ||||
|  | ||||
|   beforeEach(async () => { | ||||
| @@ -38,6 +40,8 @@ describe('GroupEditDialogComponent', () => { | ||||
|     }).compileComponents() | ||||
|  | ||||
|     fixture = TestBed.createComponent(GroupEditDialogComponent) | ||||
|     settingsService = TestBed.inject(SettingsService) | ||||
|     settingsService.currentUser = { id: 99, username: 'user99' } | ||||
|     component = fixture.componentInstance | ||||
|  | ||||
|     fixture.detectChanges() | ||||
|   | ||||
| @@ -1,30 +1,32 @@ | ||||
| import { | ||||
|   HttpTestingController, | ||||
|   HttpClientTestingModule, | ||||
| } from '@angular/common/http/testing' | ||||
| import { | ||||
|   ComponentFixture, | ||||
|   TestBed, | ||||
|   fakeAsync, | ||||
|   tick, | ||||
| } from '@angular/core/testing' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { | ||||
|   HttpClientTestingModule, | ||||
|   HttpTestingController, | ||||
| } from '@angular/common/http/testing' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { IMAPSecurity } from 'src/app/data/paperless-mail-account' | ||||
| import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { MailAccountEditDialogComponent } from './mail-account-edit-dialog.component' | ||||
| import { PasswordComponent } from '../../input/password/password.component' | ||||
| import { CheckComponent } from '../../input/check/check.component' | ||||
| import { IMAPSecurity } from 'src/app/data/paperless-mail-account' | ||||
| import { SettingsService } from 'src/app/services/settings.service' | ||||
| import { environment } from 'src/environments/environment' | ||||
| import { CheckComponent } from '../../input/check/check.component' | ||||
| import { PasswordComponent } from '../../input/password/password.component' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { MailAccountEditDialogComponent } from './mail-account-edit-dialog.component' | ||||
|  | ||||
| describe('MailAccountEditDialogComponent', () => { | ||||
|   let component: MailAccountEditDialogComponent | ||||
|   let settingsService: SettingsService | ||||
|   let fixture: ComponentFixture<MailAccountEditDialogComponent> | ||||
|   let httpController: HttpTestingController | ||||
|  | ||||
| @@ -53,6 +55,8 @@ describe('MailAccountEditDialogComponent', () => { | ||||
|     httpController = TestBed.inject(HttpTestingController) | ||||
|  | ||||
|     fixture = TestBed.createComponent(MailAccountEditDialogComponent) | ||||
|     settingsService = TestBed.inject(SettingsService) | ||||
|     settingsService.currentUser = { id: 99, username: 'user99' } | ||||
|     component = fixture.componentInstance | ||||
|  | ||||
|     fixture.detectChanges() | ||||
|   | ||||
| @@ -1,29 +1,31 @@ | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { HttpClientTestingModule } from '@angular/common/http/testing' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { MailRuleEditDialogComponent } from './mail-rule-edit-dialog.component' | ||||
| import { NumberComponent } from '../../input/number/number.component' | ||||
| import { TagsComponent } from '../../input/tags/tags.component' | ||||
| import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' | ||||
| import { MailAccountService } from 'src/app/services/rest/mail-account.service' | ||||
| import { CorrespondentService } from 'src/app/services/rest/correspondent.service' | ||||
| import { DocumentTypeService } from 'src/app/services/rest/document-type.service' | ||||
| import { of } from 'rxjs' | ||||
| import { | ||||
|   MailAction, | ||||
|   MailMetadataCorrespondentOption, | ||||
|   MailAction, | ||||
| } from 'src/app/data/paperless-mail-rule' | ||||
| import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||
| import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' | ||||
| import { CorrespondentService } from 'src/app/services/rest/correspondent.service' | ||||
| import { DocumentTypeService } from 'src/app/services/rest/document-type.service' | ||||
| import { MailAccountService } from 'src/app/services/rest/mail-account.service' | ||||
| import { SettingsService } from 'src/app/services/settings.service' | ||||
| import { NumberComponent } from '../../input/number/number.component' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { TagsComponent } from '../../input/tags/tags.component' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { MailRuleEditDialogComponent } from './mail-rule-edit-dialog.component' | ||||
|  | ||||
| describe('MailRuleEditDialogComponent', () => { | ||||
|   let component: MailRuleEditDialogComponent | ||||
|   let settingsService: SettingsService | ||||
|   let fixture: ComponentFixture<MailRuleEditDialogComponent> | ||||
|   let accountService: MailAccountService | ||||
|   let correspondentService: CorrespondentService | ||||
| @@ -73,6 +75,8 @@ describe('MailRuleEditDialogComponent', () => { | ||||
|     }).compileComponents() | ||||
|  | ||||
|     fixture = TestBed.createComponent(MailRuleEditDialogComponent) | ||||
|     settingsService = TestBed.inject(SettingsService) | ||||
|     settingsService.currentUser = { id: 99, username: 'user99' } | ||||
|     component = fixture.componentInstance | ||||
|  | ||||
|     fixture.detectChanges() | ||||
|   | ||||
| @@ -1,19 +1,21 @@ | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { HttpClientTestingModule } from '@angular/common/http/testing' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { StoragePathEditDialogComponent } from './storage-path-edit-dialog.component' | ||||
| import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' | ||||
| import { SettingsService } from 'src/app/services/settings.service' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { StoragePathEditDialogComponent } from './storage-path-edit-dialog.component' | ||||
|  | ||||
| describe('StoragePathEditDialogComponent', () => { | ||||
|   let component: StoragePathEditDialogComponent | ||||
|   let settingsService: SettingsService | ||||
|   let fixture: ComponentFixture<StoragePathEditDialogComponent> | ||||
|  | ||||
|   beforeEach(async () => { | ||||
| @@ -38,6 +40,8 @@ describe('StoragePathEditDialogComponent', () => { | ||||
|     }).compileComponents() | ||||
|  | ||||
|     fixture = TestBed.createComponent(StoragePathEditDialogComponent) | ||||
|     settingsService = TestBed.inject(SettingsService) | ||||
|     settingsService.currentUser = { id: 99, username: 'user99' } | ||||
|     component = fixture.componentInstance | ||||
|  | ||||
|     fixture.detectChanges() | ||||
|   | ||||
| @@ -1,20 +1,22 @@ | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { HttpClientTestingModule } from '@angular/common/http/testing' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { TagEditDialogComponent } from './tag-edit-dialog.component' | ||||
| import { ColorComponent } from '../../input/color/color.component' | ||||
| import { SettingsService } from 'src/app/services/settings.service' | ||||
| import { CheckComponent } from '../../input/check/check.component' | ||||
| import { ColorComponent } from '../../input/color/color.component' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { TagEditDialogComponent } from './tag-edit-dialog.component' | ||||
|  | ||||
| describe('TagEditDialogComponent', () => { | ||||
|   let component: TagEditDialogComponent | ||||
|   let settingsService: SettingsService | ||||
|   let fixture: ComponentFixture<TagEditDialogComponent> | ||||
|  | ||||
|   beforeEach(async () => { | ||||
| @@ -29,7 +31,7 @@ describe('TagEditDialogComponent', () => { | ||||
|         ColorComponent, | ||||
|         CheckComponent, | ||||
|       ], | ||||
|       providers: [NgbActiveModal], | ||||
|       providers: [NgbActiveModal, SettingsService], | ||||
|       imports: [ | ||||
|         HttpClientTestingModule, | ||||
|         FormsModule, | ||||
| @@ -40,6 +42,8 @@ describe('TagEditDialogComponent', () => { | ||||
|     }).compileComponents() | ||||
|  | ||||
|     fixture = TestBed.createComponent(TagEditDialogComponent) | ||||
|     settingsService = TestBed.inject(SettingsService) | ||||
|     settingsService.currentUser = { id: 99, username: 'user99' } | ||||
|     component = fixture.componentInstance | ||||
|  | ||||
|     fixture.detectChanges() | ||||
|   | ||||
| @@ -1,26 +1,28 @@ | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { HttpClientTestingModule } from '@angular/common/http/testing' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||
| import { | ||||
|   AbstractControl, | ||||
|   FormsModule, | ||||
|   ReactiveFormsModule, | ||||
|   AbstractControl, | ||||
| } from '@angular/forms' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { UserEditDialogComponent } from './user-edit-dialog.component' | ||||
| import { PasswordComponent } from '../../input/password/password.component' | ||||
| import { PermissionsSelectComponent } from '../../permissions-select/permissions-select.component' | ||||
| import { GroupService } from 'src/app/services/rest/group.service' | ||||
| import { of } from 'rxjs' | ||||
| import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||
| import { GroupService } from 'src/app/services/rest/group.service' | ||||
| import { SettingsService } from 'src/app/services/settings.service' | ||||
| import { PasswordComponent } from '../../input/password/password.component' | ||||
| import { PermissionsFormComponent } from '../../input/permissions/permissions-form/permissions-form.component' | ||||
| import { SelectComponent } from '../../input/select/select.component' | ||||
| import { TextComponent } from '../../input/text/text.component' | ||||
| import { PermissionsSelectComponent } from '../../permissions-select/permissions-select.component' | ||||
| import { EditDialogMode } from '../edit-dialog.component' | ||||
| import { UserEditDialogComponent } from './user-edit-dialog.component' | ||||
|  | ||||
| describe('UserEditDialogComponent', () => { | ||||
|   let component: UserEditDialogComponent | ||||
|   let settingsService: SettingsService | ||||
|   let fixture: ComponentFixture<UserEditDialogComponent> | ||||
|  | ||||
|   beforeEach(async () => { | ||||
| @@ -51,6 +53,7 @@ describe('UserEditDialogComponent', () => { | ||||
|               }), | ||||
|           }, | ||||
|         }, | ||||
|         SettingsService, | ||||
|       ], | ||||
|       imports: [ | ||||
|         HttpClientTestingModule, | ||||
| @@ -62,6 +65,8 @@ describe('UserEditDialogComponent', () => { | ||||
|     }).compileComponents() | ||||
|  | ||||
|     fixture = TestBed.createComponent(UserEditDialogComponent) | ||||
|     settingsService = TestBed.inject(SettingsService) | ||||
|     settingsService.currentUser = { id: 99, username: 'user99' } | ||||
|     component = fixture.componentInstance | ||||
|  | ||||
|     fixture.detectChanges() | ||||
|   | ||||
| @@ -11,14 +11,14 @@ | ||||
| <form [formGroup]="settingsForm" (ngSubmit)="saveSettings()"> | ||||
|  | ||||
|   <ul ngbNav #nav="ngbNav" (navChange)="onNavChange($event)" [(activeId)]="activeNavID" class="nav-tabs"> | ||||
|     <li [ngbNavItem]="SettingsNavIDs.General"> | ||||
|     <li [ngbNavItem]="SettingsNavIDs.General" (mouseover)="maybeInitializeTab(SettingsNavIDs.General)"> | ||||
|       <a ngbNavLink i18n>General</a> | ||||
|       <ng-template ngbNavContent> | ||||
|  | ||||
|         <h4 i18n>Appearance</h4> | ||||
|  | ||||
|         <div class="row mb-3"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|           <div class="col-md-3 col-form-label pt-0"> | ||||
|             <span i18n>Display language</span> | ||||
|           </div> | ||||
|           <div class="col"> | ||||
| @@ -33,7 +33,7 @@ | ||||
|         </div> | ||||
|  | ||||
|         <div class="row mb-3"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|           <div class="col-md-3 col-form-label pt-0"> | ||||
|             <span i18n>Date display</span> | ||||
|           </div> | ||||
|           <div class="col"> | ||||
| @@ -46,7 +46,7 @@ | ||||
|         </div> | ||||
|  | ||||
|         <div class="row mb-3"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|           <div class="col-md-3 col-form-label pt-0"> | ||||
|             <span i18n>Date format</span> | ||||
|           </div> | ||||
|           <div class="col"> | ||||
| @@ -68,7 +68,7 @@ | ||||
|         </div> | ||||
|  | ||||
|         <div class="row mb-3"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|           <div class="col-md-3 col-form-label pt-0"> | ||||
|             <span i18n>Items per page</span> | ||||
|           </div> | ||||
|           <div class="col"> | ||||
| @@ -84,7 +84,7 @@ | ||||
|         </div> | ||||
|  | ||||
|         <div class="row mb-3"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|           <div class="col-md-3 col-form-label pt-0"> | ||||
|             <span i18n>Document editor</span> | ||||
|           </div> | ||||
|           <div class="col"> | ||||
| @@ -95,7 +95,7 @@ | ||||
|         </div> | ||||
|  | ||||
|         <div class="row mb-3"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|           <div class="col-md-3 col-form-label pt-0"> | ||||
|             <span i18n>Sidebar</span> | ||||
|           </div> | ||||
|           <div class="col"> | ||||
| @@ -106,7 +106,7 @@ | ||||
|         </div> | ||||
|  | ||||
|         <div class="row mb-3"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|           <div class="col-md-3 col-form-label pt-0"> | ||||
|             <span i18n>Dark mode</span> | ||||
|           </div> | ||||
|           <div class="col"> | ||||
| @@ -117,7 +117,7 @@ | ||||
|         </div> | ||||
|  | ||||
|         <div class="row mb-3"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|           <div class="col-md-3 col-form-label pt-0"> | ||||
|             <span i18n>Theme Color</span> | ||||
|           </div> | ||||
|           <div class="col col-md-3"> | ||||
| @@ -132,6 +132,82 @@ | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <h4 i18n>Permissions</h4> | ||||
|  | ||||
|         <div class="row mb-3"> | ||||
|           <div class="offset-md-3 col"> | ||||
|             <p i18n> | ||||
|               Settings apply to this user account for objects (Tags, Mail Rules, etc.) created via the web UI | ||||
|             </p> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="row mb-3"> | ||||
|           <div class="col-md-3 col-form-label pt-0"> | ||||
|             <span i18n>Default Owner</span> | ||||
|           </div> | ||||
|           <div class="col-md-4"> | ||||
|             <pngx-input-select [items]="users" bindLabel="username" formControlName="defaultPermsOwner" [allowNull]="true"></pngx-input-select> | ||||
|             <small class="form-text text-muted text-end d-block mt-n2" i18n>Objects without an owner can be viewed and edited by all users</small> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="row mb-3"> | ||||
|           <div class="col-md-3 col-form-label pt-0"> | ||||
|             <span i18n>Default View Permissions</span> | ||||
|           </div> | ||||
|           <div class="col-md-4"> | ||||
|             <div class="row"> | ||||
|               <div class="col-2"> | ||||
|                 <span class="d-block pt-1" i18n>Users:</span> | ||||
|               </div> | ||||
|               <div class="col"> | ||||
|                 <ng-container *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.User }"> | ||||
|                   <pngx-permissions-user type="view" formControlName="defaultPermsViewUsers"></pngx-permissions-user> | ||||
|                 </ng-container> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="row"> | ||||
|               <div class="col-2"> | ||||
|                 <span class="d-block pt-1" i18n>Groups:</span> | ||||
|               </div> | ||||
|               <div class="col"> | ||||
|                 <ng-container *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Group }"> | ||||
|                   <pngx-permissions-group type="view" formControlName="defaultPermsViewGroups"></pngx-permissions-group> | ||||
|                 </ng-container> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="row mb-3"> | ||||
|           <div class="col-md-3 col-form-label pt-0"> | ||||
|             <span i18n>Default Edit Permissions</span> | ||||
|           </div> | ||||
|           <div class="col-md-4"> | ||||
|             <div class="row"> | ||||
|               <div class="col-2"> | ||||
|                 <span class="d-block pt-1" i18n>Users:</span> | ||||
|               </div> | ||||
|               <div class="col"> | ||||
|                 <ng-container *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.User }"> | ||||
|                   <pngx-permissions-user type="view" formControlName="defaultPermsEditUsers"></pngx-permissions-user> | ||||
|                 </ng-container> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="row"> | ||||
|               <div class="col-2"> | ||||
|                 <span class="d-block pt-1" i18n>Groups:</span> | ||||
|               </div> | ||||
|               <div class="col"> | ||||
|                 <ng-container *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Group }"> | ||||
|                   <pngx-permissions-group type="view" formControlName="defaultPermsEditGroups"></pngx-permissions-group> | ||||
|                 </ng-container> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="row"> | ||||
|               <small class="form-text text-muted text-end d-block" i18n>Edit permissions also grant viewing permissions</small> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <h4 class="mt-4" id="update-checking" i18n>Update checking</h4> | ||||
|  | ||||
|         <div class="row mb-3"> | ||||
|   | ||||
| @@ -13,10 +13,11 @@ import { RouterTestingModule } from '@angular/router/testing' | ||||
| import { | ||||
|   NgbModal, | ||||
|   NgbModule, | ||||
|   NgbAlertModule, | ||||
|   NgbNavLink, | ||||
|   NgbModalRef, | ||||
|   NgbAlertModule, | ||||
| } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
| import { of, throwError } from 'rxjs' | ||||
| import { routes } from 'src/app/app-routing.module' | ||||
| import { PaperlessMailAccount } from 'src/app/data/paperless-mail-account' | ||||
| @@ -26,6 +27,7 @@ import { SETTINGS_KEYS } from 'src/app/data/paperless-uisettings' | ||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||
| import { PermissionsGuard } from 'src/app/guards/permissions.guard' | ||||
| import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' | ||||
| import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' | ||||
| import { PermissionsService } from 'src/app/services/permissions.service' | ||||
| import { GroupService } from 'src/app/services/rest/group.service' | ||||
| import { MailAccountService } from 'src/app/services/rest/mail-account.service' | ||||
| @@ -41,15 +43,15 @@ import { MailRuleEditDialogComponent } from '../../common/edit-dialog/mail-rule- | ||||
| import { UserEditDialogComponent } from '../../common/edit-dialog/user-edit-dialog/user-edit-dialog.component' | ||||
| import { CheckComponent } from '../../common/input/check/check.component' | ||||
| import { ColorComponent } from '../../common/input/color/color.component' | ||||
| import { NumberComponent } from '../../common/input/number/number.component' | ||||
| import { PasswordComponent } from '../../common/input/password/password.component' | ||||
| import { PermissionsGroupComponent } from '../../common/input/permissions/permissions-group/permissions-group.component' | ||||
| import { PermissionsUserComponent } from '../../common/input/permissions/permissions-user/permissions-user.component' | ||||
| import { SelectComponent } from '../../common/input/select/select.component' | ||||
| import { TagsComponent } from '../../common/input/tags/tags.component' | ||||
| import { TextComponent } from '../../common/input/text/text.component' | ||||
| import { PageHeaderComponent } from '../../common/page-header/page-header.component' | ||||
| import { SettingsComponent } from './settings.component' | ||||
| import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' | ||||
| import { SelectComponent } from '../../common/input/select/select.component' | ||||
| import { TextComponent } from '../../common/input/text/text.component' | ||||
| import { PasswordComponent } from '../../common/input/password/password.component' | ||||
| import { NumberComponent } from '../../common/input/number/number.component' | ||||
| import { TagsComponent } from '../../common/input/tags/tags.component' | ||||
| import { NgSelectModule } from '@ng-select/ng-select' | ||||
|  | ||||
| const savedViews = [ | ||||
|   { id: 1, name: 'view1' }, | ||||
| @@ -106,6 +108,8 @@ describe('SettingsComponent', () => { | ||||
|         TagsComponent, | ||||
|         MailAccountEditDialogComponent, | ||||
|         MailRuleEditDialogComponent, | ||||
|         PermissionsUserComponent, | ||||
|         PermissionsGroupComponent, | ||||
|       ], | ||||
|       providers: [CustomDatePipe, DatePipe, PermissionsGuard], | ||||
|       imports: [ | ||||
| @@ -125,6 +129,7 @@ describe('SettingsComponent', () => { | ||||
|     viewportScroller = TestBed.inject(ViewportScroller) | ||||
|     toastService = TestBed.inject(ToastService) | ||||
|     settingsService = TestBed.inject(SettingsService) | ||||
|     settingsService.currentUser = { id: 99, username: 'user99' } | ||||
|     userService = TestBed.inject(UserService) | ||||
|     permissionsService = TestBed.inject(PermissionsService) | ||||
|     jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) | ||||
| @@ -247,11 +252,11 @@ describe('SettingsComponent', () => { | ||||
|     ) | ||||
|     expect(component.mailAccounts).not.toBeUndefined() | ||||
|  | ||||
|     expect(component.users).toBeUndefined() | ||||
|     expect(component.groups).toBeUndefined() | ||||
|     tabButtons[4].nativeElement.dispatchEvent( | ||||
|       new MouseEvent('mouseover', { bubbles: true }) | ||||
|     ) | ||||
|     expect(component.users).not.toBeUndefined() | ||||
|     expect(component.groups).not.toBeUndefined() | ||||
|   }) | ||||
|  | ||||
|   it('should support save saved views, show error', () => { | ||||
| @@ -301,7 +306,7 @@ describe('SettingsComponent', () => { | ||||
|     expect(toastErrorSpy).toHaveBeenCalled() | ||||
|     expect(storeSpy).toHaveBeenCalled() | ||||
|     expect(appearanceSettingsSpy).not.toHaveBeenCalled() | ||||
|     expect(setSpy).toHaveBeenCalledTimes(19) | ||||
|     expect(setSpy).toHaveBeenCalledTimes(24) | ||||
|  | ||||
|     // succeed | ||||
|     storeSpy.mockReturnValueOnce(of(true)) | ||||
|   | ||||
| @@ -48,6 +48,7 @@ import { EditDialogMode } from '../../common/edit-dialog/edit-dialog.component' | ||||
| import { ObjectWithPermissions } from 'src/app/data/object-with-permissions' | ||||
| import { | ||||
|   PermissionAction, | ||||
|   PermissionType, | ||||
|   PermissionsService, | ||||
| } from 'src/app/services/permissions.service' | ||||
|  | ||||
| @@ -93,6 +94,11 @@ export class SettingsComponent | ||||
|     dateFormat: new FormControl(null), | ||||
|     notesEnabled: new FormControl(null), | ||||
|     updateCheckingEnabled: new FormControl(null), | ||||
|     defaultPermsOwner: new FormControl(null), | ||||
|     defaultPermsViewUsers: new FormControl(null), | ||||
|     defaultPermsViewGroups: new FormControl(null), | ||||
|     defaultPermsEditUsers: new FormControl(null), | ||||
|     defaultPermsEditGroups: new FormControl(null), | ||||
|  | ||||
|     notificationsConsumerNewDocument: new FormControl(null), | ||||
|     notificationsConsumerSuccess: new FormControl(null), | ||||
| @@ -159,6 +165,16 @@ export class SettingsComponent | ||||
|  | ||||
|     this.activatedRoute.paramMap.subscribe((paramMap) => { | ||||
|       const section = paramMap.get('section') | ||||
|       if (section === null) { | ||||
|         if ( | ||||
|           this.permissionsService.currentUserCan( | ||||
|             PermissionAction.View, | ||||
|             PermissionType.User | ||||
|           ) | ||||
|         ) { | ||||
|           this.getUsers() | ||||
|         } | ||||
|       } | ||||
|       if (section) { | ||||
|         const navIDKey: string = Object.keys(SettingsNavIDs).find( | ||||
|           (navID) => navID.toLowerCase() == section | ||||
| @@ -222,6 +238,19 @@ export class SettingsComponent | ||||
|       savedViewsWarnOnUnsavedChange: this.settings.get( | ||||
|         SETTINGS_KEYS.SAVED_VIEWS_WARN_ON_UNSAVED_CHANGE | ||||
|       ), | ||||
|       defaultPermsOwner: this.settings.get(SETTINGS_KEYS.DEFAULT_PERMS_OWNER), | ||||
|       defaultPermsViewUsers: this.settings.get( | ||||
|         SETTINGS_KEYS.DEFAULT_PERMS_VIEW_USERS | ||||
|       ), | ||||
|       defaultPermsViewGroups: this.settings.get( | ||||
|         SETTINGS_KEYS.DEFAULT_PERMS_VIEW_GROUPS | ||||
|       ), | ||||
|       defaultPermsEditUsers: this.settings.get( | ||||
|         SETTINGS_KEYS.DEFAULT_PERMS_EDIT_USERS | ||||
|       ), | ||||
|       defaultPermsEditGroups: this.settings.get( | ||||
|         SETTINGS_KEYS.DEFAULT_PERMS_EDIT_GROUPS | ||||
|       ), | ||||
|       usersGroup: {}, | ||||
|       groupsGroup: {}, | ||||
|       savedViews: {}, | ||||
| @@ -256,33 +285,21 @@ export class SettingsComponent | ||||
|         this.initialize(false) | ||||
|       }) | ||||
|     } else if ( | ||||
|       navID == SettingsNavIDs.UsersGroups && | ||||
|       (navID == SettingsNavIDs.UsersGroups || | ||||
|         navID == SettingsNavIDs.General) && | ||||
|       (!this.users || !this.groups) | ||||
|     ) { | ||||
|       this.usersService | ||||
|       if (!this.users) this.getUsers() | ||||
|       this.groupsService | ||||
|         .listAll() | ||||
|         .pipe(first()) | ||||
|         .subscribe({ | ||||
|           next: (r) => { | ||||
|             this.users = r.results | ||||
|             this.groupsService | ||||
|               .listAll() | ||||
|               .pipe(first()) | ||||
|               .subscribe({ | ||||
|                 next: (r) => { | ||||
|                   this.groups = r.results | ||||
|                   this.initialize(false) | ||||
|                 }, | ||||
|                 error: (e) => { | ||||
|                   this.toastService.showError( | ||||
|                     $localize`Error retrieving groups`, | ||||
|                     e | ||||
|                   ) | ||||
|                 }, | ||||
|               }) | ||||
|             this.groups = r.results | ||||
|             this.initialize(false) | ||||
|           }, | ||||
|           error: (e) => { | ||||
|             this.toastService.showError($localize`Error retrieving users`, e) | ||||
|             this.toastService.showError($localize`Error retrieving groups`, e) | ||||
|           }, | ||||
|         }) | ||||
|     } else if ( | ||||
| @@ -322,6 +339,20 @@ export class SettingsComponent | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private getUsers() { | ||||
|     this.usersService | ||||
|       .listAll() | ||||
|       .pipe(first()) | ||||
|       .subscribe({ | ||||
|         next: (r) => { | ||||
|           this.users = r.results | ||||
|         }, | ||||
|         error: (e) => { | ||||
|           this.toastService.showError($localize`Error retrieving users`, e) | ||||
|         }, | ||||
|       }) | ||||
|   } | ||||
|  | ||||
|   initialize(resetSettings: boolean = true) { | ||||
|     this.unsubscribeNotifier.next(true) | ||||
|  | ||||
| @@ -611,6 +642,26 @@ export class SettingsComponent | ||||
|       SETTINGS_KEYS.SAVED_VIEWS_WARN_ON_UNSAVED_CHANGE, | ||||
|       this.settingsForm.value.savedViewsWarnOnUnsavedChange | ||||
|     ) | ||||
|     this.settings.set( | ||||
|       SETTINGS_KEYS.DEFAULT_PERMS_OWNER, | ||||
|       this.settingsForm.value.defaultPermsOwner | ||||
|     ) | ||||
|     this.settings.set( | ||||
|       SETTINGS_KEYS.DEFAULT_PERMS_VIEW_USERS, | ||||
|       this.settingsForm.value.defaultPermsViewUsers | ||||
|     ) | ||||
|     this.settings.set( | ||||
|       SETTINGS_KEYS.DEFAULT_PERMS_VIEW_GROUPS, | ||||
|       this.settingsForm.value.defaultPermsViewGroups | ||||
|     ) | ||||
|     this.settings.set( | ||||
|       SETTINGS_KEYS.DEFAULT_PERMS_EDIT_USERS, | ||||
|       this.settingsForm.value.defaultPermsEditUsers | ||||
|     ) | ||||
|     this.settings.set( | ||||
|       SETTINGS_KEYS.DEFAULT_PERMS_EDIT_GROUPS, | ||||
|       this.settingsForm.value.defaultPermsEditGroups | ||||
|     ) | ||||
|     this.settings.setLanguage(this.settingsForm.value.displayLanguage) | ||||
|     this.settings | ||||
|       .storeSettings() | ||||
|   | ||||
| @@ -42,6 +42,11 @@ export const SETTINGS_KEYS = { | ||||
|   SAVED_VIEWS_WARN_ON_UNSAVED_CHANGE: | ||||
|     'general-settings:saved-views:warn-on-unsaved-change', | ||||
|   TOUR_COMPLETE: 'general-settings:tour-complete', | ||||
|   DEFAULT_PERMS_OWNER: 'general-settings:permissions:default-owner', | ||||
|   DEFAULT_PERMS_VIEW_USERS: 'general-settings:permissions:default-view-users', | ||||
|   DEFAULT_PERMS_VIEW_GROUPS: 'general-settings:permissions:default-view-groups', | ||||
|   DEFAULT_PERMS_EDIT_USERS: 'general-settings:permissions:default-edit-users', | ||||
|   DEFAULT_PERMS_EDIT_GROUPS: 'general-settings:permissions:default-edit-groups', | ||||
| } | ||||
|  | ||||
| export const SETTINGS: PaperlessUiSetting[] = [ | ||||
| @@ -150,4 +155,29 @@ export const SETTINGS: PaperlessUiSetting[] = [ | ||||
|     type: 'boolean', | ||||
|     default: false, | ||||
|   }, | ||||
|   { | ||||
|     key: SETTINGS_KEYS.DEFAULT_PERMS_OWNER, | ||||
|     type: 'number', | ||||
|     default: undefined, | ||||
|   }, | ||||
|   { | ||||
|     key: SETTINGS_KEYS.DEFAULT_PERMS_VIEW_USERS, | ||||
|     type: 'array', | ||||
|     default: [], | ||||
|   }, | ||||
|   { | ||||
|     key: SETTINGS_KEYS.DEFAULT_PERMS_VIEW_GROUPS, | ||||
|     type: 'array', | ||||
|     default: [], | ||||
|   }, | ||||
|   { | ||||
|     key: SETTINGS_KEYS.DEFAULT_PERMS_EDIT_USERS, | ||||
|     type: 'array', | ||||
|     default: [], | ||||
|   }, | ||||
|   { | ||||
|     key: SETTINGS_KEYS.DEFAULT_PERMS_EDIT_GROUPS, | ||||
|     type: 'array', | ||||
|     default: [], | ||||
|   }, | ||||
| ] | ||||
|   | ||||
| @@ -1,21 +1,25 @@ | ||||
| import { TestBed } from '@angular/core/testing' | ||||
| import { SettingsService } from './settings.service' | ||||
| import { | ||||
|   HttpClientTestingModule, | ||||
|   HttpTestingController, | ||||
|   HttpClientTestingModule, | ||||
| } from '@angular/common/http/testing' | ||||
| import { RouterTestingModule } from '@angular/router/testing' | ||||
| import { environment } from 'src/environments/environment' | ||||
| import { Subscription } from 'rxjs' | ||||
| import { PaperlessUiSettings } from '../data/paperless-uisettings' | ||||
| import { SETTINGS_KEYS } from '../data/paperless-uisettings' | ||||
| import { NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { TestBed } from '@angular/core/testing' | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||
| import { RouterTestingModule } from '@angular/router/testing' | ||||
| import { NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||
| import { CookieService } from 'ngx-cookie-service' | ||||
| import { Subscription } from 'rxjs' | ||||
| import { environment } from 'src/environments/environment' | ||||
| import { AppModule } from '../app.module' | ||||
| import { | ||||
|   PaperlessUiSettings, | ||||
|   SETTINGS_KEYS, | ||||
| } from '../data/paperless-uisettings' | ||||
| import { SettingsService } from './settings.service' | ||||
|  | ||||
| describe('SettingsService', () => { | ||||
|   let httpTestingController: HttpTestingController | ||||
|   let settingsService: SettingsService | ||||
|   let cookieService: CookieService | ||||
|   let subscription: Subscription | ||||
|  | ||||
|   const ui_settings: PaperlessUiSettings = { | ||||
| @@ -46,6 +50,13 @@ describe('SettingsService', () => { | ||||
|       saved_views: { warn_on_unsaved_change: true }, | ||||
|       notes_enabled: true, | ||||
|       tour_complete: false, | ||||
|       permissions: { | ||||
|         default_owner: null, | ||||
|         default_view_users: [1], | ||||
|         default_view_groups: [2], | ||||
|         default_edit_users: [3], | ||||
|         default_edit_groups: [4], | ||||
|       }, | ||||
|     }, | ||||
|     permissions: [], | ||||
|   } | ||||
| @@ -53,7 +64,7 @@ describe('SettingsService', () => { | ||||
|   beforeEach(() => { | ||||
|     TestBed.configureTestingModule({ | ||||
|       declarations: [], | ||||
|       providers: [SettingsService], | ||||
|       providers: [SettingsService, CookieService], | ||||
|       imports: [ | ||||
|         HttpClientTestingModule, | ||||
|         RouterTestingModule, | ||||
| @@ -65,6 +76,7 @@ describe('SettingsService', () => { | ||||
|     }) | ||||
|  | ||||
|     httpTestingController = TestBed.inject(HttpTestingController) | ||||
|     cookieService = TestBed.inject(CookieService) | ||||
|     settingsService = TestBed.inject(SettingsService) | ||||
|   }) | ||||
|  | ||||
| @@ -136,7 +148,52 @@ describe('SettingsService', () => { | ||||
|     expect(settingsService.get(SETTINGS_KEYS.THEME_COLOR)).toEqual('#000000') | ||||
|   }) | ||||
|  | ||||
|   it('updates appearnce settings', () => { | ||||
|   it('sets django cookie for languages', () => { | ||||
|     httpTestingController | ||||
|       .expectOne(`${environment.apiBaseUrl}ui_settings/`) | ||||
|       .flush(ui_settings) | ||||
|     const cookieSetSpy = jest.spyOn(cookieService, 'set') | ||||
|     settingsService.initializeSettings().subscribe(() => {}) | ||||
|     const req = httpTestingController.expectOne( | ||||
|       `${environment.apiBaseUrl}ui_settings/` | ||||
|     ) | ||||
|     ui_settings.settings['language'] = 'foobar' | ||||
|     req.flush(ui_settings) | ||||
|     expect(cookieSetSpy).toHaveBeenCalledWith('django_language', 'foobar') | ||||
|     const cookieDeleteSpy = jest.spyOn(cookieService, 'delete') | ||||
|     settingsService.setLanguage('') | ||||
|     expect(cookieDeleteSpy).toHaveBeenCalled() | ||||
|   }) | ||||
|  | ||||
|   it('should support null values for settings if set, undefined if not', () => { | ||||
|     httpTestingController | ||||
|       .expectOne(`${environment.apiBaseUrl}ui_settings/`) | ||||
|       .flush(ui_settings) | ||||
|     expect(settingsService.get('foo')).toEqual(undefined) | ||||
|     expect(settingsService.get(SETTINGS_KEYS.DEFAULT_PERMS_OWNER)).toEqual(null) | ||||
|   }) | ||||
|  | ||||
|   it('should support array values', () => { | ||||
|     httpTestingController | ||||
|       .expectOne(`${environment.apiBaseUrl}ui_settings/`) | ||||
|       .flush(ui_settings) | ||||
|     expect(settingsService.get(SETTINGS_KEYS.DEFAULT_PERMS_VIEW_USERS)).toEqual( | ||||
|       [1] | ||||
|     ) | ||||
|   }) | ||||
|  | ||||
|   it('should support default permissions values', () => { | ||||
|     delete ui_settings.settings['permissions'] | ||||
|     httpTestingController | ||||
|       .expectOne(`${environment.apiBaseUrl}ui_settings/`) | ||||
|       .flush(ui_settings) | ||||
|     expect(settingsService.get(SETTINGS_KEYS.DEFAULT_PERMS_OWNER)).toEqual(1) | ||||
|     expect(settingsService.get(SETTINGS_KEYS.DEFAULT_PERMS_VIEW_USERS)).toEqual( | ||||
|       [] | ||||
|     ) | ||||
|   }) | ||||
|  | ||||
|   it('updates appearance settings', () => { | ||||
|     const req = httpTestingController.expectOne( | ||||
|       `${environment.apiBaseUrl}ui_settings/` | ||||
|     ) | ||||
|   | ||||
| @@ -372,7 +372,7 @@ export class SettingsService { | ||||
|   } | ||||
|  | ||||
|   private getSettingRawValue(key: string): any { | ||||
|     let value = null | ||||
|     let value = undefined | ||||
|     // parse key:key:key into nested object | ||||
|     const keys = key.replace('general-settings:', '').split(':') | ||||
|     let settingObj = this.settings | ||||
| @@ -389,12 +389,20 @@ export class SettingsService { | ||||
|     let setting = SETTINGS.find((s) => s.key == key) | ||||
|  | ||||
|     if (!setting) { | ||||
|       return null | ||||
|       return undefined | ||||
|     } | ||||
|  | ||||
|     let value = this.getSettingRawValue(key) | ||||
|  | ||||
|     if (value != null) { | ||||
|     // special case to fallback | ||||
|     if (key === SETTINGS_KEYS.DEFAULT_PERMS_OWNER && value === undefined) { | ||||
|       return this.currentUser.id | ||||
|     } | ||||
|  | ||||
|     if (value !== undefined) { | ||||
|       if (value === null) { | ||||
|         return null | ||||
|       } | ||||
|       switch (setting.type) { | ||||
|         case 'boolean': | ||||
|           return JSON.parse(value) | ||||
| @@ -424,7 +432,7 @@ export class SettingsService { | ||||
|  | ||||
|   private settingIsSet(key: string): boolean { | ||||
|     let value = this.getSettingRawValue(key) | ||||
|     return value != null | ||||
|     return value != undefined | ||||
|   } | ||||
|  | ||||
|   storeSettings(): Observable<any> { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 shamoon
					shamoon