mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Merge branch 'dev'
This commit is contained in:
		
							
								
								
									
										2
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							| @@ -208,7 +208,7 @@ jobs: | ||||
|           tag_name: ng-${{ steps.get_version.outputs.version }} | ||||
|           release_name: Paperless-ng ${{ steps.get_version.outputs.version }} | ||||
|           draft: false | ||||
|           prerelease: true | ||||
|           prerelease: false | ||||
|           body: | | ||||
|             For a complete list of changes, see the changelog at https://paperless-ng.readthedocs.io/en/latest/changelog.html. | ||||
|       - | ||||
|   | ||||
							
								
								
									
										5
									
								
								crowdin.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								crowdin.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| files: | ||||
|   - source: /src/locale/en-us/LC_MESSAGES/django.po | ||||
|     translation: /src/locale/%two_letters_code%/LC_MESSAGES/django.po | ||||
|   - source: /src-ui/messages.xlf | ||||
|     translation: /src-ui/src/locale/messages.%two_letters_code%.xlf | ||||
| @@ -79,7 +79,11 @@ initialize() { | ||||
| 		fi | ||||
| 	done | ||||
|  | ||||
| 	echo "creating directory /tmp/paperless" | ||||
| 	mkdir -p /tmp/paperless | ||||
|  | ||||
| 	chown -R paperless:paperless ../ | ||||
| 	chown -R paperless:paperless /tmp/paperless | ||||
|  | ||||
| 	migrations | ||||
|  | ||||
|   | ||||
| @@ -20,6 +20,8 @@ Options available to any installation of paperless: | ||||
|     metadata to a specific folder. You may import your documents into a | ||||
|     fresh instance of paperless again or store your documents in another | ||||
|     DMS with this export. | ||||
| *   The document exporter is also able to update an already existing export. | ||||
|     Therefore, incremental backups with ``rsync`` are entirely possible. | ||||
|  | ||||
| Options available to docker installations: | ||||
|  | ||||
| @@ -88,10 +90,28 @@ B.  If you built the image yourself, do the following: | ||||
|         $ docker-compose build | ||||
|         $ docker-compose up | ||||
|  | ||||
| Running `docker-compose up` will also apply any new database migrations. | ||||
| Running ``docker-compose up`` will also apply any new database migrations. | ||||
| If you see everything working, press CTRL+C once to gracefully stop paperless. | ||||
| Then you can start paperless-ng with ``-d`` to have it run in the background. | ||||
|  | ||||
|     .. note:: | ||||
|  | ||||
|         In version 0.9.14, the update process was changed. In 0.9.13 and earlier, the | ||||
|         docker-compose files specified exact versions and pull won't automatically | ||||
|         update to newer versions. In order to enable updates as described above, either | ||||
|         get the new ``docker-compose.yml`` file from `here <https://github.com/jonaswinkler/paperless-ng/tree/master/docker/compose>`_ | ||||
|         or edit the ``docker-compose.yml`` file, find the line that says | ||||
|          | ||||
|             .. code:: | ||||
|  | ||||
|                 image: jonaswinkler/paperless-ng:0.9.x | ||||
|          | ||||
|         and replace the version with ``latest``: | ||||
|  | ||||
|             .. code:: | ||||
|  | ||||
|                 image: jonaswinkler/paperless-ng:latest | ||||
|          | ||||
| Bare Metal Route | ||||
| ================ | ||||
|  | ||||
| @@ -192,7 +212,12 @@ backup or migration to another DMS. | ||||
|  | ||||
| .. code:: | ||||
|  | ||||
|     document_exporter target | ||||
|     document_exporter target [-c] [-f] [-d] | ||||
|  | ||||
|     optional arguments: | ||||
|     -c, --compare-checksums | ||||
|     -f, --use-filename-format | ||||
|     -d, --delete | ||||
|      | ||||
| ``target`` is a folder to which the data gets written. This includes documents, | ||||
| thumbnails and a ``manifest.json`` file. The manifest contains all metadata from | ||||
| @@ -202,6 +227,24 @@ When you use the provided docker compose script, specify ``../export`` as the | ||||
| target. This path inside the container is automatically mounted on your host on | ||||
| the folder ``export``. | ||||
|  | ||||
| If the target directory already exists and contains files, paperless will assume | ||||
| that the contents of the export directory are a previous export and will attempt | ||||
| to update the previous export. Paperless will only export changed and added files. | ||||
| Paperless determines whether a file has changed by inspecting the file attributes | ||||
| "date/time modified" and "size". If that does not work out for you, specify | ||||
| ``--compare-checksums`` and paperless will attempt to compare file checksums instead. | ||||
| This is slower. | ||||
|  | ||||
| Paperless will not remove any existing files in the export directory. If you want | ||||
| paperless to also remove files that do not belong to the current export such as files | ||||
| from deleted documents, specify ``--delete``. Be careful when pointing paperless to | ||||
| a directory that already contains other files. | ||||
|  | ||||
| The filenames generated by this command follow the format | ||||
| ``[date created] [correspondent] [title].[extension]``. | ||||
| If you want paperless to use ``PAPERLESS_FILENAME_FORMAT`` for exported filenames | ||||
| instead, specify ``--use-filename-format``. | ||||
|  | ||||
|  | ||||
| .. _utilities-importer: | ||||
|  | ||||
|   | ||||
| @@ -5,6 +5,29 @@ | ||||
| Changelog | ||||
| ********* | ||||
|  | ||||
| paperless-ng 1.0.0 | ||||
| ################## | ||||
|  | ||||
| Nothing special about this release, but since there are relatively few bug reports coming in, I think that this is reasonably stable. | ||||
|  | ||||
| * Document export | ||||
|  | ||||
|   * The document exporter has been rewritten to support updating an already existing export in place. | ||||
|     This enables incremental backups with ``rsync``. | ||||
|   * The document exporter supports naming exported files according to ``PAPERLESS_FILENAME_FORMAT``. | ||||
|   * The document exporter locks the media directory and the database during execution to ensure that | ||||
|     the resulting export is consistent. | ||||
|   * See the :ref:`updated documentation <utilities-exporter>` for more details. | ||||
|  | ||||
| * Other changes and additions | ||||
|  | ||||
|   * Added a language selector to the settings. | ||||
|   * Added date format options to the settings. | ||||
|   * Range selection with shift clicking is now possible in the document list. | ||||
|   * Filtering correspondent, type and tag management pages by name. | ||||
|   * Focus "Name" field in dialogs by default. | ||||
|  | ||||
|  | ||||
| paperless-ng 0.9.14 | ||||
| ################### | ||||
|  | ||||
|   | ||||
| @@ -394,53 +394,60 @@ | ||||
|           <context context-type="linenumber">2</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="ddb40946e790522301687ecddb9ce1cb8ad40dd1" datatype="html"> | ||||
|         <source>Filter by:</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">8</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="cff1428d10d59d14e45edec3c735a27b5482db59" datatype="html"> | ||||
|         <source>Name</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">13</context> | ||||
|           <context context-type="linenumber">9</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8fa4d523f7b91df4390120b85ed0406138273e1a" datatype="html"> | ||||
|         <source>Color</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">14</context> | ||||
|           <context context-type="linenumber">20</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="d0c4488f742efeba0915e90e285a022da813deff" datatype="html"> | ||||
|         <source>Matching</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">15</context> | ||||
|           <context context-type="linenumber">21</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="9bcf8d20d23c111eca1431abd2d2ce0de324499c" datatype="html"> | ||||
|         <source>Document count</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">16</context> | ||||
|           <context context-type="linenumber">22</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c" datatype="html"> | ||||
|         <source>Actions</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|           <context context-type="linenumber">23</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="9d51b3c90afda70700229d1b8a55371c13cb3bce" datatype="html"> | ||||
|         <source>Documents</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">32</context> | ||||
|           <context context-type="linenumber">38</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="28f86ffd419b869711aa13f5e5ff54be6d70731c" datatype="html"> | ||||
|         <source>Edit</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">37</context> | ||||
|           <context context-type="linenumber">43</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="4990731724078522539" datatype="html"> | ||||
| @@ -475,21 +482,35 @@ | ||||
|         <source>Saved view "<x id="PH" equiv-text="savedView.name"/>" deleted.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">55</context> | ||||
|           <context context-type="linenumber">63</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5647210819299459618" datatype="html"> | ||||
|         <source>Settings saved successfully.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">68</context> | ||||
|           <context context-type="linenumber">79</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6839066544204061364" datatype="html"> | ||||
|         <source>Use system language</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7729897675462249787" datatype="html"> | ||||
|         <source>Use date format of display language</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8488620293789898901" datatype="html"> | ||||
|         <source>Error while storing settings on server: <x id="PH" equiv-text="JSON.stringify(error.error)"/></source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">80</context> | ||||
|           <context context-type="linenumber">103</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="121cc5391cd2a5115bc2b3160379ee5b36cd7716" datatype="html"> | ||||
| @@ -510,7 +531,7 @@ | ||||
|         <source>Saved views</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">64</context> | ||||
|           <context context-type="linenumber">114</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13" datatype="html"> | ||||
| @@ -520,109 +541,158 @@ | ||||
|           <context context-type="linenumber">13</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="75f8908d266f7cc9b9e68e0be906fd080a223606" datatype="html"> | ||||
|         <source>Display language</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1284a077dc18a2d1ff1b744f16f1797eea28ae37" datatype="html"> | ||||
|         <source>You need to reload the page after applying a new language.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">25</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="0cd55822928764cc82a62ee3e6f3adbc1c630479" datatype="html"> | ||||
|         <source>Date display</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">32</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7df4de0d0704a06a302d853e31f2580eba98f127" datatype="html"> | ||||
|         <source>Date format</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">45</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="69852399a18b8ca4fca8c5bfddd3f00a6d137593" datatype="html"> | ||||
|         <source>Short: <x id="INTERPOLATION" equiv-text="{{today | customDate:'shortDate':null:computedDateLocale}}"/></source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">51</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="d01a59285e711252b98c4f193394e4b854615c78" datatype="html"> | ||||
|         <source>Medium: <x id="INTERPOLATION" equiv-text="{{today | customDate:'mediumDate':null:computedDateLocale}}"/></source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">55</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="00481629776699b1caebd12b3b1176e2e23740a8" datatype="html"> | ||||
|         <source>Long: <x id="INTERPOLATION" equiv-text="{{today | customDate:'longDate':null:computedDateLocale}}"/></source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">59</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="2045151788cbdda7512752e408da59a6b54a8ef0" datatype="html"> | ||||
|         <source>Items per page</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|           <context context-type="linenumber">67</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="c4435e56bf0289e78fedc462f1d21fb30b9de55d" datatype="html"> | ||||
|         <source>Document editor</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">33</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="4903e521c9bfd11ce88e7a5575106ef638912e0d" datatype="html"> | ||||
|         <source>Use PDF viewer provided by the browser</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">37</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="d7db07023e53f8396d18d375c2b78c25fc81c197" datatype="html"> | ||||
|         <source>This is usually faster for displaying large PDF documents, but it might not work on some browsers.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">37</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="9ee5d1cbfd6ee168dae37aaba2b59b50bcabb2ff" datatype="html"> | ||||
|         <source>Dark mode</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">44</context> | ||||
|           <context context-type="linenumber">94</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="f8cb5506e70fd71fddc9bb71cee18bfff7b29637" datatype="html"> | ||||
|         <source>Use system settings</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">47</context> | ||||
|           <context context-type="linenumber">97</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8ee474504043fa89821d626e4f3413240fa91b53" datatype="html"> | ||||
|         <source>Enable dark mode</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">48</context> | ||||
|           <context context-type="linenumber">98</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="3863a86cd9e69a61d143d3daf51df44203df4a82" datatype="html"> | ||||
|         <source>Bulk editing</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">52</context> | ||||
|           <context context-type="linenumber">102</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="c0ac61661c6c326d6e0e00c231b95cf2ac0c6586" datatype="html"> | ||||
|         <source>Show confirmation dialogs</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">56</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="291bbe56ecbe945dcf05580a57d679fa7bd1e06a" datatype="html"> | ||||
|         <source>Deleting documents will always ask for confirmation.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">56</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8cfddc13e04f5545ac63f419ef363505d6f78c2e" datatype="html"> | ||||
|         <source>Apply on close</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">57</context> | ||||
|           <context context-type="linenumber">107</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8cb90334f5dfd7fc67205085f59381e2a334ccfc" datatype="html"> | ||||
|         <source>Appears on</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">76</context> | ||||
|           <context context-type="linenumber">126</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="6717cf1acf04728fc2b7c39f6d3297f8ff15fde5" datatype="html"> | ||||
|         <source>Show on dashboard</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">79</context> | ||||
|           <context context-type="linenumber">129</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="541bfc5b123b3f8867fd681eaceefb663a811973" datatype="html"> | ||||
|         <source>Show in sidebar</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|           <context context-type="linenumber">133</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="abba764a7a595d04dc8c3b26e04b3780d4fdb540" datatype="html"> | ||||
|         <source>No saved views defined.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">93</context> | ||||
|           <context context-type="linenumber">143</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="ef60a738a565f498b858e903e42bc5ffc3cc1299" datatype="html"> | ||||
| @@ -650,7 +720,7 @@ | ||||
|         <source>Last correspondence</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-list.component.html</context> | ||||
|           <context context-type="linenumber">15</context> | ||||
|           <context context-type="linenumber">22</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1234709746630139322" datatype="html"> | ||||
| @@ -692,21 +762,21 @@ | ||||
|         <source>Matching algorithm</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|           <context context-type="linenumber">10</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="eab7fc7cf2d663e54de934b779fce4275a303f0f" datatype="html"> | ||||
|         <source>Matching pattern</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="632e529f49cf3d367dfbd15bd055e9b53aef30fb" datatype="html"> | ||||
|         <source>Case insensitive</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">13</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="9153094873118985366" datatype="html"> | ||||
| @@ -913,13 +983,6 @@ | ||||
|           <context context-type="linenumber">46</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="ddb40946e790522301687ecddb9ce1cb8ad40dd1" datatype="html"> | ||||
|         <source>Filter by:</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context> | ||||
|           <context context-type="linenumber">4</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="02d184c288f567825a1fcbf83bcd3099a10853d5" datatype="html"> | ||||
|         <source>Filter tags</source> | ||||
|         <context-group purpose="location"> | ||||
| @@ -1019,8 +1082,8 @@ | ||||
|           <context context-type="linenumber">50</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1b29a8153575e5ad26cc7dd8bd75c4f45f6bfe7e" datatype="html"> | ||||
|         <source>Created: <x id="INTERPOLATION" equiv-text="{{document.created | date}}"/></source> | ||||
|       <trans-unit id="849b42384616374df49bd8b3711ec159cb10b845" datatype="html"> | ||||
|         <source>Created: <x id="INTERPOLATION" equiv-text="{{document.created | customDate}}"/></source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context> | ||||
|           <context context-type="linenumber">67</context> | ||||
| @@ -1400,6 +1463,34 @@ | ||||
|           <context context-type="linenumber">12</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1206520795340730278" datatype="html"> | ||||
|         <source>English (US)</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">74</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1858110241312746425" datatype="html"> | ||||
|         <source>German</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">75</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="3071065188816255493" datatype="html"> | ||||
|         <source>Dutch</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">76</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7633754075223722162" datatype="html"> | ||||
|         <source>French</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">77</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1519954996184640001" datatype="html"> | ||||
|         <source>Error</source> | ||||
|         <context-group purpose="location"> | ||||
| @@ -1558,56 +1649,56 @@ | ||||
|         <source>Create new item</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">43</context> | ||||
|           <context context-type="linenumber">50</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5324147361912094446" datatype="html"> | ||||
|         <source>Edit item</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">47</context> | ||||
|           <context context-type="linenumber">54</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="1699589597032579396" datatype="html"> | ||||
|         <source>Could not save element: <x id="PH" equiv-text="error"/></source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">51</context> | ||||
|           <context context-type="linenumber">58</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="810888510148304696" datatype="html"> | ||||
|         <source>Automatic</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">33</context> | ||||
|           <context context-type="linenumber">39</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5044611416737085530" datatype="html"> | ||||
|         <source>Do you really want to delete this element?</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">76</context> | ||||
|           <context context-type="linenumber">97</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="8371896857609524947" datatype="html"> | ||||
|         <source>Associated documents will not be deleted.</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|           <context context-type="linenumber">104</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="7022070615528435141" datatype="html"> | ||||
|         <source>Delete</source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">85</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5467489005440577210" datatype="html"> | ||||
|         <source>Error while deleting element: <x id="PH" equiv-text="JSON.stringify(error.error)"/></source> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">93</context> | ||||
|           <context context-type="linenumber">114</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="5851669019930456395" datatype="html"> | ||||
|   | ||||
| @@ -13,7 +13,7 @@ import { DocumentTypeListComponent } from './components/manage/document-type-lis | ||||
| import { LogsComponent } from './components/manage/logs/logs.component'; | ||||
| import { SettingsComponent } from './components/manage/settings/settings.component'; | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms'; | ||||
| import { DatePipe } from '@angular/common'; | ||||
| import { DatePipe, registerLocaleData } from '@angular/common'; | ||||
| import { NotFoundComponent } from './components/not-found/not-found.component'; | ||||
| import { CorrespondentListComponent } from './components/manage/correspondent-list/correspondent-list.component'; | ||||
| import { ConfirmDialogComponent } from './components/common/confirm-dialog/confirm-dialog.component'; | ||||
| @@ -59,6 +59,15 @@ import { SelectDialogComponent } from './components/common/select-dialog/select- | ||||
| import { NgSelectModule } from '@ng-select/ng-select'; | ||||
| import { NumberComponent } from './components/common/input/number/number.component'; | ||||
| import { SafePipe } from './pipes/safe.pipe'; | ||||
| import { CustomDatePipe } from './pipes/custom-date.pipe'; | ||||
|  | ||||
| import localeFr from '@angular/common/locales/fr'; | ||||
| import localeNl from '@angular/common/locales/nl'; | ||||
| import localeDe from '@angular/common/locales/de'; | ||||
|  | ||||
| registerLocaleData(localeFr) | ||||
| registerLocaleData(localeNl) | ||||
| registerLocaleData(localeDe) | ||||
|  | ||||
| @NgModule({ | ||||
|   declarations: [ | ||||
| @@ -108,7 +117,8 @@ import { SafePipe } from './pipes/safe.pipe'; | ||||
|     MetadataCollapseComponent, | ||||
|     SelectDialogComponent, | ||||
|     NumberComponent, | ||||
|     SafePipe | ||||
|     SafePipe, | ||||
|     CustomDatePipe | ||||
|   ], | ||||
|   imports: [ | ||||
|     BrowserModule, | ||||
|   | ||||
| @@ -27,6 +27,8 @@ export abstract class EditDialogComponent<T extends ObjectWithId> implements OnI | ||||
|  | ||||
|   networkActive = false | ||||
|  | ||||
|   closeEnabled = false | ||||
|  | ||||
|   error = null | ||||
|  | ||||
|   abstract getForm(): FormGroup | ||||
| @@ -37,6 +39,11 @@ export abstract class EditDialogComponent<T extends ObjectWithId> implements OnI | ||||
|     if (this.object != null) { | ||||
|       this.objectForm.patchValue(this.object) | ||||
|     } | ||||
|  | ||||
|     // wait to enable close button so it doesnt steal focus from input since its the first clickable element in the DOM | ||||
|     setTimeout(() => { | ||||
|       this.closeEnabled = true | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   getCreateTitle() { | ||||
|   | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -12,7 +12,7 @@ | ||||
|     </thead> | ||||
|     <tbody> | ||||
|       <tr *ngFor="let doc of documents" routerLink="/documents/{{doc.id}}"> | ||||
|         <td>{{doc.created | date}}</td> | ||||
|         <td>{{doc.created | customDate}}</td> | ||||
|         <td>{{doc.title | documentTitle}}<app-tag [tag]="t" *ngFor="let t of doc.tags$ | async" class="ml-1"></app-tag> | ||||
|       </tr> | ||||
|     </tbody> | ||||
|   | ||||
| @@ -34,7 +34,7 @@ export class SavedViewWidgetComponent implements OnInit { | ||||
|     } else { | ||||
|       this.list.load(this.savedView) | ||||
|       this.router.navigate(["documents"]) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -85,11 +85,11 @@ | ||||
|                             <tbody> | ||||
|                                 <tr> | ||||
|                                     <td i18n>Date modified</td> | ||||
|                                     <td>{{document.modified | date:'medium'}}</td> | ||||
|                                     <td>{{document.modified | customDate}}</td> | ||||
|                                 </tr> | ||||
|                                 <tr> | ||||
|                                     <td i18n>Date added</td> | ||||
|                                     <td>{{document.added | date:'medium'}}</td> | ||||
|                                     <td>{{document.added | customDate}}</td> | ||||
|                                 </tr> | ||||
|                                 <tr> | ||||
|                                     <td i18n>Media filename</td> | ||||
| @@ -142,5 +142,9 @@ | ||||
|                 <object [data]="previewUrl | safe" type="application/pdf" class="preview-sticky" width="100%"></object> | ||||
|             </ng-template> | ||||
|         </ng-container> | ||||
|         <ng-container *ngIf="getContentType() == 'text/plain'"> | ||||
|             <object [data]="previewUrl | safe" type="text/plain" class="preview-sticky" width="100%"></object> | ||||
|         </ng-container> | ||||
|            | ||||
|     </div> | ||||
| </div> | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| <div class="card mb-3 shadow-sm" [class.card-selected]="selected" [class.document-card]="selectable"> | ||||
|   <div class="row no-gutters"> | ||||
|     <div class="col-md-2 d-none d-lg-block doc-img-background rounded-left" [class.doc-img-background-selected]="selected"> | ||||
|       <img [src]="getThumbUrl()" class="card-img doc-img border-right rounded-left" (click)="setSelected(selectable ? !selected : false)"> | ||||
|     <div class="col-md-2 d-none d-lg-block doc-img-background rounded-left" [class.doc-img-background-selected]="selected" (click)="this.toggleSelected.emit($event)"> | ||||
|       <img [src]="getThumbUrl()" class="card-img doc-img border-right rounded-left"> | ||||
|  | ||||
|       <div style="top: 0; left: 0" class="position-absolute border-right border-bottom bg-light p-1" [class.document-card-check]="!selected"> | ||||
|         <div class="custom-control custom-checkbox"> | ||||
|           <input type="checkbox" class="custom-control-input" id="smallCardCheck{{document.id}}" [checked]="selected" (change)="setSelected($event.target.checked)"> | ||||
|           <input type="checkbox" class="custom-control-input" id="smallCardCheck{{document.id}}" [checked]="selected" (click)="this.toggleSelected.emit($event)"> | ||||
|           <label class="custom-control-label" for="smallCardCheck{{document.id}}"></label> | ||||
|         </div> | ||||
|       </div> | ||||
| @@ -17,11 +17,11 @@ | ||||
|         <div class="d-flex justify-content-between align-items-center"> | ||||
|           <h5 class="card-title"> | ||||
|             <ng-container *ngIf="document.correspondent"> | ||||
|               <a *ngIf="clickCorrespondent.observers.length ; else nolink" [routerLink]="" title="Filter by correspondent" i18n-title (click)="clickCorrespondent.emit(document.correspondent)" class="font-weight-bold">{{(document.correspondent$ | async)?.name}}</a> | ||||
|               <a *ngIf="clickCorrespondent.observers.length ; else nolink" [routerLink]="" title="Filter by correspondent" i18n-title (click)="clickCorrespondent.emit(document.correspondent);$event.stopPropagation()" class="font-weight-bold">{{(document.correspondent$ | async)?.name}}</a> | ||||
|               <ng-template #nolink>{{(document.correspondent$ | async)?.name}}</ng-template>: | ||||
|             </ng-container> | ||||
|             {{document.title | documentTitle}} | ||||
|             <app-tag [tag]="t" linkTitle="Filter by tag" i18n-linkTitle *ngFor="let t of document.tags$ | async" class="ml-1" (click)="clickTag.emit(t.id)" [clickable]="clickTag.observers.length"></app-tag> | ||||
|             <app-tag [tag]="t" linkTitle="Filter by tag" i18n-linkTitle *ngFor="let t of document.tags$ | async" class="ml-1" (click)="clickTag.emit(t.id);$event.stopPropagation()" [clickable]="clickTag.observers.length"></app-tag> | ||||
|           </h5> | ||||
|           <h5 class="card-title" *ngIf="document.archive_serial_number">#{{document.archive_serial_number}}</h5> | ||||
|         </div> | ||||
| @@ -64,7 +64,7 @@ | ||||
|             <ngb-progressbar [type]="searchScoreClass" [value]="searchScore" class="search-score-bar mx-2" [max]="1"></ngb-progressbar> | ||||
|           </div> | ||||
|  | ||||
|           <small class="text-muted" [class.ml-auto]="!searchScore" i18n>Created: {{document.created | date}}</small> | ||||
|           <small class="text-muted" [class.ml-auto]="!searchScore" i18n>Created: {{document.created | customDate}}</small> | ||||
|         </div> | ||||
|  | ||||
|       </div> | ||||
|   | ||||
| @@ -15,16 +15,11 @@ export class DocumentCardLargeComponent implements OnInit { | ||||
|   @Input() | ||||
|   selected = false | ||||
|  | ||||
|   setSelected(value: boolean) { | ||||
|     this.selected = value | ||||
|     this.selectedChange.emit(value) | ||||
|   } | ||||
|  | ||||
|   @Output() | ||||
|   selectedChange = new EventEmitter<boolean>() | ||||
|   toggleSelected = new EventEmitter() | ||||
|  | ||||
|   get selectable() { | ||||
|     return this.selectedChange.observers.length > 0 | ||||
|     return this.toggleSelected.observers.length > 0 | ||||
|   } | ||||
|  | ||||
|   @Input() | ||||
|   | ||||
| @@ -1,18 +1,18 @@ | ||||
| <div class="col p-2 h-100"> | ||||
|   <div class="card h-100 shadow-sm document-card" [class.card-selected]="selected"> | ||||
|     <div class="border-bottom doc-img-container" [class.doc-img-background-selected]="selected"> | ||||
|       <img class="card-img doc-img rounded-top" [src]="getThumbUrl()" (click)="setSelected(!selected)"> | ||||
|     <div class="border-bottom doc-img-container" [class.doc-img-background-selected]="selected" (click)="this.toggleSelected.emit($event)"> | ||||
|       <img class="card-img doc-img rounded-top" [src]="getThumbUrl()"> | ||||
|  | ||||
|       <div class="border-right border-bottom bg-light p-1 rounded document-card-check"> | ||||
|         <div class="custom-control custom-checkbox"> | ||||
|           <input type="checkbox" class="custom-control-input" id="smallCardCheck{{document.id}}" [checked]="selected" (change)="setSelected($event.target.checked)"> | ||||
|           <input type="checkbox" class="custom-control-input" id="smallCardCheck{{document.id}}" [checked]="selected" (click)="this.toggleSelected.emit($event)"> | ||||
|           <label class="custom-control-label" for="smallCardCheck{{document.id}}"></label> | ||||
|         </div> | ||||
|       </div> | ||||
|  | ||||
|       <div style="top: 0; right: 0; font-size: large" class="text-right position-absolute mr-1"> | ||||
|         <div *ngFor="let t of getTagsLimited$() | async"> | ||||
|           <app-tag [tag]="t" (click)="clickTag.emit(t.id)" [clickable]="true" linkTitle="Filter by tag" i18n-linkTitle></app-tag> | ||||
|           <app-tag [tag]="t" (click)="clickTag.emit(t.id);$event.stopPropagation()" [clickable]="true" linkTitle="Filter by tag" i18n-linkTitle></app-tag> | ||||
|         </div> | ||||
|         <div *ngIf="moreTags"> | ||||
|           <span class="badge badge-secondary">+ {{moreTags}}</span> | ||||
| @@ -23,7 +23,7 @@ | ||||
|     <div class="card-body p-2"> | ||||
|       <p class="card-text"> | ||||
|         <ng-container *ngIf="document.correspondent"> | ||||
|           <a [routerLink]="" title="Filter by correspondent" i18n-title (click)="clickCorrespondent.emit(document.correspondent)" class="font-weight-bold">{{(document.correspondent$ | async)?.name}}</a>: | ||||
|           <a [routerLink]="" title="Filter by correspondent" i18n-title (click)="clickCorrespondent.emit(document.correspondent);$event.stopPropagation()" class="font-weight-bold">{{(document.correspondent$ | async)?.name}}</a>: | ||||
|         </ng-container> | ||||
|         {{document.title | documentTitle}} <span *ngIf="document.archive_serial_number">(#{{document.archive_serial_number}})</span> | ||||
|       </p> | ||||
| @@ -43,14 +43,14 @@ | ||||
|               <path fill-rule="evenodd" d="M6.5 12a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zM13 6.5a6.5 6.5 0 1 1-13 0 6.5 6.5 0 0 1 13 0z"/> | ||||
|             </svg> | ||||
|           </a> | ||||
|           <a [href]="getDownloadUrl()" class="btn btn-sm btn-outline-secondary" title="Download" i18n-title> | ||||
|           <a [href]="getDownloadUrl()" class="btn btn-sm btn-outline-secondary" title="Download" (click)="$event.stopPropagation()" i18n-title> | ||||
|             <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-download" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> | ||||
|               <path fill-rule="evenodd" d="M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5z"/> | ||||
|               <path fill-rule="evenodd" d="M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3z"/> | ||||
|             </svg> | ||||
|           </a> | ||||
|         </div> | ||||
|         <small class="text-muted pl-1">{{document.created | date}}</small> | ||||
|         <small class="text-muted pl-1">{{document.created | customDate:'shortDate'}}</small> | ||||
|       </div> | ||||
|  | ||||
|     </div> | ||||
|   | ||||
| @@ -15,13 +15,8 @@ export class DocumentCardSmallComponent implements OnInit { | ||||
|   @Input() | ||||
|   selected = false | ||||
|    | ||||
|   setSelected(value: boolean) { | ||||
|     this.selected = value | ||||
|     this.selectedChange.emit(value) | ||||
|   } | ||||
|  | ||||
|   @Output() | ||||
|   selectedChange = new EventEmitter<boolean>() | ||||
|   toggleSelected = new EventEmitter() | ||||
|  | ||||
|   @Input() | ||||
|   document: PaperlessDocument | ||||
|   | ||||
| @@ -90,7 +90,7 @@ | ||||
| </div> | ||||
|  | ||||
| <div *ngIf="displayMode == 'largeCards'"> | ||||
|   <app-document-card-large [selected]="list.isSelected(d)" (selectedChange)="list.setSelected(d, $event)"   *ngFor="let d of list.documents; trackBy: trackByDocumentId" [document]="d" [details]="d.content" (clickTag)="clickTag($event)" (clickCorrespondent)="clickCorrespondent($event)"> | ||||
|   <app-document-card-large [selected]="list.isSelected(d)" (toggleSelected)="toggleSelected(d, $event)" *ngFor="let d of list.documents; trackBy: trackByDocumentId" [document]="d" [details]="d.content" (clickTag)="clickTag($event)" (clickCorrespondent)="clickCorrespondent($event)"> | ||||
|   </app-document-card-large> | ||||
| </div> | ||||
|  | ||||
| @@ -135,10 +135,10 @@ | ||||
|       i18n>Added</th> | ||||
|   </thead> | ||||
|   <tbody> | ||||
|     <tr *ngFor="let d of list.documents; trackBy: trackByDocumentId" [ngClass]="list.isSelected(d) ? 'table-row-selected' : ''"> | ||||
|     <tr *ngFor="let d of list.documents; trackBy: trackByDocumentId" (click)="toggleSelected(d, $event)" [ngClass]="list.isSelected(d) ? 'table-row-selected' : ''"> | ||||
|       <td> | ||||
|         <div class="custom-control custom-checkbox"> | ||||
|           <input type="checkbox" class="custom-control-input" id="docCheck{{d.id}}" [checked]="list.isSelected(d)" (change)="list.setSelected(d, $event.target.checked)"> | ||||
|           <input type="checkbox" class="custom-control-input" id="docCheck{{d.id}}" [checked]="list.isSelected(d)" (click)="toggleSelected(d, $event)"> | ||||
|           <label class="custom-control-label" for="docCheck{{d.id}}"></label> | ||||
|         </div> | ||||
|       </td> | ||||
| @@ -147,28 +147,28 @@ | ||||
|       </td> | ||||
|       <td class="d-none d-md-table-cell"> | ||||
|         <ng-container *ngIf="d.correspondent"> | ||||
|           <a [routerLink]="" (click)="clickCorrespondent(d.correspondent)" title="Filter by correspondent">{{(d.correspondent$ | async)?.name}}</a> | ||||
|           <a [routerLink]="" (click)="clickCorrespondent(d.correspondent);$event.stopPropagation()" title="Filter by correspondent">{{(d.correspondent$ | async)?.name}}</a> | ||||
|         </ng-container> | ||||
|       </td> | ||||
|       <td> | ||||
|         <a routerLink="/documents/{{d.id}}" title="Edit document" style="overflow-wrap: anywhere;">{{d.title | documentTitle}}</a> | ||||
|         <app-tag [tag]="t" *ngFor="let t of d.tags$ | async" class="ml-1" clickable="true" linkTitle="Filter by tag" (click)="clickTag(t.id)"></app-tag> | ||||
|         <app-tag [tag]="t" *ngFor="let t of d.tags$ | async" class="ml-1" clickable="true" linkTitle="Filter by tag" (click)="clickTag(t.id);$event.stopPropagation()"></app-tag> | ||||
|       </td> | ||||
|       <td class="d-none d-xl-table-cell"> | ||||
|         <ng-container *ngIf="d.document_type"> | ||||
|           <a [routerLink]="" (click)="clickDocumentType(d.document_type)" title="Filter by document type">{{(d.document_type$ | async)?.name}}</a> | ||||
|           <a [routerLink]="" (click)="clickDocumentType(d.document_type);$event.stopPropagation()" title="Filter by document type">{{(d.document_type$ | async)?.name}}</a> | ||||
|         </ng-container> | ||||
|       </td> | ||||
|       <td> | ||||
|         {{d.created | date}} | ||||
|         {{d.created | customDate}} | ||||
|       </td> | ||||
|       <td class="d-none d-xl-table-cell"> | ||||
|         {{d.added | date}} | ||||
|         {{d.added | customDate}} | ||||
|       </td> | ||||
|     </tr> | ||||
|   </tbody> | ||||
| </table> | ||||
|  | ||||
| <div class="m-n2 row row-cols-paperless-cards" *ngIf="displayMode == 'smallCards'"> | ||||
|   <app-document-card-small [selected]="list.isSelected(d)" (selectedChange)="list.setSelected(d, $event)"  [document]="d" *ngFor="let d of list.documents; trackBy: trackByDocumentId" (clickTag)="clickTag($event)" (clickCorrespondent)="clickCorrespondent($event)"></app-document-card-small> | ||||
|   <app-document-card-small [selected]="list.isSelected(d)" (toggleSelected)="toggleSelected(d, $event)"  [document]="d" *ngFor="let d of list.documents; trackBy: trackByDocumentId" (clickTag)="clickTag($event)" (clickCorrespondent)="clickCorrespondent($event)"></app-document-card-small> | ||||
| </div> | ||||
|   | ||||
| @@ -1,5 +1,9 @@ | ||||
| @import "/src/theme"; | ||||
|  | ||||
| tr { | ||||
|   user-select: none; | ||||
| } | ||||
|  | ||||
| .table-row-selected { | ||||
|   background-color: $primaryFaded; | ||||
| } | ||||
|   | ||||
| @@ -160,6 +160,11 @@ export class DocumentListComponent implements OnInit { | ||||
|     this.filterRulesModified = modified | ||||
|   } | ||||
|  | ||||
|   toggleSelected(document: PaperlessDocument, event: MouseEvent): void { | ||||
|     if (!event.shiftKey) this.list.toggleSelected(document) | ||||
|     else this.list.selectRangeTo(document) | ||||
|   } | ||||
|  | ||||
|   clickTag(tagID: number) { | ||||
|     this.list.selectNone() | ||||
|     setTimeout(() => { | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <form [formGroup]="saveViewConfigForm" (ngSubmit)="save()"> | ||||
|   <div class="modal-header"> | ||||
|     <h4 class="modal-title" id="modal-basic-title" i18n>Save current view</h4> | ||||
|     <button type="button" class="close" aria-label="Close" (click)="cancel()"> | ||||
|     <button type="button" [disabled]="!closeEnabled" class="close" aria-label="Close" (click)="cancel()"> | ||||
|       <span aria-hidden="true">×</span> | ||||
|     </button> | ||||
|   </div> | ||||
|   | ||||
| @@ -20,6 +20,8 @@ export class SaveViewConfigDialogComponent implements OnInit { | ||||
|   @Input() | ||||
|   buttonsEnabled = true | ||||
|  | ||||
|   closeEnabled = false | ||||
|  | ||||
|   _defaultName = "" | ||||
|  | ||||
|   get defaultName() { | ||||
| @@ -39,6 +41,10 @@ export class SaveViewConfigDialogComponent implements OnInit { | ||||
|   }) | ||||
|  | ||||
|   ngOnInit(): void { | ||||
|     // wait to enable close button so it doesnt steal focus from input since its the first clickable element in the DOM | ||||
|     setTimeout(() => { | ||||
|       this.closeEnabled = true | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   save() { | ||||
|   | ||||
| @@ -1,12 +1,11 @@ | ||||
| <form [formGroup]="objectForm" (ngSubmit)="save()"> | ||||
|   <div class="modal-header"> | ||||
|     <h4 class="modal-title" id="modal-basic-title">{{getTitle()}}</h4> | ||||
|     <button type="button" class="close" aria-label="Close" (click)="cancel()"> | ||||
|     <button type="button" [disabled]="!closeEnabled" class="close" aria-label="Close" (click)="cancel()"> | ||||
|       <span aria-hidden="true">×</span> | ||||
|     </button> | ||||
|   </div> | ||||
|   <div class="modal-body"> | ||||
|  | ||||
|     <app-input-text i18n-title title="Name" formControlName="name" [error]="error?.name"></app-input-text> | ||||
|     <app-input-select i18n-title title="Matching algorithm" [items]="getMatchingAlgorithms()" formControlName="matching_algorithm"></app-input-select> | ||||
|     <app-input-text *ngIf="patternRequired" i18n-title title="Matching pattern" formControlName="match"></app-input-text> | ||||
|   | ||||
| @@ -2,8 +2,15 @@ | ||||
|   <button type="button" class="btn btn-sm btn-outline-primary" (click)="openCreateDialog()" i18n>Create</button> | ||||
| </app-page-header> | ||||
|  | ||||
| <div class="row m-0 justify-content-end"> | ||||
|   <ngb-pagination [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" aria-label="Default pagination"></ngb-pagination> | ||||
| <div class="row"> | ||||
|   <div class="col-md mb-2 mb-xl-0"> | ||||
|     <div class="form-inline d-flex align-items-center"> | ||||
|       <label class="text-muted mr-2 mb-0" i18n>Filter by:</label> | ||||
|       <input class="form-control form-control-sm flex-fill w-auto" type="text" [(ngModel)]="nameFilter" placeholder="Name" i18n-placeholder> | ||||
|     </div> | ||||
|   </div> | ||||
|  | ||||
|   <ngb-pagination class="col-auto" [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" aria-label="Default pagination"></ngb-pagination> | ||||
| </div> | ||||
|  | ||||
| <table class="table table-striped border shadow-sm"> | ||||
| @@ -21,7 +28,7 @@ | ||||
|       <td scope="row">{{ correspondent.name }}</td> | ||||
|       <td scope="row">{{ getMatching(correspondent) }}</td> | ||||
|       <td scope="row">{{ correspondent.document_count }}</td> | ||||
|       <td scope="row">{{ correspondent.last_correspondence | date }}</td> | ||||
|       <td scope="row">{{ correspondent.last_correspondence | customDate }}</td> | ||||
|         <td scope="row"> | ||||
|           <div class="btn-group"> | ||||
|             <button class="btn btn-sm btn-outline-secondary" (click)="filterDocuments(correspondent)"> | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <form [formGroup]="objectForm" (ngSubmit)="save()"> | ||||
|     <div class="modal-header"> | ||||
|       <h4 class="modal-title" id="modal-basic-title">{{getTitle()}}</h4> | ||||
|       <button type="button" class="close" aria-label="Close" (click)="cancel()"> | ||||
|       <button type="button" [disabled]="!closeEnabled" class="close" aria-label="Close" (click)="cancel()"> | ||||
|         <span aria-hidden="true">×</span> | ||||
|       </button> | ||||
|     </div> | ||||
|   | ||||
| @@ -2,9 +2,15 @@ | ||||
|   <button type="button" class="btn btn-sm btn-outline-primary" (click)="openCreateDialog()" i18n>Create</button> | ||||
| </app-page-header> | ||||
|  | ||||
| <div class="row m-0 justify-content-end"> | ||||
|   <ngb-pagination [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" | ||||
|   aria-label="Default pagination"></ngb-pagination> | ||||
| <div class="row"> | ||||
|   <div class="col-md mb-2 mb-xl-0"> | ||||
|     <div class="form-inline d-flex align-items-center"> | ||||
|       <label class="text-muted mr-2 mb-0" i18n>Filter by:</label> | ||||
|       <input class="form-control form-control-sm flex-fill w-auto" type="text" [(ngModel)]="nameFilter" placeholder="Name" i18n-placeholder> | ||||
|     </div> | ||||
|   </div> | ||||
|  | ||||
|   <ngb-pagination class="col-auto" [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" aria-label="Default pagination"></ngb-pagination> | ||||
| </div> | ||||
|  | ||||
| <table class="table table-striped border shadow-sm"> | ||||
|   | ||||
| @@ -1,17 +1,19 @@ | ||||
| import { Directive, OnInit, QueryList, ViewChildren } from '@angular/core'; | ||||
| import { Directive, OnDestroy, OnInit, QueryList, ViewChildren } from '@angular/core'; | ||||
| import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; | ||||
| import { Subject, Subscription } from 'rxjs'; | ||||
| import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; | ||||
| import { MatchingModel, MATCHING_ALGORITHMS, MATCH_AUTO } from 'src/app/data/matching-model'; | ||||
| import { ObjectWithId } from 'src/app/data/object-with-id'; | ||||
| import { SortableDirective, SortEvent } from 'src/app/directives/sortable.directive'; | ||||
| import { AbstractPaperlessService } from 'src/app/services/rest/abstract-paperless-service'; | ||||
| import { AbstractNameFilterService } from 'src/app/services/rest/abstract-name-filter-service'; | ||||
| import { ToastService } from 'src/app/services/toast.service'; | ||||
| import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component'; | ||||
|  | ||||
| @Directive() | ||||
| export abstract class GenericListComponent<T extends ObjectWithId> implements OnInit { | ||||
| export abstract class GenericListComponent<T extends ObjectWithId> implements OnInit, OnDestroy { | ||||
|  | ||||
|   constructor( | ||||
|     private service: AbstractPaperlessService<T>, | ||||
|     private service: AbstractNameFilterService<T>, | ||||
|     private modalService: NgbModal, | ||||
|     private editDialogComponent: any, | ||||
|     private toastService: ToastService) { | ||||
| @@ -28,6 +30,10 @@ export abstract class GenericListComponent<T extends ObjectWithId> implements On | ||||
|   public sortField: string | ||||
|   public sortReverse: boolean | ||||
|  | ||||
|   private nameFilterDebounce: Subject<string> | ||||
|   private subscription: Subscription | ||||
|   private _nameFilter: string | ||||
|  | ||||
|   getMatching(o: MatchingModel) { | ||||
|     if (o.matching_algorithm == MATCH_AUTO) { | ||||
|       return $localize`Automatic` | ||||
| @@ -44,12 +50,27 @@ export abstract class GenericListComponent<T extends ObjectWithId> implements On | ||||
|     this.reloadData() | ||||
|   } | ||||
|  | ||||
|  | ||||
|   ngOnInit(): void { | ||||
|     this.reloadData() | ||||
|  | ||||
|     this.nameFilterDebounce = new Subject<string>() | ||||
|  | ||||
|     this.subscription = this.nameFilterDebounce.pipe( | ||||
|       debounceTime(400), | ||||
|       distinctUntilChanged() | ||||
|     ).subscribe(title => { | ||||
|       this._nameFilter = title | ||||
|       this.reloadData() | ||||
|     }) | ||||
|   } | ||||
|  | ||||
|   ngOnDestroy() { | ||||
|     this.subscription.unsubscribe() | ||||
|   } | ||||
|  | ||||
|   reloadData() { | ||||
|     this.service.list(this.page, null, this.sortField, this.sortReverse).subscribe(c => { | ||||
|     this.service.listFiltered(this.page, null, this.sortField, this.sortReverse, this._nameFilter).subscribe(c => { | ||||
|       this.data = c.results | ||||
|       this.collectionSize = c.count | ||||
|     }); | ||||
| @@ -95,4 +116,12 @@ export abstract class GenericListComponent<T extends ObjectWithId> implements On | ||||
|     } | ||||
|     ) | ||||
|   } | ||||
|  | ||||
|   get nameFilter() { | ||||
|     return this._nameFilter | ||||
|   } | ||||
|  | ||||
|   set nameFilter(nameFilter: string) { | ||||
|     this.nameFilterDebounce.next(nameFilter) | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|   <p | ||||
|     class="m-0 p-0 log-entry-{{log.level}}" | ||||
|     *ngFor="let log of logs"> | ||||
|       {{log.created | date:'short'}} | ||||
|       {{log.created | customDate:'short'}} | ||||
|       {{getLevelText(log.level)}} | ||||
|       {{log.message}} | ||||
|   </p> | ||||
|   | ||||
| @@ -12,6 +12,56 @@ | ||||
|  | ||||
|         <h4 i18n>Appearance</h4> | ||||
|  | ||||
|         <div class="form-row form-group"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|             <span i18n>Display language</span> | ||||
|           </div> | ||||
|           <div class="col"> | ||||
|  | ||||
|             <select class="form-control" formControlName="displayLanguage"> | ||||
|               <option *ngFor="let lang of displayLanguageOptions" [ngValue]="lang.code">{{lang.name}}<span *ngIf="lang.code && currentLocale != 'en-US'"> - {{lang.englishName}}</span></option> | ||||
|             </select> | ||||
|  | ||||
|             <small class="form-text text-muted" i18n>You need to reload the page after applying a new language.</small> | ||||
|  | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="form-row form-group"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|             <span i18n>Date display</span> | ||||
|           </div> | ||||
|           <div class="col"> | ||||
|  | ||||
|             <select class="form-control" formControlName="dateLocale"> | ||||
|               <option *ngFor="let lang of dateLocaleOptions" [ngValue]="lang.code">{{lang.name}}<span *ngIf="lang.code"> - {{today | date:'shortDate':null:lang.code}}</span></option> | ||||
|             </select> | ||||
|  | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="form-row form-group"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|             <span i18n>Date format</span> | ||||
|           </div> | ||||
|           <div class="col"> | ||||
|  | ||||
|             <div class="custom-control custom-radio"> | ||||
|               <input type="radio" id="dateFormatShort" name="dateFormat" class="custom-control-input" formControlName="dateFormat" value="shortDate"> | ||||
|               <label class="custom-control-label" for="dateFormatShort" i18n>Short: {{today | customDate:'shortDate':null:computedDateLocale}}</label> | ||||
|             </div> | ||||
|             <div class="custom-control custom-radio"> | ||||
|               <input type="radio" id="dateFormatMedium" name="dateFormat" class="custom-control-input" formControlName="dateFormat" value="mediumDate"> | ||||
|               <label class="custom-control-label" for="dateFormatMedium" i18n>Medium: {{today | customDate:'mediumDate':null:computedDateLocale}}</label> | ||||
|             </div> | ||||
|             <div class="custom-control custom-radio"> | ||||
|               <input type="radio" id="dateFormatLong" name="dateFormat" class="custom-control-input" formControlName="dateFormat" value="longDate"> | ||||
|               <label class="custom-control-label" for="dateFormatLong" i18n>Long: {{today | customDate:'longDate':null:computedDateLocale}}</label> | ||||
|             </div> | ||||
|  | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="form-row form-group"> | ||||
|           <div class="col-md-3 col-form-label"> | ||||
|             <span i18n>Items per page</span> | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| import { Component, OnInit, Renderer2  } from '@angular/core'; | ||||
| import { Component, Inject, LOCALE_ID, OnInit, Renderer2  } from '@angular/core'; | ||||
| import { FormControl, FormGroup } from '@angular/forms'; | ||||
| import { PaperlessSavedView } from 'src/app/data/paperless-saved-view'; | ||||
| import { DocumentListViewService } from 'src/app/services/document-list-view.service'; | ||||
| import { SavedViewService } from 'src/app/services/rest/saved-view.service'; | ||||
| import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service'; | ||||
| import { LanguageOption, SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service'; | ||||
| import { ToastService } from 'src/app/services/toast.service'; | ||||
|  | ||||
| @Component({ | ||||
| @@ -22,16 +22,24 @@ export class SettingsComponent implements OnInit { | ||||
|     'darkModeUseSystem': new FormControl(this.settings.get(SETTINGS_KEYS.DARK_MODE_USE_SYSTEM)), | ||||
|     'darkModeEnabled': new FormControl(this.settings.get(SETTINGS_KEYS.DARK_MODE_ENABLED)), | ||||
|     'useNativePdfViewer': new FormControl(this.settings.get(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER)), | ||||
|     'savedViews': this.savedViewGroup | ||||
|     'savedViews': this.savedViewGroup, | ||||
|     'displayLanguage': new FormControl(this.settings.getLanguage()), | ||||
|     'dateLocale': new FormControl(this.settings.get(SETTINGS_KEYS.DATE_LOCALE)), | ||||
|     'dateFormat': new FormControl(this.settings.get(SETTINGS_KEYS.DATE_FORMAT)), | ||||
|   }) | ||||
|  | ||||
|   savedViews: PaperlessSavedView[] | ||||
|  | ||||
|   get computedDateLocale(): string { | ||||
|     return this.settingsForm.value.dateLocale || this.settingsForm.value.displayLanguage | ||||
|   } | ||||
|  | ||||
|   constructor( | ||||
|     public savedViewService: SavedViewService, | ||||
|     private documentListViewService: DocumentListViewService, | ||||
|     private toastService: ToastService, | ||||
|     private settings: SettingsService | ||||
|     private settings: SettingsService, | ||||
|     @Inject(LOCALE_ID) public currentLocale: string | ||||
|   ) { } | ||||
|  | ||||
|   ngOnInit() { | ||||
| @@ -63,11 +71,26 @@ export class SettingsComponent implements OnInit { | ||||
|     this.settings.set(SETTINGS_KEYS.DARK_MODE_USE_SYSTEM, this.settingsForm.value.darkModeUseSystem) | ||||
|     this.settings.set(SETTINGS_KEYS.DARK_MODE_ENABLED, (this.settingsForm.value.darkModeEnabled == true).toString()) | ||||
|     this.settings.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, this.settingsForm.value.useNativePdfViewer) | ||||
|     this.settings.set(SETTINGS_KEYS.DATE_LOCALE, this.settingsForm.value.dateLocale) | ||||
|     this.settings.set(SETTINGS_KEYS.DATE_FORMAT, this.settingsForm.value.dateFormat) | ||||
|     this.settings.setLanguage(this.settingsForm.value.displayLanguage) | ||||
|     this.documentListViewService.updatePageSize() | ||||
|     this.settings.updateDarkModeSettings() | ||||
|     this.toastService.showInfo($localize`Settings saved successfully.`) | ||||
|   } | ||||
|  | ||||
|   get displayLanguageOptions(): LanguageOption[] { | ||||
|     return [{code: "", name: $localize`Use system language`}].concat(this.settings.getLanguageOptions()) | ||||
|   } | ||||
|  | ||||
|   get dateLocaleOptions(): LanguageOption[] { | ||||
|     return [{code: "", name: $localize`Use date format of display language`}].concat(this.settings.getLanguageOptions()) | ||||
|   } | ||||
|  | ||||
|   get today() { | ||||
|     return new Date() | ||||
|   } | ||||
|  | ||||
|   saveSettings() { | ||||
|     let x = [] | ||||
|     for (let id in this.savedViewGroup.value) { | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
|   <form [formGroup]="objectForm" (ngSubmit)="save()"> | ||||
|     <div class="modal-header"> | ||||
|       <h4 class="modal-title" id="modal-basic-title">{{getTitle()}}</h4> | ||||
|       <button type="button" class="close" aria-label="Close" (click)="cancel()"> | ||||
|       <button type="button" [disabled]="!closeEnabled" class="close" aria-label="Close" (click)="cancel()"> | ||||
|         <span aria-hidden="true">×</span> | ||||
|       </button> | ||||
|     </div> | ||||
|   | ||||
| @@ -2,9 +2,15 @@ | ||||
|   <button type="button" class="btn btn-sm btn-outline-primary" (click)="openCreateDialog()" i18n>Create</button> | ||||
| </app-page-header> | ||||
|  | ||||
| <div class="row m-0 justify-content-end"> | ||||
|   <ngb-pagination [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" | ||||
|     aria-label="Default pagination"></ngb-pagination> | ||||
| <div class="row"> | ||||
|   <div class="col-md mb-2 mb-xl-0"> | ||||
|     <div class="form-inline d-flex align-items-center"> | ||||
|       <label class="text-muted mr-2 mb-0" i18n>Filter by:</label> | ||||
|       <input class="form-control form-control-sm flex-fill w-auto" type="text" [(ngModel)]="nameFilter" placeholder="Name" i18n-placeholder> | ||||
|     </div> | ||||
|   </div> | ||||
|  | ||||
|   <ngb-pagination class="col-auto" [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" aria-label="Default pagination"></ngb-pagination> | ||||
| </div> | ||||
|  | ||||
| <table class="table table-striped border shadow-sm"> | ||||
|   | ||||
							
								
								
									
										8
									
								
								src-ui/src/app/pipes/custom-date.pipe.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src-ui/src/app/pipes/custom-date.pipe.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| import { CustomDatePipe } from './custom-date.pipe'; | ||||
|  | ||||
| describe('CustomDatePipe', () => { | ||||
|   it('create an instance', () => { | ||||
|     const pipe = new CustomDatePipe(); | ||||
|     expect(pipe).toBeTruthy(); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										19
									
								
								src-ui/src/app/pipes/custom-date.pipe.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src-ui/src/app/pipes/custom-date.pipe.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| import { DatePipe } from '@angular/common'; | ||||
| import { Inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core'; | ||||
| import { SettingsService, SETTINGS_KEYS } from '../services/settings.service'; | ||||
|  | ||||
| @Pipe({ | ||||
|   name: 'customDate' | ||||
| }) | ||||
| export class CustomDatePipe extends DatePipe implements PipeTransform { | ||||
|  | ||||
|   constructor(@Inject(LOCALE_ID) locale: string, private settings: SettingsService) { | ||||
|     super(settings.get(SETTINGS_KEYS.DATE_LOCALE) || locale) | ||||
|  | ||||
|   } | ||||
|  | ||||
|   transform(value: any, format?: string, timezone?: string, locale?: string): string | null { | ||||
|     return super.transform(value, format || this.settings.get(SETTINGS_KEYS.DATE_FORMAT), timezone, locale) | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -27,6 +27,8 @@ export class DocumentListViewService { | ||||
|   currentPage = 1 | ||||
|   currentPageSize: number = this.settings.get(SETTINGS_KEYS.DOCUMENT_LIST_SIZE) | ||||
|   collectionSize: number | ||||
|   rangeSelectionAnchorIndex: number | ||||
|   lastRangeSelectionToIndex: number | ||||
|  | ||||
|   /** | ||||
|    * This is the current config for the document list. The service will always remember the last settings used for the document list. | ||||
| @@ -108,6 +110,7 @@ export class DocumentListViewService { | ||||
|           if (onFinish) { | ||||
|             onFinish() | ||||
|           } | ||||
|           this.rangeSelectionAnchorIndex = this.lastRangeSelectionToIndex = null | ||||
|           this.isReloading = false | ||||
|         }, | ||||
|         error => { | ||||
| @@ -218,6 +221,7 @@ export class DocumentListViewService { | ||||
|  | ||||
|   selectNone() { | ||||
|     this.selected.clear() | ||||
|     this.rangeSelectionAnchorIndex = this.lastRangeSelectionToIndex = null | ||||
|   } | ||||
|  | ||||
|   reduceSelectionToFilter() { | ||||
| @@ -249,14 +253,39 @@ export class DocumentListViewService { | ||||
|     return this.selected.has(d.id) | ||||
|   } | ||||
|  | ||||
|   setSelected(d: PaperlessDocument, value: boolean) { | ||||
|     if (value) { | ||||
|       this.selected.add(d.id) | ||||
|     } else if (!value) { | ||||
|       this.selected.delete(d.id) | ||||
|   toggleSelected(d: PaperlessDocument): void { | ||||
|     if (this.selected.has(d.id)) this.selected.delete(d.id) | ||||
|     else this.selected.add(d.id) | ||||
|     this.rangeSelectionAnchorIndex = this.documentIndexInCurrentView(d.id) | ||||
|     this.lastRangeSelectionToIndex = null | ||||
|   } | ||||
|  | ||||
|   selectRangeTo(d: PaperlessDocument) { | ||||
|     if (this.rangeSelectionAnchorIndex !== null) { | ||||
|       const documentToIndex = this.documentIndexInCurrentView(d.id) | ||||
|       const fromIndex = Math.min(this.rangeSelectionAnchorIndex, documentToIndex) | ||||
|       const toIndex = Math.max(this.rangeSelectionAnchorIndex, documentToIndex) | ||||
|  | ||||
|       if (this.lastRangeSelectionToIndex !== null) { | ||||
|         // revert the old selection | ||||
|         this.documents.slice(Math.min(this.rangeSelectionAnchorIndex, this.lastRangeSelectionToIndex), Math.max(this.rangeSelectionAnchorIndex, this.lastRangeSelectionToIndex) + 1).forEach(d => { | ||||
|           this.selected.delete(d.id) | ||||
|         }) | ||||
|       } | ||||
|  | ||||
|       this.documents.slice(fromIndex, toIndex + 1).forEach(d => { | ||||
|         this.selected.add(d.id) | ||||
|       }) | ||||
|       this.lastRangeSelectionToIndex = documentToIndex | ||||
|     } else { // e.g. shift key but was first click | ||||
|       this.toggleSelected(d) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   documentIndexInCurrentView(documentID: number): number { | ||||
|     return this.documents.map(d => d.id).indexOf(documentID) | ||||
|   } | ||||
|  | ||||
|   constructor(private documentService: DocumentService, private settings: SettingsService, private router: Router) { | ||||
|     let documentListViewConfigJson = sessionStorage.getItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG) | ||||
|     if (documentListViewConfigJson) { | ||||
|   | ||||
							
								
								
									
										14
									
								
								src-ui/src/app/services/rest/abstract-name-filter-service.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src-ui/src/app/services/rest/abstract-name-filter-service.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| import { ObjectWithId } from 'src/app/data/object-with-id' | ||||
| import { AbstractPaperlessService } from './abstract-paperless-service' | ||||
|  | ||||
| export abstract class AbstractNameFilterService<T extends ObjectWithId> extends AbstractPaperlessService<T> { | ||||
|  | ||||
|   listFiltered(page?: number, pageSize?: number, sortField?: string, sortReverse?: boolean, nameFilter?: string) { | ||||
|     let params = {} | ||||
|     if (nameFilter) { | ||||
|       params = {'name__icontains': nameFilter} | ||||
|     } | ||||
|     return this.list(page, pageSize, sortField, sortReverse, params) | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -1,12 +1,12 @@ | ||||
| import { HttpClient } from '@angular/common/http'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { PaperlessCorrespondent } from 'src/app/data/paperless-correspondent'; | ||||
| import { AbstractPaperlessService } from './abstract-paperless-service'; | ||||
| import { AbstractNameFilterService } from './abstract-name-filter-service'; | ||||
|  | ||||
| @Injectable({ | ||||
|   providedIn: 'root' | ||||
| }) | ||||
| export class CorrespondentService extends AbstractPaperlessService<PaperlessCorrespondent> { | ||||
| export class CorrespondentService extends AbstractNameFilterService<PaperlessCorrespondent> { | ||||
|  | ||||
|   constructor(http: HttpClient) { | ||||
|     super(http, 'correspondents') | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| import { HttpClient } from '@angular/common/http'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { PaperlessDocumentType } from 'src/app/data/paperless-document-type'; | ||||
| import { AbstractPaperlessService } from './abstract-paperless-service'; | ||||
| import { AbstractNameFilterService } from './abstract-name-filter-service'; | ||||
|  | ||||
| @Injectable({ | ||||
|   providedIn: 'root' | ||||
| }) | ||||
| export class DocumentTypeService extends AbstractPaperlessService<PaperlessDocumentType> { | ||||
| export class DocumentTypeService extends AbstractNameFilterService<PaperlessDocumentType> { | ||||
|  | ||||
|   constructor(http: HttpClient) { | ||||
|     super(http, 'document_types') | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| import { HttpClient } from '@angular/common/http'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { PaperlessTag } from 'src/app/data/paperless-tag'; | ||||
| import { AbstractPaperlessService } from './abstract-paperless-service'; | ||||
| import { AbstractNameFilterService } from './abstract-name-filter-service'; | ||||
|  | ||||
| @Injectable({ | ||||
|   providedIn: 'root' | ||||
| }) | ||||
| export class TagService extends AbstractPaperlessService<PaperlessTag> { | ||||
| export class TagService extends AbstractNameFilterService<PaperlessTag> { | ||||
|  | ||||
|   constructor(http: HttpClient) { | ||||
|     super(http, 'tags') | ||||
|   | ||||
| @@ -1,5 +1,7 @@ | ||||
| import { DOCUMENT } from '@angular/common'; | ||||
| import { Inject, Injectable, Renderer2, RendererFactory2 } from '@angular/core'; | ||||
| import { Meta } from '@angular/platform-browser'; | ||||
| import { CookieService } from 'ngx-cookie-service'; | ||||
|  | ||||
| export interface PaperlessSettings { | ||||
|   key: string | ||||
| @@ -7,13 +9,21 @@ export interface PaperlessSettings { | ||||
|   default: any | ||||
| } | ||||
|  | ||||
| export interface LanguageOption { | ||||
|   code: string, | ||||
|   name: string, | ||||
|   englishName?: string | ||||
| } | ||||
|  | ||||
| export const SETTINGS_KEYS = { | ||||
|   BULK_EDIT_CONFIRMATION_DIALOGS: 'general-settings:bulk-edit:confirmation-dialogs', | ||||
|   BULK_EDIT_APPLY_ON_CLOSE: 'general-settings:bulk-edit:apply-on-close', | ||||
|   DOCUMENT_LIST_SIZE: 'general-settings:documentListSize', | ||||
|   DARK_MODE_USE_SYSTEM: 'general-settings:dark-mode:use-system', | ||||
|   DARK_MODE_ENABLED: 'general-settings:dark-mode:enabled', | ||||
|   USE_NATIVE_PDF_VIEWER: 'general-settings:document-details:native-pdf-viewer' | ||||
|   USE_NATIVE_PDF_VIEWER: 'general-settings:document-details:native-pdf-viewer', | ||||
|   DATE_LOCALE: 'general-settings:date-display:date-locale', | ||||
|   DATE_FORMAT: 'general-settings:date-display:date-format' | ||||
| } | ||||
|  | ||||
| const SETTINGS: PaperlessSettings[] = [ | ||||
| @@ -22,7 +32,9 @@ const SETTINGS: PaperlessSettings[] = [ | ||||
|   {key: SETTINGS_KEYS.DOCUMENT_LIST_SIZE, type: "number", default: 50}, | ||||
|   {key: SETTINGS_KEYS.DARK_MODE_USE_SYSTEM, type: "boolean", default: true}, | ||||
|   {key: SETTINGS_KEYS.DARK_MODE_ENABLED, type: "boolean", default: false}, | ||||
|   {key: SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, type: "boolean", default: false} | ||||
|   {key: SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, type: "boolean", default: false}, | ||||
|   {key: SETTINGS_KEYS.DATE_LOCALE, type: "string", default: ""}, | ||||
|   {key: SETTINGS_KEYS.DATE_FORMAT, type: "string", default: "mediumDate"} | ||||
| ] | ||||
|  | ||||
| @Injectable({ | ||||
| @@ -34,7 +46,9 @@ export class SettingsService { | ||||
|  | ||||
|   constructor( | ||||
|     private rendererFactory: RendererFactory2, | ||||
|     @Inject(DOCUMENT) private document | ||||
|     @Inject(DOCUMENT) private document, | ||||
|     private cookieService: CookieService, | ||||
|     private meta: Meta | ||||
|   ) { | ||||
|     this.renderer = rendererFactory.createRenderer(null, null); | ||||
|  | ||||
| @@ -55,6 +69,35 @@ export class SettingsService { | ||||
|  | ||||
|   } | ||||
|  | ||||
|   getLanguageOptions(): LanguageOption[] { | ||||
|     return [ | ||||
|       {code: "en-US", name: $localize`English (US)`, englishName: "English (US)"}, | ||||
|       {code: "de", name: $localize`German`, englishName: "German"}, | ||||
|       {code: "nl", name: $localize`Dutch`, englishName: "Dutch"}, | ||||
|       {code: "fr", name: $localize`French`, englishName: "French"} | ||||
|     ] | ||||
|   } | ||||
|  | ||||
|   private getLanguageCookieName() { | ||||
|     let prefix = "" | ||||
|     if (this.meta.getTag('name=cookie_prefix')) { | ||||
|       prefix = this.meta.getTag('name=cookie_prefix').content | ||||
|     } | ||||
|     return `${prefix || ''}django_language` | ||||
|   } | ||||
|  | ||||
|   getLanguage(): string { | ||||
|     return this.cookieService.get(this.getLanguageCookieName()) | ||||
|   } | ||||
|  | ||||
|   setLanguage(language: string) { | ||||
|     if (language) { | ||||
|       this.cookieService.set(this.getLanguageCookieName(), language) | ||||
|     } else { | ||||
|       this.cookieService.delete(this.getLanguageCookieName()) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   get(key: string): any { | ||||
|     let setting = SETTINGS.find(s => s.key == key) | ||||
|  | ||||
|   | ||||
| @@ -2,5 +2,5 @@ export const environment = { | ||||
|   production: true, | ||||
|   apiBaseUrl: "/api/", | ||||
|   appTitle: "Paperless-ng", | ||||
|   version: "0.9.14" | ||||
|   version: "1.0.0" | ||||
| }; | ||||
|   | ||||
| @@ -449,12 +449,20 @@ | ||||
|           <context context-type="linenumber">2</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ddb40946e790522301687ecddb9ce1cb8ad40dd1"> | ||||
|         <source>Filter by:</source> | ||||
|         <target>Filtern nach:</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">8</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="cff1428d10d59d14e45edec3c735a27b5482db59"> | ||||
|         <source>Name</source> | ||||
|         <target>Name</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">13</context> | ||||
|           <context context-type="linenumber">9</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8fa4d523f7b91df4390120b85ed0406138273e1a"> | ||||
| @@ -462,7 +470,7 @@ | ||||
|         <target>Farbe</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">14</context> | ||||
|           <context context-type="linenumber">20</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="d0c4488f742efeba0915e90e285a022da813deff"> | ||||
| @@ -470,7 +478,7 @@ | ||||
|         <target>Zuweisung</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">15</context> | ||||
|           <context context-type="linenumber">21</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9bcf8d20d23c111eca1431abd2d2ce0de324499c"> | ||||
| @@ -478,7 +486,7 @@ | ||||
|         <target>Anzahl Dokumente</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">16</context> | ||||
|           <context context-type="linenumber">22</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="030b4423b92167200e39519599f9b863b4f7c62c"> | ||||
| @@ -486,7 +494,7 @@ | ||||
|         <target>Aktionen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|           <context context-type="linenumber">23</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9d51b3c90afda70700229d1b8a55371c13cb3bce"> | ||||
| @@ -494,7 +502,7 @@ | ||||
|         <target>Dokumente</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">32</context> | ||||
|           <context context-type="linenumber">38</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="28f86ffd419b869711aa13f5e5ff54be6d70731c"> | ||||
| @@ -502,7 +510,7 @@ | ||||
|         <target>Bearbeiten</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">37</context> | ||||
|           <context context-type="linenumber">43</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="4990731724078522539"> | ||||
| @@ -542,7 +550,7 @@ | ||||
|         <target>Gespeicherte Ansicht "<x equiv-text="savedView.name" id="PH"/>" gelöscht.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">55</context> | ||||
|           <context context-type="linenumber">63</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5647210819299459618"> | ||||
| @@ -550,7 +558,23 @@ | ||||
|         <target>Einstellungen erfolgreich gespeichert.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">68</context> | ||||
|           <context context-type="linenumber">79</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="6839066544204061364"> | ||||
|         <source>Use system language</source> | ||||
|         <target>Benutze Systemsprache</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7729897675462249787"> | ||||
|         <source>Use date format of display language</source> | ||||
|         <target>Benutze Datumsformat der Anzeigesprache</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8488620293789898901"> | ||||
| @@ -558,7 +582,7 @@ | ||||
|         <target>Fehler beim Speichern der Einstellungen auf dem Server: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">80</context> | ||||
|           <context context-type="linenumber">103</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716"> | ||||
| @@ -582,7 +606,7 @@ | ||||
|         <target>Gespeicherte Ansichten</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">64</context> | ||||
|           <context context-type="linenumber">114</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13"> | ||||
| @@ -593,12 +617,68 @@ | ||||
|           <context context-type="linenumber">13</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="75f8908d266f7cc9b9e68e0be906fd080a223606"> | ||||
|         <source>Display language</source> | ||||
|         <target>Anzeigesprache</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1284a077dc18a2d1ff1b744f16f1797eea28ae37"> | ||||
|         <source>You need to reload the page after applying a new language.</source> | ||||
|         <target>Nachdem Sie eine neue Sprache ausgewählt haben, müssen Sie die Seite neu laden.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">25</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="0cd55822928764cc82a62ee3e6f3adbc1c630479"> | ||||
|         <source>Date display</source> | ||||
|         <target>Datumsanzeige</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">32</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7df4de0d0704a06a302d853e31f2580eba98f127"> | ||||
|         <source>Date format</source> | ||||
|         <target>Datumsformat</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">45</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="69852399a18b8ca4fca8c5bfddd3f00a6d137593"> | ||||
|         <source>Short: <x equiv-text="{{today | customDate:'shortDate':null:computedDateLocale}}" id="INTERPOLATION"/></source> | ||||
|         <target>Kurz: <x equiv-text="{{today | customDate:'shortDate':null:computedDateLocale}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">51</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="d01a59285e711252b98c4f193394e4b854615c78"> | ||||
|         <source>Medium: <x equiv-text="{{today | customDate:'mediumDate':null:computedDateLocale}}" id="INTERPOLATION"/></source> | ||||
|         <target>Mittel: <x equiv-text="{{today | customDate:'mediumDate':null:computedDateLocale}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">55</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="00481629776699b1caebd12b3b1176e2e23740a8"> | ||||
|         <source>Long: <x equiv-text="{{today | customDate:'longDate':null:computedDateLocale}}" id="INTERPOLATION"/></source> | ||||
|         <target>Lang: <x equiv-text="{{today | customDate:'longDate':null:computedDateLocale}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">59</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2045151788cbdda7512752e408da59a6b54a8ef0"> | ||||
|         <source>Items per page</source> | ||||
|         <target>Dokumente pro Seite</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|           <context context-type="linenumber">67</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="c4435e56bf0289e78fedc462f1d21fb30b9de55d"> | ||||
| @@ -606,7 +686,7 @@ | ||||
|         <target>Dokumenteditor</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">33</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="4903e521c9bfd11ce88e7a5575106ef638912e0d"> | ||||
| @@ -614,7 +694,7 @@ | ||||
|         <target>Benutze PDF-Betrachter des Web Browsers</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">37</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="d7db07023e53f8396d18d375c2b78c25fc81c197"> | ||||
| @@ -622,7 +702,7 @@ | ||||
|         <target>Der integrierte PDF-Betrachter des Web-Browsers ist in der Regel schneller bei der Anzeige besonders großer Dokumente, funktioniert aber nicht in allen Browsern.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">37</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9ee5d1cbfd6ee168dae37aaba2b59b50bcabb2ff"> | ||||
| @@ -630,7 +710,7 @@ | ||||
|         <target>Dunkler Modus</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">44</context> | ||||
|           <context context-type="linenumber">94</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="f8cb5506e70fd71fddc9bb71cee18bfff7b29637"> | ||||
| @@ -638,7 +718,7 @@ | ||||
|         <target>Benutze Systemeinstellungen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">47</context> | ||||
|           <context context-type="linenumber">97</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8ee474504043fa89821d626e4f3413240fa91b53"> | ||||
| @@ -646,7 +726,7 @@ | ||||
|         <target>Dunklen Modus aktivieren</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">48</context> | ||||
|           <context context-type="linenumber">98</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="3863a86cd9e69a61d143d3daf51df44203df4a82"> | ||||
| @@ -654,7 +734,7 @@ | ||||
|         <target>Massenbearbeitung</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">52</context> | ||||
|           <context context-type="linenumber">102</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="c0ac61661c6c326d6e0e00c231b95cf2ac0c6586"> | ||||
| @@ -662,7 +742,7 @@ | ||||
|         <target>Bestätigungsdialoge anzeigen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">56</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="291bbe56ecbe945dcf05580a57d679fa7bd1e06a"> | ||||
| @@ -670,7 +750,7 @@ | ||||
|         <target>Beim Löschen von Dokumenten wird immer nach einer Bestätigung gefragt.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">56</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8cfddc13e04f5545ac63f419ef363505d6f78c2e"> | ||||
| @@ -678,7 +758,7 @@ | ||||
|         <target>Anwenden beim Schließen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">57</context> | ||||
|           <context context-type="linenumber">107</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8cb90334f5dfd7fc67205085f59381e2a334ccfc"> | ||||
| @@ -686,7 +766,7 @@ | ||||
|         <target>Erscheint auf</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">76</context> | ||||
|           <context context-type="linenumber">126</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="6717cf1acf04728fc2b7c39f6d3297f8ff15fde5"> | ||||
| @@ -694,7 +774,7 @@ | ||||
|         <target>Auf Startseite zeigen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">79</context> | ||||
|           <context context-type="linenumber">129</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="541bfc5b123b3f8867fd681eaceefb663a811973"> | ||||
| @@ -702,7 +782,7 @@ | ||||
|         <target>In Seitenleiste zeigen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|           <context context-type="linenumber">133</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="abba764a7a595d04dc8c3b26e04b3780d4fdb540"> | ||||
| @@ -710,7 +790,7 @@ | ||||
|         <target>Keine gespeicherten Ansichten vorhanden.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">93</context> | ||||
|           <context context-type="linenumber">143</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ef60a738a565f498b858e903e42bc5ffc3cc1299"> | ||||
| @@ -742,7 +822,7 @@ | ||||
|         <target>Letzter Kontakt</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-list.component.html</context> | ||||
|           <context context-type="linenumber">15</context> | ||||
|           <context context-type="linenumber">22</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1234709746630139322"> | ||||
| @@ -790,7 +870,7 @@ | ||||
|         <target>Zuweisungsalgorithmus</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|           <context context-type="linenumber">10</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="eab7fc7cf2d663e54de934b779fce4275a303f0f"> | ||||
| @@ -798,7 +878,7 @@ | ||||
|         <target>Zuweisungsmuster</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="632e529f49cf3d367dfbd15bd055e9b53aef30fb"> | ||||
| @@ -806,7 +886,7 @@ | ||||
|         <target>Groß-/Kleinschreibung irrelevant</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">13</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9153094873118985366"> | ||||
| @@ -1042,14 +1122,6 @@ | ||||
|           <context context-type="linenumber">46</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ddb40946e790522301687ecddb9ce1cb8ad40dd1"> | ||||
|         <source>Filter by:</source> | ||||
|         <target>Filtern nach:</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context> | ||||
|           <context context-type="linenumber">4</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5"> | ||||
|         <source>Filter tags</source> | ||||
|         <target>Tags filtern</target> | ||||
| @@ -1163,9 +1235,9 @@ | ||||
|           <context context-type="linenumber">50</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1b29a8153575e5ad26cc7dd8bd75c4f45f6bfe7e"> | ||||
|         <source>Created: <x equiv-text="{{document.created | date}}" id="INTERPOLATION"/></source> | ||||
|         <target>Erstellt: <x equiv-text="{{document.created | date}}" id="INTERPOLATION"/></target> | ||||
|       <trans-unit datatype="html" id="849b42384616374df49bd8b3711ec159cb10b845"> | ||||
|         <source>Created: <x equiv-text="{{document.created | customDate}}" id="INTERPOLATION"/></source> | ||||
|         <target>Erstellt: <x equiv-text="{{document.created | customDate}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context> | ||||
|           <context context-type="linenumber">67</context> | ||||
| @@ -1598,6 +1670,38 @@ | ||||
|           <context context-type="linenumber">12</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1206520795340730278"> | ||||
|         <source>English (US)</source> | ||||
|         <target>Englisch (US)</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">74</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1858110241312746425"> | ||||
|         <source>German</source> | ||||
|         <target>Deutsch</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">75</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="3071065188816255493"> | ||||
|         <source>Dutch</source> | ||||
|         <target>Niederländisch</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">76</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7633754075223722162"> | ||||
|         <source>French</source> | ||||
|         <target>Französisch</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">77</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1519954996184640001"> | ||||
|         <source>Error</source> | ||||
|         <target>Fehler</target> | ||||
| @@ -1779,7 +1883,7 @@ | ||||
|         <target>Neues Element erstellen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">43</context> | ||||
|           <context context-type="linenumber">50</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5324147361912094446"> | ||||
| @@ -1787,7 +1891,7 @@ | ||||
|         <target>Element bearbeiten</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">47</context> | ||||
|           <context context-type="linenumber">54</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1699589597032579396"> | ||||
| @@ -1795,7 +1899,7 @@ | ||||
|         <target>Konnte Element nicht speichern: <x equiv-text="error" id="PH"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">51</context> | ||||
|           <context context-type="linenumber">58</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="810888510148304696"> | ||||
| @@ -1803,7 +1907,7 @@ | ||||
|         <target>Automatisch</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">33</context> | ||||
|           <context context-type="linenumber">39</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5044611416737085530"> | ||||
| @@ -1811,7 +1915,7 @@ | ||||
|         <target>Möchten Sie dieses Element wirklich löschen?</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">76</context> | ||||
|           <context context-type="linenumber">97</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8371896857609524947"> | ||||
| @@ -1819,7 +1923,7 @@ | ||||
|         <target>Assoziierte Dokumente werden nicht gelöscht.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|           <context context-type="linenumber">104</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7022070615528435141"> | ||||
| @@ -1827,7 +1931,7 @@ | ||||
|         <target>Löschen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">85</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5467489005440577210"> | ||||
| @@ -1835,7 +1939,7 @@ | ||||
|         <target>Fehler beim Löschen des Elements: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">93</context> | ||||
|           <context context-type="linenumber">114</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5851669019930456395"> | ||||
| @@ -1912,7 +2016,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8419167206585286450"> | ||||
|         <source>Fuzzy: Document contains a word similar to this word</source> | ||||
|         <target>Ungenau: Dokument enthält ein zum folgdendem Wort ähnliches Wort</target> | ||||
|         <target>Ungenau: Dokument enthält ein zum folgendem Wort ähnliches Wort</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/data/matching-model.ts</context> | ||||
|           <context context-type="linenumber">16</context> | ||||
|   | ||||
| @@ -38,7 +38,7 @@ | ||||
|         <target>Sélectionner aucun</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|           <context context-type="linenumber">10</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2ed8a0c2ce4968f8614151eefed20a0aa3daeeb9"> | ||||
| @@ -46,7 +46,7 @@ | ||||
|         <target>Sélectionner la page</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="b463541a7e303aa4d0b1102eaff8afbaf34e7a74"> | ||||
| @@ -54,15 +54,15 @@ | ||||
|         <target>Sélectionner tout</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">13</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ec97f67072a83aaa972536b18d83179f6e4bbec9"> | ||||
|         <source>Sort by</source> | ||||
|         <target>Trier par</target> | ||||
|       <trans-unit datatype="html" id="5d43539fc358c3a548b9d487be821db73e2702ff"> | ||||
|         <source>Sort</source> | ||||
|         <target>Trier</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">41</context> | ||||
|           <context context-type="linenumber">39</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="b7641aed03492978b4ec6843b1e53f30464294d9"> | ||||
| @@ -94,7 +94,7 @@ | ||||
|         <target>{VAR_PLURAL, plural, =1 {<x id="INTERPOLATION"/> document sélectionné sur 1} other {<x id="INTERPOLATION"/> documents sélectionnés sur <x id="INTERPOLATION_1"/>}}</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|           <context context-type="linenumber">85</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="bb773fdeaad5e7fb8e6cd77e1cc558e1b194a0c9"> | ||||
| @@ -102,7 +102,7 @@ | ||||
|         <target>{VAR_PLURAL, plural, =1 {Un document} other {<x id="INTERPOLATION"/> documents}}</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">88</context> | ||||
|           <context context-type="linenumber">86</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="bb91083b44e3f77dd68de773ceab467ca3d57507"> | ||||
| @@ -110,7 +110,7 @@ | ||||
|         <target>(filtré)</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">88</context> | ||||
|           <context context-type="linenumber">86</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ca0b795795658155d44ddca02e95f1feeeb4a88f"> | ||||
| @@ -118,7 +118,7 @@ | ||||
|         <target>NSA</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">107</context> | ||||
|           <context context-type="linenumber">105</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7b5c6286aaded63fb279d6deb8aa8c704e085ced"> | ||||
| @@ -126,7 +126,7 @@ | ||||
|         <target>Correspondant</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">113</context> | ||||
|           <context context-type="linenumber">111</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e"> | ||||
| @@ -134,7 +134,7 @@ | ||||
|         <target>Titre</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">119</context> | ||||
|           <context context-type="linenumber">117</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2bd5919e8098513664a89d5b7b52d61e3063950f"> | ||||
| @@ -142,7 +142,7 @@ | ||||
|         <target>Type de document</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">125</context> | ||||
|           <context context-type="linenumber">123</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1b051734b0ee9021991c91b3ed4e81c244322462"> | ||||
| @@ -150,7 +150,7 @@ | ||||
|         <target>Date de création</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">131</context> | ||||
|           <context context-type="linenumber">129</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="80e3b490720757978c99a7b5af3885faf202b955"> | ||||
| @@ -158,7 +158,7 @@ | ||||
|         <target>Date d'ajout</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">137</context> | ||||
|           <context context-type="linenumber">135</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9021887951960049161"> | ||||
| @@ -166,7 +166,7 @@ | ||||
|         <target>Confirmer la suppression</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||
|           <context context-type="linenumber">186</context> | ||||
|           <context context-type="linenumber">192</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5382975254277698192"> | ||||
| @@ -174,7 +174,7 @@ | ||||
|         <target>Voulez-vous vraiment supprimer le document "<x equiv-text="this.document.title" id="PH"/>" ?</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||
|           <context context-type="linenumber">187</context> | ||||
|           <context context-type="linenumber">193</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="6691075929777935948"> | ||||
| @@ -182,7 +182,7 @@ | ||||
|         <target>Les fichiers liés à ce document seront supprimés définitivement. Cette action est irréversible.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||
|           <context context-type="linenumber">188</context> | ||||
|           <context context-type="linenumber">194</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="719892092227206532"> | ||||
| @@ -190,7 +190,7 @@ | ||||
|         <target>Supprimer le document</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||
|           <context context-type="linenumber">190</context> | ||||
|           <context context-type="linenumber">196</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1844801255494293730"> | ||||
| @@ -198,7 +198,7 @@ | ||||
|         <target>Une erreur s'est produite lors de la suppression du document : <x equiv-text="JSON.stringify(error)" id="PH"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||
|           <context context-type="linenumber">197</context> | ||||
|           <context context-type="linenumber">203</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="826b25211922a1b46436589233cb6f1a163d89b7"> | ||||
| @@ -449,12 +449,20 @@ | ||||
|           <context context-type="linenumber">2</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ddb40946e790522301687ecddb9ce1cb8ad40dd1"> | ||||
|         <source>Filter by:</source> | ||||
|         <target>Filtrer par : </target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">8</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="cff1428d10d59d14e45edec3c735a27b5482db59"> | ||||
|         <source>Name</source> | ||||
|         <target>Nom</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">13</context> | ||||
|           <context context-type="linenumber">9</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8fa4d523f7b91df4390120b85ed0406138273e1a"> | ||||
| @@ -462,7 +470,7 @@ | ||||
|         <target>Couleur</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">14</context> | ||||
|           <context context-type="linenumber">20</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="d0c4488f742efeba0915e90e285a022da813deff"> | ||||
| @@ -470,7 +478,7 @@ | ||||
|         <target>Rapprochement</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">15</context> | ||||
|           <context context-type="linenumber">21</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9bcf8d20d23c111eca1431abd2d2ce0de324499c"> | ||||
| @@ -478,7 +486,7 @@ | ||||
|         <target>Nombre de documents</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">16</context> | ||||
|           <context context-type="linenumber">22</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="030b4423b92167200e39519599f9b863b4f7c62c"> | ||||
| @@ -486,7 +494,7 @@ | ||||
|         <target>Actions</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|           <context context-type="linenumber">23</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9d51b3c90afda70700229d1b8a55371c13cb3bce"> | ||||
| @@ -494,7 +502,7 @@ | ||||
|         <target>Documents</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">32</context> | ||||
|           <context context-type="linenumber">38</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="28f86ffd419b869711aa13f5e5ff54be6d70731c"> | ||||
| @@ -502,7 +510,7 @@ | ||||
|         <target>Éditer</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">37</context> | ||||
|           <context context-type="linenumber">43</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="4990731724078522539"> | ||||
| @@ -542,7 +550,7 @@ | ||||
|         <target>Vue "<x equiv-text="savedView.name" id="PH"/>" supprimée.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">54</context> | ||||
|           <context context-type="linenumber">63</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5647210819299459618"> | ||||
| @@ -550,7 +558,23 @@ | ||||
|         <target>Paramètres enregistrés avec succès.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">74</context> | ||||
|           <context context-type="linenumber">79</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="6839066544204061364"> | ||||
|         <source>Use system language</source> | ||||
|         <target>Utiliser la langue du système</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7729897675462249787"> | ||||
|         <source>Use date format of display language</source> | ||||
|         <target>Utiliser le format de date de la langue d'affichage</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8488620293789898901"> | ||||
| @@ -558,7 +582,7 @@ | ||||
|         <target>Une erreur s'est produite lors de l'enregistrement des paramètres sur le serveur : <x equiv-text="JSON.stringify(error.error)" id="PH"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">86</context> | ||||
|           <context context-type="linenumber">103</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716"> | ||||
| @@ -582,7 +606,7 @@ | ||||
|         <target>Vues enregistrées</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">56</context> | ||||
|           <context context-type="linenumber">114</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13"> | ||||
| @@ -593,12 +617,92 @@ | ||||
|           <context context-type="linenumber">13</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="75f8908d266f7cc9b9e68e0be906fd080a223606"> | ||||
|         <source>Display language</source> | ||||
|         <target>Langue d'affichage</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1284a077dc18a2d1ff1b744f16f1797eea28ae37"> | ||||
|         <source>You need to reload the page after applying a new language.</source> | ||||
|         <target>Vous devez recharger la page après avoir sélectionné une nouvelle langue.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">25</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="0cd55822928764cc82a62ee3e6f3adbc1c630479"> | ||||
|         <source>Date display</source> | ||||
|         <target>Affichage de la date</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">32</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7df4de0d0704a06a302d853e31f2580eba98f127"> | ||||
|         <source>Date format</source> | ||||
|         <target>Format de date</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">45</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="69852399a18b8ca4fca8c5bfddd3f00a6d137593"> | ||||
|         <source>Short: <x equiv-text="{{today | customDate:'shortDate':null:computedDateLocale}}" id="INTERPOLATION"/></source> | ||||
|         <target>Court : <x equiv-text="{{today | customDate:'shortDate':null:computedDateLocale}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">51</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="d01a59285e711252b98c4f193394e4b854615c78"> | ||||
|         <source>Medium: <x equiv-text="{{today | customDate:'mediumDate':null:computedDateLocale}}" id="INTERPOLATION"/></source> | ||||
|         <target>Moyen : <x equiv-text="{{today | customDate:'mediumDate':null:computedDateLocale}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">55</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="00481629776699b1caebd12b3b1176e2e23740a8"> | ||||
|         <source>Long: <x equiv-text="{{today | customDate:'longDate':null:computedDateLocale}}" id="INTERPOLATION"/></source> | ||||
|         <target>Long : <x equiv-text="{{today | customDate:'longDate':null:computedDateLocale}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">59</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2045151788cbdda7512752e408da59a6b54a8ef0"> | ||||
|         <source>Items per page</source> | ||||
|         <target>Éléments par page</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|           <context context-type="linenumber">67</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="c4435e56bf0289e78fedc462f1d21fb30b9de55d"> | ||||
|         <source>Document editor</source> | ||||
|         <target>Visionneuse de documents</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="4903e521c9bfd11ce88e7a5575106ef638912e0d"> | ||||
|         <source>Use PDF viewer provided by the browser</source> | ||||
|         <target>Utiliser la visionneuse PDF fournie par le navigateur</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="d7db07023e53f8396d18d375c2b78c25fc81c197"> | ||||
|         <source>This is usually faster for displaying large PDF documents, but it might not work on some browsers.</source> | ||||
|         <target>Cette option est généralement plus rapide pour l'affichage de grands documents PDF, mais elle peut ne pas fonctionner sur certains navigateurs.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9ee5d1cbfd6ee168dae37aaba2b59b50bcabb2ff"> | ||||
| @@ -606,7 +710,7 @@ | ||||
|         <target>Mode sombre</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">33</context> | ||||
|           <context context-type="linenumber">94</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="f8cb5506e70fd71fddc9bb71cee18bfff7b29637"> | ||||
| @@ -614,39 +718,7 @@ | ||||
|         <target>Utiliser les paramètres du système</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">36</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="3863a86cd9e69a61d143d3daf51df44203df4a82"> | ||||
|         <source>Bulk editing</source> | ||||
|         <target>Edition en masse</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">44</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="c0ac61661c6c326d6e0e00c231b95cf2ac0c6586"> | ||||
|         <source>Show confirmation dialogs</source> | ||||
|         <target>Afficher les messages de confirmation</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">48</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="291bbe56ecbe945dcf05580a57d679fa7bd1e06a"> | ||||
|         <source>Deleting documents will always ask for confirmation.</source> | ||||
|         <target>La suppression de documents requiert toujours une confirmation.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">48</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8cfddc13e04f5545ac63f419ef363505d6f78c2e"> | ||||
|         <source>Apply on close</source> | ||||
|         <target>Appliquer lors de la fermeture</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">49</context> | ||||
|           <context context-type="linenumber">97</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8ee474504043fa89821d626e4f3413240fa91b53"> | ||||
| @@ -654,7 +726,39 @@ | ||||
|         <target>Activer le mode sombre</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">39</context> | ||||
|           <context context-type="linenumber">98</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="3863a86cd9e69a61d143d3daf51df44203df4a82"> | ||||
|         <source>Bulk editing</source> | ||||
|         <target>Edition en masse</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">102</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="c0ac61661c6c326d6e0e00c231b95cf2ac0c6586"> | ||||
|         <source>Show confirmation dialogs</source> | ||||
|         <target>Afficher les messages de confirmation</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="291bbe56ecbe945dcf05580a57d679fa7bd1e06a"> | ||||
|         <source>Deleting documents will always ask for confirmation.</source> | ||||
|         <target>La suppression de documents requiert toujours une confirmation.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8cfddc13e04f5545ac63f419ef363505d6f78c2e"> | ||||
|         <source>Apply on close</source> | ||||
|         <target>Appliquer lors de la fermeture</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">107</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8cb90334f5dfd7fc67205085f59381e2a334ccfc"> | ||||
| @@ -662,7 +766,7 @@ | ||||
|         <target>Apparaît sur</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">68</context> | ||||
|           <context context-type="linenumber">126</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="6717cf1acf04728fc2b7c39f6d3297f8ff15fde5"> | ||||
| @@ -670,7 +774,7 @@ | ||||
|         <target>Montrer sur le tableau de bord</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">71</context> | ||||
|           <context context-type="linenumber">129</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="541bfc5b123b3f8867fd681eaceefb663a811973"> | ||||
| @@ -678,7 +782,7 @@ | ||||
|         <target>Montrer dans la barre latérale</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">75</context> | ||||
|           <context context-type="linenumber">133</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="abba764a7a595d04dc8c3b26e04b3780d4fdb540"> | ||||
| @@ -686,7 +790,7 @@ | ||||
|         <target>Aucune vue sauvegardée n'est définie.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">85</context> | ||||
|           <context context-type="linenumber">143</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ef60a738a565f498b858e903e42bc5ffc3cc1299"> | ||||
| @@ -718,7 +822,7 @@ | ||||
|         <target>Dernière correspondance</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-list.component.html</context> | ||||
|           <context context-type="linenumber">15</context> | ||||
|           <context context-type="linenumber">22</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1234709746630139322"> | ||||
| @@ -766,7 +870,7 @@ | ||||
|         <target>Algorithme de rapprochement</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|           <context context-type="linenumber">10</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="eab7fc7cf2d663e54de934b779fce4275a303f0f"> | ||||
| @@ -774,7 +878,7 @@ | ||||
|         <target>Modèle de rapprochement</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="632e529f49cf3d367dfbd15bd055e9b53aef30fb"> | ||||
| @@ -782,7 +886,7 @@ | ||||
|         <target>Insensible à la casse</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">13</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9153094873118985366"> | ||||
| @@ -1018,14 +1122,6 @@ | ||||
|           <context context-type="linenumber">46</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ddb40946e790522301687ecddb9ce1cb8ad40dd1"> | ||||
|         <source>Filter by:</source> | ||||
|         <target>Filtrer par : </target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context> | ||||
|           <context context-type="linenumber">4</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5"> | ||||
|         <source>Filter tags</source> | ||||
|         <target>Filtrer les étiquettes</target> | ||||
| @@ -1039,7 +1135,7 @@ | ||||
|         <target>Filtrer les correspondants</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context> | ||||
|           <context context-type="linenumber">19</context> | ||||
|           <context context-type="linenumber">20</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="0ad509732aaf702b7ea8c771c7809fa84bc85908"> | ||||
| @@ -1047,7 +1143,7 @@ | ||||
|         <target>Filtrer les types de documents</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context> | ||||
|           <context context-type="linenumber">25</context> | ||||
|           <context context-type="linenumber">27</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2d9d55f1b70142ff4597ba32179d16888fd9c6b2"> | ||||
| @@ -1055,7 +1151,7 @@ | ||||
|         <target>Réinitialiser les filtres</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context> | ||||
|           <context context-type="linenumber">47</context> | ||||
|           <context context-type="linenumber">50</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7593728289020204896"> | ||||
| @@ -1063,7 +1159,7 @@ | ||||
|         <target>Non affecté</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts</context> | ||||
|           <context context-type="linenumber">161</context> | ||||
|           <context context-type="linenumber">166</context> | ||||
|         </context-group> | ||||
|         <note from="description" priority="1">Filter drop down element to filter for documents with no correspondent/type/tag assigned</note> | ||||
|       </trans-unit> | ||||
| @@ -1072,7 +1168,7 @@ | ||||
|         <target>Appliquer</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/filterable-dropdown/filterable-dropdown.component.html</context> | ||||
|           <context context-type="linenumber">28</context> | ||||
|           <context context-type="linenumber">26</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="4873149362496451858"> | ||||
| @@ -1139,12 +1235,12 @@ | ||||
|           <context context-type="linenumber">50</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1b29a8153575e5ad26cc7dd8bd75c4f45f6bfe7e"> | ||||
|         <source>Created: <x equiv-text="{{document.created | date}}" id="INTERPOLATION"/></source> | ||||
|         <target>Créé le : <x equiv-text="{{document.created | date}}" id="INTERPOLATION"/></target> | ||||
|       <trans-unit datatype="html" id="849b42384616374df49bd8b3711ec159cb10b845"> | ||||
|         <source>Created: <x equiv-text="{{document.created | customDate}}" id="INTERPOLATION"/></source> | ||||
|         <target>Créé le : <x equiv-text="{{document.created | customDate}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context> | ||||
|           <context context-type="linenumber">65</context> | ||||
|           <context context-type="linenumber">67</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="cd6f3fd48957e1fea6545c2b2defc7b2435ebfa8"> | ||||
| @@ -1168,7 +1264,7 @@ | ||||
|         <target>Score :</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context> | ||||
|           <context context-type="linenumber">61</context> | ||||
|           <context context-type="linenumber">62</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2840db547019ce8c76b2cdbe3a1653c5b68b06af"> | ||||
| @@ -1355,7 +1451,7 @@ | ||||
|         <target>Sélectionner :</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|           <context context-type="linenumber">10</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="dfc3c34e182ea73c5d784ff7c8135f087992dac1"> | ||||
| @@ -1363,7 +1459,7 @@ | ||||
|         <target>Tout</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context> | ||||
|           <context context-type="linenumber">21</context> | ||||
|           <context context-type="linenumber">20</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="907df6a2b68daecc3c399cf40a764b358bd9fd84"> | ||||
| @@ -1371,7 +1467,7 @@ | ||||
|         <target>Éditer :</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context> | ||||
|           <context context-type="linenumber">28</context> | ||||
|           <context context-type="linenumber">27</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="27d158b47717ff9305d19866960418c603f19d55"> | ||||
| @@ -1574,6 +1670,38 @@ | ||||
|           <context context-type="linenumber">12</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1206520795340730278"> | ||||
|         <source>English (US)</source> | ||||
|         <target>Anglais (US)</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">74</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1858110241312746425"> | ||||
|         <source>German</source> | ||||
|         <target>Allemand</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">75</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="3071065188816255493"> | ||||
|         <source>Dutch</source> | ||||
|         <target>Néerlandais</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">76</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7633754075223722162"> | ||||
|         <source>French</source> | ||||
|         <target>Français</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">77</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1519954996184640001"> | ||||
|         <source>Error</source> | ||||
|         <target>Erreur</target> | ||||
| @@ -1755,7 +1883,7 @@ | ||||
|         <target>Créer un nouvel élément</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">43</context> | ||||
|           <context context-type="linenumber">50</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5324147361912094446"> | ||||
| @@ -1763,7 +1891,7 @@ | ||||
|         <target>Éditer l'élément</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">47</context> | ||||
|           <context context-type="linenumber">54</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1699589597032579396"> | ||||
| @@ -1771,7 +1899,7 @@ | ||||
|         <target>Impossible d'enregistrer l'élément : <x equiv-text="error" id="PH"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">51</context> | ||||
|           <context context-type="linenumber">58</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="810888510148304696"> | ||||
| @@ -1779,7 +1907,7 @@ | ||||
|         <target>Automatique</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">33</context> | ||||
|           <context context-type="linenumber">39</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5044611416737085530"> | ||||
| @@ -1787,7 +1915,7 @@ | ||||
|         <target>Voulez-vous vraiment supprimer cet élément ?</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">76</context> | ||||
|           <context context-type="linenumber">97</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8371896857609524947"> | ||||
| @@ -1795,7 +1923,7 @@ | ||||
|         <target>Les documents associés ne seront pas supprimés.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|           <context context-type="linenumber">104</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7022070615528435141"> | ||||
| @@ -1803,7 +1931,7 @@ | ||||
|         <target>Supprimer</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">85</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5467489005440577210"> | ||||
| @@ -1811,7 +1939,7 @@ | ||||
|         <target>Une erreur s'est produite lors de la suppression de l'élément : <x equiv-text="JSON.stringify(error.error)" id="PH"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">93</context> | ||||
|           <context context-type="linenumber">114</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5851669019930456395"> | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2155249406916744630"> | ||||
|         <source>View "<x equiv-text="this.list.savedView.name" id="PH"/>" saved successfully.</source> | ||||
|         <target>View &quot;<x equiv-text="this.list.savedView.name" id="PH"/>&quot; met succes opgeslagen.</target> | ||||
|         <target>View "<x equiv-text="this.list.savedView.name" id="PH"/>" met succes opgeslagen.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> | ||||
|           <context context-type="linenumber">94</context> | ||||
| @@ -19,7 +19,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="6837554170707123455"> | ||||
|         <source>View "<x equiv-text="savedView.name" id="PH"/>" created successfully.</source> | ||||
|         <target>View &quot;<x equiv-text="savedView.name" id="PH"/>&quot; met succes gemaakt.</target> | ||||
|         <target>View "<x equiv-text="savedView.name" id="PH"/>" met succes gemaakt.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> | ||||
|           <context context-type="linenumber">115</context> | ||||
| @@ -38,7 +38,7 @@ | ||||
|         <target>Niets selecteren</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|           <context context-type="linenumber">10</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2ed8a0c2ce4968f8614151eefed20a0aa3daeeb9"> | ||||
| @@ -46,7 +46,7 @@ | ||||
|         <target>Selecteer pagina</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="b463541a7e303aa4d0b1102eaff8afbaf34e7a74"> | ||||
| @@ -54,15 +54,15 @@ | ||||
|         <target>Alles selecteren</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">13</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ec97f67072a83aaa972536b18d83179f6e4bbec9"> | ||||
|         <source>Sort by</source> | ||||
|         <target>Sorteer op</target> | ||||
|       <trans-unit datatype="html" id="5d43539fc358c3a548b9d487be821db73e2702ff"> | ||||
|         <source>Sort</source> | ||||
|         <target>Sorteren</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">41</context> | ||||
|           <context context-type="linenumber">39</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="b7641aed03492978b4ec6843b1e53f30464294d9"> | ||||
| @@ -83,7 +83,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="72e7d343f9165602cce1ca7faffbc565fd31ef92"> | ||||
|         <source>Save "<x equiv-text="{{list.savedViewTitle}}" id="INTERPOLATION"/>"</source> | ||||
|         <target>Opslaan &quot;<x equiv-text="{{list.savedViewTitle}}" id="INTERPOLATION"/>&quot;</target> | ||||
|         <target>Opslaan "<x equiv-text="{{list.savedViewTitle}}" id="INTERPOLATION"/>"</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">71</context> | ||||
| @@ -94,7 +94,7 @@ | ||||
|         <target>{VAR_PLURAL, plural, =1 {<x id="INTERPOLATION"/> van één document geselecteerd} other {<x id="INTERPOLATION"/> van <x id="INTERPOLATION_1"/> documenten geselecteerd}}</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|           <context context-type="linenumber">85</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="bb773fdeaad5e7fb8e6cd77e1cc558e1b194a0c9"> | ||||
| @@ -102,7 +102,7 @@ | ||||
|         <target>{VAR_PLURAL, plural, =1 {Eén document} other {<x id="INTERPOLATION"/> documenten}}</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">88</context> | ||||
|           <context context-type="linenumber">86</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="bb91083b44e3f77dd68de773ceab467ca3d57507"> | ||||
| @@ -110,7 +110,7 @@ | ||||
|         <target>(gefilterd)</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">88</context> | ||||
|           <context context-type="linenumber">86</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ca0b795795658155d44ddca02e95f1feeeb4a88f"> | ||||
| @@ -118,7 +118,7 @@ | ||||
|         <target>ASN</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">107</context> | ||||
|           <context context-type="linenumber">105</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7b5c6286aaded63fb279d6deb8aa8c704e085ced"> | ||||
| @@ -126,7 +126,7 @@ | ||||
|         <target>Correspondent</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">113</context> | ||||
|           <context context-type="linenumber">111</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e"> | ||||
| @@ -134,7 +134,7 @@ | ||||
|         <target>Titel</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">119</context> | ||||
|           <context context-type="linenumber">117</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2bd5919e8098513664a89d5b7b52d61e3063950f"> | ||||
| @@ -142,7 +142,7 @@ | ||||
|         <target>Documenttype</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">125</context> | ||||
|           <context context-type="linenumber">123</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1b051734b0ee9021991c91b3ed4e81c244322462"> | ||||
| @@ -150,7 +150,7 @@ | ||||
|         <target>Aangemaakt</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">131</context> | ||||
|           <context context-type="linenumber">129</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="80e3b490720757978c99a7b5af3885faf202b955"> | ||||
| @@ -158,7 +158,7 @@ | ||||
|         <target>Toegevoegd</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> | ||||
|           <context context-type="linenumber">137</context> | ||||
|           <context context-type="linenumber">135</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9021887951960049161"> | ||||
| @@ -166,15 +166,15 @@ | ||||
|         <target>Bevestig het verwijderen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||
|           <context context-type="linenumber">186</context> | ||||
|           <context context-type="linenumber">192</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5382975254277698192"> | ||||
|         <source>Do you really want to delete document "<x equiv-text="this.document.title" id="PH"/>"?</source> | ||||
|         <target>Wilt u het document echt verwijderen &quot;<x equiv-text="this.document.title" id="PH"/>&quot;?</target> | ||||
|         <target>Wilt u het document echt verwijderen "<x equiv-text="this.document.title" id="PH"/>"?</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||
|           <context context-type="linenumber">187</context> | ||||
|           <context context-type="linenumber">193</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="6691075929777935948"> | ||||
| @@ -182,7 +182,7 @@ | ||||
|         <target>De bestanden voor dit document worden definitief verwijderd. Deze bewerking kan niet ongedaan worden gemaakt.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||
|           <context context-type="linenumber">188</context> | ||||
|           <context context-type="linenumber">194</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="719892092227206532"> | ||||
| @@ -190,7 +190,7 @@ | ||||
|         <target>Verwijder document</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||
|           <context context-type="linenumber">190</context> | ||||
|           <context context-type="linenumber">196</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1844801255494293730"> | ||||
| @@ -198,7 +198,7 @@ | ||||
|         <target>Fout bij het verwijderen van het document: <x equiv-text="JSON.stringify(error)" id="PH"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||
|           <context context-type="linenumber">197</context> | ||||
|           <context context-type="linenumber">203</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="826b25211922a1b46436589233cb6f1a163d89b7"> | ||||
| @@ -427,7 +427,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="93754014749412887"> | ||||
|         <source>Do you really want to delete the tag "<x equiv-text="object.name" id="PH"/>"?</source> | ||||
|         <target>Wil je het etiket echt verwijderen &quot;<x equiv-text="object.name" id="PH"/>&quot;?</target> | ||||
|         <target>Wil je het etiket echt verwijderen "<x equiv-text="object.name" id="PH"/>"?</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.ts</context> | ||||
|           <context context-type="linenumber">30</context> | ||||
| @@ -449,12 +449,20 @@ | ||||
|           <context context-type="linenumber">2</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ddb40946e790522301687ecddb9ce1cb8ad40dd1"> | ||||
|         <source>Filter by:</source> | ||||
|         <target>Filter op:</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">8</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="cff1428d10d59d14e45edec3c735a27b5482db59"> | ||||
|         <source>Name</source> | ||||
|         <target>Naam</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">13</context> | ||||
|           <context context-type="linenumber">9</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8fa4d523f7b91df4390120b85ed0406138273e1a"> | ||||
| @@ -462,7 +470,7 @@ | ||||
|         <target>Kleur</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">14</context> | ||||
|           <context context-type="linenumber">20</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="d0c4488f742efeba0915e90e285a022da813deff"> | ||||
| @@ -470,7 +478,7 @@ | ||||
|         <target>Overeenkomend</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">15</context> | ||||
|           <context context-type="linenumber">21</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9bcf8d20d23c111eca1431abd2d2ce0de324499c"> | ||||
| @@ -478,7 +486,7 @@ | ||||
|         <target>Aantal documenten</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">16</context> | ||||
|           <context context-type="linenumber">22</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="030b4423b92167200e39519599f9b863b4f7c62c"> | ||||
| @@ -486,7 +494,7 @@ | ||||
|         <target>Acties</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|           <context context-type="linenumber">23</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9d51b3c90afda70700229d1b8a55371c13cb3bce"> | ||||
| @@ -494,7 +502,7 @@ | ||||
|         <target>Documenten</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">32</context> | ||||
|           <context context-type="linenumber">38</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="28f86ffd419b869711aa13f5e5ff54be6d70731c"> | ||||
| @@ -502,12 +510,12 @@ | ||||
|         <target>Bewerk</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context> | ||||
|           <context context-type="linenumber">37</context> | ||||
|           <context context-type="linenumber">43</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="4990731724078522539"> | ||||
|         <source>Do you really want to delete the document type "<x equiv-text="object.name" id="PH"/>"?</source> | ||||
|         <target>Wilt u het documenttype echt verwijderen &quot;<x equiv-text="object.name" id="PH"/>&quot;?</target> | ||||
|         <target>Wilt u het documenttype echt verwijderen "<x equiv-text="object.name" id="PH"/>"?</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/document-type-list/document-type-list.component.ts</context> | ||||
|           <context context-type="linenumber">26</context> | ||||
| @@ -539,10 +547,10 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5610279464668232148"> | ||||
|         <source>Saved view "<x equiv-text="savedView.name" id="PH"/>" deleted.</source> | ||||
|         <target>Opgeslagen view &quot;<x equiv-text="savedView.name" id="PH"/>&quot; verwijderd.</target> | ||||
|         <target>Opgeslagen view "<x equiv-text="savedView.name" id="PH"/>" verwijderd.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">54</context> | ||||
|           <context context-type="linenumber">63</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5647210819299459618"> | ||||
| @@ -550,7 +558,23 @@ | ||||
|         <target>Instellingen succesvol opgeslagen.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">74</context> | ||||
|           <context context-type="linenumber">79</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="6839066544204061364"> | ||||
|         <source>Use system language</source> | ||||
|         <target>Gebruik de systeemtaal</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7729897675462249787"> | ||||
|         <source>Use date format of display language</source> | ||||
|         <target>Datumopmaak van weergavetaal gebruiken</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8488620293789898901"> | ||||
| @@ -558,7 +582,7 @@ | ||||
|         <target>Fout bij het opslaan van de instellingen: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context> | ||||
|           <context context-type="linenumber">86</context> | ||||
|           <context context-type="linenumber">103</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716"> | ||||
| @@ -582,7 +606,7 @@ | ||||
|         <target>Opgeslagen views</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">56</context> | ||||
|           <context context-type="linenumber">114</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13"> | ||||
| @@ -593,12 +617,92 @@ | ||||
|           <context context-type="linenumber">13</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="75f8908d266f7cc9b9e68e0be906fd080a223606"> | ||||
|         <source>Display language</source> | ||||
|         <target>Taal</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1284a077dc18a2d1ff1b744f16f1797eea28ae37"> | ||||
|         <source>You need to reload the page after applying a new language.</source> | ||||
|         <target>De pagina moet herladen worden nadat een andere taal werd gekozen.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">25</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="0cd55822928764cc82a62ee3e6f3adbc1c630479"> | ||||
|         <source>Date display</source> | ||||
|         <target>Datumweergave</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">32</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7df4de0d0704a06a302d853e31f2580eba98f127"> | ||||
|         <source>Date format</source> | ||||
|         <target>Datumopmaak</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">45</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="69852399a18b8ca4fca8c5bfddd3f00a6d137593"> | ||||
|         <source>Short: <x equiv-text="{{today | customDate:'shortDate':null:computedDateLocale}}" id="INTERPOLATION"/></source> | ||||
|         <target>Kort: <x equiv-text="{{today | customDate:'shortDate':null:computedDateLocale}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">51</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="d01a59285e711252b98c4f193394e4b854615c78"> | ||||
|         <source>Medium: <x equiv-text="{{today | customDate:'mediumDate':null:computedDateLocale}}" id="INTERPOLATION"/></source> | ||||
|         <target>Medium: <x equiv-text="{{today | customDate:'mediumDate':null:computedDateLocale}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">55</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="00481629776699b1caebd12b3b1176e2e23740a8"> | ||||
|         <source>Long: <x equiv-text="{{today | customDate:'longDate':null:computedDateLocale}}" id="INTERPOLATION"/></source> | ||||
|         <target>Lang: <x equiv-text="{{today | customDate:'longDate':null:computedDateLocale}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">59</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2045151788cbdda7512752e408da59a6b54a8ef0"> | ||||
|         <source>Items per page</source> | ||||
|         <target>Resultaten per pagina</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">17</context> | ||||
|           <context context-type="linenumber">67</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="c4435e56bf0289e78fedc462f1d21fb30b9de55d"> | ||||
|         <source>Document editor</source> | ||||
|         <target>Documentbewerker</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="4903e521c9bfd11ce88e7a5575106ef638912e0d"> | ||||
|         <source>Use PDF viewer provided by the browser</source> | ||||
|         <target>Gebruik de PDF lezer ingebouwd in uw browser</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="d7db07023e53f8396d18d375c2b78c25fc81c197"> | ||||
|         <source>This is usually faster for displaying large PDF documents, but it might not work on some browsers.</source> | ||||
|         <target>Dit is gewoonlijk sneller om grote PDF's te tonen, maar werkt niet bij elke browser.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">87</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9ee5d1cbfd6ee168dae37aaba2b59b50bcabb2ff"> | ||||
| @@ -606,7 +710,7 @@ | ||||
|         <target>Nachtmodus</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">33</context> | ||||
|           <context context-type="linenumber">94</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="f8cb5506e70fd71fddc9bb71cee18bfff7b29637"> | ||||
| @@ -614,39 +718,7 @@ | ||||
|         <target>Gebruik systeeminstellingen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">36</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="3863a86cd9e69a61d143d3daf51df44203df4a82"> | ||||
|         <source>Bulk editing</source> | ||||
|         <target>Massabewerking</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">44</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="c0ac61661c6c326d6e0e00c231b95cf2ac0c6586"> | ||||
|         <source>Show confirmation dialogs</source> | ||||
|         <target>Toon dialoogvenster ter bevestiging</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">48</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="291bbe56ecbe945dcf05580a57d679fa7bd1e06a"> | ||||
|         <source>Deleting documents will always ask for confirmation.</source> | ||||
|         <target>Er zal altijd om bevestiging gevraagd worden voor het verwijderen van documenten.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">48</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8cfddc13e04f5545ac63f419ef363505d6f78c2e"> | ||||
|         <source>Apply on close</source> | ||||
|         <target>Toepassen bij het sluiten</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">49</context> | ||||
|           <context context-type="linenumber">97</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8ee474504043fa89821d626e4f3413240fa91b53"> | ||||
| @@ -654,7 +726,39 @@ | ||||
|         <target>Gebruik nachtmodus</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">39</context> | ||||
|           <context context-type="linenumber">98</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="3863a86cd9e69a61d143d3daf51df44203df4a82"> | ||||
|         <source>Bulk editing</source> | ||||
|         <target>Massabewerking</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">102</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="c0ac61661c6c326d6e0e00c231b95cf2ac0c6586"> | ||||
|         <source>Show confirmation dialogs</source> | ||||
|         <target>Toon dialoogvenster ter bevestiging</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="291bbe56ecbe945dcf05580a57d679fa7bd1e06a"> | ||||
|         <source>Deleting documents will always ask for confirmation.</source> | ||||
|         <target>Er zal altijd om bevestiging gevraagd worden voor het verwijderen van documenten.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8cfddc13e04f5545ac63f419ef363505d6f78c2e"> | ||||
|         <source>Apply on close</source> | ||||
|         <target>Toepassen bij het sluiten</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">107</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8cb90334f5dfd7fc67205085f59381e2a334ccfc"> | ||||
| @@ -662,7 +766,7 @@ | ||||
|         <target>Komt voor bij</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">68</context> | ||||
|           <context context-type="linenumber">126</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="6717cf1acf04728fc2b7c39f6d3297f8ff15fde5"> | ||||
| @@ -670,7 +774,7 @@ | ||||
|         <target>Toon op het dashboard</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">71</context> | ||||
|           <context context-type="linenumber">129</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="541bfc5b123b3f8867fd681eaceefb663a811973"> | ||||
| @@ -678,7 +782,7 @@ | ||||
|         <target>Toon in de zijbalk</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">75</context> | ||||
|           <context context-type="linenumber">133</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="abba764a7a595d04dc8c3b26e04b3780d4fdb540"> | ||||
| @@ -686,7 +790,7 @@ | ||||
|         <target>Geen opgeslagen views gedefinieerd.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context> | ||||
|           <context context-type="linenumber">85</context> | ||||
|           <context context-type="linenumber">143</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ef60a738a565f498b858e903e42bc5ffc3cc1299"> | ||||
| @@ -699,7 +803,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7427874343955308724"> | ||||
|         <source>Do you really want to delete the correspondent "<x equiv-text="object.name" id="PH"/>"?</source> | ||||
|         <target>Bent u zeker dat u correspondent &quot;<x equiv-text="object.name" id="PH"/>&quot; wilt verwijderen?</target> | ||||
|         <target>Bent u zeker dat u correspondent "<x equiv-text="object.name" id="PH"/>" wilt verwijderen?</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-list.component.ts</context> | ||||
|           <context context-type="linenumber">26</context> | ||||
| @@ -718,7 +822,7 @@ | ||||
|         <target>Laatste correspondentie</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-list.component.html</context> | ||||
|           <context context-type="linenumber">15</context> | ||||
|           <context context-type="linenumber">22</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1234709746630139322"> | ||||
| @@ -766,7 +870,7 @@ | ||||
|         <target>Algoritme voor het bepalen van de overeenkomst</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|           <context context-type="linenumber">10</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="eab7fc7cf2d663e54de934b779fce4275a303f0f"> | ||||
| @@ -774,7 +878,7 @@ | ||||
|         <target>Patroon voor overeenkomst</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="632e529f49cf3d367dfbd15bd055e9b53aef30fb"> | ||||
| @@ -782,7 +886,7 @@ | ||||
|         <target>Niet hoofdlettergevoelig</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-edit-dialog/correspondent-edit-dialog.component.html</context> | ||||
|           <context context-type="linenumber">13</context> | ||||
|           <context context-type="linenumber">12</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="9153094873118985366"> | ||||
| @@ -867,7 +971,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="afa760e48c97d64d19c1455d18b7834a2256e23f"> | ||||
|         <source>Did you mean "<x equiv-text="<a [routerLink]="" (click)="searchCorrectedQuery()">{{correctedQuery}}" id="START_LINK"/><x equiv-text="{{correctedQuery}}</a>" id="INTERPOLATION"/><x equiv-text="</a>" id="CLOSE_LINK"/>"?</source> | ||||
|         <target>Bedoelde u &quot;<x equiv-text="<a [routerLink]="" (click)="searchCorrectedQuery()">{{correctedQuery}}" id="START_LINK"/><x equiv-text="{{correctedQuery}}</a>" id="INTERPOLATION"/><x equiv-text="</a>" id="CLOSE_LINK"/>&quot;?</target> | ||||
|         <target>Bedoelde u "<x equiv-text="<a [routerLink]="" (click)="searchCorrectedQuery()">{{correctedQuery}}" id="START_LINK"/><x equiv-text="{{correctedQuery}}</a>" id="INTERPOLATION"/><x equiv-text="</a>" id="CLOSE_LINK"/>"?</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/search/search.component.html</context> | ||||
|           <context context-type="linenumber">13</context> | ||||
| @@ -1018,14 +1122,6 @@ | ||||
|           <context context-type="linenumber">46</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="ddb40946e790522301687ecddb9ce1cb8ad40dd1"> | ||||
|         <source>Filter by:</source> | ||||
|         <target>Filter op:</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context> | ||||
|           <context context-type="linenumber">4</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5"> | ||||
|         <source>Filter tags</source> | ||||
|         <target>Etiketten filteren</target> | ||||
| @@ -1039,7 +1135,7 @@ | ||||
|         <target>Correspondenten filteren</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context> | ||||
|           <context context-type="linenumber">19</context> | ||||
|           <context context-type="linenumber">20</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="0ad509732aaf702b7ea8c771c7809fa84bc85908"> | ||||
| @@ -1047,7 +1143,7 @@ | ||||
|         <target>Documenttypes filteren</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context> | ||||
|           <context context-type="linenumber">25</context> | ||||
|           <context context-type="linenumber">27</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2d9d55f1b70142ff4597ba32179d16888fd9c6b2"> | ||||
| @@ -1055,7 +1151,7 @@ | ||||
|         <target>Filters terug zetten</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context> | ||||
|           <context context-type="linenumber">47</context> | ||||
|           <context context-type="linenumber">50</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7593728289020204896"> | ||||
| @@ -1063,7 +1159,7 @@ | ||||
|         <target>Niet toegekend</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts</context> | ||||
|           <context context-type="linenumber">161</context> | ||||
|           <context context-type="linenumber">166</context> | ||||
|         </context-group> | ||||
|         <note from="description" priority="1">Filter drop down element to filter for documents with no correspondent/type/tag assigned</note> | ||||
|       </trans-unit> | ||||
| @@ -1072,7 +1168,7 @@ | ||||
|         <target>Toepassen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/filterable-dropdown/filterable-dropdown.component.html</context> | ||||
|           <context context-type="linenumber">28</context> | ||||
|           <context context-type="linenumber">26</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="4873149362496451858"> | ||||
| @@ -1139,12 +1235,12 @@ | ||||
|           <context context-type="linenumber">50</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1b29a8153575e5ad26cc7dd8bd75c4f45f6bfe7e"> | ||||
|         <source>Created: <x equiv-text="{{document.created | date}}" id="INTERPOLATION"/></source> | ||||
|         <target>Aangemaakt op: <x equiv-text="{{document.created | date}}" id="INTERPOLATION"/></target> | ||||
|       <trans-unit datatype="html" id="849b42384616374df49bd8b3711ec159cb10b845"> | ||||
|         <source>Created: <x equiv-text="{{document.created | customDate}}" id="INTERPOLATION"/></source> | ||||
|         <target>Aangemaakt op: <x equiv-text="{{document.created | customDate}}" id="INTERPOLATION"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context> | ||||
|           <context context-type="linenumber">65</context> | ||||
|           <context context-type="linenumber">67</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="cd6f3fd48957e1fea6545c2b2defc7b2435ebfa8"> | ||||
| @@ -1168,7 +1264,7 @@ | ||||
|         <target>Score:</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context> | ||||
|           <context context-type="linenumber">61</context> | ||||
|           <context context-type="linenumber">62</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="2840db547019ce8c76b2cdbe3a1653c5b68b06af"> | ||||
| @@ -1189,7 +1285,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8639884465898458690"> | ||||
|         <source>"<x equiv-text="items[0].name" id="PH"/>" and "<x equiv-text="items[1].name" id="PH_1"/>"</source> | ||||
|         <target>&quot;<x equiv-text="items[0].name" id="PH"/>&quot; en &quot;<x equiv-text="items[1].name" id="PH_1"/>&quot;</target> | ||||
|         <target>"<x equiv-text="items[0].name" id="PH"/>" en "<x equiv-text="items[1].name" id="PH_1"/>"</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> | ||||
|           <context context-type="linenumber">114</context> | ||||
| @@ -1198,7 +1294,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7894972847287473517"> | ||||
|         <source>"<x equiv-text="i.name" id="PH"/>"</source> | ||||
|         <target>&quot;<x equiv-text="i.name" id="PH"/>&quot;</target> | ||||
|         <target>"<x equiv-text="i.name" id="PH"/>"</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> | ||||
|           <context context-type="linenumber">116</context> | ||||
| @@ -1215,7 +1311,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1822679894391095557"> | ||||
|         <source><x equiv-text="list" id="PH"/> and "<x equiv-text="items[items.length - 1].name" id="PH_1"/>"</source> | ||||
|         <target><x equiv-text="list" id="PH"/> en &quot;<x equiv-text="items[items.length - 1].name" id="PH_1"/>&quot;</target> | ||||
|         <target><x equiv-text="list" id="PH"/> en "<x equiv-text="items[items.length - 1].name" id="PH_1"/>"</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> | ||||
|           <context context-type="linenumber">117</context> | ||||
| @@ -1232,7 +1328,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="6619516195038467207"> | ||||
|         <source>This operation will add the tag "<x equiv-text="tag.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source> | ||||
|         <target>Het etiket &quot;<x equiv-text="tag.name" id="PH"/>&quot; zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target> | ||||
|         <target>Het etiket "<x equiv-text="tag.name" id="PH"/>" zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> | ||||
|           <context context-type="linenumber">129</context> | ||||
| @@ -1248,7 +1344,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7181166515756808573"> | ||||
|         <source>This operation will remove the tag "<x equiv-text="tag.name" id="PH"/>" from <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source> | ||||
|         <target>Het etiket &quot;<x equiv-text="tag.name" id="PH"/>&quot; zal verwijderd worden van <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en).</target> | ||||
|         <target>Het etiket "<x equiv-text="tag.name" id="PH"/>" zal verwijderd worden van <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en).</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> | ||||
|           <context context-type="linenumber">134</context> | ||||
| @@ -1280,7 +1376,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="6900893559485781849"> | ||||
|         <source>This operation will assign the correspondent "<x equiv-text="correspondent.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source> | ||||
|         <target>De correspondent &quot;<x equiv-text="correspondent.name" id="PH"/>&quot; zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target> | ||||
|         <target>De correspondent "<x equiv-text="correspondent.name" id="PH"/>" zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> | ||||
|           <context context-type="linenumber">160</context> | ||||
| @@ -1304,7 +1400,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="332180123895325027"> | ||||
|         <source>This operation will assign the document type "<x equiv-text="documentType.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source> | ||||
|         <target>Het documenttype &quot;<x equiv-text="documentType.name" id="PH"/>&quot; zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target> | ||||
|         <target>Het documenttype "<x equiv-text="documentType.name" id="PH"/>" zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> | ||||
|           <context context-type="linenumber">183</context> | ||||
| @@ -1355,7 +1451,7 @@ | ||||
|         <target>Selecteer:</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context> | ||||
|           <context context-type="linenumber">11</context> | ||||
|           <context context-type="linenumber">10</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="dfc3c34e182ea73c5d784ff7c8135f087992dac1"> | ||||
| @@ -1363,7 +1459,7 @@ | ||||
|         <target>Alles</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context> | ||||
|           <context context-type="linenumber">21</context> | ||||
|           <context context-type="linenumber">20</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="907df6a2b68daecc3c399cf40a764b358bd9fd84"> | ||||
| @@ -1371,7 +1467,7 @@ | ||||
|         <target>Bewerk:</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context> | ||||
|           <context context-type="linenumber">28</context> | ||||
|           <context context-type="linenumber">27</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="27d158b47717ff9305d19866960418c603f19d55"> | ||||
| @@ -1574,6 +1670,38 @@ | ||||
|           <context context-type="linenumber">12</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1206520795340730278"> | ||||
|         <source>English (US)</source> | ||||
|         <target>Engels (US)</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">74</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1858110241312746425"> | ||||
|         <source>German</source> | ||||
|         <target>Duits</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">75</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="3071065188816255493"> | ||||
|         <source>Dutch</source> | ||||
|         <target>Nederlands</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">76</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7633754075223722162"> | ||||
|         <source>French</source> | ||||
|         <target>Frans</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/services/settings.service.ts</context> | ||||
|           <context context-type="linenumber">77</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1519954996184640001"> | ||||
|         <source>Error</source> | ||||
|         <target>Fout</target> | ||||
| @@ -1755,7 +1883,7 @@ | ||||
|         <target>Maak nieuw item</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">43</context> | ||||
|           <context context-type="linenumber">50</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5324147361912094446"> | ||||
| @@ -1763,7 +1891,7 @@ | ||||
|         <target>Item bewerken</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">47</context> | ||||
|           <context context-type="linenumber">54</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="1699589597032579396"> | ||||
| @@ -1771,7 +1899,7 @@ | ||||
|         <target>Kon het element niet opslaan: <x equiv-text="error" id="PH"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/common/edit-dialog/edit-dialog.component.ts</context> | ||||
|           <context context-type="linenumber">51</context> | ||||
|           <context context-type="linenumber">58</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="810888510148304696"> | ||||
| @@ -1779,7 +1907,7 @@ | ||||
|         <target>Automatisch</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">33</context> | ||||
|           <context context-type="linenumber">39</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5044611416737085530"> | ||||
| @@ -1787,7 +1915,7 @@ | ||||
|         <target>Wil je dit element echt verwijderen?</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">76</context> | ||||
|           <context context-type="linenumber">97</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="8371896857609524947"> | ||||
| @@ -1795,7 +1923,7 @@ | ||||
|         <target>Geassocieerde documenten zullen niet verwijderd worden.</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">83</context> | ||||
|           <context context-type="linenumber">104</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="7022070615528435141"> | ||||
| @@ -1803,7 +1931,7 @@ | ||||
|         <target>Verwijderen</target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">85</context> | ||||
|           <context context-type="linenumber">106</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5467489005440577210"> | ||||
| @@ -1811,7 +1939,7 @@ | ||||
|         <target>Fout bij het verwijderen van het element: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target> | ||||
|         <context-group purpose="location"> | ||||
|           <context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context> | ||||
|           <context context-type="linenumber">93</context> | ||||
|           <context context-type="linenumber">114</context> | ||||
|         </context-group> | ||||
|       </trans-unit> | ||||
|       <trans-unit datatype="html" id="5851669019930456395"> | ||||
|   | ||||
| @@ -91,7 +91,7 @@ def generate_unique_filename(doc, root): | ||||
|             return new_filename | ||||
|  | ||||
|  | ||||
| def generate_filename(doc, counter=0): | ||||
| def generate_filename(doc, counter=0, append_gpg=True): | ||||
|     path = "" | ||||
|  | ||||
|     try: | ||||
| @@ -151,7 +151,7 @@ def generate_filename(doc, counter=0): | ||||
|         filename = f"{doc.pk:07}{counter_str}{doc.file_type}" | ||||
|  | ||||
|     # Append .gpg for encrypted files | ||||
|     if doc.storage_type == doc.STORAGE_TYPE_GPG: | ||||
|     if append_gpg and doc.storage_type == doc.STORAGE_TYPE_GPG: | ||||
|         filename += ".gpg" | ||||
|  | ||||
|     return filename | ||||
|   | ||||
| @@ -11,6 +11,7 @@ from django import db | ||||
| from django.conf import settings | ||||
| from django.core.management.base import BaseCommand | ||||
| from django.db import transaction | ||||
| from filelock import FileLock | ||||
| from whoosh.writing import AsyncWriter | ||||
|  | ||||
| from documents.models import Document | ||||
| @@ -47,8 +48,10 @@ def handle_document(document_id): | ||||
|                     archive_checksum=checksum, | ||||
|                     content=parser.get_text() | ||||
|                 ) | ||||
|                 create_source_path_directory(document.archive_path) | ||||
|                 shutil.move(parser.get_archive_path(), document.archive_path) | ||||
|                 with FileLock(settings.MEDIA_LOCK): | ||||
|                     create_source_path_directory(document.archive_path) | ||||
|                     shutil.move(parser.get_archive_path(), | ||||
|                                 document.archive_path) | ||||
|  | ||||
|         with AsyncWriter(index.open_index()) as writer: | ||||
|             index.update_document(writer, document) | ||||
|   | ||||
| @@ -5,7 +5,6 @@ from time import sleep | ||||
|  | ||||
| from django.conf import settings | ||||
| from django.core.management.base import BaseCommand, CommandError | ||||
| from django.utils.text import slugify | ||||
| from django_q.tasks import async_task | ||||
| from watchdog.events import FileSystemEventHandler | ||||
| from watchdog.observers.polling import PollingObserver | ||||
|   | ||||
| @@ -1,15 +1,21 @@ | ||||
| import hashlib | ||||
| import json | ||||
| import os | ||||
| import shutil | ||||
| import time | ||||
|  | ||||
| import tqdm | ||||
| from django.conf import settings | ||||
| from django.core import serializers | ||||
| from django.core.management.base import BaseCommand, CommandError | ||||
| from django.db import transaction | ||||
| from filelock import FileLock | ||||
|  | ||||
| from documents.models import Document, Correspondent, Tag, DocumentType | ||||
| from documents.settings import EXPORTER_FILE_NAME, EXPORTER_THUMBNAIL_NAME, \ | ||||
|     EXPORTER_ARCHIVE_NAME | ||||
| from paperless.db import GnuPG | ||||
| from ...file_handling import generate_filename, delete_empty_directories | ||||
| from ...mixins import Renderable | ||||
|  | ||||
|  | ||||
| @@ -24,13 +30,47 @@ class Command(Renderable, BaseCommand): | ||||
|     def add_arguments(self, parser): | ||||
|         parser.add_argument("target") | ||||
|  | ||||
|         parser.add_argument( | ||||
|             "-c", "--compare-checksums", | ||||
|             default=False, | ||||
|             action="store_true", | ||||
|             help="Compare file checksums when determining whether to export " | ||||
|                  "a file or not. If not specified, file size and time " | ||||
|                  "modified is used instead." | ||||
|         ) | ||||
|  | ||||
|         parser.add_argument( | ||||
|             "-f", "--use-filename-format", | ||||
|             default=False, | ||||
|             action="store_true", | ||||
|             help="Use PAPERLESS_FILENAME_FORMAT for storing files in the " | ||||
|                  "export directory, if configured." | ||||
|         ) | ||||
|  | ||||
|         parser.add_argument( | ||||
|             "-d", "--delete", | ||||
|             default=False, | ||||
|             action="store_true", | ||||
|             help="After exporting, delete files in the export directory that " | ||||
|                  "do not belong to the current export, such as files from " | ||||
|                  "deleted documents." | ||||
|         ) | ||||
|  | ||||
|     def __init__(self, *args, **kwargs): | ||||
|         BaseCommand.__init__(self, *args, **kwargs) | ||||
|         self.target = None | ||||
|         self.files_in_export_dir = [] | ||||
|         self.exported_files = [] | ||||
|         self.compare_checksums = False | ||||
|         self.use_filename_format = False | ||||
|         self.delete = False | ||||
|  | ||||
|     def handle(self, *args, **options): | ||||
|  | ||||
|         self.target = options["target"] | ||||
|         self.compare_checksums = options['compare_checksums'] | ||||
|         self.use_filename_format = options['use_filename_format'] | ||||
|         self.delete = options['delete'] | ||||
|  | ||||
|         if not os.path.exists(self.target): | ||||
|             raise CommandError("That path doesn't exist") | ||||
| @@ -38,83 +78,148 @@ class Command(Renderable, BaseCommand): | ||||
|         if not os.access(self.target, os.W_OK): | ||||
|             raise CommandError("That path doesn't appear to be writable") | ||||
|  | ||||
|         if os.listdir(self.target): | ||||
|             raise CommandError("That directory is not empty.") | ||||
|  | ||||
|         self.dump() | ||||
|         with FileLock(settings.MEDIA_LOCK): | ||||
|             self.dump() | ||||
|  | ||||
|     def dump(self): | ||||
|         # 1. Take a snapshot of what files exist in the current export folder | ||||
|         for root, dirs, files in os.walk(self.target): | ||||
|             self.files_in_export_dir.extend( | ||||
|                 map(lambda f: os.path.abspath(os.path.join(root, f)), files) | ||||
|             ) | ||||
|  | ||||
|         documents = Document.objects.all() | ||||
|         document_map = {d.pk: d for d in documents} | ||||
|         manifest = json.loads(serializers.serialize("json", documents)) | ||||
|         # 2. Create manifest, containing all correspondents, types, tags and | ||||
|         # documents | ||||
|         with transaction.atomic(): | ||||
|             manifest = json.loads( | ||||
|                 serializers.serialize("json", Correspondent.objects.all())) | ||||
|  | ||||
|         for index, document_dict in enumerate(manifest): | ||||
|             manifest += json.loads(serializers.serialize( | ||||
|                 "json", Tag.objects.all())) | ||||
|  | ||||
|             # Force output to unencrypted as that will be the current state. | ||||
|             # The importer will make the decision to encrypt or not. | ||||
|             manifest[index]["fields"]["storage_type"] = Document.STORAGE_TYPE_UNENCRYPTED  # NOQA: E501 | ||||
|             manifest += json.loads(serializers.serialize( | ||||
|                 "json", DocumentType.objects.all())) | ||||
|  | ||||
|             documents = Document.objects.order_by("id") | ||||
|             document_map = {d.pk: d for d in documents} | ||||
|             document_manifest = json.loads( | ||||
|                 serializers.serialize("json", documents)) | ||||
|             manifest += document_manifest | ||||
|  | ||||
|         # 3. Export files from each document | ||||
|         for index, document_dict in tqdm.tqdm(enumerate(document_manifest), | ||||
|                                               total=len(document_manifest)): | ||||
|             # 3.1. store files unencrypted | ||||
|             document_dict["fields"]["storage_type"] = Document.STORAGE_TYPE_UNENCRYPTED  # NOQA: E501 | ||||
|  | ||||
|             document = document_map[document_dict["pk"]] | ||||
|  | ||||
|             print(f"Exporting: {document}") | ||||
|  | ||||
|             # 3.2. generate a unique filename | ||||
|             filename_counter = 0 | ||||
|             while True: | ||||
|                 original_name = document.get_public_filename( | ||||
|                     counter=filename_counter) | ||||
|                 original_target = os.path.join(self.target, original_name) | ||||
|                 if self.use_filename_format: | ||||
|                     base_name = generate_filename( | ||||
|                         document, counter=filename_counter, | ||||
|                         append_gpg=False) | ||||
|                 else: | ||||
|                     base_name = document.get_public_filename( | ||||
|                         counter=filename_counter) | ||||
|  | ||||
|                 if not os.path.exists(original_target): | ||||
|                 if base_name not in self.exported_files: | ||||
|                     self.exported_files.append(base_name) | ||||
|                     break | ||||
|                 else: | ||||
|                     filename_counter += 1 | ||||
|  | ||||
|             thumbnail_name = original_name + "-thumbnail.png" | ||||
|             thumbnail_target = os.path.join(self.target, thumbnail_name) | ||||
|  | ||||
|             # 3.3. write filenames into manifest | ||||
|             original_name = base_name | ||||
|             original_target = os.path.join(self.target, original_name) | ||||
|             document_dict[EXPORTER_FILE_NAME] = original_name | ||||
|  | ||||
|             thumbnail_name = base_name + "-thumbnail.png" | ||||
|             thumbnail_target = os.path.join(self.target, thumbnail_name) | ||||
|             document_dict[EXPORTER_THUMBNAIL_NAME] = thumbnail_name | ||||
|  | ||||
|             if os.path.exists(document.archive_path): | ||||
|                 archive_name = document.get_public_filename( | ||||
|                     archive=True, counter=filename_counter, suffix="_archive") | ||||
|                 archive_name = base_name + "-archive.pdf" | ||||
|                 archive_target = os.path.join(self.target, archive_name) | ||||
|                 document_dict[EXPORTER_ARCHIVE_NAME] = archive_name | ||||
|             else: | ||||
|                 archive_target = None | ||||
|  | ||||
|             # 3.4. write files to target folder | ||||
|             t = int(time.mktime(document.created.timetuple())) | ||||
|             if document.storage_type == Document.STORAGE_TYPE_GPG: | ||||
|  | ||||
|                 os.makedirs(os.path.dirname(original_target), exist_ok=True) | ||||
|                 with open(original_target, "wb") as f: | ||||
|                     f.write(GnuPG.decrypted(document.source_file)) | ||||
|                     os.utime(original_target, times=(t, t)) | ||||
|  | ||||
|                 os.makedirs(os.path.dirname(thumbnail_target), exist_ok=True) | ||||
|                 with open(thumbnail_target, "wb") as f: | ||||
|                     f.write(GnuPG.decrypted(document.thumbnail_file)) | ||||
|                     os.utime(thumbnail_target, times=(t, t)) | ||||
|  | ||||
|                 if archive_target: | ||||
|                     os.makedirs(os.path.dirname(archive_target), exist_ok=True) | ||||
|                     with open(archive_target, "wb") as f: | ||||
|                         f.write(GnuPG.decrypted(document.archive_path)) | ||||
|                         os.utime(archive_target, times=(t, t)) | ||||
|             else: | ||||
|                 self.check_and_copy(document.source_path, | ||||
|                                     document.checksum, | ||||
|                                     original_target) | ||||
|  | ||||
|                 shutil.copy(document.source_path, original_target) | ||||
|                 shutil.copy(document.thumbnail_path, thumbnail_target) | ||||
|                 self.check_and_copy(document.thumbnail_path, | ||||
|                                     None, | ||||
|                                     thumbnail_target) | ||||
|  | ||||
|                 if archive_target: | ||||
|                     shutil.copy(document.archive_path, archive_target) | ||||
|                     self.check_and_copy(document.archive_path, | ||||
|                                         document.archive_checksum, | ||||
|                                         archive_target) | ||||
|  | ||||
|         manifest += json.loads( | ||||
|             serializers.serialize("json", Correspondent.objects.all())) | ||||
|         # 4. write manifest to target forlder | ||||
|         manifest_path = os.path.abspath( | ||||
|             os.path.join(self.target, "manifest.json")) | ||||
|  | ||||
|         manifest += json.loads(serializers.serialize( | ||||
|             "json", Tag.objects.all())) | ||||
|  | ||||
|         manifest += json.loads(serializers.serialize( | ||||
|             "json", DocumentType.objects.all())) | ||||
|  | ||||
|         with open(os.path.join(self.target, "manifest.json"), "w") as f: | ||||
|         with open(manifest_path, "w") as f: | ||||
|             json.dump(manifest, f, indent=2) | ||||
|  | ||||
|         if self.delete: | ||||
|             # 5. Remove files which we did not explicitly export in this run | ||||
|  | ||||
|             if manifest_path in self.files_in_export_dir: | ||||
|                 self.files_in_export_dir.remove(manifest_path) | ||||
|  | ||||
|             for f in self.files_in_export_dir: | ||||
|                 os.remove(f) | ||||
|  | ||||
|                 delete_empty_directories(os.path.abspath(os.path.dirname(f)), | ||||
|                                          os.path.abspath(self.target)) | ||||
|  | ||||
|     def check_and_copy(self, source, source_checksum, target): | ||||
|         if os.path.abspath(target) in self.files_in_export_dir: | ||||
|             self.files_in_export_dir.remove(os.path.abspath(target)) | ||||
|  | ||||
|         perform_copy = False | ||||
|  | ||||
|         if os.path.exists(target): | ||||
|             source_stat = os.stat(source) | ||||
|             target_stat = os.stat(target) | ||||
|             if self.compare_checksums and source_checksum: | ||||
|                 with open(target, "rb") as f: | ||||
|                     target_checksum = hashlib.md5(f.read()).hexdigest() | ||||
|                 perform_copy = target_checksum != source_checksum | ||||
|             elif source_stat.st_mtime != target_stat.st_mtime: | ||||
|                 perform_copy = True | ||||
|             elif source_stat.st_size != target_stat.st_size: | ||||
|                 perform_copy = True | ||||
|         else: | ||||
|             # Copy if it does not exist | ||||
|             perform_copy = True | ||||
|  | ||||
|         if perform_copy: | ||||
|             os.makedirs(os.path.dirname(target), exist_ok=True) | ||||
|             shutil.copy2(source, target) | ||||
|   | ||||
| @@ -148,10 +148,10 @@ class Command(Renderable, BaseCommand): | ||||
|  | ||||
|                 create_source_path_directory(document.source_path) | ||||
|  | ||||
|                 shutil.copy(document_path, document.source_path) | ||||
|                 shutil.copy(thumbnail_path, document.thumbnail_path) | ||||
|                 shutil.copy2(document_path, document.source_path) | ||||
|                 shutil.copy2(thumbnail_path, document.thumbnail_path) | ||||
|                 if archive_path: | ||||
|                     create_source_path_directory(document.archive_path) | ||||
|                     shutil.copy(archive_path, document.archive_path) | ||||
|                     shutil.copy2(archive_path, document.archive_path) | ||||
|  | ||||
|             document.save() | ||||
|   | ||||
| @@ -63,12 +63,6 @@ class MatchingModel(models.Model): | ||||
|     def __str__(self): | ||||
|         return self.name | ||||
|  | ||||
|     def save(self, *args, **kwargs): | ||||
|  | ||||
|         self.match = self.match.lower() | ||||
|  | ||||
|         models.Model.save(self, *args, **kwargs) | ||||
|  | ||||
|  | ||||
| class Correspondent(MatchingModel): | ||||
|  | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								src/documents/tests/samples/documents/originals/0000002.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/documents/tests/samples/documents/originals/0000002.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/documents/tests/samples/documents/originals/0000003.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/documents/tests/samples/documents/originals/0000003.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/documents/tests/samples/documents/originals/0000004.pdf.gpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/documents/tests/samples/documents/originals/0000004.pdf.gpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/documents/tests/samples/documents/thumbnails/0000002.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/documents/tests/samples/documents/thumbnails/0000002.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 7.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/documents/tests/samples/documents/thumbnails/0000003.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/documents/tests/samples/documents/thumbnails/0000003.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 7.7 KiB | 
| @@ -228,6 +228,12 @@ class TestDocumentApi(DirectoriesMixin, APITestCase): | ||||
|         self.assertEqual(len(results), 2) | ||||
|         self.assertCountEqual([results[0]['id'], results[1]['id']], [doc1.id, doc3.id]) | ||||
|  | ||||
|         response = self.client.get("/api/documents/?tags__id__in={},{}".format(tag_2.id, tag_3.id)) | ||||
|         self.assertEqual(response.status_code, 200) | ||||
|         results = response.data['results'] | ||||
|         self.assertEqual(len(results), 2) | ||||
|         self.assertCountEqual([results[0]['id'], results[1]['id']], [doc2.id, doc3.id]) | ||||
|  | ||||
|         response = self.client.get("/api/documents/?tags__id__all={},{}".format(tag_2.id, tag_3.id)) | ||||
|         self.assertEqual(response.status_code, 200) | ||||
|         results = response.data['results'] | ||||
| @@ -923,6 +929,14 @@ class TestBulkEdit(DirectoriesMixin, APITestCase): | ||||
|         doc2 = Document.objects.get(id=self.doc2.id) | ||||
|         self.assertEqual(doc2.correspondent, self.c1) | ||||
|  | ||||
|     def test_api_no_correspondent(self): | ||||
|         response = self.client.post("/api/documents/bulk_edit/", json.dumps({ | ||||
|             "documents": [self.doc2.id], | ||||
|             "method": "set_correspondent", | ||||
|             "parameters": {} | ||||
|         }), content_type='application/json') | ||||
|         self.assertEqual(response.status_code, 400) | ||||
|  | ||||
|     def test_api_invalid_document_type(self): | ||||
|         self.assertEqual(self.doc2.document_type, self.dt1) | ||||
|         response = self.client.post("/api/documents/bulk_edit/", json.dumps({ | ||||
| @@ -935,6 +949,14 @@ class TestBulkEdit(DirectoriesMixin, APITestCase): | ||||
|         doc2 = Document.objects.get(id=self.doc2.id) | ||||
|         self.assertEqual(doc2.document_type, self.dt1) | ||||
|  | ||||
|     def test_api_no_document_type(self): | ||||
|         response = self.client.post("/api/documents/bulk_edit/", json.dumps({ | ||||
|             "documents": [self.doc2.id], | ||||
|             "method": "set_document_type", | ||||
|             "parameters": {} | ||||
|         }), content_type='application/json') | ||||
|         self.assertEqual(response.status_code, 400) | ||||
|  | ||||
|     def test_api_add_invalid_tag(self): | ||||
|         self.assertEqual(list(self.doc2.tags.all()), [self.t1]) | ||||
|         response = self.client.post("/api/documents/bulk_edit/", json.dumps({ | ||||
| @@ -946,6 +968,14 @@ class TestBulkEdit(DirectoriesMixin, APITestCase): | ||||
|  | ||||
|         self.assertEqual(list(self.doc2.tags.all()), [self.t1]) | ||||
|  | ||||
|     def test_api_add_tag_no_tag(self): | ||||
|         response = self.client.post("/api/documents/bulk_edit/", json.dumps({ | ||||
|             "documents": [self.doc2.id], | ||||
|             "method": "add_tag", | ||||
|             "parameters": {} | ||||
|         }), content_type='application/json') | ||||
|         self.assertEqual(response.status_code, 400) | ||||
|  | ||||
|     def test_api_delete_invalid_tag(self): | ||||
|         self.assertEqual(list(self.doc2.tags.all()), [self.t1]) | ||||
|         response = self.client.post("/api/documents/bulk_edit/", json.dumps({ | ||||
| @@ -957,6 +987,14 @@ class TestBulkEdit(DirectoriesMixin, APITestCase): | ||||
|  | ||||
|         self.assertEqual(list(self.doc2.tags.all()), [self.t1]) | ||||
|  | ||||
|     def test_api_delete_tag_no_tag(self): | ||||
|         response = self.client.post("/api/documents/bulk_edit/", json.dumps({ | ||||
|             "documents": [self.doc2.id], | ||||
|             "method": "remove_tag", | ||||
|             "parameters": {} | ||||
|         }), content_type='application/json') | ||||
|         self.assertEqual(response.status_code, 400) | ||||
|  | ||||
|     def test_api_modify_invalid_tags(self): | ||||
|         self.assertEqual(list(self.doc2.tags.all()), [self.t1]) | ||||
|         response = self.client.post("/api/documents/bulk_edit/", json.dumps({ | ||||
| @@ -966,6 +1004,21 @@ class TestBulkEdit(DirectoriesMixin, APITestCase): | ||||
|         }), content_type='application/json') | ||||
|         self.assertEqual(response.status_code, 400) | ||||
|  | ||||
|     def test_api_modify_tags_no_tags(self): | ||||
|         response = self.client.post("/api/documents/bulk_edit/", json.dumps({ | ||||
|             "documents": [self.doc2.id], | ||||
|             "method": "modify_tags", | ||||
|             "parameters": {"remove_tags": [1123123]} | ||||
|         }), content_type='application/json') | ||||
|         self.assertEqual(response.status_code, 400) | ||||
|  | ||||
|         response = self.client.post("/api/documents/bulk_edit/", json.dumps({ | ||||
|             "documents": [self.doc2.id], | ||||
|             "method": "modify_tags", | ||||
|             "parameters": {'add_tags': [self.t2.id, 1657]} | ||||
|         }), content_type='application/json') | ||||
|         self.assertEqual(response.status_code, 400) | ||||
|  | ||||
|     def test_api_selection_data_empty(self): | ||||
|         response = self.client.post("/api/documents/selection_data/", json.dumps({ | ||||
|             "documents": [] | ||||
|   | ||||
| @@ -70,18 +70,18 @@ class TestDecryptDocuments(TestCase): | ||||
|             PASSPHRASE="test" | ||||
|         ).enable() | ||||
|  | ||||
|         doc = Document.objects.create(checksum="9c9691e51741c1f4f41a20896af31770", title="wow", filename="0000002.pdf.gpg",  mime_type="application/pdf", storage_type=Document.STORAGE_TYPE_GPG) | ||||
|         doc = Document.objects.create(checksum="82186aaa94f0b98697d704b90fd1c072", title="wow", filename="0000004.pdf.gpg",  mime_type="application/pdf", storage_type=Document.STORAGE_TYPE_GPG) | ||||
|  | ||||
|         shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "documents", "originals", "0000002.pdf.gpg"), os.path.join(originals_dir, "0000002.pdf.gpg")) | ||||
|         shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "documents", "thumbnails", f"0000002.png.gpg"), os.path.join(thumb_dir, f"{doc.id:07}.png.gpg")) | ||||
|         shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "documents", "originals", "0000004.pdf.gpg"), os.path.join(originals_dir, "0000004.pdf.gpg")) | ||||
|         shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "documents", "thumbnails", f"0000004.png.gpg"), os.path.join(thumb_dir, f"{doc.id:07}.png.gpg")) | ||||
|  | ||||
|         call_command('decrypt_documents') | ||||
|  | ||||
|         doc.refresh_from_db() | ||||
|  | ||||
|         self.assertEqual(doc.storage_type, Document.STORAGE_TYPE_UNENCRYPTED) | ||||
|         self.assertEqual(doc.filename, "0000002.pdf") | ||||
|         self.assertTrue(os.path.isfile(os.path.join(originals_dir, "0000002.pdf"))) | ||||
|         self.assertEqual(doc.filename, "0000004.pdf") | ||||
|         self.assertTrue(os.path.isfile(os.path.join(originals_dir, "0000004.pdf"))) | ||||
|         self.assertTrue(os.path.isfile(doc.source_path)) | ||||
|         self.assertTrue(os.path.isfile(os.path.join(thumb_dir, f"{doc.id:07}.png"))) | ||||
|         self.assertTrue(os.path.isfile(doc.thumbnail_path)) | ||||
|   | ||||
| @@ -3,6 +3,8 @@ import json | ||||
| import os | ||||
| import shutil | ||||
| import tempfile | ||||
| from pathlib import Path | ||||
| from unittest import mock | ||||
|  | ||||
| from django.core.management import call_command | ||||
| from django.test import TestCase, override_settings | ||||
| @@ -10,54 +12,87 @@ from django.test import TestCase, override_settings | ||||
| from documents.management.commands import document_exporter | ||||
| from documents.models import Document, Tag, DocumentType, Correspondent | ||||
| from documents.sanity_checker import check_sanity | ||||
| from documents.settings import EXPORTER_FILE_NAME | ||||
| from documents.tests.utils import DirectoriesMixin, paperless_environment | ||||
|  | ||||
|  | ||||
| class TestExportImport(DirectoriesMixin, TestCase): | ||||
|  | ||||
|     def setUp(self) -> None: | ||||
|         self.target = tempfile.mkdtemp() | ||||
|         self.addCleanup(shutil.rmtree, self.target) | ||||
|  | ||||
|         self.d1 = Document.objects.create(content="Content", checksum="42995833e01aea9b3edee44bbfdd7ce1", archive_checksum="62acb0bcbfbcaa62ca6ad3668e4e404b", title="wow1", filename="0000001.pdf", mime_type="application/pdf") | ||||
|         self.d2 = Document.objects.create(content="Content", checksum="9c9691e51741c1f4f41a20896af31770", title="wow2", filename="0000002.pdf", mime_type="application/pdf") | ||||
|         self.d3 = Document.objects.create(content="Content", checksum="d38d7ed02e988e072caf924e0f3fcb76", title="wow2", filename="0000003.pdf", mime_type="application/pdf") | ||||
|         self.d4 = Document.objects.create(content="Content", checksum="82186aaa94f0b98697d704b90fd1c072", title="wow_dec", filename="0000004.pdf.gpg", mime_type="application/pdf", storage_type=Document.STORAGE_TYPE_GPG) | ||||
|  | ||||
|         self.t1 = Tag.objects.create(name="t") | ||||
|         self.dt1 = DocumentType.objects.create(name="dt") | ||||
|         self.c1 = Correspondent.objects.create(name="c") | ||||
|  | ||||
|         self.d1.tags.add(self.t1) | ||||
|         self.d1.correspondent = self.c1 | ||||
|         self.d1.document_type = self.dt1 | ||||
|         self.d1.save() | ||||
|         super(TestExportImport, self).setUp() | ||||
|  | ||||
|     def _get_document_from_manifest(self, manifest, id): | ||||
|         f = list(filter(lambda d: d['model'] == "documents.document" and d['pk'] == id, manifest)) | ||||
|         if len(f) == 1: | ||||
|             return f[0] | ||||
|         else: | ||||
|             raise ValueError(f"document with id {id} does not exist in manifest") | ||||
|  | ||||
|     @override_settings( | ||||
|         PASSPHRASE="test" | ||||
|     ) | ||||
|     def test_exporter(self): | ||||
|     def _do_export(self, use_filename_format=False, compare_checksums=False, delete=False): | ||||
|         args = ['document_exporter', self.target] | ||||
|         if use_filename_format: | ||||
|             args += ["--use-filename-format"] | ||||
|         if compare_checksums: | ||||
|             args += ["--compare-checksums"] | ||||
|         if delete: | ||||
|             args += ["--delete"] | ||||
|  | ||||
|         call_command(*args) | ||||
|  | ||||
|         with open(os.path.join(self.target, "manifest.json")) as f: | ||||
|             manifest = json.load(f) | ||||
|  | ||||
|         return manifest | ||||
|  | ||||
|     def test_exporter(self, use_filename_format=False): | ||||
|         shutil.rmtree(os.path.join(self.dirs.media_dir, "documents")) | ||||
|         shutil.copytree(os.path.join(os.path.dirname(__file__), "samples", "documents"), os.path.join(self.dirs.media_dir, "documents")) | ||||
|  | ||||
|         file = os.path.join(self.dirs.originals_dir, "0000001.pdf") | ||||
|         manifest = self._do_export(use_filename_format=use_filename_format) | ||||
|  | ||||
|         d1 = Document.objects.create(content="Content", checksum="42995833e01aea9b3edee44bbfdd7ce1", archive_checksum="62acb0bcbfbcaa62ca6ad3668e4e404b", title="wow", filename="0000001.pdf", mime_type="application/pdf") | ||||
|         d2 = Document.objects.create(content="Content", checksum="9c9691e51741c1f4f41a20896af31770", title="wow", filename="0000002.pdf.gpg", mime_type="application/pdf", storage_type=Document.STORAGE_TYPE_GPG) | ||||
|         t1 = Tag.objects.create(name="t") | ||||
|         dt1 = DocumentType.objects.create(name="dt") | ||||
|         c1 = Correspondent.objects.create(name="c") | ||||
|         self.assertEqual(len(manifest), 7) | ||||
|         self.assertEqual(len(list(filter(lambda e: e['model'] == 'documents.document', manifest))), 4) | ||||
|  | ||||
|         d1.tags.add(t1) | ||||
|         d1.correspondents = c1 | ||||
|         d1.document_type = dt1 | ||||
|         d1.save() | ||||
|         d2.save() | ||||
|         self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json"))) | ||||
|  | ||||
|         target = tempfile.mkdtemp() | ||||
|         self.addCleanup(shutil.rmtree, target) | ||||
|  | ||||
|         call_command('document_exporter', target) | ||||
|  | ||||
|         with open(os.path.join(target, "manifest.json")) as f: | ||||
|             manifest = json.load(f) | ||||
|  | ||||
|         self.assertEqual(len(manifest), 5) | ||||
|         self.assertEqual(self._get_document_from_manifest(manifest, self.d1.id)['fields']['title'], "wow1") | ||||
|         self.assertEqual(self._get_document_from_manifest(manifest, self.d2.id)['fields']['title'], "wow2") | ||||
|         self.assertEqual(self._get_document_from_manifest(manifest, self.d3.id)['fields']['title'], "wow2") | ||||
|         self.assertEqual(self._get_document_from_manifest(manifest, self.d4.id)['fields']['title'], "wow_dec") | ||||
|  | ||||
|         for element in manifest: | ||||
|             if element['model'] == 'documents.document': | ||||
|                 fname = os.path.join(target, element[document_exporter.EXPORTER_FILE_NAME]) | ||||
|                 fname = os.path.join(self.target, element[document_exporter.EXPORTER_FILE_NAME]) | ||||
|                 self.assertTrue(os.path.exists(fname)) | ||||
|                 self.assertTrue(os.path.exists(os.path.join(target, element[document_exporter.EXPORTER_THUMBNAIL_NAME]))) | ||||
|                 self.assertTrue(os.path.exists(os.path.join(self.target, element[document_exporter.EXPORTER_THUMBNAIL_NAME]))) | ||||
|  | ||||
|                 with open(fname, "rb") as f: | ||||
|                     checksum = hashlib.md5(f.read()).hexdigest() | ||||
|                 self.assertEqual(checksum, element['fields']['checksum']) | ||||
|  | ||||
|                 self.assertEqual(element['fields']['storage_type'], Document.STORAGE_TYPE_UNENCRYPTED) | ||||
|  | ||||
|                 if document_exporter.EXPORTER_ARCHIVE_NAME in element: | ||||
|                     fname = os.path.join(target, element[document_exporter.EXPORTER_ARCHIVE_NAME]) | ||||
|                     fname = os.path.join(self.target, element[document_exporter.EXPORTER_ARCHIVE_NAME]) | ||||
|                     self.assertTrue(os.path.exists(fname)) | ||||
|  | ||||
|                     with open(fname, "rb") as f: | ||||
| @@ -65,24 +100,123 @@ class TestExportImport(DirectoriesMixin, TestCase): | ||||
|                     self.assertEqual(checksum, element['fields']['archive_checksum']) | ||||
|  | ||||
|         with paperless_environment() as dirs: | ||||
|             self.assertEqual(Document.objects.count(), 2) | ||||
|             self.assertEqual(Document.objects.count(), 4) | ||||
|             Document.objects.all().delete() | ||||
|             Correspondent.objects.all().delete() | ||||
|             DocumentType.objects.all().delete() | ||||
|             Tag.objects.all().delete() | ||||
|             self.assertEqual(Document.objects.count(), 0) | ||||
|  | ||||
|             call_command('document_importer', target) | ||||
|             self.assertEqual(Document.objects.count(), 2) | ||||
|             call_command('document_importer', self.target) | ||||
|             self.assertEqual(Document.objects.count(), 4) | ||||
|             self.assertEqual(Tag.objects.count(), 1) | ||||
|             self.assertEqual(Correspondent.objects.count(), 1) | ||||
|             self.assertEqual(DocumentType.objects.count(), 1) | ||||
|             self.assertEqual(Document.objects.get(id=self.d1.id).title, "wow1") | ||||
|             self.assertEqual(Document.objects.get(id=self.d2.id).title, "wow2") | ||||
|             self.assertEqual(Document.objects.get(id=self.d3.id).title, "wow2") | ||||
|             self.assertEqual(Document.objects.get(id=self.d4.id).title, "wow_dec") | ||||
|             messages = check_sanity() | ||||
|             # everything is alright after the test | ||||
|             self.assertEqual(len(messages), 0, str([str(m) for m in messages])) | ||||
|  | ||||
|     @override_settings( | ||||
|         PAPERLESS_FILENAME_FORMAT="{title}" | ||||
|     ) | ||||
|     def test_exporter_with_filename_format(self): | ||||
|         self.test_exporter() | ||||
|         shutil.rmtree(os.path.join(self.dirs.media_dir, "documents")) | ||||
|         shutil.copytree(os.path.join(os.path.dirname(__file__), "samples", "documents"), os.path.join(self.dirs.media_dir, "documents")) | ||||
|  | ||||
|         with override_settings(PAPERLESS_FILENAME_FORMAT="{created_year}/{correspondent}/{title}"): | ||||
|             self.test_exporter(use_filename_format=True) | ||||
|  | ||||
|     def test_update_export_changed_time(self): | ||||
|         shutil.rmtree(os.path.join(self.dirs.media_dir, "documents")) | ||||
|         shutil.copytree(os.path.join(os.path.dirname(__file__), "samples", "documents"), os.path.join(self.dirs.media_dir, "documents")) | ||||
|  | ||||
|         self._do_export() | ||||
|         self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json"))) | ||||
|  | ||||
|         st_mtime_1 = os.stat(os.path.join(self.target, "manifest.json")).st_mtime | ||||
|  | ||||
|         with mock.patch("documents.management.commands.document_exporter.shutil.copy2") as m: | ||||
|             self._do_export() | ||||
|             m.assert_not_called() | ||||
|  | ||||
|         self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json"))) | ||||
|         st_mtime_2 = os.stat(os.path.join(self.target, "manifest.json")).st_mtime | ||||
|  | ||||
|         Path(self.d1.source_path).touch() | ||||
|  | ||||
|         with mock.patch("documents.management.commands.document_exporter.shutil.copy2") as m: | ||||
|             self._do_export() | ||||
|             self.assertEqual(m.call_count, 1) | ||||
|  | ||||
|         st_mtime_3 = os.stat(os.path.join(self.target, "manifest.json")).st_mtime | ||||
|         self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json"))) | ||||
|  | ||||
|         self.assertNotEqual(st_mtime_1, st_mtime_2) | ||||
|         self.assertNotEqual(st_mtime_2, st_mtime_3) | ||||
|  | ||||
|     def test_update_export_changed_checksum(self): | ||||
|         shutil.rmtree(os.path.join(self.dirs.media_dir, "documents")) | ||||
|         shutil.copytree(os.path.join(os.path.dirname(__file__), "samples", "documents"), os.path.join(self.dirs.media_dir, "documents")) | ||||
|  | ||||
|         self._do_export() | ||||
|  | ||||
|         self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json"))) | ||||
|  | ||||
|         with mock.patch("documents.management.commands.document_exporter.shutil.copy2") as m: | ||||
|             self._do_export() | ||||
|             m.assert_not_called() | ||||
|  | ||||
|         self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json"))) | ||||
|  | ||||
|         self.d2.checksum = "asdfasdgf3" | ||||
|         self.d2.save() | ||||
|  | ||||
|         with mock.patch("documents.management.commands.document_exporter.shutil.copy2") as m: | ||||
|             self._do_export(compare_checksums=True) | ||||
|             self.assertEqual(m.call_count, 1) | ||||
|  | ||||
|         self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json"))) | ||||
|  | ||||
|     def test_update_export_deleted_document(self): | ||||
|         shutil.rmtree(os.path.join(self.dirs.media_dir, "documents")) | ||||
|         shutil.copytree(os.path.join(os.path.dirname(__file__), "samples", "documents"), os.path.join(self.dirs.media_dir, "documents")) | ||||
|  | ||||
|         manifest = self._do_export() | ||||
|  | ||||
|         self.assertTrue(len(manifest), 7) | ||||
|         doc_from_manifest = self._get_document_from_manifest(manifest, self.d3.id) | ||||
|         self.assertTrue(os.path.isfile(os.path.join(self.target, doc_from_manifest[EXPORTER_FILE_NAME]))) | ||||
|         self.d3.delete() | ||||
|  | ||||
|         manifest = self._do_export() | ||||
|         self.assertRaises(ValueError, self._get_document_from_manifest, manifest, self.d3.id) | ||||
|         self.assertTrue(os.path.isfile(os.path.join(self.target, doc_from_manifest[EXPORTER_FILE_NAME]))) | ||||
|  | ||||
|         manifest = self._do_export(delete=True) | ||||
|         self.assertFalse(os.path.isfile(os.path.join(self.target, doc_from_manifest[EXPORTER_FILE_NAME]))) | ||||
|  | ||||
|         self.assertTrue(len(manifest), 6) | ||||
|  | ||||
|     @override_settings(PAPERLESS_FILENAME_FORMAT="{title}/{correspondent}") | ||||
|     def test_update_export_changed_location(self): | ||||
|         shutil.rmtree(os.path.join(self.dirs.media_dir, "documents")) | ||||
|         shutil.copytree(os.path.join(os.path.dirname(__file__), "samples", "documents"), os.path.join(self.dirs.media_dir, "documents")) | ||||
|  | ||||
|         m = self._do_export(use_filename_format=True) | ||||
|         self.assertTrue(os.path.isfile(os.path.join(self.target, "wow1", "c.pdf"))) | ||||
|  | ||||
|         self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json"))) | ||||
|  | ||||
|         self.d1.title = "new_title" | ||||
|         self.d1.save() | ||||
|         self._do_export(use_filename_format=True, delete=True) | ||||
|         self.assertFalse(os.path.isfile(os.path.join(self.target, "wow1", "c.pdf"))) | ||||
|         self.assertFalse(os.path.isdir(os.path.join(self.target, "wow1"))) | ||||
|         self.assertTrue(os.path.isfile(os.path.join(self.target, "new_title", "c.pdf"))) | ||||
|         self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json"))) | ||||
|         self.assertTrue(os.path.isfile(os.path.join(self.target, "wow2", "none.pdf"))) | ||||
|         self.assertTrue(os.path.isfile(os.path.join(self.target, "wow2", "none_01.pdf"))) | ||||
|  | ||||
|     def test_export_missing_files(self): | ||||
|  | ||||
|   | ||||
| @@ -98,7 +98,7 @@ class TestMigrateMimeType(DirectoriesMixin, TestMigrations): | ||||
|  | ||||
|         doc2 = Document.objects.create(checksum="B", file_type="pdf", storage_type=STORAGE_TYPE_GPG) | ||||
|         self.doc2_id = doc2.id | ||||
|         shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "documents", "originals", "0000002.pdf.gpg"), source_path_before(doc2)) | ||||
|         shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "documents", "originals", "0000004.pdf.gpg"), source_path_before(doc2)) | ||||
|  | ||||
|     def testMimeTypesMigrated(self): | ||||
|         Document = self.apps.get_model('documents', 'Document') | ||||
|   | ||||
| @@ -120,3 +120,4 @@ class TestParserAvailability(TestCase): | ||||
|  | ||||
|         self.assertTrue(is_file_ext_supported('.pdf')) | ||||
|         self.assertFalse(is_file_ext_supported('.hsdfh')) | ||||
|         self.assertFalse(is_file_ext_supported('')) | ||||
|   | ||||
| @@ -159,6 +159,9 @@ class DocumentViewSet(RetrieveModelMixin, | ||||
|         "added", | ||||
|         "archive_serial_number") | ||||
|  | ||||
|     def get_queryset(self): | ||||
|         return Document.objects.distinct() | ||||
|  | ||||
|     def get_serializer(self, *args, **kwargs): | ||||
|         fields_param = self.request.query_params.get('fields', None) | ||||
|         if fields_param: | ||||
|   | ||||
| @@ -1 +1 @@ | ||||
| __version__ = (0, 9, 14) | ||||
| __version__ = (1, 0, 0) | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| import os | ||||
| import uuid | ||||
| from collections import namedtuple | ||||
| from typing import ContextManager | ||||
| @@ -9,6 +10,7 @@ from django.test import TestCase | ||||
| from imap_tools import MailMessageFlags, MailboxFolderSelectError | ||||
|  | ||||
| from documents.models import Correspondent | ||||
| from documents.tests.utils import DirectoriesMixin | ||||
| from paperless_mail import tasks | ||||
| from paperless_mail.mail import MailError, MailAccountHandler | ||||
| from paperless_mail.models import MailRule, MailAccount | ||||
| @@ -130,7 +132,7 @@ def fake_magic_from_buffer(buffer, mime=False): | ||||
|  | ||||
|  | ||||
| @mock.patch('paperless_mail.mail.magic.from_buffer', fake_magic_from_buffer) | ||||
| class TestMail(TestCase): | ||||
| class TestMail(DirectoriesMixin, TestCase): | ||||
|  | ||||
|     def setUp(self): | ||||
|         patcher = mock.patch('paperless_mail.mail.MailBox') | ||||
| @@ -146,6 +148,7 @@ class TestMail(TestCase): | ||||
|         self.reset_bogus_mailbox() | ||||
|  | ||||
|         self.mail_account_handler = MailAccountHandler() | ||||
|         super(TestMail, self).setUp() | ||||
|  | ||||
|     def reset_bogus_mailbox(self): | ||||
|         self.bogus_mailbox.messages = [] | ||||
| @@ -220,9 +223,13 @@ class TestMail(TestCase): | ||||
|         args1, kwargs1 = self.async_task.call_args_list[0] | ||||
|         args2, kwargs2 = self.async_task.call_args_list[1] | ||||
|  | ||||
|         self.assertTrue(os.path.isfile(kwargs1['path']), kwargs1['path']) | ||||
|  | ||||
|         self.assertEqual(kwargs1['override_title'], "file_0") | ||||
|         self.assertEqual(kwargs1['override_filename'], "file_0.pdf") | ||||
|  | ||||
|         self.assertTrue(os.path.isfile(kwargs2['path']), kwargs1['path']) | ||||
|  | ||||
|         self.assertEqual(kwargs2['override_title'], "file_1") | ||||
|         self.assertEqual(kwargs2['override_filename'], "file_1.pdf") | ||||
|  | ||||
| @@ -253,6 +260,7 @@ class TestMail(TestCase): | ||||
|         self.assertEqual(self.async_task.call_count, 1) | ||||
|  | ||||
|         args, kwargs = self.async_task.call_args | ||||
|         self.assertTrue(os.path.isfile(kwargs['path']), kwargs['path']) | ||||
|         self.assertEqual(kwargs['override_filename'], "f1.pdf") | ||||
|  | ||||
|     def test_handle_disposition(self): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 jonaswinkler
					jonaswinkler