From db0bfadce358340911b12c070b2d54a2fe20ebbc Mon Sep 17 00:00:00 2001 From: dartcafe Date: Tue, 9 Sep 2025 13:14:35 +0200 Subject: [PATCH 01/56] Replace possibly incorrect migrations by dummy migration to avoid execution Signed-off-by: dartcafe --- .../Version080300Date20250812231603.php | 47 +++++ .../Version080300Date20250816201201.php | 47 +++++ .../Version080301Date20250822153002.php | 173 ++++++++++++++++++ .../Version080301Date20250822182903.php | 47 +++++ .../Version080303Date20250824090101.php | 47 +++++ 5 files changed, 361 insertions(+) create mode 100644 lib/Migration/Version080300Date20250812231603.php create mode 100644 lib/Migration/Version080300Date20250816201201.php create mode 100644 lib/Migration/Version080301Date20250822153002.php create mode 100644 lib/Migration/Version080301Date20250822182903.php create mode 100644 lib/Migration/Version080303Date20250824090101.php diff --git a/lib/Migration/Version080300Date20250812231603.php b/lib/Migration/Version080300Date20250812231603.php new file mode 100644 index 0000000000..ca9112c442 --- /dev/null +++ b/lib/Migration/Version080300Date20250812231603.php @@ -0,0 +1,47 @@ +output = $output; + $this->logInfo('Prepare migration'); + + // remove foreign keys and unique indices from the share table in preparation of fixing nullish values + $this->indexManager->createSchema(); // Let the indexManager use it's own schema + $message = $this->indexManager->removeUniqueIndicesFromTable(Share::TABLE); + $this->logInfo($message, 'preMigration: '); + $message = $this->indexManager->removeForeignKeysFromTable(Share::TABLE); + $this->logInfo($message, 'preMigration: '); + $this->indexManager->migrateToSchema(); + + // fix nullish values in poll_id and group_id and set 0 in case of null + $message = $this->tableManager->fixNullishShares(); + $this->logInfo($message, 'postMigration: '); + + $message = $this->tableManager->tidyWatchTable(time()); + $this->logInfo($message, 'preMigration: '); + } + + /** + * This method is executing the actual schema change based on the definition of TableSchema + * $schemaClosure The `\Closure` returns an `ISchemaWrapper` + * @param IOutput $output + * @param \Closure $schemaClosure + * @param array $options + * @return ISchemaWrapper|null + */ + public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options): ?ISchemaWrapper { + $this->output = $output; + $this->schema = $schemaClosure(); + $this->tableManager->setConnection($this->connection); + $this->tableManager->setSchema($this->schema); + + $message = $this->tableManager->createTables(); + $this->logInfo($message, 'runMigration: '); + + if (!($this->schema instanceof ISchemaWrapper)) { + return null; + } + + return $this->schema; + } + + /** + * This method is called after the schema change. + * It is used to perform any post-migration steps, such as migrating options to a hash. + * Main steps: + * 1. Ensure that option hashes are created correctly for options and votes + * + * @param IOutput $output + * @param \Closure $schemaClosure + * @param array $options + * @return void + */ + public function postSchemaChange(IOutput $output, \Closure $schemaClosure, array $options): void { + $this->output = $output; + $this->logInfo('Post migration steps'); + + // Clean up tables before creating indices and foreign keys + + // remove all orphaned records + $message = $this->tableManager->removeOrphaned(); + $this->logInfo($message, 'postMigration: '); + + // ensure correct option hashes in options and votes + $message = $this->tableManager->migrateOptionsToHash(); + $this->logInfo($message, 'postMigration: '); + + // remove all duplicate records which have to be unique + $message = $this->tableManager->deleteAllDuplicates(); + $this->logInfo($message, 'postMigration: '); + + // remove obsolete tables and columns + $message = $this->tableManager->removeObsoleteTables(); + $this->logInfo($message, 'postMigration: '); + + $this->tableManager->createSchema(); + $message = $this->tableManager->removeObsoleteColumns(); + $this->logInfo($message, 'postMigration: '); + $this->tableManager->migrateToSchema(); + + // now we can create the foreign keys and unique indices for the share table again + $this->indexManager->createSchema(); + $message = $this->indexManager->createForeignKeyConstraints(); + $this->logInfo($message, 'postMigration: '); + + $message = $this->indexManager->createUniqueIndices(); + $this->logInfo($message, 'postMigration: '); + + // skip creating optional indices and leave it to 'occ db:add-missing-indices' + $this->indexManager->migrateToSchema(); + } + + /** + * Logs the given message to the output. + * + * @param string|array $message The message to log, can be a string or an array of strings. + * @param string $prefix Optional prefix for the message, defaults to an empty string. + * @return void + */ + private function logInfo(string|array $message, string $prefix = ''): void { + if ($this->output) { + if (is_array($message)) { + foreach ($message as $msg) { + $this->output->info($prefix . 'Polls - ' . $msg); + } + } else { + $this->output->info($prefix . 'Polls - ' . $message); + } + } + } + +} diff --git a/lib/Migration/Version080301Date20250822182903.php b/lib/Migration/Version080301Date20250822182903.php new file mode 100644 index 0000000000..6ec1b1a6e4 --- /dev/null +++ b/lib/Migration/Version080301Date20250822182903.php @@ -0,0 +1,47 @@ + Date: Tue, 9 Sep 2025 19:31:38 +0200 Subject: [PATCH 02/56] add hash calculation to janitor cron Signed-off-by: dartcafe --- lib/Cron/JanitorCron.php | 3 ++ lib/Db/Option.php | 4 +- lib/Db/V3/TableManager.php | 79 +++++++++++++++++++++++++++++++++----- 3 files changed, 74 insertions(+), 12 deletions(-) diff --git a/lib/Cron/JanitorCron.php b/lib/Cron/JanitorCron.php index 59bbe16d11..d5c973a9d5 100644 --- a/lib/Cron/JanitorCron.php +++ b/lib/Cron/JanitorCron.php @@ -65,6 +65,9 @@ protected function run($argument) { // delete entries older than 1 day $this->tableManager->tidyWatchTable(time() - 86400); + // first make sure all options and votes have a correct hash + $this->tableManager->migrateOptionsToHash(); + // purge entries virtually deleted more than 12 hours ago $deleted['comments'] = $this->commentMapper->purgeDeletedComments(time() - 4320); $deleted['options'] = $this->optionMapper->purgeDeletedOptions(time() - 4320); diff --git a/lib/Db/Option.php b/lib/Db/Option.php index 379fcd6810..0f97a428c8 100644 --- a/lib/Db/Option.php +++ b/lib/Db/Option.php @@ -200,8 +200,8 @@ public function shiftOption(DateTimeZone $timeZone, int $step, string $unit): vo } /** - * Syncs pollOptionText and order according to timestamp and duration if timestamp > 0 - * Updates hash + * Syncs pollOptionText and order according to timestamp and duration if timestamp > 0 and + * updates hash based on synced pollId and pollOptionText */ public function syncOption(): void { // make sure, pollOptionText matches timestamp and duration diff --git a/lib/Db/V3/TableManager.php b/lib/Db/V3/TableManager.php index abd47eb623..4d459881bd 100644 --- a/lib/Db/V3/TableManager.php +++ b/lib/Db/V3/TableManager.php @@ -547,24 +547,52 @@ public function migrateOptionsToHash(): array { if ($schema->hasTable($this->dbPrefix . OptionMapper::TABLE)) { $table = $schema->getTable($this->dbPrefix . OptionMapper::TABLE); $count = 0; + $updated = 0; + if ($table->hasColumn('poll_option_hash')) { foreach ($this->optionMapper->getAll(includeNull: true) as $option) { try { + // calculate the actual hash based on pollId and optionText + $actualHash = Hash::getOptionHash($option->getPollId(), $option->getPollOptionText()); + + // ensure the option is in sync $option->syncOption(); - $this->optionMapper->update($option); + + // if the hash, set in syncOptions() differs from $actualHash update the option + if ($option->getPollOptionHash() !== $actualHash) { + $option = $this->optionMapper->update($option); + $updated++; + } + $count++; + } catch (Exception $e) { $messages[] = 'Skip hash update - Error updating option hash for optionId ' . $option->getId(); $this->logger->error('Error updating option hash for optionId {id}', ['id' => $option->getId(), 'message' => $e->getMessage()]); } } - $this->logger->info('Updated {number} hashes in {db}', ['number' => $count,'db' => $this->dbPrefix . OptionMapper::TABLE]); - $messages[] = 'Updated ' . $count . ' option hashes'; + if ($updated === 0) { + $this->logger->info('No hashes of {count} options had to get updated in {db}', [ + 'count' => $count, + 'db' => $this->dbPrefix . OptionMapper::TABLE + ]); + $messages[] = 'No option hashes to update'; + + } else { + $this->logger->info('Updated {updated} hashes of {count} options in {db}', [ + 'updated' => $updated, + 'count' => $count, + 'db' => $this->dbPrefix . OptionMapper::TABLE + ]); + $messages[] = 'Updated ' . $updated . ' option hashes'; + + } } else { $this->logger->error('{db} is missing column \'poll_option_hash\' - aborted recalculating hashes', [ 'db' => $this->dbPrefix . OptionMapper::TABLE]); } + } else { $this->logger->error('{db} is missing - aborted recalculating hashes', [ 'db' => $this->dbPrefix . OptionMapper::TABLE]); } @@ -572,26 +600,57 @@ public function migrateOptionsToHash(): array { if ($schema->hasTable($this->dbPrefix . VoteMapper::TABLE)) { $table = $schema->getTable($this->dbPrefix . VoteMapper::TABLE); $count = 0; + $updated = 0; if ($table->hasColumn('vote_option_hash')) { foreach ($this->voteMapper->getAll(includeNull: true) as $vote) { try { - $vote->setVoteOptionHash(Hash::getOptionHash($vote->getPollId(), $vote->getVoteOptionText())); - $this->voteMapper->update($vote); + // calculate the actual hash based on pollId and optionText + $actualHash = Hash::getOptionHash($vote->getPollId(), $vote->getVoteOptionText()); + + // if the hash of the vote differs from $actualHash update the vote hash + if ($vote->getVoteOptionHash() !== $actualHash) { + $vote->setVoteOptionHash($actualHash); + $vote = $this->voteMapper->update($vote); + $updated++; + } + $count++; + } catch (Exception $e) { $messages[] = 'Skip hash update - Error updating option hash for voteId ' . $vote->getId(); - $this->logger->error('Error updating option hash for voteId {id}', ['id' => $vote->getId(), 'message' => $e->getMessage()]); + $this->logger->error('Error updating option hash for voteId {id}', [ + 'id' => $vote->getId(), + 'message' => $e->getMessage() + ]); } } - $this->logger->info('Updated {number} hashes in {db}', ['number' => $count, 'db' => $this->dbPrefix . VoteMapper::TABLE]); - $messages[] = 'Updated ' . $count . ' vote hashes'; + if ($updated === 0) { + $this->logger->info('No hashes of {count} options had to get updated in {db}', [ + 'count' => $count, + 'db' => $this->dbPrefix . VoteMapper::TABLE + ]); + $messages[] = 'No vote hashes to update'; + + } else { + $this->logger->info('Updated {count} hashes of {updated} votes in {db}', [ + 'updated' => $updated, + 'count' => $count, + 'db' => $this->dbPrefix . VoteMapper::TABLE + ]); + $messages[] = 'Updated ' . $updated . ' vote hashes'; + + } } else { - $this->logger->error('{db} is missing column \'poll_option_hash\' - aborted recalculating hashes', ['db' => $this->dbPrefix . VoteMapper::TABLE]); + $this->logger->error('{db} is missing column \'poll_option_hash\' - aborted recalculating hashes', [ + 'db' => $this->dbPrefix . VoteMapper::TABLE + ]); } } else { - $this->logger->error('{db} is missing- aborted recalculating hashes', ['db' => $this->dbPrefix . VoteMapper::TABLE]); + $this->logger->error('{db} is missing- aborted recalculating hashes', [ + 'db' => $this->dbPrefix . VoteMapper::TABLE + ]); } return $messages; } From 4c7b13247d30e02fd831115a31ad8c1dec2a8063 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Mon, 1 Sep 2025 20:02:07 +0200 Subject: [PATCH 03/56] prepare 8.4.3 Signed-off-by: dartcafe --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 210a231676..6792a1c280 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,8 @@ # Changelog All notable changes to this project will be documented in this file. -## [unpublished] +## [8.4.3] - 2025-09-01 ### Fixed - - Fixed some activity bugs - Fixed nullish user settings - Fixed some activity bugs - Limit subquery results to respect oracle limit (affected orphaned votes deletion in janitor cron) From 1cbe51583ceadd3ce90e64d75a64466e2fca3711 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Mon, 1 Sep 2025 20:02:24 +0200 Subject: [PATCH 04/56] 8.4.3 Signed-off-by: dartcafe --- appinfo/info.xml | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index 8bb28d414e..6672fb820d 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -4,7 +4,7 @@ Polls A polls app, similar to Doodle/DuD-Poll with the possibility to restrict access. A polls app, similar to Doodle/DuD-Poll with the possibility to restrict access (members, certain groups/users, hidden and public). - 8.4.2 + 8.4.3 agpl Vinzenz Rosenkranz René Gieling diff --git a/package-lock.json b/package-lock.json index 05d52a296a..7916511482 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "polls", - "version": "8.4.2", + "version": "8.4.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "polls", - "version": "8.4.2", + "version": "8.4.3", "license": "AGPL-3.0", "dependencies": { "@nextcloud/auth": "^2.5.1", diff --git a/package.json b/package.json index efb0760f23..1f4d1ff93d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "polls", - "version": "8.4.2", + "version": "8.4.3", "private": true, "description": "Polls app for nextcloud", "homepage": "https://github.com/nextcloud/polls#readme", From e6451d93546da8a21c4f74176ad549446b9308e4 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Tue, 2 Sep 2025 01:24:54 +0000 Subject: [PATCH 05/56] fix(l10n): Update translations from Transifex Signed-off-by: Nextcloud bot --- l10n/mk.js | 2 ++ l10n/mk.json | 2 ++ l10n/ru.js | 1 + l10n/ru.json | 1 + l10n/sw.js | 1 + l10n/sw.json | 1 + 6 files changed, 8 insertions(+) diff --git a/l10n/mk.js b/l10n/mk.js index fe0cd1ac4e..7179fb1ca0 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -67,6 +67,8 @@ OC.L10N.register( "Options" : "Опции", "Sharing" : "Споделување", "Activity" : "Активност", + "Minute" : "Минута", + "Hour" : "Час", "Day" : "Ден", "Week" : "Недела", "Month" : "Месец", diff --git a/l10n/mk.json b/l10n/mk.json index 0b60e6d4e6..319d562291 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -65,6 +65,8 @@ "Options" : "Опции", "Sharing" : "Споделување", "Activity" : "Активност", + "Minute" : "Минута", + "Hour" : "Час", "Day" : "Ден", "Week" : "Недела", "Month" : "Месец", diff --git a/l10n/ru.js b/l10n/ru.js index f792244563..ebf15ce08f 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -191,6 +191,7 @@ OC.L10N.register( "36 hours before the expiration date, if the poll is created more than 2 and less than 5 days before the expiration." : "За 36 часов до истечения срока действия, если опрос создан более чем за 2 и менее чем за 5 дней до истечения срока действия.", "48 hours before the first date option, if the poll is created more than 5 days before the first date option." : "Опционально, за 48 часов до первой даты, если опрос создается более чем за 5 дней до первой даты.", "36 hours before the first date option, if the poll is created more than 2 and less than 5 days before the first date option." : "Опционально, за 36 часов до первой даты, если опрос создается более чем за 2 и менее чем за 5 дней до первой даты.", + "No reminder is sent" : "Напоминание не отправлено", "For text polls without expiration." : "Для текстовых опросов без срока действия.", "For polls created less than 2 days before the expiration." : "Для опросов, созданных менее чем за 2 дня до истечения срока действия.", "If a share already got a reminder (no matter, if the expiration date got changed)." : "Если те, у кого есть доступ, уже получили напоминание (неважно, изменилась ли дата истечения срока действия).", diff --git a/l10n/ru.json b/l10n/ru.json index 4c6c86ccb2..91755aa84b 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -189,6 +189,7 @@ "36 hours before the expiration date, if the poll is created more than 2 and less than 5 days before the expiration." : "За 36 часов до истечения срока действия, если опрос создан более чем за 2 и менее чем за 5 дней до истечения срока действия.", "48 hours before the first date option, if the poll is created more than 5 days before the first date option." : "Опционально, за 48 часов до первой даты, если опрос создается более чем за 5 дней до первой даты.", "36 hours before the first date option, if the poll is created more than 2 and less than 5 days before the first date option." : "Опционально, за 36 часов до первой даты, если опрос создается более чем за 2 и менее чем за 5 дней до первой даты.", + "No reminder is sent" : "Напоминание не отправлено", "For text polls without expiration." : "Для текстовых опросов без срока действия.", "For polls created less than 2 days before the expiration." : "Для опросов, созданных менее чем за 2 дня до истечения срока действия.", "If a share already got a reminder (no matter, if the expiration date got changed)." : "Если те, у кого есть доступ, уже получили напоминание (неважно, изменилась ли дата истечения срока действия).", diff --git a/l10n/sw.js b/l10n/sw.js index 03cc8f1a2a..13b5b4afd6 100644 --- a/l10n/sw.js +++ b/l10n/sw.js @@ -46,6 +46,7 @@ OC.L10N.register( "Archived {relativeTime}" : "Imewekwa katika kumbukumbu {relativeTime}", "{count} participants" : "{count} participants", "Back" : "Rudi", + "Sort by title" : "Sort by title", "Direction" : "Direction", "Descending" : "Descending", "Ascending" : "Ascending", diff --git a/l10n/sw.json b/l10n/sw.json index 255c876af7..4ea0213243 100644 --- a/l10n/sw.json +++ b/l10n/sw.json @@ -44,6 +44,7 @@ "Archived {relativeTime}" : "Imewekwa katika kumbukumbu {relativeTime}", "{count} participants" : "{count} participants", "Back" : "Rudi", + "Sort by title" : "Sort by title", "Direction" : "Direction", "Descending" : "Descending", "Ascending" : "Ascending", From 82fea0d71c99404142b4308f73d7aa29747ef65d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Sep 2025 21:35:08 +0000 Subject: [PATCH 06/56] build(deps): Bump @vueuse/core from 13.8.0 to 13.9.0 Bumps [@vueuse/core](https://github.com/vueuse/vueuse/tree/HEAD/packages/core) from 13.8.0 to 13.9.0. - [Release notes](https://github.com/vueuse/vueuse/releases) - [Commits](https://github.com/vueuse/vueuse/commits/v13.9.0/packages/core) Signed-off-by: dartcafe --- updated-dependencies: - dependency-name: "@vueuse/core" dependency-version: 13.9.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 65 ++++++++++++++++++++++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7916511482..50a5617519 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@nextcloud/logger": "^3.0.2", "@nextcloud/router": "^3.0.1", "@nextcloud/vue": "^9.0.0-rc.7", - "@vueuse/core": "^13.8.0", + "@vueuse/core": "^13.9.0", "@vueuse/integrations": "^13.8.0", "axios": "^1.11.0", "core-js": "^3.45.1", @@ -3653,7 +3653,7 @@ "vue": "^3.5.0" } }, - "node_modules/@vueuse/core": { + "node_modules/@vueuse/components/node_modules/@vueuse/core": { "version": "13.8.0", "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.8.0.tgz", "integrity": "sha512-rmBcgpEpxY0ZmyQQR94q1qkUcHREiLxQwNyWrtjMDipD0WTH/JBcAt0gdcn2PsH0SA76ec291cHFngmyaBhlxA==", @@ -3669,6 +3669,41 @@ "vue": "^3.5.0" } }, + "node_modules/@vueuse/components/node_modules/@vueuse/metadata": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.8.0.tgz", + "integrity": "sha512-BYMp3Gp1kBUPv7AfQnJYP96mkX7g7cKdTIgwv/Jgd+pfQhz678naoZOAcknRtPLP4cFblDDW7rF4e3KFa+PfIA==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.9.0.tgz", + "integrity": "sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "13.9.0", + "@vueuse/shared": "13.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/core/node_modules/@vueuse/shared": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.9.0.tgz", + "integrity": "sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, "node_modules/@vueuse/integrations": { "version": "13.8.0", "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-13.8.0.tgz", @@ -3734,7 +3769,23 @@ } } }, - "node_modules/@vueuse/metadata": { + "node_modules/@vueuse/integrations/node_modules/@vueuse/core": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.8.0.tgz", + "integrity": "sha512-rmBcgpEpxY0ZmyQQR94q1qkUcHREiLxQwNyWrtjMDipD0WTH/JBcAt0gdcn2PsH0SA76ec291cHFngmyaBhlxA==", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "13.8.0", + "@vueuse/shared": "13.8.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/integrations/node_modules/@vueuse/metadata": { "version": "13.8.0", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.8.0.tgz", "integrity": "sha512-BYMp3Gp1kBUPv7AfQnJYP96mkX7g7cKdTIgwv/Jgd+pfQhz678naoZOAcknRtPLP4cFblDDW7rF4e3KFa+PfIA==", @@ -3742,6 +3793,14 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@vueuse/metadata": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.9.0.tgz", + "integrity": "sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@vueuse/shared": { "version": "13.8.0", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.8.0.tgz", diff --git a/package.json b/package.json index 1f4d1ff93d..55feae3d1e 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@nextcloud/logger": "^3.0.2", "@nextcloud/router": "^3.0.1", "@nextcloud/vue": "^9.0.0-rc.7", - "@vueuse/core": "^13.8.0", + "@vueuse/core": "^13.9.0", "@vueuse/integrations": "^13.8.0", "axios": "^1.11.0", "core-js": "^3.45.1", From dcb2a57fd2f433cb811d096c5c0b1758c9ff331b Mon Sep 17 00:00:00 2001 From: dartcafe Date: Wed, 3 Sep 2025 00:06:17 +0200 Subject: [PATCH 07/56] fix avatar dimension Signed-off-by: dartcafe --- src/assets/scss/hacks.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/scss/hacks.scss b/src/assets/scss/hacks.scss index 2c51087d6d..44ea00c62e 100644 --- a/src/assets/scss/hacks.scss +++ b/src/assets/scss/hacks.scss @@ -11,8 +11,8 @@ } // FIXME: remove this hack after the issue is fixed .avatardiv .material-design-icon { - width: var(--size); - height: var(--size); + width: var(--avatar-size); + height: var(--avatar-size); } // h2 in notecard gets a margin-top of -6px instead of 24px for better alignment From 3cb1ec8cc7467748efb1806b211c3a20c9689c12 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Wed, 3 Sep 2025 01:25:03 +0000 Subject: [PATCH 08/56] fix(l10n): Update translations from Transifex Signed-off-by: Nextcloud bot --- l10n/be.js | 2 ++ l10n/be.json | 2 ++ l10n/es.js | 5 +++++ l10n/es.json | 5 +++++ l10n/mk.js | 2 ++ l10n/mk.json | 2 ++ 6 files changed, 18 insertions(+) diff --git a/l10n/be.js b/l10n/be.js index 78fb313e4d..6eae5a346a 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -40,6 +40,7 @@ OC.L10N.register( "New group name" : "Назва новай групы", "Privacy policy" : "Палітыка прыватнасці", "Login" : "Лагін", + "Additional email disclaimer" : "Дадатковая адмова ад адказнасці па электроннай пошце", "Link copied to clipboard" : "Спасылка скапіявана ў буфер абмену", "Add a new public link" : "Дадаць новую публічную спасылку", "No activity yet" : "Пакуль няма актыўнасці", @@ -47,6 +48,7 @@ OC.L10N.register( "Public link: {token}" : "Публічная спасылка: {token}", "Public link" : "Публічная спасылка", "No answer" : "Няма адказу", + "Add links to legal terms, if they exist and add an optional disclaimer to emails." : "Дадайце спасылкі на юрыдычныя тэрміны, калі яны ёсць, і дадайце ў электронныя лісты неабавязковую адмову ад адказнасці.", "Comments" : "Каментарыі", "Details" : "Падрабязнасці", "Sharing" : "Абагульванне", diff --git a/l10n/be.json b/l10n/be.json index 4922805da4..3a2dc66155 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -38,6 +38,7 @@ "New group name" : "Назва новай групы", "Privacy policy" : "Палітыка прыватнасці", "Login" : "Лагін", + "Additional email disclaimer" : "Дадатковая адмова ад адказнасці па электроннай пошце", "Link copied to clipboard" : "Спасылка скапіявана ў буфер абмену", "Add a new public link" : "Дадаць новую публічную спасылку", "No activity yet" : "Пакуль няма актыўнасці", @@ -45,6 +46,7 @@ "Public link: {token}" : "Публічная спасылка: {token}", "Public link" : "Публічная спасылка", "No answer" : "Няма адказу", + "Add links to legal terms, if they exist and add an optional disclaimer to emails." : "Дадайце спасылкі на юрыдычныя тэрміны, калі яны ёсць, і дадайце ў электронныя лісты неабавязковую адмову ад адказнасці.", "Comments" : "Каментарыі", "Details" : "Падрабязнасці", "Sharing" : "Абагульванне", diff --git a/l10n/es.js b/l10n/es.js index 4a8c242462..c8492550fa 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -303,10 +303,13 @@ OC.L10N.register( "Delete comment" : "Borrar comentario", "deleted" : "borrado", "The automatic reminder is sent to all shares via email:" : "El recordatorio automático se envía a todos los recursos compartidos por correo:", + "For polls with expiration" : "Para encuestas con caducidad", "48 hours before the expiration date, if the poll is created more than 5 days before the expiration." : "48 horas antes de la fecha de caducidad, si la encuesta ha sido creada a más de 5 días antes de la fecha de caducidad.", "36 hours before the expiration date, if the poll is created more than 2 and less than 5 days before the expiration." : "36 horas antes de la fecha de caducidad, si la encuesta es creada más de 2 y menos de 5 días antes de la caducidad.", + "For date polls without expiration" : "Para encuestas de fecha sin caducidad", "48 hours before the first date option, if the poll is created more than 5 days before the first date option." : "48 horas antes de la primera opción de fecha, si la encuesta es creada más de 5 días antes de la primera opción de fecha.", "36 hours before the first date option, if the poll is created more than 2 and less than 5 days before the first date option." : "36 horas antes de la primera opción de fecha, si la encuesta es creada más de 2 y menos de 5 días antes de la primera opción de fecha.", + "No reminder is sent" : "No se envía ningún recordatorio", "For text polls without expiration." : "Para encuestas de texto sin caducidad.", "For polls created less than 2 days before the expiration." : "Para encuestas creadas menos de 2 días antes de caducar.", "If a share already got a reminder (no matter, if the expiration date got changed)." : "Si un recurso compartido ya tiene un recordatorio (independientemente de si ha cambiado o no la caducidad).", @@ -605,8 +608,10 @@ OC.L10N.register( "No comments" : "Sin comentarios", "Be the first." : "Sé el primero.", "Configuration" : "Configuración", + "Comments are disabled, except for owner and delegated poll administration." : "Los comentarios están deshabilitados, excepto los del propietario y la administración delegada para la encuesta.", "You have been granted administrative rights." : "Se le han concedido derechos administrativos.", "Changes may affect existing votes." : "Los cambios podrían afectar los votos existentes.", + "Poll configuration" : "Configuración de la encuesta", "Poll closing status" : "Estado de cierre de la encuesta", "Result display" : "Muestra de resultados", "Deletion and owner" : "Eliminación y propietario", diff --git a/l10n/es.json b/l10n/es.json index cbd70ca1a8..052c125271 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -301,10 +301,13 @@ "Delete comment" : "Borrar comentario", "deleted" : "borrado", "The automatic reminder is sent to all shares via email:" : "El recordatorio automático se envía a todos los recursos compartidos por correo:", + "For polls with expiration" : "Para encuestas con caducidad", "48 hours before the expiration date, if the poll is created more than 5 days before the expiration." : "48 horas antes de la fecha de caducidad, si la encuesta ha sido creada a más de 5 días antes de la fecha de caducidad.", "36 hours before the expiration date, if the poll is created more than 2 and less than 5 days before the expiration." : "36 horas antes de la fecha de caducidad, si la encuesta es creada más de 2 y menos de 5 días antes de la caducidad.", + "For date polls without expiration" : "Para encuestas de fecha sin caducidad", "48 hours before the first date option, if the poll is created more than 5 days before the first date option." : "48 horas antes de la primera opción de fecha, si la encuesta es creada más de 5 días antes de la primera opción de fecha.", "36 hours before the first date option, if the poll is created more than 2 and less than 5 days before the first date option." : "36 horas antes de la primera opción de fecha, si la encuesta es creada más de 2 y menos de 5 días antes de la primera opción de fecha.", + "No reminder is sent" : "No se envía ningún recordatorio", "For text polls without expiration." : "Para encuestas de texto sin caducidad.", "For polls created less than 2 days before the expiration." : "Para encuestas creadas menos de 2 días antes de caducar.", "If a share already got a reminder (no matter, if the expiration date got changed)." : "Si un recurso compartido ya tiene un recordatorio (independientemente de si ha cambiado o no la caducidad).", @@ -603,8 +606,10 @@ "No comments" : "Sin comentarios", "Be the first." : "Sé el primero.", "Configuration" : "Configuración", + "Comments are disabled, except for owner and delegated poll administration." : "Los comentarios están deshabilitados, excepto los del propietario y la administración delegada para la encuesta.", "You have been granted administrative rights." : "Se le han concedido derechos administrativos.", "Changes may affect existing votes." : "Los cambios podrían afectar los votos existentes.", + "Poll configuration" : "Configuración de la encuesta", "Poll closing status" : "Estado de cierre de la encuesta", "Result display" : "Muestra de resultados", "Deletion and owner" : "Eliminación y propietario", diff --git a/l10n/mk.js b/l10n/mk.js index 7179fb1ca0..25cc215e50 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -48,6 +48,8 @@ OC.L10N.register( "Description" : "Опис", "Expiration" : "Истекување", "Back" : "Назад", + "Descending" : "Опаѓачки", + "Ascending" : "Растечки", "Privacy policy" : "Политика за приватност", "Login" : "Најава", "Share label" : "Ознака на споделувањето", diff --git a/l10n/mk.json b/l10n/mk.json index 319d562291..8c5b3d207d 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -46,6 +46,8 @@ "Description" : "Опис", "Expiration" : "Истекување", "Back" : "Назад", + "Descending" : "Опаѓачки", + "Ascending" : "Растечки", "Privacy policy" : "Политика за приватност", "Login" : "Најава", "Share label" : "Ознака на споделувањето", From 7a5c44fc1d5effad367eb104d2717f99d6614c87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Sep 2025 09:25:43 +0000 Subject: [PATCH 09/56] build(deps): Bump @nextcloud/vue from 9.0.0-rc.7 to 9.0.0-rc.8 Bumps [@nextcloud/vue](https://github.com/nextcloud-libraries/nextcloud-vue) from 9.0.0-rc.7 to 9.0.0-rc.8. - [Release notes](https://github.com/nextcloud-libraries/nextcloud-vue/releases) - [Changelog](https://github.com/nextcloud-libraries/nextcloud-vue/blob/main/CHANGELOG.md) - [Commits](https://github.com/nextcloud-libraries/nextcloud-vue/compare/v9.0.0-rc.7...v9.0.0-rc.8) Signed-off-by: dartcafe --- updated-dependencies: - dependency-name: "@nextcloud/vue" dependency-version: 9.0.0-rc.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 33 +++++++++++---------------------- package.json | 2 +- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50a5617519..ab3fc3b870 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@nextcloud/l10n": "^3.3.0", "@nextcloud/logger": "^3.0.2", "@nextcloud/router": "^3.0.1", - "@nextcloud/vue": "^9.0.0-rc.7", + "@nextcloud/vue": "^9.0.0-rc.8", "@vueuse/core": "^13.9.0", "@vueuse/integrations": "^13.8.0", "axios": "^1.11.0", @@ -283,13 +283,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", "engines": { "node": ">=6.9.0" } @@ -1793,9 +1789,9 @@ } }, "node_modules/@nextcloud/vue": { - "version": "9.0.0-rc.7", - "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-9.0.0-rc.7.tgz", - "integrity": "sha512-wfeJvrm1qmLhxlwL+3MyJfvztBze/AaB3LMiziih/DKtEpBdUrL39M+9cAR2sz/GoOYwG76zAa4M7z0PQsQ8/A==", + "version": "9.0.0-rc.8", + "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-9.0.0-rc.8.tgz", + "integrity": "sha512-fUMbQZjZ985Hm+8zaxPErp1DwlNqVELzj5MK+Z+qR5iDisILY6PKGguKGvLI8wNwQrIIgJtK9vK9AZcALowiOg==", "dependencies": { "@ckpack/vue-color": "^1.6.0", "@floating-ui/dom": "^1.7.4", @@ -1817,7 +1813,7 @@ "clone": "^2.1.2", "debounce": "^2.2.0", "dompurify": "^3.2.6", - "emoji-mart-vue-fast": "^15.0.4", + "emoji-mart-vue-fast": "^15.0.5", "escape-html": "^1.0.3", "floating-vue": "^5.2.2", "focus-trap": "^7.6.5", @@ -5565,10 +5561,9 @@ "license": "MIT" }, "node_modules/emoji-mart-vue-fast": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/emoji-mart-vue-fast/-/emoji-mart-vue-fast-15.0.4.tgz", - "integrity": "sha512-OjuxqoMJRTTG7Vevz0mR1ZnqY1DI8gGnmoskuuC8qL8VwwTjrGdwAO4WRWtAUN8P6Di7kxvY6cUgNETNFmbP4A==", - "license": "BSD-3-Clause", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/emoji-mart-vue-fast/-/emoji-mart-vue-fast-15.0.5.tgz", + "integrity": "sha512-wnxLor8ggpqshoOPwIc33MdOC3A1XFeDLgUwYLPtNPL8VeAtXJAVrnFq1CN5PeCYAFoLo4IufHQZ9CfHD4IZiw==", "dependencies": { "@babel/runtime": "^7.18.6", "core-js": "^3.23.5" @@ -10816,12 +10811,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", diff --git a/package.json b/package.json index 55feae3d1e..fbc74583d9 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@nextcloud/l10n": "^3.3.0", "@nextcloud/logger": "^3.0.2", "@nextcloud/router": "^3.0.1", - "@nextcloud/vue": "^9.0.0-rc.7", + "@nextcloud/vue": "^9.0.0-rc.8", "@vueuse/core": "^13.9.0", "@vueuse/integrations": "^13.8.0", "axios": "^1.11.0", From d99a36e584b157710c15f2d5995152a47e1947f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Sep 2025 16:41:11 +0000 Subject: [PATCH 10/56] build(deps): Bump @vueuse/integrations from 13.8.0 to 13.9.0 Bumps [@vueuse/integrations](https://github.com/vueuse/vueuse/tree/HEAD/packages/integrations) from 13.8.0 to 13.9.0. - [Release notes](https://github.com/vueuse/vueuse/releases) - [Commits](https://github.com/vueuse/vueuse/commits/v13.9.0/packages/integrations) Signed-off-by: dartcafe --- updated-dependencies: - dependency-name: "@vueuse/integrations" dependency-version: 13.9.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 33 ++++++++++----------------------- package.json | 2 +- 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab3fc3b870..c283e93a41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@nextcloud/router": "^3.0.1", "@nextcloud/vue": "^9.0.0-rc.8", "@vueuse/core": "^13.9.0", - "@vueuse/integrations": "^13.8.0", + "@vueuse/integrations": "^13.9.0", "axios": "^1.11.0", "core-js": "^3.45.1", "dompurify": "^3.2.6", @@ -3701,12 +3701,12 @@ } }, "node_modules/@vueuse/integrations": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-13.8.0.tgz", - "integrity": "sha512-64mD5Q7heVkr8JsqBFDh9xnQJrPLmWJghy8Qtj9UeLosQL9n+JYTcS7d+eNsEVwuvZvxfF7hUSi87jABm/eYpw==", + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-13.9.0.tgz", + "integrity": "sha512-SDobKBbPIOe0cVL7QxMzGkuUGHvWTdihi9zOrrWaWUgFKe15cwEcwfWmgrcNzjT6kHnNmWuTajPHoIzUjYNYYQ==", "dependencies": { - "@vueuse/core": "13.8.0", - "@vueuse/shared": "13.8.0" + "@vueuse/core": "13.9.0", + "@vueuse/shared": "13.9.0" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -3765,15 +3765,10 @@ } } }, - "node_modules/@vueuse/integrations/node_modules/@vueuse/core": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.8.0.tgz", - "integrity": "sha512-rmBcgpEpxY0ZmyQQR94q1qkUcHREiLxQwNyWrtjMDipD0WTH/JBcAt0gdcn2PsH0SA76ec291cHFngmyaBhlxA==", - "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "13.8.0", - "@vueuse/shared": "13.8.0" - }, + "node_modules/@vueuse/integrations/node_modules/@vueuse/shared": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.9.0.tgz", + "integrity": "sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==", "funding": { "url": "https://github.com/sponsors/antfu" }, @@ -3781,14 +3776,6 @@ "vue": "^3.5.0" } }, - "node_modules/@vueuse/integrations/node_modules/@vueuse/metadata": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.8.0.tgz", - "integrity": "sha512-BYMp3Gp1kBUPv7AfQnJYP96mkX7g7cKdTIgwv/Jgd+pfQhz678naoZOAcknRtPLP4cFblDDW7rF4e3KFa+PfIA==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/@vueuse/metadata": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.9.0.tgz", diff --git a/package.json b/package.json index fbc74583d9..a47f32928e 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@nextcloud/router": "^3.0.1", "@nextcloud/vue": "^9.0.0-rc.8", "@vueuse/core": "^13.9.0", - "@vueuse/integrations": "^13.8.0", + "@vueuse/integrations": "^13.9.0", "axios": "^1.11.0", "core-js": "^3.45.1", "dompurify": "^3.2.6", From daf7ff20e431cb0e5e97c6f7f9ef89c094164791 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Sep 2025 16:58:56 +0000 Subject: [PATCH 11/56] build(deps-dev): Bump vite from 6.3.5 to 7.1.4 Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.5 to 7.1.4. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.1.4/packages/vite) Signed-off-by: dartcafe --- updated-dependencies: - dependency-name: vite dependency-version: 7.1.4 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 268 ++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 130 insertions(+), 140 deletions(-) diff --git a/package-lock.json b/package-lock.json index c283e93a41..bfde143f9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "eslint-config-prettier": "^10.1.5", "eslint-plugin-prettier": "^5.5.4", "prettier": "^3.6.1", - "vite": "^6.3.5", + "vite": "^7.1.4", "vite-plugin-node-polyfills": "^0.24.0", "xml2js": "^0.6.2" }, @@ -2301,260 +2301,252 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", - "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz", + "integrity": "sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==", "cpu": [ "arm" ], - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", - "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz", + "integrity": "sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", - "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz", + "integrity": "sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", - "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz", + "integrity": "sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", - "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz", + "integrity": "sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", - "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz", + "integrity": "sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", - "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz", + "integrity": "sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==", "cpu": [ "arm" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", - "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz", + "integrity": "sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==", "cpu": [ "arm" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", - "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz", + "integrity": "sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", - "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz", + "integrity": "sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", - "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz", + "integrity": "sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==", "cpu": [ "loong64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", - "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz", + "integrity": "sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==", "cpu": [ "ppc64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", - "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz", + "integrity": "sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==", "cpu": [ "riscv64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", - "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz", + "integrity": "sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==", "cpu": [ "riscv64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", - "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz", + "integrity": "sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==", "cpu": [ "s390x" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", - "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz", + "integrity": "sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", - "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz", + "integrity": "sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz", + "integrity": "sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", - "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz", + "integrity": "sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", - "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz", + "integrity": "sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==", "cpu": [ "ia32" ], - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", - "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz", + "integrity": "sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -2777,10 +2769,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "license": "MIT" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", @@ -6806,10 +6797,12 @@ } }, "node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -10280,10 +10273,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "license": "MIT", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "engines": { "node": ">=12" }, @@ -11070,12 +11062,11 @@ } }, "node_modules/rollup": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", - "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", - "license": "MIT", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.0.tgz", + "integrity": "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==", "dependencies": { - "@types/estree": "1.0.7" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -11085,26 +11076,27 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.39.0", - "@rollup/rollup-android-arm64": "4.39.0", - "@rollup/rollup-darwin-arm64": "4.39.0", - "@rollup/rollup-darwin-x64": "4.39.0", - "@rollup/rollup-freebsd-arm64": "4.39.0", - "@rollup/rollup-freebsd-x64": "4.39.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", - "@rollup/rollup-linux-arm-musleabihf": "4.39.0", - "@rollup/rollup-linux-arm64-gnu": "4.39.0", - "@rollup/rollup-linux-arm64-musl": "4.39.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", - "@rollup/rollup-linux-riscv64-gnu": "4.39.0", - "@rollup/rollup-linux-riscv64-musl": "4.39.0", - "@rollup/rollup-linux-s390x-gnu": "4.39.0", - "@rollup/rollup-linux-x64-gnu": "4.39.0", - "@rollup/rollup-linux-x64-musl": "4.39.0", - "@rollup/rollup-win32-arm64-msvc": "4.39.0", - "@rollup/rollup-win32-ia32-msvc": "4.39.0", - "@rollup/rollup-win32-x64-msvc": "4.39.0", + "@rollup/rollup-android-arm-eabi": "4.50.0", + "@rollup/rollup-android-arm64": "4.50.0", + "@rollup/rollup-darwin-arm64": "4.50.0", + "@rollup/rollup-darwin-x64": "4.50.0", + "@rollup/rollup-freebsd-arm64": "4.50.0", + "@rollup/rollup-freebsd-x64": "4.50.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.0", + "@rollup/rollup-linux-arm-musleabihf": "4.50.0", + "@rollup/rollup-linux-arm64-gnu": "4.50.0", + "@rollup/rollup-linux-arm64-musl": "4.50.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.0", + "@rollup/rollup-linux-ppc64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-musl": "4.50.0", + "@rollup/rollup-linux-s390x-gnu": "4.50.0", + "@rollup/rollup-linux-x64-gnu": "4.50.0", + "@rollup/rollup-linux-x64-musl": "4.50.0", + "@rollup/rollup-openharmony-arm64": "4.50.0", + "@rollup/rollup-win32-arm64-msvc": "4.50.0", + "@rollup/rollup-win32-ia32-msvc": "4.50.0", + "@rollup/rollup-win32-x64-msvc": "4.50.0", "fsevents": "~2.3.2" } }, @@ -12515,10 +12507,9 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "license": "MIT", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" @@ -13083,23 +13074,22 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", - "license": "MIT", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz", + "integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.14" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -13108,14 +13098,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", - "less": "*", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" diff --git a/package.json b/package.json index a47f32928e..8d5861ec93 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "eslint-config-prettier": "^10.1.5", "eslint-plugin-prettier": "^5.5.4", "prettier": "^3.6.1", - "vite": "^6.3.5", + "vite": "^7.1.4", "vite-plugin-node-polyfills": "^0.24.0", "xml2js": "^0.6.2" }, From a48006870f131e887b7aadd0041b5c9b753729e8 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Thu, 4 Sep 2025 01:26:05 +0000 Subject: [PATCH 12/56] fix(l10n): Update translations from Transifex Signed-off-by: Nextcloud bot --- l10n/be.js | 2 ++ l10n/be.json | 2 ++ l10n/cs.js | 3 +++ l10n/cs.json | 3 +++ l10n/fr.js | 29 +++++++++++++++++++++++++++++ l10n/fr.json | 29 +++++++++++++++++++++++++++++ l10n/mk.js | 1 + l10n/mk.json | 1 + l10n/sr.js | 2 +- l10n/sr.json | 2 +- l10n/zh_CN.js | 1 + l10n/zh_CN.json | 1 + 12 files changed, 74 insertions(+), 2 deletions(-) diff --git a/l10n/be.js b/l10n/be.js index 6eae5a346a..e0287597a0 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -31,9 +31,11 @@ OC.L10N.register( "Preview" : "Перадпрагляд", "Submit" : "Адправіць", "{optionText} already exists" : "{optionText} ужо існуе", + "Archived" : "Архіваванае", "never" : "ніколі", "Name" : "Назва", "Description" : "Апісанне", + "Archived {relativeTime}" : "Архівавана {relativeTime}", "Back" : "Назад", "Transfer poll ownership" : "Перадаць права ўласнасці на апытанне", "Create new group" : "Стварыць новую групу", diff --git a/l10n/be.json b/l10n/be.json index 3a2dc66155..2eaf8a4aba 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -29,9 +29,11 @@ "Preview" : "Перадпрагляд", "Submit" : "Адправіць", "{optionText} already exists" : "{optionText} ужо існуе", + "Archived" : "Архіваванае", "never" : "ніколі", "Name" : "Назва", "Description" : "Апісанне", + "Archived {relativeTime}" : "Архівавана {relativeTime}", "Back" : "Назад", "Transfer poll ownership" : "Перадаць права ўласнасці на апытанне", "Create new group" : "Стварыць новую групу", diff --git a/l10n/cs.js b/l10n/cs.js index d2ed85ed12..02f9b814cb 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -303,10 +303,12 @@ OC.L10N.register( "Delete comment" : "Smazat komentář", "deleted" : "smazáno", "The automatic reminder is sent to all shares via email:" : "Automatická připomínka je odeslána všem sdílením prostřednictvím e-mailu:", + "For polls with expiration" : "Pro ankety s omezenou platností", "48 hours before the expiration date, if the poll is created more than 5 days before the expiration." : "48 hodin před datem skončení platnosti, pokud je anketa vytvořena před více 5 dny před skončením platnosti.", "36 hours before the expiration date, if the poll is created more than 2 and less than 5 days before the expiration." : "36 hodin před datem skončení platnosti, pokud je anketa vytvořena před více než 2 a méně než 5 dny před skončením platnosti.", "48 hours before the first date option, if the poll is created more than 5 days before the first date option." : "48 hodin před první volbou data, pokud je anketa vytvořena před více 5 dny před první volbou data.", "36 hours before the first date option, if the poll is created more than 2 and less than 5 days before the first date option." : "36 hodin před první volbou data, pokud je anketa vytvořena před více než 2 a méně než 5 dny před první volbou data.", + "No reminder is sent" : "Není nastavená žádná připomínka", "For text polls without expiration." : "Pro textové ankety bez omezení doby platnosti.", "For polls created less than 2 days before the expiration." : "Pro ankety vytvořené méně než 2 dny před skončením platnosti.", "If a share already got a reminder (no matter, if the expiration date got changed)." : "Pokud sdílení už obdrželo připomínku (lhostejno, zda datum skončení platnosti bylo změněno).", @@ -607,6 +609,7 @@ OC.L10N.register( "Configuration" : "Nastavení", "You have been granted administrative rights." : "Byla vám udělena oprávnění pro správu.", "Changes may affect existing votes." : "Změny mohou postihnout už existující hlasy.", + "Poll configuration" : "Nastavení ankety", "Poll closing status" : "Stav uzavření ankety", "Result display" : "Zobrazení výsledku", "Deletion and owner" : "Mazání a vlastník", diff --git a/l10n/cs.json b/l10n/cs.json index 9d26e887a5..8d5731b3bd 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -301,10 +301,12 @@ "Delete comment" : "Smazat komentář", "deleted" : "smazáno", "The automatic reminder is sent to all shares via email:" : "Automatická připomínka je odeslána všem sdílením prostřednictvím e-mailu:", + "For polls with expiration" : "Pro ankety s omezenou platností", "48 hours before the expiration date, if the poll is created more than 5 days before the expiration." : "48 hodin před datem skončení platnosti, pokud je anketa vytvořena před více 5 dny před skončením platnosti.", "36 hours before the expiration date, if the poll is created more than 2 and less than 5 days before the expiration." : "36 hodin před datem skončení platnosti, pokud je anketa vytvořena před více než 2 a méně než 5 dny před skončením platnosti.", "48 hours before the first date option, if the poll is created more than 5 days before the first date option." : "48 hodin před první volbou data, pokud je anketa vytvořena před více 5 dny před první volbou data.", "36 hours before the first date option, if the poll is created more than 2 and less than 5 days before the first date option." : "36 hodin před první volbou data, pokud je anketa vytvořena před více než 2 a méně než 5 dny před první volbou data.", + "No reminder is sent" : "Není nastavená žádná připomínka", "For text polls without expiration." : "Pro textové ankety bez omezení doby platnosti.", "For polls created less than 2 days before the expiration." : "Pro ankety vytvořené méně než 2 dny před skončením platnosti.", "If a share already got a reminder (no matter, if the expiration date got changed)." : "Pokud sdílení už obdrželo připomínku (lhostejno, zda datum skončení platnosti bylo změněno).", @@ -605,6 +607,7 @@ "Configuration" : "Nastavení", "You have been granted administrative rights." : "Byla vám udělena oprávnění pro správu.", "Changes may affect existing votes." : "Změny mohou postihnout už existující hlasy.", + "Poll configuration" : "Nastavení ankety", "Poll closing status" : "Stav uzavření ankety", "Result display" : "Zobrazení výsledku", "Deletion and owner" : "Mazání a vlastník", diff --git a/l10n/fr.js b/l10n/fr.js index 70f559690e..2e854b2ed6 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -58,6 +58,7 @@ OC.L10N.register( "{actor} deleted your poll \"%s\"." : "{actor} a supprimé votre sondage \"%s\".", "%s archived your poll" : "%s a archivé votre sondage", "{actor} archived your poll \"%s\"." : "{actor} a archivé votre sondage \"%s\".", + "Poll: %s" : "Sondages : %s", "404 - Poll not found" : "404 - Sondage non trouvé", "This poll does not exist (anymore)." : "Ce sondage n'existe pas (ou plus).", "No one." : "Personne.", @@ -144,6 +145,8 @@ OC.L10N.register( "You have changed the share label" : "Vous avez changé le libellé du partage", "You have changed the share type" : "Vous avez changé le type de partage", "{actor} has changed the share type" : "{actor} a changé le type de partage", + "You have changed the registration constraints for the public share labeled {sharee}" : "Vous avez changé les conditions d'inscription pour le partage public nommé {sharee}", + "{actor} has changed the registration constraints for the public share labeled {sharee}" : "{actor} a changé les contraintes d'enregistrement pour le partage public nommé {sharee}", "You have registered to poll {pollTitle}" : "Vous vous êtes enregistré•e pour le sondage {pollTitle}", "{sharee} registered to poll {pollTitle}" : "{sharee} s'est enregistré•e pour le sondage {pollTitle}", "You have registered" : "Vous vous êtes inscrit", @@ -152,6 +155,10 @@ OC.L10N.register( "{actor} has voted in poll {pollTitle}" : "{actor} a participé au sondage {pollTitle}", "You have voted" : "Vous avez voté", "{actor} has voted" : "{actor} a voté", + "One or more orphaned votes heve been deleted from {pollTitle}" : "Un ou plusieurs votes orphelins ont été supprimés de {pollTitle}", + "{actor} has deleted your orphaned polls from poll {pollTitle}" : "{actor} a supprimé vos sondages orphelins du sondage {pollTitle}", + "Orphaned votes deleted" : "Votes orphelins supprimés", + "{actor} deleted orphaned votes" : "{actor} Votes orphelins supprimés", "You have locked the share of {sharee}" : "Vous avez verrouillé le partage de {sharee}", "{actor} has locked the share of {sharee}" : "{actor} a verrouillé le partage de {sharee}", "You have unlocked the share of {sharee}" : "Vous avez débloqué le partage de {sharee}", @@ -247,6 +254,7 @@ OC.L10N.register( "No valid email address" : "Pas d'adresse e-mail valide", "Unknown error" : "Erreur inconnue", "Reveal them" : "Révélez-les", + "Toggle sidebar" : "Afficher la barre latérale", "Maybe" : "Peut-être", "Loading …" : "Chargement…", "Click" : "Cliquer", @@ -255,6 +263,7 @@ OC.L10N.register( "minus" : "moins", "plus" : "plus", "Please wait…" : "Merci de patienter...", + "Possibly affected calendar events" : "Événements du calendrier potentiellement concernés", "Add" : "Ajouter", "You are asked to propose more options." : "On vous demande de proposer plus d'options.", "The proposal period ends {timeRelative}." : "La période de proposition se termine {timeRelative}.", @@ -294,10 +303,13 @@ OC.L10N.register( "Delete comment" : "Supprimer le commentaire", "deleted" : "effacé", "The automatic reminder is sent to all shares via email:" : "Le rappel automatique est envoyé à tous les partages par e-mail :", + "For polls with expiration" : "Pour les sondages avec expiration", "48 hours before the expiration date, if the poll is created more than 5 days before the expiration." : "48 heures avant la date d’expiration, si le sondage est créé plus de 5 jours avant l’expiration.", "36 hours before the expiration date, if the poll is created more than 2 and less than 5 days before the expiration." : "36 heures avant la date d’expiration, si le sondage est créé plus de 2 jours et moins de 5 jours avant l’expiration.", + "For date polls without expiration" : "Pour les sondages de date sans expiration", "48 hours before the first date option, if the poll is created more than 5 days before the first date option." : "48 heures avant la première date proposée, si le sondage a été créé au moins 5 jours avant la première date proposée.", "36 hours before the first date option, if the poll is created more than 2 and less than 5 days before the first date option." : "36 heures avant la première date proposée, si le sondage a été créé entre 2 et 5 jours avant la première date proposée.", + "No reminder is sent" : "Aucun rappel n’est envoyé", "For text polls without expiration." : "Pour les sondages texte sans expiration.", "For polls created less than 2 days before the expiration." : "Pour les sondages créés moins de 2 jours avant l’expiration.", "If a share already got a reminder (no matter, if the expiration date got changed)." : "Si un partage a déjà fait l'objet d'un rappel (même si la date d'expiration a été modifiée)", @@ -310,6 +322,7 @@ OC.L10N.register( "Ok" : "Ok", "Anonymous poll" : "Sondage anonyme", "Use Autoreminder" : "Utiliser le rappel automatique", + "Autoreminder information" : "Information sur le rappel automatique", "Reopen poll" : "Ré-ouvrir le sondage", "Close poll" : "Terminer le sondage", "Poll closing date" : "Date de fermeture du sondage", @@ -322,6 +335,7 @@ OC.L10N.register( "Force confidential comments (only visible to you and the author)" : "Forcer la confidentialité des commentaires (seulement visibles par l'auteur et vous)", "Force confidential comments (only visible to {displayName} and the author)" : "Forcer la confidentialité des commentaires (seulement visibles par l'auteur et {displayName})", "Limit \"Yes\" votes per option" : "Limiter les votes \"Oui\" par option", + "Hide unavailable options" : "Cacher les choix indisponibles", "Allow proposals" : "Permettre les propositions", "Proposal closing date" : "Date limite pour les propositions", "Always show results" : "Toujours afficher les résultats", @@ -332,6 +346,7 @@ OC.L10N.register( "Poll \"{pollTitle}\" added" : "Sondage « {pollTitle} » ajouté", "Error while creating Poll \"{pollTitle}\"" : "Erreur à la création du sondage \"{pollTitle}\"", "Title" : "Titre", + "Enter title" : "Entrez un titre", "Poll type" : "Type de sondage", "\"{pollTitle}\" has been added" : "\"{pollTitle}\" a été ajouté", "Choose a meaningful title for your poll" : "Choisissez un titre qui a du sens pour votre sondage", @@ -383,6 +398,7 @@ OC.L10N.register( "Duration" : "Durée", "Duration time unit" : "Unité de durée", "Repetitions" : "Répétitions", + "Automatically vote \"Yes\" for new option." : "Voter \"oui\" automatiquement pour les nouvelles options", "Preview" : "Prévisualiser", "Added" : "Ajouté", "Shifting dates is disabled to prevent shifting of proposals of other participants." : "Le décalage des dates est désactivé pour éviter de décaler les propositions des autres participants.", @@ -396,6 +412,7 @@ OC.L10N.register( "Error adding options" : "Erreur à l'ajout d'options", "Create multiple options at once" : "Créer plusieurs options à la fois", "Each line creates a new option. Duplicates will get skipped without warning." : "Chaque ligne crée une nouvelle option. Les doublons seront ignorés sans avertissement.", + "Poll information" : "Information sur le sondage", "Archived" : "Archivé", "Unpublished" : "Non publié", "A private poll from {name}" : "Un sondage privé de {name}", @@ -526,6 +543,7 @@ OC.L10N.register( "Show email addresses of internal accounts" : "Afficher les adresses e-mail des comptes internes", "Show only to members of the following groups" : "N’afficher qu’aux membres des groupes suivants", "Leave empty to disable globally." : "Laisser vide pour désactiver globalement.", + "Enable unrestricted owners globally" : "Activer les propriétaires sans restriction globalement", "Effects on restricted owners:" : "Effets sur les propriétaires restreints :", "Anonymizing a poll of a restricted owner means that this poll is anonymous for everyone, including the owner." : "Anonymiser le sondage d'un propriétaire restreint signifie que ce sondage est anonyme pour tout le monde, y compris le propriétaire.", "Deleting and changing votes of participants is not possible" : "Supprimer ou changer les votes des participants est impossible", @@ -537,6 +555,7 @@ OC.L10N.register( "Check this, if you prefer to display text poll in a vertical aligned list rather than in the grid view. The initial default is list view." : "Cochez cette option si vous préférez afficher le sondage de texte dans une liste alignée verticalement plutôt que dans la vue en grille. La valeur par défaut initiale est la vue de liste.", "Date polls default to list view" : "Les sondages de dates sont affichés par défaut en vue liste", "Check this, if you prefer to display date poll in a vertical view rather than in the grid view. The initial default is grid view." : "Cochez cette option si vous préférez afficher le sondage pour des dates dans une vue verticale plutôt que dans la vue en grille. La valeur par défaut initiale est la vue en grille.", + "Verbose poll list" : "Liste détaillée des sondages", "Check this for more poll information in the overview." : "Cocher ici pour plus d'information sur les sondages dans la page de présentation", "Enter the amount of days, polls without activity stay in the relevant list:" : "Saisissez le nombre de jours pendant lesquels les sondages sans activité restent dans la liste « Me concernant » :", "The style settings are still experimental!" : "Le paramétrage des styles est encore expérimental !", @@ -560,6 +579,8 @@ OC.L10N.register( "Resolving of {name} is not possible. The contacts app is not enabled." : "La résolution de {name} n’est pas possible. L’application contacts n’est pas activée.", "Resolving of {name} is not possible. The circles app is not enabled." : "La résolution de {name} n’est pas possible. L’application circles n’est pas activée.", "Error resolving {name}." : "Erreur à la résolution de {name}.", + "Grant administrative poll access" : "Accorder l'accès administratif au sondage", + "Withdraw administrative poll access" : "Retirer l'accès administratif au sondage", "Copy link to clipboard" : "Copier le lien dans le presse-papier", "Link copied to clipboard" : "Lien copié dans le presse-papier", "Error while copying link to clipboard" : "Erreur lors de la copie du lien dans le presse-papier", @@ -587,13 +608,17 @@ OC.L10N.register( "No comments" : "Aucun commentaire", "Be the first." : "Soyez le premier.", "Configuration" : "Configuration", + "Comments are disabled, except for owner and delegated poll administration." : "Les commentaires sont désactivés, sauf pour le propriétaire et l'administrateur délégué du sondage.", "You have been granted administrative rights." : "Vous avez obtenu les droits d'administration.", "Changes may affect existing votes." : "Les changements peuvent affecter les votes existants.", + "Poll configuration" : "Configuration du sondage", "Poll closing status" : "État de clôture du sondage", "Result display" : "Affichage des résultats", + "Deletion and owner" : "Suppression et Propriétaire", "As an admin you may edit this poll" : "En tant qu'administrateur, vous pouvez modifier le sondage", "Allow proposals from participants" : "Accepter les propositions des participants", "Shift all date options" : "Décaler toutes les dates", + "Available options" : "Options disponibles", "Add a date" : "Ajouter une date", "Shares for a poll group grant voting access to the polls contained in the poll group." : "Les partages pour un groupe du sondage octroient l'accès aux votes pour les sondages contenus dans ce groupe de sondage.", "Receive notification email on activity to {emailAddress}" : "Recevoir un mail de notification d'activité à {emailAddress}", @@ -621,6 +646,7 @@ OC.L10N.register( "Mail could not be resent to {emailAddress}" : "Impossible de renvoyer l'invitation à {emailAddress}", "Your votes are reset" : "Vos votes ont été annulés", "Error while resetting votes" : "Erreur lors de la remise à zéro du vote", + "Edit email address" : "Modifier l'adresse e-mail", "Switch to table view" : "Basculer en vue tableau", "Switch to list view" : "Passer à la vue en liste", "Switch to date order" : "Trier par date", @@ -629,14 +655,17 @@ OC.L10N.register( "Copy your personal link to clipboard" : "Copier le lien personnel dans le presse-papier", "Get your personal link per mail" : "Recevez votre lien personnel par e-mail", "Subscribe to notifications" : "S'abonner aux notifications", + "Remove email address" : "Supprimer l'adresse e-mail", "Copy list of email addresses to clipboard" : "Copier la liste des adresses e-mail vers le presse-papiers", "Reset your votes" : "Annuler mes votes", "Logout as {name} (delete cookie)" : "Déconnexion de {name} (suppression du cookie)", "Type to start searching …" : "Commencer à taper pour rechercher...", "Select users" : "Sélectionnez des utilisateurs", + "No answer" : "Pas de transfert", "Vote saved" : "Vote enregistré", "Vote already booked out" : "Vote déjà enregistré", "Error saving vote" : "Erreur à l’enregistrement du vote", + "Click to vote with {nextAnswer} for option {option}" : "Cliquez pour voter avec {nextAnswer}pour l'option {option}", "Participant {userId} has been removed" : "Le participant {userId} a été supprimé", "Remove votes of {displayName}" : "Supprimer les votes de {displayName}", "Click to sort by name" : "Cliquez pour trier par nom", diff --git a/l10n/fr.json b/l10n/fr.json index a8d5dd091b..8525105b4d 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -56,6 +56,7 @@ "{actor} deleted your poll \"%s\"." : "{actor} a supprimé votre sondage \"%s\".", "%s archived your poll" : "%s a archivé votre sondage", "{actor} archived your poll \"%s\"." : "{actor} a archivé votre sondage \"%s\".", + "Poll: %s" : "Sondages : %s", "404 - Poll not found" : "404 - Sondage non trouvé", "This poll does not exist (anymore)." : "Ce sondage n'existe pas (ou plus).", "No one." : "Personne.", @@ -142,6 +143,8 @@ "You have changed the share label" : "Vous avez changé le libellé du partage", "You have changed the share type" : "Vous avez changé le type de partage", "{actor} has changed the share type" : "{actor} a changé le type de partage", + "You have changed the registration constraints for the public share labeled {sharee}" : "Vous avez changé les conditions d'inscription pour le partage public nommé {sharee}", + "{actor} has changed the registration constraints for the public share labeled {sharee}" : "{actor} a changé les contraintes d'enregistrement pour le partage public nommé {sharee}", "You have registered to poll {pollTitle}" : "Vous vous êtes enregistré•e pour le sondage {pollTitle}", "{sharee} registered to poll {pollTitle}" : "{sharee} s'est enregistré•e pour le sondage {pollTitle}", "You have registered" : "Vous vous êtes inscrit", @@ -150,6 +153,10 @@ "{actor} has voted in poll {pollTitle}" : "{actor} a participé au sondage {pollTitle}", "You have voted" : "Vous avez voté", "{actor} has voted" : "{actor} a voté", + "One or more orphaned votes heve been deleted from {pollTitle}" : "Un ou plusieurs votes orphelins ont été supprimés de {pollTitle}", + "{actor} has deleted your orphaned polls from poll {pollTitle}" : "{actor} a supprimé vos sondages orphelins du sondage {pollTitle}", + "Orphaned votes deleted" : "Votes orphelins supprimés", + "{actor} deleted orphaned votes" : "{actor} Votes orphelins supprimés", "You have locked the share of {sharee}" : "Vous avez verrouillé le partage de {sharee}", "{actor} has locked the share of {sharee}" : "{actor} a verrouillé le partage de {sharee}", "You have unlocked the share of {sharee}" : "Vous avez débloqué le partage de {sharee}", @@ -245,6 +252,7 @@ "No valid email address" : "Pas d'adresse e-mail valide", "Unknown error" : "Erreur inconnue", "Reveal them" : "Révélez-les", + "Toggle sidebar" : "Afficher la barre latérale", "Maybe" : "Peut-être", "Loading …" : "Chargement…", "Click" : "Cliquer", @@ -253,6 +261,7 @@ "minus" : "moins", "plus" : "plus", "Please wait…" : "Merci de patienter...", + "Possibly affected calendar events" : "Événements du calendrier potentiellement concernés", "Add" : "Ajouter", "You are asked to propose more options." : "On vous demande de proposer plus d'options.", "The proposal period ends {timeRelative}." : "La période de proposition se termine {timeRelative}.", @@ -292,10 +301,13 @@ "Delete comment" : "Supprimer le commentaire", "deleted" : "effacé", "The automatic reminder is sent to all shares via email:" : "Le rappel automatique est envoyé à tous les partages par e-mail :", + "For polls with expiration" : "Pour les sondages avec expiration", "48 hours before the expiration date, if the poll is created more than 5 days before the expiration." : "48 heures avant la date d’expiration, si le sondage est créé plus de 5 jours avant l’expiration.", "36 hours before the expiration date, if the poll is created more than 2 and less than 5 days before the expiration." : "36 heures avant la date d’expiration, si le sondage est créé plus de 2 jours et moins de 5 jours avant l’expiration.", + "For date polls without expiration" : "Pour les sondages de date sans expiration", "48 hours before the first date option, if the poll is created more than 5 days before the first date option." : "48 heures avant la première date proposée, si le sondage a été créé au moins 5 jours avant la première date proposée.", "36 hours before the first date option, if the poll is created more than 2 and less than 5 days before the first date option." : "36 heures avant la première date proposée, si le sondage a été créé entre 2 et 5 jours avant la première date proposée.", + "No reminder is sent" : "Aucun rappel n’est envoyé", "For text polls without expiration." : "Pour les sondages texte sans expiration.", "For polls created less than 2 days before the expiration." : "Pour les sondages créés moins de 2 jours avant l’expiration.", "If a share already got a reminder (no matter, if the expiration date got changed)." : "Si un partage a déjà fait l'objet d'un rappel (même si la date d'expiration a été modifiée)", @@ -308,6 +320,7 @@ "Ok" : "Ok", "Anonymous poll" : "Sondage anonyme", "Use Autoreminder" : "Utiliser le rappel automatique", + "Autoreminder information" : "Information sur le rappel automatique", "Reopen poll" : "Ré-ouvrir le sondage", "Close poll" : "Terminer le sondage", "Poll closing date" : "Date de fermeture du sondage", @@ -320,6 +333,7 @@ "Force confidential comments (only visible to you and the author)" : "Forcer la confidentialité des commentaires (seulement visibles par l'auteur et vous)", "Force confidential comments (only visible to {displayName} and the author)" : "Forcer la confidentialité des commentaires (seulement visibles par l'auteur et {displayName})", "Limit \"Yes\" votes per option" : "Limiter les votes \"Oui\" par option", + "Hide unavailable options" : "Cacher les choix indisponibles", "Allow proposals" : "Permettre les propositions", "Proposal closing date" : "Date limite pour les propositions", "Always show results" : "Toujours afficher les résultats", @@ -330,6 +344,7 @@ "Poll \"{pollTitle}\" added" : "Sondage « {pollTitle} » ajouté", "Error while creating Poll \"{pollTitle}\"" : "Erreur à la création du sondage \"{pollTitle}\"", "Title" : "Titre", + "Enter title" : "Entrez un titre", "Poll type" : "Type de sondage", "\"{pollTitle}\" has been added" : "\"{pollTitle}\" a été ajouté", "Choose a meaningful title for your poll" : "Choisissez un titre qui a du sens pour votre sondage", @@ -381,6 +396,7 @@ "Duration" : "Durée", "Duration time unit" : "Unité de durée", "Repetitions" : "Répétitions", + "Automatically vote \"Yes\" for new option." : "Voter \"oui\" automatiquement pour les nouvelles options", "Preview" : "Prévisualiser", "Added" : "Ajouté", "Shifting dates is disabled to prevent shifting of proposals of other participants." : "Le décalage des dates est désactivé pour éviter de décaler les propositions des autres participants.", @@ -394,6 +410,7 @@ "Error adding options" : "Erreur à l'ajout d'options", "Create multiple options at once" : "Créer plusieurs options à la fois", "Each line creates a new option. Duplicates will get skipped without warning." : "Chaque ligne crée une nouvelle option. Les doublons seront ignorés sans avertissement.", + "Poll information" : "Information sur le sondage", "Archived" : "Archivé", "Unpublished" : "Non publié", "A private poll from {name}" : "Un sondage privé de {name}", @@ -524,6 +541,7 @@ "Show email addresses of internal accounts" : "Afficher les adresses e-mail des comptes internes", "Show only to members of the following groups" : "N’afficher qu’aux membres des groupes suivants", "Leave empty to disable globally." : "Laisser vide pour désactiver globalement.", + "Enable unrestricted owners globally" : "Activer les propriétaires sans restriction globalement", "Effects on restricted owners:" : "Effets sur les propriétaires restreints :", "Anonymizing a poll of a restricted owner means that this poll is anonymous for everyone, including the owner." : "Anonymiser le sondage d'un propriétaire restreint signifie que ce sondage est anonyme pour tout le monde, y compris le propriétaire.", "Deleting and changing votes of participants is not possible" : "Supprimer ou changer les votes des participants est impossible", @@ -535,6 +553,7 @@ "Check this, if you prefer to display text poll in a vertical aligned list rather than in the grid view. The initial default is list view." : "Cochez cette option si vous préférez afficher le sondage de texte dans une liste alignée verticalement plutôt que dans la vue en grille. La valeur par défaut initiale est la vue de liste.", "Date polls default to list view" : "Les sondages de dates sont affichés par défaut en vue liste", "Check this, if you prefer to display date poll in a vertical view rather than in the grid view. The initial default is grid view." : "Cochez cette option si vous préférez afficher le sondage pour des dates dans une vue verticale plutôt que dans la vue en grille. La valeur par défaut initiale est la vue en grille.", + "Verbose poll list" : "Liste détaillée des sondages", "Check this for more poll information in the overview." : "Cocher ici pour plus d'information sur les sondages dans la page de présentation", "Enter the amount of days, polls without activity stay in the relevant list:" : "Saisissez le nombre de jours pendant lesquels les sondages sans activité restent dans la liste « Me concernant » :", "The style settings are still experimental!" : "Le paramétrage des styles est encore expérimental !", @@ -558,6 +577,8 @@ "Resolving of {name} is not possible. The contacts app is not enabled." : "La résolution de {name} n’est pas possible. L’application contacts n’est pas activée.", "Resolving of {name} is not possible. The circles app is not enabled." : "La résolution de {name} n’est pas possible. L’application circles n’est pas activée.", "Error resolving {name}." : "Erreur à la résolution de {name}.", + "Grant administrative poll access" : "Accorder l'accès administratif au sondage", + "Withdraw administrative poll access" : "Retirer l'accès administratif au sondage", "Copy link to clipboard" : "Copier le lien dans le presse-papier", "Link copied to clipboard" : "Lien copié dans le presse-papier", "Error while copying link to clipboard" : "Erreur lors de la copie du lien dans le presse-papier", @@ -585,13 +606,17 @@ "No comments" : "Aucun commentaire", "Be the first." : "Soyez le premier.", "Configuration" : "Configuration", + "Comments are disabled, except for owner and delegated poll administration." : "Les commentaires sont désactivés, sauf pour le propriétaire et l'administrateur délégué du sondage.", "You have been granted administrative rights." : "Vous avez obtenu les droits d'administration.", "Changes may affect existing votes." : "Les changements peuvent affecter les votes existants.", + "Poll configuration" : "Configuration du sondage", "Poll closing status" : "État de clôture du sondage", "Result display" : "Affichage des résultats", + "Deletion and owner" : "Suppression et Propriétaire", "As an admin you may edit this poll" : "En tant qu'administrateur, vous pouvez modifier le sondage", "Allow proposals from participants" : "Accepter les propositions des participants", "Shift all date options" : "Décaler toutes les dates", + "Available options" : "Options disponibles", "Add a date" : "Ajouter une date", "Shares for a poll group grant voting access to the polls contained in the poll group." : "Les partages pour un groupe du sondage octroient l'accès aux votes pour les sondages contenus dans ce groupe de sondage.", "Receive notification email on activity to {emailAddress}" : "Recevoir un mail de notification d'activité à {emailAddress}", @@ -619,6 +644,7 @@ "Mail could not be resent to {emailAddress}" : "Impossible de renvoyer l'invitation à {emailAddress}", "Your votes are reset" : "Vos votes ont été annulés", "Error while resetting votes" : "Erreur lors de la remise à zéro du vote", + "Edit email address" : "Modifier l'adresse e-mail", "Switch to table view" : "Basculer en vue tableau", "Switch to list view" : "Passer à la vue en liste", "Switch to date order" : "Trier par date", @@ -627,14 +653,17 @@ "Copy your personal link to clipboard" : "Copier le lien personnel dans le presse-papier", "Get your personal link per mail" : "Recevez votre lien personnel par e-mail", "Subscribe to notifications" : "S'abonner aux notifications", + "Remove email address" : "Supprimer l'adresse e-mail", "Copy list of email addresses to clipboard" : "Copier la liste des adresses e-mail vers le presse-papiers", "Reset your votes" : "Annuler mes votes", "Logout as {name} (delete cookie)" : "Déconnexion de {name} (suppression du cookie)", "Type to start searching …" : "Commencer à taper pour rechercher...", "Select users" : "Sélectionnez des utilisateurs", + "No answer" : "Pas de transfert", "Vote saved" : "Vote enregistré", "Vote already booked out" : "Vote déjà enregistré", "Error saving vote" : "Erreur à l’enregistrement du vote", + "Click to vote with {nextAnswer} for option {option}" : "Cliquez pour voter avec {nextAnswer}pour l'option {option}", "Participant {userId} has been removed" : "Le participant {userId} a été supprimé", "Remove votes of {displayName}" : "Supprimer les votes de {displayName}", "Click to sort by name" : "Cliquez pour trier par nom", diff --git a/l10n/mk.js b/l10n/mk.js index 25cc215e50..cf17a97d3b 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -15,6 +15,7 @@ OC.L10N.register( "_Deleting in {countdown} second_::_Deleting in {countdown} seconds_" : ["Бришење за 1 секунда","Бришење за {countdown} секунди"], "Register" : "Регистрирај се", "Unknown error" : "Непозната грешка", + "Maybe" : "Можеби", "Loading …" : "Се вчитува…", "Previous day" : "Предходен ден", "Next day" : "Следен ден", diff --git a/l10n/mk.json b/l10n/mk.json index 8c5b3d207d..b7f2b1fec0 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -13,6 +13,7 @@ "_Deleting in {countdown} second_::_Deleting in {countdown} seconds_" : ["Бришење за 1 секунда","Бришење за {countdown} секунди"], "Register" : "Регистрирај се", "Unknown error" : "Непозната грешка", + "Maybe" : "Можеби", "Loading …" : "Се вчитува…", "Previous day" : "Предходен ден", "Next day" : "Следен ден", diff --git a/l10n/sr.js b/l10n/sr.js index 7331e55c1c..148dffd9eb 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -564,7 +564,7 @@ OC.L10N.register( "Calendar check" : "Провера календара", "Personal preferences" : "Лична подешавања", "Styles" : "Стилови", - "Share label" : "Подели ознаки", + "Share label" : "Ознака дељења", "Has voted" : "Гласао је", "Has not voted" : "Није гласао", "Internal access" : "Интерни приступ", diff --git a/l10n/sr.json b/l10n/sr.json index 514edaff56..fc3cbb4b95 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -562,7 +562,7 @@ "Calendar check" : "Провера календара", "Personal preferences" : "Лична подешавања", "Styles" : "Стилови", - "Share label" : "Подели ознаки", + "Share label" : "Ознака дељења", "Has voted" : "Гласао је", "Has not voted" : "Није гласао", "Internal access" : "Интерни приступ", diff --git a/l10n/zh_CN.js b/l10n/zh_CN.js index 03437b7aec..91e7a4b697 100644 --- a/l10n/zh_CN.js +++ b/l10n/zh_CN.js @@ -161,6 +161,7 @@ OC.L10N.register( "Add some!" : "添加一些!", "Register" : "注册", "Unknown error" : "未知错误", + "Maybe" : "可能", "Loading …" : "正在加载…", "Previous day" : "前一天", "Next day" : "后一天", diff --git a/l10n/zh_CN.json b/l10n/zh_CN.json index 8aed80a6f2..bf4b97240f 100644 --- a/l10n/zh_CN.json +++ b/l10n/zh_CN.json @@ -159,6 +159,7 @@ "Add some!" : "添加一些!", "Register" : "注册", "Unknown error" : "未知错误", + "Maybe" : "可能", "Loading …" : "正在加载…", "Previous day" : "前一天", "Next day" : "后一天", From ff26dce526b103c39e8d2b4028c8a39d414f049b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Sep 2025 22:41:52 +0000 Subject: [PATCH 13/56] build(deps): Bump vue from 3.5.20 to 3.5.21 Bumps [vue](https://github.com/vuejs/core) from 3.5.20 to 3.5.21. - [Release notes](https://github.com/vuejs/core/releases) - [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md) - [Commits](https://github.com/vuejs/core/compare/v3.5.20...v3.5.21) Signed-off-by: dartcafe --- updated-dependencies: - dependency-name: vue dependency-version: 3.5.21 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 128 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 64 insertions(+), 66 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfde143f9d..7b9ddd0ae0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "marked-gfm-heading-id": "^4.1.0", "pinia": "^3.0.3", "qrcode": "^1.5.3", - "vue": "^3.5.20", + "vue": "^3.5.21", "vue-material-design-icons": "^5.3.0", "vue-router": "^4.5.1", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" @@ -1168,10 +1168,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -3410,49 +3409,49 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.20.tgz", - "integrity": "sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.21.tgz", + "integrity": "sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==", "dependencies": { "@babel/parser": "^7.28.3", - "@vue/shared": "3.5.20", + "@vue/shared": "3.5.21", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.20.tgz", - "integrity": "sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.21.tgz", + "integrity": "sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==", "dependencies": { - "@vue/compiler-core": "3.5.20", - "@vue/shared": "3.5.20" + "@vue/compiler-core": "3.5.21", + "@vue/shared": "3.5.21" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.20.tgz", - "integrity": "sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.21.tgz", + "integrity": "sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==", "dependencies": { "@babel/parser": "^7.28.3", - "@vue/compiler-core": "3.5.20", - "@vue/compiler-dom": "3.5.20", - "@vue/compiler-ssr": "3.5.20", - "@vue/shared": "3.5.20", + "@vue/compiler-core": "3.5.21", + "@vue/compiler-dom": "3.5.21", + "@vue/compiler-ssr": "3.5.21", + "@vue/shared": "3.5.21", "estree-walker": "^2.0.2", - "magic-string": "^0.30.17", + "magic-string": "^0.30.18", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.20.tgz", - "integrity": "sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.21.tgz", + "integrity": "sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==", "dependencies": { - "@vue/compiler-dom": "3.5.20", - "@vue/shared": "3.5.20" + "@vue/compiler-dom": "3.5.21", + "@vue/shared": "3.5.21" } }, "node_modules/@vue/compiler-vue2": { @@ -3551,49 +3550,49 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.20.tgz", - "integrity": "sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.21.tgz", + "integrity": "sha512-3ah7sa+Cwr9iiYEERt9JfZKPw4A2UlbY8RbbnH2mGCE8NwHkhmlZt2VsH0oDA3P08X3jJd29ohBDtX+TbD9AsA==", "dependencies": { - "@vue/shared": "3.5.20" + "@vue/shared": "3.5.21" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.20.tgz", - "integrity": "sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.21.tgz", + "integrity": "sha512-+DplQlRS4MXfIf9gfD1BOJpk5RSyGgGXD/R+cumhe8jdjUcq/qlxDawQlSI8hCKupBlvM+3eS1se5xW+SuNAwA==", "dependencies": { - "@vue/reactivity": "3.5.20", - "@vue/shared": "3.5.20" + "@vue/reactivity": "3.5.21", + "@vue/shared": "3.5.21" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.20.tgz", - "integrity": "sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.21.tgz", + "integrity": "sha512-3M2DZsOFwM5qI15wrMmNF5RJe1+ARijt2HM3TbzBbPSuBHOQpoidE+Pa+XEaVN+czbHf81ETRoG1ltztP2em8w==", "dependencies": { - "@vue/reactivity": "3.5.20", - "@vue/runtime-core": "3.5.20", - "@vue/shared": "3.5.20", + "@vue/reactivity": "3.5.21", + "@vue/runtime-core": "3.5.21", + "@vue/shared": "3.5.21", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.20.tgz", - "integrity": "sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.21.tgz", + "integrity": "sha512-qr8AqgD3DJPJcGvLcJKQo2tAc8OnXRcfxhOJCPF+fcfn5bBGz7VCcO7t+qETOPxpWK1mgysXvVT/j+xWaHeMWA==", "dependencies": { - "@vue/compiler-ssr": "3.5.20", - "@vue/shared": "3.5.20" + "@vue/compiler-ssr": "3.5.21", + "@vue/shared": "3.5.21" }, "peerDependencies": { - "vue": "3.5.20" + "vue": "3.5.21" } }, "node_modules/@vue/shared": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.20.tgz", - "integrity": "sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==" + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.21.tgz", + "integrity": "sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==" }, "node_modules/@vue/tsconfig": { "version": "0.8.1", @@ -8735,12 +8734,11 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "license": "MIT", + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/marked": { @@ -13212,15 +13210,15 @@ "license": "MIT" }, "node_modules/vue": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.20.tgz", - "integrity": "sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==", - "dependencies": { - "@vue/compiler-dom": "3.5.20", - "@vue/compiler-sfc": "3.5.20", - "@vue/runtime-dom": "3.5.20", - "@vue/server-renderer": "3.5.20", - "@vue/shared": "3.5.20" + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.21.tgz", + "integrity": "sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==", + "dependencies": { + "@vue/compiler-dom": "3.5.21", + "@vue/compiler-sfc": "3.5.21", + "@vue/runtime-dom": "3.5.21", + "@vue/server-renderer": "3.5.21", + "@vue/shared": "3.5.21" }, "peerDependencies": { "typescript": "*" diff --git a/package.json b/package.json index 8d5861ec93..c424bad6a6 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "marked-gfm-heading-id": "^4.1.0", "pinia": "^3.0.3", "qrcode": "^1.5.3", - "vue": "^3.5.20", + "vue": "^3.5.21", "vue-material-design-icons": "^5.3.0", "vue-router": "^4.5.1", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" From 704e00821dd9d63353e0fc1db4cd83631c88300b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:05:07 +0000 Subject: [PATCH 14/56] build(deps-dev): Bump @nextcloud/vite-config from 2.4.0 to 2.5.0 Bumps [@nextcloud/vite-config](https://github.com/nextcloud/nextcloud-vite-config) from 2.4.0 to 2.5.0. - [Release notes](https://github.com/nextcloud/nextcloud-vite-config/releases) - [Changelog](https://github.com/nextcloud-libraries/nextcloud-vite-config/blob/main/CHANGELOG.md) - [Commits](https://github.com/nextcloud/nextcloud-vite-config/compare/v2.4.0...v2.5.0) Signed-off-by: dartcafe --- updated-dependencies: - dependency-name: "@nextcloud/vite-config" dependency-version: 2.5.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 60 ++++++++++++++++------------------------------- package.json | 2 +- 2 files changed, 21 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b9ddd0ae0..20d7b896e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "@nextcloud/eslint-config": "^8.3.0", "@nextcloud/prettier-config": "^1.2.0", "@nextcloud/stylelint-config": "^3.1.0", - "@nextcloud/vite-config": "^2.3.5", + "@nextcloud/vite-config": "^2.5.0", "@types/file-saver": "^2.0.7", "@types/lodash": "^4.17.19", "@types/luxon": "^3.7.1", @@ -1743,24 +1743,23 @@ } }, "node_modules/@nextcloud/vite-config": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@nextcloud/vite-config/-/vite-config-2.4.0.tgz", - "integrity": "sha512-f1YH16eiQAyxRynm5hgJIRH4hAwaBzRt+YD1ySKf/5ri/y7a/ZpkdWAxS5WgYVn1mSxl0ZVzQX04O3oKz8dIkQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@nextcloud/vite-config/-/vite-config-2.5.0.tgz", + "integrity": "sha512-i9Cjo9ITgEWJ5ws/I7f5d5S+GSy9zM8DqjFMvwvserrfSHXmJvPhF9XVRT89CbSMYtGoCYzJMNxe6jNp9FF3nw==", "dev": true, - "license": "AGPL-3.0-or-later", "dependencies": { "@rollup/plugin-replace": "^6.0.2", - "@vitejs/plugin-vue": "^6.0.0", + "@vitejs/plugin-vue": "^6.0.1", "browserslist-to-esbuild": "^2.1.1", - "magic-string": "^0.30.17", + "magic-string": "^0.30.18", "rollup-plugin-corejs": "^1.0.1", "rollup-plugin-esbuild-minify": "^1.3.0", "rollup-plugin-license": "^3.6.0", - "rollup-plugin-node-externals": "^8.0.1", + "rollup-plugin-node-externals": "^8.1.0", "spdx-expression-parse": "^4.0.0", "vite-plugin-css-injected-by-js": "^3.5.2", "vite-plugin-dts": "^4.5.4", - "vite-plugin-node-polyfills": "^0.23.0" + "vite-plugin-node-polyfills": "^0.24.0" }, "engines": { "node": "^20 || ^22 || ^24" @@ -1768,23 +1767,7 @@ "peerDependencies": { "browserslist": ">=4.0", "sass": ">=1.60", - "vite": "^5 || ^6 || ^7" - } - }, - "node_modules/@nextcloud/vite-config/node_modules/vite-plugin-node-polyfills": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.23.0.tgz", - "integrity": "sha512-4n+Ys+2bKHQohPBKigFlndwWQ5fFKwaGY6muNDMTb0fSQLyBzS+jjUNRZG9sKF0S/Go4ApG6LFnUGopjkILg3w==", - "dev": true, - "dependencies": { - "@rollup/plugin-inject": "^5.0.5", - "node-stdlib-browser": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/davidmyersdev" - }, - "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "vite": "^7.1.4" } }, "node_modules/@nextcloud/vue": { @@ -2227,11 +2210,10 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", - "dev": true, - "license": "MIT" + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", + "dev": true }, "node_modules/@rollup/plugin-inject": { "version": "5.0.5", @@ -3363,13 +3345,12 @@ "peer": true }, "node_modules/@vitejs/plugin-vue": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.0.tgz", - "integrity": "sha512-iAliE72WsdhjzTOp2DtvKThq1VBC4REhwRcaA+zPAAph6I+OQhUXv+Xu2KS7ElxYtb7Zc/3R30Hwv1DxEo7NXQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", "dev": true, - "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.19" + "@rolldown/pluginutils": "1.0.0-beta.29" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -11158,9 +11139,9 @@ } }, "node_modules/rollup-plugin-node-externals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-externals/-/rollup-plugin-node-externals-8.0.1.tgz", - "integrity": "sha512-j6uve/BPEyHCmQuXpu5/LT5qXw69QLIi6YnFrs6F7tmGFXjkFDT0zqZMt0KaMuWSvkcxJFBklsKfYYoKKEPwyw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-externals/-/rollup-plugin-node-externals-8.1.1.tgz", + "integrity": "sha512-MEWJmXMGjo5E7o9hgAmma6XLCdU9gTVRcaaCubugTJdoJD3A91qxtxiukT9k2PeUdogtCaNehV3pvJUWrRNtwg==", "dev": true, "funding": [ { @@ -11172,7 +11153,6 @@ "url": "https://paypal.me/septh07" } ], - "license": "MIT", "engines": { "node": ">= 21 || ^20.6.0 || ^18.19.0" }, diff --git a/package.json b/package.json index c424bad6a6..54ea8b45f4 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "@nextcloud/eslint-config": "^8.3.0", "@nextcloud/prettier-config": "^1.2.0", "@nextcloud/stylelint-config": "^3.1.0", - "@nextcloud/vite-config": "^2.3.5", + "@nextcloud/vite-config": "^2.5.0", "@types/file-saver": "^2.0.7", "@types/lodash": "^4.17.19", "@types/luxon": "^3.7.1", From c290ecc67006c2b1b6109e19065fb7aacce3fbff Mon Sep 17 00:00:00 2001 From: dartcafe Date: Thu, 4 Sep 2025 16:48:26 +0200 Subject: [PATCH 15/56] intercept dates of daylight saving changes Signed-off-by: dartcafe --- src/components/Base/modules/DateBox.vue | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/components/Base/modules/DateBox.vue b/src/components/Base/modules/DateBox.vue index 63762d2043..479f3068fe 100644 --- a/src/components/Base/modules/DateBox.vue +++ b/src/components/Base/modules/DateBox.vue @@ -24,11 +24,19 @@ const allDay = computed( // 'to' is 'from' plus the duration // subtract a day if allDay is true and luxonDuration is greater than 0 to match the // end of the day after the duration instead of the beginning of the next day -const to = computed(() => - dateTime +const to = computed(() => { + // this is a quick fix which intercepts dayspans crossing daylight saving time changes + // Adding duration as seconds divided by a normal dayspan in seconds (86400) multiplied + // by 86400 ensures that we always land at the same time of day, even if the actual + // dayspan is 23 or 25 hours due to DST changes + // FIXME: this should be replaced by a more stable solution + if (allDay.value) { + return dateTime.plus((duration.as('seconds') / 86400) * 86400) + } + return dateTime .plus(duration) - .minus({ day: allDay.value && duration.as('seconds') > 0 ? 1 : 0 }), -) + .minus({ day: allDay.value && duration.as('seconds') > 0 ? 1 : 0 }) +}) // to and from dates have the same month (and year) // suppress the 'to' month if they are the same From 00fb7cf734806b0fb0732eb744d5e77149eca5db Mon Sep 17 00:00:00 2001 From: dartcafe Date: Thu, 4 Sep 2025 16:06:28 +0200 Subject: [PATCH 16/56] bulk replace icons by outlined variant #4269 Signed-off-by: dartcafe --- src/components/Actions/modules/ActionDelete.vue | 4 ++-- .../Actions/modules/ActionSendConfirmed.vue | 2 +- src/components/Calendar/CalendarPeek.vue | 2 +- src/components/Configuration/ConfigClosing.vue | 4 ++-- .../Configuration/ConfigDangerArea.vue | 4 ++-- src/components/Create/CreateDlg.vue | 2 +- src/components/Create/PollCreateDlg.vue | 2 +- src/components/Export/ExportPoll.vue | 2 +- src/components/Modals/OptionsAddModal.vue | 2 +- .../Navigation/PollNavigationItems.vue | 10 ++++++---- src/components/Options/OptionMenu.vue | 2 +- src/components/Options/OptionsDate.vue | 2 +- src/components/Options/OptionsText.vue | 2 +- src/components/Options/OptionsTextAddBulk.vue | 2 +- src/components/Poll/PollInfoLine.vue | 6 +++--- src/components/Poll/PollInformation.vue | 12 ++++++------ src/components/PollGroup/PollGroupEditDlg.vue | 6 +++--- src/components/PollList/PollItem.vue | 12 ++++++------ src/components/PollList/PollItemActions.vue | 4 ++-- src/components/PollList/PollListSort.vue | 2 +- .../Settings/AdminSettings/AdminEmail.vue | 2 +- src/components/Shares/ShareMenu.vue | 16 +++++++--------- src/components/Shares/SharesList.vue | 2 +- src/components/Shares/SharesListLocked.vue | 2 +- src/components/Shares/SharesListPollGroup.vue | 2 +- src/components/Shares/SharesListUnsent.vue | 6 +++--- src/components/SideBar/SideBarTabActivity.vue | 2 +- src/components/SideBar/SideBarTabComments.vue | 4 ++-- .../SideBar/SideBarTabConfiguration.vue | 12 ++++++------ src/components/SideBar/SideBarTabOptions.vue | 6 +++--- src/components/User/ActionInputDisplayName.vue | 2 +- src/components/User/UserItem.vue | 12 ++++++------ src/components/User/UserMenu.vue | 6 +++--- src/components/VoteTable/VoteMenu.vue | 6 +++--- src/components/VoteTable/VoteParticipant.vue | 2 +- src/views/Dashboard.vue | 2 +- src/views/Navigation.vue | 14 +++++++------- src/views/Reference.vue | 2 +- src/views/SideBar.vue | 8 ++++---- src/views/SideBarPollGroup.vue | 4 ++-- src/views/Vote.vue | 2 +- 41 files changed, 99 insertions(+), 99 deletions(-) diff --git a/src/components/Actions/modules/ActionDelete.vue b/src/components/Actions/modules/ActionDelete.vue index 332cae7f24..df9eb0c392 100644 --- a/src/components/Actions/modules/ActionDelete.vue +++ b/src/components/Actions/modules/ActionDelete.vue @@ -9,9 +9,9 @@ import { t, n } from '@nextcloud/l10n' import NcButton from '@nextcloud/vue/components/NcButton' -import DeleteIcon from 'vue-material-design-icons/Delete.vue' +import DeleteIcon from 'vue-material-design-icons/DeleteOutline.vue' import RestoreIcon from 'vue-material-design-icons/Recycle.vue' -import LockIcon from 'vue-material-design-icons/Lock.vue' +import LockIcon from 'vue-material-design-icons/LockOutline.vue' import UndoIcon from 'vue-material-design-icons/ArrowULeftTop.vue' interface Props { diff --git a/src/components/Actions/modules/ActionSendConfirmed.vue b/src/components/Actions/modules/ActionSendConfirmed.vue index 94a9986a06..e8115253ac 100644 --- a/src/components/Actions/modules/ActionSendConfirmed.vue +++ b/src/components/Actions/modules/ActionSendConfirmed.vue @@ -11,7 +11,7 @@ import { t, n } from '@nextcloud/l10n' import NcModal from '@nextcloud/vue/components/NcModal' import NcButton from '@nextcloud/vue/components/NcButton' -import EmailCheckIcon from 'vue-material-design-icons/EmailCheck.vue' // view-comfy-outline +import EmailCheckIcon from 'vue-material-design-icons/EmailCheckOutline.vue' // view-comfy-outline import { PollsAPI } from '../../../Api' import { Logger } from '../../../helpers' diff --git a/src/components/Calendar/CalendarPeek.vue b/src/components/Calendar/CalendarPeek.vue index 9912bbe25a..78337fe9af 100644 --- a/src/components/Calendar/CalendarPeek.vue +++ b/src/components/Calendar/CalendarPeek.vue @@ -12,7 +12,7 @@ import { DateTime } from 'luxon' import NcPopover from '@nextcloud/vue/components/NcPopover' import NcButton from '@nextcloud/vue/components/NcButton' -import CalendarIcon from 'vue-material-design-icons/Calendar.vue' +import CalendarIcon from 'vue-material-design-icons/CalendarOutline.vue' import CalendarInfo from './CalendarInfo.vue' import { CalendarAPI } from '../../Api' diff --git a/src/components/Configuration/ConfigClosing.vue b/src/components/Configuration/ConfigClosing.vue index e9bebbcb80..721cdf752a 100644 --- a/src/components/Configuration/ConfigClosing.vue +++ b/src/components/Configuration/ConfigClosing.vue @@ -12,8 +12,8 @@ import NcButton from '@nextcloud/vue/components/NcButton' import DateTimePicker from '../../components/Base/modules/DateTimePicker.vue' import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch' -import OpenPollIcon from 'vue-material-design-icons/LockOpenVariant.vue' -import ClosePollIcon from 'vue-material-design-icons/Lock.vue' +import OpenPollIcon from 'vue-material-design-icons/LockOpenVariantOutline.vue' +import ClosePollIcon from 'vue-material-design-icons/LockOutline.vue' import { usePollStore } from '../../stores/poll' diff --git a/src/components/Configuration/ConfigDangerArea.vue b/src/components/Configuration/ConfigDangerArea.vue index e20b043502..b10d233726 100644 --- a/src/components/Configuration/ConfigDangerArea.vue +++ b/src/components/Configuration/ConfigDangerArea.vue @@ -14,8 +14,8 @@ import { usePollStore } from '../../stores/poll' import DeletePollDialog from '../Modals/DeletePollDialog.vue' import RestorePollIcon from 'vue-material-design-icons/Recycle.vue' -import ArchivePollIcon from 'vue-material-design-icons/Archive.vue' -import DeletePollIcon from 'vue-material-design-icons/Delete.vue' +import ArchivePollIcon from 'vue-material-design-icons/ArchiveOutline.vue' +import DeletePollIcon from 'vue-material-design-icons/DeleteOutline.vue' import TransferPollIcon from 'vue-material-design-icons/AccountSwitchOutline.vue' import TransferPollDialog from '../Modals/TransferPollDialog.vue' diff --git a/src/components/Create/CreateDlg.vue b/src/components/Create/CreateDlg.vue index c9e5cea2cc..cdc9b31f3b 100644 --- a/src/components/Create/CreateDlg.vue +++ b/src/components/Create/CreateDlg.vue @@ -11,7 +11,7 @@ import { t } from '@nextcloud/l10n' import NcButton from '@nextcloud/vue/components/NcButton' -import SpeakerIcon from 'vue-material-design-icons/Bullhorn.vue' +import SpeakerIcon from 'vue-material-design-icons/BullhornOutline.vue' import CheckIcon from 'vue-material-design-icons/Check.vue' import InputDiv from '../Base/modules/InputDiv.vue' diff --git a/src/components/Create/PollCreateDlg.vue b/src/components/Create/PollCreateDlg.vue index d4e875f1d2..4e55c73acb 100644 --- a/src/components/Create/PollCreateDlg.vue +++ b/src/components/Create/PollCreateDlg.vue @@ -9,7 +9,7 @@ import { t } from '@nextcloud/l10n' import NcButton from '@nextcloud/vue/components/NcButton' -import SpeakerIcon from 'vue-material-design-icons/Bullhorn.vue' +import SpeakerIcon from 'vue-material-design-icons/BullhornOutline.vue' import CheckIcon from 'vue-material-design-icons/Check.vue' import InputDiv from '../Base/modules/InputDiv.vue' diff --git a/src/components/Export/ExportPoll.vue b/src/components/Export/ExportPoll.vue index 2bd7081931..b203a435aa 100644 --- a/src/components/Export/ExportPoll.vue +++ b/src/components/Export/ExportPoll.vue @@ -21,7 +21,7 @@ import NcActionButton from '@nextcloud/vue/components/NcActionButton' import ExcelIcon from 'vue-material-design-icons/MicrosoftExcel.vue' import FileTableIcon from 'vue-material-design-icons/FileTableOutline.vue' -import CsvIcon from 'vue-material-design-icons/FileDelimited.vue' +import CsvIcon from 'vue-material-design-icons/FileDelimitedOutline.vue' import XmlIcon from 'vue-material-design-icons/Xml.vue' import ExportIcon from 'vue-material-design-icons/FileDownloadOutline.vue' diff --git a/src/components/Modals/OptionsAddModal.vue b/src/components/Modals/OptionsAddModal.vue index 6e09a0dde6..eac9ae19cf 100644 --- a/src/components/Modals/OptionsAddModal.vue +++ b/src/components/Modals/OptionsAddModal.vue @@ -10,7 +10,7 @@ import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent' import NcModal from '@nextcloud/vue/components/NcModal' import { subscribe, unsubscribe } from '@nextcloud/event-bus' -import DatePollIcon from 'vue-material-design-icons/CalendarBlank.vue' +import DatePollIcon from 'vue-material-design-icons/CalendarBlankOutline.vue' import OptionsDateAddDialog from '../Options/OptionsDateAddDialog.vue' import OptionsDate from '../Options/OptionsDate.vue' diff --git a/src/components/Navigation/PollNavigationItems.vue b/src/components/Navigation/PollNavigationItems.vue index 032c6c50d9..089f5f73c1 100644 --- a/src/components/Navigation/PollNavigationItems.vue +++ b/src/components/Navigation/PollNavigationItems.vue @@ -9,12 +9,12 @@ import { t } from '@nextcloud/l10n' import NcActionButton from '@nextcloud/vue/components/NcActionButton' import NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem' -import DeletePollIcon from 'vue-material-design-icons/Delete.vue' +import DeletePollIcon from 'vue-material-design-icons/DeleteOutline.vue' import ClonePollIcon from 'vue-material-design-icons/ContentCopy.vue' -import ArchivePollIcon from 'vue-material-design-icons/Archive.vue' +import ArchivePollIcon from 'vue-material-design-icons/ArchiveOutline.vue' import RestorePollIcon from 'vue-material-design-icons/Recycle.vue' import TextPollIcon from 'vue-material-design-icons/FormatListBulletedSquare.vue' -import DatePollIcon from 'vue-material-design-icons/CalendarBlank.vue' +import DatePollIcon from 'vue-material-design-icons/CalendarBlankOutline.vue' import { useSessionStore } from '../../stores/session' @@ -30,7 +30,9 @@ const sessionStore = useSessionStore() diff --git a/src/components/Options/OptionsText.vue b/src/components/Options/OptionsText.vue index 98f826b0e8..2d0190dd21 100644 --- a/src/components/Options/OptionsText.vue +++ b/src/components/Options/OptionsText.vue @@ -16,13 +16,12 @@ import OptionMenu from './OptionMenu.vue' const pollStore = usePollStore() const optionsStore = useOptionsStore() -const element = useTemplateRef('list') +// const element = useTemplateRef('list') -const dragOptions = { +useSortable(useTemplateRef('list'), optionsStore.options, { animation: 200, - group: 'description', + group: 'options', disabled: false, - ghostClass: 'ghost', onUpdate: (e: { oldIndex: number; newIndex: number }) => { onSort({ oldIndex: e.oldIndex, newIndex: e.newIndex }) // nextTick required here as moveArrayElement is executed in a microtask @@ -31,9 +30,7 @@ const dragOptions = { /* do nothing, wait for nextTick() */ }) }, -} - -useSortable(element, optionsStore.options, dragOptions) +}) const cssVar = { '--content-deleted': `" (${t('polls', 'deleted')})"`, diff --git a/src/components/SideBar/SideBarTabOptions.vue b/src/components/SideBar/SideBarTabOptions.vue index 54cd4297b9..bcdf422b38 100644 --- a/src/components/SideBar/SideBarTabOptions.vue +++ b/src/components/SideBar/SideBarTabOptions.vue @@ -121,40 +121,3 @@ onUnmounted(() => { - - diff --git a/src/components/VoteTable/VoteTable.vue b/src/components/VoteTable/VoteTable.vue index 4ba13ef11a..3cf396e397 100644 --- a/src/components/VoteTable/VoteTable.vue +++ b/src/components/VoteTable/VoteTable.vue @@ -278,10 +278,6 @@ function isVotable(participant: User, option: Option) { .option-item { grid-row: 2; border-inline-start: 1px solid var(--color-border); - - // .option-item-container { - // background-color: var(--color-main-background); - // } } .counter { @@ -304,15 +300,6 @@ function isVotable(participant: User, option: Option) { flex: 1 0 11rem; border-inline-start: 1px solid var(--color-border-dark); } - - .option-item .option-item__option--text { - text-align: center; - /* Notice: https://caniuse.com/css-text-wrap-balance */ - text-wrap: balance; - hyphens: auto; - padding: 0 0.6em; - margin: auto; - } } &.list-view { From 8e1bdefc077bcea4e62b6e022aabc878860890b4 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Sun, 7 Sep 2025 15:13:14 +0200 Subject: [PATCH 40/56] changelog, tidy and formatting Signed-off-by: dartcafe --- CHANGELOG.md | 5 ++++- src/assets/scss/globals.scss | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5456ed7585..d9f0d94a0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,10 @@ All notable changes to this project will be documented in this file. ### Fixed - Ordering options in text polls was broken - Menu showed invalid actions in text poll - - Restore max width of elements in poll + - Restore lost max width of elements on vote page + - Limit height of large text options + - Expand large text options on hover and allow scrolling them + - Optimized ordering textpolls with large text options ## [8.4.5] - 2025-09-04 ### Fixed diff --git a/src/assets/scss/globals.scss b/src/assets/scss/globals.scss index 6aa3f3a686..148b89d099 100644 --- a/src/assets/scss/globals.scss +++ b/src/assets/scss/globals.scss @@ -7,6 +7,7 @@ inset-inline-start: 0; z-index: 5; } + .app-polls .clamped { display: -webkit-box !important; -webkit-line-clamp: 2; @@ -59,3 +60,17 @@ .modal__buttons__link { text-decoration: underline; } + +.sortable { + * { + cursor: grab; + &:active { + cursor: grabbing; + } + } + + &:active { + cursor: -moz-grabbing; + cursor: -webkit-grabbing; + } +} From 0b4155ea221113b29c15155703df69eafb8fde92 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Sun, 7 Sep 2025 15:14:17 +0200 Subject: [PATCH 41/56] late delivery Signed-off-by: dartcafe --- src/components/Options/OptionItem.vue | 28 --------------------------- 1 file changed, 28 deletions(-) diff --git a/src/components/Options/OptionItem.vue b/src/components/Options/OptionItem.vue index 986c5d90fe..e66c49a6fb 100644 --- a/src/components/Options/OptionItem.vue +++ b/src/components/Options/OptionItem.vue @@ -176,32 +176,4 @@ const pollStore = usePollStore() .option-item__handle { margin-inline-end: 0.5em; } - -.sortable { - * { - cursor: grab; - &:active { - cursor: grabbing; - } - } - - &:active { - cursor: -moz-grabbing; - cursor: -webkit-grabbing; - } - - // .material-design-icon.draggable { - // width: 0; - // padding-inline-end: 0; - // transition: all 0.3s ease-in-out; - // } - - // &:active, - // &:hover { - // .material-design-icon.draggable { - // width: initial; - // padding-inline-end: 0.5px; - // } - // } -} From 5985ebb4b5635f45b84e6167676dbff0cb6203a3 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Sun, 7 Sep 2025 15:16:25 +0200 Subject: [PATCH 42/56] typo Signed-off-by: dartcafe --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9f0d94a0c..9cd2381623 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ All notable changes to this project will be documented in this file. - Restore lost max width of elements on vote page - Limit height of large text options - Expand large text options on hover and allow scrolling them - - Optimized ordering textpolls with large text options + - Optimized ordering text polls with large text options ## [8.4.5] - 2025-09-04 ### Fixed From af9a247731341c7e9546bf9397570e54408696dc Mon Sep 17 00:00:00 2001 From: dartcafe Date: Sun, 7 Sep 2025 15:20:40 +0200 Subject: [PATCH 43/56] changelog 8.4.6 Signed-off-by: dartcafe --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cd2381623..80d2614b14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ # Changelog All notable changes to this project will be documented in this file. -## [8.4.6] - tbd +## [8.4.6] - 2025-09-07 ### Fixed - Ordering options in text polls was broken - Menu showed invalid actions in text poll From 15374810ce41b227b66a0b18a45ea670527f2810 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Sun, 7 Sep 2025 15:20:52 +0200 Subject: [PATCH 44/56] 8.4.6 Signed-off-by: dartcafe --- appinfo/info.xml | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index cb65da7091..c4148e730a 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -4,7 +4,7 @@ Polls A polls app, similar to Doodle/DuD-Poll with the possibility to restrict access. A polls app, similar to Doodle/DuD-Poll with the possibility to restrict access (members, certain groups/users, hidden and public). - 8.4.5 + 8.4.6 agpl Vinzenz Rosenkranz René Gieling diff --git a/package-lock.json b/package-lock.json index 3841cc1f62..53f5456286 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "polls", - "version": "8.4.5", + "version": "8.4.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "polls", - "version": "8.4.5", + "version": "8.4.6", "license": "AGPL-3.0", "dependencies": { "@nextcloud/auth": "^2.5.1", diff --git a/package.json b/package.json index f9e91def4f..1f84c5c02c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "polls", - "version": "8.4.5", + "version": "8.4.6", "private": true, "description": "Polls app for nextcloud", "homepage": "https://github.com/nextcloud/polls#readme", From ddd13014c2bdd5d349311a9f457653db8385060e Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Mon, 8 Sep 2025 01:37:00 +0000 Subject: [PATCH 45/56] fix(l10n): Update translations from Transifex Signed-off-by: Nextcloud bot --- l10n/be.js | 1 + l10n/be.json | 1 + l10n/br.js | 43 ------------------------------------------- l10n/br.json | 41 ----------------------------------------- l10n/de.js | 1 + l10n/de.json | 1 + l10n/de_DE.js | 1 + l10n/de_DE.json | 1 + l10n/es.js | 1 + l10n/es.json | 1 + l10n/it.js | 1 + l10n/it.json | 1 + l10n/nn_NO.js | 43 ------------------------------------------- l10n/nn_NO.json | 41 ----------------------------------------- l10n/tr.js | 1 + l10n/tr.json | 1 + 16 files changed, 12 insertions(+), 168 deletions(-) delete mode 100644 l10n/br.js delete mode 100644 l10n/br.json delete mode 100644 l10n/nn_NO.js delete mode 100644 l10n/nn_NO.json diff --git a/l10n/be.js b/l10n/be.js index e0287597a0..8338a314c8 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -49,6 +49,7 @@ OC.L10N.register( "Configuration" : "Канфігурацыя", "Public link: {token}" : "Публічная спасылка: {token}", "Public link" : "Публічная спасылка", + "Switch to list view" : "Пераключыцца ў выгляд спісу", "No answer" : "Няма адказу", "Add links to legal terms, if they exist and add an optional disclaimer to emails." : "Дадайце спасылкі на юрыдычныя тэрміны, калі яны ёсць, і дадайце ў электронныя лісты неабавязковую адмову ад адказнасці.", "Comments" : "Каментарыі", diff --git a/l10n/be.json b/l10n/be.json index 2eaf8a4aba..3409b6493a 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -47,6 +47,7 @@ "Configuration" : "Канфігурацыя", "Public link: {token}" : "Публічная спасылка: {token}", "Public link" : "Публічная спасылка", + "Switch to list view" : "Пераключыцца ў выгляд спісу", "No answer" : "Няма адказу", "Add links to legal terms, if they exist and add an optional disclaimer to emails." : "Дадайце спасылкі на юрыдычныя тэрміны, калі яны ёсць, і дадайце ў электронныя лісты неабавязковую адмову ад адказнасці.", "Comments" : "Каментарыі", diff --git a/l10n/br.js b/l10n/br.js deleted file mode 100644 index 63df486380..0000000000 --- a/l10n/br.js +++ /dev/null @@ -1,43 +0,0 @@ -OC.L10N.register( - "polls", - { - "Group" : "Stollad", - "User" : "Implijer", - "Delete" : "Dilemel", - "Unknown error" : "Fazi dizanv", - "Previous day" : "Deizioù kent", - "Next day" : "Deiz war-lerc'h", - "Add" : "Ouzhpennañ", - "Delete comment" : "Lemel an displegadenn", - "deleted" : "dilamet", - "Cancel" : "Nullañ", - "Title" : "Titl", - "Close" : "Seriñ", - "Yes" : "Ya", - "No" : "Nan", - "Participants" : "Tud", - "OK" : "OK", - "Preview" : "Ragwell", - "Submit" : "Kinnig", - "never" : "james", - "Name" : "Anv", - "Description" : "Diskrivadur", - "Expiration" : "Termen", - "Login" : "Anv arveriad", - "Shares" : "Rannañ", - "No activity yet" : "Tamm obererezh ebet", - "Configuration" : "Stumm", - "Change name" : "Cheñch env", - "Public link" : "Liamm publik", - "Comments" : "Displegadennoù", - "Details" : "Munudoù", - "Sharing" : "Rannan", - "Activity" : "Obererezh", - "Day" : "Deiz", - "Week" : "Sizun", - "Month" : "Miz", - "Created" : "Krouet", - "Owner" : "Perc'henner", - "Administration" : "Merouriez" -}, -"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"); diff --git a/l10n/br.json b/l10n/br.json deleted file mode 100644 index f67be728bd..0000000000 --- a/l10n/br.json +++ /dev/null @@ -1,41 +0,0 @@ -{ "translations": { - "Group" : "Stollad", - "User" : "Implijer", - "Delete" : "Dilemel", - "Unknown error" : "Fazi dizanv", - "Previous day" : "Deizioù kent", - "Next day" : "Deiz war-lerc'h", - "Add" : "Ouzhpennañ", - "Delete comment" : "Lemel an displegadenn", - "deleted" : "dilamet", - "Cancel" : "Nullañ", - "Title" : "Titl", - "Close" : "Seriñ", - "Yes" : "Ya", - "No" : "Nan", - "Participants" : "Tud", - "OK" : "OK", - "Preview" : "Ragwell", - "Submit" : "Kinnig", - "never" : "james", - "Name" : "Anv", - "Description" : "Diskrivadur", - "Expiration" : "Termen", - "Login" : "Anv arveriad", - "Shares" : "Rannañ", - "No activity yet" : "Tamm obererezh ebet", - "Configuration" : "Stumm", - "Change name" : "Cheñch env", - "Public link" : "Liamm publik", - "Comments" : "Displegadennoù", - "Details" : "Munudoù", - "Sharing" : "Rannan", - "Activity" : "Obererezh", - "Day" : "Deiz", - "Week" : "Sizun", - "Month" : "Miz", - "Created" : "Krouet", - "Owner" : "Perc'henner", - "Administration" : "Merouriez" -},"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);" -} \ No newline at end of file diff --git a/l10n/de.js b/l10n/de.js index 7a60800203..00b32deee8 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -388,6 +388,7 @@ OC.L10N.register( "Clone option" : "Option kopieren", "Unconfirm option" : "Option nicht bestätigen", "Confirm option" : "Option bestätigen", + "Sort by answers of this option" : "Nach Antworten dieser Option sortieren", "No vote options" : "Keine Abstimmungsoptionen", "Option already exists" : "Option ist bereits vorhanden", "Error adding Option" : "Fehler beim Hinzufügen der Option", diff --git a/l10n/de.json b/l10n/de.json index 8e94bb690a..5f83967afd 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -386,6 +386,7 @@ "Clone option" : "Option kopieren", "Unconfirm option" : "Option nicht bestätigen", "Confirm option" : "Option bestätigen", + "Sort by answers of this option" : "Nach Antworten dieser Option sortieren", "No vote options" : "Keine Abstimmungsoptionen", "Option already exists" : "Option ist bereits vorhanden", "Error adding Option" : "Fehler beim Hinzufügen der Option", diff --git a/l10n/de_DE.js b/l10n/de_DE.js index 562dc1f97d..d824547441 100644 --- a/l10n/de_DE.js +++ b/l10n/de_DE.js @@ -388,6 +388,7 @@ OC.L10N.register( "Clone option" : "Option kopieren", "Unconfirm option" : "Option nicht bestätigen", "Confirm option" : "Option bestätigen", + "Sort by answers of this option" : "Nach Antworten dieser Option sortieren", "No vote options" : "Keine Abstimmungsmöglichkeiten", "Option already exists" : "Option ist bereits vorhanden", "Error adding Option" : "Fehler beim Hinzufügen der Option", diff --git a/l10n/de_DE.json b/l10n/de_DE.json index 53d67983ce..b340b697f9 100644 --- a/l10n/de_DE.json +++ b/l10n/de_DE.json @@ -386,6 +386,7 @@ "Clone option" : "Option kopieren", "Unconfirm option" : "Option nicht bestätigen", "Confirm option" : "Option bestätigen", + "Sort by answers of this option" : "Nach Antworten dieser Option sortieren", "No vote options" : "Keine Abstimmungsmöglichkeiten", "Option already exists" : "Option ist bereits vorhanden", "Error adding Option" : "Fehler beim Hinzufügen der Option", diff --git a/l10n/es.js b/l10n/es.js index a1223770fd..342884670b 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -388,6 +388,7 @@ OC.L10N.register( "Clone option" : "Clonar opción", "Unconfirm option" : "Opciones sis confirmar", "Confirm option" : "Confirmar opción", + "Sort by answers of this option" : "Ordenar por las respuestas a esta opción", "No vote options" : "No hay opciones de voto", "Option already exists" : "La opción ya existe", "Error adding Option" : "Error al añadir la opción", diff --git a/l10n/es.json b/l10n/es.json index 42892ae45c..85d64d06e2 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -386,6 +386,7 @@ "Clone option" : "Clonar opción", "Unconfirm option" : "Opciones sis confirmar", "Confirm option" : "Confirmar opción", + "Sort by answers of this option" : "Ordenar por las respuestas a esta opción", "No vote options" : "No hay opciones de voto", "Option already exists" : "La opción ya existe", "Error adding Option" : "Error al añadir la opción", diff --git a/l10n/it.js b/l10n/it.js index fbaec7c1eb..f1b2262986 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -388,6 +388,7 @@ OC.L10N.register( "Clone option" : "Clona opzione", "Unconfirm option" : "Opzione non confermata", "Confirm option" : "Conferma opzione", + "Sort by answers of this option" : "Ordina per risposte di questa opzione", "No vote options" : "Nessuna opzione di voto", "Option already exists" : "L'opzione esiste già", "Error adding Option" : "Errore durante l'aggiunta dell'opzione", diff --git a/l10n/it.json b/l10n/it.json index 3158c3c244..9ba269c7a0 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -386,6 +386,7 @@ "Clone option" : "Clona opzione", "Unconfirm option" : "Opzione non confermata", "Confirm option" : "Conferma opzione", + "Sort by answers of this option" : "Ordina per risposte di questa opzione", "No vote options" : "Nessuna opzione di voto", "Option already exists" : "L'opzione esiste già", "Error adding Option" : "Errore durante l'aggiunta dell'opzione", diff --git a/l10n/nn_NO.js b/l10n/nn_NO.js deleted file mode 100644 index 4f2ccf8a8f..0000000000 --- a/l10n/nn_NO.js +++ /dev/null @@ -1,43 +0,0 @@ -OC.L10N.register( - "polls", - { - "Group" : "Gruppe", - "Contact" : "Kontakt", - "User" : "Bruker", - "Delete" : "Slett", - "Unknown error" : "Ukjend feil", - "Add" : "Legg til", - "New comment …" : "Ny kommentar...", - "Delete comment" : "Slett kommentar", - "Cancel" : "Avbryt", - "Ok" : "Greitt", - "Title" : "Tittel", - "Close" : "Lukk", - "Yes" : "Ja", - "No" : "Nei", - "Participants" : "Deltakarar", - "OK" : "OK", - "never" : "aldri", - "Name" : "Namn", - "Description" : "Skildring", - "Expiration" : "Utløp", - "Login" : "Login", - "Styles" : "Stilar", - "Shares" : "Delingar", - "No activity yet" : "Ingen aktivitetar enno", - "Configuration" : "Innstillingar", - "Other settings" : "Andre innstillingar", - "Comments" : "Kommentarar", - "Details" : "Detaljar", - "Sharing" : "Deling", - "Activity" : "Aktivitet", - "Minute" : "Minutt", - "Day" : "Dag", - "Week" : "Veke", - "Month" : "Månad", - "Year" : "År", - "Created" : "Lagd", - "Owner" : "Owner", - "Administration" : "Administrasjon" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/l10n/nn_NO.json b/l10n/nn_NO.json deleted file mode 100644 index d358c3cdb4..0000000000 --- a/l10n/nn_NO.json +++ /dev/null @@ -1,41 +0,0 @@ -{ "translations": { - "Group" : "Gruppe", - "Contact" : "Kontakt", - "User" : "Bruker", - "Delete" : "Slett", - "Unknown error" : "Ukjend feil", - "Add" : "Legg til", - "New comment …" : "Ny kommentar...", - "Delete comment" : "Slett kommentar", - "Cancel" : "Avbryt", - "Ok" : "Greitt", - "Title" : "Tittel", - "Close" : "Lukk", - "Yes" : "Ja", - "No" : "Nei", - "Participants" : "Deltakarar", - "OK" : "OK", - "never" : "aldri", - "Name" : "Namn", - "Description" : "Skildring", - "Expiration" : "Utløp", - "Login" : "Login", - "Styles" : "Stilar", - "Shares" : "Delingar", - "No activity yet" : "Ingen aktivitetar enno", - "Configuration" : "Innstillingar", - "Other settings" : "Andre innstillingar", - "Comments" : "Kommentarar", - "Details" : "Detaljar", - "Sharing" : "Deling", - "Activity" : "Aktivitet", - "Minute" : "Minutt", - "Day" : "Dag", - "Week" : "Veke", - "Month" : "Månad", - "Year" : "År", - "Created" : "Lagd", - "Owner" : "Owner", - "Administration" : "Administrasjon" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/l10n/tr.js b/l10n/tr.js index 7be6b2c7dd..1d2dfa0767 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -388,6 +388,7 @@ OC.L10N.register( "Clone option" : "Seçeneği kopyala", "Unconfirm option" : "Seçeneğin onayını kaldır", "Confirm option" : "Seçeneği onayla", + "Sort by answers of this option" : "Bu seçeneğin yanıtlarına göre sırala", "No vote options" : "Herhangi bir oy seçeneği yok", "Option already exists" : "Seçenek zaten var", "Error adding Option" : "Seçenek eklenirken sorun çıktı", diff --git a/l10n/tr.json b/l10n/tr.json index 1e49b0ef36..99848878fc 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -386,6 +386,7 @@ "Clone option" : "Seçeneği kopyala", "Unconfirm option" : "Seçeneğin onayını kaldır", "Confirm option" : "Seçeneği onayla", + "Sort by answers of this option" : "Bu seçeneğin yanıtlarına göre sırala", "No vote options" : "Herhangi bir oy seçeneği yok", "Option already exists" : "Seçenek zaten var", "Error adding Option" : "Seçenek eklenirken sorun çıktı", From a3de6a6c7533473b9a684886fd5eb8228658d64d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 01:08:31 +0000 Subject: [PATCH 46/56] build(deps): Bump luxon from 3.7.1 to 3.7.2 Bumps [luxon](https://github.com/moment/luxon) from 3.7.1 to 3.7.2. - [Changelog](https://github.com/moment/luxon/blob/master/CHANGELOG.md) - [Commits](https://github.com/moment/luxon/compare/3.7.1...3.7.2) Signed-off-by: dartcafe --- updated-dependencies: - dependency-name: luxon dependency-version: 3.7.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 9 ++++----- package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 53f5456286..893cdad3cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "linkify-string": "^4.3.1", "linkify-urls": "^5.0.2", "lodash": "^4.17.21", - "luxon": "^3.6.1", + "luxon": "^3.7.2", "marked": "^16.2.1", "marked-gfm-heading-id": "^4.1.0", "pinia": "^3.0.3", @@ -8706,10 +8706,9 @@ } }, "node_modules/luxon": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.1.tgz", - "integrity": "sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==", - "license": "MIT", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", "engines": { "node": ">=12" } diff --git a/package.json b/package.json index 1f84c5c02c..0f2591f9c7 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "linkify-string": "^4.3.1", "linkify-urls": "^5.0.2", "lodash": "^4.17.21", - "luxon": "^3.6.1", + "luxon": "^3.7.2", "marked": "^16.2.1", "marked-gfm-heading-id": "^4.1.0", "pinia": "^3.0.3", From 83658cf864593912ae605f10a94dc3489a65ca25 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Tue, 9 Sep 2025 01:32:06 +0000 Subject: [PATCH 47/56] fix(l10n): Update translations from Transifex Signed-off-by: Nextcloud bot --- l10n/da.js | 2 +- l10n/da.json | 2 +- l10n/en_GB.js | 1 + l10n/en_GB.json | 1 + l10n/et_EE.js | 1 + l10n/et_EE.json | 1 + l10n/ga.js | 1 + l10n/ga.json | 1 + l10n/pt_BR.js | 1 + l10n/pt_BR.json | 1 + l10n/sr.js | 1 + l10n/sr.json | 1 + l10n/zh_HK.js | 1 + l10n/zh_HK.json | 1 + 14 files changed, 14 insertions(+), 2 deletions(-) diff --git a/l10n/da.js b/l10n/da.js index c8101c0a30..a9797f2110 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -56,7 +56,7 @@ OC.L10N.register( "Sort by title" : "Sortér efter titel", "Direction" : "Retning", "Descending" : "Faldende", - "Ascending" : "stigende", + "Ascending" : "Stigende", "You will receive your personal link after clicking \"OK\"." : "Du modtager dit personlige link efter at have klikket på \"OK\".", "Privacy policy" : "Fortrolighedspolitik", "Login" : "Login", diff --git a/l10n/da.json b/l10n/da.json index fa786a1573..56ddf785f9 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -54,7 +54,7 @@ "Sort by title" : "Sortér efter titel", "Direction" : "Retning", "Descending" : "Faldende", - "Ascending" : "stigende", + "Ascending" : "Stigende", "You will receive your personal link after clicking \"OK\"." : "Du modtager dit personlige link efter at have klikket på \"OK\".", "Privacy policy" : "Fortrolighedspolitik", "Login" : "Login", diff --git a/l10n/en_GB.js b/l10n/en_GB.js index 13918264ab..d9b6536f7a 100644 --- a/l10n/en_GB.js +++ b/l10n/en_GB.js @@ -388,6 +388,7 @@ OC.L10N.register( "Clone option" : "Clone option", "Unconfirm option" : "Unconfirm option", "Confirm option" : "Confirm option", + "Sort by answers of this option" : "Sort by answers of this option", "No vote options" : "No vote options", "Option already exists" : "Option already exists", "Error adding Option" : "Error adding Option", diff --git a/l10n/en_GB.json b/l10n/en_GB.json index 2b48665f6d..a74e5b48dc 100644 --- a/l10n/en_GB.json +++ b/l10n/en_GB.json @@ -386,6 +386,7 @@ "Clone option" : "Clone option", "Unconfirm option" : "Unconfirm option", "Confirm option" : "Confirm option", + "Sort by answers of this option" : "Sort by answers of this option", "No vote options" : "No vote options", "Option already exists" : "Option already exists", "Error adding Option" : "Error adding Option", diff --git a/l10n/et_EE.js b/l10n/et_EE.js index 3452afd5d2..4d74f4ad63 100644 --- a/l10n/et_EE.js +++ b/l10n/et_EE.js @@ -377,6 +377,7 @@ OC.L10N.register( "Clone option" : "Tee valikust koopia", "Unconfirm option" : "Eemalda valiku kinnitus", "Confirm option" : "Kinnita valik", + "Sort by answers of this option" : "Järjesta selle valiku vastuste alusel", "No vote options" : "Hääletamisvalikuid pole", "Option already exists" : "Valik on juba olemas", "Error adding Option" : "Viga valiku lisamisel", diff --git a/l10n/et_EE.json b/l10n/et_EE.json index d93e7897f4..2ae4c38c0d 100644 --- a/l10n/et_EE.json +++ b/l10n/et_EE.json @@ -375,6 +375,7 @@ "Clone option" : "Tee valikust koopia", "Unconfirm option" : "Eemalda valiku kinnitus", "Confirm option" : "Kinnita valik", + "Sort by answers of this option" : "Järjesta selle valiku vastuste alusel", "No vote options" : "Hääletamisvalikuid pole", "Option already exists" : "Valik on juba olemas", "Error adding Option" : "Viga valiku lisamisel", diff --git a/l10n/ga.js b/l10n/ga.js index 0cf92094b9..5d9142b589 100644 --- a/l10n/ga.js +++ b/l10n/ga.js @@ -388,6 +388,7 @@ OC.L10N.register( "Clone option" : "Rogha Clón", "Unconfirm option" : "Rogha neamhdhearbhaigh", "Confirm option" : "Deimhnigh an rogha", + "Sort by answers of this option" : "Sórtáil de réir freagraí an rogha seo", "No vote options" : "Gan roghanna vótála", "Option already exists" : "Tá rogha ann cheana féin", "Error adding Option" : "Earráid agus Rogha á cur leis", diff --git a/l10n/ga.json b/l10n/ga.json index 253f5dbb23..d41614d277 100644 --- a/l10n/ga.json +++ b/l10n/ga.json @@ -386,6 +386,7 @@ "Clone option" : "Rogha Clón", "Unconfirm option" : "Rogha neamhdhearbhaigh", "Confirm option" : "Deimhnigh an rogha", + "Sort by answers of this option" : "Sórtáil de réir freagraí an rogha seo", "No vote options" : "Gan roghanna vótála", "Option already exists" : "Tá rogha ann cheana féin", "Error adding Option" : "Earráid agus Rogha á cur leis", diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js index dcba2186bc..76eff5f798 100644 --- a/l10n/pt_BR.js +++ b/l10n/pt_BR.js @@ -388,6 +388,7 @@ OC.L10N.register( "Clone option" : "Clonar opção", "Unconfirm option" : "Desconfirmar opção", "Confirm option" : "Confirmar opção", + "Sort by answers of this option" : "Ordenar por respostas desta opção", "No vote options" : "Nenhuma opção de voto", "Option already exists" : "Opção já existe", "Error adding Option" : "Erro ao adicionar Opção", diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json index 709dc4e28d..0ff6a5a0f7 100644 --- a/l10n/pt_BR.json +++ b/l10n/pt_BR.json @@ -386,6 +386,7 @@ "Clone option" : "Clonar opção", "Unconfirm option" : "Desconfirmar opção", "Confirm option" : "Confirmar opção", + "Sort by answers of this option" : "Ordenar por respostas desta opção", "No vote options" : "Nenhuma opção de voto", "Option already exists" : "Opção já existe", "Error adding Option" : "Erro ao adicionar Opção", diff --git a/l10n/sr.js b/l10n/sr.js index 07755f46fb..207eab832e 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -388,6 +388,7 @@ OC.L10N.register( "Clone option" : "Опције клонирања", "Unconfirm option" : "Склони опцију гласања", "Confirm option" : "Потврди опцију гласања", + "Sort by answers of this option" : "Поређај по одговорима о овој опцији", "No vote options" : "Нема опција за гласање", "Option already exists" : "Опција већ постоји", "Error adding Option" : "Грешка приликом додавања опције", diff --git a/l10n/sr.json b/l10n/sr.json index a7da7c05d2..2b7c2e901f 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -386,6 +386,7 @@ "Clone option" : "Опције клонирања", "Unconfirm option" : "Склони опцију гласања", "Confirm option" : "Потврди опцију гласања", + "Sort by answers of this option" : "Поређај по одговорима о овој опцији", "No vote options" : "Нема опција за гласање", "Option already exists" : "Опција већ постоји", "Error adding Option" : "Грешка приликом додавања опције", diff --git a/l10n/zh_HK.js b/l10n/zh_HK.js index ebc292e0ff..8027ca5d58 100644 --- a/l10n/zh_HK.js +++ b/l10n/zh_HK.js @@ -388,6 +388,7 @@ OC.L10N.register( "Clone option" : "再製選項", "Unconfirm option" : "取消確認選項", "Confirm option" : "確認選項", + "Sort by answers of this option" : "按選項答案排序", "No vote options" : "無投票選項", "Option already exists" : "選項已存在", "Error adding Option" : "添加選項時發生錯誤", diff --git a/l10n/zh_HK.json b/l10n/zh_HK.json index 7ddeac10c9..7f971ffe13 100644 --- a/l10n/zh_HK.json +++ b/l10n/zh_HK.json @@ -386,6 +386,7 @@ "Clone option" : "再製選項", "Unconfirm option" : "取消確認選項", "Confirm option" : "確認選項", + "Sort by answers of this option" : "按選項答案排序", "No vote options" : "無投票選項", "Option already exists" : "選項已存在", "Error adding Option" : "添加選項時發生錯誤", From c98a668bbe1e089a3622e53f21a25f7902846610 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 01:06:25 +0000 Subject: [PATCH 48/56] build(deps-dev): Bump vite from 7.1.4 to 7.1.5 Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.4 to 7.1.5. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.1.5/packages/vite) Signed-off-by: dartcafe --- updated-dependencies: - dependency-name: vite dependency-version: 7.1.5 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 20 ++++++++++---------- package.json | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 893cdad3cf..bbb726c605 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "eslint-config-prettier": "^10.1.5", "eslint-plugin-prettier": "^5.5.4", "prettier": "^3.6.1", - "vite": "^7.1.4", + "vite": "^7.1.5", "vite-plugin-node-polyfills": "^0.24.0", "xml2js": "^0.6.2" }, @@ -12484,12 +12484,12 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -13051,16 +13051,16 @@ } }, "node_modules/vite": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz", - "integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", + "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", - "tinyglobby": "^0.2.14" + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" diff --git a/package.json b/package.json index 0f2591f9c7..861a9c53c3 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "eslint-config-prettier": "^10.1.5", "eslint-plugin-prettier": "^5.5.4", "prettier": "^3.6.1", - "vite": "^7.1.4", + "vite": "^7.1.5", "vite-plugin-node-polyfills": "^0.24.0", "xml2js": "^0.6.2" }, From 9c02941a3f347a95622b017a5e8a9540e58cb9f2 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Tue, 9 Sep 2025 23:19:06 +0200 Subject: [PATCH 49/56] do not sync option, just recalculate the hash Signed-off-by: dartcafe --- lib/Db/V3/TableManager.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/Db/V3/TableManager.php b/lib/Db/V3/TableManager.php index 4d459881bd..286cdf6ff4 100644 --- a/lib/Db/V3/TableManager.php +++ b/lib/Db/V3/TableManager.php @@ -555,11 +555,9 @@ public function migrateOptionsToHash(): array { // calculate the actual hash based on pollId and optionText $actualHash = Hash::getOptionHash($option->getPollId(), $option->getPollOptionText()); - // ensure the option is in sync - $option->syncOption(); - - // if the hash, set in syncOptions() differs from $actualHash update the option + // if the option's hash differs from $actualHash update the option if ($option->getPollOptionHash() !== $actualHash) { + $option->setPollOptionHash($actualHash); $option = $this->optionMapper->update($option); $updated++; } @@ -633,7 +631,7 @@ public function migrateOptionsToHash(): array { $messages[] = 'No vote hashes to update'; } else { - $this->logger->info('Updated {count} hashes of {updated} votes in {db}', [ + $this->logger->info('Updated {updated} hashes of {count} votes in {db}', [ 'updated' => $updated, 'count' => $count, 'db' => $this->dbPrefix . VoteMapper::TABLE From bb8cad10778d2ad7c253b3eaf211ffea59b7018d Mon Sep 17 00:00:00 2001 From: dartcafe Date: Tue, 9 Sep 2025 23:22:42 +0200 Subject: [PATCH 50/56] force loading changed classes Signed-off-by: dartcafe --- lib/Command/Db/CleanMigrations.php | 2 +- lib/Command/Db/CreateIndices.php | 2 +- lib/Command/Db/FixDB.php | 2 +- lib/Command/Db/Purge.php | 2 +- lib/Command/Db/Rebuild.php | 4 ++-- lib/Command/Db/RemoveFKConstraints.php | 2 +- lib/Command/Db/RemoveOptionalIndices.php | 2 +- lib/Command/Db/RemoveUniqueIndices.php | 2 +- lib/Command/Db/ResetWatch.php | 6 +++--- lib/Cron/JanitorCron.php | 2 +- lib/Db/{V3 => V4}/DbManager.php | 2 +- lib/Db/{V3 => V4}/IndexManager.php | 4 ++-- lib/Db/{V3 => V4}/TableManager.php | 4 ++-- lib/Listener/AddMissingIndicesListener.php | 2 +- lib/Migration/FixVotes.php | 2 +- lib/Migration/RepairSteps/CleanTables.php | 2 +- lib/Migration/RepairSteps/CreateIndices.php | 2 +- lib/Migration/RepairSteps/CreateTables.php | 2 +- lib/Migration/RepairSteps/DropOrphanedColumns.php | 2 +- lib/Migration/RepairSteps/DropOrphanedTables.php | 2 +- lib/Migration/RepairSteps/FixNullish.php | 2 +- lib/Migration/RepairSteps/Install.php | 2 +- lib/Migration/RepairSteps/RemoveIndices.php | 2 +- lib/Migration/RepairSteps/RemoveObsoleteMigrations.php | 2 +- lib/Migration/RepairSteps/SetLastInteraction.php | 2 +- lib/Migration/RepairSteps/UpdateHashes.php | 2 +- lib/Migration/RepairSteps/UpdateInteraction.php | 2 +- lib/Migration/V3/TableSchema.php | 2 +- lib/Migration/Version080301Date20250822153002.php | 4 ++-- lib/Migration/Version080307Date20250826231102.php | 4 ++-- 30 files changed, 37 insertions(+), 37 deletions(-) rename lib/Db/{V3 => V4}/DbManager.php (99%) rename lib/Db/{V3 => V4}/IndexManager.php (99%) rename lib/Db/{V3 => V4}/TableManager.php (99%) diff --git a/lib/Command/Db/CleanMigrations.php b/lib/Command/Db/CleanMigrations.php index f0daf9d85c..0c7d5aea86 100644 --- a/lib/Command/Db/CleanMigrations.php +++ b/lib/Command/Db/CleanMigrations.php @@ -10,7 +10,7 @@ use Doctrine\DBAL\Schema\Schema; use OCA\Polls\Command\Command; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; /** diff --git a/lib/Command/Db/CreateIndices.php b/lib/Command/Db/CreateIndices.php index c781664a58..e4272dcc55 100644 --- a/lib/Command/Db/CreateIndices.php +++ b/lib/Command/Db/CreateIndices.php @@ -10,7 +10,7 @@ use Doctrine\DBAL\Schema\Schema; use OCA\Polls\Command\Command; -use OCA\Polls\Db\V3\IndexManager; +use OCA\Polls\Db\V4\IndexManager; use OCP\IDBConnection; /** diff --git a/lib/Command/Db/FixDB.php b/lib/Command/Db/FixDB.php index 04664eb288..2c4537cf4e 100644 --- a/lib/Command/Db/FixDB.php +++ b/lib/Command/Db/FixDB.php @@ -10,7 +10,7 @@ use Doctrine\DBAL\Schema\Schema; use OCA\Polls\Command\Command; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; /** diff --git a/lib/Command/Db/Purge.php b/lib/Command/Db/Purge.php index d225378c52..af747659f5 100644 --- a/lib/Command/Db/Purge.php +++ b/lib/Command/Db/Purge.php @@ -9,7 +9,7 @@ namespace OCA\Polls\Command\Db; use OCA\Polls\Command\Command; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; /** diff --git a/lib/Command/Db/Rebuild.php b/lib/Command/Db/Rebuild.php index bc1a84b7aa..262ffd0c95 100644 --- a/lib/Command/Db/Rebuild.php +++ b/lib/Command/Db/Rebuild.php @@ -9,8 +9,8 @@ namespace OCA\Polls\Command\Db; use Doctrine\DBAL\Schema\Schema; -use OCA\Polls\Db\V3\TableManager; -use OCA\Polls\Db\V3\IndexManager; +use OCA\Polls\Db\V4\TableManager; +use OCA\Polls\Db\V4\IndexManager; use OCA\Polls\Command\Command; use OCP\IDBConnection; diff --git a/lib/Command/Db/RemoveFKConstraints.php b/lib/Command/Db/RemoveFKConstraints.php index b1aee31b19..52bdbf97e4 100644 --- a/lib/Command/Db/RemoveFKConstraints.php +++ b/lib/Command/Db/RemoveFKConstraints.php @@ -10,7 +10,7 @@ use Doctrine\DBAL\Schema\Schema; use OCA\Polls\Command\Command; -use OCA\Polls\Db\V3\IndexManager; +use OCA\Polls\Db\V4\IndexManager; use OCP\IDBConnection; /** diff --git a/lib/Command/Db/RemoveOptionalIndices.php b/lib/Command/Db/RemoveOptionalIndices.php index e947710092..61f0e23ee5 100644 --- a/lib/Command/Db/RemoveOptionalIndices.php +++ b/lib/Command/Db/RemoveOptionalIndices.php @@ -10,7 +10,7 @@ use Doctrine\DBAL\Schema\Schema; use OCA\Polls\Command\Command; -use OCA\Polls\Db\V3\IndexManager; +use OCA\Polls\Db\V4\IndexManager; use OCP\IDBConnection; /** diff --git a/lib/Command/Db/RemoveUniqueIndices.php b/lib/Command/Db/RemoveUniqueIndices.php index e741dce416..8efc8e2667 100644 --- a/lib/Command/Db/RemoveUniqueIndices.php +++ b/lib/Command/Db/RemoveUniqueIndices.php @@ -10,7 +10,7 @@ use Doctrine\DBAL\Schema\Schema; use OCA\Polls\Command\Command; -use OCA\Polls\Db\V3\IndexManager; +use OCA\Polls\Db\V4\IndexManager; use OCP\IDBConnection; /** diff --git a/lib/Command/Db/ResetWatch.php b/lib/Command/Db/ResetWatch.php index 1637ca5561..407a21a4fb 100644 --- a/lib/Command/Db/ResetWatch.php +++ b/lib/Command/Db/ResetWatch.php @@ -10,10 +10,10 @@ use Doctrine\DBAL\Schema\Schema; use OCA\Polls\Command\Command; -use OCA\Polls\Db\V3\IndexManager; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\IndexManager; +use OCA\Polls\Db\V4\TableManager; use OCA\Polls\Db\Watch; -use OCA\Polls\Migration\V3\TableSchema; +use OCA\Polls\Migration\V4\TableSchema; use OCP\IDBConnection; /** diff --git a/lib/Cron/JanitorCron.php b/lib/Cron/JanitorCron.php index d5c973a9d5..97ead2a77d 100644 --- a/lib/Cron/JanitorCron.php +++ b/lib/Cron/JanitorCron.php @@ -15,7 +15,7 @@ use OCA\Polls\Db\OptionMapper; use OCA\Polls\Db\PollMapper; use OCA\Polls\Db\ShareMapper; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCA\Polls\Db\VoteMapper; use OCA\Polls\Helper\Container; use OCA\Polls\Model\Settings\AppSettings; diff --git a/lib/Db/V3/DbManager.php b/lib/Db/V4/DbManager.php similarity index 99% rename from lib/Db/V3/DbManager.php rename to lib/Db/V4/DbManager.php index 0ba6b20c43..9bb1e31f4c 100644 --- a/lib/Db/V3/DbManager.php +++ b/lib/Db/V4/DbManager.php @@ -6,7 +6,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Polls\Db\V3; +namespace OCA\Polls\Db\V4; use Doctrine\DBAL\Schema\Schema; use Exception; diff --git a/lib/Db/V3/IndexManager.php b/lib/Db/V4/IndexManager.php similarity index 99% rename from lib/Db/V3/IndexManager.php rename to lib/Db/V4/IndexManager.php index 21f6cce73b..12baa7e55e 100644 --- a/lib/Db/V3/IndexManager.php +++ b/lib/Db/V4/IndexManager.php @@ -6,12 +6,12 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Polls\Db\V3; +namespace OCA\Polls\Db\V4; use Doctrine\DBAL\Schema\Exception\IndexDoesNotExist; use Doctrine\DBAL\Schema\Schema; use Exception; -use OCA\Polls\Migration\V3\TableSchema; +use OCA\Polls\Migration\V4\TableSchema; use OCP\DB\ISchemaWrapper; use OCP\IConfig; use OCP\IDBConnection; diff --git a/lib/Db/V3/TableManager.php b/lib/Db/V4/TableManager.php similarity index 99% rename from lib/Db/V3/TableManager.php rename to lib/Db/V4/TableManager.php index 286cdf6ff4..21e7be4640 100644 --- a/lib/Db/V3/TableManager.php +++ b/lib/Db/V4/TableManager.php @@ -6,7 +6,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Polls\Db\V3; +namespace OCA\Polls\Db\V4; use Doctrine\DBAL\Types\Type; use Exception; @@ -19,7 +19,7 @@ use OCA\Polls\Db\VoteMapper; use OCA\Polls\Db\Watch; use OCA\Polls\Helper\Hash; -use OCA\Polls\Migration\V3\TableSchema; +use OCA\Polls\Migration\V4\TableSchema; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IConfig; use OCP\IDBConnection; diff --git a/lib/Listener/AddMissingIndicesListener.php b/lib/Listener/AddMissingIndicesListener.php index 2b1a1022e3..e55d824846 100644 --- a/lib/Listener/AddMissingIndicesListener.php +++ b/lib/Listener/AddMissingIndicesListener.php @@ -8,7 +8,7 @@ namespace OCA\Polls\Listener; -use OCA\Polls\Migration\V3\TableSchema; +use OCA\Polls\Migration\V4\TableSchema; use OCP\DB\Events\AddMissingIndicesEvent; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; diff --git a/lib/Migration/FixVotes.php b/lib/Migration/FixVotes.php index 6c81ba501f..7255e2bb19 100644 --- a/lib/Migration/FixVotes.php +++ b/lib/Migration/FixVotes.php @@ -10,7 +10,7 @@ namespace OCA\Polls\Migration; use Doctrine\DBAL\Schema\Schema; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/RepairSteps/CleanTables.php b/lib/Migration/RepairSteps/CleanTables.php index 8bf5c4a5fa..94eb397eee 100644 --- a/lib/Migration/RepairSteps/CleanTables.php +++ b/lib/Migration/RepairSteps/CleanTables.php @@ -12,7 +12,7 @@ use Doctrine\DBAL\Schema\Schema; use Exception; use OCA\Polls\Db\Poll; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/RepairSteps/CreateIndices.php b/lib/Migration/RepairSteps/CreateIndices.php index ac1f88744e..940da78e22 100644 --- a/lib/Migration/RepairSteps/CreateIndices.php +++ b/lib/Migration/RepairSteps/CreateIndices.php @@ -11,7 +11,7 @@ use Doctrine\DBAL\Schema\Schema; use OCA\Polls\Db\Share; -use OCA\Polls\Db\V3\IndexManager; +use OCA\Polls\Db\V4\IndexManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/RepairSteps/CreateTables.php b/lib/Migration/RepairSteps/CreateTables.php index 22c789ebce..3f7d941ab3 100644 --- a/lib/Migration/RepairSteps/CreateTables.php +++ b/lib/Migration/RepairSteps/CreateTables.php @@ -10,7 +10,7 @@ namespace OCA\Polls\Migration\RepairSteps; use Doctrine\DBAL\Schema\Schema; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/RepairSteps/DropOrphanedColumns.php b/lib/Migration/RepairSteps/DropOrphanedColumns.php index c2d65e8999..835ac9843f 100644 --- a/lib/Migration/RepairSteps/DropOrphanedColumns.php +++ b/lib/Migration/RepairSteps/DropOrphanedColumns.php @@ -10,7 +10,7 @@ namespace OCA\Polls\Migration\RepairSteps; use Doctrine\DBAL\Schema\Schema; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/RepairSteps/DropOrphanedTables.php b/lib/Migration/RepairSteps/DropOrphanedTables.php index e44fd26d9f..a21b58b320 100644 --- a/lib/Migration/RepairSteps/DropOrphanedTables.php +++ b/lib/Migration/RepairSteps/DropOrphanedTables.php @@ -10,7 +10,7 @@ namespace OCA\Polls\Migration\RepairSteps; use Doctrine\DBAL\Schema\Schema; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/RepairSteps/FixNullish.php b/lib/Migration/RepairSteps/FixNullish.php index 2622811603..48ffa86384 100644 --- a/lib/Migration/RepairSteps/FixNullish.php +++ b/lib/Migration/RepairSteps/FixNullish.php @@ -9,7 +9,7 @@ namespace OCA\Polls\Migration\RepairSteps; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/RepairSteps/Install.php b/lib/Migration/RepairSteps/Install.php index d10acc6598..1df0ca8149 100644 --- a/lib/Migration/RepairSteps/Install.php +++ b/lib/Migration/RepairSteps/Install.php @@ -10,7 +10,7 @@ namespace OCA\Polls\Migration\RepairSteps; use Doctrine\DBAL\Schema\Schema; -use OCA\Polls\Db\V3\IndexManager; +use OCA\Polls\Db\V4\IndexManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/RepairSteps/RemoveIndices.php b/lib/Migration/RepairSteps/RemoveIndices.php index 6a33e5633a..9fa4de9ea5 100644 --- a/lib/Migration/RepairSteps/RemoveIndices.php +++ b/lib/Migration/RepairSteps/RemoveIndices.php @@ -9,7 +9,7 @@ namespace OCA\Polls\Migration\RepairSteps; use Doctrine\DBAL\Schema\Schema; -use OCA\Polls\Db\V3\IndexManager; +use OCA\Polls\Db\V4\IndexManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/RepairSteps/RemoveObsoleteMigrations.php b/lib/Migration/RepairSteps/RemoveObsoleteMigrations.php index 5b7409a408..61c1ec9ed3 100644 --- a/lib/Migration/RepairSteps/RemoveObsoleteMigrations.php +++ b/lib/Migration/RepairSteps/RemoveObsoleteMigrations.php @@ -9,7 +9,7 @@ namespace OCA\Polls\Migration\RepairSteps; use Doctrine\DBAL\Schema\Schema; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/RepairSteps/SetLastInteraction.php b/lib/Migration/RepairSteps/SetLastInteraction.php index db6a3b0e0e..0ef6283431 100644 --- a/lib/Migration/RepairSteps/SetLastInteraction.php +++ b/lib/Migration/RepairSteps/SetLastInteraction.php @@ -9,7 +9,7 @@ namespace OCA\Polls\Migration\RepairSteps; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCA\Polls\Db\WatchMapper; use OCP\IDBConnection; use OCP\Migration\IOutput; diff --git a/lib/Migration/RepairSteps/UpdateHashes.php b/lib/Migration/RepairSteps/UpdateHashes.php index 82e6170073..b180429f6b 100644 --- a/lib/Migration/RepairSteps/UpdateHashes.php +++ b/lib/Migration/RepairSteps/UpdateHashes.php @@ -9,7 +9,7 @@ namespace OCA\Polls\Migration\RepairSteps; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/RepairSteps/UpdateInteraction.php b/lib/Migration/RepairSteps/UpdateInteraction.php index 52d70de646..0849a74269 100644 --- a/lib/Migration/RepairSteps/UpdateInteraction.php +++ b/lib/Migration/RepairSteps/UpdateInteraction.php @@ -9,7 +9,7 @@ namespace OCA\Polls\Migration\RepairSteps; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\TableManager; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; diff --git a/lib/Migration/V3/TableSchema.php b/lib/Migration/V3/TableSchema.php index 1881334dc5..b7f07ca345 100644 --- a/lib/Migration/V3/TableSchema.php +++ b/lib/Migration/V3/TableSchema.php @@ -6,7 +6,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Polls\Migration\V3; +namespace OCA\Polls\Migration\V4; use OCA\Polls\Db\Comment; use OCA\Polls\Db\Log; diff --git a/lib/Migration/Version080301Date20250822153002.php b/lib/Migration/Version080301Date20250822153002.php index 1e23477154..ae8c6b5eae 100644 --- a/lib/Migration/Version080301Date20250822153002.php +++ b/lib/Migration/Version080301Date20250822153002.php @@ -9,8 +9,8 @@ namespace OCA\Polls\Migration; use OCA\Polls\Db\Share; -use OCA\Polls\Db\V3\IndexManager; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\IndexManager; +use OCA\Polls\Db\V4\TableManager; use OCP\DB\ISchemaWrapper; use OCP\IDBConnection; use OCP\Migration\IOutput; diff --git a/lib/Migration/Version080307Date20250826231102.php b/lib/Migration/Version080307Date20250826231102.php index f4822163fa..12d865de6e 100644 --- a/lib/Migration/Version080307Date20250826231102.php +++ b/lib/Migration/Version080307Date20250826231102.php @@ -9,8 +9,8 @@ namespace OCA\Polls\Migration; use OCA\Polls\Db\Share; -use OCA\Polls\Db\V3\IndexManager; -use OCA\Polls\Db\V3\TableManager; +use OCA\Polls\Db\V4\IndexManager; +use OCA\Polls\Db\V4\TableManager; use OCP\DB\ISchemaWrapper; use OCP\IDBConnection; use OCP\Migration\IOutput; From ea84732654c094a540e6537d829c3b25ec139146 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Thu, 11 Sep 2025 08:37:56 +0200 Subject: [PATCH 51/56] add return type Signed-off-by: dartcafe --- lib/Db/V4/IndexManager.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/Db/V4/IndexManager.php b/lib/Db/V4/IndexManager.php index 12baa7e55e..29f3a92e73 100644 --- a/lib/Db/V4/IndexManager.php +++ b/lib/Db/V4/IndexManager.php @@ -104,7 +104,12 @@ public function createForeignKeyConstraint(string $parentTableName, string $chil return 'Added ' . $parentTableName . '[' . $constraintColumn . '] <- ' . $childTableName . '[id]'; } - public function listExistingIndices() { + /** + * @return string[] + * + * @psalm-return list{0?: string,...} + */ + public function listExistingIndices(): array { $this->needsSchema(); $messages = []; From 5a1727fe57c47b47a477ecfb8c19ad07c0ae6ca3 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Thu, 11 Sep 2025 09:01:01 +0200 Subject: [PATCH 52/56] add repair step and refactor Signed-off-by: dartcafe --- appinfo/info.xml | 5 + lib/Command/Db/Rebuild.php | 6 +- lib/Cron/JanitorCron.php | 2 +- lib/Db/V4/TableManager.php | 123 ++++++++++-------- lib/Migration/RepairSteps/CleanTables.php | 2 +- lib/Migration/RepairSteps/UpdateHashes.php | 4 +- .../Version080301Date20250822153002.php | 2 +- .../Version080307Date20250826231102.php | 2 +- 8 files changed, 83 insertions(+), 63 deletions(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index c4148e730a..831fc9bf94 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -46,6 +46,11 @@ OCA\Polls\Command\Share\Add OCA\Polls\Command\Share\Remove + + + OCA\Polls\Migration\RepairSteps\UpdateHashes + + OCA\Polls\Settings\AdminSettings OCA\Polls\Settings\AdminSection diff --git a/lib/Command/Db/Rebuild.php b/lib/Command/Db/Rebuild.php index 262ffd0c95..f6dae27155 100644 --- a/lib/Command/Db/Rebuild.php +++ b/lib/Command/Db/Rebuild.php @@ -68,7 +68,7 @@ protected function runCommands(): int { $this->printComment('Step 5. Validate and fix records'); $this->removeOrphaned(); - $this->migrateOptionsToHash(); + $this->updateHashes(); $this->deleteAllDuplicates(); $this->setLastInteraction(); @@ -123,9 +123,9 @@ private function createOrUpdateSchema(): void { /** * Add or update hash for votes and options */ - private function migrateOptionsToHash(): void { + private function updateHashes(): void { $this->printComment(' - Add or update hashes'); - $messages = $this->tableManager->migrateOptionsToHash(); + $messages = $this->tableManager->updateHashes(); $this->printInfo($messages, ' '); } diff --git a/lib/Cron/JanitorCron.php b/lib/Cron/JanitorCron.php index 97ead2a77d..587df1e9bd 100644 --- a/lib/Cron/JanitorCron.php +++ b/lib/Cron/JanitorCron.php @@ -66,7 +66,7 @@ protected function run($argument) { $this->tableManager->tidyWatchTable(time() - 86400); // first make sure all options and votes have a correct hash - $this->tableManager->migrateOptionsToHash(); + $this->tableManager->updateHashes(); // purge entries virtually deleted more than 12 hours ago $deleted['comments'] = $this->commentMapper->purgeDeletedComments(time() - 4320); diff --git a/lib/Db/V4/TableManager.php b/lib/Db/V4/TableManager.php index 21e7be4640..a63c163927 100644 --- a/lib/Db/V4/TableManager.php +++ b/lib/Db/V4/TableManager.php @@ -8,6 +8,7 @@ namespace OCA\Polls\Db\V4; +use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Types\Type; use Exception; use OCA\Polls\AppConstants; @@ -540,116 +541,130 @@ public function setLastInteraction(?int $timestamp = null): string { } - public function migrateOptionsToHash(): array { - $schema = $this->connection->createSchema(); + /** + * @return string[] + * + * @psalm-return list{0?: string,...} + */ + private function updateVoteHashes(Schema &$schema): array { $messages = []; - - if ($schema->hasTable($this->dbPrefix . OptionMapper::TABLE)) { - $table = $schema->getTable($this->dbPrefix . OptionMapper::TABLE); + if ($schema->hasTable($this->dbPrefix . VoteMapper::TABLE)) { + $table = $schema->getTable($this->dbPrefix . VoteMapper::TABLE); $count = 0; $updated = 0; - - if ($table->hasColumn('poll_option_hash')) { - foreach ($this->optionMapper->getAll(includeNull: true) as $option) { + if ($table->hasColumn('vote_option_hash')) { + foreach ($this->voteMapper->getAll(includeNull: true) as $vote) { try { - // calculate the actual hash based on pollId and optionText - $actualHash = Hash::getOptionHash($option->getPollId(), $option->getPollOptionText()); - - // if the option's hash differs from $actualHash update the option - if ($option->getPollOptionHash() !== $actualHash) { - $option->setPollOptionHash($actualHash); - $option = $this->optionMapper->update($option); + // if the hash of the vote differs from calculated hash update the vote hash + if ($vote->getVoteOptionHash() !== Hash::getOptionHash($vote->getPollId(), $vote->getVoteOptionText())) { + $vote->setVoteOptionHash(Hash::getOptionHash($vote->getPollId(), $vote->getVoteOptionText())); + $vote = $this->voteMapper->update($vote); $updated++; } $count++; } catch (Exception $e) { - $messages[] = 'Skip hash update - Error updating option hash for optionId ' . $option->getId(); - $this->logger->error('Error updating option hash for optionId {id}', ['id' => $option->getId(), 'message' => $e->getMessage()]); + $messages[] = 'Skip hash update - Error updating option hash for voteId ' . $vote->getId(); + $this->logger->error('Error updating option hash for voteId {id}', [ + 'id' => $vote->getId(), + 'message' => $e->getMessage() + ]); } } if ($updated === 0) { - $this->logger->info('No hashes of {count} options had to get updated in {db}', [ + $this->logger->info('Verified {count} vote hashes in {db}', [ 'count' => $count, - 'db' => $this->dbPrefix . OptionMapper::TABLE + 'db' => $this->dbPrefix . VoteMapper::TABLE ]); - $messages[] = 'No option hashes to update'; + $messages[] = 'No vote hashes to update'; } else { - $this->logger->info('Updated {updated} hashes of {count} options in {db}', [ + $this->logger->info('Updated {updated} hashes of {count} votes in {db}', [ 'updated' => $updated, 'count' => $count, - 'db' => $this->dbPrefix . OptionMapper::TABLE + 'db' => $this->dbPrefix . VoteMapper::TABLE ]); - $messages[] = 'Updated ' . $updated . ' option hashes'; + $messages[] = 'Updated ' . $updated . ' vote hashes'; } } else { - $this->logger->error('{db} is missing column \'poll_option_hash\' - aborted recalculating hashes', [ 'db' => $this->dbPrefix . OptionMapper::TABLE]); + $this->logger->error('{db} is missing column \'poll_option_hash\' - aborted recalculating hashes', [ + 'db' => $this->dbPrefix . VoteMapper::TABLE + ]); } - } else { - $this->logger->error('{db} is missing - aborted recalculating hashes', [ 'db' => $this->dbPrefix . OptionMapper::TABLE]); + $this->logger->error('{db} is missing- aborted recalculating hashes', [ + 'db' => $this->dbPrefix . VoteMapper::TABLE + ]); } + return $messages; + } - if ($schema->hasTable($this->dbPrefix . VoteMapper::TABLE)) { - $table = $schema->getTable($this->dbPrefix . VoteMapper::TABLE); + /** + * @return string[] + * + * @psalm-return list{0?: string,...} + */ + private function updateOptionHashes(Schema &$schema): array { + $messages = []; + + if ($schema->hasTable($this->dbPrefix . OptionMapper::TABLE)) { + $table = $schema->getTable($this->dbPrefix . OptionMapper::TABLE); $count = 0; $updated = 0; - if ($table->hasColumn('vote_option_hash')) { - foreach ($this->voteMapper->getAll(includeNull: true) as $vote) { - try { - // calculate the actual hash based on pollId and optionText - $actualHash = Hash::getOptionHash($vote->getPollId(), $vote->getVoteOptionText()); - // if the hash of the vote differs from $actualHash update the vote hash - if ($vote->getVoteOptionHash() !== $actualHash) { - $vote->setVoteOptionHash($actualHash); - $vote = $this->voteMapper->update($vote); + if ($table->hasColumn('poll_option_hash')) { + foreach ($this->optionMapper->getAll(includeNull: true) as $option) { + try { + // if the option's hash differs from $actualHash update the option + if ($option->getPollOptionHash() !== Hash::getOptionHash($option->getPollId(), $option->getPollOptionText())) { + $option->setPollOptionHash(Hash::getOptionHash($option->getPollId(), $option->getPollOptionText())); + $option = $this->optionMapper->update($option); $updated++; } $count++; } catch (Exception $e) { - $messages[] = 'Skip hash update - Error updating option hash for voteId ' . $vote->getId(); - $this->logger->error('Error updating option hash for voteId {id}', [ - 'id' => $vote->getId(), - 'message' => $e->getMessage() - ]); + $messages[] = 'Skip hash update - Error updating option hash for optionId ' . $option->getId(); + $this->logger->error('Error updating option hash for optionId {id}', ['id' => $option->getId(), 'message' => $e->getMessage()]); } } if ($updated === 0) { - $this->logger->info('No hashes of {count} options had to get updated in {db}', [ + $this->logger->info('Verified {count} option hashes in {db}', [ 'count' => $count, - 'db' => $this->dbPrefix . VoteMapper::TABLE + 'db' => $this->dbPrefix . OptionMapper::TABLE ]); - $messages[] = 'No vote hashes to update'; + $messages[] = 'No option hashes to update'; } else { - $this->logger->info('Updated {updated} hashes of {count} votes in {db}', [ + $this->logger->info('Updated {updated} hashes of {count} options in {db}', [ 'updated' => $updated, 'count' => $count, - 'db' => $this->dbPrefix . VoteMapper::TABLE + 'db' => $this->dbPrefix . OptionMapper::TABLE ]); - $messages[] = 'Updated ' . $updated . ' vote hashes'; + $messages[] = 'Updated ' . $updated . ' option hashes'; } } else { - $this->logger->error('{db} is missing column \'poll_option_hash\' - aborted recalculating hashes', [ - 'db' => $this->dbPrefix . VoteMapper::TABLE - ]); + $this->logger->error('{db} is missing column \'poll_option_hash\' - aborted recalculating hashes', [ 'db' => $this->dbPrefix . OptionMapper::TABLE]); } + } else { - $this->logger->error('{db} is missing- aborted recalculating hashes', [ - 'db' => $this->dbPrefix . VoteMapper::TABLE - ]); + $this->logger->error('{db} is missing - aborted recalculating hashes', [ 'db' => $this->dbPrefix . OptionMapper::TABLE]); } return $messages; } + + public function updateHashes(): array { + $schema = $this->connection->createSchema(); + $messages = $this->updateOptionHashes($schema); + $messages = array_merge($messages, $this->updateVoteHashes($schema)); + return $messages; + } } diff --git a/lib/Migration/RepairSteps/CleanTables.php b/lib/Migration/RepairSteps/CleanTables.php index 94eb397eee..e0c9f40b2f 100644 --- a/lib/Migration/RepairSteps/CleanTables.php +++ b/lib/Migration/RepairSteps/CleanTables.php @@ -36,7 +36,7 @@ public function getName():string { public function run(IOutput $output):void { if ($this->connection->tableExists(Poll::TABLE)) { try { - $this->tableManager->migrateOptionsToHash(); + $this->tableManager->updateHashes(); $this->tableManager->removeOrphaned(); $this->tableManager->deleteAllDuplicates(); $this->tableManager->tidyWatchTable(time()); diff --git a/lib/Migration/RepairSteps/UpdateHashes.php b/lib/Migration/RepairSteps/UpdateHashes.php index b180429f6b..6178276a35 100644 --- a/lib/Migration/RepairSteps/UpdateHashes.php +++ b/lib/Migration/RepairSteps/UpdateHashes.php @@ -22,13 +22,13 @@ public function __construct( } public function getName() { - return 'Polls - Create hashes for votes and options'; + return 'Polls - Update or create hashes for votes and options'; } public function run(IOutput $output): void { $this->tableManager->setConnection($this->connection); - $messages = $this->tableManager->migrateOptionsToHash(); + $messages = $this->tableManager->updateHashes(); foreach ($messages as $message) { $output->info($message); } diff --git a/lib/Migration/Version080301Date20250822153002.php b/lib/Migration/Version080301Date20250822153002.php index ae8c6b5eae..666d06b4c3 100644 --- a/lib/Migration/Version080301Date20250822153002.php +++ b/lib/Migration/Version080301Date20250822153002.php @@ -123,7 +123,7 @@ public function postSchemaChange(IOutput $output, \Closure $schemaClosure, array $this->logInfo($message, 'postMigration: '); // ensure correct option hashes in options and votes - $message = $this->tableManager->migrateOptionsToHash(); + $message = $this->tableManager->updateHashes(); $this->logInfo($message, 'postMigration: '); // remove all duplicate records which have to be unique diff --git a/lib/Migration/Version080307Date20250826231102.php b/lib/Migration/Version080307Date20250826231102.php index 12d865de6e..ce7561de4b 100644 --- a/lib/Migration/Version080307Date20250826231102.php +++ b/lib/Migration/Version080307Date20250826231102.php @@ -123,7 +123,7 @@ public function postSchemaChange(IOutput $output, \Closure $schemaClosure, array $this->logInfo($message, 'postMigration: '); // ensure correct option hashes in options and votes - $message = $this->tableManager->migrateOptionsToHash(); + $message = $this->tableManager->updateHashes(); $this->logInfo($message, 'postMigration: '); // remove all duplicate records which have to be unique From 597c0ff88184a3ddfc25034d4f02fbebb0fde98f Mon Sep 17 00:00:00 2001 From: dartcafe Date: Fri, 12 Sep 2025 16:06:21 +0200 Subject: [PATCH 53/56] forgotten update Signed-off-by: dartcafe --- lib/Migration/{V3 => V4}/TableSchema.php | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/Migration/{V3 => V4}/TableSchema.php (100%) diff --git a/lib/Migration/V3/TableSchema.php b/lib/Migration/V4/TableSchema.php similarity index 100% rename from lib/Migration/V3/TableSchema.php rename to lib/Migration/V4/TableSchema.php From 4a6dffa2913179704c017ed2eeb31c3b06f3f471 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Fri, 12 Sep 2025 19:02:33 +0200 Subject: [PATCH 54/56] does order matter? Signed-off-by: dartcafe --- appinfo/info.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index 831fc9bf94..51242c1aa6 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -32,6 +32,11 @@ OCA\Polls\Cron\JanitorCron OCA\Polls\Cron\AutoReminderCron + + + OCA\Polls\Migration\RepairSteps\UpdateHashes + + OCA\Polls\Command\Db\CleanMigrations OCA\Polls\Command\Db\CreateIndices @@ -46,11 +51,6 @@ OCA\Polls\Command\Share\Add OCA\Polls\Command\Share\Remove - - - OCA\Polls\Migration\RepairSteps\UpdateHashes - - OCA\Polls\Settings\AdminSettings OCA\Polls\Settings\AdminSection From cceea069ef1e28bd16ca3411d25d478877573cd8 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Fri, 12 Sep 2025 19:08:03 +0200 Subject: [PATCH 55/56] typo and remove wrong actions Signed-off-by: dartcafe --- .../Version080300Date20250812231603.php | 2 +- .../Version080300Date20250816201201.php | 2 +- .../Version080301Date20250822153002.php | 122 +----------------- .../Version080301Date20250822182903.php | 2 +- .../Version080303Date20250824090101.php | 2 +- 5 files changed, 7 insertions(+), 123 deletions(-) diff --git a/lib/Migration/Version080300Date20250812231603.php b/lib/Migration/Version080300Date20250812231603.php index ca9112c442..34ec04e0a1 100644 --- a/lib/Migration/Version080300Date20250812231603.php +++ b/lib/Migration/Version080300Date20250812231603.php @@ -26,7 +26,7 @@ public function __construct() { } public function name(): string { - return 'Replaceces Polls migration to version 8.3.0'; + return 'Replaces Polls migration to version 8.3.0'; } public function description(): string { diff --git a/lib/Migration/Version080300Date20250816201201.php b/lib/Migration/Version080300Date20250816201201.php index ff0b1bb8cb..6b264a91fd 100644 --- a/lib/Migration/Version080300Date20250816201201.php +++ b/lib/Migration/Version080300Date20250816201201.php @@ -26,7 +26,7 @@ public function __construct() { } public function name(): string { - return 'Replaceces Polls migration to version 8.3.0'; + return 'Replaces Polls migration to version 8.3.0'; } public function description(): string { diff --git a/lib/Migration/Version080301Date20250822153002.php b/lib/Migration/Version080301Date20250822153002.php index 666d06b4c3..76fad1b99c 100644 --- a/lib/Migration/Version080301Date20250822153002.php +++ b/lib/Migration/Version080301Date20250822153002.php @@ -36,45 +36,11 @@ public function __construct( } public function name(): string { - return 'Polls migration to version 8.3.7'; + return 'Replaces Polls migration to version 8.3.7'; } public function description(): string { - return 'Migrates Polls\' tables to the current schema'; - } - - /** - * This method is called before the schema change. - * All the existing calls are necessary to prepare the database for the migration. - * Main steps: - * 1. Make sure that no nullish values are used for poll_id and group_id in the share table - * 2. Remove all orphaned records which have no relation to a poll group (shares) or a poll (all) - * 3. Remove all duplicate records based on unique index definition - * 4. Tidy the watch table by removing all entries which are older than now - * - * @param IOutput $output - * @param \Closure $schemaClosure - * @param array $options - * @return void - */ - public function preSchemaChange(IOutput $output, \Closure $schemaClosure, array $options): void { - $this->output = $output; - $this->logInfo('Prepare migration'); - - // remove foreign keys and unique indices from the share table in preparation of fixing nullish values - $this->indexManager->createSchema(); // Let the indexManager use it's own schema - $message = $this->indexManager->removeUniqueIndicesFromTable(Share::TABLE); - $this->logInfo($message, 'preMigration: '); - $message = $this->indexManager->removeForeignKeysFromTable(Share::TABLE); - $this->logInfo($message, 'preMigration: '); - $this->indexManager->migrateToSchema(); - - // fix nullish values in poll_id and group_id and set 0 in case of null - $message = $this->tableManager->fixNullishShares(); - $this->logInfo($message, 'postMigration: '); - - $message = $this->tableManager->tidyWatchTable(time()); - $this->logInfo($message, 'preMigration: '); + return 'Does not do anything'; } /** @@ -86,88 +52,6 @@ public function preSchemaChange(IOutput $output, \Closure $schemaClosure, array * @return ISchemaWrapper|null */ public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options): ?ISchemaWrapper { - $this->output = $output; - $this->schema = $schemaClosure(); - $this->tableManager->setConnection($this->connection); - $this->tableManager->setSchema($this->schema); - - $message = $this->tableManager->createTables(); - $this->logInfo($message, 'runMigration: '); - - if (!($this->schema instanceof ISchemaWrapper)) { - return null; - } - - return $this->schema; - } - - /** - * This method is called after the schema change. - * It is used to perform any post-migration steps, such as migrating options to a hash. - * Main steps: - * 1. Ensure that option hashes are created correctly for options and votes - * - * @param IOutput $output - * @param \Closure $schemaClosure - * @param array $options - * @return void - */ - public function postSchemaChange(IOutput $output, \Closure $schemaClosure, array $options): void { - $this->output = $output; - $this->logInfo('Post migration steps'); - - // Clean up tables before creating indices and foreign keys - - // remove all orphaned records - $message = $this->tableManager->removeOrphaned(); - $this->logInfo($message, 'postMigration: '); - - // ensure correct option hashes in options and votes - $message = $this->tableManager->updateHashes(); - $this->logInfo($message, 'postMigration: '); - - // remove all duplicate records which have to be unique - $message = $this->tableManager->deleteAllDuplicates(); - $this->logInfo($message, 'postMigration: '); - - // remove obsolete tables and columns - $message = $this->tableManager->removeObsoleteTables(); - $this->logInfo($message, 'postMigration: '); - - $this->tableManager->createSchema(); - $message = $this->tableManager->removeObsoleteColumns(); - $this->logInfo($message, 'postMigration: '); - $this->tableManager->migrateToSchema(); - - // now we can create the foreign keys and unique indices for the share table again - $this->indexManager->createSchema(); - $message = $this->indexManager->createForeignKeyConstraints(); - $this->logInfo($message, 'postMigration: '); - - $message = $this->indexManager->createUniqueIndices(); - $this->logInfo($message, 'postMigration: '); - - // skip creating optional indices and leave it to 'occ db:add-missing-indices' - $this->indexManager->migrateToSchema(); - } - - /** - * Logs the given message to the output. - * - * @param string|array $message The message to log, can be a string or an array of strings. - * @param string $prefix Optional prefix for the message, defaults to an empty string. - * @return void - */ - private function logInfo(string|array $message, string $prefix = ''): void { - if ($this->output) { - if (is_array($message)) { - foreach ($message as $msg) { - $this->output->info($prefix . 'Polls - ' . $msg); - } - } else { - $this->output->info($prefix . 'Polls - ' . $message); - } - } + return null; } - } diff --git a/lib/Migration/Version080301Date20250822182903.php b/lib/Migration/Version080301Date20250822182903.php index 6ec1b1a6e4..5e5cec52f3 100644 --- a/lib/Migration/Version080301Date20250822182903.php +++ b/lib/Migration/Version080301Date20250822182903.php @@ -26,7 +26,7 @@ public function __construct() { } public function name(): string { - return 'Replaceces Polls migration to version 8.3.0'; + return 'Replaces Polls migration to version 8.3.0'; } public function description(): string { diff --git a/lib/Migration/Version080303Date20250824090101.php b/lib/Migration/Version080303Date20250824090101.php index de15e84f23..227d51a8a7 100644 --- a/lib/Migration/Version080303Date20250824090101.php +++ b/lib/Migration/Version080303Date20250824090101.php @@ -26,7 +26,7 @@ public function __construct() { } public function name(): string { - return 'Replaceces Polls migration to version 8.3.0'; + return 'Replaces Polls migration to version 8.3.0'; } public function description(): string { From 0548360458f0070ea1b4473a1725ff565b768cc9 Mon Sep 17 00:00:00 2001 From: dartcafe Date: Fri, 12 Sep 2025 19:11:14 +0200 Subject: [PATCH 56/56] cs fix Signed-off-by: dartcafe --- lib/Migration/Version080301Date20250822153002.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/Migration/Version080301Date20250822153002.php b/lib/Migration/Version080301Date20250822153002.php index 76fad1b99c..96cdbb5cf9 100644 --- a/lib/Migration/Version080301Date20250822153002.php +++ b/lib/Migration/Version080301Date20250822153002.php @@ -8,7 +8,6 @@ namespace OCA\Polls\Migration; -use OCA\Polls\Db\Share; use OCA\Polls\Db\V4\IndexManager; use OCA\Polls\Db\V4\TableManager; use OCP\DB\ISchemaWrapper;