Compare commits

..

74 Commits

Author SHA1 Message Date
Git'Fellow 237f847a4d fix(session): Update last seen when user session is validated
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-04-06 18:24:16 +02:00
Nextcloud bot b012e5cc16 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-06 00:21:20 +00:00
Nextcloud bot 1afeb1c2d3 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-05 00:18:52 +00:00
Nextcloud bot 9a24eaa275 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-04 00:18:47 +00:00
github-actions[bot] fc18ce9cae Merge pull request #59414 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/lodash-4.18.1
chore(deps): Bump lodash from 4.17.23 to 4.18.1 in /build/frontend-legacy
2026-04-03 16:11:25 +00:00
nextcloud-command 137e94bec2 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-03 15:55:16 +00:00
dependabot[bot] 8c55673a25 chore(deps): Bump lodash in /build/frontend-legacy
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.23 to 4.18.1.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.23...4.18.1)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.18.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-03 17:47:41 +02:00
Ferdinand Thiessen 92e4c882fc Merge pull request #59415 from hamidout/fix/user-ldap-last-login-config-key
fix(user_ldap): fix lastLogin reading wrong appid and configkey
2026-04-03 15:00:44 +02:00
hamid b7d6822592 fix(user_ldap): fix lastLogin reading wrong appid and configkey
fetchDetails() was calling getValueInt($uid, 'user_ldap', 'email')
instead of getValueInt($uid, 'login', 'lastLogin'), causing lastLogin
to always return 0 for offline LDAP users.

Fixes #58421

Signed-off-by: hamid <hamid@webpick.net>
2026-04-03 13:06:49 +01:00
Nextcloud bot ae45f67a75 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-03 00:18:44 +00:00
Ferdinand Thiessen 521e61828f Merge pull request #59335 from mykh-hailo/fix/duplicate-dashboard-widget
fix: duplicate dashboard widget
2026-04-02 23:22:12 +02:00
mykh-hailo 708fa13428 fix: move sanitize directly to sanitizeLayout
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
2026-04-02 20:20:19 +02:00
mykh-hailo 5a8292fe43 fix: duplicate dashboard widget
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
2026-04-02 20:20:19 +02:00
Ferdinand Thiessen c0cab68f8b Merge pull request #59388 from nextcloud/fix/noid/files-search-default-limit
fix(file-search): use default limit to search query if not provided on request body
2026-04-02 20:13:40 +02:00
Git'Fellow 1a2d36af39 Merge pull request #59267 from nextcloud/backport/59262/master
fix(files_sharing): do not prevent share creation if password is enabled but not supported by the current share type
2026-04-02 17:35:23 +02:00
Joas Schilling 60d71a99e2 Merge pull request #59370 from nextcloud/docs/adapt-codeowners
docs(webhook_listeners): adapt codeowners
2026-04-02 12:15:47 +02:00
Joas Schilling 532ba405cf Merge pull request #59341 from nextcloud/3rdparty/upgrade-zipstreamer
chore(dependencies): upgrade zipstreamer in 3rdparty
2026-04-02 11:33:25 +02:00
John Molakvoæ ca3f77bea2 Merge pull request #58872 from nextcloud/fix/templatespath 2026-04-02 11:27:31 +02:00
Joas Schilling 95e94556e1 Merge pull request #59394 from nextcloud/bugfix/noid/dont-register-invalid-routes
fix(settings): Don't register invalid routes
2026-04-02 11:26:09 +02:00
Ferdinand Thiessen 28724fe496 Merge pull request #59365 from nextcloud/fix/default-values
fix(files_external): properly set default values for backend options
2026-04-02 11:04:06 +02:00
Git'Fellow f637e1c6a2 Merge pull request #59330 from nextcloud/btnOpenShare-2
fix: update email button text to 'Open shared item'
2026-04-02 11:03:43 +02:00
Salvatore Martire c5f4ac1253 chore(dependencies): upgrade zipstreamer in 3rdparty
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-04-02 10:44:10 +02:00
Joas Schilling baec1727b3 fix(settings): Don't register invalid routes
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-02 09:30:15 +02:00
nextcloud-command b3fa62fc3d chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-02 01:56:07 +00:00
Ferdinand Thiessen d3e5a764ba fix(files_external): properly set default values for backend options
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-02 03:47:33 +02:00
Ferdinand Thiessen 456684f138 Merge pull request #59362 from nextcloud/test/deprecations
test: resolve PHPUnit deprecation warning about `addMethods`
2026-04-02 03:46:55 +02:00
Nextcloud bot 04c12502d1 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-02 00:19:14 +00:00
nextcloud-command 1bbceea598 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-01 21:22:25 +00:00
skjnldsv 661739c9d7 fix(files_sharing): do not prevent share creation if password is enabled but not supported by the current share type
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
2026-04-01 21:20:21 +00:00
Ferdinand Thiessen 03c318d730 Merge pull request #58353 from nextcloud/refactor/55428/comments
refactor(comments): migrate to Vue 3
2026-04-01 20:49:24 +02:00
Cristian Scheid 3539476d12 fix(file-search): use default limit to search query if not provided on request body
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-04-01 14:55:04 -03:00
nextcloud-command 78098c8325 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-01 13:41:02 +00:00
Ferdinand Thiessen e8c47cf3ec fix: properly load async components
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 14:54:43 +02:00
Ferdinand Thiessen 324ebd144c fix: add compatibility layer for apps expecting Vue 2 API
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 14:54:43 +02:00
Ferdinand Thiessen e26588d78c chore: fix ESLint errors
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 14:54:43 +02:00
Edward Ly c56ebcecb2 refactor(comments): migrate to Vue 3
Signed-off-by: Edward Ly <contact@edward.ly>
2026-04-01 14:54:43 +02:00
Edward Ly 3aa22804e1 refactor(comments): migrate to TypeScript
Signed-off-by: Edward Ly <contact@edward.ly>
2026-04-01 14:54:43 +02:00
Edward Ly 4edf863803 build(comments): move from frontend-legacy to frontend
Signed-off-by: Edward Ly <contact@edward.ly>
2026-04-01 14:54:43 +02:00
Jana Peper b87d71c4e5 docs(webhook_listeners): adapt codeowners
Signed-off-by: Jana Peper <jana.peper@nextcloud.com>
2026-04-01 14:48:50 +02:00
John Molakvoæ bb1ad1ca15 Merge pull request #59372 from nextcloud/carl/silent-warning-zip 2026-04-01 14:19:13 +02:00
Carl Schwan 7eb0ba9feb fix(zip): Fix warning when downloading Zip file
The HEAD request, create a GET subrequest which is not compatible with
the ZIP plugin since the ZIP plugin is directly streaming the content to
php://output, so we were sending the content in a HEAD request and
creating the ZIP twice and this was creating various warning in logs
too.

Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-04-01 12:19:43 +02:00
Joas Schilling 530b635cea Merge pull request #58986 from nextcloud/Jerome-Herbinet-activity_use_cached_mountpoints_flag_retroactivity_notice
activity_use_cached_mountpoints flag retroactivity notice
2026-04-01 08:03:38 +02:00
Nextcloud bot 84112d8fc7 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-01 00:19:19 +00:00
Ferdinand Thiessen f6379da3a1 Merge pull request #59294 from nextcloud/dragDropDirCreate
fix(filesDrop): drag-and-drop folder upload
2026-04-01 01:30:48 +02:00
github-actions[bot] 560ea9abe7 Merge pull request #59363 from nextcloud/dependabot/github_actions/github-actions-38c73435d9
chore(deps): Bump the github-actions group with 7 updates
2026-03-31 23:22:03 +00:00
Ferdinand Thiessen e0c1b74419 test: resolve PHPUnit deprecation warning about addMethods
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 01:12:52 +02:00
Ferdinand Thiessen 047a758a31 Merge pull request #58786 from nextcloud/fix/templates_enabled
fix(files): only disable template creation when both skeleton directories are empty
2026-04-01 00:40:25 +02:00
nextcloud-command d5cc1ad2ca chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-31 22:21:32 +00:00
dependabot[bot] 36e4de2552 chore(deps): Bump the github-actions group with 7 updates
Bumps the github-actions group with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [dorny/paths-filter](https://github.com/dorny/paths-filter) | `3.0.2` | `4.0.1` |
| [shivammathur/setup-php](https://github.com/shivammathur/setup-php) | `2.36.0` | `2.37.0` |
| [github/codeql-action](https://github.com/github/codeql-action) | `4.32.4` | `4.35.1` |
| [actions/setup-node](https://github.com/actions/setup-node) | `6.2.0` | `6.3.0` |
| [cypress-io/github-action](https://github.com/cypress-io/github-action) | `7.1.5` | `7.1.9` |
| [codecov/codecov-action](https://github.com/codecov/codecov-action) | `5.5.2` | `6.0.0` |
| [LizardByte/actions](https://github.com/lizardbyte/actions) | `2026.227.200013` | `2026.328.161128` |


Updates `dorny/paths-filter` from 3.0.2 to 4.0.1
- [Release notes](https://github.com/dorny/paths-filter/releases)
- [Changelog](https://github.com/dorny/paths-filter/blob/master/CHANGELOG.md)
- [Commits](https://github.com/dorny/paths-filter/compare/de90cc6fb38fc0963ad72b210f1f284cd68cea36...fbd0ab8f3e69293af611ebaee6363fc25e6d187d)

Updates `shivammathur/setup-php` from 2.36.0 to 2.37.0
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/44454db4f0199b8b9685a5d763dc37cbf79108e1...accd6127cb78bee3e8082180cb391013d204ef9f)

Updates `github/codeql-action` from 4.32.4 to 4.35.1
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/89a39a4e59826350b863aa6b6252a07ad50cf83e...c10b8064de6f491fea524254123dbe5e09572f13)

Updates `actions/setup-node` from 6.2.0 to 6.3.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/6044e13b5dc448c55e2357c09f80417699197238...53b83947a5a98c8d113130e565377fae1a50d02f)

Updates `cypress-io/github-action` from 7.1.5 to 7.1.9
- [Release notes](https://github.com/cypress-io/github-action/releases)
- [Changelog](https://github.com/cypress-io/github-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/github-action/compare/bc22e01685c56e89e7813fd8e26f33dc47f87e15...783cb3f07983868532cabaedaa1e6c00ff4786a8)

Updates `codecov/codecov-action` from 5.5.2 to 6.0.0
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/671740ac38dd9b0130fbe1cec585b89eea48d3de...57e3a136b779b570ffcdbf80b3bdc90e7fab3de2)

Updates `LizardByte/actions` from 2026.227.200013 to 2026.328.161128
- [Release notes](https://github.com/lizardbyte/actions/releases)
- [Commits](https://github.com/lizardbyte/actions/compare/70bb8d394d1c92f6113aeec6ae9cc959a5763d15...0affa4f7bcb27562658960eee840eff8ff844578)

---
updated-dependencies:
- dependency-name: dorny/paths-filter
  dependency-version: 4.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: shivammathur/setup-php
  dependency-version: 2.37.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: github/codeql-action
  dependency-version: 4.35.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/setup-node
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: cypress-io/github-action
  dependency-version: 7.1.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: LizardByte/actions
  dependency-version: 2026.328.161128
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-31 22:18:07 +00:00
Git'Fellow 5a9fa36bb1 fix(filesDrop): drag-and-drop folder upload directories
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-04-01 00:13:53 +02:00
Ferdinand Thiessen 9e9cccd9ec Merge pull request #58903 from nextcloud/chore/noid/update-workflows
chore(workflows): remove cypress cloud
2026-03-31 23:36:53 +02:00
Ferdinand Thiessen 533125defc Merge pull request #59342 from nextcloud/ci/cypress-contributors
ci(cypress): allow running on forks by removing Cypress cloud
2026-03-31 15:59:21 +02:00
Ferdinand Thiessen 6ba57a70a9 Merge pull request #59311 from nextcloud/jtr/feat-reminders-utc-headers
feat(files_reminders): add explicit UTC indicators to `list` command headers
2026-03-31 15:43:47 +02:00
Ferdinand Thiessen 266dfbce24 Merge pull request #58970 from nextcloud/fix/sftp-mtime
fix: manually set modified time to SFTP files after editing
2026-03-31 13:39:47 +02:00
Joas Schilling 820e0915e9 Merge pull request #59299 from AlessioDiPretoroAsdea/fix/suggestion-ticket-59266
dav: Fix fatal error when ORGANIZER is missing in CalDAV schedule
2026-03-31 13:30:14 +02:00
Stephan Orbaugh 22c75f5b25 Merge pull request #59317 from psimaker/fix/weather-status-missing-codes
fix(weather_status): add all missing met.no symbol codes to weatherOptions
2026-03-31 12:59:45 +02:00
Ferdinand Thiessen 0cd74df34e chore: update psalm baseline
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-31 12:36:06 +02:00
Hendrik Leidinger 6e88edb0a6 fix: make psalm and rector happy
Signed-off-by: Hendrik Leidinger <hendrik.leidinger@nextcloud.com>
2026-03-31 12:35:09 +02:00
Hendrik Leidinger 33e35afad2 fix: modified touch function of the SFTP storage to update mtimes instead
Signed-off-by: Hendrik Leidinger <hendrik.leidinger@nextcloud.com>
2026-03-31 12:35:08 +02:00
Hendrik Leidinger 6d26c71b48 fix: manually set modified time to SFTP files after editing
Signed-off-by: Hendrik Leidinger <hendrik.leidinger@nextcloud.com>
2026-03-31 12:35:08 +02:00
psimaker 19b0c911aa chore(weather_status): compile frontend assets
Signed-off-by: psimaker <psimaker@users.noreply.github.com>
2026-03-31 12:23:55 +02:00
psimaker af8cb33a40 fix(weather_status): add all missing met.no symbol codes to weatherOptions
Signed-off-by: psimaker <psimaker@users.noreply.github.com>
2026-03-31 12:12:33 +02:00
Ferdinand Thiessen d6e6525861 ci(cypress): allow running on forks by removing Cypress cloud
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-31 12:01:11 +02:00
Joas Schilling 5acf3878f3 Merge pull request #59318 from nextcloud/jtr/ci-perf-lint-php-cs-changes-bypass
ci: stop running `lint` in `lint-php-cs` unconditionally even if no changes
2026-03-31 11:56:26 +02:00
Joas Schilling 810d8b4c98 Merge pull request #59319 from nextcloud/jtr/ci-perf-static-code-analysis-changes-check
ci: add path filtering to static-code-analysis workflow
2026-03-31 11:55:19 +02:00
Git'Fellow 545a9c1c73 fix: update email button text to 'Open shared item'
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-03-31 11:27:58 +02:00
AlessioDiPretoroAsdea 85b851a7df fix(dav): Avoid fatal error for events without an organizer
Signed-off-by: AlessioDiPretoroAsdea <alessio.dipretoro@asdeahw.net>
2026-03-30 14:22:56 -04:00
Josh 330ae40ecf ci: add path filtering to static-code-analysis workflow
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-30 12:56:55 -04:00
Josh b400f1b93b ci: stop running lint in lint-php-cs unconditionally even if no changes
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-30 12:31:49 -04:00
Josh d89da91a56 feat(files_reminders): add explicit UTC indicators to list command headers
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-30 10:42:35 -04:00
Jérôme Herbinet b964ca5394 feat(doc): activity_use_cached_mountpoints flag retroactivity notice
Signed-off-by: Jérôme Herbinet <33763786+Jerome-Herbinet@users.noreply.github.com>
2026-03-17 09:37:37 +01:00
Anna Larch a77040f41e chore(workflows): remove cypress cloud
and allow regular cypress tests to run on forks (no secret leaked)
add consistent gating
 for changes
remove empty matrix option
skip performance workflow on forks without it looking like it's failing

Signed-off-by: Anna Larch <anna@nextcloud.com>
2026-03-12 20:26:51 +01:00
John Molakvoæ (skjnldsv) 5fdebf923c fix(lib): templates core path detection
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
2026-03-11 17:24:11 +01:00
Benjamin Frueh 4b203e5f7b fix: only skip template initialization when both skeletondirectory and templatedirectory are empty
Signed-off-by: Benjamin Frueh <benjamin.frueh@gmail.com>
2026-03-08 00:12:56 +01:00
924 changed files with 5764 additions and 10903 deletions
+1 -1
View File
@@ -55,7 +55,7 @@ package-lock.json @nextcloud/server-dependabot
/apps/user_ldap/appinfo/info.xml @come-nc @blizzz
/apps/user_status/appinfo/info.xml @Antreesy @nickvergessen
/apps/weather_status/appinfo/info.xml @julien-nc @juliusknorr
/apps/webhook_listeners/appinfo/info.xml @come-nc @julien-nc
/apps/webhook_listeners/appinfo/info.xml @janepie @julien-nc
/apps/workflowengine/appinfo/info.xml @blizzz @juliusknorr
# Files frontend expertise
+7 -4
View File
@@ -20,7 +20,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -58,7 +58,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -74,6 +74,9 @@ jobs:
autocheckers:
runs-on: ubuntu-latest-low
needs: changes
if: needs.changes.outputs.src != 'false'
strategy:
matrix:
php-versions: ['8.2']
@@ -88,7 +91,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -125,4 +128,4 @@ jobs:
steps:
- name: Summary status
run: if ${{ needs.autocheckers.result != 'success' || (needs.changes.outputs.src != 'false' && needs.autoloader.result != 'success') }}; then exit 1; fi
run: if ${{ needs.changes.outputs.src != 'false' && (needs.autocheckers.result != 'success' || needs.autoloader.result != 'success') }}; then exit 1; fi
@@ -21,7 +21,7 @@ jobs:
steps:
- name: Check requirement
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
+2 -2
View File
@@ -37,13 +37,13 @@ jobs:
persist-credentials: false
- name: Initialize CodeQL
uses: github/codeql-action/init@89a39a4e59826350b863aa6b6252a07ad50cf83e # v4.32.4
uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
config-file: ./.github/codeql-config.yml
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@89a39a4e59826350b863aa6b6252a07ad50cf83e # v4.32.4
uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
with:
category: "/language:${{matrix.language}}"
+1 -1
View File
@@ -124,7 +124,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.package-engines-versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.package-engines-versions.outputs.nodeVersion }}
cache: npm
+30 -19
View File
@@ -14,6 +14,7 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: none
pull-requests: read
# On pull requests and if the comment starts with `/update-3rdparty`
if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/update-3rdparty')
@@ -27,8 +28,25 @@ jobs:
comment-id: ${{ github.event.comment.id }}
reactions: '+1'
# issue_comment events carry no pull_request context in their payload, so we
# must fetch the PR via the API. This also gives us base.ref for free, avoiding
# a second API call. The GITHUB_TOKEN needs pull-requests:read (granted above).
- name: Get pull request metadata
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
id: get-pr
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const pull = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number,
});
core.setOutput('head_repo', pull.data.head.repo?.full_name ?? '');
core.setOutput('base_ref', pull.data.base.ref);
- name: Disabled on forks
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
if: steps.get-pr.outputs.head_repo != github.repository
run: |
echo 'Can not execute /update-3rdparty on forks'
exit 1
@@ -46,24 +64,17 @@ jobs:
ref: ${{ steps.comment-branch.outputs.head_ref }}
- name: Register server reference to fallback to master branch
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const baseRef = context.payload.pull_request.base.ref
if (baseRef === 'main' || baseRef === 'master') {
core.exportVariable('server_ref', 'master');
console.log('Setting server_ref to master');
} else {
const regex = /^stable(\d+)$/
const match = baseRef.match(regex)
if (match) {
core.exportVariable('server_ref', match[0]);
console.log('Setting server_ref to ' + match[0]);
} else {
console.log('Not based on master/main/stable*, so skipping pull 3rdparty command');
}
}
run: |
base_ref="${{ steps.get-pr.outputs.base_ref }}"
if [[ "$base_ref" == "main" || "$base_ref" == "master" ]]; then
echo "server_ref=master" >> "$GITHUB_ENV"
echo "Setting server_ref to master"
elif [[ "$base_ref" =~ ^stable[0-9]+$ ]]; then
echo "server_ref=$base_ref" >> "$GITHUB_ENV"
echo "Setting server_ref to $base_ref"
else
echo "Not based on master/main/stable*, so skipping pull 3rdparty command"
fi
- name: Setup git
run: |
+3 -14
View File
@@ -41,12 +41,6 @@ jobs:
PUPPETEER_SKIP_DOWNLOAD: true
steps:
- name: Disabled on forks
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
run: |
echo 'Can not run cypress on forks'
exit 1
- name: Checkout server
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
@@ -72,7 +66,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
@@ -160,7 +154,7 @@ jobs:
path: ./
- name: Set up node ${{ needs.init.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ needs.init.outputs.nodeVersion }}
@@ -171,15 +165,11 @@ jobs:
run: ./node_modules/cypress/bin/cypress install
- name: Run ${{ matrix.containers == 'component' && 'component' || 'E2E' }} cypress tests
uses: cypress-io/github-action@bc22e01685c56e89e7813fd8e26f33dc47f87e15 # v7.1.5
uses: cypress-io/github-action@783cb3f07983868532cabaedaa1e6c00ff4786a8 # v7.1.9
with:
# We already installed the dependencies in the init job
install: false
component: ${{ matrix.containers == 'component' }}
group: ${{ matrix.use-cypress-cloud && matrix.containers == 'component' && 'Run component' || matrix.use-cypress-cloud && 'Run E2E' || '' }}
# cypress env
ci-build-id: ${{ matrix.use-cypress-cloud && format('{0}-{1}', github.sha, github.run_number) || '' }}
tag: ${{ matrix.use-cypress-cloud && github.event_name || '' }}
env:
# Needs to be prefixed with CYPRESS_
CYPRESS_BRANCH: ${{ env.BRANCH }}
@@ -188,7 +178,6 @@ jobs:
# Needed for some specific code workarounds
TESTING: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
SPLIT: ${{ matrix.total-containers }}
SPLIT_INDEX: ${{ matrix.containers == 'component' && 0 || matrix.containers }}
SPLIT_RANDOM_SEED: ${{ github.run_id }}
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -81,7 +81,7 @@ jobs:
if [[ "${{ matrix.ftpd }}" == 'pure-ftpd' ]]; then docker run --name ftp -d --net host -e "PUBLICHOST=localhost" -e FTP_USER_NAME=test -e FTP_USER_PASS=test -e FTP_USER_HOME=/home/test -v /tmp/ftp:/home/test -v /tmp/ftp:/etc/pure-ftpd/passwd stilliard/pure-ftpd; fi
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -115,7 +115,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-ftp
+5 -5
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -80,7 +80,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -115,7 +115,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-s3
@@ -169,7 +169,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -197,7 +197,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-s3
+4 -4
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -73,11 +73,11 @@ jobs:
- name: Set up sftpd
run: |
sudo mkdir /tmp/sftp
sudo chown -R 0777 /tmp/sftp
sudo chmod -R 0777 /tmp/sftp
if [[ '${{ matrix.sftpd }}' == 'openssh' ]]; then docker run -p 2222:22 --name sftp -d -v /tmp/sftp:/home/test atmoz/sftp 'test:test:::data'; fi
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -104,7 +104,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-sftp
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -81,7 +81,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -116,7 +116,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-smb
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -76,7 +76,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -108,7 +108,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-webdav
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -70,7 +70,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -97,7 +97,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-generic
@@ -73,7 +73,7 @@ jobs:
fi
- name: Set up php 8.2
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: 8.2
+57 -57
View File
@@ -19,7 +19,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -52,69 +52,69 @@ jobs:
name: ${{ matrix.service }} (${{ matrix.endpoint }} endpoint) php${{ matrix.php-versions }}
steps:
- name: Checkout server
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
- name: Checkout server
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, redis, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
coverage: 'none'
ini-file: development
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, redis, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
coverage: 'none'
ini-file: development
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Python
uses: LizardByte/actions/actions/setup_python@70bb8d394d1c92f6113aeec6ae9cc959a5763d15 # v2026.227.200013
with:
python-version: '2.7'
- name: Set up Python
uses: LizardByte/actions/actions/setup_python@0affa4f7bcb27562658960eee840eff8ff844578 # v2026.328.161128
with:
python-version: '2.7'
- name: Set up CalDAVTester
run: |
git clone --depth=1 https://github.com/apple/ccs-caldavtester.git CalDAVTester
git clone --depth=1 https://github.com/apple/ccs-pycalendar.git pycalendar
- name: Set up CalDAVTester
run: |
git clone --depth=1 https://github.com/apple/ccs-caldavtester.git CalDAVTester
git clone --depth=1 https://github.com/apple/ccs-pycalendar.git pycalendar
- name: Set up Nextcloud
run: |
mkdir data
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
# disable the trashbin, so recurrent deletion of the same object works
./occ config:app:set dav calendarRetentionObligation --value=0
# Prepare users
OC_PASS=user01 ./occ user:add --password-from-env user01
OC_PASS=user02 ./occ user:add --password-from-env user02
# Prepare calendars
./occ dav:create-calendar user01 calendar
./occ dav:create-calendar user01 shared
./occ dav:create-calendar user02 calendar
# Prepare address books
./occ dav:create-addressbook user01 addressbook
./occ dav:create-addressbook user02 addressbook
- name: Set up Nextcloud
run: |
mkdir data
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
# disable the trashbin, so recurrent deletion of the same object works
./occ config:app:set dav calendarRetentionObligation --value=0
# Prepare users
OC_PASS=user01 ./occ user:add --password-from-env user01
OC_PASS=user02 ./occ user:add --password-from-env user02
# Prepare calendars
./occ dav:create-calendar user01 calendar
./occ dav:create-calendar user01 shared
./occ dav:create-calendar user02 calendar
# Prepare address books
./occ dav:create-addressbook user01 addressbook
./occ dav:create-addressbook user02 addressbook
- name: Run Nextcloud
run: |
php -S localhost:8888 &
- name: Run Nextcloud
run: |
php -S localhost:8888 &
- name: Run CalDAVTester
run: |
cp "apps/dav/tests/testsuits/caldavtest/serverinfo-${{ matrix.endpoint }}${{ matrix.endpoint == 'old' && (matrix.service == 'CardDAV' && '-carddav' || '-caldav') || '' }}-endpoint.xml" "apps/dav/tests/testsuits/caldavtest/serverinfo.xml"
pushd CalDAVTester
PYTHONPATH="../pycalendar/src" python testcaldav.py --print-details-onfail --basedir "../apps/dav/tests/testsuits/caldavtest" -o cdt.txt \
"${{ matrix.service }}/current-user-principal.xml" \
"${{ matrix.service }}/sync-report.xml" \
${{ matrix.endpoint == 'new' && format('{0}/sharing-{1}.xml', matrix.service, matrix.service == 'CalDAV' && 'calendars' || 'addressbooks') || ';' }}
popd
- name: Run CalDAVTester
run: |
cp "apps/dav/tests/testsuits/caldavtest/serverinfo-${{ matrix.endpoint }}${{ matrix.endpoint == 'old' && (matrix.service == 'CardDAV' && '-carddav' || '-caldav') || '' }}-endpoint.xml" "apps/dav/tests/testsuits/caldavtest/serverinfo.xml"
pushd CalDAVTester
PYTHONPATH="../pycalendar/src" python testcaldav.py --print-details-onfail --basedir "../apps/dav/tests/testsuits/caldavtest" -o cdt.txt \
"${{ matrix.service }}/current-user-principal.xml" \
"${{ matrix.service }}/sync-report.xml" \
${{ matrix.endpoint == 'new' && format('{0}/sharing-{1}.xml', matrix.service, matrix.service == 'CalDAV' && 'calendars' || 'addressbooks') || ';' }}
popd
- name: Print Nextcloud logs
if: always()
run: |
cat data/nextcloud.log
- name: Print Nextcloud logs
if: always()
run: |
cat data/nextcloud.log
caldav-integration-summary:
permissions:
+2 -2
View File
@@ -19,7 +19,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -58,7 +58,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
+2 -3
View File
@@ -19,7 +19,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -82,7 +82,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -95,7 +95,6 @@ jobs:
- name: Wait for S3
run: |
sleep 10
curl -f -m 1 --retry-connrefused --retry 10 --retry-delay 10 http://localhost:9000/minio/health/ready
- name: Set up Nextcloud
+2 -2
View File
@@ -25,7 +25,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -121,7 +121,7 @@ jobs:
ref: ${{ matrix.activity-versions }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
+2 -2
View File
@@ -28,7 +28,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -68,7 +68,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
+5 -2
View File
@@ -25,7 +25,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -44,6 +44,9 @@ jobs:
lint:
runs-on: ubuntu-latest
needs: changes
if: needs.changes.outputs.src != 'false'
name: php-cs
steps:
@@ -53,7 +56,7 @@ jobs:
persist-credentials: false
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: 8.2
+2 -2
View File
@@ -23,7 +23,7 @@ jobs:
outputs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -58,7 +58,7 @@ jobs:
persist-credentials: false
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
+44 -1
View File
@@ -18,9 +18,37 @@ concurrency:
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-latest-low
permissions:
contents: read
pull-requests: read
outputs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/**'
- '**/src/**'
- '**/appinfo/info.xml'
- 'package.json'
- 'package-lock.json'
- '**.css'
- '**.scss'
- '**.vue'
lint:
runs-on: ubuntu-latest
needs: changes
if: needs.changes.outputs.src != 'false'
name: stylelint
steps:
@@ -37,7 +65,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
@@ -51,3 +79,18 @@ jobs:
- name: Lint
run: npm run stylelint
summary:
permissions:
contents: none
runs-on: ubuntu-latest-low
needs: [changes, lint]
if: always()
# This is the summary, we just avoid to rename it so that branch protection rules still match
name: stylelint
steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.lint.result != 'success' }}; then exit 1; fi
+2 -2
View File
@@ -29,7 +29,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -71,7 +71,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
+3 -6
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -70,7 +70,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
@@ -83,14 +83,11 @@ jobs:
run: |
npm ci
# - name: Test
# run: npm run test --if-present
- name: Test and process coverage
run: npm run test:coverage
- name: Collect coverage
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./coverage/lcov.info,./coverage/legacy/lcov.info
+2 -2
View File
@@ -28,7 +28,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -68,7 +68,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
+1 -1
View File
@@ -49,7 +49,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -85,7 +85,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -117,7 +117,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-azure
+3 -4
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -86,7 +86,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -111,7 +111,6 @@ jobs:
- name: Wait for S3
run: |
sleep 10
curl -f -m 1 --retry-connrefused --retry 10 --retry-delay 10 http://localhost:9000/minio/health/ready
- name: PHPUnit
@@ -123,7 +122,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-s3
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -83,7 +83,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -113,7 +113,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-swift
+1 -1
View File
@@ -31,7 +31,7 @@ jobs:
persist-credentials: false
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: '8.2'
+8 -7
View File
@@ -15,7 +15,13 @@ jobs:
performance-testing:
runs-on: ubuntu-latest
if: ${{ github.repository_owner != 'nextcloud-gmbh' }}
# Skip entirely on fork PRs so the job result is 'skipped' rather than
# 'failure'. The profiler action uses github.event.pull_request.head.repo.clone_url
# and GITHUB_TOKEN in ways that do not work reliably from forks, and a
# clean skip is far less confusing for contributors than a mid-run error.
if: >-
github.repository_owner != 'nextcloud-gmbh' &&
github.event.pull_request.head.repo.full_name == github.repository
permissions:
pull-requests: write
@@ -28,11 +34,6 @@ jobs:
name: performance-${{ matrix.php-versions }}
steps:
- name: Disabled on forks
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
run: |
echo 'Can not run performance tests on forks'
exit 1
- name: Checkout server before PR
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -42,7 +43,7 @@ jobs:
ref: ${{ github.event.pull_request.base.ref }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
+3 -3
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -98,7 +98,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -132,7 +132,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-mariadb
+3 -3
View File
@@ -28,7 +28,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -78,7 +78,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -104,7 +104,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-memcached
+3 -3
View File
@@ -28,7 +28,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -127,7 +127,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -162,7 +162,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-mysql
+3 -3
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -98,7 +98,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -132,7 +132,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-mysql
+3 -3
View File
@@ -30,7 +30,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -81,7 +81,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -110,7 +110,7 @@ jobs:
- name: Upload nodb code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.nodb.xml
flags: phpunit-nodb
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -78,7 +78,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -104,7 +104,7 @@ jobs:
curl -f -m 1 --retry-connrefused --retry 10 --retry-delay 10 http://localhost:9000/minio/health/ready
- name: PHPUnit
run: composer run test:db
run: composer run test:db -- --log-junit junit.xml
- name: S3 logs
if: always()
+3 -3
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -105,7 +105,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -132,7 +132,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-oci
+3 -3
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -98,7 +98,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -127,7 +127,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-postgres
+3 -3
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -81,7 +81,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -114,7 +114,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-sqlite
+1 -1
View File
@@ -37,7 +37,7 @@ jobs:
ref: ${{ github.event.repository.default_branch }}
- name: Set up php${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
with:
php-version: ${{ matrix.php-versions }}
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
with:
php-version: '8.2'
extensions: apcu,ctype,curl,dom,fileinfo,ftp,gd,imagick,intl,json,ldap,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
+65 -11
View File
@@ -21,10 +21,35 @@ concurrency:
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-latest-low
outputs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/**'
- '3rdparty/**'
- '**/appinfo/**'
- '**/lib/**'
- '**/templates/**'
- 'vendor/**'
- 'vendor-bin/**'
- 'composer.json'
- 'composer.lock'
- '**.php'
static-code-analysis:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
steps:
- name: Checkout
@@ -34,7 +59,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: '8.2'
@@ -56,7 +81,8 @@ jobs:
static-code-analysis-security:
runs-on: ubuntu-latest
if: ${{ github.repository_owner != 'nextcloud-gmbh' }}
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.repository_owner != 'nextcloud-gmbh' }}
permissions:
security-events: write
@@ -69,7 +95,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: '8.2'
@@ -88,14 +114,15 @@ jobs:
- name: Upload Security Analysis results to GitHub
if: always()
uses: github/codeql-action/upload-sarif@89a39a4e59826350b863aa6b6252a07ad50cf83e # v3
uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v3
with:
sarif_file: results.sarif
static-code-analysis-ocp:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
steps:
- name: Checkout
@@ -105,7 +132,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: '8.2'
@@ -127,7 +154,8 @@ jobs:
static-code-analysis-ncu:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
steps:
- name: Checkout
@@ -137,7 +165,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: '8.2'
@@ -155,7 +183,8 @@ jobs:
static-code-analysis-strict:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
steps:
- name: Checkout
@@ -165,7 +194,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
with:
php-version: '8.2'
extensions: ctype,curl,dom,fileinfo,gd,imagick,intl,json,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
@@ -178,3 +207,28 @@ jobs:
- name: Psalm
run: composer run psalm:strict -- --threads=1 --monochrome --no-progress --output-format=github
summary:
permissions:
contents: none
runs-on: ubuntu-latest-low
needs: [changes, static-code-analysis, static-code-analysis-security, static-code-analysis-ocp, static-code-analysis-ncu, static-code-analysis-strict]
if: always()
name: static-code-analysis-summary
steps:
- name: Summary status
run: |
if ${{ needs.changes.outputs.src != 'false' && (
needs.static-code-analysis-security.result != 'success' ||
(github.event_name != 'push' && (
needs.static-code-analysis.result != 'success' ||
needs.static-code-analysis-ocp.result != 'success' ||
needs.static-code-analysis-ncu.result != 'success' ||
needs.static-code-analysis-strict.result != 'success'
))
) }}; then
exit 1
fi
@@ -115,7 +115,7 @@ jobs:
committer: GitHub <noreply@github.com>
author: nextcloud-command <nextcloud-command@users.noreply.github.com>
signoff: true
branch: "automated/noid/${{ matrix.branches }}-update-min-supported-desktop-version"
branch: "automated/noid/update-min-supported-desktop-version"
title: "chore: Update minimum supported desktop version to ${{ steps.extract-version.outputs.VERSION }}"
base: "master"
body: |
+2 -2
View File
@@ -10,14 +10,14 @@ OC.L10N.register(
"{author} commented on {file}" : "{author} reageerde op {file}",
"<strong>Comments</strong> for files" : "<strong>Reacties</strong> voor bestanden",
"Files" : "Bestanden",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Je werd genoemd op \"{file}\", in een opmerking van een account dat intussen is verwijderd",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Je werd genoemd op \"{file}\", in een reactie van een account dat intussen is verwijderd",
"{user} mentioned you in a comment on \"{file}\"" : "{user} noemde jou in een reactie op \"{file}\"",
"Files app plugin to add comments to files" : "Bestanden app plugin om reacties aan bestanden toe te voegen",
"Edit comment" : "Reactie bewerken",
"Delete comment" : "Reactie verwijderen",
"Cancel edit" : "Bewerking annuleren",
"New comment" : "Nieuwe reactie",
"Write a comment …" : "Schrijf een commentaar …",
"Write a comment …" : "Schrijf een reactie …",
"Post comment" : "Reactie plaatsen",
"@ for mentions, : for emoji, / for smart picker" : "@ voor vermeldingen, : voor emoji, / voor Smart Picker",
"Could not reload comments" : "Kon reactie niet opnieuw laden",
+2 -2
View File
@@ -8,14 +8,14 @@
"{author} commented on {file}" : "{author} reageerde op {file}",
"<strong>Comments</strong> for files" : "<strong>Reacties</strong> voor bestanden",
"Files" : "Bestanden",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Je werd genoemd op \"{file}\", in een opmerking van een account dat intussen is verwijderd",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Je werd genoemd op \"{file}\", in een reactie van een account dat intussen is verwijderd",
"{user} mentioned you in a comment on \"{file}\"" : "{user} noemde jou in een reactie op \"{file}\"",
"Files app plugin to add comments to files" : "Bestanden app plugin om reacties aan bestanden toe te voegen",
"Edit comment" : "Reactie bewerken",
"Delete comment" : "Reactie verwijderen",
"Cancel edit" : "Bewerking annuleren",
"New comment" : "Nieuwe reactie",
"Write a comment …" : "Schrijf een commentaar …",
"Write a comment …" : "Schrijf een reactie …",
"Post comment" : "Reactie plaatsen",
"@ for mentions, : for emoji, / for smart picker" : "@ voor vermeldingen, : voor emoji, / voor Smart Picker",
"Could not reload comments" : "Kon reactie niet opnieuw laden",
@@ -34,7 +34,8 @@ class LoadSidebarScripts implements IEventListener {
$this->commentsManager->load();
$this->initialState->provideInitialState('activityEnabled', $this->appManager->isEnabledForUser('activity'));
// Add comments sidebar tab script
// Add comments sidebar tab script/style
Util::addStyle(Application::APP_ID, 'comments-tab');
Util::addScript(Application::APP_ID, 'comments-tab', 'files');
}
}
@@ -7,7 +7,7 @@ import type { IFolder, IView } from '@nextcloud/files'
import { File, Permission } from '@nextcloud/files'
import { describe, expect, test, vi } from 'vitest'
import logger from '../logger.js'
import logger from '../logger.ts'
import { action } from './inlineUnreadCommentsAction.ts'
const view = {
@@ -8,8 +8,8 @@ import type { IFileAction } from '@nextcloud/files'
import CommentProcessingSvg from '@mdi/svg/svg/comment-processing.svg?raw'
import { getSidebar } from '@nextcloud/files'
import { n, t } from '@nextcloud/l10n'
import logger from '../logger.js'
import { isUsingActivityIntegration } from '../utils/activity.js'
import logger from '../logger.ts'
import { isUsingActivityIntegration } from '../utils/activity.ts'
export const action: IFileAction = {
id: 'comments-unread',
+27 -33
View File
@@ -4,46 +4,40 @@
*/
import type { INode } from '@nextcloud/files'
import type { App } from 'vue'
import moment from '@nextcloud/moment'
import { createPinia, PiniaVuePlugin } from 'pinia'
import Vue, { type ComponentPublicInstance } from 'vue'
import logger from './logger.js'
import { getComments } from './services/GetComments.js'
Vue.use(PiniaVuePlugin)
let ActivityTabPluginView
let ActivityTabPluginInstance
import { createPinia } from 'pinia'
import { createApp } from 'vue'
import logger from './logger.ts'
import { getComments } from './services/GetComments.ts'
/**
* Register the comments plugins for the Activity sidebar
*/
export function registerCommentsPlugins() {
let app: App
window.OCA.Activity.registerSidebarAction({
mount: async (el: HTMLElement, { node, reload }: { node: INode, reload: () => void }) => {
const pinia = createPinia()
if (!ActivityTabPluginView) {
if (!app) {
const { default: ActivityCommentAction } = await import('./views/ActivityCommentAction.vue')
// @ts-expect-error Types are broken for Vue2
ActivityTabPluginView = Vue.extend(ActivityCommentAction)
app = createApp(
ActivityCommentAction,
{
reloadCallback: reload,
resourceId: node.fileid,
},
)
}
ActivityTabPluginInstance = new ActivityTabPluginView({
el,
pinia,
propsData: {
reloadCallback: reload,
resourceId: node.fileid,
},
})
app.use(pinia)
app.mount(el)
logger.info('Comments plugin mounted in Activity sidebar action', { node })
},
unmount: () => {
// destroy previous instance if available
if (ActivityTabPluginInstance) {
ActivityTabPluginInstance.$destroy()
}
app?.unmount()
},
})
@@ -57,26 +51,26 @@ export function registerCommentsPlugins() {
)
logger.debug('Loaded comments', { node, comments })
const { default: CommentView } = await import('./views/ActivityCommentEntry.vue')
// @ts-expect-error Types are broken for Vue2
const CommentsViewObject = Vue.extend(CommentView)
return comments.map((comment) => ({
_CommentsViewInstance: undefined as ComponentPublicInstance | undefined,
_CommentsViewInstance: undefined as App | undefined,
timestamp: moment(comment.props?.creationDateTime).toDate().getTime(),
timestamp: Date.parse(comment.props?.creationDateTime as string | undefined ?? ''),
mount(element: HTMLElement, { reload }) {
this._CommentsViewInstance = new CommentsViewObject({
el: element,
propsData: {
const app = createApp(
CommentView,
{
comment,
resourceId: node.fileid,
reloadCallback: reload,
},
})
)
app.mount(element)
this._CommentsViewInstance = app
},
unmount() {
this._CommentsViewInstance?.$destroy()
this._CommentsViewInstance?.unmount()
},
}))
})
@@ -3,8 +3,8 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import logger from './logger.js'
import CommentsInstance from './services/CommentsInstance.js'
import logger from './logger.ts'
import CommentsInstance from './services/CommentsInstance.ts'
// Init Comments
if (window.OCA && !window.OCA.Comments) {
+15 -14
View File
@@ -13,7 +13,7 @@
<!-- Author -->
<NcAvatar
class="comment__avatar"
:display-name="actorDisplayName"
:displayName="actorDisplayName"
:user="actorId"
:size="32" />
</div>
@@ -26,7 +26,7 @@
<NcActions v-if="isOwnComment && id && !loading" class="comment__actions">
<template v-if="!editing">
<NcActionButton
close-after-click
closeAfterClick
@click="onEdit">
<template #icon>
<IconPencilOutline :size="20" />
@@ -35,7 +35,7 @@
</NcActionButton>
<NcActionSeparator />
<NcActionButton
close-after-click
closeAfterClick
@click="onDeleteWithUndo">
<template #icon>
<IconTrashCanOutline :size="20" />
@@ -60,7 +60,7 @@
v-else-if="creationDateTime"
class="comment__timestamp"
:timestamp="timestamp"
:ignore-seconds="true" />
:ignoreSeconds="true" />
</div>
<!-- Message editor -->
@@ -68,14 +68,14 @@
<div class="comment__editor-group">
<NcRichContenteditable
ref="editor"
:auto-complete="autoComplete"
v-model="localMessage"
:autoComplete
:contenteditable="!loading"
:label="editor ? t('comments', 'New comment') : t('comments', 'Edit comment')"
:placeholder="t('comments', 'Write a comment ')"
:model-value="localMessage"
:user-data="userData"
:userData
aria-describedby="tab-comments__editor-description"
@update:value="updateLocalMessage"
@update:modelValue="submitted = false"
@submit="onSubmit" />
<div class="comment__submit">
<NcButton
@@ -103,8 +103,8 @@
:class="{ 'comment__message--expanded': expanded }"
:text="richContent.message"
:arguments="richContent.mentions"
use-markdown
@click.native="onExpand" />
useMarkdown
@click="onExpand" />
</div>
</component>
</template>
@@ -113,6 +113,7 @@
import { getCurrentUser } from '@nextcloud/auth'
import { translate as t } from '@nextcloud/l10n'
import { mapStores } from 'pinia'
import { defineAsyncComponent } from 'vue'
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
import NcActions from '@nextcloud/vue/components/NcActions'
import NcActionSeparator from '@nextcloud/vue/components/NcActionSeparator'
@@ -125,12 +126,12 @@ import IconArrowRight from 'vue-material-design-icons/ArrowRight.vue'
import IconClose from 'vue-material-design-icons/Close.vue'
import IconPencilOutline from 'vue-material-design-icons/PencilOutline.vue'
import IconTrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'
import CommentMixin from '../mixins/CommentMixin.js'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.js'
import CommentMixin from '../mixins/CommentMixin.ts'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.ts'
// Dynamic loading
const NcRichContenteditable = () => import('@nextcloud/vue/components/NcRichContenteditable')
const NcRichText = () => import('@nextcloud/vue/components/NcRichText')
const NcRichContenteditable = defineAsyncComponent(() => import('@nextcloud/vue/components/NcRichContenteditable'))
const NcRichText = defineAsyncComponent(() => import('@nextcloud/vue/components/NcRichText'))
export default {
/* eslint vue/multi-word-component-names: "warn" */
+10 -16
View File
@@ -4,17 +4,13 @@
*/
import MessageReplyText from '@mdi/svg/svg/message-reply-text.svg?raw'
import { getCSPNonce } from '@nextcloud/auth'
import { registerSidebarTab } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import wrap from '@vue/web-component-wrapper'
import { createPinia, PiniaVuePlugin } from 'pinia'
import Vue from 'vue'
import { createPinia } from 'pinia'
import { defineCustomElement } from 'vue'
import { registerCommentsPlugins } from './comments-activity-tab.ts'
import { isUsingActivityIntegration } from './utils/activity.ts'
__webpack_nonce__ = getCSPNonce()
const tagName = 'comments_files-sidebar-tab'
if (isUsingActivityIntegration()) {
@@ -32,17 +28,15 @@ if (isUsingActivityIntegration()) {
async onInit() {
const { default: FilesSidebarTab } = await import('./views/FilesSidebarTab.vue')
Vue.use(PiniaVuePlugin)
Vue.mixin({ pinia: createPinia() })
const webComponent = wrap(Vue, FilesSidebarTab)
// In Vue 2, wrap doesn't support disabling shadow. Disable with a hack
Object.defineProperty(webComponent.prototype, 'attachShadow', {
value() { return this },
const FilesSidebarTabElement = defineCustomElement(FilesSidebarTab, {
configureApp(app) {
const pinia = createPinia()
app.use(pinia)
},
shadowRoot: false,
})
Object.defineProperty(webComponent.prototype, 'shadowRoot', {
get() { return this },
})
window.customElements.define(tagName, webComponent)
window.customElements.define(tagName, FilesSidebarTabElement)
},
})
}
@@ -5,11 +5,11 @@
import { showError, showUndo, TOAST_UNDO_TIMEOUT } from '@nextcloud/dialogs'
import { mapStores } from 'pinia'
import logger from '../logger.js'
import DeleteComment from '../services/DeleteComment.js'
import EditComment from '../services/EditComment.js'
import NewComment from '../services/NewComment.js'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.js'
import logger from '../logger.ts'
import DeleteComment from '../services/DeleteComment.ts'
import EditComment from '../services/EditComment.ts'
import NewComment from '../services/NewComment.ts'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.ts'
export default {
props: {
@@ -1,53 +0,0 @@
/**
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getCSPNonce } from '@nextcloud/auth'
import { n, t } from '@nextcloud/l10n'
import { createPinia, PiniaVuePlugin } from 'pinia'
import Vue from 'vue'
import CommentsApp from '../views/Comments.vue'
import logger from '../logger.js'
Vue.use(PiniaVuePlugin)
__webpack_nonce__ = getCSPNonce()
// Add translates functions
Vue.mixin({
data() {
return {
logger,
}
},
methods: {
t,
n,
},
})
export default class CommentInstance {
/**
* Initialize a new Comments instance for the desired type
*
* @param {string} resourceType the comments endpoint type
* @param {object} options the vue options (propsData, parent, el...)
*/
constructor(resourceType = 'files', options = {}) {
const pinia = createPinia()
// Merge options and set `resourceType` property
options = {
...options,
propsData: {
...(options.propsData ?? {}),
resourceType,
},
pinia,
}
// Init Comments component
const View = Vue.extend(CommentsApp)
return new View(options)
}
}
@@ -0,0 +1,94 @@
/*!
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { App, ComponentPublicInstance } from 'vue'
import { n, t } from '@nextcloud/l10n'
import { createPinia } from 'pinia'
import { createApp } from 'vue'
import CommentsApp from '../views/CommentsApp.vue'
import logger from '../logger.ts'
export interface CommentsInstanceOptions {
el?: HTMLElement
props?: Record<string, unknown>
/** @deprecated use `props` instead */
propsData?: Record<string, unknown>
}
export default class CommentInstance {
private app: App
private instance: ComponentPublicInstance<typeof CommentsApp> | undefined
/**
* Initialize a new Comments instance for the desired type
*
* @param resourceType - The comments endpoint type
* @param options - The vue options (props, parent, el...)
*/
constructor(resourceType = 'files', options: CommentsInstanceOptions = {}) {
const pinia = createPinia()
this.app = createApp(
CommentsApp,
{
...(options.propsData ?? {}),
...(options.props ?? {}),
resourceType,
},
)
// Add translates functions
this.app.mixin({
data() {
return {
logger,
}
},
methods: {
t,
n,
},
})
this.app.use(pinia)
if (options.el) {
this.instance = this.app.mount(options.el)
}
}
/**
* Mount the Comments instance to a new element.
*
* @param el - The element to mount the instance on
*/
$mount(el: HTMLElement | string) {
if (this.instance) {
this.app.unmount()
}
this.instance = this.app.mount(el)
}
/**
* Unmount the Comments instance from the DOM and destroy it.
*/
$unmount() {
this.app.unmount()
this.instance = undefined
}
/**
* Update the current resource id.
*
* @param id - The new resource id to load the comments for
*/
update(id: string | number) {
if (this.instance) {
this.instance.update(id)
}
}
}
@@ -5,7 +5,7 @@
import { getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'
import { createClient } from 'webdav'
import { getRootPath } from '../utils/davUtils.js'
import { getRootPath } from '../utils/davUtils.ts'
// init webdav client
const client = createClient(getRootPath())
@@ -3,16 +3,16 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import client from './DavClient.js'
import client from './DavClient.ts'
/**
* Delete a comment
*
* @param {string} resourceType the resource type
* @param {number} resourceId the resource ID
* @param {number} commentId the comment iD
* @param resourceType the resource type
* @param resourceId the resource ID
* @param commentId the comment iD
*/
export default async function(resourceType, resourceId, commentId) {
export default async function(resourceType: string, resourceId: number, commentId: number) {
const commentPath = ['', resourceType, resourceId, commentId].join('/')
// Fetch newly created comment data
@@ -3,17 +3,17 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import client from './DavClient.js'
import client from './DavClient.ts'
/**
* Edit an existing comment
*
* @param {string} resourceType the resource type
* @param {number} resourceId the resource ID
* @param {number} commentId the comment iD
* @param {string} message the message content
* @param resourceType the resource type
* @param resourceId the resource ID
* @param commentId the comment iD
* @param message the message content
*/
export default async function(resourceType, resourceId, commentId, message) {
export default async function(resourceType: string, resourceId: number, commentId: number, message: string) {
const commentPath = ['', resourceType, resourceId, commentId].join('/')
return await client.customRequest(commentPath, {
+1 -1
View File
@@ -8,7 +8,7 @@ import type { DAVResult, FileStat, ResponseDataDetailed } from 'webdav'
import { parseXML } from 'webdav'
import { processResponsePayload } from 'webdav/dist/node/response.js'
import { prepareFileFromProps } from 'webdav/dist/node/tools/dav.js'
import client from './DavClient.js'
import client from './DavClient.ts'
export const DEFAULT_LIMIT = 20
@@ -5,24 +5,24 @@
import { getCurrentUser } from '@nextcloud/auth'
import axios from '@nextcloud/axios'
import { getRootPath } from '../utils/davUtils.js'
import { decodeHtmlEntities } from '../utils/decodeHtmlEntities.js'
import client from './DavClient.js'
import { getRootPath } from '../utils/davUtils.ts'
import { decodeHtmlEntities } from '../utils/decodeHtmlEntities.ts'
import client from './DavClient.ts'
/**
* Retrieve the comments list
*
* @param {string} resourceType the resource type
* @param {number} resourceId the resource ID
* @param {string} message the message
* @return {object} the new comment
* @param resourceType the resource type
* @param resourceId the resource ID
* @param message the message
* @return The new comment
*/
export default async function(resourceType, resourceId, message) {
export default async function(resourceType: string, resourceId: number, message: string) {
const resourcePath = ['', resourceType, resourceId].join('/')
const response = await axios.post(getRootPath() + resourcePath, {
actorDisplayName: getCurrentUser().displayName,
actorId: getCurrentUser().uid,
actorDisplayName: getCurrentUser()!.displayName,
actorId: getCurrentUser()!.uid,
actorType: 'users',
creationDateTime: (new Date()).toUTCString(),
message,
+1 -1
View File
@@ -5,7 +5,7 @@
import type { Response } from 'webdav'
import client from './DavClient.js'
import client from './DavClient.ts'
/**
* Mark comments older than the date timestamp as read
@@ -6,20 +6,20 @@
/**
* Creates a cancelable axios 'request object'.
*
* @param {Function} request the axios promise request
* @return {object}
* @param request the axios promise request
* @return
*/
function cancelableRequest(request) {
function cancelableRequest(request: (url: string, options?: Record<string, unknown>) => Promise<unknown>) {
const controller = new AbortController()
const signal = controller.signal
/**
* Execute the request
*
* @param {string} url the url to send the request to
* @param {object} [options] optional config for the request
* @param url the url to send the request to
* @param [options] optional config for the request
*/
const fetch = async function(url, options) {
const fetch = async function(url: string, options?: Record<string, unknown>) {
const response = await request(
url,
{ signal, ...options },
@@ -4,10 +4,10 @@
*/
/**
* @param {any} value -
* @param {any} passes -
* @param value - the string to decode
* @param passes - the number of times to decode the string, default is 1
*/
export function decodeHtmlEntities(value, passes = 1) {
export function decodeHtmlEntities(value: string, passes = 1) {
const parser = new DOMParser()
let decoded = value
for (let i = 0; i < passes; i++) {
@@ -6,11 +6,11 @@
<template>
<Comment
v-bind="editorData"
:auto-complete="autoComplete"
:resource-type="resourceType"
:autoComplete="autoComplete"
:resourceType="resourceType"
:editor="true"
:user-data="userData"
:resource-id="resourceId"
:userData="userData"
:resourceId="resourceId"
class="comments-action"
@new="onNewComment" />
</template>
@@ -20,8 +20,8 @@ import { showError } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
import { defineComponent } from 'vue'
import Comment from '../components/Comment.vue'
import logger from '../logger.js'
import CommentView from '../mixins/CommentView.js'
import logger from '../logger.ts'
import CommentView from '../mixins/CommentView.ts'
export default defineComponent({
components: {
@@ -8,11 +8,11 @@
ref="comment"
tag="li"
v-bind="comment.props"
:auto-complete="autoComplete"
:resource-type="resourceType"
:autoComplete="autoComplete"
:resourceType="resourceType"
:message="commentMessage"
:resource-id="resourceId"
:user-data="genMentionsData(comment.props.mentions)"
:resourceId="resourceId"
:userData="genMentionsData(comment.props.mentions)"
class="comments-activity"
@delete="reloadCallback()" />
</template>
@@ -11,11 +11,11 @@
<!-- Editor -->
<Comment
v-bind="editorData"
:auto-complete="autoComplete"
:resource-type="resourceType"
:editor="true"
:user-data="userData"
:resource-id="currentResourceId"
editor
:autoComplete
:resourceType
:userData
:resourceId="currentResourceId"
class="comments__writer"
@new="onNewComment" />
@@ -33,13 +33,13 @@
<Comment
v-for="comment in comments"
:key="comment.props.id"
v-model="comment.props.message"
tag="li"
v-bind="comment.props"
:auto-complete="autoComplete"
:resource-type="resourceType"
:message.sync="comment.props.message"
:resource-id="currentResourceId"
:user-data="genMentionsData(comment.props.mentions)"
:autoComplete
:resourceType
:resourceId="currentResourceId"
:userData="genMentionsData(comment.props.mentions)"
class="comments__list"
@delete="onDelete" />
</ul>
@@ -79,15 +79,14 @@ import IconAlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline
import IconMessageReplyTextOutline from 'vue-material-design-icons/MessageReplyTextOutline.vue'
import IconRefresh from 'vue-material-design-icons/Refresh.vue'
import Comment from '../components/Comment.vue'
import logger from '../logger.js'
import logger from '../logger.ts'
import CommentView from '../mixins/CommentView.ts'
import { DEFAULT_LIMIT, getComments } from '../services/GetComments.ts'
import { markCommentsAsRead } from '../services/ReadComments.ts'
import cancelableRequest from '../utils/cancelableRequest.js'
import cancelableRequest from '../utils/cancelableRequest.ts'
export default {
/* eslint vue/multi-word-component-names: "warn" */
name: 'Comments',
name: 'CommentsApp',
components: {
Comment,
@@ -104,6 +103,8 @@ export default {
mixins: [CommentView],
expose: ['update'],
data() {
return {
error: '',
+4 -4
View File
@@ -7,7 +7,7 @@
import type { IFolder, INode, IView } from '@nextcloud/files'
import { computed } from 'vue'
import Comments from './Comments.vue'
import CommentsApp from './CommentsApp.vue'
const props = defineProps<{
node?: INode
@@ -24,9 +24,9 @@ const resourceId = computed(() => props.node?.fileid)
</script>
<template>
<Comments
<CommentsApp
v-if="resourceId !== undefined"
:key="resourceId"
:resource-id="resourceId"
resource-type="files" />
:resourceId="resourceId"
resourceType="files" />
</template>
+1 -1
View File
@@ -19,7 +19,7 @@ OC.L10N.register(
"Customize" : "Aanpassen",
"Edit widgets" : "Widgets bewerken",
"Get more widgets from the App Store" : "Haal meer widgets op uit de App Store",
"Weather service" : "Weerberichten",
"Weather service" : "Weer dienst",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Voor je privacy worden de weergegevens namens jou opgevraagd door je {productName} server, zodat de weer dienst geen persoonlijke informatie ontvangt.",
"Weather data from Met.no" : "Weerbericht via Met.no",
"geocoding with Nominatim" : "geocoding met Nominatim",
+1 -1
View File
@@ -17,7 +17,7 @@
"Customize" : "Aanpassen",
"Edit widgets" : "Widgets bewerken",
"Get more widgets from the App Store" : "Haal meer widgets op uit de App Store",
"Weather service" : "Weerberichten",
"Weather service" : "Weer dienst",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Voor je privacy worden de weergegevens namens jou opgevraagd door je {productName} server, zodat de weer dienst geen persoonlijke informatie ontvangt.",
"Weather data from Met.no" : "Weerbericht via Met.no",
"geocoding with Nominatim" : "geocoding met Nominatim",
@@ -202,6 +202,7 @@ class DashboardApiController extends OCSController {
#[NoAdminRequired]
#[ApiRoute(verb: 'POST', url: '/api/v3/layout')]
public function updateLayout(array $layout): DataResponse {
$layout = $this->service->sanitizeLayout($layout);
$this->userConfig->setValueString($this->userId, 'dashboard', 'layout', implode(',', $layout));
return new DataResponse(['layout' => $layout]);
}
@@ -31,12 +31,30 @@ class DashboardService {
*/
public function getLayout(): array {
$systemDefault = $this->appConfig->getAppValueString('layout', 'recommendations,spreed,mail,calendar');
return array_values(array_filter(
return $this->sanitizeLayout(
explode(',', $this->userConfig->getValueString($this->userId, 'dashboard', 'layout', $systemDefault)),
fn (string $value) => $value !== '')
);
}
/**
* @param list<string> $layout
* @return list<string>
*/
public function sanitizeLayout(array $layout): array {
$seen = [];
$result = [];
foreach ($layout as $value) {
if ($value === '' || isset($seen[$value])) {
continue;
}
$seen[$value] = true;
$result[] = $value;
}
return $result;
}
/**
* @return list<string>
*/
@@ -44,6 +44,25 @@ class DashboardServiceTest extends TestCase {
);
}
public function testGetLayoutRemovesEmptyAndDuplicateEntries(): void {
$this->appConfig->method('getAppValueString')
->with('layout', 'recommendations,spreed,mail,calendar')
->willReturn('recommendations,spreed,mail,calendar');
$this->userConfig->method('getValueString')
->with('alice', 'dashboard', 'layout', 'recommendations,spreed,mail,calendar')
->willReturn('spreed,,mail,mail,calendar,spreed');
$layout = $this->service->getLayout();
$this->assertSame(['spreed', 'mail', 'calendar'], $layout);
}
public function testSanitizeLayoutRemovesEmptyAndDuplicateEntries(): void {
$layout = $this->service->sanitizeLayout(['files', 'calendar', 'files', '', 'mail', 'calendar']);
$this->assertSame(['files', 'calendar', 'mail'], $layout);
}
public function testGetBirthdate(): void {
$user = $this->createMock(IUser::class);
$this->userManager->method('get')
+3
View File
@@ -204,6 +204,8 @@ OC.L10N.register(
"Could not rename part file to final file, canceled by hook" : "Ezin izan da zati-fitxategiaren izena aldatu azken fitxategira, kakoak bertan behera utzi du",
"Could not rename part file to final file" : "Ezin izan da zati-fitxategia azken fitxategira aldatu",
"Failed to check file size: %1$s" : "Ezin izan da egiaztatu fitxategiaren tamaina:%1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia badagoela dirudi",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia ez dagoela dirudi",
"Encryption not ready: %1$s" : "Enkriptatzea ez dago prest:%1$s",
"Failed to open file: %1$s" : "Ezin izan da fitxategia ireki:%1$s",
"Failed to unlink: %1$s" : "Ezin izan da deskonektatu:%1$s",
@@ -220,6 +222,7 @@ OC.L10N.register(
"Completed on %s" : "%s-an osatua",
"Due on %s by %s" : "%s-(e)an epemuga %s-(e)k",
"Due on %s" : "%s-(e)an epemuga",
"This is an example contact" : "Hau kontaktu adibide bat da",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Ongi etorri Nextcloud Egutegira!\n\nHau gertaera erakusgarria da - aztertu plangintzaren malgutasuna Nextcloud Egutegiarekin nahi dituzun edizioak eginez!\n\nNextcloud Egutegia aukerarekin, hau egin dezakezu:\n- Sortu, editatu eta kudeatu gertaerak esfortzurik gabe.\n- Egutegi ugari sortu eta taldekideekin, lagunekin edo familiarekin partekatu.\n- Egiaztatu libre egotea eta bistaratu zure laneko orduak beste batzuei.\n- Aplikazio eta gailuekin arazorik gabe integratzea CalDAV bidez.\n- Zure esperientzia pertsonalizatu: gertaera errepikariak programatu, jakinarazpenak doitu eta bestelako ezarpenak.",
"Example event - open me!" : "Gertaera adibidea - ireki nazazu!",
"System Address Book" : "Sistemaren helbide-liburua",
+3
View File
@@ -202,6 +202,8 @@
"Could not rename part file to final file, canceled by hook" : "Ezin izan da zati-fitxategiaren izena aldatu azken fitxategira, kakoak bertan behera utzi du",
"Could not rename part file to final file" : "Ezin izan da zati-fitxategia azken fitxategira aldatu",
"Failed to check file size: %1$s" : "Ezin izan da egiaztatu fitxategiaren tamaina:%1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia badagoela dirudi",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia ez dagoela dirudi",
"Encryption not ready: %1$s" : "Enkriptatzea ez dago prest:%1$s",
"Failed to open file: %1$s" : "Ezin izan da fitxategia ireki:%1$s",
"Failed to unlink: %1$s" : "Ezin izan da deskonektatu:%1$s",
@@ -218,6 +220,7 @@
"Completed on %s" : "%s-an osatua",
"Due on %s by %s" : "%s-(e)an epemuga %s-(e)k",
"Due on %s" : "%s-(e)an epemuga",
"This is an example contact" : "Hau kontaktu adibide bat da",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Ongi etorri Nextcloud Egutegira!\n\nHau gertaera erakusgarria da - aztertu plangintzaren malgutasuna Nextcloud Egutegiarekin nahi dituzun edizioak eginez!\n\nNextcloud Egutegia aukerarekin, hau egin dezakezu:\n- Sortu, editatu eta kudeatu gertaerak esfortzurik gabe.\n- Egutegi ugari sortu eta taldekideekin, lagunekin edo familiarekin partekatu.\n- Egiaztatu libre egotea eta bistaratu zure laneko orduak beste batzuei.\n- Aplikazio eta gailuekin arazorik gabe integratzea CalDAV bidez.\n- Zure esperientzia pertsonalizatu: gertaera errepikariak programatu, jakinarazpenak doitu eta bestelako ezarpenak.",
"Example event - open me!" : "Gertaera adibidea - ireki nazazu!",
"System Address Book" : "Sistemaren helbide-liburua",
+1 -1
View File
@@ -148,7 +148,7 @@ OC.L10N.register(
"\"%1$s\" has been canceled" : "\"%1$s\" foi cancelado",
"Re: %1$s" : "Re: %1$s",
"%1$s has accepted your invitation" : "%1$s aceitou seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou provisoriamente seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou seu convite como tentativa",
"%1$s has declined your invitation" : "%1$s recusou seu convite",
"%1$s has responded to your invitation" : "%1$s respondeu ao seu convite",
"Invitation updated: %1$s" : "Convite atualizado: %1$s",
+1 -1
View File
@@ -146,7 +146,7 @@
"\"%1$s\" has been canceled" : "\"%1$s\" foi cancelado",
"Re: %1$s" : "Re: %1$s",
"%1$s has accepted your invitation" : "%1$s aceitou seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou provisoriamente seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou seu convite como tentativa",
"%1$s has declined your invitation" : "%1$s recusou seu convite",
"%1$s has responded to your invitation" : "%1$s respondeu ao seu convite",
"Invitation updated: %1$s" : "Convite atualizado: %1$s",
+1 -1
View File
@@ -765,7 +765,7 @@ EOF;
$addresses = $this->getAddressesForPrincipal($calendarNode->getOwner());
foreach ($vCal->VEVENT as $vevent) {
if (in_array($vevent->ORGANIZER->getNormalizedValue(), $addresses, true)) {
if (isset($vevent->ORGANIZER) && in_array($vevent->ORGANIZER->getNormalizedValue(), $addresses, true)) {
// User is an organizer => throw the exception
throw $e;
}
@@ -91,10 +91,11 @@ class ZipFolderPlugin extends ServerPlugin {
* It is possible to filter / limit the files that should be downloaded,
* either by passing (multiple) `X-NC-Files: the-file` headers
* or by setting a `files=JSON_ARRAY_OF_FILES` URL query.
*
* @return false|null
*/
public function handleDownload(Request $request, Response $response): ?bool {
public function handleDownload(Request $request, Response $response): ?false {
if ($request->getHeader('X-Sabre-Original-Method') === 'HEAD') {
return null;
}
$node = $this->tree->getNodeForPath($request->getPath());
if (!($node instanceof Directory)) {
// only handle directories
@@ -183,11 +184,12 @@ class ZipFolderPlugin extends ServerPlugin {
}
/**
* Tell sabre/dav not to trigger it's own response sending logic as the handleDownload will have already send the response
*
* @return false|null
* Tell sabre/dav not to trigger its own response sending logic as the handleDownload will have already sent the response
*/
public function afterDownload(Request $request, Response $response): ?bool {
public function afterDownload(Request $request, Response $response): ?false {
if ($request->getHeader('X-Sabre-Original-Method') === 'HEAD') {
return null;
}
$node = $this->tree->getNodeForPath($request->getPath());
if (!($node instanceof Directory)) {
// only handle directories
+2 -1
View File
@@ -343,6 +343,7 @@ class FileSearchBackend implements ISearchBackend {
}, $query->orderBy);
$limit = $query->limit;
$maxResults = $limit->maxResults !== 0 ? (int)$limit->maxResults : 100;
$offset = $limit->firstResult;
$limitHome = false;
@@ -370,7 +371,7 @@ class FileSearchBackend implements ISearchBackend {
return new SearchQuery(
$operators,
(int)$limit->maxResults,
$maxResults,
$offset,
$orders,
$this->user,
@@ -43,6 +43,14 @@ use Test\TestCase;
use Test\Traits\MountProviderTrait;
use Test\Traits\UserTrait;
/**
* Internal helper to mock legacy hook receiver.
*/
interface EventHandlerMock {
public function writeCallback(): void;
public function postWriteCallback(): void;
}
/**
* Class File
*
@@ -822,9 +830,7 @@ class FileTest extends TestCase {
$wasLockedPre = false;
$wasLockedPost = false;
$eventHandler = $this->getMockBuilder(\stdclass::class)
->addMethods(['writeCallback', 'postWriteCallback'])
->getMock();
$eventHandler = $this->createMock(EventHandlerMock::class);
// both pre and post hooks might need access to the file,
// so only shared lock is acceptable
@@ -97,7 +97,7 @@ class FileSearchBackendTest extends TestCase {
'name',
'foo'
),
0,
100,
0,
[],
$this->user
@@ -126,7 +126,7 @@ class FileSearchBackendTest extends TestCase {
'mimetype',
'foo'
),
0,
100,
0,
[],
$this->user
@@ -155,7 +155,7 @@ class FileSearchBackendTest extends TestCase {
'size',
10
),
0,
100,
0,
[],
$this->user
@@ -184,7 +184,7 @@ class FileSearchBackendTest extends TestCase {
'mtime',
10
),
0,
100,
0,
[],
$this->user
@@ -213,7 +213,7 @@ class FileSearchBackendTest extends TestCase {
'mimetype',
FileInfo::MIMETYPE_FOLDER
),
0,
100,
0,
[],
$this->user
+11 -1
View File
@@ -35,21 +35,30 @@ OC.L10N.register(
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan inte läsa denna filen, troligen är det en delad fil. Vänligen be ägaren att åter dela filen med dig.",
"Default Encryption Module" : "Standardmodul för kryptering",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Standardkrypteringsmodul för Nextcloud serverbaserad kryptering (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att\nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust.",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aktivering av det här alternativet krypterar alla filer som är lagrade på huvudlagringsplatsen, annars kommer bara filer på extern lagringsplats att krypteras",
"Encrypt the home storage" : "Kryptera alla filer i molnet",
"Disable recovery key" : "Inaktivera återställningsnyckel",
"Enable recovery key" : "Aktivera återställningsnyckel",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Återställningsnyckeln är en extra krypteringsnyckel som används för att kryptera filer. Den används för att återställa filer från ett konto om lösenordet glöms bort.",
"Recovery key password" : "Ange lösenord",
"Passwords fields do not match" : "Lösenorden matchar inte",
"Repeat recovery key password" : "Repetera lösenord",
"An error occurred while updating the recovery key settings. Please try again." : "Ett fel uppstod vid uppdateringen av inställningarna för återställningsnyckeln. Försök igen.",
"Change recovery key password" : "Ändra lösenordet för återställningsnyckeln",
"Old recovery key password" : "Gammalt lösenord",
"New recovery key password" : "Nytt lösenord",
"Repeat new recovery key password" : "Repetera lösenord",
"An error occurred while changing the recovery key password. Please try again." : "Ett fel uppstod när lösenordet för återställningsnyckeln skulle ändras. Försök igen.",
"Update private key password" : "Uppdatera lösenordet för den privata nyckeln",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "Lösenordet till din privata nyckel stämmer inte längre överens med ditt inloggningslösenord. Ändra lösenordet till din privata nyckel så att det blir detsamma som ditt nuvarande inloggningslösenord.",
"If you do not remember your old password you can ask your administrator to recover your files." : "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.",
"Old log-in password" : "Gammalt inloggningslösenord",
"Current log-in password" : "Nuvarande inloggningslösenord",
"Update" : "Uppdatera",
"Updating recovery keys. This can take some time…" : "Uppdaterar återställningsnycklar. Det kan ta en stund…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Om du aktiverar det här alternativet kan du återställa åtkomst till dina krypterade filer vid lösenordsförlust",
"Enable password recovery" : "Aktivera återställning av lösenord",
"Default encryption module" : "Krypteringsfunktion",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsappen är aktiverad men dina krypteringsnycklar är inte initialiserade, vänligen logga ut och logga in igen.",
"Basic encryption module" : "Kryptering",
@@ -63,6 +72,7 @@ OC.L10N.register(
"Update Private Key Password" : "Uppdatera lösenordet för din privata nyckel",
"Enable password recovery:" : "Aktivera lösenordsåterställning:",
"Enabled" : "Aktiverad",
"Disabled" : "Inaktiverad"
"Disabled" : "Inaktiverad",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att \nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust."
},
"nplurals=2; plural=(n != 1);");
+11 -1
View File
@@ -33,21 +33,30 @@
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan inte läsa denna filen, troligen är det en delad fil. Vänligen be ägaren att åter dela filen med dig.",
"Default Encryption Module" : "Standardmodul för kryptering",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Standardkrypteringsmodul för Nextcloud serverbaserad kryptering (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att\nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust.",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aktivering av det här alternativet krypterar alla filer som är lagrade på huvudlagringsplatsen, annars kommer bara filer på extern lagringsplats att krypteras",
"Encrypt the home storage" : "Kryptera alla filer i molnet",
"Disable recovery key" : "Inaktivera återställningsnyckel",
"Enable recovery key" : "Aktivera återställningsnyckel",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Återställningsnyckeln är en extra krypteringsnyckel som används för att kryptera filer. Den används för att återställa filer från ett konto om lösenordet glöms bort.",
"Recovery key password" : "Ange lösenord",
"Passwords fields do not match" : "Lösenorden matchar inte",
"Repeat recovery key password" : "Repetera lösenord",
"An error occurred while updating the recovery key settings. Please try again." : "Ett fel uppstod vid uppdateringen av inställningarna för återställningsnyckeln. Försök igen.",
"Change recovery key password" : "Ändra lösenordet för återställningsnyckeln",
"Old recovery key password" : "Gammalt lösenord",
"New recovery key password" : "Nytt lösenord",
"Repeat new recovery key password" : "Repetera lösenord",
"An error occurred while changing the recovery key password. Please try again." : "Ett fel uppstod när lösenordet för återställningsnyckeln skulle ändras. Försök igen.",
"Update private key password" : "Uppdatera lösenordet för den privata nyckeln",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "Lösenordet till din privata nyckel stämmer inte längre överens med ditt inloggningslösenord. Ändra lösenordet till din privata nyckel så att det blir detsamma som ditt nuvarande inloggningslösenord.",
"If you do not remember your old password you can ask your administrator to recover your files." : "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.",
"Old log-in password" : "Gammalt inloggningslösenord",
"Current log-in password" : "Nuvarande inloggningslösenord",
"Update" : "Uppdatera",
"Updating recovery keys. This can take some time…" : "Uppdaterar återställningsnycklar. Det kan ta en stund…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Om du aktiverar det här alternativet kan du återställa åtkomst till dina krypterade filer vid lösenordsförlust",
"Enable password recovery" : "Aktivera återställning av lösenord",
"Default encryption module" : "Krypteringsfunktion",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsappen är aktiverad men dina krypteringsnycklar är inte initialiserade, vänligen logga ut och logga in igen.",
"Basic encryption module" : "Kryptering",
@@ -61,6 +70,7 @@
"Update Private Key Password" : "Uppdatera lösenordet för din privata nyckel",
"Enable password recovery:" : "Aktivera lösenordsåterställning:",
"Enabled" : "Aktiverad",
"Disabled" : "Inaktiverad"
"Disabled" : "Inaktiverad",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att \nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+8 -8
View File
@@ -131,8 +131,8 @@ OC.L10N.register(
"Crop image previews" : "Ritaglia le anteprime delle immagini",
"General" : "Generale",
"Sort favorites first" : "Ordina prima i preferiti",
"Sort folders before files" : "Ordina cartelle prima dei files",
"Enable folder tree view" : "Abilita visuale ad albero delle cartelle",
"Sort folders before files" : "Ordina le cartelle prima dei file",
"Enable folder tree view" : "Abilita vista ad albero delle cartelle",
"Default view" : "Vista predefinita",
"All files" : "Tutti i file",
"Personal files" : "File personali",
@@ -151,9 +151,9 @@ OC.L10N.register(
"Go left in grid" : "Vai a sinistra nella griglia",
"Go right in grid" : "Vai a destra nella griglia",
"View" : "Visualizza",
"Toggle grid view" : "Commuta la vista a griglia",
"Show those shortcuts" : "Mostra quelle scorciatoie",
"Warnings" : "Avvertenze",
"Toggle grid view" : "Attiva/disattiva la vista a griglia",
"Show those shortcuts" : "Mostra scorciatoie",
"Warnings" : "Avvisi",
"Warn before changing a file extension" : "Avvisa prima di modificare l'estensione di un file",
"Warn before deleting a file" : "Avvisa prima di eliminare un file",
"WebDAV URL" : "URL WebDAV",
@@ -243,8 +243,8 @@ OC.L10N.register(
"Select file or folder to link to" : "Seleziona un file o una cartella da collegare",
"Choose {file}" : "Scegli {file}",
"Files settings" : "Impostazioni File",
"Switch to list view" : "Passa alla vista elenco",
"Switch to grid view" : "Passa alla vista griglia",
"Switch to list view" : "Passa alla vista a elenco",
"Switch to grid view" : "Passa alla vista a griglia",
"The file could not be found" : "Il file non è stato trovato",
"Upload was cancelled by user" : "Caricamento annullato dall'utente",
"Not enough free space" : "Spazio libero insufficiente",
@@ -382,7 +382,7 @@ OC.L10N.register(
"No favorites yet" : "Nessun preferito ancora",
"Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
"List of your files and folders." : "Lista dei tuoi file e cartelle.",
"Folder tree" : "Albero delle cartella",
"Folder tree" : "Albero delle cartelle",
"List of your files and folders that are not shared." : "Elenco dei file e delle cartelle che non sono condivisi.",
"No personal files found" : "Nessun file personale trovato",
"Files that are not shared will show up here." : "I file che non vengono condivisi verranno visualizzati qui.",
+8 -8
View File
@@ -129,8 +129,8 @@
"Crop image previews" : "Ritaglia le anteprime delle immagini",
"General" : "Generale",
"Sort favorites first" : "Ordina prima i preferiti",
"Sort folders before files" : "Ordina cartelle prima dei files",
"Enable folder tree view" : "Abilita visuale ad albero delle cartelle",
"Sort folders before files" : "Ordina le cartelle prima dei file",
"Enable folder tree view" : "Abilita vista ad albero delle cartelle",
"Default view" : "Vista predefinita",
"All files" : "Tutti i file",
"Personal files" : "File personali",
@@ -149,9 +149,9 @@
"Go left in grid" : "Vai a sinistra nella griglia",
"Go right in grid" : "Vai a destra nella griglia",
"View" : "Visualizza",
"Toggle grid view" : "Commuta la vista a griglia",
"Show those shortcuts" : "Mostra quelle scorciatoie",
"Warnings" : "Avvertenze",
"Toggle grid view" : "Attiva/disattiva la vista a griglia",
"Show those shortcuts" : "Mostra scorciatoie",
"Warnings" : "Avvisi",
"Warn before changing a file extension" : "Avvisa prima di modificare l'estensione di un file",
"Warn before deleting a file" : "Avvisa prima di eliminare un file",
"WebDAV URL" : "URL WebDAV",
@@ -241,8 +241,8 @@
"Select file or folder to link to" : "Seleziona un file o una cartella da collegare",
"Choose {file}" : "Scegli {file}",
"Files settings" : "Impostazioni File",
"Switch to list view" : "Passa alla vista elenco",
"Switch to grid view" : "Passa alla vista griglia",
"Switch to list view" : "Passa alla vista a elenco",
"Switch to grid view" : "Passa alla vista a griglia",
"The file could not be found" : "Il file non è stato trovato",
"Upload was cancelled by user" : "Caricamento annullato dall'utente",
"Not enough free space" : "Spazio libero insufficiente",
@@ -380,7 +380,7 @@
"No favorites yet" : "Nessun preferito ancora",
"Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
"List of your files and folders." : "Lista dei tuoi file e cartelle.",
"Folder tree" : "Albero delle cartella",
"Folder tree" : "Albero delle cartelle",
"List of your files and folders that are not shared." : "Elenco dei file e delle cartelle che non sono condivisi.",
"No personal files found" : "Nessun file personale trovato",
"Files that are not shared will show up here." : "I file che non vengono condivisi verranno visualizzati qui.",
+8 -8
View File
@@ -1,9 +1,9 @@
OC.L10N.register(
"files",
{
"Added to favorites" : "Pridėta į mėgstamus",
"Added to favorites" : "Pridėtas į mėgstamus",
"Removed from favorites" : "Pašalintas iš mėgstamų",
"You added {file} to your favorites" : "Pridėjote {file} į savo mėgstamus",
"You added {file} to your favorites" : "Pridėjote {file} į mėgstamus",
"You removed {file} from your favorites" : "Pašalinote {file} iš mėgstamų",
"Favorites" : "Mėgstami",
"File changes" : "Failo pakeitimai",
@@ -55,9 +55,9 @@ OC.L10N.register(
"The replacement character may only be a single character." : "Pakaitinis simbolis gali būti tik vienas simbolis.",
"Filename sanitization already started." : "Failų pavadinimų valymas jau pradėtas.",
"No filename sanitization in progress." : "Failų pavadinimų valymas nevykdomas.",
"Favorite files" : "Mėgstamiausi failai",
"No favorites" : "Nėra mėgstamiausių",
"More favorites" : "Daugiau mėgstamiausių",
"Favorite files" : "Mėgstami failai",
"No favorites" : "Nėra mėgstamų",
"More favorites" : "Daugiau mėgstamų",
"Accept" : "Priimti",
"Reject" : "Atmesti",
"Incoming ownership transfer from {user}" : "Gaunamasis nuosavybės perdavimas nuo {user}",
@@ -127,7 +127,7 @@ OC.L10N.register(
"Appearance" : "Išvaizda",
"Show hidden files" : "Rodyti paslėptus failus",
"Show file type column" : "Rodyti failo tipo stulpelį",
"Show file extensions" : "Rodyti failų plėtinius",
"Show file extensions" : "Rodyti failų prievardžius",
"Crop image previews" : "Apkirpti paveikslėlių peržiūras",
"General" : "Bendra",
"Sort favorites first" : "Pirmiausia rūšiuoti mėgstamiausius",
@@ -237,7 +237,7 @@ OC.L10N.register(
"Do not show this dialog again." : "Daugiau neberodyti šio dialogo.",
"Rename file to hidden" : "Pervadinti failą į paslėptą",
"Prefixing a filename with a dot may render the file hidden." : "Failo pavadinimo pradžioje įrašius tašką, failas gali būti paslėptas.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Ar tikrai norite pervardyti failą į „{filename}“?",
"Are you sure you want to rename the file to \"{filename}\"?" : "Ar tikrai norite pervadinti failą į „{filename}“?",
"Cancel" : "Atsisakyti",
"Rename" : "Pervadinti",
"Select file or folder to link to" : "Pasirinkite failą arba aplanką, į kurį norite susieti",
@@ -378,7 +378,7 @@ OC.L10N.register(
"\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}“ yra rezervuotas pavadinimas ir neleidžiamas naudoti failo pavadinimuose.",
"\"{extension}\" is not an allowed filetype." : "„{extension}“ nėra leidžiamas failo tipas.",
"Filenames must not end with \"{extension}\"." : "Failų pavadinimai negali baigtis „{extension}“.",
"List of favorite files and folders." : "Mėgstamiausių failų ir aplankų sąrašas.",
"List of favorite files and folders." : "Mėgstamų failų ir aplankų sąrašas.",
"No favorites yet" : "Kol kas nėra mėgstamų",
"Files and folders you mark as favorite will show up here" : "Čia bus rodomi failai ir aplankai, kuriuos pažymėsite kaip mėgstamus",
"List of your files and folders." : "Jūsų failų ir aplankų sąrašas.",
+8 -8
View File
@@ -1,7 +1,7 @@
{ "translations": {
"Added to favorites" : "Pridėta į mėgstamus",
"Added to favorites" : "Pridėtas į mėgstamus",
"Removed from favorites" : "Pašalintas iš mėgstamų",
"You added {file} to your favorites" : "Pridėjote {file} į savo mėgstamus",
"You added {file} to your favorites" : "Pridėjote {file} į mėgstamus",
"You removed {file} from your favorites" : "Pašalinote {file} iš mėgstamų",
"Favorites" : "Mėgstami",
"File changes" : "Failo pakeitimai",
@@ -53,9 +53,9 @@
"The replacement character may only be a single character." : "Pakaitinis simbolis gali būti tik vienas simbolis.",
"Filename sanitization already started." : "Failų pavadinimų valymas jau pradėtas.",
"No filename sanitization in progress." : "Failų pavadinimų valymas nevykdomas.",
"Favorite files" : "Mėgstamiausi failai",
"No favorites" : "Nėra mėgstamiausių",
"More favorites" : "Daugiau mėgstamiausių",
"Favorite files" : "Mėgstami failai",
"No favorites" : "Nėra mėgstamų",
"More favorites" : "Daugiau mėgstamų",
"Accept" : "Priimti",
"Reject" : "Atmesti",
"Incoming ownership transfer from {user}" : "Gaunamasis nuosavybės perdavimas nuo {user}",
@@ -125,7 +125,7 @@
"Appearance" : "Išvaizda",
"Show hidden files" : "Rodyti paslėptus failus",
"Show file type column" : "Rodyti failo tipo stulpelį",
"Show file extensions" : "Rodyti failų plėtinius",
"Show file extensions" : "Rodyti failų prievardžius",
"Crop image previews" : "Apkirpti paveikslėlių peržiūras",
"General" : "Bendra",
"Sort favorites first" : "Pirmiausia rūšiuoti mėgstamiausius",
@@ -235,7 +235,7 @@
"Do not show this dialog again." : "Daugiau neberodyti šio dialogo.",
"Rename file to hidden" : "Pervadinti failą į paslėptą",
"Prefixing a filename with a dot may render the file hidden." : "Failo pavadinimo pradžioje įrašius tašką, failas gali būti paslėptas.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Ar tikrai norite pervardyti failą į „{filename}“?",
"Are you sure you want to rename the file to \"{filename}\"?" : "Ar tikrai norite pervadinti failą į „{filename}“?",
"Cancel" : "Atsisakyti",
"Rename" : "Pervadinti",
"Select file or folder to link to" : "Pasirinkite failą arba aplanką, į kurį norite susieti",
@@ -376,7 +376,7 @@
"\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}“ yra rezervuotas pavadinimas ir neleidžiamas naudoti failo pavadinimuose.",
"\"{extension}\" is not an allowed filetype." : "„{extension}“ nėra leidžiamas failo tipas.",
"Filenames must not end with \"{extension}\"." : "Failų pavadinimai negali baigtis „{extension}“.",
"List of favorite files and folders." : "Mėgstamiausių failų ir aplankų sąrašas.",
"List of favorite files and folders." : "Mėgstamų failų ir aplankų sąrašas.",
"No favorites yet" : "Kol kas nėra mėgstamų",
"Files and folders you mark as favorite will show up here" : "Čia bus rodomi failai ir aplankai, kuriuos pažymėsite kaip mėgstamus",
"List of your files and folders." : "Jūsų failų ir aplankų sąrašas.",
+1 -1
View File
@@ -3,7 +3,7 @@ OC.L10N.register(
{
"Added to favorites" : "Aan favorieten toegevoegd",
"Removed from favorites" : "Uit favorieten verwijderd",
"You added {file} to your favorites" : "Je voegde {file} toe aan favorieten",
"You added {file} to your favorites" : "Je voegde {file} toe aan je favorieten",
"You removed {file} from your favorites" : "Je verwijderde {file} uit je favorieten",
"Favorites" : "Favorieten",
"File changes" : "Bestandswijzigingen",
+1 -1
View File
@@ -1,7 +1,7 @@
{ "translations": {
"Added to favorites" : "Aan favorieten toegevoegd",
"Removed from favorites" : "Uit favorieten verwijderd",
"You added {file} to your favorites" : "Je voegde {file} toe aan favorieten",
"You added {file} to your favorites" : "Je voegde {file} toe aan je favorieten",
"You removed {file} from your favorites" : "Je verwijderde {file} uit je favorieten",
"Favorites" : "Favorieten",
"File changes" : "Bestandswijzigingen",
+10
View File
@@ -95,6 +95,7 @@ OC.L10N.register(
"Another entry with the same name already exists." : "En annan post med samma namn finns redan.",
"Invalid filename." : "Ogiltigt filnamn.",
"Rename file" : "Byt namn på fil",
"Recently created" : "Nyligen skapade",
"Folder" : "Mapp",
"Unknown file type" : "Okänd filtyp",
"{ext} image" : "{ext} bild",
@@ -110,6 +111,7 @@ OC.L10N.register(
"Last 30 days" : "Senaste 30 dagarna",
"This year ({year})" : "I år ({year})",
"Last year ({year})" : "Förra året ({year})",
"Custom range" : "Anpassat intervall",
"Custom date range" : "Anpassat datumintervall",
"Search everywhere" : "Sök överallt",
"Documents" : "Dokument",
@@ -233,6 +235,9 @@ OC.L10N.register(
"Removing the file extension \"{old}\" may render the file unreadable." : "Att ta bort filtillägget \"{old}\" kan göra filen oläsbar.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Att lägga till filtillägget \"{new}\" kan göra filen oläsbar.",
"Do not show this dialog again." : "Visa inte denna dialog igen.",
"Rename file to hidden" : "Byt namn på filen till ”hidden”",
"Prefixing a filename with a dot may render the file hidden." : "Om man sätter en punkt framför ett filnamn kan filen bli dold.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Är du säker på att du vill byta namn på filen till \"{filename}\"?",
"Cancel" : "Avbryt",
"Rename" : "Byt namn",
"Select file or folder to link to" : "Välj fil eller mapp att länka till",
@@ -315,7 +320,9 @@ OC.L10N.register(
"The files are locked" : "Filerna är låsta",
"The file does not exist anymore" : "Filen finns inte längre",
"Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Flyttar {count}filer till \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Kopierar {count} filer till \"{destination}\" …",
"Choose destination" : "Välj destination",
"Copy to {target}" : "Kopiera till {target}",
"Move to {target}" : "Flytta till {target}",
@@ -330,6 +337,8 @@ OC.L10N.register(
"Retry and close" : "Försök igen och stäng",
"Open online" : "Öppna online",
"Details" : "Detaljer",
"Open the details sidebar" : "Öppna informationsfältet",
"Unfavorite" : "Ta bort från favoriter",
"View in folder" : "Utforska i mapp",
"Type" : "Typ",
"Created new folder \"{name}\"" : "Skapat ny mapp \"{name}\"",
@@ -338,6 +347,7 @@ OC.L10N.register(
"Templates" : "Mallar",
"New template folder" : "Ny mallmapp",
"In folder" : "I mapp",
"Pick folder to search in" : "Välj en mapp att söka i",
"Search in all files" : "Sök i alla filer",
"Search in folder: {folder}" : "Sök i mapp: {folder}",
"One of the dropped files could not be processed" : "En av de släppta filerna kunde inte bearbetas",
+10
View File
@@ -93,6 +93,7 @@
"Another entry with the same name already exists." : "En annan post med samma namn finns redan.",
"Invalid filename." : "Ogiltigt filnamn.",
"Rename file" : "Byt namn på fil",
"Recently created" : "Nyligen skapade",
"Folder" : "Mapp",
"Unknown file type" : "Okänd filtyp",
"{ext} image" : "{ext} bild",
@@ -108,6 +109,7 @@
"Last 30 days" : "Senaste 30 dagarna",
"This year ({year})" : "I år ({year})",
"Last year ({year})" : "Förra året ({year})",
"Custom range" : "Anpassat intervall",
"Custom date range" : "Anpassat datumintervall",
"Search everywhere" : "Sök överallt",
"Documents" : "Dokument",
@@ -231,6 +233,9 @@
"Removing the file extension \"{old}\" may render the file unreadable." : "Att ta bort filtillägget \"{old}\" kan göra filen oläsbar.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Att lägga till filtillägget \"{new}\" kan göra filen oläsbar.",
"Do not show this dialog again." : "Visa inte denna dialog igen.",
"Rename file to hidden" : "Byt namn på filen till ”hidden”",
"Prefixing a filename with a dot may render the file hidden." : "Om man sätter en punkt framför ett filnamn kan filen bli dold.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Är du säker på att du vill byta namn på filen till \"{filename}\"?",
"Cancel" : "Avbryt",
"Rename" : "Byt namn",
"Select file or folder to link to" : "Välj fil eller mapp att länka till",
@@ -313,7 +318,9 @@
"The files are locked" : "Filerna är låsta",
"The file does not exist anymore" : "Filen finns inte längre",
"Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Flyttar {count}filer till \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Kopierar {count} filer till \"{destination}\" …",
"Choose destination" : "Välj destination",
"Copy to {target}" : "Kopiera till {target}",
"Move to {target}" : "Flytta till {target}",
@@ -328,6 +335,8 @@
"Retry and close" : "Försök igen och stäng",
"Open online" : "Öppna online",
"Details" : "Detaljer",
"Open the details sidebar" : "Öppna informationsfältet",
"Unfavorite" : "Ta bort från favoriter",
"View in folder" : "Utforska i mapp",
"Type" : "Typ",
"Created new folder \"{name}\"" : "Skapat ny mapp \"{name}\"",
@@ -336,6 +345,7 @@
"Templates" : "Mallar",
"New template folder" : "Ny mallmapp",
"In folder" : "I mapp",
"Pick folder to search in" : "Välj en mapp att söka i",
"Search in all files" : "Sök i alla filer",
"Search in folder: {folder}" : "Sök i mapp: {folder}",
"One of the dropped files could not be processed" : "En av de släppta filerna kunde inte bearbetas",
+1 -1
View File
@@ -198,7 +198,7 @@ class ViewController extends Controller {
$this->eventDispatcher->dispatchTyped(new LoadViewer());
}
$this->initialState->provideInitialState('templates_enabled', ($this->config->getSystemValueString('skeletondirectory', \OC::$SERVERROOT . '/core/skeleton') !== '') || ($this->config->getSystemValueString('templatedirectory', \OC::$SERVERROOT . '/core/skeleton/Templates') !== ''));
$this->initialState->provideInitialState('templates_enabled', true);
$this->initialState->provideInitialState('templates_path', $this->templateManager->hasTemplateDirectory() ? $this->templateManager->getTemplatePath() : false);
$this->initialState->provideInitialState('templates', $this->templateManager->listCreators());
+1 -1
View File
@@ -124,7 +124,7 @@ export async function onDropExternalFiles(root: RootDirectory, destination: IFol
if (file instanceof Directory) {
try {
logger.debug('Processing directory', { relativePath })
await createDirectoryIfNotExists(relativePath)
await createDirectoryIfNotExists(relativePath, destination)
await uploadDirectoryContents(file, relativePath)
} catch (error) {
showError(t('files', 'Unable to create the directory {directory}', { directory: file.name }))
+9 -5
View File
@@ -133,17 +133,21 @@ function readDirectory(directory: FileSystemDirectoryEntry): Promise<FileSystemE
}
/**
* @param path - The path relative to the dav root
* @param path - The path relative to the destination root
* @param destination - The destination folder. When provided, directories are created relative
* to its source URL instead of the default user root. This is needed for uploads into
* non-default locations like team folders.
*/
export async function createDirectoryIfNotExists(path: string) {
const davUrl = join(defaultRemoteURL, defaultRootPath)
export async function createDirectoryIfNotExists(path: string, destination?: IFolder) {
const davUrl = destination?.source ?? join(defaultRemoteURL, defaultRootPath)
const davRoot = destination?.root ?? defaultRootPath
const davClient = getClient(davUrl)
const dirExists = await davClient.exists(path)
if (!dirExists) {
logger.debug('Directory does not exist, creating it', { path })
logger.debug('Directory does not exist, creating it', { path, davUrl })
await davClient.createDirectory(path, { recursive: true })
const stat = await davClient.stat(path, { details: true, data: getDefaultPropfind() }) as ResponseDataDetailed<FileStat>
emit('files:node:created', resultToNode(stat.data, defaultRootPath, davUrl))
emit('files:node:created', resultToNode(stat.data, davRoot, davUrl))
}
}

Some files were not shown because too many files have changed in this diff Show More