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:
		| @@ -247,6 +247,13 @@ do not have an owner set. | |||||||
|  |  | ||||||
|     Note that superusers have access to all objects. |     Note that superusers have access to all objects. | ||||||
|  |  | ||||||
|  | ### Default permissions | ||||||
|  |  | ||||||
|  | Default permissions for documents can be set using consumption templates. | ||||||
|  |  | ||||||
|  | For objects created via the web UI (tags, doc types, etc.) the default is to set the current user | ||||||
|  | as owner and no extra permissions, but you explicitly set these under Settings > Permissions. | ||||||
|  |  | ||||||
| ### Users and Groups | ### Users and Groups | ||||||
|  |  | ||||||
| Paperless-ngx versions after 1.14.0 allow creating and editing users and groups via the 'frontend' UI. | Paperless-ngx versions after 1.14.0 allow creating and editing users and groups via the 'frontend' UI. | ||||||
|   | |||||||
| @@ -455,7 +455,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="3797778920049399855" datatype="html"> |       <trans-unit id="3797778920049399855" datatype="html"> | ||||||
| @@ -519,7 +519,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6988090220128974198" datatype="html"> |       <trans-unit id="6988090220128974198" datatype="html"> | ||||||
| @@ -723,7 +723,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2526035785704676448" datatype="html"> |       <trans-unit id="2526035785704676448" datatype="html"> | ||||||
| @@ -906,23 +906,23 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/tasks/tasks.component.html</context> |           <context context-type="sourcefile">src/app/components/manage/tasks/tasks.component.html</context> | ||||||
| @@ -1081,7 +1081,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6457471243969293847" datatype="html"> |       <trans-unit id="6457471243969293847" datatype="html"> | ||||||
| @@ -1116,14 +1116,14 @@ | |||||||
|         <source>Create new item</source> |         <source>Create new item</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5324147361912094446" datatype="html"> |       <trans-unit id="5324147361912094446" datatype="html"> | ||||||
|         <source>Edit item</source> |         <source>Edit item</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="7314814725704332646" datatype="html"> |       <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="sourcefile">src/app/components/manage/management-list/management-list.component.html</context> | ||||||
|           <context context-type="linenumber">10</context> |           <context context-type="linenumber">10</context> | ||||||
|         </context-group> |         </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> | ||||||
|       <trans-unit id="7878445132438733225" datatype="html"> |       <trans-unit id="7878445132438733225" datatype="html"> | ||||||
|         <source>Create new user group</source> |         <source>Create new user group</source> | ||||||
| @@ -1216,7 +1220,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1431416938026210429" datatype="html"> |       <trans-unit id="1431416938026210429" datatype="html"> | ||||||
| @@ -1299,15 +1303,15 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/tasks/tasks.component.html</context> |           <context context-type="sourcefile">src/app/components/manage/tasks/tasks.component.html</context> | ||||||
| @@ -1382,7 +1386,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="7046259383943324039" datatype="html"> |       <trans-unit id="7046259383943324039" datatype="html"> | ||||||
| @@ -1639,23 +1643,23 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2784260611081866636" datatype="html"> |       <trans-unit id="2784260611081866636" datatype="html"> | ||||||
| @@ -1877,11 +1881,11 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1436831433675346331" datatype="html"> |       <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="sourcefile">src/app/components/common/input/permissions/permissions-form/permissions-form.component.html</context> | ||||||
|           <context context-type="linenumber">25</context> |           <context context-type="linenumber">25</context> | ||||||
|         </context-group> |         </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> | ||||||
|       <trans-unit id="2509141182388535183" datatype="html"> |       <trans-unit id="2509141182388535183" datatype="html"> | ||||||
|         <source>View</source> |         <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="sourcefile">src/app/components/common/input/permissions/permissions-form/permissions-form.component.html</context> | ||||||
|           <context context-type="linenumber">50</context> |           <context context-type="linenumber">50</context> | ||||||
|         </context-group> |         </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> | ||||||
|       <trans-unit id="239911470633002624" datatype="html"> |       <trans-unit id="239911470633002624" datatype="html"> | ||||||
|         <source>Groups:</source> |         <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="sourcefile">src/app/components/common/input/permissions/permissions-form/permissions-form.component.html</context> | ||||||
|           <context context-type="linenumber">58</context> |           <context context-type="linenumber">58</context> | ||||||
|         </context-group> |         </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> | ||||||
|       <trans-unit id="7585826646011739428" datatype="html"> |       <trans-unit id="7585826646011739428" datatype="html"> | ||||||
|         <source>Edit</source> |         <source>Edit</source> | ||||||
| @@ -2107,19 +2131,19 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="3728984448750213892" datatype="html"> |       <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="sourcefile">src/app/components/common/input/permissions/permissions-form/permissions-form.component.html</context> | ||||||
|           <context context-type="linenumber">64</context> |           <context context-type="linenumber">64</context> | ||||||
|         </context-group> |         </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> | ||||||
|       <trans-unit id="2722549756198502062" datatype="html"> |       <trans-unit id="2722549756198502062" datatype="html"> | ||||||
|         <source>Add item</source> |         <source>Add item</source> | ||||||
| @@ -2213,7 +2241,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8999708063434507268" datatype="html"> |       <trans-unit id="8999708063434507268" datatype="html"> | ||||||
| @@ -2742,23 +2770,23 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/tasks/tasks.component.html</context> |           <context context-type="sourcefile">src/app/components/manage/tasks/tasks.component.html</context> | ||||||
| @@ -3155,19 +3183,19 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1181910457994920507" datatype="html"> |       <trans-unit id="1181910457994920507" datatype="html"> | ||||||
| @@ -3182,19 +3210,19 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5729001209753056399" datatype="html"> |       <trans-unit id="5729001209753056399" datatype="html"> | ||||||
| @@ -3634,7 +3662,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1233494216161906927" datatype="html"> |       <trans-unit id="1233494216161906927" datatype="html"> | ||||||
| @@ -3759,7 +3787,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/rest/document.service.ts</context> |           <context context-type="sourcefile">src/app/services/rest/document.service.ts</context> | ||||||
| @@ -3999,7 +4027,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="4104807402967139762" datatype="html"> |       <trans-unit id="4104807402967139762" datatype="html"> | ||||||
| @@ -4010,7 +4038,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6965614903949668392" datatype="html"> |       <trans-unit id="6965614903949668392" datatype="html"> | ||||||
| @@ -4479,480 +4507,508 @@ | |||||||
|           <context context-type="linenumber">130</context> |           <context context-type="linenumber">130</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </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"> |       <trans-unit id="8901931207592071833" datatype="html"> | ||||||
|         <source>Update checking</source> |         <source>Update checking</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="7141691772243630313" datatype="html"> |       <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> |         <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-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5489945693955857309" datatype="html"> |       <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> |         <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-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5070799004079086984" datatype="html"> |       <trans-unit id="5070799004079086984" datatype="html"> | ||||||
|         <source>Enable update checking</source> |         <source>Enable update checking</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6645943458623480835" datatype="html"> |       <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> |         <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-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8508424367627989968" datatype="html"> |       <trans-unit id="8508424367627989968" datatype="html"> | ||||||
|         <source>Bulk editing</source> |         <source>Bulk editing</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8158899674926420054" datatype="html"> |       <trans-unit id="8158899674926420054" datatype="html"> | ||||||
|         <source>Show confirmation dialogs</source> |         <source>Show confirmation dialogs</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6906812245033969309" datatype="html"> |       <trans-unit id="6906812245033969309" datatype="html"> | ||||||
|         <source>Deleting documents will always ask for confirmation.</source> |         <source>Deleting documents will always ask for confirmation.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="290238406234356122" datatype="html"> |       <trans-unit id="290238406234356122" datatype="html"> | ||||||
|         <source>Apply on close</source> |         <source>Apply on close</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="293524471897878391" datatype="html"> |       <trans-unit id="293524471897878391" datatype="html"> | ||||||
|         <source>Enable notes</source> |         <source>Enable notes</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5851560788527570644" datatype="html"> |       <trans-unit id="5851560788527570644" datatype="html"> | ||||||
|         <source>Notifications</source> |         <source>Notifications</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8545554728558600606" datatype="html"> |       <trans-unit id="8545554728558600606" datatype="html"> | ||||||
|         <source>Document processing</source> |         <source>Document processing</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="3656786776644872398" datatype="html"> |       <trans-unit id="3656786776644872398" datatype="html"> | ||||||
|         <source>Show notifications when new documents are detected</source> |         <source>Show notifications when new documents are detected</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6057053428592387613" datatype="html"> |       <trans-unit id="6057053428592387613" datatype="html"> | ||||||
|         <source>Show notifications when document processing completes successfully</source> |         <source>Show notifications when document processing completes successfully</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="370315664367425513" datatype="html"> |       <trans-unit id="370315664367425513" datatype="html"> | ||||||
|         <source>Show notifications when document processing fails</source> |         <source>Show notifications when document processing fails</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6838309441164918531" datatype="html"> |       <trans-unit id="6838309441164918531" datatype="html"> | ||||||
|         <source>Suppress notifications on dashboard</source> |         <source>Suppress notifications on dashboard</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2741919327232918179" datatype="html"> |       <trans-unit id="2741919327232918179" datatype="html"> | ||||||
|         <source>This will suppress all messages about document processing status on the dashboard.</source> |         <source>This will suppress all messages about document processing status on the dashboard.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1595668988802980095" datatype="html"> |       <trans-unit id="1595668988802980095" datatype="html"> | ||||||
|         <source>Show warning when closing saved views with unsaved changes</source> |         <source>Show warning when closing saved views with unsaved changes</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="9187755754633397589" datatype="html"> |       <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> |         <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-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="7877440816920439876" datatype="html"> |       <trans-unit id="7877440816920439876" datatype="html"> | ||||||
|         <source>No saved views defined.</source> |         <source>No saved views defined.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1292737233370901804" datatype="html"> |       <trans-unit id="1292737233370901804" datatype="html"> | ||||||
|         <source>Mail</source> |         <source>Mail</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8913167930428886792" datatype="html"> |       <trans-unit id="8913167930428886792" datatype="html"> | ||||||
|         <source>Mail accounts</source> |         <source>Mail accounts</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1259421956660976189" datatype="html"> |       <trans-unit id="1259421956660976189" datatype="html"> | ||||||
|         <source>Add Account</source> |         <source>Add Account</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2188854519574316630" datatype="html"> |       <trans-unit id="2188854519574316630" datatype="html"> | ||||||
|         <source>Server</source> |         <source>Server</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6235247415162820954" datatype="html"> |       <trans-unit id="6235247415162820954" datatype="html"> | ||||||
|         <source>No mail accounts defined.</source> |         <source>No mail accounts defined.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5364020217520256833" datatype="html"> |       <trans-unit id="5364020217520256833" datatype="html"> | ||||||
|         <source>Mail rules</source> |         <source>Mail rules</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1372022816709469401" datatype="html"> |       <trans-unit id="1372022816709469401" datatype="html"> | ||||||
|         <source>Add Rule</source> |         <source>Add Rule</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6751234988479444294" datatype="html"> |       <trans-unit id="6751234988479444294" datatype="html"> | ||||||
|         <source>No mail rules defined.</source> |         <source>No mail rules defined.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8119815638230251386" datatype="html"> |       <trans-unit id="8119815638230251386" datatype="html"> | ||||||
|         <source>Users & Groups</source> |         <source>Users & Groups</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2941198503117307737" datatype="html"> |       <trans-unit id="2941198503117307737" datatype="html"> | ||||||
|         <source>Add User</source> |         <source>Add User</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="9124347207158517893" datatype="html"> |       <trans-unit id="9124347207158517893" datatype="html"> | ||||||
|         <source>Add Group</source> |         <source>Add Group</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="3066660568529853846" datatype="html"> |       <trans-unit id="3066660568529853846" datatype="html"> | ||||||
|         <source>Error retrieving groups</source> |         <source>Error retrieving groups</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||||
|           <context context-type="linenumber">278</context> |           <context context-type="linenumber">299</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-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5241231471117657636" datatype="html"> |       <trans-unit id="5241231471117657636" datatype="html"> | ||||||
|         <source>Error retrieving mail rules</source> |         <source>Error retrieving mail rules</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="3178554336792037159" datatype="html"> |       <trans-unit id="3178554336792037159" datatype="html"> | ||||||
|         <source>Error retrieving mail accounts</source> |         <source>Error retrieving mail accounts</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5610279464668232148" datatype="html"> |       <trans-unit id="5610279464668232148" datatype="html"> | ||||||
|         <source>Saved view "<x id="PH" equiv-text="savedView.name"/>" deleted.</source> |         <source>Saved view "<x id="PH" equiv-text="savedView.name"/>" deleted.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="3891152409365583719" datatype="html"> |       <trans-unit id="3891152409365583719" datatype="html"> | ||||||
|         <source>Settings saved</source> |         <source>Settings saved</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="7217000812750597833" datatype="html"> |       <trans-unit id="7217000812750597833" datatype="html"> | ||||||
|         <source>Settings were saved successfully.</source> |         <source>Settings were saved successfully.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="525012668859298131" datatype="html"> |       <trans-unit id="525012668859298131" datatype="html"> | ||||||
|         <source>Settings were saved successfully. Reload is required to apply some changes.</source> |         <source>Settings were saved successfully. Reload is required to apply some changes.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8491974984518503778" datatype="html"> |       <trans-unit id="8491974984518503778" datatype="html"> | ||||||
|         <source>Reload now</source> |         <source>Reload now</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6839066544204061364" datatype="html"> |       <trans-unit id="6839066544204061364" datatype="html"> | ||||||
|         <source>Use system language</source> |         <source>Use system language</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="7729897675462249787" datatype="html"> |       <trans-unit id="7729897675462249787" datatype="html"> | ||||||
|         <source>Use date format of display language</source> |         <source>Use date format of display language</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5260584511980773458" datatype="html"> |       <trans-unit id="5260584511980773458" datatype="html"> | ||||||
|         <source>Error while storing settings on server.</source> |         <source>Error while storing settings on server.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="4510369340305901516" datatype="html"> |       <trans-unit id="4510369340305901516" datatype="html"> | ||||||
|         <source>Password has been changed, you will be logged out momentarily.</source> |         <source>Password has been changed, you will be logged out momentarily.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2753185112875184719" datatype="html"> |       <trans-unit id="2753185112875184719" datatype="html"> | ||||||
|         <source>Saved user "<x id="PH" equiv-text="newUser.username"/>".</source> |         <source>Saved user "<x id="PH" equiv-text="newUser.username"/>".</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="3471101514724661554" datatype="html"> |       <trans-unit id="3471101514724661554" datatype="html"> | ||||||
|         <source>Error saving user.</source> |         <source>Error saving user.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5565868288871970148" datatype="html"> |       <trans-unit id="5565868288871970148" datatype="html"> | ||||||
|         <source>Confirm delete user account</source> |         <source>Confirm delete user account</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8133663925694885325" datatype="html"> |       <trans-unit id="8133663925694885325" datatype="html"> | ||||||
|         <source>This operation will permanently delete this user account.</source> |         <source>This operation will permanently delete this user account.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="857903183180440990" datatype="html"> |       <trans-unit id="857903183180440990" datatype="html"> | ||||||
|         <source>Deleted user</source> |         <source>Deleted user</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1942566571910298572" datatype="html"> |       <trans-unit id="1942566571910298572" datatype="html"> | ||||||
|         <source>Error deleting user.</source> |         <source>Error deleting user.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5766640174051730159" datatype="html"> |       <trans-unit id="5766640174051730159" datatype="html"> | ||||||
|         <source>Saved group "<x id="PH" equiv-text="newGroup.name"/>".</source> |         <source>Saved group "<x id="PH" equiv-text="newGroup.name"/>".</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8382042988405122578" datatype="html"> |       <trans-unit id="8382042988405122578" datatype="html"> | ||||||
|         <source>Error saving group.</source> |         <source>Error saving group.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6538873300613683004" datatype="html"> |       <trans-unit id="6538873300613683004" datatype="html"> | ||||||
|         <source>Confirm delete user group</source> |         <source>Confirm delete user group</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="7710984639498518244" datatype="html"> |       <trans-unit id="7710984639498518244" datatype="html"> | ||||||
|         <source>This operation will permanently delete this user group.</source> |         <source>This operation will permanently delete this user group.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6834066329827670963" datatype="html"> |       <trans-unit id="6834066329827670963" datatype="html"> | ||||||
|         <source>Deleted group</source> |         <source>Deleted group</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8850738980935204840" datatype="html"> |       <trans-unit id="8850738980935204840" datatype="html"> | ||||||
|         <source>Error deleting group.</source> |         <source>Error deleting group.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6327501535846658797" datatype="html"> |       <trans-unit id="6327501535846658797" datatype="html"> | ||||||
|         <source>Saved account "<x id="PH" equiv-text="newMailAccount.name"/>".</source> |         <source>Saved account "<x id="PH" equiv-text="newMailAccount.name"/>".</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8067594003836508139" datatype="html"> |       <trans-unit id="8067594003836508139" datatype="html"> | ||||||
|         <source>Error saving account.</source> |         <source>Error saving account.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5641934153807844674" datatype="html"> |       <trans-unit id="5641934153807844674" datatype="html"> | ||||||
|         <source>Confirm delete mail account</source> |         <source>Confirm delete mail account</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="7176985344323395435" datatype="html"> |       <trans-unit id="7176985344323395435" datatype="html"> | ||||||
|         <source>This operation will permanently delete this mail account.</source> |         <source>This operation will permanently delete this mail account.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="4233826387148482123" datatype="html"> |       <trans-unit id="4233826387148482123" datatype="html"> | ||||||
|         <source>Deleted mail account</source> |         <source>Deleted mail account</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6202503362522392111" datatype="html"> |       <trans-unit id="6202503362522392111" datatype="html"> | ||||||
|         <source>Error deleting mail account.</source> |         <source>Error deleting mail account.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="123368655395433699" datatype="html"> |       <trans-unit id="123368655395433699" datatype="html"> | ||||||
|         <source>Saved rule "<x id="PH" equiv-text="newMailRule.name"/>".</source> |         <source>Saved rule "<x id="PH" equiv-text="newMailRule.name"/>".</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8951124554918814321" datatype="html"> |       <trans-unit id="8951124554918814321" datatype="html"> | ||||||
|         <source>Error saving rule.</source> |         <source>Error saving rule.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="3896080636020672118" datatype="html"> |       <trans-unit id="3896080636020672118" datatype="html"> | ||||||
|         <source>Confirm delete mail rule</source> |         <source>Confirm delete mail rule</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2250372580580310337" datatype="html"> |       <trans-unit id="2250372580580310337" datatype="html"> | ||||||
|         <source>This operation will permanently delete this mail rule.</source> |         <source>This operation will permanently delete this mail rule.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="9077981247971516916" datatype="html"> |       <trans-unit id="9077981247971516916" datatype="html"> | ||||||
|         <source>Deleted mail rule</source> |         <source>Deleted mail rule</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2033194641751367552" datatype="html"> |       <trans-unit id="2033194641751367552" datatype="html"> | ||||||
|         <source>Error deleting mail rule.</source> |         <source>Error deleting mail rule.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5101757640976222639" datatype="html"> |       <trans-unit id="5101757640976222639" datatype="html"> | ||||||
| @@ -5702,21 +5758,21 @@ | |||||||
|         <source>Successfully completed one-time migratration of settings to the database!</source> |         <source>Successfully completed one-time migratration of settings to the database!</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5558341108007064934" datatype="html"> |       <trans-unit id="5558341108007064934" datatype="html"> | ||||||
|         <source>Unable to migrate settings to the database, please try saving manually.</source> |         <source>Unable to migrate settings to the database, please try saving manually.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1168781785897678748" datatype="html"> |       <trans-unit id="1168781785897678748" datatype="html"> | ||||||
|         <source>You can restart the tour from the settings page.</source> |         <source>You can restart the tour from the settings page.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> |           <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> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5037437391296624618" datatype="html"> |       <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 { 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 { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||||
| import { SelectComponent } from '../../input/select/select.component' | import { SettingsService } from 'src/app/services/settings.service' | ||||||
| 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 { 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', () => { | describe('CorrespondentEditDialogComponent', () => { | ||||||
|   let component: CorrespondentEditDialogComponent |   let component: CorrespondentEditDialogComponent | ||||||
|  |   let settingsService: SettingsService | ||||||
|   let fixture: ComponentFixture<CorrespondentEditDialogComponent> |   let fixture: ComponentFixture<CorrespondentEditDialogComponent> | ||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
| @@ -36,6 +38,8 @@ describe('CorrespondentEditDialogComponent', () => { | |||||||
|     }).compileComponents() |     }).compileComponents() | ||||||
|  |  | ||||||
|     fixture = TestBed.createComponent(CorrespondentEditDialogComponent) |     fixture = TestBed.createComponent(CorrespondentEditDialogComponent) | ||||||
|  |     settingsService = TestBed.inject(SettingsService) | ||||||
|  |     settingsService.currentUser = { id: 99, username: 'user99' } | ||||||
|     component = fixture.componentInstance |     component = fixture.componentInstance | ||||||
|  |  | ||||||
|     fixture.detectChanges() |     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 { 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 { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||||
| import { SelectComponent } from '../../input/select/select.component' | import { SettingsService } from 'src/app/services/settings.service' | ||||||
| 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 { 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', () => { | describe('DocumentTypeEditDialogComponent', () => { | ||||||
|   let component: DocumentTypeEditDialogComponent |   let component: DocumentTypeEditDialogComponent | ||||||
|  |   let settingsService: SettingsService | ||||||
|   let fixture: ComponentFixture<DocumentTypeEditDialogComponent> |   let fixture: ComponentFixture<DocumentTypeEditDialogComponent> | ||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
| @@ -36,6 +38,8 @@ describe('DocumentTypeEditDialogComponent', () => { | |||||||
|     }).compileComponents() |     }).compileComponents() | ||||||
|  |  | ||||||
|     fixture = TestBed.createComponent(DocumentTypeEditDialogComponent) |     fixture = TestBed.createComponent(DocumentTypeEditDialogComponent) | ||||||
|  |     settingsService = TestBed.inject(SettingsService) | ||||||
|  |     settingsService.currentUser = { id: 99, username: 'user99' } | ||||||
|     component = fixture.componentInstance |     component = fixture.componentInstance | ||||||
|  |  | ||||||
|     fixture.detectChanges() |     fixture.detectChanges() | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| import { | import { | ||||||
|   HttpClientTestingModule, |  | ||||||
|   HttpTestingController, |   HttpTestingController, | ||||||
|  |   HttpClientTestingModule, | ||||||
| } from '@angular/common/http/testing' | } from '@angular/common/http/testing' | ||||||
| import { Component } from '@angular/core' | import { Component } from '@angular/core' | ||||||
| import { | import { | ||||||
| @@ -16,19 +16,20 @@ import { | |||||||
|   ReactiveFormsModule, |   ReactiveFormsModule, | ||||||
| } from '@angular/forms' | } from '@angular/forms' | ||||||
| import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' | 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 { 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 { TagService } from 'src/app/services/rest/tag.service' | ||||||
| import { UserService } from 'src/app/services/rest/user.service' | import { UserService } from 'src/app/services/rest/user.service' | ||||||
| import { SettingsService } from 'src/app/services/settings.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 { environment } from 'src/environments/environment' | ||||||
|  | import { EditDialogComponent, EditDialogMode } from './edit-dialog.component' | ||||||
|  |  | ||||||
| @Component({ | @Component({ | ||||||
|   template: ` |   template: ` | ||||||
| @@ -88,6 +89,7 @@ describe('EditDialogComponent', () => { | |||||||
|   let component: TestComponent |   let component: TestComponent | ||||||
|   let fixture: ComponentFixture<TestComponent> |   let fixture: ComponentFixture<TestComponent> | ||||||
|   let tagService: TagService |   let tagService: TagService | ||||||
|  |   let settingsService: SettingsService | ||||||
|   let activeModal: NgbActiveModal |   let activeModal: NgbActiveModal | ||||||
|   let httpTestingController: HttpTestingController |   let httpTestingController: HttpTestingController | ||||||
|  |  | ||||||
| @@ -110,18 +112,15 @@ describe('EditDialogComponent', () => { | |||||||
|               }), |               }), | ||||||
|           }, |           }, | ||||||
|         }, |         }, | ||||||
|         { |         SettingsService, | ||||||
|           provide: SettingsService, |  | ||||||
|           useValue: { |  | ||||||
|             currentUser, |  | ||||||
|           }, |  | ||||||
|         }, |  | ||||||
|         TagService, |         TagService, | ||||||
|       ], |       ], | ||||||
|       imports: [HttpClientTestingModule, FormsModule, ReactiveFormsModule], |       imports: [HttpClientTestingModule, FormsModule, ReactiveFormsModule], | ||||||
|     }).compileComponents() |     }).compileComponents() | ||||||
|  |  | ||||||
|     tagService = TestBed.inject(TagService) |     tagService = TestBed.inject(TagService) | ||||||
|  |     settingsService = TestBed.inject(SettingsService) | ||||||
|  |     settingsService.currentUser = currentUser | ||||||
|     activeModal = TestBed.inject(NgbActiveModal) |     activeModal = TestBed.inject(NgbActiveModal) | ||||||
|     httpTestingController = TestBed.inject(HttpTestingController) |     httpTestingController = TestBed.inject(HttpTestingController) | ||||||
|  |  | ||||||
| @@ -149,7 +148,7 @@ describe('EditDialogComponent', () => { | |||||||
|     expect(component.closeEnabled).toBeTruthy() |     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.dialogMode = EditDialogMode.CREATE | ||||||
|     component.ngOnInit() |     component.ngOnInit() | ||||||
|     expect(component.objectForm.get('permissions_form').value.owner).toEqual( |     expect(component.objectForm.get('permissions_form').value.owner).toEqual( | ||||||
| @@ -160,6 +159,32 @@ describe('EditDialogComponent', () => { | |||||||
|     component.ngOnInit() |     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', () => { |   it('should detect if pattern required', () => { | ||||||
|     expect(component.patternRequired).toBeFalsy() |     expect(component.patternRequired).toBeFalsy() | ||||||
|     component.objectForm.get('matching_algorithm').setValue(MATCH_AUTO) |     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 { UserService } from 'src/app/services/rest/user.service' | ||||||
| import { PermissionsFormObject } from '../input/permissions/permissions-form/permissions-form.component' | import { PermissionsFormObject } from '../input/permissions/permissions-form/permissions-form.component' | ||||||
| import { SettingsService } from 'src/app/services/settings.service' | import { SettingsService } from 'src/app/services/settings.service' | ||||||
|  | import { SETTINGS_KEYS } from 'src/app/data/paperless-uisettings' | ||||||
|  |  | ||||||
| export enum EditDialogMode { | export enum EditDialogMode { | ||||||
|   CREATE = 0, |   CREATE = 0, | ||||||
| @@ -67,6 +68,31 @@ export abstract class EditDialogComponent< | |||||||
|         set_permissions: (this.object as ObjectWithPermissions).permissions, |         set_permissions: (this.object as ObjectWithPermissions).permissions, | ||||||
|       } |       } | ||||||
|       this.objectForm.patchValue(this.object) |       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 |     // 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.userService.listAll().subscribe((r) => { | ||||||
|       this.users = r.results |       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 { 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 { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||||
| import { SelectComponent } from '../../input/select/select.component' | import { SettingsService } from 'src/app/services/settings.service' | ||||||
| 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 { 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 { PermissionsSelectComponent } from '../../permissions-select/permissions-select.component' | ||||||
|  | import { EditDialogMode } from '../edit-dialog.component' | ||||||
|  | import { GroupEditDialogComponent } from './group-edit-dialog.component' | ||||||
|  |  | ||||||
| describe('GroupEditDialogComponent', () => { | describe('GroupEditDialogComponent', () => { | ||||||
|   let component: GroupEditDialogComponent |   let component: GroupEditDialogComponent | ||||||
|  |   let settingsService: SettingsService | ||||||
|   let fixture: ComponentFixture<GroupEditDialogComponent> |   let fixture: ComponentFixture<GroupEditDialogComponent> | ||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
| @@ -38,6 +40,8 @@ describe('GroupEditDialogComponent', () => { | |||||||
|     }).compileComponents() |     }).compileComponents() | ||||||
|  |  | ||||||
|     fixture = TestBed.createComponent(GroupEditDialogComponent) |     fixture = TestBed.createComponent(GroupEditDialogComponent) | ||||||
|  |     settingsService = TestBed.inject(SettingsService) | ||||||
|  |     settingsService.currentUser = { id: 99, username: 'user99' } | ||||||
|     component = fixture.componentInstance |     component = fixture.componentInstance | ||||||
|  |  | ||||||
|     fixture.detectChanges() |     fixture.detectChanges() | ||||||
|   | |||||||
| @@ -1,30 +1,32 @@ | |||||||
|  | import { | ||||||
|  |   HttpTestingController, | ||||||
|  |   HttpClientTestingModule, | ||||||
|  | } from '@angular/common/http/testing' | ||||||
| import { | import { | ||||||
|   ComponentFixture, |   ComponentFixture, | ||||||
|   TestBed, |   TestBed, | ||||||
|   fakeAsync, |   fakeAsync, | ||||||
|   tick, |   tick, | ||||||
| } from '@angular/core/testing' | } from '@angular/core/testing' | ||||||
|  | import { FormsModule, ReactiveFormsModule } from '@angular/forms' | ||||||
| import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' | ||||||
| import { | import { NgSelectModule } from '@ng-select/ng-select' | ||||||
|   HttpClientTestingModule, | import { IMAPSecurity } from 'src/app/data/paperless-mail-account' | ||||||
|   HttpTestingController, |  | ||||||
| } from '@angular/common/http/testing' |  | ||||||
| import { EditDialogMode } from '../edit-dialog.component' |  | ||||||
| import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||||
| import { SelectComponent } from '../../input/select/select.component' | import { SettingsService } from 'src/app/services/settings.service' | ||||||
| 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 { environment } from 'src/environments/environment' | 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', () => { | describe('MailAccountEditDialogComponent', () => { | ||||||
|   let component: MailAccountEditDialogComponent |   let component: MailAccountEditDialogComponent | ||||||
|  |   let settingsService: SettingsService | ||||||
|   let fixture: ComponentFixture<MailAccountEditDialogComponent> |   let fixture: ComponentFixture<MailAccountEditDialogComponent> | ||||||
|   let httpController: HttpTestingController |   let httpController: HttpTestingController | ||||||
|  |  | ||||||
| @@ -53,6 +55,8 @@ describe('MailAccountEditDialogComponent', () => { | |||||||
|     httpController = TestBed.inject(HttpTestingController) |     httpController = TestBed.inject(HttpTestingController) | ||||||
|  |  | ||||||
|     fixture = TestBed.createComponent(MailAccountEditDialogComponent) |     fixture = TestBed.createComponent(MailAccountEditDialogComponent) | ||||||
|  |     settingsService = TestBed.inject(SettingsService) | ||||||
|  |     settingsService.currentUser = { id: 99, username: 'user99' } | ||||||
|     component = fixture.componentInstance |     component = fixture.componentInstance | ||||||
|  |  | ||||||
|     fixture.detectChanges() |     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 { HttpClientTestingModule } from '@angular/common/http/testing' | ||||||
| import { EditDialogMode } from '../edit-dialog.component' | import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||||
| 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 { 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 { 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 { of } from 'rxjs' | ||||||
| import { | import { | ||||||
|   MailAction, |  | ||||||
|   MailMetadataCorrespondentOption, |   MailMetadataCorrespondentOption, | ||||||
|  |   MailAction, | ||||||
| } from 'src/app/data/paperless-mail-rule' | } 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', () => { | describe('MailRuleEditDialogComponent', () => { | ||||||
|   let component: MailRuleEditDialogComponent |   let component: MailRuleEditDialogComponent | ||||||
|  |   let settingsService: SettingsService | ||||||
|   let fixture: ComponentFixture<MailRuleEditDialogComponent> |   let fixture: ComponentFixture<MailRuleEditDialogComponent> | ||||||
|   let accountService: MailAccountService |   let accountService: MailAccountService | ||||||
|   let correspondentService: CorrespondentService |   let correspondentService: CorrespondentService | ||||||
| @@ -73,6 +75,8 @@ describe('MailRuleEditDialogComponent', () => { | |||||||
|     }).compileComponents() |     }).compileComponents() | ||||||
|  |  | ||||||
|     fixture = TestBed.createComponent(MailRuleEditDialogComponent) |     fixture = TestBed.createComponent(MailRuleEditDialogComponent) | ||||||
|  |     settingsService = TestBed.inject(SettingsService) | ||||||
|  |     settingsService.currentUser = { id: 99, username: 'user99' } | ||||||
|     component = fixture.componentInstance |     component = fixture.componentInstance | ||||||
|  |  | ||||||
|     fixture.detectChanges() |     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 { 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 { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.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 { 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', () => { | describe('StoragePathEditDialogComponent', () => { | ||||||
|   let component: StoragePathEditDialogComponent |   let component: StoragePathEditDialogComponent | ||||||
|  |   let settingsService: SettingsService | ||||||
|   let fixture: ComponentFixture<StoragePathEditDialogComponent> |   let fixture: ComponentFixture<StoragePathEditDialogComponent> | ||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
| @@ -38,6 +40,8 @@ describe('StoragePathEditDialogComponent', () => { | |||||||
|     }).compileComponents() |     }).compileComponents() | ||||||
|  |  | ||||||
|     fixture = TestBed.createComponent(StoragePathEditDialogComponent) |     fixture = TestBed.createComponent(StoragePathEditDialogComponent) | ||||||
|  |     settingsService = TestBed.inject(SettingsService) | ||||||
|  |     settingsService.currentUser = { id: 99, username: 'user99' } | ||||||
|     component = fixture.componentInstance |     component = fixture.componentInstance | ||||||
|  |  | ||||||
|     fixture.detectChanges() |     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 { 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 { IfOwnerDirective } from 'src/app/directives/if-owner.directive' | ||||||
| import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||||
| import { SelectComponent } from '../../input/select/select.component' | import { SettingsService } from 'src/app/services/settings.service' | ||||||
| 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 { CheckComponent } from '../../input/check/check.component' | 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', () => { | describe('TagEditDialogComponent', () => { | ||||||
|   let component: TagEditDialogComponent |   let component: TagEditDialogComponent | ||||||
|  |   let settingsService: SettingsService | ||||||
|   let fixture: ComponentFixture<TagEditDialogComponent> |   let fixture: ComponentFixture<TagEditDialogComponent> | ||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
| @@ -29,7 +31,7 @@ describe('TagEditDialogComponent', () => { | |||||||
|         ColorComponent, |         ColorComponent, | ||||||
|         CheckComponent, |         CheckComponent, | ||||||
|       ], |       ], | ||||||
|       providers: [NgbActiveModal], |       providers: [NgbActiveModal, SettingsService], | ||||||
|       imports: [ |       imports: [ | ||||||
|         HttpClientTestingModule, |         HttpClientTestingModule, | ||||||
|         FormsModule, |         FormsModule, | ||||||
| @@ -40,6 +42,8 @@ describe('TagEditDialogComponent', () => { | |||||||
|     }).compileComponents() |     }).compileComponents() | ||||||
|  |  | ||||||
|     fixture = TestBed.createComponent(TagEditDialogComponent) |     fixture = TestBed.createComponent(TagEditDialogComponent) | ||||||
|  |     settingsService = TestBed.inject(SettingsService) | ||||||
|  |     settingsService.currentUser = { id: 99, username: 'user99' } | ||||||
|     component = fixture.componentInstance |     component = fixture.componentInstance | ||||||
|  |  | ||||||
|     fixture.detectChanges() |     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 { HttpClientTestingModule } from '@angular/common/http/testing' | ||||||
| import { EditDialogMode } from '../edit-dialog.component' | import { ComponentFixture, TestBed } from '@angular/core/testing' | ||||||
| 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 { | import { | ||||||
|   AbstractControl, |  | ||||||
|   FormsModule, |   FormsModule, | ||||||
|   ReactiveFormsModule, |   ReactiveFormsModule, | ||||||
|  |   AbstractControl, | ||||||
| } from '@angular/forms' | } 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 { 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 { 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', () => { | describe('UserEditDialogComponent', () => { | ||||||
|   let component: UserEditDialogComponent |   let component: UserEditDialogComponent | ||||||
|  |   let settingsService: SettingsService | ||||||
|   let fixture: ComponentFixture<UserEditDialogComponent> |   let fixture: ComponentFixture<UserEditDialogComponent> | ||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
| @@ -51,6 +53,7 @@ describe('UserEditDialogComponent', () => { | |||||||
|               }), |               }), | ||||||
|           }, |           }, | ||||||
|         }, |         }, | ||||||
|  |         SettingsService, | ||||||
|       ], |       ], | ||||||
|       imports: [ |       imports: [ | ||||||
|         HttpClientTestingModule, |         HttpClientTestingModule, | ||||||
| @@ -62,6 +65,8 @@ describe('UserEditDialogComponent', () => { | |||||||
|     }).compileComponents() |     }).compileComponents() | ||||||
|  |  | ||||||
|     fixture = TestBed.createComponent(UserEditDialogComponent) |     fixture = TestBed.createComponent(UserEditDialogComponent) | ||||||
|  |     settingsService = TestBed.inject(SettingsService) | ||||||
|  |     settingsService.currentUser = { id: 99, username: 'user99' } | ||||||
|     component = fixture.componentInstance |     component = fixture.componentInstance | ||||||
|  |  | ||||||
|     fixture.detectChanges() |     fixture.detectChanges() | ||||||
|   | |||||||
| @@ -11,14 +11,14 @@ | |||||||
| <form [formGroup]="settingsForm" (ngSubmit)="saveSettings()"> | <form [formGroup]="settingsForm" (ngSubmit)="saveSettings()"> | ||||||
|  |  | ||||||
|   <ul ngbNav #nav="ngbNav" (navChange)="onNavChange($event)" [(activeId)]="activeNavID" class="nav-tabs"> |   <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> |       <a ngbNavLink i18n>General</a> | ||||||
|       <ng-template ngbNavContent> |       <ng-template ngbNavContent> | ||||||
|  |  | ||||||
|         <h4 i18n>Appearance</h4> |         <h4 i18n>Appearance</h4> | ||||||
|  |  | ||||||
|         <div class="row mb-3"> |         <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> |             <span i18n>Display language</span> | ||||||
|           </div> |           </div> | ||||||
|           <div class="col"> |           <div class="col"> | ||||||
| @@ -33,7 +33,7 @@ | |||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|         <div class="row mb-3"> |         <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> |             <span i18n>Date display</span> | ||||||
|           </div> |           </div> | ||||||
|           <div class="col"> |           <div class="col"> | ||||||
| @@ -46,7 +46,7 @@ | |||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|         <div class="row mb-3"> |         <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> |             <span i18n>Date format</span> | ||||||
|           </div> |           </div> | ||||||
|           <div class="col"> |           <div class="col"> | ||||||
| @@ -68,7 +68,7 @@ | |||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|         <div class="row mb-3"> |         <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> |             <span i18n>Items per page</span> | ||||||
|           </div> |           </div> | ||||||
|           <div class="col"> |           <div class="col"> | ||||||
| @@ -84,7 +84,7 @@ | |||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|         <div class="row mb-3"> |         <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> |             <span i18n>Document editor</span> | ||||||
|           </div> |           </div> | ||||||
|           <div class="col"> |           <div class="col"> | ||||||
| @@ -95,7 +95,7 @@ | |||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|         <div class="row mb-3"> |         <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> |             <span i18n>Sidebar</span> | ||||||
|           </div> |           </div> | ||||||
|           <div class="col"> |           <div class="col"> | ||||||
| @@ -106,7 +106,7 @@ | |||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|         <div class="row mb-3"> |         <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> |             <span i18n>Dark mode</span> | ||||||
|           </div> |           </div> | ||||||
|           <div class="col"> |           <div class="col"> | ||||||
| @@ -117,7 +117,7 @@ | |||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|         <div class="row mb-3"> |         <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> |             <span i18n>Theme Color</span> | ||||||
|           </div> |           </div> | ||||||
|           <div class="col col-md-3"> |           <div class="col col-md-3"> | ||||||
| @@ -132,6 +132,82 @@ | |||||||
|           </div> |           </div> | ||||||
|         </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> |         <h4 class="mt-4" id="update-checking" i18n>Update checking</h4> | ||||||
|  |  | ||||||
|         <div class="row mb-3"> |         <div class="row mb-3"> | ||||||
|   | |||||||
| @@ -13,10 +13,11 @@ import { RouterTestingModule } from '@angular/router/testing' | |||||||
| import { | import { | ||||||
|   NgbModal, |   NgbModal, | ||||||
|   NgbModule, |   NgbModule, | ||||||
|  |   NgbAlertModule, | ||||||
|   NgbNavLink, |   NgbNavLink, | ||||||
|   NgbModalRef, |   NgbModalRef, | ||||||
|   NgbAlertModule, |  | ||||||
| } from '@ng-bootstrap/ng-bootstrap' | } from '@ng-bootstrap/ng-bootstrap' | ||||||
|  | import { NgSelectModule } from '@ng-select/ng-select' | ||||||
| import { of, throwError } from 'rxjs' | import { of, throwError } from 'rxjs' | ||||||
| import { routes } from 'src/app/app-routing.module' | import { routes } from 'src/app/app-routing.module' | ||||||
| import { PaperlessMailAccount } from 'src/app/data/paperless-mail-account' | 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 { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' | ||||||
| import { PermissionsGuard } from 'src/app/guards/permissions.guard' | import { PermissionsGuard } from 'src/app/guards/permissions.guard' | ||||||
| import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' | 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 { PermissionsService } from 'src/app/services/permissions.service' | ||||||
| import { GroupService } from 'src/app/services/rest/group.service' | import { GroupService } from 'src/app/services/rest/group.service' | ||||||
| import { MailAccountService } from 'src/app/services/rest/mail-account.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 { UserEditDialogComponent } from '../../common/edit-dialog/user-edit-dialog/user-edit-dialog.component' | ||||||
| import { CheckComponent } from '../../common/input/check/check.component' | import { CheckComponent } from '../../common/input/check/check.component' | ||||||
| import { ColorComponent } from '../../common/input/color/color.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 { PageHeaderComponent } from '../../common/page-header/page-header.component' | ||||||
| import { SettingsComponent } from './settings.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 = [ | const savedViews = [ | ||||||
|   { id: 1, name: 'view1' }, |   { id: 1, name: 'view1' }, | ||||||
| @@ -106,6 +108,8 @@ describe('SettingsComponent', () => { | |||||||
|         TagsComponent, |         TagsComponent, | ||||||
|         MailAccountEditDialogComponent, |         MailAccountEditDialogComponent, | ||||||
|         MailRuleEditDialogComponent, |         MailRuleEditDialogComponent, | ||||||
|  |         PermissionsUserComponent, | ||||||
|  |         PermissionsGroupComponent, | ||||||
|       ], |       ], | ||||||
|       providers: [CustomDatePipe, DatePipe, PermissionsGuard], |       providers: [CustomDatePipe, DatePipe, PermissionsGuard], | ||||||
|       imports: [ |       imports: [ | ||||||
| @@ -125,6 +129,7 @@ describe('SettingsComponent', () => { | |||||||
|     viewportScroller = TestBed.inject(ViewportScroller) |     viewportScroller = TestBed.inject(ViewportScroller) | ||||||
|     toastService = TestBed.inject(ToastService) |     toastService = TestBed.inject(ToastService) | ||||||
|     settingsService = TestBed.inject(SettingsService) |     settingsService = TestBed.inject(SettingsService) | ||||||
|  |     settingsService.currentUser = { id: 99, username: 'user99' } | ||||||
|     userService = TestBed.inject(UserService) |     userService = TestBed.inject(UserService) | ||||||
|     permissionsService = TestBed.inject(PermissionsService) |     permissionsService = TestBed.inject(PermissionsService) | ||||||
|     jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) |     jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) | ||||||
| @@ -247,11 +252,11 @@ describe('SettingsComponent', () => { | |||||||
|     ) |     ) | ||||||
|     expect(component.mailAccounts).not.toBeUndefined() |     expect(component.mailAccounts).not.toBeUndefined() | ||||||
|  |  | ||||||
|     expect(component.users).toBeUndefined() |     expect(component.groups).toBeUndefined() | ||||||
|     tabButtons[4].nativeElement.dispatchEvent( |     tabButtons[4].nativeElement.dispatchEvent( | ||||||
|       new MouseEvent('mouseover', { bubbles: true }) |       new MouseEvent('mouseover', { bubbles: true }) | ||||||
|     ) |     ) | ||||||
|     expect(component.users).not.toBeUndefined() |     expect(component.groups).not.toBeUndefined() | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should support save saved views, show error', () => { |   it('should support save saved views, show error', () => { | ||||||
| @@ -301,7 +306,7 @@ describe('SettingsComponent', () => { | |||||||
|     expect(toastErrorSpy).toHaveBeenCalled() |     expect(toastErrorSpy).toHaveBeenCalled() | ||||||
|     expect(storeSpy).toHaveBeenCalled() |     expect(storeSpy).toHaveBeenCalled() | ||||||
|     expect(appearanceSettingsSpy).not.toHaveBeenCalled() |     expect(appearanceSettingsSpy).not.toHaveBeenCalled() | ||||||
|     expect(setSpy).toHaveBeenCalledTimes(19) |     expect(setSpy).toHaveBeenCalledTimes(24) | ||||||
|  |  | ||||||
|     // succeed |     // succeed | ||||||
|     storeSpy.mockReturnValueOnce(of(true)) |     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 { ObjectWithPermissions } from 'src/app/data/object-with-permissions' | ||||||
| import { | import { | ||||||
|   PermissionAction, |   PermissionAction, | ||||||
|  |   PermissionType, | ||||||
|   PermissionsService, |   PermissionsService, | ||||||
| } from 'src/app/services/permissions.service' | } from 'src/app/services/permissions.service' | ||||||
|  |  | ||||||
| @@ -93,6 +94,11 @@ export class SettingsComponent | |||||||
|     dateFormat: new FormControl(null), |     dateFormat: new FormControl(null), | ||||||
|     notesEnabled: new FormControl(null), |     notesEnabled: new FormControl(null), | ||||||
|     updateCheckingEnabled: 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), |     notificationsConsumerNewDocument: new FormControl(null), | ||||||
|     notificationsConsumerSuccess: new FormControl(null), |     notificationsConsumerSuccess: new FormControl(null), | ||||||
| @@ -159,6 +165,16 @@ export class SettingsComponent | |||||||
|  |  | ||||||
|     this.activatedRoute.paramMap.subscribe((paramMap) => { |     this.activatedRoute.paramMap.subscribe((paramMap) => { | ||||||
|       const section = paramMap.get('section') |       const section = paramMap.get('section') | ||||||
|  |       if (section === null) { | ||||||
|  |         if ( | ||||||
|  |           this.permissionsService.currentUserCan( | ||||||
|  |             PermissionAction.View, | ||||||
|  |             PermissionType.User | ||||||
|  |           ) | ||||||
|  |         ) { | ||||||
|  |           this.getUsers() | ||||||
|  |         } | ||||||
|  |       } | ||||||
|       if (section) { |       if (section) { | ||||||
|         const navIDKey: string = Object.keys(SettingsNavIDs).find( |         const navIDKey: string = Object.keys(SettingsNavIDs).find( | ||||||
|           (navID) => navID.toLowerCase() == section |           (navID) => navID.toLowerCase() == section | ||||||
| @@ -222,6 +238,19 @@ export class SettingsComponent | |||||||
|       savedViewsWarnOnUnsavedChange: this.settings.get( |       savedViewsWarnOnUnsavedChange: this.settings.get( | ||||||
|         SETTINGS_KEYS.SAVED_VIEWS_WARN_ON_UNSAVED_CHANGE |         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: {}, |       usersGroup: {}, | ||||||
|       groupsGroup: {}, |       groupsGroup: {}, | ||||||
|       savedViews: {}, |       savedViews: {}, | ||||||
| @@ -256,15 +285,11 @@ export class SettingsComponent | |||||||
|         this.initialize(false) |         this.initialize(false) | ||||||
|       }) |       }) | ||||||
|     } else if ( |     } else if ( | ||||||
|       navID == SettingsNavIDs.UsersGroups && |       (navID == SettingsNavIDs.UsersGroups || | ||||||
|  |         navID == SettingsNavIDs.General) && | ||||||
|       (!this.users || !this.groups) |       (!this.users || !this.groups) | ||||||
|     ) { |     ) { | ||||||
|       this.usersService |       if (!this.users) this.getUsers() | ||||||
|         .listAll() |  | ||||||
|         .pipe(first()) |  | ||||||
|         .subscribe({ |  | ||||||
|           next: (r) => { |  | ||||||
|             this.users = r.results |  | ||||||
|       this.groupsService |       this.groupsService | ||||||
|         .listAll() |         .listAll() | ||||||
|         .pipe(first()) |         .pipe(first()) | ||||||
| @@ -274,15 +299,7 @@ export class SettingsComponent | |||||||
|             this.initialize(false) |             this.initialize(false) | ||||||
|           }, |           }, | ||||||
|           error: (e) => { |           error: (e) => { | ||||||
|                   this.toastService.showError( |             this.toastService.showError($localize`Error retrieving groups`, e) | ||||||
|                     $localize`Error retrieving groups`, |  | ||||||
|                     e |  | ||||||
|                   ) |  | ||||||
|                 }, |  | ||||||
|               }) |  | ||||||
|           }, |  | ||||||
|           error: (e) => { |  | ||||||
|             this.toastService.showError($localize`Error retrieving users`, e) |  | ||||||
|           }, |           }, | ||||||
|         }) |         }) | ||||||
|     } else if ( |     } 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) { |   initialize(resetSettings: boolean = true) { | ||||||
|     this.unsubscribeNotifier.next(true) |     this.unsubscribeNotifier.next(true) | ||||||
|  |  | ||||||
| @@ -611,6 +642,26 @@ export class SettingsComponent | |||||||
|       SETTINGS_KEYS.SAVED_VIEWS_WARN_ON_UNSAVED_CHANGE, |       SETTINGS_KEYS.SAVED_VIEWS_WARN_ON_UNSAVED_CHANGE, | ||||||
|       this.settingsForm.value.savedViewsWarnOnUnsavedChange |       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.setLanguage(this.settingsForm.value.displayLanguage) | ||||||
|     this.settings |     this.settings | ||||||
|       .storeSettings() |       .storeSettings() | ||||||
|   | |||||||
| @@ -42,6 +42,11 @@ export const SETTINGS_KEYS = { | |||||||
|   SAVED_VIEWS_WARN_ON_UNSAVED_CHANGE: |   SAVED_VIEWS_WARN_ON_UNSAVED_CHANGE: | ||||||
|     'general-settings:saved-views:warn-on-unsaved-change', |     'general-settings:saved-views:warn-on-unsaved-change', | ||||||
|   TOUR_COMPLETE: 'general-settings:tour-complete', |   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[] = [ | export const SETTINGS: PaperlessUiSetting[] = [ | ||||||
| @@ -150,4 +155,29 @@ export const SETTINGS: PaperlessUiSetting[] = [ | |||||||
|     type: 'boolean', |     type: 'boolean', | ||||||
|     default: false, |     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 { | import { | ||||||
|   HttpClientTestingModule, |  | ||||||
|   HttpTestingController, |   HttpTestingController, | ||||||
|  |   HttpClientTestingModule, | ||||||
| } from '@angular/common/http/testing' | } from '@angular/common/http/testing' | ||||||
| import { RouterTestingModule } from '@angular/router/testing' | import { TestBed } from '@angular/core/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 { FormsModule, ReactiveFormsModule } from '@angular/forms' | 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 { AppModule } from '../app.module' | ||||||
|  | import { | ||||||
|  |   PaperlessUiSettings, | ||||||
|  |   SETTINGS_KEYS, | ||||||
|  | } from '../data/paperless-uisettings' | ||||||
|  | import { SettingsService } from './settings.service' | ||||||
|  |  | ||||||
| describe('SettingsService', () => { | describe('SettingsService', () => { | ||||||
|   let httpTestingController: HttpTestingController |   let httpTestingController: HttpTestingController | ||||||
|   let settingsService: SettingsService |   let settingsService: SettingsService | ||||||
|  |   let cookieService: CookieService | ||||||
|   let subscription: Subscription |   let subscription: Subscription | ||||||
|  |  | ||||||
|   const ui_settings: PaperlessUiSettings = { |   const ui_settings: PaperlessUiSettings = { | ||||||
| @@ -46,6 +50,13 @@ describe('SettingsService', () => { | |||||||
|       saved_views: { warn_on_unsaved_change: true }, |       saved_views: { warn_on_unsaved_change: true }, | ||||||
|       notes_enabled: true, |       notes_enabled: true, | ||||||
|       tour_complete: false, |       tour_complete: false, | ||||||
|  |       permissions: { | ||||||
|  |         default_owner: null, | ||||||
|  |         default_view_users: [1], | ||||||
|  |         default_view_groups: [2], | ||||||
|  |         default_edit_users: [3], | ||||||
|  |         default_edit_groups: [4], | ||||||
|  |       }, | ||||||
|     }, |     }, | ||||||
|     permissions: [], |     permissions: [], | ||||||
|   } |   } | ||||||
| @@ -53,7 +64,7 @@ describe('SettingsService', () => { | |||||||
|   beforeEach(() => { |   beforeEach(() => { | ||||||
|     TestBed.configureTestingModule({ |     TestBed.configureTestingModule({ | ||||||
|       declarations: [], |       declarations: [], | ||||||
|       providers: [SettingsService], |       providers: [SettingsService, CookieService], | ||||||
|       imports: [ |       imports: [ | ||||||
|         HttpClientTestingModule, |         HttpClientTestingModule, | ||||||
|         RouterTestingModule, |         RouterTestingModule, | ||||||
| @@ -65,6 +76,7 @@ describe('SettingsService', () => { | |||||||
|     }) |     }) | ||||||
|  |  | ||||||
|     httpTestingController = TestBed.inject(HttpTestingController) |     httpTestingController = TestBed.inject(HttpTestingController) | ||||||
|  |     cookieService = TestBed.inject(CookieService) | ||||||
|     settingsService = TestBed.inject(SettingsService) |     settingsService = TestBed.inject(SettingsService) | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
| @@ -136,7 +148,52 @@ describe('SettingsService', () => { | |||||||
|     expect(settingsService.get(SETTINGS_KEYS.THEME_COLOR)).toEqual('#000000') |     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( |     const req = httpTestingController.expectOne( | ||||||
|       `${environment.apiBaseUrl}ui_settings/` |       `${environment.apiBaseUrl}ui_settings/` | ||||||
|     ) |     ) | ||||||
|   | |||||||
| @@ -372,7 +372,7 @@ export class SettingsService { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   private getSettingRawValue(key: string): any { |   private getSettingRawValue(key: string): any { | ||||||
|     let value = null |     let value = undefined | ||||||
|     // parse key:key:key into nested object |     // parse key:key:key into nested object | ||||||
|     const keys = key.replace('general-settings:', '').split(':') |     const keys = key.replace('general-settings:', '').split(':') | ||||||
|     let settingObj = this.settings |     let settingObj = this.settings | ||||||
| @@ -389,12 +389,20 @@ export class SettingsService { | |||||||
|     let setting = SETTINGS.find((s) => s.key == key) |     let setting = SETTINGS.find((s) => s.key == key) | ||||||
|  |  | ||||||
|     if (!setting) { |     if (!setting) { | ||||||
|       return null |       return undefined | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     let value = this.getSettingRawValue(key) |     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) { |       switch (setting.type) { | ||||||
|         case 'boolean': |         case 'boolean': | ||||||
|           return JSON.parse(value) |           return JSON.parse(value) | ||||||
| @@ -424,7 +432,7 @@ export class SettingsService { | |||||||
|  |  | ||||||
|   private settingIsSet(key: string): boolean { |   private settingIsSet(key: string): boolean { | ||||||
|     let value = this.getSettingRawValue(key) |     let value = this.getSettingRawValue(key) | ||||||
|     return value != null |     return value != undefined | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   storeSettings(): Observable<any> { |   storeSettings(): Observable<any> { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 shamoon
					shamoon