Compare commits
213 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d46271b65f | |||
| ead3f66379 | |||
| bdcfe5b8a9 | |||
| b8ab7b7e55 | |||
| f35e33f2d8 | |||
| 21b997f845 | |||
| 2665151105 | |||
| 290610b630 | |||
| 3ffdf56c8f | |||
| 744b41b216 | |||
| f7b7474cd3 | |||
| 4fcf4dba02 | |||
| 6d31abdfd5 | |||
| 30d090fb78 | |||
| e0b81410f4 | |||
| a5e58dc45e | |||
| c0b39bb909 | |||
| e840ec23f1 | |||
| b1eecde452 | |||
| c6ec82203e | |||
| cc72f738ed | |||
| 6d2253e692 | |||
| f23875dcb1 | |||
| 2b270f54ee | |||
| 0eeb459cc3 | |||
| e2b1de8bc1 | |||
| 36f272d03b | |||
| c42412f3d2 | |||
| 23bbb31445 | |||
| cead56ac6a | |||
| 47168ad5bd | |||
| e88693a473 | |||
| 9067932f3b | |||
| ffc8a86d7d | |||
| 5d632154c2 | |||
| dd165cf53a | |||
| 8622edb4b3 | |||
| af6de04e9e | |||
| 82183693e9 | |||
| 1cc6b3577f | |||
| c18cd4df66 | |||
| 6c4b56b0f3 | |||
| 3656a24e21 | |||
| 31319be951 | |||
| e97421f12a | |||
| e5e795c935 | |||
| b260dd0a9d | |||
| 4a3ade5d43 | |||
| 3e7695235c | |||
| 44aa4836aa | |||
| 7363c4a403 | |||
| 8b60df1600 | |||
| bd740ac0b0 | |||
| 2f9f9e83e8 | |||
| 658d2f7ea1 | |||
| 0cab17bfe7 | |||
| 3d1785bb2f | |||
| 5b412b505b | |||
| fc1edaf4c1 | |||
| 3b185b1156 | |||
| 4062883459 | |||
| 920a74118c | |||
| d78bfb7181 | |||
| 6c934b831e | |||
| 4b6490eaa6 | |||
| d7da93489b | |||
| ae787c5ef2 | |||
| e2c299f28c | |||
| dd58e5290f | |||
| 127cacdd19 | |||
| 351dd6dd8a | |||
| f4f0316a55 | |||
| 5940c96414 | |||
| a6556e9b46 | |||
| 1b39abb501 | |||
| 3c3667fe18 | |||
| 4eebf471e5 | |||
| 5e2e2ba7ad | |||
| d3a0e8308b | |||
| c0781f524f | |||
| 5a7e21187b | |||
| b6bc28833c | |||
| 49fa2e508d | |||
| 639caf6150 | |||
| 3ff7d64fda | |||
| 0df3a46db2 | |||
| 9641433001 | |||
| b33260a22c | |||
| 003bf4b8ee | |||
| 82c6b92d41 | |||
| 5ead5fc6c5 | |||
| e53684e1d9 | |||
| b36ced878f | |||
| a01797d2f2 | |||
| b87c1ebfcc | |||
| c3ad469750 | |||
| 6214e3ad76 | |||
| ebe2429c0a | |||
| 974cda636f | |||
| 1992a6d72b | |||
| 7290d9d7ca | |||
| f309ba9dc9 | |||
| e1caa198e3 | |||
| d5140fe034 | |||
| c82b17d0a3 | |||
| ec00367f30 | |||
| 2d0f65851e | |||
| 1331ce7e7c | |||
| c07cf51beb | |||
| 7fe62b9364 | |||
| ff10f9f60f | |||
| dbbe2bbcb7 | |||
| cf56874cb1 | |||
| c9ef3f72bc | |||
| 91573781df | |||
| b9cc7bcec7 | |||
| d6cfcd7825 | |||
| dc153f2ada | |||
| 1907eeea35 | |||
| 748e267b44 | |||
| a3cd963264 | |||
| e817bc6d3c | |||
| bc4527a80d | |||
| 4f70998e35 | |||
| 05c9b06cdd | |||
| 20dbb6c7e8 | |||
| cd0217b2bd | |||
| da38ff0088 | |||
| 307608b26c | |||
| 0e3ca084c4 | |||
| acca93e793 | |||
| 3756152cb1 | |||
| 1071201052 | |||
| 560282a47b | |||
| 5bbc23a261 | |||
| 3a6716895a | |||
| 2b7d9c1c9d | |||
| 3b795cde79 | |||
| ecca9e1ad6 | |||
| cf59575120 | |||
| ba9638eae5 | |||
| 40c91aa31e | |||
| 551ff4955e | |||
| 6fce6fa1d6 | |||
| 652c1f7b65 | |||
| 6286d3236c | |||
| 2c47285d6d | |||
| 0d9d68eea1 | |||
| e06931854a | |||
| a7658f3ec8 | |||
| 2af0eb765f | |||
| 2ec68b1eb9 | |||
| 87e28b0bb7 | |||
| d6d173f74e | |||
| 81b4ced076 | |||
| fa11a67e88 | |||
| 132220a89f | |||
| ad8200d963 | |||
| 2dfd51cc03 | |||
| b52ab4388b | |||
| 09428d15a3 | |||
| c0110409fc | |||
| dcdb4bbf8a | |||
| 8d4968168f | |||
| 8638f3b587 | |||
| c8e09d158b | |||
| 62f9c26111 | |||
| 6fda0c15f0 | |||
| d63148ee8d | |||
| b1230cd53d | |||
| a92171260f | |||
| 13a72d0f0e | |||
| 74b8de5665 | |||
| d94073de92 | |||
| b8b81254f3 | |||
| b8dbed3e32 | |||
| 8032b6ac63 | |||
| 67c52d202c | |||
| f490a4e8c0 | |||
| d35c4eb911 | |||
| 84ee79fe43 | |||
| cc44ec54ad | |||
| 75180a6292 | |||
| a41e2f01b7 | |||
| 6b795da540 | |||
| fc8b886295 | |||
| f4f7c757d4 | |||
| 3dfe306724 | |||
| 0f9ea1992c | |||
| 15550de8ce | |||
| 28e6328d65 | |||
| 50c48aa538 | |||
| 601b3b16cb | |||
| 9189bc290b | |||
| 774427a03a | |||
| e218d1f98e | |||
| d025c55193 | |||
| d0a0be9959 | |||
| 2c24c3c469 | |||
| b582630715 | |||
| fb90e7e2cf | |||
| 0f10cabf2a | |||
| 44705abacb | |||
| 21c30e5259 | |||
| a7eb156130 | |||
| effbc44756 | |||
| 9d446d566b | |||
| 71bfa5b574 | |||
| eb365438d6 | |||
| 7b53a85bb6 | |||
| 04944aaa23 | |||
| 31b74bc671 | |||
| e7cbaf3ee3 |
@@ -0,0 +1,8 @@
|
||||
# .git-blame-ignore-revs
|
||||
|
||||
# SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
# Update to coding-standard 1.2.3
|
||||
af6de04e9e141466dc229e444ff3f146f4a34765
|
||||
0bd284cb81b6866338aaaa67aa1d81ef9bfbb2ab
|
||||
@@ -138,6 +138,25 @@ updates:
|
||||
# Disable automatic rebasing because without a build CI will likely fail anyway
|
||||
rebase-strategy: "disabled"
|
||||
|
||||
- package-ecosystem: npm
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
day: saturday
|
||||
time: "03:00"
|
||||
timezone: Europe/Paris
|
||||
target-branch: stable30
|
||||
labels:
|
||||
- "3. to review"
|
||||
- "feature: dependencies"
|
||||
reviewers:
|
||||
- "nextcloud/server-dependabot"
|
||||
ignore:
|
||||
- dependency-name: "*"
|
||||
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
||||
# Disable automatic rebasing because without a build CI will likely fail anyway
|
||||
rebase-strategy: "disabled"
|
||||
|
||||
- package-ecosystem: composer
|
||||
directory: "/build/integration"
|
||||
schedule:
|
||||
@@ -174,6 +193,24 @@ updates:
|
||||
- dependency-name: "*"
|
||||
update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
|
||||
|
||||
- package-ecosystem: composer
|
||||
directory: "/build/integration"
|
||||
schedule:
|
||||
interval: weekly
|
||||
day: saturday
|
||||
time: "03:00"
|
||||
timezone: Europe/Paris
|
||||
target-branch: stable30
|
||||
labels:
|
||||
- "3. to review"
|
||||
- "feature: dependencies"
|
||||
reviewers:
|
||||
- "nextcloud/server-dependabot"
|
||||
ignore:
|
||||
# ignore all GitHub linguist patch updates
|
||||
- dependency-name: "*"
|
||||
update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
|
||||
|
||||
# GitHub Actions
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
|
||||
@@ -45,7 +45,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['8.1']
|
||||
php-versions: ['8.3']
|
||||
|
||||
name: PHP checkers
|
||||
|
||||
|
||||
@@ -29,6 +29,8 @@ jobs:
|
||||
npmVersion: ${{ steps.versions.outputs.npmVersion }}
|
||||
|
||||
env:
|
||||
# We'll install cypress in the cypress job
|
||||
CYPRESS_INSTALL_BINARY: 0
|
||||
PUPPETEER_SKIP_DOWNLOAD: true
|
||||
|
||||
steps:
|
||||
@@ -115,9 +117,14 @@ jobs:
|
||||
- name: Set up npm ${{ needs.init.outputs.npmVersion }}
|
||||
run: npm i -g 'npm@${{ needs.init.outputs.npmVersion }}'
|
||||
|
||||
- name: Install cypress
|
||||
run: ./node_modules/cypress/bin/cypress install
|
||||
|
||||
- name: Run ${{ matrix.containers == 'component' && 'component' || 'E2E' }} cypress tests
|
||||
uses: cypress-io/github-action@df7484c5ba85def7eef30db301afa688187bc378 # v6.7.2
|
||||
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
|
||||
|
||||
@@ -43,7 +43,7 @@ jobs:
|
||||
# do not stop on another job's failure
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php-versions: ['8.1']
|
||||
php-versions: ['8.3']
|
||||
endpoint: ['old', 'new']
|
||||
service: ['CalDAV', 'CardDAV']
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ jobs:
|
||||
# do not stop on another job's failure
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php-versions: ['8.1']
|
||||
php-versions: ['8.3']
|
||||
endpoint: ['webdav', 'dav']
|
||||
|
||||
name: Litmus WebDAV ${{ matrix.endpoint }}
|
||||
|
||||
@@ -41,7 +41,6 @@ jobs:
|
||||
- '.php-cs-fixer.dist.php'
|
||||
- 'composer.json'
|
||||
- 'composer.lock'
|
||||
- 'core/shipped.json'
|
||||
|
||||
integration-sqlite:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -70,8 +69,8 @@ jobs:
|
||||
- 'sharing_features'
|
||||
- 'videoverification_features'
|
||||
|
||||
php-versions: ['8.1']
|
||||
spreed-versions: ['stable30']
|
||||
php-versions: ['8.2']
|
||||
spreed-versions: ['main']
|
||||
|
||||
services:
|
||||
redis:
|
||||
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
branches: ['main', 'master', 'stable29', 'stable28', 'stable27']
|
||||
branches: ['main', 'master', 'stable30', 'stable29', 'stable28']
|
||||
|
||||
name: npm-audit-fix-${{ matrix.branches }}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['8.1', '8.2']
|
||||
php-versions: ['8.1', '8.2', '8.3']
|
||||
include:
|
||||
- php-versions: '8.3'
|
||||
coverage: true
|
||||
|
||||
@@ -45,7 +45,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['8.1', '8.2']
|
||||
php-versions: ['8.1', '8.2', '8.3']
|
||||
include:
|
||||
- php-versions: '8.3'
|
||||
coverage: true
|
||||
|
||||
@@ -45,7 +45,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['8.1', '8.2']
|
||||
php-versions: ['8.1', '8.2', '8.3']
|
||||
include:
|
||||
- php-versions: '8.3'
|
||||
coverage: true
|
||||
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
- name: Set up php
|
||||
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 #v2.31.1
|
||||
with:
|
||||
php-version: '8.1'
|
||||
php-version: '8.2'
|
||||
extensions: ctype, curl, dom, fileinfo, gd, json, libxml, mbstring, openssl, pcntl, pdo, posix, session, simplexml, xml, xmlreader, xmlwriter, zip, zlib
|
||||
coverage: none
|
||||
ini-file: development
|
||||
|
||||
@@ -64,7 +64,7 @@ jobs:
|
||||
curl -s -u test:test -T README.md http://localhost:8080/remote.php/dav/files/test/new_file.txt
|
||||
curl -s -u test:test -X DELETE http://localhost:8080/remote.php/dav/files/test/new_file.txt
|
||||
output: before.json
|
||||
profiler-branch: stable30
|
||||
profiler-branch: master
|
||||
|
||||
- name: Apply PR
|
||||
run: |
|
||||
@@ -86,7 +86,7 @@ jobs:
|
||||
curl -s -u test:test -T README.md http://localhost:8080/remote.php/dav/files/test/new_file.txt
|
||||
curl -s -u test:test -X DELETE http://localhost:8080/remote.php/dav/files/test/new_file.txt
|
||||
output: after.json
|
||||
profiler-branch: stable30
|
||||
profiler-branch: master
|
||||
compare-with: before.json
|
||||
|
||||
- name: Upload profiles
|
||||
|
||||
@@ -55,7 +55,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['8.1', '8.3']
|
||||
php-versions: ['8.1', '8.2', '8.3']
|
||||
include:
|
||||
- php-versions: '8.2'
|
||||
coverage: ${{ github.event_name != 'pull_request' }}
|
||||
|
||||
@@ -1,184 +0,0 @@
|
||||
# This workflow is provided via the organization template repository
|
||||
#
|
||||
# https://github.com/nextcloud/.github
|
||||
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
name: PHPUnit sharding
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
schedule:
|
||||
- cron: "5 2 * * *"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: phpunit-mysql-sharding-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
changes:
|
||||
runs-on: ubuntu-latest-low
|
||||
|
||||
outputs:
|
||||
src: ${{ steps.changes.outputs.src }}
|
||||
|
||||
steps:
|
||||
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
id: changes
|
||||
continue-on-error: true
|
||||
with:
|
||||
filters: |
|
||||
src:
|
||||
- '.github/workflows/**'
|
||||
- '3rdparty/**'
|
||||
- '**/appinfo/**'
|
||||
- '**/lib/**'
|
||||
- '**/templates/**'
|
||||
- '**/tests/**'
|
||||
- 'vendor/**'
|
||||
- 'vendor-bin/**'
|
||||
- '.php-cs-fixer.dist.php'
|
||||
- 'composer.json'
|
||||
- 'composer.lock'
|
||||
- '**.php'
|
||||
|
||||
phpunit-mysql:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
needs: changes
|
||||
if: needs.changes.outputs.src != 'false'
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['8.1']
|
||||
mysql-versions: ['8.4']
|
||||
|
||||
name: Sharding - MySQL ${{ matrix.mysql-versions }} (PHP ${{ matrix.php-versions }}) - database tests
|
||||
|
||||
services:
|
||||
cache:
|
||||
image: ghcr.io/nextcloud/continuous-integration-redis:latest
|
||||
ports:
|
||||
- 6379:6379/tcp
|
||||
options: --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3
|
||||
|
||||
mysql:
|
||||
image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
|
||||
ports:
|
||||
- 4444:3306/tcp
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: rootpassword
|
||||
MYSQL_USER: oc_autotest
|
||||
MYSQL_PASSWORD: nextcloud
|
||||
MYSQL_DATABASE: oc_autotest
|
||||
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
|
||||
shard1:
|
||||
image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
|
||||
ports:
|
||||
- 5001:3306/tcp
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: rootpassword
|
||||
MYSQL_USER: oc_autotest
|
||||
MYSQL_PASSWORD: nextcloud
|
||||
MYSQL_DATABASE: nextcloud
|
||||
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
|
||||
shard2:
|
||||
image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
|
||||
ports:
|
||||
- 5002:3306/tcp
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: rootpassword
|
||||
MYSQL_USER: oc_autotest
|
||||
MYSQL_PASSWORD: nextcloud
|
||||
MYSQL_DATABASE: nextcloud
|
||||
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
|
||||
shard3:
|
||||
image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
|
||||
ports:
|
||||
- 5003:3306/tcp
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: rootpassword
|
||||
MYSQL_USER: oc_autotest
|
||||
MYSQL_PASSWORD: nextcloud
|
||||
MYSQL_DATABASE: nextcloud
|
||||
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
|
||||
shard4:
|
||||
image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
|
||||
ports:
|
||||
- 5004:3306/tcp
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: rootpassword
|
||||
MYSQL_USER: oc_autotest
|
||||
MYSQL_PASSWORD: nextcloud
|
||||
MYSQL_DATABASE: nextcloud
|
||||
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
|
||||
|
||||
steps:
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@2e947f1f6932d141d076ca441d0e1e881775e95b #v2.31.0
|
||||
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, mysql, pdo_mysql
|
||||
coverage: ${{ matrix.coverage && 'xdebug' || 'none' }}
|
||||
ini-file: development
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up dependencies
|
||||
run: composer i
|
||||
|
||||
- name: Enable ONLY_FULL_GROUP_BY MySQL option
|
||||
run: |
|
||||
echo "SET GLOBAL sql_mode=(SELECT CONCAT(@@sql_mode,',ONLY_FULL_GROUP_BY'));" | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword
|
||||
echo "SELECT @@sql_mode;" | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword
|
||||
|
||||
- name: Set up Nextcloud
|
||||
env:
|
||||
DB_PORT: 4444
|
||||
SHARDING: 1
|
||||
run: |
|
||||
mkdir data
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=mysql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: PHPUnit
|
||||
run: composer run test:db ${{ matrix.coverage && ' -- --coverage-clover ./clover.db.xml' || '' }}
|
||||
|
||||
- name: Upload db code coverage
|
||||
if: ${{ !cancelled() && matrix.coverage }}
|
||||
uses: codecov/codecov-action@v4.1.1
|
||||
with:
|
||||
files: ./clover.db.xml
|
||||
flags: phpunit-mysql
|
||||
|
||||
- name: Print logs
|
||||
if: always()
|
||||
run: |
|
||||
cat data/nextcloud.log
|
||||
|
||||
summary:
|
||||
permissions:
|
||||
contents: none
|
||||
runs-on: ubuntu-latest-low
|
||||
needs: [changes, phpunit-mysql]
|
||||
|
||||
if: always()
|
||||
|
||||
name: phpunit-mysql-summary
|
||||
|
||||
steps:
|
||||
- name: Summary status
|
||||
run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-mysql.result != 'success' }}; then exit 1; fi
|
||||
@@ -57,7 +57,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['8.1', '8.3']
|
||||
php-versions: ['8.1', '8.2', '8.3']
|
||||
include:
|
||||
- php-versions: '8.2'
|
||||
coverage: ${{ github.event_name != 'pull_request' }}
|
||||
|
||||
@@ -55,7 +55,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['8.2', '8.3']
|
||||
php-versions: ['8.1', '8.2', '8.3']
|
||||
include:
|
||||
- php-versions: '8.1'
|
||||
coverage: ${{ github.event_name != 'pull_request' }}
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
branches: ['master', 'stable29', 'stable28', 'stable27', 'stable26', 'stable25', 'stable24', 'stable23', 'stable22']
|
||||
branches: ['master', 'stable30', 'stable29', 'stable28', 'stable27', 'stable26', 'stable25', 'stable24', 'stable23', 'stable22']
|
||||
|
||||
name: update-ca-certificate-bundle-${{ matrix.branches }}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
branches: ['master', 'stable29', 'stable28', 'stable27', 'stable26', 'stable25', 'stable24', 'stable23', 'stable22']
|
||||
branches: ['master', 'stable30', 'stable29', 'stable28', 'stable27', 'stable26', 'stable25', 'stable24', 'stable23', 'stable22']
|
||||
|
||||
name: update-code-signing-crl-${{ matrix.branches }}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
branches: ['master', 'stable29', 'stable28', 'stable27']
|
||||
branches: ['master', 'stable30', 'stable29', 'stable28']
|
||||
|
||||
name: update-psalm-baseline-${{ matrix.branches }}
|
||||
|
||||
|
||||
@@ -106,13 +106,5 @@
|
||||
SetEnvIf Transfer-Encoding "chunked" proxy-sendcl=1
|
||||
</IfModule>
|
||||
|
||||
# Apache disabled the sending of the server-side content-length header
|
||||
# in their 2.4.59 patch updated which breaks some use-cases in Nextcloud.
|
||||
# Setting ap_trust_cgilike_cl allows to bring back the usual behaviour.
|
||||
# See https://bz.apache.org/bugzilla/show_bug.cgi?id=68973
|
||||
<IfModule mod_env.c>
|
||||
SetEnv ap_trust_cgilike_cl
|
||||
</IfModule>
|
||||
|
||||
AddDefaultCharset utf-8
|
||||
Options -Indexes
|
||||
|
||||
+13
-19
@@ -14,29 +14,23 @@ $config = new Config();
|
||||
$config
|
||||
->setParallelConfig(ParallelConfigFactory::detect())
|
||||
->getFinder()
|
||||
->ignoreVCSIgnored(true)
|
||||
->exclude('config')
|
||||
->exclude('data')
|
||||
->notPath('3rdparty')
|
||||
->notPath('build/integration/vendor')
|
||||
->notPath('build/lib')
|
||||
->notPath('build/node_modules')
|
||||
->notPath('build/stubs')
|
||||
->notPath('composer')
|
||||
->notPath('node_modules')
|
||||
->notPath('vendor')
|
||||
->in('apps')
|
||||
->exclude('3rdparty')
|
||||
->exclude('build/stubs')
|
||||
->exclude('composer')
|
||||
->in(__DIR__);
|
||||
|
||||
// Ignore additional app directories
|
||||
$rootDir = new \DirectoryIterator(__DIR__);
|
||||
foreach ($rootDir as $node) {
|
||||
if (str_starts_with($node->getFilename(), 'apps')) {
|
||||
$return = shell_exec('git check-ignore ' . escapeshellarg($node->getFilename() . '/'));
|
||||
$ignoredEntries = shell_exec('git status --porcelain --ignored ' . escapeshellarg(__DIR__));
|
||||
$ignoredEntries = explode("\n", $ignoredEntries);
|
||||
$ignoredEntries = array_filter($ignoredEntries, static fn (string $line) => str_starts_with($line, '!! '));
|
||||
$ignoredEntries = array_map(static fn (string $line) => substr($line, 3), $ignoredEntries);
|
||||
$ignoredEntries = array_values($ignoredEntries);
|
||||
|
||||
if ($return !== null) {
|
||||
$config->getFinder()->exclude($node->getFilename());
|
||||
}
|
||||
foreach ($ignoredEntries as $ignoredEntry) {
|
||||
if (str_ends_with($ignoredEntry, '/')) {
|
||||
$config->getFinder()->exclude($ignoredEntry);
|
||||
} else {
|
||||
$config->getFinder()->notPath($ignoredEntry);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
-->
|
||||
# Nextcloud Server ☁
|
||||
[](https://api.reuse.software/info/github.com/nextcloud/server)
|
||||
[](https://scrutinizer-ci.com/g/nextcloud/server/?branch=stable30)
|
||||
[](https://codecov.io/gh/nextcloud/server)
|
||||
[](https://scrutinizer-ci.com/g/nextcloud/server/?branch=master)
|
||||
[](https://codecov.io/gh/nextcloud/server)
|
||||
[](https://bestpractices.coreinfrastructure.org/projects/209)
|
||||
[](https://contribute.design/nextcloud/server)
|
||||
|
||||
@@ -74,6 +74,10 @@ Otherwise, git checkouts can be handled the same as release archives, by using t
|
||||
|
||||
- Comment on a pull request with `/update-3rdparty` to update the 3rd party submodule. It will update to the last commit of the 3rd party branch named like the PR target.
|
||||
|
||||
#### Ignore code style updates in git blame
|
||||
|
||||
`git config blame.ignoreRevsFile .git-blame-ignore-revs`
|
||||
|
||||
## Contribution guidelines 📜
|
||||
|
||||
All contributions to this repository from June 16, 2016, and onward are considered to be
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
import '@testing-library/jest-dom'
|
||||
|
||||
// Mock `window.location` with Jest spies and extend expect
|
||||
import 'jest-location-mock'
|
||||
|
||||
// Mock `window.fetch` with Jest
|
||||
import 'jest-fetch-mock'
|
||||
@@ -2,7 +2,12 @@
|
||||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
import { beforeEach } from 'vitest'
|
||||
|
||||
window.OC = { ...window.OC }
|
||||
window.OCA = { ...window.OCA }
|
||||
window.OCP = { ...window.OCP }
|
||||
|
||||
beforeEach(() => {
|
||||
window.location = new URL('http://nextcloud.local')
|
||||
})
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: CC0-1.0
|
||||
*/
|
||||
import '@testing-library/jest-dom/vitest'
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"extends": "../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"verbatimModuleSyntax": false
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@
|
||||
<name>Auditing / Logging</name>
|
||||
<summary>Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions.</summary>
|
||||
<description>Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions.</description>
|
||||
<version>1.20.0</version>
|
||||
<version>1.21.0</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Nextcloud</author>
|
||||
<namespace>AdminAudit</namespace>
|
||||
@@ -20,7 +20,7 @@
|
||||
<category>monitoring</category>
|
||||
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
||||
<dependencies>
|
||||
<nextcloud min-version="30" max-version="30"/>
|
||||
<nextcloud min-version="31" max-version="31"/>
|
||||
</dependencies>
|
||||
<background-jobs>
|
||||
<job>OCA\AdminAudit\BackgroundJobs\Rotate</job>
|
||||
|
||||
@@ -43,7 +43,7 @@ class Files extends Action {
|
||||
];
|
||||
} catch (InvalidPathException|NotFoundException $e) {
|
||||
\OCP\Server::get(LoggerInterface::class)->error(
|
||||
"Exception thrown in file read: ".$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
'Exception thrown in file read: '.$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -65,7 +65,7 @@ class Files extends Action {
|
||||
$this->renamedNodes[$source->getId()] = $source;
|
||||
} catch (InvalidPathException|NotFoundException $e) {
|
||||
\OCP\Server::get(LoggerInterface::class)->error(
|
||||
"Exception thrown in file rename: ".$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
'Exception thrown in file rename: '.$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -87,7 +87,7 @@ class Files extends Action {
|
||||
];
|
||||
} catch (InvalidPathException|NotFoundException $e) {
|
||||
\OCP\Server::get(LoggerInterface::class)->error(
|
||||
"Exception thrown in file rename: ".$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
'Exception thrown in file rename: '.$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -113,7 +113,7 @@ class Files extends Action {
|
||||
];
|
||||
} catch (InvalidPathException|NotFoundException $e) {
|
||||
\OCP\Server::get(LoggerInterface::class)->error(
|
||||
"Exception thrown in file create: ".$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
'Exception thrown in file create: '.$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -142,7 +142,7 @@ class Files extends Action {
|
||||
];
|
||||
} catch (InvalidPathException|NotFoundException $e) {
|
||||
\OCP\Server::get(LoggerInterface::class)->error(
|
||||
"Exception thrown in file copy: ".$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
'Exception thrown in file copy: '.$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -167,7 +167,7 @@ class Files extends Action {
|
||||
];
|
||||
} catch (InvalidPathException|NotFoundException $e) {
|
||||
\OCP\Server::get(LoggerInterface::class)->error(
|
||||
"Exception thrown in file write: ".$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
'Exception thrown in file write: '.$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -195,7 +195,7 @@ class Files extends Action {
|
||||
];
|
||||
} catch (InvalidPathException|NotFoundException $e) {
|
||||
\OCP\Server::get(LoggerInterface::class)->error(
|
||||
"Exception thrown in file update: ".$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
'Exception thrown in file update: '.$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -219,7 +219,7 @@ class Files extends Action {
|
||||
];
|
||||
} catch (InvalidPathException|NotFoundException $e) {
|
||||
\OCP\Server::get(LoggerInterface::class)->error(
|
||||
"Exception thrown in file delete: ".$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
'Exception thrown in file delete: '.$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -248,7 +248,7 @@ class Files extends Action {
|
||||
];
|
||||
} catch (InvalidPathException|NotFoundException $e) {
|
||||
\OCP\Server::get(LoggerInterface::class)->error(
|
||||
"Exception thrown in file preview: ".$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
'Exception thrown in file preview: '.$e->getMessage(), ['app' => 'admin_audit', 'exception' => $e]
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<name>Cloud Federation API</name>
|
||||
<summary>Enable clouds to communicate with each other and exchange data</summary>
|
||||
<description>The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data.</description>
|
||||
<version>1.13.0</version>
|
||||
<version>1.14.0</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Bjoern Schiessle</author>
|
||||
<namespace>CloudFederationAPI</namespace>
|
||||
@@ -19,6 +19,6 @@
|
||||
<category>integration</category>
|
||||
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
||||
<dependencies>
|
||||
<nextcloud min-version="30" max-version="30"/>
|
||||
<nextcloud min-version="31" max-version="31"/>
|
||||
</dependencies>
|
||||
</info>
|
||||
|
||||
@@ -55,8 +55,8 @@ class Capabilities implements ICapability {
|
||||
|
||||
$resource = $this->provider->createNewResourceType();
|
||||
$resource->setName('file')
|
||||
->setShareTypes(['user', 'group'])
|
||||
->setProtocols(['webdav' => '/public.php/webdav/']);
|
||||
->setShareTypes(['user', 'group'])
|
||||
->setProtocols(['webdav' => '/public.php/webdav/']);
|
||||
|
||||
$this->provider->addResourceType($resource);
|
||||
|
||||
|
||||
@@ -71,6 +71,7 @@ class RequestHandlerController extends Controller {
|
||||
* @param string $resourceType 'file', 'calendar',...
|
||||
*
|
||||
* @return JSONResponse<Http::STATUS_CREATED, CloudFederationAPIAddShare, array{}>|JSONResponse<Http::STATUS_BAD_REQUEST, CloudFederationAPIValidationError, array{}>|JSONResponse<Http::STATUS_NOT_IMPLEMENTED, CloudFederationAPIError, array{}>
|
||||
*
|
||||
* 201: The notification was successfully received. The display name of the recipient might be returned in the body
|
||||
* 400: Bad request due to invalid parameters, e.g. when `shareWith` is not found or required properties are missing
|
||||
* 501: Share type or the resource type is not supported
|
||||
@@ -196,6 +197,7 @@ class RequestHandlerController extends Controller {
|
||||
* @param array<string, mixed>|null $notification The actual payload of the notification
|
||||
*
|
||||
* @return JSONResponse<Http::STATUS_CREATED, array<string, mixed>, array{}>|JSONResponse<Http::STATUS_BAD_REQUEST, CloudFederationAPIValidationError, array{}>|JSONResponse<Http::STATUS_FORBIDDEN|Http::STATUS_NOT_IMPLEMENTED, CloudFederationAPIError, array{}>
|
||||
*
|
||||
* 201: The notification was successfully received
|
||||
* 400: Bad request due to invalid parameters, e.g. when `type` is invalid or missing
|
||||
* 403: Getting resource is not allowed
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<name>Comments</name>
|
||||
<summary>Files app plugin to add comments to files</summary>
|
||||
<description>Files app plugin to add comments to files</description>
|
||||
<version>1.20.1</version>
|
||||
<version>1.21.0</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Arthur Schiwon</author>
|
||||
<author>Vincent Petry</author>
|
||||
@@ -21,7 +21,7 @@
|
||||
<category>social</category>
|
||||
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
||||
<dependencies>
|
||||
<nextcloud min-version="30" max-version="30"/>
|
||||
<nextcloud min-version="31" max-version="31"/>
|
||||
</dependencies>
|
||||
|
||||
<activity>
|
||||
|
||||
@@ -11,7 +11,7 @@ OC.L10N.register(
|
||||
"<strong>Comments</strong> for files" : "<strong>Tuairimí</strong> le haghaidh comhaid",
|
||||
"Files" : "Comhaid",
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Luadh thú ar \"{file}\", i nóta tráchta ó chuntas a scriosadh ó shin",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "Luaigh {user} tú i nóta tráchta ar \"{file}\"",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "Luaigh {úsáideoir} tú i nóta tráchta ar \"{file}\"",
|
||||
"Files app plugin to add comments to files" : "Breiseán aip Comhaid chun tuairimí a chur le comhaid",
|
||||
"Edit comment" : "Cuir trácht in eagar",
|
||||
"Delete comment" : "Scrios nóta tráchta",
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"<strong>Comments</strong> for files" : "<strong>Tuairimí</strong> le haghaidh comhaid",
|
||||
"Files" : "Comhaid",
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Luadh thú ar \"{file}\", i nóta tráchta ó chuntas a scriosadh ó shin",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "Luaigh {user} tú i nóta tráchta ar \"{file}\"",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "Luaigh {úsáideoir} tú i nóta tráchta ar \"{file}\"",
|
||||
"Files app plugin to add comments to files" : "Breiseán aip Comhaid chun tuairimí a chur le comhaid",
|
||||
"Edit comment" : "Cuir trácht in eagar",
|
||||
"Delete comment" : "Scrios nóta tráchta",
|
||||
|
||||
@@ -23,7 +23,7 @@ OC.L10N.register(
|
||||
"Could not reload comments" : "Non foi posíbel volver cargar os comentarios",
|
||||
"No comments yet, start the conversation!" : "Aínda non hai comentarios, comeza a conversa!",
|
||||
"No more messages" : "Non hai máis mensaxes",
|
||||
"Retry" : "Volver tentar",
|
||||
"Retry" : "Tentar de novo",
|
||||
"Failed to mark comments as read" : "Produciuse un fallo ao marcar os comentarios como lidos",
|
||||
"Unable to load the comments list" : "Non é posíbel cargar a lista de comentarios",
|
||||
"_1 new comment_::_{unread} new comments_" : ["1 comentario novo","{unread} comentarios novos"],
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"Could not reload comments" : "Non foi posíbel volver cargar os comentarios",
|
||||
"No comments yet, start the conversation!" : "Aínda non hai comentarios, comeza a conversa!",
|
||||
"No more messages" : "Non hai máis mensaxes",
|
||||
"Retry" : "Volver tentar",
|
||||
"Retry" : "Tentar de novo",
|
||||
"Failed to mark comments as read" : "Produciuse un fallo ao marcar os comentarios como lidos",
|
||||
"Unable to load the comments list" : "Non é posíbel cargar a lista de comentarios",
|
||||
"_1 new comment_::_{unread} new comments_" : ["1 comentario novo","{unread} comentarios novos"],
|
||||
|
||||
@@ -3,7 +3,7 @@ OC.L10N.register(
|
||||
{
|
||||
"Comments" : "Komentari",
|
||||
"You commented" : "Vi ste komentirali",
|
||||
"{author} commented" : "{author} je komentirao",
|
||||
"{author} commented" : "{autor} je komentirao",
|
||||
"You commented on %1$s" : "Vi ste komentirali %1$s",
|
||||
"You commented on {file}" : "Komentirali ste {file}",
|
||||
"%1$s commented on %2$s" : "%1$s je komentirao %2$s",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Komentari",
|
||||
"You commented" : "Vi ste komentirali",
|
||||
"{author} commented" : "{author} je komentirao",
|
||||
"{author} commented" : "{autor} je komentirao",
|
||||
"You commented on %1$s" : "Vi ste komentirali %1$s",
|
||||
"You commented on {file}" : "Komentirali ste {file}",
|
||||
"%1$s commented on %2$s" : "%1$s je komentirao %2$s",
|
||||
|
||||
@@ -3,13 +3,13 @@ OC.L10N.register(
|
||||
{
|
||||
"Comments" : "Komentar",
|
||||
"You commented" : "Anda berkomentar",
|
||||
"{author} commented" : "{author} berkomentar",
|
||||
"{author} commented" : "{Pengarang} berkomentar",
|
||||
"You commented on %1$s" : "Anda berkomentar pada %1$s",
|
||||
"You commented on {file}" : "Anda berkomentar pada {file} ",
|
||||
"%1$s commented on %2$s" : "%1$s dikomentari pada %2$s",
|
||||
"{author} commented on {file}" : "{author} berkomentar pada {file}",
|
||||
"{author} commented on {file}" : "{pengarang} berkomentar pada {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>komentar</strong> pada file",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{user} menyebut Anda dalam sebuah komentar pada \"{file}\" ",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{pengguna} menyebut Anda dalam sebuah komentar pada \"{file}\" ",
|
||||
"Files app plugin to add comments to files" : "Plugin aplikasi file untuk menambah komentar pada file",
|
||||
"Edit comment" : "Sunting komentar",
|
||||
"Delete comment" : "Hapus komentar",
|
||||
@@ -19,6 +19,7 @@ OC.L10N.register(
|
||||
"No more messages" : "Tidak ada pesan lagi",
|
||||
"Retry" : "Ulangi",
|
||||
"Unable to load the comments list" : "Tidak dapat memuat daftar komentar",
|
||||
"_1 new comment_::_{unread} new comments_" : ["komentar baru {belum terbaca}"],
|
||||
"Comment" : "Komentar",
|
||||
"An error occurred while trying to edit the comment" : "Terjadi kesalahan ketika mencoba menyunting komentar",
|
||||
"Comment deleted" : "Komentar dihapus",
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Komentar",
|
||||
"You commented" : "Anda berkomentar",
|
||||
"{author} commented" : "{author} berkomentar",
|
||||
"{author} commented" : "{Pengarang} berkomentar",
|
||||
"You commented on %1$s" : "Anda berkomentar pada %1$s",
|
||||
"You commented on {file}" : "Anda berkomentar pada {file} ",
|
||||
"%1$s commented on %2$s" : "%1$s dikomentari pada %2$s",
|
||||
"{author} commented on {file}" : "{author} berkomentar pada {file}",
|
||||
"{author} commented on {file}" : "{pengarang} berkomentar pada {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>komentar</strong> pada file",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{user} menyebut Anda dalam sebuah komentar pada \"{file}\" ",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{pengguna} menyebut Anda dalam sebuah komentar pada \"{file}\" ",
|
||||
"Files app plugin to add comments to files" : "Plugin aplikasi file untuk menambah komentar pada file",
|
||||
"Edit comment" : "Sunting komentar",
|
||||
"Delete comment" : "Hapus komentar",
|
||||
@@ -17,6 +17,7 @@
|
||||
"No more messages" : "Tidak ada pesan lagi",
|
||||
"Retry" : "Ulangi",
|
||||
"Unable to load the comments list" : "Tidak dapat memuat daftar komentar",
|
||||
"_1 new comment_::_{unread} new comments_" : ["komentar baru {belum terbaca}"],
|
||||
"Comment" : "Komentar",
|
||||
"An error occurred while trying to edit the comment" : "Terjadi kesalahan ketika mencoba menyunting komentar",
|
||||
"Comment deleted" : "Komentar dihapus",
|
||||
|
||||
@@ -26,7 +26,7 @@ OC.L10N.register(
|
||||
"Retry" : "Prøv igjen",
|
||||
"Failed to mark comments as read" : "Markering av kommentarer som lest feilet",
|
||||
"Unable to load the comments list" : "Kan ikke laste inn kommentarlisten",
|
||||
"_1 new comment_::_{unread} new comments_" : ["[uleste] nye kommentarer","{unread} nye kommentarer"],
|
||||
"_1 new comment_::_{unread} new comments_" : ["[uleste] nye kommentarer","{uleste} nye kommentarer"],
|
||||
"Comment" : "Kommentar",
|
||||
"An error occurred while trying to edit the comment" : "Det oppsto en feil under forsøk på å redigere kommentaren",
|
||||
"Comment deleted" : "Kommentar slettet",
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
"Retry" : "Prøv igjen",
|
||||
"Failed to mark comments as read" : "Markering av kommentarer som lest feilet",
|
||||
"Unable to load the comments list" : "Kan ikke laste inn kommentarlisten",
|
||||
"_1 new comment_::_{unread} new comments_" : ["[uleste] nye kommentarer","{unread} nye kommentarer"],
|
||||
"_1 new comment_::_{unread} new comments_" : ["[uleste] nye kommentarer","{uleste} nye kommentarer"],
|
||||
"Comment" : "Kommentar",
|
||||
"An error occurred while trying to edit the comment" : "Det oppsto en feil under forsøk på å redigere kommentaren",
|
||||
"Comment deleted" : "Kommentar slettet",
|
||||
|
||||
@@ -15,9 +15,7 @@ OC.L10N.register(
|
||||
"Edit comment" : "Bewerk reactie",
|
||||
"Delete comment" : "Verwijder reactie",
|
||||
"Cancel edit" : "Annuleer bewerking",
|
||||
"New comment" : "Nieuwe reactie",
|
||||
"Post comment" : "Plaats reactie",
|
||||
"@ for mentions, : for emoji, / for smart picker" : "@ voor vermeldingen, : voor emoji, / voor smart picker",
|
||||
"No comments yet, start the conversation!" : "Nog geen reacties, start de discussie!",
|
||||
"No more messages" : "Geen berichten meer",
|
||||
"Retry" : "Opnieuw proberen",
|
||||
|
||||
@@ -13,9 +13,7 @@
|
||||
"Edit comment" : "Bewerk reactie",
|
||||
"Delete comment" : "Verwijder reactie",
|
||||
"Cancel edit" : "Annuleer bewerking",
|
||||
"New comment" : "Nieuwe reactie",
|
||||
"Post comment" : "Plaats reactie",
|
||||
"@ for mentions, : for emoji, / for smart picker" : "@ voor vermeldingen, : voor emoji, / voor smart picker",
|
||||
"No comments yet, start the conversation!" : "Nog geen reacties, start de discussie!",
|
||||
"No more messages" : "Geen berichten meer",
|
||||
"Retry" : "Opnieuw proberen",
|
||||
|
||||
@@ -9,7 +9,7 @@ OC.L10N.register(
|
||||
"%1$s commented on %2$s" : "%1$s napiše opombo na %2$s",
|
||||
"{author} commented on {file}" : "{author} napiše opombo na {file}",
|
||||
"<strong>Comments</strong> for files" : "Vpisane so <strong>opombe</strong> k datotekam",
|
||||
"Files" : "Datoteke",
|
||||
"Files" : "Datoteke s podpisi",
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Uporabnik, ki je sicer že izbrisan, vas omenja v opombi k datoteki »{file}«.",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{user} vas omeni v opombi k datoteki »{file}«",
|
||||
"Files app plugin to add comments to files" : "Vstavek programa Datoteke za dodajanje opomb k datotekam",
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"%1$s commented on %2$s" : "%1$s napiše opombo na %2$s",
|
||||
"{author} commented on {file}" : "{author} napiše opombo na {file}",
|
||||
"<strong>Comments</strong> for files" : "Vpisane so <strong>opombe</strong> k datotekam",
|
||||
"Files" : "Datoteke",
|
||||
"Files" : "Datoteke s podpisi",
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Uporabnik, ki je sicer že izbrisan, vas omenja v opombi k datoteki »{file}«.",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{user} vas omeni v opombi k datoteki »{file}«",
|
||||
"Files app plugin to add comments to files" : "Vstavek programa Datoteke za dodajanje opomb k datotekam",
|
||||
|
||||
@@ -67,7 +67,7 @@ class Listener {
|
||||
$activity->setApp('comments')
|
||||
->setType('comments')
|
||||
->setAuthor($actor)
|
||||
->setObject($event->getComment()->getObjectType(), (int) $event->getComment()->getObjectId())
|
||||
->setObject($event->getComment()->getObjectType(), (int)$event->getComment()->getObjectId())
|
||||
->setMessage('add_comment_message', [
|
||||
'commentId' => $event->getComment()->getId(),
|
||||
]);
|
||||
@@ -79,7 +79,7 @@ class Listener {
|
||||
|
||||
$activity->setSubject('add_comment_subject', [
|
||||
'actor' => $actor,
|
||||
'fileId' => (int) $event->getComment()->getObjectId(),
|
||||
'fileId' => (int)$event->getComment()->getObjectId(),
|
||||
'filePath' => trim($path, '/'),
|
||||
]);
|
||||
$this->activityManager->publish($activity);
|
||||
|
||||
@@ -148,7 +148,7 @@ class Provider implements IProvider {
|
||||
$commentId = $messageParameters['commentId'] ?? $messageParameters[0];
|
||||
|
||||
try {
|
||||
$comment = $this->commentsManager->get((string) $commentId);
|
||||
$comment = $this->commentsManager->get((string)$commentId);
|
||||
$message = $comment->getMessage();
|
||||
|
||||
$mentionCount = 1;
|
||||
|
||||
@@ -85,7 +85,7 @@ class LegacyProvider extends Provider {
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
protected function getFileForComment(Folder $userFolder, IComment $comment): Node {
|
||||
$nodes = $userFolder->getById((int) $comment->getObjectId());
|
||||
$nodes = $userFolder->getById((int)$comment->getObjectId());
|
||||
if (empty($nodes)) {
|
||||
throw new NotFoundException('File not found');
|
||||
}
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
import { action } from './inlineUnreadCommentsAction'
|
||||
import { expect } from '@jest/globals'
|
||||
import { File, Permission, View, FileAction } from '@nextcloud/files'
|
||||
import { describe, expect, test, vi } from 'vitest'
|
||||
|
||||
import { action } from './inlineUnreadCommentsAction'
|
||||
import logger from '../logger'
|
||||
|
||||
const view = {
|
||||
@@ -29,7 +30,7 @@ describe('Inline unread comments action display name tests', () => {
|
||||
expect(action.id).toBe('comments-unread')
|
||||
expect(action.displayName([file], view)).toBe('')
|
||||
expect(action.title!([file], view)).toBe('1 new comment')
|
||||
expect(action.iconSvgInline([], view)).toBe('<svg>SvgMock</svg>')
|
||||
expect(action.iconSvgInline([], view)).toMatch(/<svg.+<\/svg>/)
|
||||
expect(action.enabled!([file], view)).toBe(true)
|
||||
expect(action.inline!(file, view)).toBe(true)
|
||||
expect(action.default).toBeUndefined()
|
||||
@@ -115,8 +116,8 @@ describe('Inline unread comments action enabled tests', () => {
|
||||
|
||||
describe('Inline unread comments action execute tests', () => {
|
||||
test('Action opens sidebar', async () => {
|
||||
const openMock = jest.fn()
|
||||
const setActiveTabMock = jest.fn()
|
||||
const openMock = vi.fn()
|
||||
const setActiveTabMock = vi.fn()
|
||||
window.OCA = {
|
||||
Files: {
|
||||
Sidebar: {
|
||||
@@ -145,8 +146,8 @@ describe('Inline unread comments action execute tests', () => {
|
||||
})
|
||||
|
||||
test('Action handles sidebar open failure', async () => {
|
||||
const openMock = jest.fn(() => { throw new Error('Mock error') })
|
||||
const setActiveTabMock = jest.fn()
|
||||
const openMock = vi.fn(() => { throw new Error('Mock error') })
|
||||
const setActiveTabMock = vi.fn()
|
||||
window.OCA = {
|
||||
Files: {
|
||||
Sidebar: {
|
||||
@@ -155,7 +156,7 @@ describe('Inline unread comments action execute tests', () => {
|
||||
},
|
||||
},
|
||||
}
|
||||
jest.spyOn(logger, 'error').mockImplementation(() => jest.fn())
|
||||
vi.spyOn(logger, 'error').mockImplementation(() => vi.fn())
|
||||
|
||||
const file = new File({
|
||||
id: 1,
|
||||
|
||||
@@ -11,9 +11,9 @@ use OCP\Comments\ICommentsManager;
|
||||
use Test\TestCase;
|
||||
|
||||
class CommentersSorterTest extends TestCase {
|
||||
/** @var ICommentsManager|\PHPUnit\Framework\MockObject\MockObject */
|
||||
/** @var ICommentsManager|\PHPUnit\Framework\MockObject\MockObject */
|
||||
protected $commentsManager;
|
||||
/** @var CommentersSorter */
|
||||
/** @var CommentersSorter */
|
||||
protected $sorter;
|
||||
|
||||
protected function setUp(): void {
|
||||
|
||||
@@ -13,7 +13,7 @@ use OCP\Comments\IComment;
|
||||
use Test\TestCase;
|
||||
|
||||
class EventHandlerTest extends TestCase {
|
||||
/** @var CommentsEventListener */
|
||||
/** @var CommentsEventListener */
|
||||
protected $eventHandler;
|
||||
|
||||
/** @var ActivityListener|\PHPUnit\Framework\MockObject\MockObject */
|
||||
|
||||
@@ -26,7 +26,7 @@ class ListenerTest extends TestCase {
|
||||
/** @var IURLGenerator|\PHPUnit\Framework\MockObject\MockObject */
|
||||
protected $urlGenerator;
|
||||
|
||||
/** @var Listener */
|
||||
/** @var Listener */
|
||||
protected $listener;
|
||||
|
||||
protected function setUp(): void {
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<name>Contacts Interaction</name>
|
||||
<summary>Manages interaction between accounts and contacts</summary>
|
||||
<description>Collect data about accounts and contacts interactions and provide an address book for the data</description>
|
||||
<version>1.11.0</version>
|
||||
<version>1.12.0</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Christoph Wurst</author>
|
||||
<author homepage="https://github.com/nextcloud/groupware">Nextcloud Groupware Team</author>
|
||||
@@ -21,7 +21,7 @@
|
||||
<category>social</category>
|
||||
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
||||
<dependencies>
|
||||
<nextcloud min-version="30" max-version="30"/>
|
||||
<nextcloud min-version="31" max-version="31"/>
|
||||
</dependencies>
|
||||
<background-jobs>
|
||||
<job>OCA\ContactsInteraction\BackgroundJob\CleanupJob</job>
|
||||
@@ -30,5 +30,11 @@
|
||||
<address-book-plugins>
|
||||
<plugin>OCA\ContactsInteraction\AddressBookProvider</plugin>
|
||||
</address-book-plugins>
|
||||
<plugins>
|
||||
<plugin>OCA\ContactsInteraction\DAV\Plugin</plugin>
|
||||
</plugins>
|
||||
</sabre>
|
||||
<settings>
|
||||
<personal>OCA\ContactsInteraction\Settings\Personal</personal>
|
||||
</settings>
|
||||
</info>
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2023 Thomas Citharel <nextcloud@tcit.fr>
|
||||
*
|
||||
* @author Thomas Citharel <nextcloud@tcit.fr>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
return [
|
||||
'ocs' => [
|
||||
['name' => 'config#disable', 'url' => '/config/user/disable', 'verb' => 'POST'],
|
||||
],
|
||||
];
|
||||
@@ -12,9 +12,12 @@ return array(
|
||||
'OCA\\ContactsInteraction\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
|
||||
'OCA\\ContactsInteraction\\BackgroundJob\\CleanupJob' => $baseDir . '/../lib/BackgroundJob/CleanupJob.php',
|
||||
'OCA\\ContactsInteraction\\Card' => $baseDir . '/../lib/Card.php',
|
||||
'OCA\\ContactsInteraction\\DAV\\Plugin' => $baseDir . '/../lib/DAV/Plugin.php',
|
||||
'OCA\\ContactsInteraction\\Db\\CardSearchDao' => $baseDir . '/../lib/Db/CardSearchDao.php',
|
||||
'OCA\\ContactsInteraction\\Db\\RecentContact' => $baseDir . '/../lib/Db/RecentContact.php',
|
||||
'OCA\\ContactsInteraction\\Db\\RecentContactMapper' => $baseDir . '/../lib/Db/RecentContactMapper.php',
|
||||
'OCA\\ContactsInteraction\\Listeners\\ContactInteractionListener' => $baseDir . '/../lib/Listeners/ContactInteractionListener.php',
|
||||
'OCA\\ContactsInteraction\\Listeners\\UserPreferenceListener' => $baseDir . '/../lib/Listeners/UserPreferenceListener.php',
|
||||
'OCA\\ContactsInteraction\\Migration\\Version010000Date20200304152605' => $baseDir . '/../lib/Migration/Version010000Date20200304152605.php',
|
||||
'OCA\\ContactsInteraction\\Settings\\Personal' => $baseDir . '/../lib/Settings/Personal.php',
|
||||
);
|
||||
|
||||
@@ -27,11 +27,14 @@ class ComposerStaticInitContactsInteraction
|
||||
'OCA\\ContactsInteraction\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
|
||||
'OCA\\ContactsInteraction\\BackgroundJob\\CleanupJob' => __DIR__ . '/..' . '/../lib/BackgroundJob/CleanupJob.php',
|
||||
'OCA\\ContactsInteraction\\Card' => __DIR__ . '/..' . '/../lib/Card.php',
|
||||
'OCA\\ContactsInteraction\\DAV\\Plugin' => __DIR__ . '/..' . '/../lib/DAV/Plugin.php',
|
||||
'OCA\\ContactsInteraction\\Db\\CardSearchDao' => __DIR__ . '/..' . '/../lib/Db/CardSearchDao.php',
|
||||
'OCA\\ContactsInteraction\\Db\\RecentContact' => __DIR__ . '/..' . '/../lib/Db/RecentContact.php',
|
||||
'OCA\\ContactsInteraction\\Db\\RecentContactMapper' => __DIR__ . '/..' . '/../lib/Db/RecentContactMapper.php',
|
||||
'OCA\\ContactsInteraction\\Listeners\\ContactInteractionListener' => __DIR__ . '/..' . '/../lib/Listeners/ContactInteractionListener.php',
|
||||
'OCA\\ContactsInteraction\\Listeners\\UserPreferenceListener' => __DIR__ . '/..' . '/../lib/Listeners/UserPreferenceListener.php',
|
||||
'OCA\\ContactsInteraction\\Migration\\Version010000Date20200304152605' => __DIR__ . '/..' . '/../lib/Migration/Version010000Date20200304152605.php',
|
||||
'OCA\\ContactsInteraction\\Settings\\Personal' => __DIR__ . '/..' . '/../lib/Settings/Personal.php',
|
||||
);
|
||||
|
||||
public static function getInitializer(ClassLoader $loader)
|
||||
|
||||
@@ -3,8 +3,6 @@ OC.L10N.register(
|
||||
{
|
||||
"Recently contacted" : "Недавние контакты",
|
||||
"Contacts Interaction" : "Взаимодействие с контактами",
|
||||
"Manages interaction between accounts and contacts" : "Управляет взаимодействием между учетными записями и контактами",
|
||||
"Collect data about accounts and contacts interactions and provide an address book for the data" : "Соберите данные об учетных записях и контактах, взаимодействиях и предоставьте адресную книгу для хранения этих данных",
|
||||
"Manages interaction between users and contacts" : "Отслеживание взаимодейтсвей пользователей и контактов",
|
||||
"Collect data about user and contacts interactions and provide an address book for the data" : "Сбор данных о взаимодействиях пользователей и контактов и создание адресных книг на основе этих данных"
|
||||
},
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
{ "translations": {
|
||||
"Recently contacted" : "Недавние контакты",
|
||||
"Contacts Interaction" : "Взаимодействие с контактами",
|
||||
"Manages interaction between accounts and contacts" : "Управляет взаимодействием между учетными записями и контактами",
|
||||
"Collect data about accounts and contacts interactions and provide an address book for the data" : "Соберите данные об учетных записях и контактах, взаимодействиях и предоставьте адресную книгу для хранения этих данных",
|
||||
"Manages interaction between users and contacts" : "Отслеживание взаимодейтсвей пользователей и контактов",
|
||||
"Collect data about user and contacts interactions and provide an address book for the data" : "Сбор данных о взаимодействиях пользователей и контактов и создание адресных книг на основе этих данных"
|
||||
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
|
||||
|
||||
@@ -39,7 +39,7 @@ class AddressBook extends ExternalAddressBook implements IACL {
|
||||
* @throws Exception
|
||||
*/
|
||||
public function delete(): void {
|
||||
throw new Exception("This addressbook is immutable");
|
||||
throw new Exception('This addressbook is immutable');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -47,7 +47,7 @@ class AddressBook extends ExternalAddressBook implements IACL {
|
||||
* @throws Exception
|
||||
*/
|
||||
public function createFile($name, $data = null) {
|
||||
throw new Exception("This addressbook is immutable");
|
||||
throw new Exception('This addressbook is immutable');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -65,7 +65,7 @@ class AddressBook extends ExternalAddressBook implements IACL {
|
||||
$this->getACL()
|
||||
);
|
||||
} catch (DoesNotExistException $ex) {
|
||||
throw new NotFound("Contact does not exist: " . $ex->getMessage(), 0, $ex);
|
||||
throw new NotFound('Contact does not exist: ' . $ex->getMessage(), 0, $ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ class AddressBook extends ExternalAddressBook implements IACL {
|
||||
* @throws Exception
|
||||
*/
|
||||
public function propPatch(PropPatch $propPatch) {
|
||||
throw new Exception("This addressbook is immutable");
|
||||
throw new Exception('This addressbook is immutable');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -12,6 +12,7 @@ use OCA\ContactsInteraction\AppInfo\Application;
|
||||
use OCA\ContactsInteraction\Db\RecentContactMapper;
|
||||
use OCA\DAV\CardDAV\Integration\ExternalAddressBook;
|
||||
use OCA\DAV\CardDAV\Integration\IAddressBookProvider;
|
||||
use OCP\IConfig;
|
||||
use OCP\IL10N;
|
||||
|
||||
class AddressBookProvider implements IAddressBookProvider {
|
||||
@@ -19,8 +20,8 @@ class AddressBookProvider implements IAddressBookProvider {
|
||||
public function __construct(
|
||||
private RecentContactMapper $mapper,
|
||||
private IL10N $l10n,
|
||||
) {
|
||||
}
|
||||
private IConfig $config
|
||||
) { }
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
@@ -33,6 +34,9 @@ class AddressBookProvider implements IAddressBookProvider {
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function fetchAllForAddressBookHome(string $principalUri): array {
|
||||
if ($this->disabledForPrincipal($principalUri)) {
|
||||
return [];
|
||||
}
|
||||
return [
|
||||
new AddressBook($this->mapper, $this->l10n, $principalUri)
|
||||
];
|
||||
@@ -42,17 +46,29 @@ class AddressBookProvider implements IAddressBookProvider {
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function hasAddressBookInAddressBookHome(string $principalUri, string $uri): bool {
|
||||
return $uri === AddressBook::URI;
|
||||
return $uri === AddressBook::URI && !$this->disabledForPrincipal($principalUri);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getAddressBookInAddressBookHome(string $principalUri, string $uri): ?ExternalAddressBook {
|
||||
if ($uri === AddressBook::URI) {
|
||||
if ($uri === AddressBook::URI && !$this->disabledForPrincipal($principalUri)) {
|
||||
return new AddressBook($this->mapper, $this->l10n, $principalUri);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private function disabledForPrincipal(string $principalUri): bool {
|
||||
$userId = $this->principalToUserId($principalUri);
|
||||
return $userId !== null && $this->config->getUserValue($userId, Application::APP_ID, 'disableContactsInteractionAddressBook', 'no') === 'yes';
|
||||
}
|
||||
|
||||
private function principalToUserId(string $userPrincipal):?string {
|
||||
if (str_starts_with($userPrincipal, 'principals/users/')) {
|
||||
return substr($userPrincipal, 17);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,10 +9,13 @@ declare(strict_types=1);
|
||||
namespace OCA\ContactsInteraction\AppInfo;
|
||||
|
||||
use OCA\ContactsInteraction\Listeners\ContactInteractionListener;
|
||||
use OCA\ContactsInteraction\Listeners\UserPreferenceListener;
|
||||
use OCP\AppFramework\App;
|
||||
use OCP\AppFramework\Bootstrap\IBootContext;
|
||||
use OCP\AppFramework\Bootstrap\IBootstrap;
|
||||
use OCP\AppFramework\Bootstrap\IRegistrationContext;
|
||||
use OCP\Config\BeforePreferenceDeletedEvent;
|
||||
use OCP\Config\BeforePreferenceSetEvent;
|
||||
use OCP\Contacts\Events\ContactInteractedWithEvent;
|
||||
|
||||
class Application extends App implements IBootstrap {
|
||||
@@ -24,6 +27,9 @@ class Application extends App implements IBootstrap {
|
||||
|
||||
public function register(IRegistrationContext $context): void {
|
||||
$context->registerEventListener(ContactInteractedWithEvent::class, ContactInteractionListener::class);
|
||||
|
||||
$context->registerEventListener(BeforePreferenceDeletedEvent::class, UserPreferenceListener::class);
|
||||
$context->registerEventListener(BeforePreferenceSetEvent::class, UserPreferenceListener::class);
|
||||
}
|
||||
|
||||
public function boot(IBootContext $context): void {
|
||||
|
||||
@@ -70,7 +70,7 @@ class Card implements ICard, IACL {
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getETag(): ?string {
|
||||
return '"' . md5((string) $this->getLastModified()) . '"';
|
||||
return '"' . md5((string)$this->getLastModified()) . '"';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -91,7 +91,7 @@ class Card implements ICard, IACL {
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getName(): string {
|
||||
return (string) $this->contact->getId();
|
||||
return (string)$this->contact->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright 2023, Thomas Citharel <nextcloud@tcit.fr>
|
||||
*
|
||||
* @author Thomas Citharel <nextcloud@tcit.fr>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
namespace OCA\ContactsInteraction\DAV;
|
||||
|
||||
use OCA\ContactsInteraction\AddressBook;
|
||||
use OCA\ContactsInteraction\AppInfo\Application;
|
||||
use OCA\ContactsInteraction\Db\RecentContactMapper;
|
||||
use OCP\IConfig;
|
||||
use Sabre\DAV\Server;
|
||||
use Sabre\DAV\ServerPlugin;
|
||||
use Sabre\HTTP\RequestInterface;
|
||||
use Sabre\HTTP\ResponseInterface;
|
||||
|
||||
/**
|
||||
* Allows users to disable the feature by deleting the addressbook
|
||||
*
|
||||
* @package OCA\DAV\CalDAV\BirthdayCalendar
|
||||
*/
|
||||
class Plugin extends ServerPlugin {
|
||||
|
||||
protected Server $server;
|
||||
|
||||
public function __construct(protected IConfig $config, protected RecentContactMapper $recentContactMapper) {
|
||||
}
|
||||
|
||||
/**
|
||||
* This method should return a list of server-features.
|
||||
*
|
||||
* This is for example 'versioning' and is added to the DAV: header
|
||||
* in an OPTIONS response.
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
public function getFeatures() {
|
||||
return ['nc-disable-recently-contacted'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a plugin name.
|
||||
*
|
||||
* Using this name other plugins will be able to access other plugins
|
||||
* using Sabre\DAV\Server::getPlugin
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getPluginName() {
|
||||
return 'nc-disable-recently-contacted';
|
||||
}
|
||||
|
||||
/**
|
||||
* This initializes the plugin.
|
||||
*
|
||||
* This function is called by Sabre\DAV\Server, after
|
||||
* addPlugin is called.
|
||||
*
|
||||
* This method should set up the required event subscriptions.
|
||||
*
|
||||
* @param Server $server
|
||||
*/
|
||||
public function initialize(Server $server) {
|
||||
$this->server = $server;
|
||||
|
||||
$this->server->on('method:DELETE', [$this, 'httpDelete']);
|
||||
}
|
||||
|
||||
/**
|
||||
* We intercept this to handle POST requests on contacts homes.
|
||||
*
|
||||
* @param RequestInterface $request
|
||||
* @param ResponseInterface $response
|
||||
*
|
||||
* @return bool|void
|
||||
*/
|
||||
public function httpDelete(RequestInterface $request, ResponseInterface $response) {
|
||||
$node = $this->server->tree->getNodeForPath($this->server->getRequestUri());
|
||||
if (!($node instanceof AddressBook)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$principalUri = $node->getOwner();
|
||||
$userId = substr($principalUri, 17);
|
||||
|
||||
$this->config->setUserValue($userId, Application::APP_ID, 'disableContactsInteractionAddressBook', 'yes');
|
||||
$this->recentContactMapper->cleanForUser($userId);
|
||||
|
||||
$this->server->httpResponse->setStatus(204);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -50,7 +50,7 @@ class CardSearchDao {
|
||||
}
|
||||
$addressbooksQuery->selectDistinct('id')
|
||||
->from('addressbooks')
|
||||
->where($addressbooksQuery->expr()->eq('principaluri', $cardQuery->createNamedParameter("principals/users/" . $user->getUID())));
|
||||
->where($addressbooksQuery->expr()->eq('principaluri', $cardQuery->createNamedParameter('principals/users/' . $user->getUID())));
|
||||
$propQuery->selectDistinct('cardid')
|
||||
->from('cards_properties')
|
||||
->where($propQuery->expr()->in('addressbookid', $propQuery->createFunction($addressbooksQuery->getSQL()), IQueryBuilder::PARAM_INT_ARRAY))
|
||||
|
||||
@@ -112,4 +112,14 @@ class RecentContactMapper extends QBMapper {
|
||||
|
||||
$delete->executeStatement();
|
||||
}
|
||||
|
||||
public function cleanForUser(string $userId): void {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
|
||||
$delete = $qb
|
||||
->delete($this->getTableName())
|
||||
->where($qb->expr()->eq('actor_uid', $qb->createNamedParameter($userId)));
|
||||
|
||||
$delete->executeStatement();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ declare(strict_types=1);
|
||||
*/
|
||||
namespace OCA\ContactsInteraction\Listeners;
|
||||
|
||||
use OCA\ContactsInteraction\AppInfo\Application;
|
||||
use OCA\ContactsInteraction\Db\CardSearchDao;
|
||||
use OCA\ContactsInteraction\Db\RecentContact;
|
||||
use OCA\ContactsInteraction\Db\RecentContactMapper;
|
||||
@@ -16,6 +17,7 @@ use OCP\AppFramework\Utility\ITimeFactory;
|
||||
use OCP\Contacts\Events\ContactInteractedWithEvent;
|
||||
use OCP\EventDispatcher\Event;
|
||||
use OCP\EventDispatcher\IEventListener;
|
||||
use OCP\IConfig;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IL10N;
|
||||
use OCP\IUserManager;
|
||||
@@ -35,6 +37,7 @@ class ContactInteractionListener implements IEventListener {
|
||||
private IDBConnection $dbConnection,
|
||||
private ITimeFactory $timeFactory,
|
||||
private IL10N $l10n,
|
||||
private IConfig $config,
|
||||
private LoggerInterface $logger,
|
||||
) {
|
||||
}
|
||||
@@ -45,12 +48,17 @@ class ContactInteractionListener implements IEventListener {
|
||||
}
|
||||
|
||||
if ($event->getUid() === null && $event->getEmail() === null && $event->getFederatedCloudId() === null) {
|
||||
$this->logger->warning("Contact interaction event has no user identifier set");
|
||||
$this->logger->warning('Contact interaction event has no user identifier set');
|
||||
return;
|
||||
}
|
||||
|
||||
if ($event->getUid() !== null && $event->getUid() === $event->getActor()->getUID()) {
|
||||
$this->logger->info("Ignoring contact interaction with self");
|
||||
$this->logger->info('Ignoring contact interaction with self');
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->config->getUserValue($event->getActor()->getUID(), Application::APP_ID, 'disableContactsInteractionAddressBook', 'no') === 'yes') {
|
||||
$this->logger->debug("Ignoring contact interaction as it's disabled for this user");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -75,9 +83,9 @@ class ContactInteractionListener implements IEventListener {
|
||||
$federatedCloudId
|
||||
);
|
||||
if (!empty($existingRecentlyContacted)) {
|
||||
$now = $this->timeFactory->getTime();
|
||||
$now = $this->timeFactory->now();
|
||||
foreach ($existingRecentlyContacted as $c) {
|
||||
$c->setLastContact($now);
|
||||
$c->setLastContact($now->getTimestamp());
|
||||
$this->mapper->update($c);
|
||||
}
|
||||
|
||||
@@ -95,7 +103,7 @@ class ContactInteractionListener implements IEventListener {
|
||||
if ($federatedCloudId !== null) {
|
||||
$contact->setFederatedCloudId($federatedCloudId);
|
||||
}
|
||||
$contact->setLastContact($this->timeFactory->getTime());
|
||||
$contact->setLastContact($this->timeFactory->now()->getTimestamp());
|
||||
$contact->setCard($this->generateCard($contact));
|
||||
|
||||
$this->mapper->insert($contact);
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
namespace OCA\ContactsInteraction\Listeners;
|
||||
|
||||
use OCA\ContactsInteraction\AppInfo\Application;
|
||||
use OCA\ContactsInteraction\Db\RecentContactMapper;
|
||||
use OCP\BackgroundJob\IJobList;
|
||||
use OCP\Config\BeforePreferenceDeletedEvent;
|
||||
use OCP\Config\BeforePreferenceSetEvent;
|
||||
use OCP\EventDispatcher\Event;
|
||||
use OCP\EventDispatcher\IEventListener;
|
||||
|
||||
/** @template-implements IEventListener<BeforePreferenceSetEvent|BeforePreferenceDeletedEvent> */
|
||||
class UserPreferenceListener implements IEventListener {
|
||||
|
||||
public function __construct(protected IJobList $jobList, private RecentContactMapper $recentContactMapper) { }
|
||||
|
||||
public function handle(Event $event): void {
|
||||
if (!$event instanceof BeforePreferenceSetEvent && !$event instanceof BeforePreferenceDeletedEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($event->getAppId() !== Application::APP_ID || $event->getConfigKey() !== 'disableContactsInteractionAddressBook') {
|
||||
return;
|
||||
}
|
||||
|
||||
$enabled = $event->getConfigValue() === 'yes';
|
||||
$event->setValid($enabled);
|
||||
if (!$enabled) {
|
||||
$this->recentContactMapper->cleanForUser($event->getUserId());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023 Thomas Citharel <nextcloud@tcit.fr>
|
||||
*
|
||||
* @author Thomas Citharel <nextcloud@tcit.fr>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\ContactsInteraction\Settings;
|
||||
|
||||
use OCA\ContactsInteraction\AppInfo\Application;
|
||||
use OCP\AppFramework\Http\TemplateResponse;
|
||||
use OCP\AppFramework\Services\IInitialState;
|
||||
use OCP\IConfig;
|
||||
use OCP\Settings\ISettings;
|
||||
use OCP\Util;
|
||||
|
||||
class Personal implements ISettings {
|
||||
public function __construct(private IInitialState $initialState, private IConfig $config, private ?string $userId) { }
|
||||
|
||||
public function getForm(): TemplateResponse {
|
||||
$this->initialState->provideInitialState('generateContactsInteraction', $this->config->getUserValue($this->userId, Application::APP_ID, 'disableContactsInteractionAddressBook', 'no') === 'no');
|
||||
Util::addScript(Application::APP_ID, 'settings-personal');
|
||||
return new TemplateResponse(Application::APP_ID, 'personal');
|
||||
}
|
||||
|
||||
public function getSection(): string {
|
||||
return 'contacts';
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-return 40
|
||||
*/
|
||||
public function getPriority(): int {
|
||||
return 40;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* @copyright Copyright (c) 2023 Thomas Citharel <nextcloud@tcit.fr>
|
||||
*
|
||||
* @author Thomas Citharel <nextcloud@tcit.fr>
|
||||
*
|
||||
* @license AGPL-3.0-or-later
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
import Vue from 'vue'
|
||||
import { translate } from '@nextcloud/l10n'
|
||||
import PersonalSettings from './views/PersonalSettings.vue'
|
||||
|
||||
Vue.prototype.t = translate
|
||||
|
||||
export default new Vue({
|
||||
el: '#settings-personal-contacts-interaction',
|
||||
name: 'Settings',
|
||||
render: (h) => h(PersonalSettings),
|
||||
})
|
||||
@@ -0,0 +1,51 @@
|
||||
<template>
|
||||
<NcSettingsSection :title="t('contactsinteraction', 'Contacts interaction')"
|
||||
:description="t('contactsinteraction', 'Expose contacts you have been interacting with in the Contacts app')">
|
||||
<NcCheckboxRadioSwitch id="generateContactsInteraction"
|
||||
:checked.sync="generateContactsInteraction"
|
||||
type="switch">
|
||||
{{ t('contactsinteraction', 'Generate an addressbook for contacts you recently interacted with') }}
|
||||
</NcCheckboxRadioSwitch>
|
||||
</NcSettingsSection>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { NcSettingsSection, NcCheckboxRadioSwitch } from '@nextcloud/vue'
|
||||
import axios from '@nextcloud/axios'
|
||||
import { generateOcsUrl } from '@nextcloud/router'
|
||||
import { loadState } from '@nextcloud/initial-state'
|
||||
|
||||
export default {
|
||||
name: 'PersonalSettings',
|
||||
components: {
|
||||
NcCheckboxRadioSwitch,
|
||||
NcSettingsSection,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
generateContactsInteraction: loadState('contactsinteraction', 'generateContactsInteraction'),
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
generateContactsInteraction(value) {
|
||||
if (!value) {
|
||||
axios({
|
||||
url: generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {
|
||||
appId: 'contactsinteraction',
|
||||
configKey: 'disableContactsInteractionAddressBook',
|
||||
}),
|
||||
data: {
|
||||
configValue: 'yes',
|
||||
},
|
||||
method: 'POST',
|
||||
})
|
||||
} else {
|
||||
axios.delete(generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {
|
||||
appId: 'contactsinteraction',
|
||||
configKey: 'disableContactsInteractionAddressBook',
|
||||
}))
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1 @@
|
||||
<div id="settings-personal-contacts-interaction"></div>
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
The Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! People can add the widgets they like and change the background to their liking.]]>
|
||||
</description>
|
||||
<version>7.10.0</version>
|
||||
<version>7.11.0</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Julius Härtl</author>
|
||||
<namespace>Dashboard</namespace>
|
||||
@@ -22,7 +22,7 @@ The Nextcloud Dashboard is your starting point of the day, giving you an overvie
|
||||
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
||||
|
||||
<dependencies>
|
||||
<nextcloud min-version="30" max-version="30"/>
|
||||
<nextcloud min-version="31" max-version="31"/>
|
||||
</dependencies>
|
||||
|
||||
<navigations>
|
||||
|
||||
@@ -10,9 +10,9 @@ OC.L10N.register(
|
||||
"Get more widgets from the App Store" : "从应用商店获取更多小部件",
|
||||
"Weather service" : "天气服务",
|
||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "为了您的隐私,天气数据由您的 Nextcloud 服务器为您获取,这样天气服务就无法获得您的个人信息。",
|
||||
"Weather data from Met.no" : "天气数据来自 Met.no",
|
||||
"Weather data from Met.no" : "天气数据获取自 Met.no",
|
||||
"geocoding with Nominatim" : "使用 Nominatim 地理编码",
|
||||
"elevation data from OpenTopoData" : "海拔数据来自 OpenTopoData",
|
||||
"elevation data from OpenTopoData" : "海拔数据获取自 OpenTopoData",
|
||||
"Weather" : "天气",
|
||||
"Status" : "状态",
|
||||
"Good morning" : "早上好",
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
"Get more widgets from the App Store" : "从应用商店获取更多小部件",
|
||||
"Weather service" : "天气服务",
|
||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "为了您的隐私,天气数据由您的 Nextcloud 服务器为您获取,这样天气服务就无法获得您的个人信息。",
|
||||
"Weather data from Met.no" : "天气数据来自 Met.no",
|
||||
"Weather data from Met.no" : "天气数据获取自 Met.no",
|
||||
"geocoding with Nominatim" : "使用 Nominatim 地理编码",
|
||||
"elevation data from OpenTopoData" : "海拔数据来自 OpenTopoData",
|
||||
"elevation data from OpenTopoData" : "海拔数据获取自 OpenTopoData",
|
||||
"Weather" : "天气",
|
||||
"Status" : "状态",
|
||||
"Good morning" : "早上好",
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<name>WebDAV</name>
|
||||
<summary>WebDAV endpoint</summary>
|
||||
<description>WebDAV endpoint</description>
|
||||
<version>1.31.1</version>
|
||||
<version>1.32.0</version>
|
||||
<licence>agpl</licence>
|
||||
<author>owncloud.org</author>
|
||||
<namespace>DAV</namespace>
|
||||
@@ -20,7 +20,7 @@
|
||||
<category>integration</category>
|
||||
<bugs>https://github.com/nextcloud/server/issues</bugs>
|
||||
<dependencies>
|
||||
<nextcloud min-version="30" max-version="30"/>
|
||||
<nextcloud min-version="31" max-version="31"/>
|
||||
</dependencies>
|
||||
|
||||
<background-jobs>
|
||||
|
||||
@@ -272,7 +272,7 @@ return array(
|
||||
'OCA\\DAV\\Events\\SubscriptionUpdatedEvent' => $baseDir . '/../lib/Events/SubscriptionUpdatedEvent.php',
|
||||
'OCA\\DAV\\Exception\\ServerMaintenanceMode' => $baseDir . '/../lib/Exception/ServerMaintenanceMode.php',
|
||||
'OCA\\DAV\\Exception\\UnsupportedLimitOnInitialSyncException' => $baseDir . '/../lib/Exception/UnsupportedLimitOnInitialSyncException.php',
|
||||
'OCA\\DAV\\Files\\ErrorPagePlugin' => $baseDir . '/../lib/Files/ErrorPagePlugin.php',
|
||||
'OCA\\DAV\\Files\\BrowserErrorPagePlugin' => $baseDir . '/../lib/Files/BrowserErrorPagePlugin.php',
|
||||
'OCA\\DAV\\Files\\FileSearchBackend' => $baseDir . '/../lib/Files/FileSearchBackend.php',
|
||||
'OCA\\DAV\\Files\\FilesHome' => $baseDir . '/../lib/Files/FilesHome.php',
|
||||
'OCA\\DAV\\Files\\LazySearchBackend' => $baseDir . '/../lib/Files/LazySearchBackend.php',
|
||||
|
||||
@@ -287,7 +287,7 @@ class ComposerStaticInitDAV
|
||||
'OCA\\DAV\\Events\\SubscriptionUpdatedEvent' => __DIR__ . '/..' . '/../lib/Events/SubscriptionUpdatedEvent.php',
|
||||
'OCA\\DAV\\Exception\\ServerMaintenanceMode' => __DIR__ . '/..' . '/../lib/Exception/ServerMaintenanceMode.php',
|
||||
'OCA\\DAV\\Exception\\UnsupportedLimitOnInitialSyncException' => __DIR__ . '/..' . '/../lib/Exception/UnsupportedLimitOnInitialSyncException.php',
|
||||
'OCA\\DAV\\Files\\ErrorPagePlugin' => __DIR__ . '/..' . '/../lib/Files/ErrorPagePlugin.php',
|
||||
'OCA\\DAV\\Files\\BrowserErrorPagePlugin' => __DIR__ . '/..' . '/../lib/Files/BrowserErrorPagePlugin.php',
|
||||
'OCA\\DAV\\Files\\FileSearchBackend' => __DIR__ . '/..' . '/../lib/Files/FileSearchBackend.php',
|
||||
'OCA\\DAV\\Files\\FilesHome' => __DIR__ . '/..' . '/../lib/Files/FilesHome.php',
|
||||
'OCA\\DAV\\Files\\LazySearchBackend' => __DIR__ . '/..' . '/../lib/Files/LazySearchBackend.php',
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" viewBox="0 0 32 32">
|
||||
<path style="block-progression:tb;color:#000000;text-transform:none;text-indent:0" d="m8.24 4.42c-2.2265 0-4.1153 1.6283-4.1153 3.7296 0.0158 0.66417 0.0752 1.4832 0.47155 3.2152v0.0429l0.0429 0.0429c0.12723 0.36445 0.31239 0.57294 0.55728 0.85739 0.24489 0.28444 0.53685 0.61924 0.81448 0.90025 0.0327 0.0331 0.0536 0.0535 0.0857 0.0858 0.0551 0.23961 0.12176 0.49747 0.17147 0.72878 0.13227 0.61541 0.11871 1.0512 0.0857 1.2003-0.95674 0.33594-2.147 0.73601-3.2151 1.2003-0.59962 0.26069-1.1422 0.49348-1.5861 0.77165-0.44388 0.27818-0.88534 0.48834-1.0288 1.1146-0.002 0.0285-0.002 0.0572 0 0.0858-0.1402 1.2874-0.35229 3.1806-0.51441 4.4584-0.035 0.26898 0.10676 0.55252 0.34294 0.68591 1.9392 1.0475 4.9181 1.4691 7.8876 1.4576 2.9695-0.0116 5.9247-0.45797 7.8019-1.4576 0.23617-0.13338 0.37794-0.41693 0.34294-0.68591-0.0518-0.39943-0.11534-1.3001-0.17147-2.1863-0.0561-0.88623-0.10486-1.758-0.17147-2.2721-0.0232-0.12744-0.0835-0.2479-0.17147-0.34295-0.59633-0.71211-1.4873-1.1474-2.5292-1.5862-0.95121-0.40054-2.0664-0.81649-3.1722-1.2861-0.0619-0.13788-0.12337-0.53903 0-1.1575 0.0331-0.16606 0.085-0.34392 0.12861-0.51443 0.10392-0.1164 0.18492-0.21152 0.30007-0.34296 0.2456-0.28032 0.50949-0.57438 0.72875-0.85738 0.21926-0.28301 0.39864-0.52579 0.51441-0.85739l0.0429-0.0429c0.44807-1.8085 0.44831-2.5631 0.47155-3.2152v-0.0429c0-2.1013-1.8888-3.7296-4.1153-3.7296zm11.772-3.4224c-3.2461 0-5.9999 2.3739-5.9999 5.4374 0.023 0.9683 0.10964 2.1624 0.68749 4.6874v0.0625l0.0625 0.0625c0.1855 0.53134 0.45545 0.83529 0.81249 1.25 0.35704 0.4147 0.7827 0.90279 1.1875 1.3125 0.0476 0.0482 0.0781 0.0781 0.12499 0.12502 0.0803 0.34932 0.17752 0.72527 0.25 1.0625 0.19284 0.8972 0.17306 1.5326 0.12501 1.75-1.3949 0.48977-3.1303 1.073-4.6874 1.75-0.87422 0.38005-1.6653 0.71943-2.3125 1.125-0.64717 0.40555-1.2908 0.71195-1.5 1.625-0.003 0.0416-0.003 0.0834 0 0.12502-0.20442 1.8769-0.51363 4.637-0.74999 6.4999-0.051 0.39215 0.15566 0.80553 0.49999 0.99999 2.8273 1.5272 7.1704 2.1419 11.5 2.125 4.3294-0.0168 8.6379-0.66766 11.375-2.125 0.34433-0.19446 0.55102-0.60784 0.49999-0.99999-0.0755-0.58232-0.16816-1.8954-0.25-3.1875-0.0818-1.292-0.15288-2.563-0.24998-3.3125-0.0339-0.18578-0.12172-0.36141-0.25-0.49999-0.86942-1.0382-2.1684-1.6728-3.6875-2.3125-1.3868-0.58395-3.0127-1.1904-4.6249-1.875-0.0902-0.20102-0.17988-0.78586 0-1.6875 0.0483-0.2421 0.12394-0.50141 0.1875-0.74999 0.15152-0.1697 0.26961-0.30838 0.4375-0.5 0.35807-0.40868 0.74281-0.83739 1.0625-1.25 0.31967-0.41259 0.58121-0.76654 0.74999-1.25l0.0625-0.0625c0.65328-2.6366 0.65362-3.7367 0.6875-4.6874v-0.0625c0-3.0635-2.7538-5.4374-5.9999-5.4374z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
@@ -212,7 +212,6 @@ OC.L10N.register(
|
||||
"Failed to unlink: %1$s" : "تعذّر فك الارتباط: %1$s",
|
||||
"Failed to write file contents: %1$s" : "إخفاق في كتابة محتويات الملف: %1$s",
|
||||
"File not found: %1$s" : "ملف غير موجود: %1$s",
|
||||
"Invalid target path" : "المسار الهدف غير صحيح",
|
||||
"System is in maintenance mode." : "النظام في حالة صيانة.",
|
||||
"Upgrade needed" : "يجب التحديث",
|
||||
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "%s الخاص بك يجب تهيئته لاستخدام HTTPS حتى يمكن استعمال CalDAV و CardDAV في نظام التشغيل iOS/macOS. ",
|
||||
|
||||
@@ -210,7 +210,6 @@
|
||||
"Failed to unlink: %1$s" : "تعذّر فك الارتباط: %1$s",
|
||||
"Failed to write file contents: %1$s" : "إخفاق في كتابة محتويات الملف: %1$s",
|
||||
"File not found: %1$s" : "ملف غير موجود: %1$s",
|
||||
"Invalid target path" : "المسار الهدف غير صحيح",
|
||||
"System is in maintenance mode." : "النظام في حالة صيانة.",
|
||||
"Upgrade needed" : "يجب التحديث",
|
||||
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "%s الخاص بك يجب تهيئته لاستخدام HTTPS حتى يمكن استعمال CalDAV و CardDAV في نظام التشغيل iOS/macOS. ",
|
||||
|
||||
@@ -21,7 +21,7 @@ OC.L10N.register(
|
||||
"You unshared calendar {calendar} from {user}" : "Dexesti de compartir el calendariu «{calendar}» con «{user}»",
|
||||
"{actor} unshared calendar {calendar} from {user}" : "{actor} dexó de compartir el calendariu «{calendar}» con «{user}»",
|
||||
"{actor} unshared calendar {calendar} from themselves" : "{actor} dexó de compartir el calendariu «{calendar}» con sigo",
|
||||
"You shared calendar {calendar} with group {group}" : "Compartiesti'l calendariu «{calendar}» col grupu «{group}»",
|
||||
"You shared calendar {calendar} with group {group}" : "Compartiesti'l calendariu «{calendar}» col grupu «{gorup}»",
|
||||
"{actor} shared calendar {calendar} with group {group}" : "{actor} compartió'l calendariu «{calendar}» col grupu «{group}»",
|
||||
"You unshared calendar {calendar} from group {group}" : "Dexesti de compartir el calendariu «{calendar}» col grupu «{group}»",
|
||||
"{actor} unshared calendar {calendar} from group {group}" : "{actor} dexó de compartir el calendariu «{calendar}» col grupu «{group}»",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"You unshared calendar {calendar} from {user}" : "Dexesti de compartir el calendariu «{calendar}» con «{user}»",
|
||||
"{actor} unshared calendar {calendar} from {user}" : "{actor} dexó de compartir el calendariu «{calendar}» con «{user}»",
|
||||
"{actor} unshared calendar {calendar} from themselves" : "{actor} dexó de compartir el calendariu «{calendar}» con sigo",
|
||||
"You shared calendar {calendar} with group {group}" : "Compartiesti'l calendariu «{calendar}» col grupu «{group}»",
|
||||
"You shared calendar {calendar} with group {group}" : "Compartiesti'l calendariu «{calendar}» col grupu «{gorup}»",
|
||||
"{actor} shared calendar {calendar} with group {group}" : "{actor} compartió'l calendariu «{calendar}» col grupu «{group}»",
|
||||
"You unshared calendar {calendar} from group {group}" : "Dexesti de compartir el calendariu «{calendar}» col grupu «{group}»",
|
||||
"{actor} unshared calendar {calendar} from group {group}" : "{actor} dexó de compartir el calendariu «{calendar}» col grupu «{group}»",
|
||||
|
||||
+3
-3
@@ -24,13 +24,13 @@ OC.L10N.register(
|
||||
"You shared calendar {calendar} with group {group}" : "Heu compartit el calendari {calendar} amb el grup {group}",
|
||||
"{actor} shared calendar {calendar} with group {group}" : "{actor} ha compartit el calendari {calendar} amb el grup {group}",
|
||||
"You unshared calendar {calendar} from group {group}" : "Heu deixat de compartir el calendari {calendar} amb el grup {group}",
|
||||
"{actor} unshared calendar {calendar} from group {group}" : "{actor} ha deixat de compartir el calendari {calendar} amb el grup {group}",
|
||||
"{actor} unshared calendar {calendar} from group {group}" : "{actor} ha deixat de compartir el calendari {calendar} amb el grup {grup}",
|
||||
"Untitled event" : "Esdeveniment sense títol",
|
||||
"{actor} created event {event} in calendar {calendar}" : "{actor} ha creat l'esdeveniment {event} al calendari {calendar}",
|
||||
"You created event {event} in calendar {calendar}" : "Heu creat l'esdeveniment {event} al calendari {calendar}",
|
||||
"{actor} deleted event {event} from calendar {calendar}" : "{actor} ha suprimit l'esdeveniment {event} del calendari {calendar}",
|
||||
"{actor} deleted event {event} from calendar {calendar}" : "{actor} ha suprimit l'esdeveniment {esdeveniment} del calendari {calendar}",
|
||||
"You deleted event {event} from calendar {calendar}" : "Heu suprimit l'esdeveniment {event} del calendari {calendar}",
|
||||
"{actor} updated event {event} in calendar {calendar}" : "{actor} ha actualitzat l'esdeveniment {event} del calendari {calendar}",
|
||||
"{actor} updated event {event} in calendar {calendar}" : "{actor} ha actualitzat l'esdeveniment {esdeveniment} del calendari {calendar}",
|
||||
"You updated event {event} in calendar {calendar}" : "Heu actualitzat l'esdeveniment {event} del calendari {calendar}",
|
||||
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} ha desplaçat l'esdeveniment {event} del calendari {sourceCalendar} al calendari {targetCalendar}",
|
||||
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Heu desplaçat l'esdeveniment {event} del calendari {sourceCalendar} al calendari {targetCalendar}",
|
||||
|
||||
@@ -22,13 +22,13 @@
|
||||
"You shared calendar {calendar} with group {group}" : "Heu compartit el calendari {calendar} amb el grup {group}",
|
||||
"{actor} shared calendar {calendar} with group {group}" : "{actor} ha compartit el calendari {calendar} amb el grup {group}",
|
||||
"You unshared calendar {calendar} from group {group}" : "Heu deixat de compartir el calendari {calendar} amb el grup {group}",
|
||||
"{actor} unshared calendar {calendar} from group {group}" : "{actor} ha deixat de compartir el calendari {calendar} amb el grup {group}",
|
||||
"{actor} unshared calendar {calendar} from group {group}" : "{actor} ha deixat de compartir el calendari {calendar} amb el grup {grup}",
|
||||
"Untitled event" : "Esdeveniment sense títol",
|
||||
"{actor} created event {event} in calendar {calendar}" : "{actor} ha creat l'esdeveniment {event} al calendari {calendar}",
|
||||
"You created event {event} in calendar {calendar}" : "Heu creat l'esdeveniment {event} al calendari {calendar}",
|
||||
"{actor} deleted event {event} from calendar {calendar}" : "{actor} ha suprimit l'esdeveniment {event} del calendari {calendar}",
|
||||
"{actor} deleted event {event} from calendar {calendar}" : "{actor} ha suprimit l'esdeveniment {esdeveniment} del calendari {calendar}",
|
||||
"You deleted event {event} from calendar {calendar}" : "Heu suprimit l'esdeveniment {event} del calendari {calendar}",
|
||||
"{actor} updated event {event} in calendar {calendar}" : "{actor} ha actualitzat l'esdeveniment {event} del calendari {calendar}",
|
||||
"{actor} updated event {event} in calendar {calendar}" : "{actor} ha actualitzat l'esdeveniment {esdeveniment} del calendari {calendar}",
|
||||
"You updated event {event} in calendar {calendar}" : "Heu actualitzat l'esdeveniment {event} del calendari {calendar}",
|
||||
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} ha desplaçat l'esdeveniment {event} del calendari {sourceCalendar} al calendari {targetCalendar}",
|
||||
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Heu desplaçat l'esdeveniment {event} del calendari {sourceCalendar} al calendari {targetCalendar}",
|
||||
|
||||
+3
-3
@@ -35,7 +35,7 @@ OC.L10N.register(
|
||||
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} flyttede begivenhed {event} fra kalender {sourceCalendar} til kalender {targetCalendar}",
|
||||
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Du flyttede begivenhed {event} fra kalender {sourceCalendar} til kalender {targetCalendar}",
|
||||
"{actor} restored event {event} of calendar {calendar}" : "{actor} gendannede begivenhed {event} i kalender {calendar}",
|
||||
"You restored event {event} of calendar {calendar}" : "Du gendannede begivenhed {event} i kalender {calendar}",
|
||||
"You restored event {event} of calendar {calendar}" : "Du gendannede begivenhed {begivenhed} i kalender {kalender}",
|
||||
"Busy" : "Optaget",
|
||||
"{actor} created to-do {todo} in list {calendar}" : "{actor} oprettede en opgave {todo} i listen {calendar}",
|
||||
"You created to-do {todo} in list {calendar}" : "Du oprettede opgaven {todo} i listen {calendar}",
|
||||
@@ -47,8 +47,8 @@ OC.L10N.register(
|
||||
"You solved to-do {todo} in list {calendar}" : "Du løste opgaven {todo} i listen {calendar}",
|
||||
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} genåbnede opgaven {todo} i listen {calendar}",
|
||||
"You reopened to-do {todo} in list {calendar}" : "Du genåbnede opgaven {todo} i listen {calendar}",
|
||||
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} flyttede opgave {todo} fra liste {sourceCalendar} til liste {targetCalendar}",
|
||||
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Du flyttede opgave {todo} fra liste {sourceCalendar} til liste {targetCalendar}",
|
||||
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} flyttede opgave {event} fra liste {sourceCalendar} til liste {targetCalendar}",
|
||||
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Du flyttede opgave {event} fra liste {sourceCalendar} til liste {targetCalendar}",
|
||||
"Calendar, contacts and tasks" : "Kalender, kontakter og opgaver",
|
||||
"A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> er blevet ændret",
|
||||
"A calendar <strong>event</strong> was modified" : "En kalender <strong>begivenhed</strong> er blevet ændret",
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} flyttede begivenhed {event} fra kalender {sourceCalendar} til kalender {targetCalendar}",
|
||||
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Du flyttede begivenhed {event} fra kalender {sourceCalendar} til kalender {targetCalendar}",
|
||||
"{actor} restored event {event} of calendar {calendar}" : "{actor} gendannede begivenhed {event} i kalender {calendar}",
|
||||
"You restored event {event} of calendar {calendar}" : "Du gendannede begivenhed {event} i kalender {calendar}",
|
||||
"You restored event {event} of calendar {calendar}" : "Du gendannede begivenhed {begivenhed} i kalender {kalender}",
|
||||
"Busy" : "Optaget",
|
||||
"{actor} created to-do {todo} in list {calendar}" : "{actor} oprettede en opgave {todo} i listen {calendar}",
|
||||
"You created to-do {todo} in list {calendar}" : "Du oprettede opgaven {todo} i listen {calendar}",
|
||||
@@ -45,8 +45,8 @@
|
||||
"You solved to-do {todo} in list {calendar}" : "Du løste opgaven {todo} i listen {calendar}",
|
||||
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} genåbnede opgaven {todo} i listen {calendar}",
|
||||
"You reopened to-do {todo} in list {calendar}" : "Du genåbnede opgaven {todo} i listen {calendar}",
|
||||
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} flyttede opgave {todo} fra liste {sourceCalendar} til liste {targetCalendar}",
|
||||
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Du flyttede opgave {todo} fra liste {sourceCalendar} til liste {targetCalendar}",
|
||||
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} flyttede opgave {event} fra liste {sourceCalendar} til liste {targetCalendar}",
|
||||
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Du flyttede opgave {event} fra liste {sourceCalendar} til liste {targetCalendar}",
|
||||
"Calendar, contacts and tasks" : "Kalender, kontakter og opgaver",
|
||||
"A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> er blevet ændret",
|
||||
"A calendar <strong>event</strong> was modified" : "En kalender <strong>begivenhed</strong> er blevet ændret",
|
||||
|
||||
@@ -212,7 +212,6 @@ OC.L10N.register(
|
||||
"Failed to unlink: %1$s" : "Fehler beim Aufheben der Verknüpfung: %1$s",
|
||||
"Failed to write file contents: %1$s" : "Fehler beim Schreiben des Dateiinhaltes: %1$s",
|
||||
"File not found: %1$s" : "Datei nicht gefunden: %1$s",
|
||||
"Invalid target path" : "Ungültiger Ziel-Pfad",
|
||||
"System is in maintenance mode." : "Das System befindet sich im Wartungsmodus.",
|
||||
"Upgrade needed" : "Aktualisierung erforderlich",
|
||||
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Dein %s muss konfiguriert werden, um HTTPS zusammen mit CalDAV und CardDAV unter iOS/macOS nutzen zu können.",
|
||||
|
||||
@@ -210,7 +210,6 @@
|
||||
"Failed to unlink: %1$s" : "Fehler beim Aufheben der Verknüpfung: %1$s",
|
||||
"Failed to write file contents: %1$s" : "Fehler beim Schreiben des Dateiinhaltes: %1$s",
|
||||
"File not found: %1$s" : "Datei nicht gefunden: %1$s",
|
||||
"Invalid target path" : "Ungültiger Ziel-Pfad",
|
||||
"System is in maintenance mode." : "Das System befindet sich im Wartungsmodus.",
|
||||
"Upgrade needed" : "Aktualisierung erforderlich",
|
||||
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Dein %s muss konfiguriert werden, um HTTPS zusammen mit CalDAV und CardDAV unter iOS/macOS nutzen zu können.",
|
||||
|
||||
@@ -212,7 +212,6 @@ OC.L10N.register(
|
||||
"Failed to unlink: %1$s" : "Fehler beim Aufheben der Verknüpfung: %1$s",
|
||||
"Failed to write file contents: %1$s" : "Fehler beim Schreiben des Dateiinhalts: %1$s",
|
||||
"File not found: %1$s" : "Datei nicht gefunden: %1$s",
|
||||
"Invalid target path" : "Ungültiger Ziel-Pfad",
|
||||
"System is in maintenance mode." : "Das System befindet sich im Wartungsmodus.",
|
||||
"Upgrade needed" : "Aktualisierung erforderlich",
|
||||
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Ihr %s muss konfiguriert werden, um HTTPS zusammen mit CalDAV und CardDAV unter iOS/macOS nutzen zu können.",
|
||||
|
||||
@@ -210,7 +210,6 @@
|
||||
"Failed to unlink: %1$s" : "Fehler beim Aufheben der Verknüpfung: %1$s",
|
||||
"Failed to write file contents: %1$s" : "Fehler beim Schreiben des Dateiinhalts: %1$s",
|
||||
"File not found: %1$s" : "Datei nicht gefunden: %1$s",
|
||||
"Invalid target path" : "Ungültiger Ziel-Pfad",
|
||||
"System is in maintenance mode." : "Das System befindet sich im Wartungsmodus.",
|
||||
"Upgrade needed" : "Aktualisierung erforderlich",
|
||||
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Ihr %s muss konfiguriert werden, um HTTPS zusammen mit CalDAV und CardDAV unter iOS/macOS nutzen zu können.",
|
||||
|
||||
@@ -212,7 +212,6 @@ OC.L10N.register(
|
||||
"Failed to unlink: %1$s" : "Failed to unlink: %1$s",
|
||||
"Failed to write file contents: %1$s" : "Failed to write file contents: %1$s",
|
||||
"File not found: %1$s" : "File not found: %1$s",
|
||||
"Invalid target path" : "Invalid target path",
|
||||
"System is in maintenance mode." : "System is in maintenance mode.",
|
||||
"Upgrade needed" : "Upgrade needed",
|
||||
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS.",
|
||||
|
||||
@@ -210,7 +210,6 @@
|
||||
"Failed to unlink: %1$s" : "Failed to unlink: %1$s",
|
||||
"Failed to write file contents: %1$s" : "Failed to write file contents: %1$s",
|
||||
"File not found: %1$s" : "File not found: %1$s",
|
||||
"Invalid target path" : "Invalid target path",
|
||||
"System is in maintenance mode." : "System is in maintenance mode.",
|
||||
"Upgrade needed" : "Upgrade needed",
|
||||
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS.",
|
||||
|
||||
+2
-2
@@ -15,7 +15,7 @@ OC.L10N.register(
|
||||
"You shared calendar {calendar} as public link" : "Has compartido el calendario {calendar} con un enlace público",
|
||||
"You removed public link for calendar {calendar}" : "Has eliminado el enlace público al calendario {calendar}",
|
||||
"{actor} shared calendar {calendar} with you" : "{actor} compartió el calendario {calendar} con usted",
|
||||
"You shared calendar {calendar} with {user}" : "Usted compartió el calendario {calendar} con {user}",
|
||||
"You shared calendar {calendar} with {user}" : "Usted compartió el calendario {calendar} con {usuario}",
|
||||
"{actor} shared calendar {calendar} with {user}" : "{actor} compartió el calendario {calendar} con {user}",
|
||||
"{actor} unshared calendar {calendar} from you" : "{actor} dejó de compartir el calendario {calendar} con usted",
|
||||
"You unshared calendar {calendar} from {user}" : "Usted dejó de compartir el calendario {calendar} de {user}",
|
||||
@@ -120,7 +120,7 @@ OC.L10N.register(
|
||||
"Last" : "Última",
|
||||
"Contacts" : "Contactos",
|
||||
"{actor} created address book {addressbook}" : "{actor} ha creado la libreta de direcciones {addressbook}",
|
||||
"You created address book {addressbook}" : "Has creado la libreta de direcciones {addressbook}",
|
||||
"You created address book {addressbook}" : "Has creado la libreta de direcciones {adressbook}",
|
||||
"{actor} deleted address book {addressbook}" : "{actor} ha eliminado la libreta de direcciones {addressbook}",
|
||||
"You deleted address book {addressbook}" : "Has eliminado la libreta de direcciones {addressbook}",
|
||||
"{actor} updated address book {addressbook}" : "{actor} ha actualizado la libreta de direcciones {addressbook}",
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"You shared calendar {calendar} as public link" : "Has compartido el calendario {calendar} con un enlace público",
|
||||
"You removed public link for calendar {calendar}" : "Has eliminado el enlace público al calendario {calendar}",
|
||||
"{actor} shared calendar {calendar} with you" : "{actor} compartió el calendario {calendar} con usted",
|
||||
"You shared calendar {calendar} with {user}" : "Usted compartió el calendario {calendar} con {user}",
|
||||
"You shared calendar {calendar} with {user}" : "Usted compartió el calendario {calendar} con {usuario}",
|
||||
"{actor} shared calendar {calendar} with {user}" : "{actor} compartió el calendario {calendar} con {user}",
|
||||
"{actor} unshared calendar {calendar} from you" : "{actor} dejó de compartir el calendario {calendar} con usted",
|
||||
"You unshared calendar {calendar} from {user}" : "Usted dejó de compartir el calendario {calendar} de {user}",
|
||||
@@ -118,7 +118,7 @@
|
||||
"Last" : "Última",
|
||||
"Contacts" : "Contactos",
|
||||
"{actor} created address book {addressbook}" : "{actor} ha creado la libreta de direcciones {addressbook}",
|
||||
"You created address book {addressbook}" : "Has creado la libreta de direcciones {addressbook}",
|
||||
"You created address book {addressbook}" : "Has creado la libreta de direcciones {adressbook}",
|
||||
"{actor} deleted address book {addressbook}" : "{actor} ha eliminado la libreta de direcciones {addressbook}",
|
||||
"You deleted address book {addressbook}" : "Has eliminado la libreta de direcciones {addressbook}",
|
||||
"{actor} updated address book {addressbook}" : "{actor} ha actualizado la libreta de direcciones {addressbook}",
|
||||
|
||||
@@ -20,7 +20,7 @@ OC.L10N.register(
|
||||
"{actor} unshared calendar {calendar} from you" : "{actor} ha dejado de compartir el calendario {calendar} contigo",
|
||||
"You unshared calendar {calendar} from {user}" : "Has dejado de compartir el calendario {calendar} con {user}",
|
||||
"{actor} unshared calendar {calendar} from {user}" : "{actor} dejó de compartir el calendario {calendar} con {user}",
|
||||
"{actor} unshared calendar {calendar} from themselves" : "{actor} dejó de compartir {calendar} con él mismo",
|
||||
"{actor} unshared calendar {calendar} from themselves" : "{actor} dejó de compartir {el calendario calendar} con él mismo",
|
||||
"You shared calendar {calendar} with group {group}" : "Compartiste el calendario {calendar} con el grupo {group}",
|
||||
"{actor} shared calendar {calendar} with group {group}" : "{actor} compartió el calendario {calendar} con el grupo {group}",
|
||||
"You unshared calendar {calendar} from group {group}" : "Dejaste de compartir el calendario {calendar} con el grupo {group}",
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"{actor} unshared calendar {calendar} from you" : "{actor} ha dejado de compartir el calendario {calendar} contigo",
|
||||
"You unshared calendar {calendar} from {user}" : "Has dejado de compartir el calendario {calendar} con {user}",
|
||||
"{actor} unshared calendar {calendar} from {user}" : "{actor} dejó de compartir el calendario {calendar} con {user}",
|
||||
"{actor} unshared calendar {calendar} from themselves" : "{actor} dejó de compartir {calendar} con él mismo",
|
||||
"{actor} unshared calendar {calendar} from themselves" : "{actor} dejó de compartir {el calendario calendar} con él mismo",
|
||||
"You shared calendar {calendar} with group {group}" : "Compartiste el calendario {calendar} con el grupo {group}",
|
||||
"{actor} shared calendar {calendar} with group {group}" : "{actor} compartió el calendario {calendar} con el grupo {group}",
|
||||
"You unshared calendar {calendar} from group {group}" : "Dejaste de compartir el calendario {calendar} con el grupo {group}",
|
||||
|
||||
@@ -20,7 +20,7 @@ OC.L10N.register(
|
||||
"{actor} unshared calendar {calendar} from you" : "{actor} ha dejado de compartir el calendario {calendar} contigo",
|
||||
"You unshared calendar {calendar} from {user}" : "Has dejado de compartir el calendario {calendar} con {user}",
|
||||
"{actor} unshared calendar {calendar} from {user}" : "{actor} dejó de compartir el calendario {calendar} con {user}",
|
||||
"{actor} unshared calendar {calendar} from themselves" : "{actor} dejó de compartir {calendar} con él mismo",
|
||||
"{actor} unshared calendar {calendar} from themselves" : "{actor} dejó de compartir {el calendario calendar} con él mismo",
|
||||
"You shared calendar {calendar} with group {group}" : "Compartiste el calendario {calendar} con el grupo {group}",
|
||||
"{actor} shared calendar {calendar} with group {group}" : "{actor} compartió el calendario {calendar} con el grupo {group}",
|
||||
"You unshared calendar {calendar} from group {group}" : "Dejaste de compartir el calendario {calendar} con el grupo {group}",
|
||||
@@ -138,7 +138,7 @@ OC.L10N.register(
|
||||
"Fourth Last" : "Ante antepenúltimo",
|
||||
"Contacts" : "Contactos",
|
||||
"{actor} created address book {addressbook}" : "{actor} creó la libreta de direcciones {addressbook}",
|
||||
"You created address book {addressbook}" : "Ha creado la libreta de direcciones {addressbook}",
|
||||
"You created address book {addressbook}" : "Ha creado la libreta de direcciones {adressbook}",
|
||||
"{actor} deleted address book {addressbook}" : "{actor} eliminó la libreta de direcciones {addressbook}",
|
||||
"You deleted address book {addressbook}" : "Ha eliminado la libreta de direcciones {addressbook}",
|
||||
"{actor} updated address book {addressbook}" : "{actor} actualizó la libreta de direcciones {addressbook}",
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"{actor} unshared calendar {calendar} from you" : "{actor} ha dejado de compartir el calendario {calendar} contigo",
|
||||
"You unshared calendar {calendar} from {user}" : "Has dejado de compartir el calendario {calendar} con {user}",
|
||||
"{actor} unshared calendar {calendar} from {user}" : "{actor} dejó de compartir el calendario {calendar} con {user}",
|
||||
"{actor} unshared calendar {calendar} from themselves" : "{actor} dejó de compartir {calendar} con él mismo",
|
||||
"{actor} unshared calendar {calendar} from themselves" : "{actor} dejó de compartir {el calendario calendar} con él mismo",
|
||||
"You shared calendar {calendar} with group {group}" : "Compartiste el calendario {calendar} con el grupo {group}",
|
||||
"{actor} shared calendar {calendar} with group {group}" : "{actor} compartió el calendario {calendar} con el grupo {group}",
|
||||
"You unshared calendar {calendar} from group {group}" : "Dejaste de compartir el calendario {calendar} con el grupo {group}",
|
||||
@@ -136,7 +136,7 @@
|
||||
"Fourth Last" : "Ante antepenúltimo",
|
||||
"Contacts" : "Contactos",
|
||||
"{actor} created address book {addressbook}" : "{actor} creó la libreta de direcciones {addressbook}",
|
||||
"You created address book {addressbook}" : "Ha creado la libreta de direcciones {addressbook}",
|
||||
"You created address book {addressbook}" : "Ha creado la libreta de direcciones {adressbook}",
|
||||
"{actor} deleted address book {addressbook}" : "{actor} eliminó la libreta de direcciones {addressbook}",
|
||||
"You deleted address book {addressbook}" : "Ha eliminado la libreta de direcciones {addressbook}",
|
||||
"{actor} updated address book {addressbook}" : "{actor} actualizó la libreta de direcciones {addressbook}",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user