From 19dd95c99ad84677931fdcdd63eb8a2b90ce2cc2 Mon Sep 17 00:00:00 2001 From: Joachim Bauch Date: Tue, 23 Jul 2024 08:49:30 +0200 Subject: [PATCH 1/3] Add background job to send out daily reminders for missing email signatures. --- appinfo/info.xml | 1 + lib/BackgroundJob/SendReminders.php | 113 ++++++++++++++++++++++++++++ lib/Requests.php | 55 ++++++++++++++ tests/psalm-baseline.xml | 5 ++ 4 files changed, 174 insertions(+) create mode 100644 lib/BackgroundJob/SendReminders.php diff --git a/appinfo/info.xml b/appinfo/info.xml index cf68c5aa..715b1dc6 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -49,6 +49,7 @@ See [the website](https://www.certificate24.com) for further information. OCA\Certificate24\BackgroundJob\FetchSigned OCA\Certificate24\BackgroundJob\ResendMails OCA\Certificate24\BackgroundJob\RetryDownloads + OCA\Certificate24\BackgroundJob\SendReminders diff --git a/lib/BackgroundJob/SendReminders.php b/lib/BackgroundJob/SendReminders.php new file mode 100644 index 00000000..e0cd8615 --- /dev/null +++ b/lib/BackgroundJob/SendReminders.php @@ -0,0 +1,113 @@ + + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ +namespace OCA\Certificate24\BackgroundJob; + +use OCA\Certificate24\Mails; +use OCA\Certificate24\Requests; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\IJob; +use OCP\BackgroundJob\TimedJob; +use OCP\Files\IRootFolder; +use OCP\IUserManager; + +/** + * Send reminder emails for signature requests that have not been processed + * for at least 24 hours. + */ +class SendReminders extends TimedJob { + public const REMINDER_MAX_AGE_HOURS = 24; + + private IUserManager $userManager; + private IRootFolder $root; + private Requests $requests; + private Mails $mails; + + public function __construct(ITimeFactory $timeFactory, + IUserManager $userManager, + IRootFolder $root, + Requests $requests, + Mails $mails) { + parent::__construct($timeFactory); + + // Every 6 hours. + $this->setInterval(6 * 24 * 60); + $this->setTimeSensitivity(IJob::TIME_INSENSITIVE); + + $this->userManager = $userManager; + $this->root = $root; + $this->requests = $requests; + $this->mails = $mails; + } + + protected function run($argument): void { + $pending = $this->requests->getReminderEmails(self::REMINDER_MAX_AGE_HOURS); + foreach ($pending['single'] as $entry) { + $user = $this->userManager->get($entry['user_id']); + if (!$user) { + // Should not happen, requests will get deleted if the owner is deleted. + continue; + } + + $files = $this->root->getUserFolder($user->getUID())->getById($entry['file_id']); + if (empty($files)) { + // Should not happen, requests will get deleted if the associated file is deleted. + continue; + } + + $file = $files[0]; + $recipient = [ + 'type' => $entry['recipient_type'], + 'value' => $entry['recipient'], + 'display_name' => $entry['recipient_display_name'], + 'c24_signature_id' => $entry['c24_signature_id'], + ]; + $this->mails->sendRequestMail($entry['id'], $user, $file, $recipient, $entry['c24_server']); + } + + foreach ($pending['multi'] as $entry) { + $request = $entry['request']; + $user = $this->userManager->get($request['user_id']); + if (!$user) { + // Should not happen, requests will get deleted if the owner is deleted. + continue; + } + + $files = $this->root->getUserFolder($user->getUID())->getById($request['file_id']); + if (empty($files)) { + // Should not happen, requests will get deleted if the associated file is deleted. + continue; + } + + $file = $files[0]; + $recipient = [ + 'type' => $entry['type'], + 'value' => $entry['value'], + 'display_name' => $entry['display_name'], + 'c24_signature_id' => $entry['c24_signature_id'], + ]; + $this->mails->sendRequestMail($entry['request_id'], $user, $file, $recipient, $request['c24_server']); + } + } +} diff --git a/lib/Requests.php b/lib/Requests.php index 6d17176a..9903d931 100644 --- a/lib/Requests.php +++ b/lib/Requests.php @@ -648,6 +648,61 @@ public function getPendingEmails() { return $pending; } + public function getReminderEmails(int $maxAgeHours) { + $maxDate = new \DateTime(); + $maxDate = $maxDate->sub(new \DateInterval('PT' . $maxAgeHours . 'H')); + $maxDate->setTimezone(new \DateTimeZone('UTC')); + + $query = $this->db->getQueryBuilder(); + $query->select('*') + ->from('c24_requests') + ->where($query->expr()->eq('recipient_type', $query->createNamedParameter('email'))) + ->andWhere($query->expr()->isNull('signed')) + ->andWhere($query->expr()->lte('email_sent', $query->createNamedParameter($maxDate, 'datetimetz'))); + $result = $query->executeQuery(); + + $pending = []; + $recipients = []; + while ($row = $result->fetch()) { + if ($row['metadata']) { + $row['metadata'] = json_decode($row['metadata'], true); + } + + $row['recipients'] = $this->getRecipients($row); + $recipients[] = $row; + } + $result->closeCursor(); + $pending['single'] = $recipients; + + $query = $this->db->getQueryBuilder(); + $query->select('*') + ->from('c24_recipients') + ->where($query->expr()->eq('type', $query->createNamedParameter('email'))) + ->andWhere($query->expr()->isNull('signed')) + ->andWhere($query->expr()->lte('email_sent', $query->createNamedParameter($maxDate, 'datetimetz'))); + $result = $query->executeQuery(); + $recipients = []; + $requests = []; + while ($row = $result->fetch()) { + if (!isset($requests[$row['request_id']])) { + $requests[$row['request_id']] = $this->getRequestById($row['request_id']); + if (!$requests[$row['request_id']]) { + $this->logger->warning('Request ' . $row['request_id'] . ' no longer exists for pending email of ' . $row['type'] . ' ' . $row['value']); + continue; + } + } + $signed = $row['signed']; + if (is_string($signed)) { + $row['signed'] = $this->parseDateTime($signed); + } + $row['request'] = $requests[$row['request_id']]; + $recipients[] = $row; + } + $result->closeCursor(); + $pending['multi'] = $recipients; + return $pending; + } + public function getPendingDownloads() { $query = $this->db->getQueryBuilder(); $query->select('*') diff --git a/tests/psalm-baseline.xml b/tests/psalm-baseline.xml index 5d2be19c..fcbfaa33 100644 --- a/tests/psalm-baseline.xml +++ b/tests/psalm-baseline.xml @@ -15,6 +15,11 @@ IRootFolder + + + IRootFolder + + $userCache[$userId] From 7e0aef8017926c60a072d477a40b7cb557f31dc7 Mon Sep 17 00:00:00 2001 From: Joachim Bauch Date: Tue, 23 Jul 2024 09:00:16 +0200 Subject: [PATCH 2/3] Add option to disable reminder emails. --- lib/BackgroundJob/SendReminders.php | 8 + lib/Config.php | 4 + lib/Settings/Admin/AdminSettings.php | 1 + .../AdminSettings/InstanceSettings.vue | 28 ++ translationfiles/templates/certificate24.pot | 352 +++++++++--------- 5 files changed, 221 insertions(+), 172 deletions(-) diff --git a/lib/BackgroundJob/SendReminders.php b/lib/BackgroundJob/SendReminders.php index e0cd8615..9a108e3d 100644 --- a/lib/BackgroundJob/SendReminders.php +++ b/lib/BackgroundJob/SendReminders.php @@ -24,6 +24,7 @@ */ namespace OCA\Certificate24\BackgroundJob; +use OCA\Certificate24\Config; use OCA\Certificate24\Mails; use OCA\Certificate24\Requests; use OCP\AppFramework\Utility\ITimeFactory; @@ -41,12 +42,14 @@ class SendReminders extends TimedJob { private IUserManager $userManager; private IRootFolder $root; + private Config $config; private Requests $requests; private Mails $mails; public function __construct(ITimeFactory $timeFactory, IUserManager $userManager, IRootFolder $root, + Config $config, Requests $requests, Mails $mails) { parent::__construct($timeFactory); @@ -57,11 +60,16 @@ public function __construct(ITimeFactory $timeFactory, $this->userManager = $userManager; $this->root = $root; + $this->config = $config; $this->requests = $requests; $this->mails = $mails; } protected function run($argument): void { + if (!$this->config->sendReminderMails()) { + return; + } + $pending = $this->requests->getReminderEmails(self::REMINDER_MAX_AGE_HOURS); foreach ($pending['single'] as $entry) { $user = $this->userManager->get($entry['user_id']); diff --git a/lib/Config.php b/lib/Config.php index 8b9af060..9297cc19 100644 --- a/lib/Config.php +++ b/lib/Config.php @@ -106,6 +106,10 @@ public function isBackgroundVerifyEnabled(): bool { return $this->config->getAppValue(self::APP_ID, 'background_verify', 'true') === 'true'; } + public function sendReminderMails(): bool { + return $this->config->getAppValue(self::APP_ID, 'send_reminder_mails', 'true') === 'true'; + } + public function getSignatureImage(IUser $user): ?ISimpleFile { try { $folder = $this->appData->getFolder($user->getUID()); diff --git a/lib/Settings/Admin/AdminSettings.php b/lib/Settings/Admin/AdminSettings.php index 44b86695..e9f5ab7b 100644 --- a/lib/Settings/Admin/AdminSettings.php +++ b/lib/Settings/Admin/AdminSettings.php @@ -79,6 +79,7 @@ public function getForm(): TemplateResponse { 'signed_save_mode' => $this->config->getSignedSaveMode(), 'insecure_skip_verify' => $this->config->insecureSkipVerify(), 'background_verify' => $this->config->isBackgroundVerifyEnabled(), + 'send_reminder_mails' => $this->config->sendReminderMails(), 'delete_max_age' => $this->config->getDeleteMaxAge(), 'last_verified' => $last ? $last->format(\DateTime::ATOM) : null, 'unverified_count' => $this->verify->getUnverifiedCount(), diff --git a/src/components/AdminSettings/InstanceSettings.vue b/src/components/AdminSettings/InstanceSettings.vue index b2f50af9..2e21ebb0 100644 --- a/src/components/AdminSettings/InstanceSettings.vue +++ b/src/components/AdminSettings/InstanceSettings.vue @@ -53,6 +53,13 @@ {{ t('certificate24', 'Clear verification cache') }} +
+ + {{ t('certificate24', 'Send reminder mails to email recipients that have not signed their request.') }} + +
@@ -160,6 +167,27 @@ export default { }.bind(this), ) }, + + debounceUpdateSendReminderMails: debounce(function() { + this.updateSendReminderMails() + }, 500), + + updateSendReminderMails() { + this.loading = true + + const self = this + OCP.AppConfig.setValue('certificate24', 'send_reminder_mails', this.settings.send_reminder_mails, { + success() { + showSuccess(t('certificate24', 'Settings saved')) + self.loading = false + }, + error() { + showError(t('certificate24', 'Could not save settings')) + self.loading = false + }, + }) + }, + }, } diff --git a/translationfiles/templates/certificate24.pot b/translationfiles/templates/certificate24.pot index f0bedfb4..151a1710 100644 --- a/translationfiles/templates/certificate24.pot +++ b/translationfiles/templates/certificate24.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Nextcloud 3.14159\n" "Report-Msgid-Bugs-To: translations\\@example.com\n" -"POT-Creation-Date: 2024-07-22 16:26+0200\n" +"POT-Creation-Date: 2024-07-23 08:58+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -64,8 +64,8 @@ msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:80 #. TRANSLATORS src/components/SignDialogModal.vue:52 #: lib/Mails.php:161 -#: specialVueFakeDummyForL10nScript.js:128 -#: specialVueFakeDummyForL10nScript.js:230 +#: specialVueFakeDummyForL10nScript.js:134 +#: specialVueFakeDummyForL10nScript.js:236 msgid "Sign" msgstr "" @@ -268,173 +268,181 @@ msgid "Number of pending verifications: {count}" msgstr "" #. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:53 -#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:139 +#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:146 #: specialVueFakeDummyForL10nScript.js:66 -#: specialVueFakeDummyForL10nScript.js:78 +#: specialVueFakeDummyForL10nScript.js:80 msgid "Clear verification cache" msgstr "" -#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:102 -#. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:106 +#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:60 #: specialVueFakeDummyForL10nScript.js:68 -#: specialVueFakeDummyForL10nScript.js:72 -#: specialVueFakeDummyForL10nScript.js:100 -#: specialVueFakeDummyForL10nScript.js:108 -msgid "Settings saved" +msgid "" +"Send reminder mails to email recipients that have not signed their request." msgstr "" -#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:106 -#. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:110 +#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:109 +#. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:106 #: specialVueFakeDummyForL10nScript.js:70 #: specialVueFakeDummyForL10nScript.js:74 -#: specialVueFakeDummyForL10nScript.js:102 -#: specialVueFakeDummyForL10nScript.js:110 -msgid "Could not save settings" +#: specialVueFakeDummyForL10nScript.js:86 +#: specialVueFakeDummyForL10nScript.js:106 +#: specialVueFakeDummyForL10nScript.js:114 +msgid "Settings saved" msgstr "" -#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:138 +#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:113 +#. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:110 +#: specialVueFakeDummyForL10nScript.js:72 #: specialVueFakeDummyForL10nScript.js:76 +#: specialVueFakeDummyForL10nScript.js:88 +#: specialVueFakeDummyForL10nScript.js:108 +#: specialVueFakeDummyForL10nScript.js:116 +msgid "Could not save settings" +msgstr "" + +#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:145 +#: specialVueFakeDummyForL10nScript.js:78 msgid "" "Do you really want to delete the verification cache? This will require that " "all files need to be verified again." msgstr "" -#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:153 -#: specialVueFakeDummyForL10nScript.js:80 +#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:160 +#: specialVueFakeDummyForL10nScript.js:82 msgid "Verification cache cleared." msgstr "" -#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:156 -#: specialVueFakeDummyForL10nScript.js:82 +#. TRANSLATORS src/components/AdminSettings/InstanceSettings.vue:163 +#: specialVueFakeDummyForL10nScript.js:84 msgid "Error while clearing verification cache." msgstr "" #. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:22 #. TRANSLATORS src/views/SignaturesView.vue:91 -#: specialVueFakeDummyForL10nScript.js:84 -#: specialVueFakeDummyForL10nScript.js:394 +#: specialVueFakeDummyForL10nScript.js:90 +#: specialVueFakeDummyForL10nScript.js:400 msgid "Signature properties" msgstr "" #. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:23 -#: specialVueFakeDummyForL10nScript.js:86 +#: specialVueFakeDummyForL10nScript.js:92 msgid "Additional properties for signature processing can be configured here." msgstr "" #. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:25 -#: specialVueFakeDummyForL10nScript.js:88 +#: specialVueFakeDummyForL10nScript.js:94 msgid "Default action to perform when a file was signed successfully." msgstr "" #. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:31 #. TRANSLATORS src/views/ShareDialogView.vue:124 -#: specialVueFakeDummyForL10nScript.js:90 -#: specialVueFakeDummyForL10nScript.js:322 +#: specialVueFakeDummyForL10nScript.js:96 +#: specialVueFakeDummyForL10nScript.js:328 msgid "Create new signed file next to original file" msgstr "" #. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:38 #. TRANSLATORS src/views/ShareDialogView.vue:127 -#: specialVueFakeDummyForL10nScript.js:92 -#: specialVueFakeDummyForL10nScript.js:324 +#: specialVueFakeDummyForL10nScript.js:98 +#: specialVueFakeDummyForL10nScript.js:330 msgid "Replace original file with signed file" msgstr "" #. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:45 #. TRANSLATORS src/views/ShareDialogView.vue:130 -#: specialVueFakeDummyForL10nScript.js:94 -#: specialVueFakeDummyForL10nScript.js:326 +#: specialVueFakeDummyForL10nScript.js:100 +#: specialVueFakeDummyForL10nScript.js:332 msgid "Don't save signed file automatically" msgstr "" #. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:49 #. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:51 -#: specialVueFakeDummyForL10nScript.js:96 -#: specialVueFakeDummyForL10nScript.js:98 +#: specialVueFakeDummyForL10nScript.js:102 +#: specialVueFakeDummyForL10nScript.js:104 msgid "Number of days after which fully signed signature requests are deleted." msgstr "" #. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:124 -#: specialVueFakeDummyForL10nScript.js:104 +#: specialVueFakeDummyForL10nScript.js:110 msgid "The value may not be empty." msgstr "" #. TRANSLATORS src/components/AdminSettings/SignatureProperties.vue:127 -#: specialVueFakeDummyForL10nScript.js:106 +#: specialVueFakeDummyForL10nScript.js:112 msgid "The value may not be negative." msgstr "" #. TRANSLATORS src/components/CertificateDetails.vue:29 -#: specialVueFakeDummyForL10nScript.js:112 +#: specialVueFakeDummyForL10nScript.js:118 msgid "Download certificate" msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:24 -#: specialVueFakeDummyForL10nScript.js:114 +#: specialVueFakeDummyForL10nScript.js:120 msgid "Incoming signing requests" msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:29 #. TRANSLATORS src/components/OwnSignRequests.vue:29 -#: specialVueFakeDummyForL10nScript.js:116 -#: specialVueFakeDummyForL10nScript.js:144 +#: specialVueFakeDummyForL10nScript.js:122 +#: specialVueFakeDummyForL10nScript.js:150 msgid "No requests created yet" msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:36 #. TRANSLATORS src/components/OwnSignRequests.vue:36 -#: specialVueFakeDummyForL10nScript.js:118 -#: specialVueFakeDummyForL10nScript.js:146 +#: specialVueFakeDummyForL10nScript.js:124 +#: specialVueFakeDummyForL10nScript.js:152 msgid "File" msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:39 #. TRANSLATORS src/components/OwnSignRequests.vue:39 -#: specialVueFakeDummyForL10nScript.js:120 -#: specialVueFakeDummyForL10nScript.js:148 +#: specialVueFakeDummyForL10nScript.js:126 +#: specialVueFakeDummyForL10nScript.js:154 msgid "Created" msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:42 -#: specialVueFakeDummyForL10nScript.js:122 +#: specialVueFakeDummyForL10nScript.js:128 msgid "Signed" msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:45 -#: specialVueFakeDummyForL10nScript.js:124 +#: specialVueFakeDummyForL10nScript.js:130 msgid "Creator" msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:48 #. TRANSLATORS src/components/OwnSignRequests.vue:48 -#: specialVueFakeDummyForL10nScript.js:126 -#: specialVueFakeDummyForL10nScript.js:154 +#: specialVueFakeDummyForL10nScript.js:132 +#: specialVueFakeDummyForL10nScript.js:160 msgid "Actions" msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:89 #. TRANSLATORS src/components/OwnSignRequests.vue:83 -#: specialVueFakeDummyForL10nScript.js:130 -#: specialVueFakeDummyForL10nScript.js:158 +#: specialVueFakeDummyForL10nScript.js:136 +#: specialVueFakeDummyForL10nScript.js:164 msgid "Download signed" msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:97 #. TRANSLATORS src/components/OwnSignRequests.vue:91 -#: specialVueFakeDummyForL10nScript.js:132 -#: specialVueFakeDummyForL10nScript.js:160 +#: specialVueFakeDummyForL10nScript.js:138 +#: specialVueFakeDummyForL10nScript.js:166 msgid "Show details" msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:103 -#: specialVueFakeDummyForL10nScript.js:134 +#: specialVueFakeDummyForL10nScript.js:140 msgid "Waiting for other signatures." msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:229 #. TRANSLATORS src/views/ShareDialogView.vue:623 -#: specialVueFakeDummyForL10nScript.js:136 -#: specialVueFakeDummyForL10nScript.js:360 +#: specialVueFakeDummyForL10nScript.js:142 +#: specialVueFakeDummyForL10nScript.js:366 msgid "" "The server requires a newer version of the app. Please contact your " "administrator." @@ -442,8 +450,8 @@ msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:232 #. TRANSLATORS src/views/ShareDialogView.vue:626 -#: specialVueFakeDummyForL10nScript.js:138 -#: specialVueFakeDummyForL10nScript.js:362 +#: specialVueFakeDummyForL10nScript.js:144 +#: specialVueFakeDummyForL10nScript.js:368 msgid "" "This app requires a newer version of the server. Please contact your " "administrator." @@ -451,150 +459,150 @@ msgstr "" #. TRANSLATORS src/components/IncomingSignRequests.vue:236 #. TRANSLATORS src/views/ShareDialogView.vue:630 -#: specialVueFakeDummyForL10nScript.js:140 -#: specialVueFakeDummyForL10nScript.js:364 +#: specialVueFakeDummyForL10nScript.js:146 +#: specialVueFakeDummyForL10nScript.js:370 msgid "Error loading serverside API, please try again later." msgstr "" #. TRANSLATORS src/components/OwnSignRequests.vue:24 -#: specialVueFakeDummyForL10nScript.js:142 +#: specialVueFakeDummyForL10nScript.js:148 msgid "Signing requests" msgstr "" #. TRANSLATORS src/components/OwnSignRequests.vue:42 -#: specialVueFakeDummyForL10nScript.js:150 +#: specialVueFakeDummyForL10nScript.js:156 msgid "Last signed" msgstr "" #. TRANSLATORS src/components/OwnSignRequests.vue:45 #. TRANSLATORS src/views/ShareDialogView.vue:34 -#: specialVueFakeDummyForL10nScript.js:152 -#: specialVueFakeDummyForL10nScript.js:308 +#: specialVueFakeDummyForL10nScript.js:158 +#: specialVueFakeDummyForL10nScript.js:314 msgid "Recipients" msgstr "" #. TRANSLATORS src/components/OwnSignRequests.vue:75 -#: specialVueFakeDummyForL10nScript.js:156 +#: specialVueFakeDummyForL10nScript.js:162 msgid "Delete" msgstr "" #. TRANSLATORS src/components/OwnSignRequests.vue:223 -#: specialVueFakeDummyForL10nScript.js:162 +#: specialVueFakeDummyForL10nScript.js:168 msgid "Do you really want to delete this signing request?" msgstr "" #. TRANSLATORS src/components/OwnSignRequests.vue:224 -#: specialVueFakeDummyForL10nScript.js:164 +#: specialVueFakeDummyForL10nScript.js:170 msgid "Delete request" msgstr "" #. TRANSLATORS src/components/OwnSignRequests.vue:234 -#: specialVueFakeDummyForL10nScript.js:166 +#: specialVueFakeDummyForL10nScript.js:172 msgid "Request deleted." msgstr "" #. TRANSLATORS src/components/OwnSignRequests.vue:237 -#: specialVueFakeDummyForL10nScript.js:168 +#: specialVueFakeDummyForL10nScript.js:174 msgid "Error while deleting request." msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:23 -#: specialVueFakeDummyForL10nScript.js:170 +#: specialVueFakeDummyForL10nScript.js:176 msgid "Signature Image" msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:36 -#: specialVueFakeDummyForL10nScript.js:172 +#: specialVueFakeDummyForL10nScript.js:178 msgid "Reset" msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:42 -#: specialVueFakeDummyForL10nScript.js:174 +#: specialVueFakeDummyForL10nScript.js:180 msgid "Upload signature image" msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:47 -#: specialVueFakeDummyForL10nScript.js:176 +#: specialVueFakeDummyForL10nScript.js:182 msgid "Signature image" msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:57 -#: specialVueFakeDummyForL10nScript.js:178 +#: specialVueFakeDummyForL10nScript.js:184 msgid "Upload" msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:61 -#: specialVueFakeDummyForL10nScript.js:180 +#: specialVueFakeDummyForL10nScript.js:186 msgid "Draw written signature" msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:76 #. TRANSLATORS src/components/SelectorDialogModal.vue:42 -#: specialVueFakeDummyForL10nScript.js:182 -#: specialVueFakeDummyForL10nScript.js:220 +#: specialVueFakeDummyForL10nScript.js:188 +#: specialVueFakeDummyForL10nScript.js:226 msgid "Save" msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:84 -#: specialVueFakeDummyForL10nScript.js:184 +#: specialVueFakeDummyForL10nScript.js:190 msgid "Clear" msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:159 -#: specialVueFakeDummyForL10nScript.js:186 +#: specialVueFakeDummyForL10nScript.js:192 msgid "Please select a file first." msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:168 -#: specialVueFakeDummyForL10nScript.js:188 +#: specialVueFakeDummyForL10nScript.js:194 msgid "Could not open file." msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:175 -#: specialVueFakeDummyForL10nScript.js:190 #: specialVueFakeDummyForL10nScript.js:196 +#: specialVueFakeDummyForL10nScript.js:202 msgid "Signature image uploaded." msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:185 -#: specialVueFakeDummyForL10nScript.js:192 #: specialVueFakeDummyForL10nScript.js:198 +#: specialVueFakeDummyForL10nScript.js:204 msgid "The uploaded image is too large." msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:188 -#: specialVueFakeDummyForL10nScript.js:194 #: specialVueFakeDummyForL10nScript.js:200 +#: specialVueFakeDummyForL10nScript.js:206 msgid "Error while uploading signature image." msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:229 -#: specialVueFakeDummyForL10nScript.js:202 +#: specialVueFakeDummyForL10nScript.js:208 msgid "Do you really want to reset the signature image?" msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:230 -#: specialVueFakeDummyForL10nScript.js:204 +#: specialVueFakeDummyForL10nScript.js:210 msgid "Reset signature image" msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:239 -#: specialVueFakeDummyForL10nScript.js:206 +#: specialVueFakeDummyForL10nScript.js:212 msgid "Signature image reset." msgstr "" #. TRANSLATORS src/components/PersonalSettings/SignatureImage.vue:243 -#: specialVueFakeDummyForL10nScript.js:208 +#: specialVueFakeDummyForL10nScript.js:214 msgid "Error while resetting signature image." msgstr "" #. TRANSLATORS src/components/SearchResults.vue:44 -#: specialVueFakeDummyForL10nScript.js:210 +#: specialVueFakeDummyForL10nScript.js:216 msgid "Searching …" msgstr "" #. TRANSLATORS src/components/SearchResults.vue:45 -#: specialVueFakeDummyForL10nScript.js:212 +#: specialVueFakeDummyForL10nScript.js:218 msgid "No search results" msgstr "" @@ -602,208 +610,208 @@ msgstr "" #. TRANSLATORS src/components/SelectorDialogModal.vue:27 #. TRANSLATORS src/views/ShareDialogView.vue:142 #. TRANSLATORS src/views/ShareDialogView.vue:148 -#: specialVueFakeDummyForL10nScript.js:214 -#: specialVueFakeDummyForL10nScript.js:216 -#: specialVueFakeDummyForL10nScript.js:218 -#: specialVueFakeDummyForL10nScript.js:328 -#: specialVueFakeDummyForL10nScript.js:330 +#: specialVueFakeDummyForL10nScript.js:220 +#: specialVueFakeDummyForL10nScript.js:222 +#: specialVueFakeDummyForL10nScript.js:224 +#: specialVueFakeDummyForL10nScript.js:334 +#: specialVueFakeDummyForL10nScript.js:336 msgid "Select signature position" msgstr "" #. TRANSLATORS src/components/SignDialogModal.vue:23 #. TRANSLATORS src/components/SignDialogModal.vue:28 -#: specialVueFakeDummyForL10nScript.js:222 -#: specialVueFakeDummyForL10nScript.js:224 -#: specialVueFakeDummyForL10nScript.js:226 +#: specialVueFakeDummyForL10nScript.js:228 +#: specialVueFakeDummyForL10nScript.js:230 +#: specialVueFakeDummyForL10nScript.js:232 msgid "Sign {filename}" msgstr "" #. TRANSLATORS src/components/SignDialogModal.vue:44 -#: specialVueFakeDummyForL10nScript.js:228 +#: specialVueFakeDummyForL10nScript.js:234 msgid "Embed personal signature in fields" msgstr "" #. TRANSLATORS src/components/SignDialogModal.vue:127 -#: specialVueFakeDummyForL10nScript.js:232 +#: specialVueFakeDummyForL10nScript.js:238 msgid "" "Please upload a signature image in the personal settings to sign this file." msgstr "" #. TRANSLATORS src/components/SignDialogModal.vue:149 -#: specialVueFakeDummyForL10nScript.js:234 +#: specialVueFakeDummyForL10nScript.js:240 msgid "Could not load document, please download and review manually." msgstr "" #. TRANSLATORS src/components/SignDialogModal.vue:154 -#: specialVueFakeDummyForL10nScript.js:236 +#: specialVueFakeDummyForL10nScript.js:242 msgid "Could not render page {page}." msgstr "" #. TRANSLATORS src/components/SignDialogModal.vue:159 -#: specialVueFakeDummyForL10nScript.js:238 +#: specialVueFakeDummyForL10nScript.js:244 msgid "Do you really want to sign this request?" msgstr "" #. TRANSLATORS src/components/SignDialogModal.vue:160 -#: specialVueFakeDummyForL10nScript.js:240 +#: specialVueFakeDummyForL10nScript.js:246 msgid "Sign request" msgstr "" #. TRANSLATORS src/components/SignDialogModal.vue:178 -#: specialVueFakeDummyForL10nScript.js:242 +#: specialVueFakeDummyForL10nScript.js:248 msgid "Request signed." msgstr "" #. TRANSLATORS src/components/SignDialogModal.vue:182 -#: specialVueFakeDummyForL10nScript.js:244 +#: specialVueFakeDummyForL10nScript.js:250 msgid "Error while signing request." msgstr "" #. TRANSLATORS src/components/SignatureProperties.vue:24 -#: specialVueFakeDummyForL10nScript.js:246 +#: specialVueFakeDummyForL10nScript.js:252 msgid "Reason: {reason}" msgstr "" #. TRANSLATORS src/components/SignatureProperties.vue:29 -#: specialVueFakeDummyForL10nScript.js:248 +#: specialVueFakeDummyForL10nScript.js:254 msgid "Location:" msgstr "" #. TRANSLATORS src/components/SignatureProperties.vue:34 -#: specialVueFakeDummyForL10nScript.js:250 +#: specialVueFakeDummyForL10nScript.js:256 msgid "Contact:" msgstr "" #. TRANSLATORS src/components/SignatureProperties.vue:39 -#: specialVueFakeDummyForL10nScript.js:252 +#: specialVueFakeDummyForL10nScript.js:258 msgid "Nextcloud URL:" msgstr "" #. TRANSLATORS src/components/SignatureStatus.vue:24 -#: specialVueFakeDummyForL10nScript.js:254 +#: specialVueFakeDummyForL10nScript.js:260 msgid "Signature status: {status}" msgstr "" #. TRANSLATORS src/components/SignatureStatus.vue:46 -#: specialVueFakeDummyForL10nScript.js:256 +#: specialVueFakeDummyForL10nScript.js:262 msgid "Valid" msgstr "" #. TRANSLATORS src/components/SignatureStatus.vue:48 -#: specialVueFakeDummyForL10nScript.js:258 +#: specialVueFakeDummyForL10nScript.js:264 msgid "The format is not valid" msgstr "" #. TRANSLATORS src/components/SignatureStatus.vue:50 -#: specialVueFakeDummyForL10nScript.js:260 +#: specialVueFakeDummyForL10nScript.js:266 msgid "Error while validating" msgstr "" #. TRANSLATORS src/components/SignatureStatus.vue:52 -#: specialVueFakeDummyForL10nScript.js:262 +#: specialVueFakeDummyForL10nScript.js:268 msgid "The certificate is not valid yet" msgstr "" #. TRANSLATORS src/components/SignatureStatus.vue:54 -#: specialVueFakeDummyForL10nScript.js:264 +#: specialVueFakeDummyForL10nScript.js:270 msgid "The certificate is expired" msgstr "" #. TRANSLATORS src/components/SignatureStatus.vue:56 -#: specialVueFakeDummyForL10nScript.js:266 +#: specialVueFakeDummyForL10nScript.js:272 msgid "No signature date found" msgstr "" #. TRANSLATORS src/components/SignatureStatus.vue:58 -#: specialVueFakeDummyForL10nScript.js:268 +#: specialVueFakeDummyForL10nScript.js:274 msgid "The signature date is invalid" msgstr "" #. TRANSLATORS src/components/SignatureStatus.vue:60 -#: specialVueFakeDummyForL10nScript.js:270 +#: specialVueFakeDummyForL10nScript.js:276 msgid "Signed by unknown CA" msgstr "" #. TRANSLATORS src/components/SignatureStatus.vue:62 -#: specialVueFakeDummyForL10nScript.js:272 +#: specialVueFakeDummyForL10nScript.js:278 msgid "The signature is invalid" msgstr "" #. TRANSLATORS src/views/Dashboard.vue:25 -#: specialVueFakeDummyForL10nScript.js:274 +#: specialVueFakeDummyForL10nScript.js:280 msgid "More signature requests…" msgstr "" #. TRANSLATORS src/views/Dashboard.vue:35 -#: specialVueFakeDummyForL10nScript.js:276 +#: specialVueFakeDummyForL10nScript.js:282 msgid "No signature requests" msgstr "" #. TRANSLATORS src/views/Dashboard.vue:88 -#: specialVueFakeDummyForL10nScript.js:278 +#: specialVueFakeDummyForL10nScript.js:284 msgid "Requested by {display_name} on {date}" msgstr "" #. TRANSLATORS src/views/FilesSidebarTab.vue:28 #. TRANSLATORS src/views/SignaturesView.vue:29 -#: specialVueFakeDummyForL10nScript.js:280 -#: specialVueFakeDummyForL10nScript.js:288 -#: specialVueFakeDummyForL10nScript.js:368 -#: specialVueFakeDummyForL10nScript.js:378 +#: specialVueFakeDummyForL10nScript.js:286 +#: specialVueFakeDummyForL10nScript.js:294 +#: specialVueFakeDummyForL10nScript.js:374 +#: specialVueFakeDummyForL10nScript.js:384 #: src/mainFilesSidebarLoader.js:39 msgid "Signatures" msgstr "" #. TRANSLATORS src/views/FilesSidebarTab.vue:30 -#: specialVueFakeDummyForL10nScript.js:282 +#: specialVueFakeDummyForL10nScript.js:288 msgid "Signatures are not supported for this file." msgstr "" #. TRANSLATORS src/views/FilesSidebarTab.vue:33 -#: specialVueFakeDummyForL10nScript.js:284 +#: specialVueFakeDummyForL10nScript.js:290 msgid "Signature status is pending for this file." msgstr "" #. TRANSLATORS src/views/FilesSidebarTab.vue:37 -#: specialVueFakeDummyForL10nScript.js:286 +#: specialVueFakeDummyForL10nScript.js:292 msgid "Check manually" msgstr "" #. TRANSLATORS src/views/FilesSidebarTab.vue:44 #. TRANSLATORS src/views/SignaturesView.vue:31 -#: specialVueFakeDummyForL10nScript.js:290 -#: specialVueFakeDummyForL10nScript.js:370 +#: specialVueFakeDummyForL10nScript.js:296 +#: specialVueFakeDummyForL10nScript.js:376 msgid "The file is not signed." msgstr "" #. TRANSLATORS src/views/FilesSidebarTab.vue:47 #. TRANSLATORS src/views/SignaturesView.vue:34 -#: specialVueFakeDummyForL10nScript.js:292 -#: specialVueFakeDummyForL10nScript.js:372 +#: specialVueFakeDummyForL10nScript.js:298 +#: specialVueFakeDummyForL10nScript.js:378 msgid "The file is encrypted and can not be checked." msgstr "" #. TRANSLATORS src/views/FilesSidebarTab.vue:50 #. TRANSLATORS src/views/SignaturesView.vue:37 -#: specialVueFakeDummyForL10nScript.js:294 -#: specialVueFakeDummyForL10nScript.js:374 +#: specialVueFakeDummyForL10nScript.js:300 +#: specialVueFakeDummyForL10nScript.js:380 msgid "The file could not be parsed and can not be checked." msgstr "" #. TRANSLATORS src/views/FilesSidebarTab.vue:53 #. TRANSLATORS src/views/FilesSidebarTab.vue:236 #. TRANSLATORS src/views/SignaturesView.vue:40 -#: specialVueFakeDummyForL10nScript.js:296 -#: specialVueFakeDummyForL10nScript.js:300 -#: specialVueFakeDummyForL10nScript.js:376 +#: specialVueFakeDummyForL10nScript.js:302 +#: specialVueFakeDummyForL10nScript.js:306 +#: specialVueFakeDummyForL10nScript.js:382 msgid "Error fetching signature details." msgstr "" #. TRANSLATORS src/views/FilesSidebarTab.vue:56 #. TRANSLATORS src/views/SignaturesView.vue:123 -#: specialVueFakeDummyForL10nScript.js:298 -#: specialVueFakeDummyForL10nScript.js:400 +#: specialVueFakeDummyForL10nScript.js:304 +#: specialVueFakeDummyForL10nScript.js:406 msgid "Force recheck" msgstr "" @@ -811,161 +819,161 @@ msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:28 #. TRANSLATORS src/views/ShareDialogView.vue:24 #. TRANSLATORS src/views/ShareDialogView.vue:28 -#: specialVueFakeDummyForL10nScript.js:302 -#: specialVueFakeDummyForL10nScript.js:304 -#: specialVueFakeDummyForL10nScript.js:306 -#: specialVueFakeDummyForL10nScript.js:332 -#: specialVueFakeDummyForL10nScript.js:334 +#: specialVueFakeDummyForL10nScript.js:308 +#: specialVueFakeDummyForL10nScript.js:310 +#: specialVueFakeDummyForL10nScript.js:312 +#: specialVueFakeDummyForL10nScript.js:338 +#: specialVueFakeDummyForL10nScript.js:340 #: src/mainLoader.js:63 msgid "Request signature" msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:49 -#: specialVueFakeDummyForL10nScript.js:310 +#: specialVueFakeDummyForL10nScript.js:316 msgid "Delete recipient" msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:61 -#: specialVueFakeDummyForL10nScript.js:312 +#: specialVueFakeDummyForL10nScript.js:318 msgid "Add user" msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:69 -#: specialVueFakeDummyForL10nScript.js:314 +#: specialVueFakeDummyForL10nScript.js:320 msgid "Search users" msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:93 -#: specialVueFakeDummyForL10nScript.js:316 +#: specialVueFakeDummyForL10nScript.js:322 msgid "Add email address" msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:101 -#: specialVueFakeDummyForL10nScript.js:318 +#: specialVueFakeDummyForL10nScript.js:324 msgid "E-mail address" msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:121 -#: specialVueFakeDummyForL10nScript.js:320 +#: specialVueFakeDummyForL10nScript.js:326 msgid "Action to perform when the file was signed successfully:" msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:252 -#: specialVueFakeDummyForL10nScript.js:336 +#: specialVueFakeDummyForL10nScript.js:342 msgid "Cancel search" msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:362 -#: specialVueFakeDummyForL10nScript.js:338 +#: specialVueFakeDummyForL10nScript.js:344 msgid "An error occurred while performing the search" msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:517 -#: specialVueFakeDummyForL10nScript.js:340 +#: specialVueFakeDummyForL10nScript.js:346 msgid "No file selected." msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:522 -#: specialVueFakeDummyForL10nScript.js:342 +#: specialVueFakeDummyForL10nScript.js:348 msgid "Please add at least one recipient first." msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:542 -#: specialVueFakeDummyForL10nScript.js:344 +#: specialVueFakeDummyForL10nScript.js:350 msgid "Please create signature fields first." msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:571 -#: specialVueFakeDummyForL10nScript.js:346 +#: specialVueFakeDummyForL10nScript.js:352 msgid "At least one field has no recipient assigned." msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:574 -#: specialVueFakeDummyForL10nScript.js:348 +#: specialVueFakeDummyForL10nScript.js:354 msgid "At least one recipient has no field assigned." msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:587 -#: specialVueFakeDummyForL10nScript.js:350 +#: specialVueFakeDummyForL10nScript.js:356 msgid "Requested signature." msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:596 -#: specialVueFakeDummyForL10nScript.js:352 +#: specialVueFakeDummyForL10nScript.js:358 msgid "Unknown user." msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:599 -#: specialVueFakeDummyForL10nScript.js:354 +#: specialVueFakeDummyForL10nScript.js:360 msgid "Invalid email address." msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:602 -#: specialVueFakeDummyForL10nScript.js:356 +#: specialVueFakeDummyForL10nScript.js:362 msgid "Error connecting to Certificate24 service." msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:605 -#: specialVueFakeDummyForL10nScript.js:358 +#: specialVueFakeDummyForL10nScript.js:364 msgid "Error while requesting signature." msgstr "" #. TRANSLATORS src/views/ShareDialogView.vue:136 -#: specialVueFakeDummyForL10nScript.js:366 +#: specialVueFakeDummyForL10nScript.js:372 msgid "%n signature field positioned" msgid_plural "%n signature fields positioned" msgstr[0] "" msgstr[1] "" #. TRANSLATORS src/views/SignaturesView.vue:47 -#: specialVueFakeDummyForL10nScript.js:380 +#: specialVueFakeDummyForL10nScript.js:386 msgid "Checked on: {date}" msgstr "" #. TRANSLATORS src/views/SignaturesView.vue:58 -#: specialVueFakeDummyForL10nScript.js:382 +#: specialVueFakeDummyForL10nScript.js:388 msgid "Signature {index}" msgstr "" #. TRANSLATORS src/views/SignaturesView.vue:64 -#: specialVueFakeDummyForL10nScript.js:384 +#: specialVueFakeDummyForL10nScript.js:390 msgid "Signed by: {signer}" msgstr "" #. TRANSLATORS src/views/SignaturesView.vue:69 -#: specialVueFakeDummyForL10nScript.js:386 +#: specialVueFakeDummyForL10nScript.js:392 msgid "Signed on: {date}" msgstr "" #. TRANSLATORS src/views/SignaturesView.vue:75 -#: specialVueFakeDummyForL10nScript.js:388 +#: specialVueFakeDummyForL10nScript.js:394 msgid "" "The signature timestamp was generated on the signers machine and is " "untrusted." msgstr "" #. TRANSLATORS src/views/SignaturesView.vue:83 -#: specialVueFakeDummyForL10nScript.js:390 +#: specialVueFakeDummyForL10nScript.js:396 msgid "The file was not modified since it was signed." msgstr "" #. TRANSLATORS src/views/SignaturesView.vue:86 -#: specialVueFakeDummyForL10nScript.js:392 +#: specialVueFakeDummyForL10nScript.js:398 msgid "The file was modified since it was signed." msgstr "" #. TRANSLATORS src/views/SignaturesView.vue:98 -#: specialVueFakeDummyForL10nScript.js:396 +#: specialVueFakeDummyForL10nScript.js:402 msgid "Signature timestamp" msgstr "" #. TRANSLATORS src/views/SignaturesView.vue:111 -#: specialVueFakeDummyForL10nScript.js:398 +#: specialVueFakeDummyForL10nScript.js:404 msgid "Certificate chain" msgstr "" #. TRANSLATORS src/views/SignaturesView.vue:214 -#: specialVueFakeDummyForL10nScript.js:402 +#: specialVueFakeDummyForL10nScript.js:408 msgid "Unknown" msgstr "" From 7885b4c0a3c1e4a6d5725531abeb601d8d4d3146 Mon Sep 17 00:00:00 2001 From: Joachim Bauch Date: Tue, 23 Jul 2024 09:06:00 +0200 Subject: [PATCH 3/3] Indent background signature details. --- .../AdminSettings/InstanceSettings.vue | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/components/AdminSettings/InstanceSettings.vue b/src/components/AdminSettings/InstanceSettings.vue index 2e21ebb0..0c057539 100644 --- a/src/components/AdminSettings/InstanceSettings.vue +++ b/src/components/AdminSettings/InstanceSettings.vue @@ -35,23 +35,25 @@ @update:checked="debounceUpdateBackgroundVerify"> {{ t('certificate24', 'Verify document signatures in the background.') }} -
- {{ t('certificate24', 'Last verification: {timestamp}', { - timestamp: formatDate(settings.last_verified), - }) }} +
+
+ {{ t('certificate24', 'Last verification: {timestamp}', { + timestamp: formatDate(settings.last_verified), + }) }} +
+
+ {{ t('certificate24', 'Last verification: none yet') }} +
+
+ {{ t('certificate24', 'Number of pending verifications: {count}', { + count: settings.unverified_count, + }) }} +
+ + {{ t('certificate24', 'Clear verification cache') }} +
-
- {{ t('certificate24', 'Last verification: none yet') }} -
-
- {{ t('certificate24', 'Number of pending verifications: {count}', { - count: settings.unverified_count, - }) }} -
- - {{ t('certificate24', 'Clear verification cache') }} -
+ +