mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-03 19:17:13 -05:00 
			
		
		
		
	Merge pull request #4014 from paperless-ngx/ui-perms-tweaks
Enhancement: disable / hide some UI buttons / elements if insufficient permissions, show errors
This commit is contained in:
		
						commit
						8f2715e437
					
				@ -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 {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user