mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Disable / hide some UI buttons / elements if insufficient permissions
This commit is contained in:
		| @@ -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">600</context> |           <context context-type="linenumber">648</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2526035785704676448" datatype="html"> |       <trans-unit id="2526035785704676448" datatype="html"> | ||||||
| @@ -2913,19 +2913,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">711</context> |           <context context-type="linenumber">759</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">771</context> |           <context context-type="linenumber">819</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">838</context> |           <context context-type="linenumber">886</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">901</context> |           <context context-type="linenumber">949</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1181910457994920507" datatype="html"> |       <trans-unit id="1181910457994920507" datatype="html"> | ||||||
| @@ -2940,19 +2940,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">713</context> |           <context context-type="linenumber">761</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">773</context> |           <context context-type="linenumber">821</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">840</context> |           <context context-type="linenumber">888</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">903</context> |           <context context-type="linenumber">951</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5729001209753056399" datatype="html"> |       <trans-unit id="5729001209753056399" datatype="html"> | ||||||
| @@ -4489,235 +4489,263 @@ | |||||||
|           <context context-type="linenumber">372</context> |           <context context-type="linenumber">372</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|  |       <trans-unit id="3066660568529853846" datatype="html"> | ||||||
|  |         <source>Error retrieving groups</source> | ||||||
|  |         <context-group purpose="location"> | ||||||
|  |           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||||
|  |           <context context-type="linenumber">278</context> | ||||||
|  |         </context-group> | ||||||
|  |       </trans-unit> | ||||||
|  |       <trans-unit id="1235706724900303689" datatype="html"> | ||||||
|  |         <source>Error retrieving users</source> | ||||||
|  |         <context-group purpose="location"> | ||||||
|  |           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||||
|  |           <context context-type="linenumber">287</context> | ||||||
|  |         </context-group> | ||||||
|  |       </trans-unit> | ||||||
|  |       <trans-unit id="5241231471117657636" datatype="html"> | ||||||
|  |         <source>Error retrieving mail rules</source> | ||||||
|  |         <context-group purpose="location"> | ||||||
|  |           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||||
|  |           <context context-type="linenumber">314</context> | ||||||
|  |         </context-group> | ||||||
|  |       </trans-unit> | ||||||
|  |       <trans-unit id="3178554336792037159" datatype="html"> | ||||||
|  |         <source>Error retrieving mail accounts</source> | ||||||
|  |         <context-group purpose="location"> | ||||||
|  |           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||||
|  |           <context context-type="linenumber">323</context> | ||||||
|  |         </context-group> | ||||||
|  |       </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">482</context> |           <context context-type="linenumber">530</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">584</context> |           <context context-type="linenumber">632</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">585</context> |           <context context-type="linenumber">633</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">589</context> |           <context context-type="linenumber">637</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">590</context> |           <context context-type="linenumber">638</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">609</context> |           <context context-type="linenumber">657</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">616</context> |           <context context-type="linenumber">664</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">636</context> |           <context context-type="linenumber">684</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">679</context> |           <context context-type="linenumber">727</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">686</context> |           <context context-type="linenumber">734</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">698</context> |           <context context-type="linenumber">746</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">709</context> |           <context context-type="linenumber">757</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">710</context> |           <context context-type="linenumber">758</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">719</context> |           <context context-type="linenumber">767</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">727</context> |           <context context-type="linenumber">775</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">748</context> |           <context context-type="linenumber">796</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">758</context> |           <context context-type="linenumber">806</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">769</context> |           <context context-type="linenumber">817</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">770</context> |           <context context-type="linenumber">818</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">779</context> |           <context context-type="linenumber">827</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">787</context> |           <context context-type="linenumber">835</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">813</context> |           <context context-type="linenumber">861</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">825</context> |           <context context-type="linenumber">873</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">836</context> |           <context context-type="linenumber">884</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">837</context> |           <context context-type="linenumber">885</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">846</context> |           <context context-type="linenumber">894</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">855</context> |           <context context-type="linenumber">903</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">876</context> |           <context context-type="linenumber">924</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">888</context> |           <context context-type="linenumber">936</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">899</context> |           <context context-type="linenumber">947</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">900</context> |           <context context-type="linenumber">948</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">909</context> |           <context context-type="linenumber">957</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">918</context> |           <context context-type="linenumber">966</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5101757640976222639" datatype="html"> |       <trans-unit id="5101757640976222639" datatype="html"> | ||||||
|   | |||||||
| @@ -243,7 +243,7 @@ | |||||||
|           <ng-container *appIfPermissions="{ action: PermissionAction.View, type: PermissionType.MailAccount }"> |           <ng-container *appIfPermissions="{ action: PermissionAction.View, type: PermissionType.MailAccount }"> | ||||||
|             <h4> |             <h4> | ||||||
|               <ng-container i18n>Mail accounts</ng-container> |               <ng-container i18n>Mail accounts</ng-container> | ||||||
|               <button type="button" class="btn btn-sm btn-primary ms-4" (click)="editMailAccount()"> |               <button type="button" class="btn btn-sm btn-primary ms-4" (click)="editMailAccount()" *appIfPermissions="{ action: PermissionAction.Add, type: PermissionType.MailAccount }"> | ||||||
|                 <svg class="sidebaricon me-1" fill="currentColor"> |                 <svg class="sidebaricon me-1" fill="currentColor"> | ||||||
|                   <use xlink:href="assets/bootstrap-icons.svg#plus-circle" /> |                   <use xlink:href="assets/bootstrap-icons.svg#plus-circle" /> | ||||||
|                 </svg> |                 </svg> | ||||||
| @@ -262,7 +262,7 @@ | |||||||
|  |  | ||||||
|                 <li *ngFor="let account of mailAccounts" class="list-group-item" [formGroupName]="account.id"> |                 <li *ngFor="let account of mailAccounts" class="list-group-item" [formGroupName]="account.id"> | ||||||
|                   <div class="row"> |                   <div class="row"> | ||||||
|                     <div class="col d-flex align-items-center"><button class="btn btn-link p-0" type="button" (click)="editMailAccount(account)">{{account.name}}</button></div> |                     <div class="col d-flex align-items-center"><button class="btn btn-link p-0" type="button" (click)="editMailAccount(account)" [disabled]="!permissionsService.currentUserCan(PermissionAction.Change, PermissionType.MailAccount)">{{account.name}}</button></div> | ||||||
|                     <div class="col d-flex align-items-center">{{account.imap_server}}</div> |                     <div class="col d-flex align-items-center">{{account.imap_server}}</div> | ||||||
|                     <div class="col"> |                     <div class="col"> | ||||||
|                       <div class="btn-group"> |                       <div class="btn-group"> | ||||||
| @@ -280,7 +280,7 @@ | |||||||
|           <ng-container *appIfPermissions="{ action: PermissionAction.View, type: PermissionType.MailRule }"> |           <ng-container *appIfPermissions="{ action: PermissionAction.View, type: PermissionType.MailRule }"> | ||||||
|             <h4 class="mt-4"> |             <h4 class="mt-4"> | ||||||
|               <ng-container i18n>Mail rules</ng-container> |               <ng-container i18n>Mail rules</ng-container> | ||||||
|               <button type="button" class="btn btn-sm btn-primary ms-4" (click)="editMailRule()"> |               <button type="button" class="btn btn-sm btn-primary ms-4" (click)="editMailRule()" *appIfPermissions="{ action: PermissionAction.Add, type: PermissionType.MailRule }"> | ||||||
|                 <svg class="sidebaricon me-1" fill="currentColor"> |                 <svg class="sidebaricon me-1" fill="currentColor"> | ||||||
|                   <use xlink:href="assets/bootstrap-icons.svg#plus-circle" /> |                   <use xlink:href="assets/bootstrap-icons.svg#plus-circle" /> | ||||||
|                 </svg> |                 </svg> | ||||||
| @@ -299,7 +299,7 @@ | |||||||
|  |  | ||||||
|                 <li *ngFor="let rule of mailRules" class="list-group-item" [formGroupName]="rule.id"> |                 <li *ngFor="let rule of mailRules" class="list-group-item" [formGroupName]="rule.id"> | ||||||
|                   <div class="row"> |                   <div class="row"> | ||||||
|                     <div class="col d-flex align-items-center"><button class="btn btn-link p-0" type="button" (click)="editMailRule(rule)">{{rule.name}}</button></div> |                     <div class="col d-flex align-items-center"><button class="btn btn-link p-0" type="button" (click)="editMailRule(rule)" [disabled]="!permissionsService.currentUserCan(PermissionAction.Change, PermissionType.MailRule)">{{rule.name}}</button></div> | ||||||
|                     <div class="col d-flex align-items-center">{{(mailAccountService.getCached(rule.account) | async)?.name}}</div> |                     <div class="col d-flex align-items-center">{{(mailAccountService.getCached(rule.account) | async)?.name}}</div> | ||||||
|                     <div class="col"> |                     <div class="col"> | ||||||
|                       <div class="btn-group"> |                       <div class="btn-group"> | ||||||
| @@ -323,7 +323,7 @@ | |||||||
|       </ng-template> |       </ng-template> | ||||||
|     </li> |     </li> | ||||||
|  |  | ||||||
|     <li [ngbNavItem]="SettingsNavIDs.UsersGroups" *appIfPermissions="{ action: PermissionAction.Add, type: PermissionType.User }" (mouseover)="maybeInitializeTab(SettingsNavIDs.UsersGroups)" (focusin)="maybeInitializeTab(SettingsNavIDs.UsersGroups)"> |     <li [ngbNavItem]="SettingsNavIDs.UsersGroups" *appIfPermissions="{ action: PermissionAction.View, type: PermissionType.User }" (mouseover)="maybeInitializeTab(SettingsNavIDs.UsersGroups)" (focusin)="maybeInitializeTab(SettingsNavIDs.UsersGroups)"> | ||||||
|       <a ngbNavLink i18n>Users & Groups</a> |       <a ngbNavLink i18n>Users & Groups</a> | ||||||
|       <ng-template ngbNavContent> |       <ng-template ngbNavContent> | ||||||
|  |  | ||||||
| @@ -334,7 +334,7 @@ | |||||||
|             <svg class="sidebaricon me-1" fill="currentColor"> |             <svg class="sidebaricon me-1" fill="currentColor"> | ||||||
|               <use xlink:href="assets/bootstrap-icons.svg#plus-circle" /> |               <use xlink:href="assets/bootstrap-icons.svg#plus-circle" /> | ||||||
|             </svg> |             </svg> | ||||||
|             <ng-container i18n>Add User</ng-container> |             <ng-container *appIfPermissions="{ action: PermissionAction.Add, type: PermissionType.User }" i18n>Add User</ng-container> | ||||||
|           </button> |           </button> | ||||||
|         </h4> |         </h4> | ||||||
|         <ul class="list-group" formGroupName="usersGroup"> |         <ul class="list-group" formGroupName="usersGroup"> | ||||||
| @@ -350,13 +350,13 @@ | |||||||
|  |  | ||||||
|           <li *ngFor="let user of users" class="list-group-item" [formGroupName]="user.id"> |           <li *ngFor="let user of users" class="list-group-item" [formGroupName]="user.id"> | ||||||
|             <div class="row"> |             <div class="row"> | ||||||
|               <div class="col d-flex align-items-center"><button class="btn btn-link p-0" type="button" (click)="editUser(user)">{{user.username}}</button></div> |               <div class="col d-flex align-items-center"><button class="btn btn-link p-0" type="button" (click)="editUser(user)" [disabled]="!permissionsService.currentUserCan(PermissionAction.Change, PermissionType.User)">{{user.username}}</button></div> | ||||||
|               <div class="col d-flex align-items-center">{{user.first_name}} {{user.last_name}}</div> |               <div class="col d-flex align-items-center">{{user.first_name}} {{user.last_name}}</div> | ||||||
|               <div class="col d-flex align-items-center">{{user.groups?.map(getGroupName, this).join(', ')}}</div> |               <div class="col d-flex align-items-center">{{user.groups?.map(getGroupName, this).join(', ')}}</div> | ||||||
|               <div class="col"> |               <div class="col"> | ||||||
|                 <div class="btn-group"> |                 <div class="btn-group"> | ||||||
|                   <button class="btn btn-sm btn-primary" type="button" (click)="editUser(user)" i18n>Edit</button> |                   <button class="btn btn-sm btn-primary" type="button" (click)="editUser(user)" *appIfPermissions="{ action: PermissionAction.Change, type: PermissionType.User }" i18n>Edit</button> | ||||||
|                   <button class="btn btn-sm btn-outline-danger" type="button" (click)="deleteUser(user)" i18n>Delete</button> |                   <button class="btn btn-sm btn-outline-danger" type="button" (click)="deleteUser(user)" *appIfPermissions="{ action: PermissionAction.Delete, type: PermissionType.User }" i18n>Delete</button> | ||||||
|                 </div> |                 </div> | ||||||
|               </div> |               </div> | ||||||
|             </div> |             </div> | ||||||
| @@ -369,7 +369,7 @@ | |||||||
|             <svg class="sidebaricon me-1" fill="currentColor"> |             <svg class="sidebaricon me-1" fill="currentColor"> | ||||||
|               <use xlink:href="assets/bootstrap-icons.svg#plus-circle" /> |               <use xlink:href="assets/bootstrap-icons.svg#plus-circle" /> | ||||||
|             </svg> |             </svg> | ||||||
|             <ng-container i18n>Add Group</ng-container> |             <ng-container *appIfPermissions="{ action: PermissionAction.Add, type: PermissionType.Group }" i18n>Add Group</ng-container> | ||||||
|           </button> |           </button> | ||||||
|         </h4> |         </h4> | ||||||
|         <ul *ngIf="groups.length > 0" class="list-group" formGroupName="groupsGroup"> |         <ul *ngIf="groups.length > 0" class="list-group" formGroupName="groupsGroup"> | ||||||
| @@ -385,13 +385,13 @@ | |||||||
|  |  | ||||||
|           <li *ngFor="let group of groups" class="list-group-item" [formGroupName]="group.id"> |           <li *ngFor="let group of groups" class="list-group-item" [formGroupName]="group.id"> | ||||||
|             <div class="row"> |             <div class="row"> | ||||||
|               <div class="col d-flex align-items-center"><button class="btn btn-link p-0" type="button" (click)="editGroup(group)">{{group.name}}</button></div> |               <div class="col d-flex align-items-center"><button class="btn btn-link p-0" type="button" (click)="editGroup(group)" [disabled]="!permissionsService.currentUserCan(PermissionAction.Change, PermissionType.Group)">{{group.name}}</button></div> | ||||||
|               <div class="col"></div> |               <div class="col"></div> | ||||||
|               <div class="col"></div> |               <div class="col"></div> | ||||||
|               <div class="col"> |               <div class="col"> | ||||||
|                 <div class="btn-group"> |                 <div class="btn-group"> | ||||||
|                   <button class="btn btn-sm btn-primary" type="button" (click)="editGroup(group)" i18n>Edit</button> |                   <button class="btn btn-sm btn-primary" type="button" (click)="editGroup(group)" *appIfPermissions="{ action: PermissionAction.Change, type: PermissionType.Group }" i18n>Edit</button> | ||||||
|                   <button class="btn btn-sm btn-outline-danger" type="button" (click)="deleteGroup(group)" i18n>Delete</button> |                   <button class="btn btn-sm btn-outline-danger" type="button" (click)="deleteGroup(group)" *appIfPermissions="{ action: PermissionAction.Delete, type: PermissionType.Group }" i18n>Delete</button> | ||||||
|                 </div> |                 </div> | ||||||
|               </div> |               </div> | ||||||
|             </div> |             </div> | ||||||
|   | |||||||
| @@ -116,52 +116,66 @@ describe('SettingsComponent', () => { | |||||||
|     jest |     jest | ||||||
|       .spyOn(permissionsService, 'currentUserOwnsObject') |       .spyOn(permissionsService, 'currentUserOwnsObject') | ||||||
|       .mockReturnValue(true) |       .mockReturnValue(true) | ||||||
|     jest.spyOn(userService, 'listAll').mockReturnValue( |  | ||||||
|       of({ |  | ||||||
|         all: users.map((u) => u.id), |  | ||||||
|         count: users.length, |  | ||||||
|         results: users.concat([]), |  | ||||||
|       }) |  | ||||||
|     ) |  | ||||||
|     groupService = TestBed.inject(GroupService) |     groupService = TestBed.inject(GroupService) | ||||||
|     jest.spyOn(groupService, 'listAll').mockReturnValue( |  | ||||||
|       of({ |  | ||||||
|         all: groups.map((g) => g.id), |  | ||||||
|         count: groups.length, |  | ||||||
|         results: groups.concat([]), |  | ||||||
|       }) |  | ||||||
|     ) |  | ||||||
|     savedViewService = TestBed.inject(SavedViewService) |     savedViewService = TestBed.inject(SavedViewService) | ||||||
|     jest.spyOn(savedViewService, 'listAll').mockReturnValue( |  | ||||||
|       of({ |  | ||||||
|         all: savedViews.map((v) => v.id), |  | ||||||
|         count: savedViews.length, |  | ||||||
|         results: (savedViews as PaperlessSavedView[]).concat([]), |  | ||||||
|       }) |  | ||||||
|     ) |  | ||||||
|     mailAccountService = TestBed.inject(MailAccountService) |     mailAccountService = TestBed.inject(MailAccountService) | ||||||
|     jest.spyOn(mailAccountService, 'listAll').mockReturnValue( |  | ||||||
|       of({ |  | ||||||
|         all: mailAccounts.map((a) => a.id), |  | ||||||
|         count: mailAccounts.length, |  | ||||||
|         results: (mailAccounts as PaperlessMailAccount[]).concat([]), |  | ||||||
|       }) |  | ||||||
|     ) |  | ||||||
|     mailRuleService = TestBed.inject(MailRuleService) |     mailRuleService = TestBed.inject(MailRuleService) | ||||||
|     jest.spyOn(mailRuleService, 'listAll').mockReturnValue( |   }) | ||||||
|       of({ |  | ||||||
|         all: mailRules.map((r) => r.id), |   function completeSetup(excludeService = null) { | ||||||
|         count: mailRules.length, |     if (excludeService !== userService) { | ||||||
|         results: (mailRules as PaperlessMailRule[]).concat([]), |       jest.spyOn(userService, 'listAll').mockReturnValue( | ||||||
|       }) |         of({ | ||||||
|     ) |           all: users.map((u) => u.id), | ||||||
|  |           count: users.length, | ||||||
|  |           results: users.concat([]), | ||||||
|  |         }) | ||||||
|  |       ) | ||||||
|  |     } | ||||||
|  |     if (excludeService !== groupService) { | ||||||
|  |       jest.spyOn(groupService, 'listAll').mockReturnValue( | ||||||
|  |         of({ | ||||||
|  |           all: groups.map((g) => g.id), | ||||||
|  |           count: groups.length, | ||||||
|  |           results: groups.concat([]), | ||||||
|  |         }) | ||||||
|  |       ) | ||||||
|  |     } | ||||||
|  |     if (excludeService !== savedViewService) { | ||||||
|  |       jest.spyOn(savedViewService, 'listAll').mockReturnValue( | ||||||
|  |         of({ | ||||||
|  |           all: savedViews.map((v) => v.id), | ||||||
|  |           count: savedViews.length, | ||||||
|  |           results: (savedViews as PaperlessSavedView[]).concat([]), | ||||||
|  |         }) | ||||||
|  |       ) | ||||||
|  |     } | ||||||
|  |     if (excludeService !== mailAccountService) { | ||||||
|  |       jest.spyOn(mailAccountService, 'listAll').mockReturnValue( | ||||||
|  |         of({ | ||||||
|  |           all: mailAccounts.map((a) => a.id), | ||||||
|  |           count: mailAccounts.length, | ||||||
|  |           results: (mailAccounts as PaperlessMailAccount[]).concat([]), | ||||||
|  |         }) | ||||||
|  |       ) | ||||||
|  |     } | ||||||
|  |     if (excludeService !== mailRuleService) { | ||||||
|  |       jest.spyOn(mailRuleService, 'listAll').mockReturnValue( | ||||||
|  |         of({ | ||||||
|  |           all: mailRules.map((r) => r.id), | ||||||
|  |           count: mailRules.length, | ||||||
|  |           results: (mailRules as PaperlessMailRule[]).concat([]), | ||||||
|  |         }) | ||||||
|  |       ) | ||||||
|  |     } | ||||||
|  |  | ||||||
|     fixture = TestBed.createComponent(SettingsComponent) |     fixture = TestBed.createComponent(SettingsComponent) | ||||||
|     component = fixture.componentInstance |     component = fixture.componentInstance | ||||||
|     fixture.detectChanges() |     fixture.detectChanges() | ||||||
|   }) |   } | ||||||
|  |  | ||||||
|   it('should support tabbed settings & change URL, prevent navigation if dirty confirmation rejected', () => { |   it('should support tabbed settings & change URL, prevent navigation if dirty confirmation rejected', () => { | ||||||
|  |     completeSetup() | ||||||
|     const navigateSpy = jest.spyOn(router, 'navigate') |     const navigateSpy = jest.spyOn(router, 'navigate') | ||||||
|     const tabButtons = fixture.debugElement.queryAll(By.directive(NgbNavLink)) |     const tabButtons = fixture.debugElement.queryAll(By.directive(NgbNavLink)) | ||||||
|     tabButtons[1].nativeElement.dispatchEvent(new MouseEvent('click')) |     tabButtons[1].nativeElement.dispatchEvent(new MouseEvent('click')) | ||||||
| @@ -187,6 +201,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should support direct link to tab by URL, scroll if needed', () => { |   it('should support direct link to tab by URL, scroll if needed', () => { | ||||||
|  |     completeSetup() | ||||||
|     jest |     jest | ||||||
|       .spyOn(activatedRoute, 'paramMap', 'get') |       .spyOn(activatedRoute, 'paramMap', 'get') | ||||||
|       .mockReturnValue(of(convertToParamMap({ section: 'mail' }))) |       .mockReturnValue(of(convertToParamMap({ section: 'mail' }))) | ||||||
| @@ -199,6 +214,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should lazy load tab data', () => { |   it('should lazy load tab data', () => { | ||||||
|  |     completeSetup() | ||||||
|     const tabButtons = fixture.debugElement.queryAll(By.directive(NgbNavLink)) |     const tabButtons = fixture.debugElement.queryAll(By.directive(NgbNavLink)) | ||||||
|  |  | ||||||
|     expect(component.savedViews).toBeUndefined() |     expect(component.savedViews).toBeUndefined() | ||||||
| @@ -221,6 +237,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should support save saved views, show error', () => { |   it('should support save saved views, show error', () => { | ||||||
|  |     completeSetup() | ||||||
|     component.maybeInitializeTab(3) // SavedViews |     component.maybeInitializeTab(3) // SavedViews | ||||||
|  |  | ||||||
|     const toastErrorSpy = jest.spyOn(toastService, 'showError') |     const toastErrorSpy = jest.spyOn(toastService, 'showError') | ||||||
| @@ -248,6 +265,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should support save local settings updating appearance settings and calling API, show error', () => { |   it('should support save local settings updating appearance settings and calling API, show error', () => { | ||||||
|  |     completeSetup() | ||||||
|     const toastErrorSpy = jest.spyOn(toastService, 'showError') |     const toastErrorSpy = jest.spyOn(toastService, 'showError') | ||||||
|     const toastSpy = jest.spyOn(toastService, 'show') |     const toastSpy = jest.spyOn(toastService, 'show') | ||||||
|     const storeSpy = jest.spyOn(settingsService, 'storeSettings') |     const storeSpy = jest.spyOn(settingsService, 'storeSettings') | ||||||
| @@ -275,6 +293,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should offer reload if settings changes require', () => { |   it('should offer reload if settings changes require', () => { | ||||||
|  |     completeSetup() | ||||||
|     let toast: Toast |     let toast: Toast | ||||||
|     toastService.getToasts().subscribe((t) => (toast = t[0])) |     toastService.getToasts().subscribe((t) => (toast = t[0])) | ||||||
|     component.initialize(true) // reset |     component.initialize(true) // reset | ||||||
| @@ -288,6 +307,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should allow setting theme color, visually apply change immediately but not save', () => { |   it('should allow setting theme color, visually apply change immediately but not save', () => { | ||||||
|  |     completeSetup() | ||||||
|     const appearanceSpy = jest.spyOn( |     const appearanceSpy = jest.spyOn( | ||||||
|       settingsService, |       settingsService, | ||||||
|       'updateAppearanceSettings' |       'updateAppearanceSettings' | ||||||
| @@ -304,6 +324,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should support delete saved view', () => { |   it('should support delete saved view', () => { | ||||||
|  |     completeSetup() | ||||||
|     component.maybeInitializeTab(3) // SavedViews |     component.maybeInitializeTab(3) // SavedViews | ||||||
|     const toastSpy = jest.spyOn(toastService, 'showInfo') |     const toastSpy = jest.spyOn(toastService, 'showInfo') | ||||||
|     const deleteSpy = jest.spyOn(savedViewService, 'delete') |     const deleteSpy = jest.spyOn(savedViewService, 'delete') | ||||||
| @@ -316,6 +337,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should support edit / create user, show error if needed', () => { |   it('should support edit / create user, show error if needed', () => { | ||||||
|  |     completeSetup() | ||||||
|     let modal: NgbModalRef |     let modal: NgbModalRef | ||||||
|     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) |     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) | ||||||
|     component.editUser(users[0]) |     component.editUser(users[0]) | ||||||
| @@ -332,6 +354,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should support delete user, show error if needed', () => { |   it('should support delete user, show error if needed', () => { | ||||||
|  |     completeSetup() | ||||||
|     let modal: NgbModalRef |     let modal: NgbModalRef | ||||||
|     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) |     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) | ||||||
|     component.deleteUser(users[0]) |     component.deleteUser(users[0]) | ||||||
| @@ -352,6 +375,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should logout current user if password changed, after delay', fakeAsync(() => { |   it('should logout current user if password changed, after delay', fakeAsync(() => { | ||||||
|  |     completeSetup() | ||||||
|     let modal: NgbModalRef |     let modal: NgbModalRef | ||||||
|     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) |     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) | ||||||
|     component.editUser(users[0]) |     component.editUser(users[0]) | ||||||
| @@ -371,6 +395,7 @@ describe('SettingsComponent', () => { | |||||||
|   })) |   })) | ||||||
|  |  | ||||||
|   it('should support edit / create group, show error if needed', () => { |   it('should support edit / create group, show error if needed', () => { | ||||||
|  |     completeSetup() | ||||||
|     let modal: NgbModalRef |     let modal: NgbModalRef | ||||||
|     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) |     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) | ||||||
|     component.editGroup(groups[0]) |     component.editGroup(groups[0]) | ||||||
| @@ -386,6 +411,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should support delete group, show error if needed', () => { |   it('should support delete group, show error if needed', () => { | ||||||
|  |     completeSetup() | ||||||
|     let modal: NgbModalRef |     let modal: NgbModalRef | ||||||
|     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) |     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) | ||||||
|     component.deleteGroup(users[0]) |     component.deleteGroup(users[0]) | ||||||
| @@ -406,12 +432,71 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should get group name', () => { |   it('should get group name', () => { | ||||||
|  |     completeSetup() | ||||||
|     component.maybeInitializeTab(5) // UsersGroups |     component.maybeInitializeTab(5) // UsersGroups | ||||||
|     expect(component.getGroupName(1)).toEqual(groups[0].name) |     expect(component.getGroupName(1)).toEqual(groups[0].name) | ||||||
|     expect(component.getGroupName(11)).toEqual('') |     expect(component.getGroupName(11)).toEqual('') | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|  |   it('should show errors on load if load mailAccounts failure', () => { | ||||||
|  |     const toastErrorSpy = jest.spyOn(toastService, 'showError') | ||||||
|  |     jest | ||||||
|  |       .spyOn(mailAccountService, 'listAll') | ||||||
|  |       .mockImplementation(() => | ||||||
|  |         throwError(() => new Error('failed to load mail accounts')) | ||||||
|  |       ) | ||||||
|  |     completeSetup(mailAccountService) | ||||||
|  |     const tabButtons = fixture.debugElement.queryAll(By.directive(NgbNavLink)) | ||||||
|  |     tabButtons[3].nativeElement.dispatchEvent(new MouseEvent('click')) // mail tab | ||||||
|  |     fixture.detectChanges() | ||||||
|  |     expect(toastErrorSpy).toBeCalled() | ||||||
|  |   }) | ||||||
|  |  | ||||||
|  |   it('should show errors on load if load mailRules failure', () => { | ||||||
|  |     const toastErrorSpy = jest.spyOn(toastService, 'showError') | ||||||
|  |     jest | ||||||
|  |       .spyOn(mailRuleService, 'listAll') | ||||||
|  |       .mockImplementation(() => | ||||||
|  |         throwError(() => new Error('failed to load mail rules')) | ||||||
|  |       ) | ||||||
|  |     completeSetup(mailRuleService) | ||||||
|  |     const tabButtons = fixture.debugElement.queryAll(By.directive(NgbNavLink)) | ||||||
|  |     tabButtons[3].nativeElement.dispatchEvent(new MouseEvent('click')) // mail tab | ||||||
|  |     fixture.detectChanges() | ||||||
|  |     // tabButtons[4].nativeElement.dispatchEvent(new MouseEvent('click')) | ||||||
|  |     expect(toastErrorSpy).toBeCalled() | ||||||
|  |   }) | ||||||
|  |  | ||||||
|  |   it('should show errors on load if load users failure', () => { | ||||||
|  |     const toastErrorSpy = jest.spyOn(toastService, 'showError') | ||||||
|  |     jest | ||||||
|  |       .spyOn(userService, 'listAll') | ||||||
|  |       .mockImplementation(() => | ||||||
|  |         throwError(() => new Error('failed to load users')) | ||||||
|  |       ) | ||||||
|  |     completeSetup(userService) | ||||||
|  |     const tabButtons = fixture.debugElement.queryAll(By.directive(NgbNavLink)) | ||||||
|  |     tabButtons[4].nativeElement.dispatchEvent(new MouseEvent('click')) // users tab | ||||||
|  |     fixture.detectChanges() | ||||||
|  |     expect(toastErrorSpy).toBeCalled() | ||||||
|  |   }) | ||||||
|  |  | ||||||
|  |   it('should show errors on load if load groups failure', () => { | ||||||
|  |     const toastErrorSpy = jest.spyOn(toastService, 'showError') | ||||||
|  |     jest | ||||||
|  |       .spyOn(groupService, 'listAll') | ||||||
|  |       .mockImplementation(() => | ||||||
|  |         throwError(() => new Error('failed to load groups')) | ||||||
|  |       ) | ||||||
|  |     completeSetup(groupService) | ||||||
|  |     const tabButtons = fixture.debugElement.queryAll(By.directive(NgbNavLink)) | ||||||
|  |     tabButtons[4].nativeElement.dispatchEvent(new MouseEvent('click')) // users tab | ||||||
|  |     fixture.detectChanges() | ||||||
|  |     expect(toastErrorSpy).toBeCalled() | ||||||
|  |   }) | ||||||
|  |  | ||||||
|   it('should support edit / create mail account, show error if needed', () => { |   it('should support edit / create mail account, show error if needed', () => { | ||||||
|  |     completeSetup() | ||||||
|     let modal: NgbModalRef |     let modal: NgbModalRef | ||||||
|     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) |     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) | ||||||
|     component.editMailAccount(mailAccounts[0] as PaperlessMailAccount) |     component.editMailAccount(mailAccounts[0] as PaperlessMailAccount) | ||||||
| @@ -427,6 +512,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should support delete mail account, show error if needed', () => { |   it('should support delete mail account, show error if needed', () => { | ||||||
|  |     completeSetup() | ||||||
|     let modal: NgbModalRef |     let modal: NgbModalRef | ||||||
|     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) |     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) | ||||||
|     component.deleteMailAccount(mailAccounts[0] as PaperlessMailAccount) |     component.deleteMailAccount(mailAccounts[0] as PaperlessMailAccount) | ||||||
| @@ -447,6 +533,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should support edit / create mail rule, show error if needed', () => { |   it('should support edit / create mail rule, show error if needed', () => { | ||||||
|  |     completeSetup() | ||||||
|     let modal: NgbModalRef |     let modal: NgbModalRef | ||||||
|     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) |     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) | ||||||
|     component.editMailRule(mailRules[0] as PaperlessMailRule) |     component.editMailRule(mailRules[0] as PaperlessMailRule) | ||||||
| @@ -462,6 +549,7 @@ describe('SettingsComponent', () => { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   it('should support delete mail rule, show error if needed', () => { |   it('should support delete mail rule, show error if needed', () => { | ||||||
|  |     completeSetup() | ||||||
|     let modal: NgbModalRef |     let modal: NgbModalRef | ||||||
|     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) |     modalService.activeInstances.subscribe((refs) => (modal = refs[0])) | ||||||
|     component.deleteMailRule(mailRules[0] as PaperlessMailRule) |     component.deleteMailRule(mailRules[0] as PaperlessMailRule) | ||||||
|   | |||||||
| @@ -146,7 +146,7 @@ export class SettingsComponent | |||||||
|     private groupsService: GroupService, |     private groupsService: GroupService, | ||||||
|     private router: Router, |     private router: Router, | ||||||
|     private modalService: NgbModal, |     private modalService: NgbModal, | ||||||
|     private permissionsService: PermissionsService |     public permissionsService: PermissionsService | ||||||
|   ) { |   ) { | ||||||
|     super() |     super() | ||||||
|     this.settings.settingsSaved.subscribe(() => { |     this.settings.settingsSaved.subscribe(() => { | ||||||
| @@ -259,25 +259,73 @@ export class SettingsComponent | |||||||
|       navID == SettingsNavIDs.UsersGroups && |       navID == SettingsNavIDs.UsersGroups && | ||||||
|       (!this.users || !this.groups) |       (!this.users || !this.groups) | ||||||
|     ) { |     ) { | ||||||
|       this.usersService.listAll().subscribe((r) => { |       this.usersService | ||||||
|         this.users = r.results |         .listAll() | ||||||
|         this.groupsService.listAll().subscribe((r) => { |         .pipe(first()) | ||||||
|           this.groups = r.results |         .subscribe({ | ||||||
|           this.initialize(false) |           next: (r) => { | ||||||
|  |             this.users = r.results | ||||||
|  |             this.groupsService | ||||||
|  |               .listAll() | ||||||
|  |               .pipe(first()) | ||||||
|  |               .subscribe({ | ||||||
|  |                 next: (r) => { | ||||||
|  |                   this.groups = r.results | ||||||
|  |                   this.initialize(false) | ||||||
|  |                 }, | ||||||
|  |                 error: (e) => { | ||||||
|  |                   this.toastService.showError( | ||||||
|  |                     $localize`Error retrieving groups`, | ||||||
|  |                     10000, | ||||||
|  |                     JSON.stringify(e) | ||||||
|  |                   ) | ||||||
|  |                 }, | ||||||
|  |               }) | ||||||
|  |           }, | ||||||
|  |           error: (e) => { | ||||||
|  |             this.toastService.showError( | ||||||
|  |               $localize`Error retrieving users`, | ||||||
|  |               10000, | ||||||
|  |               JSON.stringify(e) | ||||||
|  |             ) | ||||||
|  |           }, | ||||||
|         }) |         }) | ||||||
|       }) |  | ||||||
|     } else if ( |     } else if ( | ||||||
|       navID == SettingsNavIDs.Mail && |       navID == SettingsNavIDs.Mail && | ||||||
|       (!this.mailAccounts || !this.mailRules) |       (!this.mailAccounts || !this.mailRules) | ||||||
|     ) { |     ) { | ||||||
|       this.mailAccountService.listAll().subscribe((r) => { |       this.mailAccountService | ||||||
|         this.mailAccounts = r.results |         .listAll() | ||||||
|  |         .pipe(first()) | ||||||
|  |         .subscribe({ | ||||||
|  |           next: (r) => { | ||||||
|  |             this.mailAccounts = r.results | ||||||
|  |  | ||||||
|         this.mailRuleService.listAll().subscribe((r) => { |             this.mailRuleService | ||||||
|           this.mailRules = r.results |               .listAll() | ||||||
|           this.initialize(false) |               .pipe(first()) | ||||||
|  |               .subscribe({ | ||||||
|  |                 next: (r) => { | ||||||
|  |                   this.mailRules = r.results | ||||||
|  |                   this.initialize(false) | ||||||
|  |                 }, | ||||||
|  |                 error: (e) => { | ||||||
|  |                   this.toastService.showError( | ||||||
|  |                     $localize`Error retrieving mail rules`, | ||||||
|  |                     10000, | ||||||
|  |                     JSON.stringify(e) | ||||||
|  |                   ) | ||||||
|  |                 }, | ||||||
|  |               }) | ||||||
|  |           }, | ||||||
|  |           error: (e) => { | ||||||
|  |             this.toastService.showError( | ||||||
|  |               $localize`Error retrieving mail accounts`, | ||||||
|  |               10000, | ||||||
|  |               JSON.stringify(e) | ||||||
|  |             ) | ||||||
|  |           }, | ||||||
|         }) |         }) | ||||||
|       }) |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import { Injectable } from '@angular/core' | import { Injectable } from '@angular/core' | ||||||
| import { Subject, zip } from 'rxjs' | import { Subject } from 'rxjs' | ||||||
|  |  | ||||||
| export interface Toast { | export interface Toast { | ||||||
|   title: string |   title: string | ||||||
|   | |||||||
| @@ -80,6 +80,9 @@ $form-check-radio-checked-bg-image-dark: url("data:image/svg+xml,<svg xmlns='htt | |||||||
|   .btn { |   .btn { | ||||||
|     --bs-btn-disabled-opacity: 0.35; |     --bs-btn-disabled-opacity: 0.35; | ||||||
|   } |   } | ||||||
|  |   .btn.btn-link { | ||||||
|  |     --bs-btn-disabled-opacity: 0.85; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   .btn-primary { |   .btn-primary { | ||||||
|     &:hover, &:focus, &.active, &:active { |     &:hover, &:focus, &.active, &:active { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 shamoon
					shamoon