Compare commits
104 Commits
techdept/m
...
bug/clone-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0dbb278a98 | ||
|
|
0649db673a | ||
|
|
9e1e88547e | ||
|
|
7116d9b7a0 | ||
|
|
eba0d94480 | ||
|
|
d886df378c | ||
|
|
6cf496aa4b | ||
|
|
ef36785ea3 | ||
|
|
37dc741415 | ||
|
|
d92fc77787 | ||
|
|
2b57924fe2 | ||
|
|
0527749291 | ||
|
|
d9542ada7f | ||
|
|
d2f2b5ebf5 | ||
|
|
48b42a3951 | ||
|
|
d6313a908d | ||
|
|
ec89fd8186 | ||
|
|
0c3128b5dc | ||
|
|
c553771137 | ||
|
|
c28f8079d3 | ||
|
|
4399f4d14c | ||
|
|
bba6e48257 | ||
|
|
b10dbf8097 | ||
|
|
7a5eca2dee | ||
|
|
b9e428807d | ||
|
|
48cd27594f | ||
|
|
62d68edc17 | ||
|
|
48db989781 | ||
|
|
4027f407f7 | ||
|
|
c6aef45d8c | ||
|
|
23f0b16a5a | ||
|
|
3f29cd97db | ||
|
|
9f1dbd137c | ||
|
|
bf9a51d167 | ||
|
|
3a4ec07103 | ||
|
|
4f13977851 | ||
|
|
c2144373d9 | ||
|
|
a032287cb5 | ||
|
|
a45e46f80a | ||
|
|
b774090032 | ||
|
|
72134e6e95 | ||
|
|
e4551bde15 | ||
|
|
4615926e3b | ||
|
|
afbbdf0c1b | ||
|
|
b6340e54c3 | ||
|
|
4d3dabb94e | ||
|
|
e8ada52c37 | ||
|
|
fa7fcef470 | ||
|
|
3e7d0d3d72 | ||
|
|
ba7cadf9d5 | ||
|
|
6106066460 | ||
|
|
7df4b7c4bf | ||
|
|
8b45495214 | ||
|
|
e3750a709d | ||
|
|
b45c454ce2 | ||
|
|
3d269e28f4 | ||
|
|
19a2aeb5e5 | ||
|
|
5d0b8d878b | ||
|
|
3aad01497a | ||
|
|
2e94b8e048 | ||
|
|
6cd8173e98 | ||
|
|
5333b96b37 | ||
|
|
27b06c545d | ||
|
|
64c3cf4a42 | ||
|
|
046458081c | ||
|
|
3cabfbca06 | ||
|
|
24cb0ea94b | ||
|
|
4d4a91c70f | ||
|
|
e1006d9df7 | ||
|
|
d1d74bee1f | ||
|
|
2aed4c1cc5 | ||
|
|
12adc6a691 | ||
|
|
f37f9b57a1 | ||
|
|
4b39c57968 | ||
|
|
682e50d86d | ||
|
|
35a8f97c3f | ||
|
|
ca3997f12e | ||
|
|
9ef81e1dac | ||
|
|
165375fbab | ||
|
|
4b622d85ee | ||
|
|
075f8418e7 | ||
|
|
a363ebc986 | ||
|
|
5364990e9d | ||
|
|
bd71a929b1 | ||
|
|
7886b00332 | ||
|
|
0ee3e32d97 | ||
|
|
6f954fa7a5 | ||
|
|
a0a8c32ee4 | ||
|
|
000811ebfd | ||
|
|
9629627d6d | ||
|
|
9bbef1fe42 | ||
|
|
5bd608595a | ||
|
|
0df048da5c | ||
|
|
0b22224046 | ||
|
|
6040172cd7 | ||
|
|
26c3529a5c | ||
|
|
9c6dd11aa2 | ||
|
|
4d2e3a6500 | ||
|
|
f5d6ad73dd | ||
|
|
ad3fc4b2dd | ||
|
|
f1a3cd1867 | ||
|
|
fdaae15328 | ||
|
|
e83a993ebc | ||
|
|
a6516f07fe |
6
.github/workflows/appbuild.yml
vendored
6
.github/workflows/appbuild.yml
vendored
@@ -12,15 +12,15 @@ jobs:
|
||||
node-version: [14.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v2.5.1
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
run: npm i -g npm@7
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@2.17.0
|
||||
uses: shivammathur/setup-php@2.18.0
|
||||
with:
|
||||
php-version: '7.4'
|
||||
tools: composer
|
||||
|
||||
151
.github/workflows/appstore-build-publish.yml
vendored
Normal file
151
.github/workflows/appstore-build-publish.yml
vendored
Normal file
@@ -0,0 +1,151 @@
|
||||
# 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
|
||||
|
||||
name: Build and publish app release
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
env:
|
||||
PHP_VERSION: 7.4
|
||||
|
||||
jobs:
|
||||
build_and_publish:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# Only allowed to be run on nextcloud-releases repositories
|
||||
if: ${{ github.repository_owner == 'nextcloud-releases' }}
|
||||
|
||||
steps:
|
||||
- name: Check actor permission
|
||||
uses: skjnldsv/check-actor-permission@v2
|
||||
with:
|
||||
require: write
|
||||
|
||||
- name: Set app env
|
||||
run: |
|
||||
# Split and keep last
|
||||
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
|
||||
echo "APP_VERSION=${GITHUB_REF##*/}" >> $GITHUB_ENV
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
path: ${{ env.APP_NAME }}
|
||||
|
||||
- name: Get appinfo data
|
||||
id: appinfo
|
||||
uses: skjnldsv/xpath-action@master
|
||||
with:
|
||||
filename: ${{ env.APP_NAME }}/appinfo/info.xml
|
||||
expression: "//info//dependencies//nextcloud/@min-version"
|
||||
|
||||
- name: Read package.json node and npm engines version
|
||||
uses: skjnldsv/read-package-engines-version-actions@v1.2
|
||||
id: versions
|
||||
# Continue if no package.json
|
||||
continue-on-error: true
|
||||
with:
|
||||
path: ${{ env.APP_NAME }}
|
||||
fallbackNode: "^12"
|
||||
fallbackNpm: "^6"
|
||||
|
||||
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
||||
# Skip if no package.json
|
||||
if: ${{ steps.versions.outputs.nodeVersion }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
||||
|
||||
- name: Set up npm ${{ steps.versions.outputs.npmVersion }}
|
||||
# Skip if no package.json
|
||||
if: ${{ steps.versions.outputs.npmVersion }}
|
||||
run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
|
||||
|
||||
- name: Set up php ${{ env.PHP_VERSION }}
|
||||
uses: shivammathur/setup-php@2.18.0
|
||||
with:
|
||||
php-version: ${{ env.PHP_VERSION }}
|
||||
coverage: none
|
||||
|
||||
- name: Check composer.json
|
||||
id: check_composer
|
||||
uses: andstor/file-existence-action@v1
|
||||
with:
|
||||
files: "${{ env.APP_NAME }}/composer.json"
|
||||
|
||||
- name: Install composer dependencies
|
||||
if: steps.check_composer.outputs.files_exists == 'true'
|
||||
run: |
|
||||
cd ${{ env.APP_NAME }}
|
||||
composer install --no-dev
|
||||
|
||||
- name: Build ${{ env.APP_NAME }}
|
||||
# Skip if no package.json
|
||||
if: ${{ steps.versions.outputs.nodeVersion }}
|
||||
run: |
|
||||
cd ${{ env.APP_NAME }}
|
||||
npm ci
|
||||
npm run build
|
||||
|
||||
- name: Install Krankerl
|
||||
run: |
|
||||
wget https://github.com/ChristophWurst/krankerl/releases/download/v0.13.0/krankerl_0.13.0_amd64.deb
|
||||
sudo dpkg -i krankerl_0.13.0_amd64.deb
|
||||
|
||||
- name: Package ${{ env.APP_NAME }} ${{ env.APP_VERSION }}
|
||||
# Try krankerl, fallback to makefile
|
||||
run: |
|
||||
cd ${{ env.APP_NAME }}
|
||||
krankerl package || make appstore
|
||||
|
||||
- name: Checkout server ${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }}
|
||||
continue-on-error: true
|
||||
id: server-checkout
|
||||
run: |
|
||||
NCVERSION=${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }}
|
||||
wget --quiet https://download.nextcloud.com/server/releases/latest-$NCVERSION.zip
|
||||
unzip latest-$NCVERSION.zip
|
||||
|
||||
- name: Checkout server master fallback
|
||||
uses: actions/checkout@v3
|
||||
if: ${{ steps.server-checkout.outcome != 'success' }}
|
||||
with:
|
||||
repository: nextcloud/server
|
||||
path: nextcloud
|
||||
|
||||
- name: Sign app
|
||||
run: |
|
||||
# Extracting release
|
||||
cd ${{ env.APP_NAME }}/build/artifacts
|
||||
tar -xvf ${{ env.APP_NAME }}.tar.gz
|
||||
cd ../../../
|
||||
# Setting up keys
|
||||
echo "${{ secrets.APP_PRIVATE_KEY }}" > ${{ env.APP_NAME }}.key
|
||||
wget --quiet "https://github.com/nextcloud/app-certificate-requests/raw/master/${{ env.APP_NAME }}/${{ env.APP_NAME }}.crt"
|
||||
# Signing
|
||||
php nextcloud/occ integrity:sign-app --privateKey=../${{ env.APP_NAME }}.key --certificate=../${{ env.APP_NAME }}.crt --path=../${{ env.APP_NAME }}/build/artifacts/${{ env.APP_NAME }}
|
||||
# Rebuilding archive
|
||||
cd ${{ env.APP_NAME }}/build/artifacts
|
||||
tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }}
|
||||
|
||||
- name: Attach tarball to github release
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
id: attach_to_release
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: ${{ env.APP_NAME }}/build/artifacts/${{ env.APP_NAME }}.tar.gz
|
||||
asset_name: ${{ env.APP_NAME }}-${{ env.APP_VERSION }}.tar.gz
|
||||
tag: ${{ github.ref }}
|
||||
overwrite: true
|
||||
|
||||
- name: Upload app to Nextcloud appstore
|
||||
uses: nextcloud-releases/nextcloud-appstore-push-action@v1
|
||||
with:
|
||||
app_name: ${{ env.APP_NAME }}
|
||||
appstore_token: ${{ secrets.APPSTORE_TOKEN }}
|
||||
download_url: ${{ steps.attach_to_release.outputs.browser_download_url }}
|
||||
app_private_key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
6
.github/workflows/command-rebase.yml
vendored
6
.github/workflows/command-rebase.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Add reaction on start
|
||||
uses: peter-evans/create-or-update-comment@v1
|
||||
uses: peter-evans/create-or-update-comment@v2
|
||||
with:
|
||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
repository: ${{ github.event.repository.full_name }}
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
reaction-type: "+1"
|
||||
|
||||
- name: Checkout the latest code
|
||||
uses: actions/checkout@v2.4.0
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
|
||||
- name: Add reaction on failure
|
||||
uses: peter-evans/create-or-update-comment@v1
|
||||
uses: peter-evans/create-or-update-comment@v2
|
||||
if: failure()
|
||||
with:
|
||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
|
||||
6
.github/workflows/integration.yml
vendored
6
.github/workflows/integration.yml
vendored
@@ -43,7 +43,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@v2.4.0
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
repository: nextcloud/server
|
||||
ref: ${{ matrix.server-versions }}
|
||||
@@ -56,12 +56,12 @@ jobs:
|
||||
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
|
||||
|
||||
- name: Checkout app
|
||||
uses: actions/checkout@v2.4.0
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@2.17.0
|
||||
uses: shivammathur/setup-php@2.18.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
tools: phpunit
|
||||
|
||||
18
.github/workflows/lint.yml
vendored
18
.github/workflows/lint.yml
vendored
@@ -13,13 +13,13 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['7.4', '8.0']
|
||||
php-versions: ['7.4', '8.0', "8.1"]
|
||||
|
||||
name: php${{ matrix.php-versions }} lint
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up php${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@2.17.0
|
||||
uses: shivammathur/setup-php@2.18.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
coverage: none
|
||||
@@ -31,9 +31,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2.4.0
|
||||
uses: actions/checkout@v3
|
||||
- name: Set up php
|
||||
uses: shivammathur/setup-php@2.17.0
|
||||
uses: shivammathur/setup-php@2.18.0
|
||||
with:
|
||||
php-version: 7.4
|
||||
coverage: none
|
||||
@@ -50,9 +50,9 @@ jobs:
|
||||
node-version: [14.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use node ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v2.5.1
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
@@ -71,10 +71,10 @@ jobs:
|
||||
|
||||
name: stylelint node${{ matrix.node-version }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Set up node ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v2.5.1
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
|
||||
6
.github/workflows/nightly.yml
vendored
6
.github/workflows/nightly.yml
vendored
@@ -17,15 +17,15 @@ jobs:
|
||||
node-version: [14.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v2.5.1
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
run: npm i -g npm@7
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@2.17.0
|
||||
uses: shivammathur/setup-php@2.18.0
|
||||
with:
|
||||
php-version: '7.4'
|
||||
tools: composer
|
||||
|
||||
4
.github/workflows/nodejs.yml
vendored
4
.github/workflows/nodejs.yml
vendored
@@ -12,9 +12,9 @@ jobs:
|
||||
node-version: [14.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v2.5.1
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
|
||||
8
.github/workflows/phpunit.yml
vendored
8
.github/workflows/phpunit.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php-versions: ['7.4', '8.0']
|
||||
php-versions: ['7.4', '8.0', "8.1"]
|
||||
databases: ['sqlite', 'mysql', 'pgsql']
|
||||
server-versions: ['master']
|
||||
|
||||
@@ -44,7 +44,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@v2.4.0
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
repository: nextcloud/server
|
||||
ref: ${{ matrix.server-versions }}
|
||||
@@ -57,12 +57,12 @@ jobs:
|
||||
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
|
||||
|
||||
- name: Checkout app
|
||||
uses: actions/checkout@v2.4.0
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@2.17.0
|
||||
uses: shivammathur/setup-php@2.18.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
tools: phpunit
|
||||
|
||||
4
.github/workflows/static-analysis.yml
vendored
4
.github/workflows/static-analysis.yml
vendored
@@ -16,9 +16,9 @@ jobs:
|
||||
name: Nextcloud ${{ matrix.ocp-version }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2.4.0
|
||||
uses: actions/checkout@v3
|
||||
- name: Set up php
|
||||
uses: shivammathur/setup-php@2.17.0
|
||||
uses: shivammathur/setup-php@2.18.0
|
||||
with:
|
||||
php-version: 7.4
|
||||
tools: composer:v1
|
||||
|
||||
3
Makefile
3
Makefile
@@ -50,8 +50,7 @@ ifeq (, $(shell which phpunit 2> /dev/null))
|
||||
php $(build_tools_directory)/phpunit.phar -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
|
||||
php $(build_tools_directory)/phpunit.phar -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
|
||||
else
|
||||
phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
|
||||
phpunit -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
|
||||
phpunit -c tests/phpunit.integration.xml --testsuite=integration-database --coverage-clover build/php-integration.coverage.xml
|
||||
endif
|
||||
|
||||
test-integration:
|
||||
|
||||
@@ -26,7 +26,7 @@ Deck is a kanban style organization tool aimed at personal planning and project
|
||||
- [trello-to-deck](https://github.com/maxammann/trello-to-deck) - Migrates cards from Trello
|
||||
- [mail2deck](https://github.com/newroco/mail2deck) - Provides an "email in" solution
|
||||
- [A-deck](https://github.com/leoossa/A-deck) - Chrome Extension that allows to create new card in selected stack based on current tab
|
||||
-
|
||||
|
||||
## Installation/Update
|
||||
|
||||
This app is supposed to work on the two latest Nextcloud versions.
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
<commands>
|
||||
<command>OCA\Deck\Command\UserExport</command>
|
||||
<command>OCA\Deck\Command\BoardImport</command>
|
||||
<command>OCA\Deck\Command\TransferOwnership</command>
|
||||
</commands>
|
||||
<activity>
|
||||
<settings>
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
return [
|
||||
'routes' => [
|
||||
['name' => 'page#index', 'url' => '/', 'verb' => 'GET'],
|
||||
['name' => 'page#redirectToCard', 'url' => '/card/{cardId}', 'verb' => 'GET'],
|
||||
|
||||
// boards
|
||||
['name' => 'board#index', 'url' => '/boards', 'verb' => 'GET'],
|
||||
@@ -38,6 +39,7 @@ return [
|
||||
['name' => 'board#updateAcl', 'url' => '/boards/{boardId}/acl/{aclId}', 'verb' => 'PUT'],
|
||||
['name' => 'board#deleteAcl', 'url' => '/boards/{boardId}/acl/{aclId}', 'verb' => 'DELETE'],
|
||||
['name' => 'board#clone', 'url' => '/boards/{boardId}/clone', 'verb' => 'POST'],
|
||||
['name' => 'board#transferOwner', 'url' => '/boards/{boardId}/transferOwner', 'verb' => 'PUT'],
|
||||
|
||||
// stacks
|
||||
['name' => 'stack#index', 'url' => '/stacks/{boardId}', 'verb' => 'GET'],
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"require-dev": {
|
||||
"roave/security-advisories": "dev-master",
|
||||
"christophwurst/nextcloud": "^21@dev",
|
||||
"christophwurst/nextcloud": "dev-master",
|
||||
"phpunit/phpunit": "^9",
|
||||
"nextcloud/coding-standard": "^1.0.0",
|
||||
"symfony/event-dispatcher": "^4.0",
|
||||
|
||||
313
composer.lock
generated
313
composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "c3c765fb5379719b5ab8824e9fbb03f9",
|
||||
"content-hash": "33c2fe0cccf29841e021001c6430310a",
|
||||
"packages": [
|
||||
{
|
||||
"name": "cogpowered/finediff",
|
||||
@@ -135,16 +135,16 @@
|
||||
"packages-dev": [
|
||||
{
|
||||
"name": "amphp/amp",
|
||||
"version": "v2.6.1",
|
||||
"version": "v2.6.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/amphp/amp.git",
|
||||
"reference": "c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae"
|
||||
"reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/amphp/amp/zipball/c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae",
|
||||
"reference": "c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae",
|
||||
"url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
|
||||
"reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -166,13 +166,13 @@
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Amp\\": "lib"
|
||||
},
|
||||
"files": [
|
||||
"lib/functions.php",
|
||||
"lib/Internal/functions.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"Amp\\": "lib"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
@@ -197,7 +197,7 @@
|
||||
}
|
||||
],
|
||||
"description": "A non-blocking concurrency framework for PHP applications.",
|
||||
"homepage": "http://amphp.org/amp",
|
||||
"homepage": "https://amphp.org/amp",
|
||||
"keywords": [
|
||||
"async",
|
||||
"asynchronous",
|
||||
@@ -212,7 +212,7 @@
|
||||
"support": {
|
||||
"irc": "irc://irc.freenode.org/amphp",
|
||||
"issues": "https://github.com/amphp/amp/issues",
|
||||
"source": "https://github.com/amphp/amp/tree/v2.6.1"
|
||||
"source": "https://github.com/amphp/amp/tree/v2.6.2"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -220,7 +220,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-09-23T18:43:08+00:00"
|
||||
"time": "2022-02-20T17:52:18+00:00"
|
||||
},
|
||||
{
|
||||
"name": "amphp/byte-stream",
|
||||
@@ -301,25 +301,29 @@
|
||||
},
|
||||
{
|
||||
"name": "christophwurst/nextcloud",
|
||||
"version": "v21.0.0",
|
||||
"version": "dev-master",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/ChristophWurst/nextcloud_composer.git",
|
||||
"reference": "41e1476b4aed5bce7371895054049eca353729c5"
|
||||
"reference": "cd35b7f4519d9b1c836443ec5dcd973d7f0f9cdd"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/ChristophWurst/nextcloud_composer/zipball/41e1476b4aed5bce7371895054049eca353729c5",
|
||||
"reference": "41e1476b4aed5bce7371895054049eca353729c5",
|
||||
"url": "https://api.github.com/repos/ChristophWurst/nextcloud_composer/zipball/cd35b7f4519d9b1c836443ec5dcd973d7f0f9cdd",
|
||||
"reference": "cd35b7f4519d9b1c836443ec5dcd973d7f0f9cdd",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.3 || ~8.0.0"
|
||||
"php": "^7.4 || ~8.0 || ~8.1",
|
||||
"psr/container": "^1.0",
|
||||
"psr/event-dispatcher": "^1.0",
|
||||
"psr/log": "^1.1"
|
||||
},
|
||||
"default-branch": true,
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "21.0.0-dev"
|
||||
"dev-master": "24.0.0-dev"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
@@ -335,9 +339,9 @@
|
||||
"description": "Composer package containing Nextcloud's public API (classes, interfaces)",
|
||||
"support": {
|
||||
"issues": "https://github.com/ChristophWurst/nextcloud_composer/issues",
|
||||
"source": "https://github.com/ChristophWurst/nextcloud_composer/tree/v21.0.0"
|
||||
"source": "https://github.com/ChristophWurst/nextcloud_composer/tree/master"
|
||||
},
|
||||
"time": "2021-03-01T08:42:25+00:00"
|
||||
"time": "2022-03-11T01:33:55+00:00"
|
||||
},
|
||||
{
|
||||
"name": "composer/package-versions-deprecated",
|
||||
@@ -566,16 +570,16 @@
|
||||
},
|
||||
{
|
||||
"name": "composer/xdebug-handler",
|
||||
"version": "2.0.4",
|
||||
"version": "2.0.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/composer/xdebug-handler.git",
|
||||
"reference": "0c1a3925ec58a4ec98e992b9c7d171e9e184be0a"
|
||||
"reference": "9e36aeed4616366d2b690bdce11f71e9178c579a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/composer/xdebug-handler/zipball/0c1a3925ec58a4ec98e992b9c7d171e9e184be0a",
|
||||
"reference": "0c1a3925ec58a4ec98e992b9c7d171e9e184be0a",
|
||||
"url": "https://api.github.com/repos/composer/xdebug-handler/zipball/9e36aeed4616366d2b690bdce11f71e9178c579a",
|
||||
"reference": "9e36aeed4616366d2b690bdce11f71e9178c579a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -612,7 +616,7 @@
|
||||
"support": {
|
||||
"irc": "irc://irc.freenode.org/composer",
|
||||
"issues": "https://github.com/composer/xdebug-handler/issues",
|
||||
"source": "https://github.com/composer/xdebug-handler/tree/2.0.4"
|
||||
"source": "https://github.com/composer/xdebug-handler/tree/2.0.5"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -628,7 +632,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-01-04T17:06:45+00:00"
|
||||
"time": "2022-02-24T20:20:32+00:00"
|
||||
},
|
||||
{
|
||||
"name": "dnoegel/php-xdg-base-dir",
|
||||
@@ -741,29 +745,30 @@
|
||||
},
|
||||
{
|
||||
"name": "doctrine/instantiator",
|
||||
"version": "1.4.0",
|
||||
"version": "1.4.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/doctrine/instantiator.git",
|
||||
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
|
||||
"reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
|
||||
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
|
||||
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
|
||||
"reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/coding-standard": "^8.0",
|
||||
"doctrine/coding-standard": "^9",
|
||||
"ext-pdo": "*",
|
||||
"ext-phar": "*",
|
||||
"phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
|
||||
"phpstan/phpstan": "^0.12",
|
||||
"phpstan/phpstan-phpunit": "^0.12",
|
||||
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
|
||||
"phpbench/phpbench": "^0.16 || ^1",
|
||||
"phpstan/phpstan": "^1.4",
|
||||
"phpstan/phpstan-phpunit": "^1",
|
||||
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
|
||||
"vimeo/psalm": "^4.22"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
@@ -790,7 +795,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/doctrine/instantiator/issues",
|
||||
"source": "https://github.com/doctrine/instantiator/tree/1.4.0"
|
||||
"source": "https://github.com/doctrine/instantiator/tree/1.4.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -806,7 +811,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-11-10T18:47:58+00:00"
|
||||
"time": "2022-03-03T08:28:38+00:00"
|
||||
},
|
||||
{
|
||||
"name": "doctrine/lexer",
|
||||
@@ -1080,25 +1085,29 @@
|
||||
},
|
||||
{
|
||||
"name": "myclabs/deep-copy",
|
||||
"version": "1.10.2",
|
||||
"version": "1.11.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/myclabs/DeepCopy.git",
|
||||
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
|
||||
"reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
|
||||
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
|
||||
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
|
||||
"reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0"
|
||||
},
|
||||
"conflict": {
|
||||
"doctrine/collections": "<1.6.8",
|
||||
"doctrine/common": "<2.13.3 || >=3,<3.2.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/collections": "^1.0",
|
||||
"doctrine/common": "^2.6",
|
||||
"phpunit/phpunit": "^7.1"
|
||||
"doctrine/collections": "^1.6.8",
|
||||
"doctrine/common": "^2.13.3 || ^3.2.2",
|
||||
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
@@ -1123,7 +1132,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/myclabs/DeepCopy/issues",
|
||||
"source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
|
||||
"source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1131,7 +1140,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-11-13T09:40:50+00:00"
|
||||
"time": "2022-03-03T13:19:32+00:00"
|
||||
},
|
||||
{
|
||||
"name": "netresearch/jsonmapper",
|
||||
@@ -1396,16 +1405,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phar-io/version",
|
||||
"version": "3.1.1",
|
||||
"version": "3.2.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phar-io/version.git",
|
||||
"reference": "15a90844ad40f127afd244c0cad228de2a80052a"
|
||||
"reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phar-io/version/zipball/15a90844ad40f127afd244c0cad228de2a80052a",
|
||||
"reference": "15a90844ad40f127afd244c0cad228de2a80052a",
|
||||
"url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
|
||||
"reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1441,9 +1450,9 @@
|
||||
"description": "Library for handling version information and constraints",
|
||||
"support": {
|
||||
"issues": "https://github.com/phar-io/version/issues",
|
||||
"source": "https://github.com/phar-io/version/tree/3.1.1"
|
||||
"source": "https://github.com/phar-io/version/tree/3.2.1"
|
||||
},
|
||||
"time": "2022-02-07T21:56:48+00:00"
|
||||
"time": "2022-02-21T01:04:05+00:00"
|
||||
},
|
||||
{
|
||||
"name": "php-cs-fixer/diff",
|
||||
@@ -1499,16 +1508,16 @@
|
||||
},
|
||||
{
|
||||
"name": "php-parallel-lint/php-parallel-lint",
|
||||
"version": "v1.3.1",
|
||||
"version": "v1.3.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
|
||||
"reference": "761f3806e30239b5fcd90a0a45d41dc2138de192"
|
||||
"reference": "6483c9832e71973ed29cf71bd6b3f4fde438a9de"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/761f3806e30239b5fcd90a0a45d41dc2138de192",
|
||||
"reference": "761f3806e30239b5fcd90a0a45d41dc2138de192",
|
||||
"url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/6483c9832e71973ed29cf71bd6b3f4fde438a9de",
|
||||
"reference": "6483c9832e71973ed29cf71bd6b3f4fde438a9de",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1521,7 +1530,7 @@
|
||||
},
|
||||
"require-dev": {
|
||||
"nette/tester": "^1.3 || ^2.0",
|
||||
"php-parallel-lint/php-console-highlighter": "~0.3",
|
||||
"php-parallel-lint/php-console-highlighter": "0.* || ^1.0",
|
||||
"squizlabs/php_codesniffer": "^3.6"
|
||||
},
|
||||
"suggest": {
|
||||
@@ -1533,7 +1542,7 @@
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"./"
|
||||
"./src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
@@ -1550,9 +1559,9 @@
|
||||
"homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
|
||||
"support": {
|
||||
"issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues",
|
||||
"source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.3.1"
|
||||
"source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.3.2"
|
||||
},
|
||||
"time": "2021-08-13T05:35:13+00:00"
|
||||
"time": "2022-02-21T12:50:22+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpdocumentor/reflection-common",
|
||||
@@ -1666,16 +1675,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpdocumentor/type-resolver",
|
||||
"version": "1.6.0",
|
||||
"version": "1.6.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpDocumentor/TypeResolver.git",
|
||||
"reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706"
|
||||
"reference": "77a32518733312af16a44300404e945338981de3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706",
|
||||
"reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706",
|
||||
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
|
||||
"reference": "77a32518733312af16a44300404e945338981de3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1710,9 +1719,9 @@
|
||||
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
|
||||
"support": {
|
||||
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
|
||||
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0"
|
||||
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
|
||||
},
|
||||
"time": "2022-01-04T19:58:01+00:00"
|
||||
"time": "2022-03-15T21:29:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpspec/prophecy",
|
||||
@@ -1783,16 +1792,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-code-coverage",
|
||||
"version": "9.2.11",
|
||||
"version": "9.2.15",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
||||
"reference": "665a1ac0a763c51afc30d6d130dac0813092b17f"
|
||||
"reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/665a1ac0a763c51afc30d6d130dac0813092b17f",
|
||||
"reference": "665a1ac0a763c51afc30d6d130dac0813092b17f",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
|
||||
"reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1848,7 +1857,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
|
||||
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.11"
|
||||
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1856,7 +1865,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2022-02-18T12:46:09+00:00"
|
||||
"time": "2022-03-07T09:28:20+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-file-iterator",
|
||||
@@ -2101,16 +2110,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpunit/phpunit",
|
||||
"version": "9.5.14",
|
||||
"version": "9.5.20",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||
"reference": "1883687169c017d6ae37c58883ca3994cfc34189"
|
||||
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1883687169c017d6ae37c58883ca3994cfc34189",
|
||||
"reference": "1883687169c017d6ae37c58883ca3994cfc34189",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba",
|
||||
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2126,7 +2135,7 @@
|
||||
"phar-io/version": "^3.0.2",
|
||||
"php": ">=7.3",
|
||||
"phpspec/prophecy": "^1.12.1",
|
||||
"phpunit/php-code-coverage": "^9.2.7",
|
||||
"phpunit/php-code-coverage": "^9.2.13",
|
||||
"phpunit/php-file-iterator": "^3.0.5",
|
||||
"phpunit/php-invoker": "^3.1.1",
|
||||
"phpunit/php-text-template": "^2.0.3",
|
||||
@@ -2140,7 +2149,7 @@
|
||||
"sebastian/global-state": "^5.0.1",
|
||||
"sebastian/object-enumerator": "^4.0.3",
|
||||
"sebastian/resource-operations": "^3.0.3",
|
||||
"sebastian/type": "^2.3.4",
|
||||
"sebastian/type": "^3.0",
|
||||
"sebastian/version": "^3.0.2"
|
||||
},
|
||||
"require-dev": {
|
||||
@@ -2188,7 +2197,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.14"
|
||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2200,7 +2209,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2022-02-18T12:54:07+00:00"
|
||||
"time": "2022-04-01T12:37:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/cache",
|
||||
@@ -2299,6 +2308,56 @@
|
||||
},
|
||||
"time": "2021-11-05T16:50:12+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/event-dispatcher",
|
||||
"version": "1.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-fig/event-dispatcher.git",
|
||||
"reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
|
||||
"reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.2.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Psr\\EventDispatcher\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "PHP-FIG",
|
||||
"homepage": "http://www.php-fig.org/"
|
||||
}
|
||||
],
|
||||
"description": "Standard interfaces for event handling.",
|
||||
"keywords": [
|
||||
"events",
|
||||
"psr",
|
||||
"psr-14"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/php-fig/event-dispatcher/issues",
|
||||
"source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
|
||||
},
|
||||
"time": "2019-01-08T18:20:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/log",
|
||||
"version": "1.1.4",
|
||||
@@ -3638,28 +3697,28 @@
|
||||
},
|
||||
{
|
||||
"name": "sebastian/type",
|
||||
"version": "2.3.4",
|
||||
"version": "3.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/type.git",
|
||||
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914"
|
||||
"reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914",
|
||||
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
|
||||
"reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3"
|
||||
"phpunit/phpunit": "^9.5"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.3-dev"
|
||||
"dev-master": "3.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@@ -3682,7 +3741,7 @@
|
||||
"homepage": "https://github.com/sebastianbergmann/type",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/type/issues",
|
||||
"source": "https://github.com/sebastianbergmann/type/tree/2.3.4"
|
||||
"source": "https://github.com/sebastianbergmann/type/tree/3.0.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -3690,7 +3749,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-06-15T12:49:02+00:00"
|
||||
"time": "2022-03-15T09:54:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/version",
|
||||
@@ -3747,16 +3806,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
"version": "v5.4.3",
|
||||
"version": "v5.4.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/console.git",
|
||||
"reference": "a2a86ec353d825c75856c6fd14fac416a7bdb6b8"
|
||||
"reference": "d8111acc99876953f52fe16d4c50eb60940d49ad"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/a2a86ec353d825c75856c6fd14fac416a7bdb6b8",
|
||||
"reference": "a2a86ec353d825c75856c6fd14fac416a7bdb6b8",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/d8111acc99876953f52fe16d4c50eb60940d49ad",
|
||||
"reference": "d8111acc99876953f52fe16d4c50eb60940d49ad",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -3826,7 +3885,7 @@
|
||||
"terminal"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/console/tree/v5.4.3"
|
||||
"source": "https://github.com/symfony/console/tree/v5.4.5"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -3842,7 +3901,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-01-26T16:28:35+00:00"
|
||||
"time": "2022-02-24T12:45:35+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/deprecation-contracts",
|
||||
@@ -4272,7 +4331,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-ctype",
|
||||
"version": "v1.24.0",
|
||||
"version": "v1.25.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
||||
@@ -4304,12 +4363,12 @@
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Ctype\\": ""
|
||||
},
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Ctype\\": ""
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
@@ -4334,7 +4393,7 @@
|
||||
"portable"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.24.0"
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4354,7 +4413,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-grapheme",
|
||||
"version": "v1.24.0",
|
||||
"version": "v1.25.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
||||
@@ -4415,7 +4474,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.24.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4435,7 +4494,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-normalizer",
|
||||
"version": "v1.24.0",
|
||||
"version": "v1.25.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
||||
@@ -4499,7 +4558,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.24.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4519,7 +4578,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-mbstring",
|
||||
"version": "v1.24.0",
|
||||
"version": "v1.25.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||
@@ -4551,12 +4610,12 @@
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Mbstring\\": ""
|
||||
},
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Mbstring\\": ""
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
@@ -4582,7 +4641,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.24.0"
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4602,7 +4661,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php73",
|
||||
"version": "v1.24.0",
|
||||
"version": "v1.25.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php73.git",
|
||||
@@ -4661,7 +4720,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php73/tree/v1.24.0"
|
||||
"source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4681,16 +4740,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php80",
|
||||
"version": "v1.24.0",
|
||||
"version": "v1.25.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php80.git",
|
||||
"reference": "57b712b08eddb97c762a8caa32c84e037892d2e9"
|
||||
"reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9",
|
||||
"reference": "57b712b08eddb97c762a8caa32c84e037892d2e9",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c",
|
||||
"reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4744,7 +4803,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.24.0"
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4760,7 +4819,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-09-13T13:58:33+00:00"
|
||||
"time": "2022-03-04T08:16:47+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php81",
|
||||
@@ -5081,12 +5140,12 @@
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Component\\String\\": ""
|
||||
},
|
||||
"files": [
|
||||
"Resources/functions.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"Symfony\\Component\\String\\": ""
|
||||
},
|
||||
"exclude-from-classmap": [
|
||||
"/Tests/"
|
||||
]
|
||||
@@ -5186,16 +5245,16 @@
|
||||
},
|
||||
{
|
||||
"name": "vimeo/psalm",
|
||||
"version": "4.20.0",
|
||||
"version": "4.22.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/vimeo/psalm.git",
|
||||
"reference": "f82a70e7edfc6cf2705e9374c8a0b6a974a779ed"
|
||||
"reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/vimeo/psalm/zipball/f82a70e7edfc6cf2705e9374c8a0b6a974a779ed",
|
||||
"reference": "f82a70e7edfc6cf2705e9374c8a0b6a974a779ed",
|
||||
"url": "https://api.github.com/repos/vimeo/psalm/zipball/fc2c6ab4d5fa5d644d8617089f012f3bb84b8703",
|
||||
"reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -5286,9 +5345,9 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/vimeo/psalm/issues",
|
||||
"source": "https://github.com/vimeo/psalm/tree/4.20.0"
|
||||
"source": "https://github.com/vimeo/psalm/tree/4.22.0"
|
||||
},
|
||||
"time": "2022-02-03T17:03:47+00:00"
|
||||
"time": "2022-02-24T20:34:05+00:00"
|
||||
},
|
||||
{
|
||||
"name": "webmozart/assert",
|
||||
|
||||
@@ -16,6 +16,7 @@ Overall, Deck is easy to use. You can create boards, add users, share the Deck,
|
||||
5. [Manage your board](#5-manage-your-board)
|
||||
6. [Import boards](#6-import-boards)
|
||||
7. [Search](#7-search)
|
||||
8. [New owner for the deck entities](#8-new-owner-for-the-deck-entities)
|
||||
|
||||
### 1. Create my first board
|
||||
In this example, we're going to create a board and share it with an other nextcloud user.
|
||||
@@ -158,4 +159,22 @@ For example the search `project tag:ToDo assigned:alice assigned:bob` will retur
|
||||
|
||||
Other text tokens will be used to perform a case-insensitive search on the card title and description
|
||||
|
||||
In addition wuotes can be used to pass a query with spaces, e.g. `"Exact match with spaces"` or `title:"My card"`.
|
||||
In addition, quotes can be used to pass a query with spaces, e.g. `"Exact match with spaces"` or `title:"My card"`.
|
||||
|
||||
### 8. New owner for the deck entities
|
||||
You can transfer ownership of boards, cards, etc to a new user, using `occ` command `deck:transfer-ownership`
|
||||
|
||||
```bash
|
||||
php occ deck:transfer-ownership previousOwner newOwner
|
||||
```
|
||||
|
||||
The transfer will preserve card details linked to the old owner, which can also be remapped by using the `--remap` option on the occ command.
|
||||
```bash
|
||||
php occ deck:transfer-ownership --remap previousOwner newOwner
|
||||
```
|
||||
|
||||
Individual boards can be transferred by adding the id of the board to the command:
|
||||
|
||||
```bash
|
||||
php occ deck:transfer-ownership previousOwner newOwner 123
|
||||
```
|
||||
|
||||
@@ -170,8 +170,14 @@ OC.L10N.register(
|
||||
"Can edit" : "Může upravovat",
|
||||
"Can share" : "Může sdílet",
|
||||
"Can manage" : "Může spravovat",
|
||||
"Owner" : "Vlastník",
|
||||
"Delete" : "Smazat",
|
||||
"Failed to create share with {displayName}" : "Nepodařilo se vytvořit sdílení s {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Opravdu chcete předat vlastnictví tabule {title} uživateli {user}?",
|
||||
"Transfer the board." : "Předat vlastnictví tabule.",
|
||||
"Transfer" : "Předat vlastnictví",
|
||||
"Transfer the board for {user} successfully" : "Předání vlastnictví tabule uživateli {user} úspěšné",
|
||||
"Failed to transfer the board for {user}" : "Nepodařilo se předat vlastnictví tabule uživateli {user}",
|
||||
"Add a new list" : "Přidat nový sloupec",
|
||||
"Archive all cards" : "Archivovat všechny karty",
|
||||
"Delete list" : "Smazat seznam",
|
||||
|
||||
@@ -168,8 +168,14 @@
|
||||
"Can edit" : "Může upravovat",
|
||||
"Can share" : "Může sdílet",
|
||||
"Can manage" : "Může spravovat",
|
||||
"Owner" : "Vlastník",
|
||||
"Delete" : "Smazat",
|
||||
"Failed to create share with {displayName}" : "Nepodařilo se vytvořit sdílení s {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Opravdu chcete předat vlastnictví tabule {title} uživateli {user}?",
|
||||
"Transfer the board." : "Předat vlastnictví tabule.",
|
||||
"Transfer" : "Předat vlastnictví",
|
||||
"Transfer the board for {user} successfully" : "Předání vlastnictví tabule uživateli {user} úspěšné",
|
||||
"Failed to transfer the board for {user}" : "Nepodařilo se předat vlastnictví tabule uživateli {user}",
|
||||
"Add a new list" : "Přidat nový sloupec",
|
||||
"Archive all cards" : "Archivovat všechny karty",
|
||||
"Delete list" : "Smazat seznam",
|
||||
|
||||
@@ -170,8 +170,14 @@ OC.L10N.register(
|
||||
"Can edit" : "kann bearbeiten",
|
||||
"Can share" : "kann teilen",
|
||||
"Can manage" : "kann verwalten",
|
||||
"Owner" : "Besitzer",
|
||||
"Delete" : "Löschen",
|
||||
"Failed to create share with {displayName}" : "Fehler beim Erstellen der Freigabe mit dem Namen {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Möchtest Du wirklich das Board {title} an {user} übertragen?",
|
||||
"Transfer the board." : "Board übertragen",
|
||||
"Transfer" : "Übertragen",
|
||||
"Transfer the board for {user} successfully" : "Das Board wurde erfolgreich an {user} übertragen",
|
||||
"Failed to transfer the board for {user}" : "Board konnte nicht an {user} übertragen werden",
|
||||
"Add a new list" : "Eine neue Liste hinzufügen",
|
||||
"Archive all cards" : "Alle Karten archivieren",
|
||||
"Delete list" : "Liste löschen",
|
||||
|
||||
@@ -168,8 +168,14 @@
|
||||
"Can edit" : "kann bearbeiten",
|
||||
"Can share" : "kann teilen",
|
||||
"Can manage" : "kann verwalten",
|
||||
"Owner" : "Besitzer",
|
||||
"Delete" : "Löschen",
|
||||
"Failed to create share with {displayName}" : "Fehler beim Erstellen der Freigabe mit dem Namen {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Möchtest Du wirklich das Board {title} an {user} übertragen?",
|
||||
"Transfer the board." : "Board übertragen",
|
||||
"Transfer" : "Übertragen",
|
||||
"Transfer the board for {user} successfully" : "Das Board wurde erfolgreich an {user} übertragen",
|
||||
"Failed to transfer the board for {user}" : "Board konnte nicht an {user} übertragen werden",
|
||||
"Add a new list" : "Eine neue Liste hinzufügen",
|
||||
"Archive all cards" : "Alle Karten archivieren",
|
||||
"Delete list" : "Liste löschen",
|
||||
|
||||
@@ -170,8 +170,14 @@ OC.L10N.register(
|
||||
"Can edit" : "kann bearbeiten",
|
||||
"Can share" : "kann teilen",
|
||||
"Can manage" : "kann verwalten",
|
||||
"Owner" : "Besitzer",
|
||||
"Delete" : "Löschen",
|
||||
"Failed to create share with {displayName}" : "Fehler beim Erstellen der Freigabe mit dem Namen {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Möchten Sie wirklich Das Board {title} an {user} übertragen?",
|
||||
"Transfer the board." : "Board übertragen.",
|
||||
"Transfer" : "Übertragen",
|
||||
"Transfer the board for {user} successfully" : "Das Board wurde erfolgreich an {user} übertragen",
|
||||
"Failed to transfer the board for {user}" : "Board konnte nicht an {user} übertragen werden",
|
||||
"Add a new list" : "Eine neue Liste hinzufügen",
|
||||
"Archive all cards" : "Alle Karten archivieren",
|
||||
"Delete list" : "Liste löschen",
|
||||
|
||||
@@ -168,8 +168,14 @@
|
||||
"Can edit" : "kann bearbeiten",
|
||||
"Can share" : "kann teilen",
|
||||
"Can manage" : "kann verwalten",
|
||||
"Owner" : "Besitzer",
|
||||
"Delete" : "Löschen",
|
||||
"Failed to create share with {displayName}" : "Fehler beim Erstellen der Freigabe mit dem Namen {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Möchten Sie wirklich Das Board {title} an {user} übertragen?",
|
||||
"Transfer the board." : "Board übertragen.",
|
||||
"Transfer" : "Übertragen",
|
||||
"Transfer the board for {user} successfully" : "Das Board wurde erfolgreich an {user} übertragen",
|
||||
"Failed to transfer the board for {user}" : "Board konnte nicht an {user} übertragen werden",
|
||||
"Add a new list" : "Eine neue Liste hinzufügen",
|
||||
"Archive all cards" : "Alle Karten archivieren",
|
||||
"Delete list" : "Liste löschen",
|
||||
|
||||
200
l10n/el.js
200
l10n/el.js
@@ -2,135 +2,145 @@ OC.L10N.register(
|
||||
"deck",
|
||||
{
|
||||
"You have created a new board {board}" : "Δημιουργήσατε νέο πίνακα {board}",
|
||||
"{user} has created a new board {board}" : "Ο {user} δημιούργησε νέο πίνακα {board}",
|
||||
"{user} has created a new board {board}" : "Ο/η {user} δημιούργησε νέο πίνακα {board}",
|
||||
"You have deleted the board {board}" : "Έχετε διαγράψει τον πίνακα {board}",
|
||||
"{user} has deleted the board {board}" : "Ο {user} διέγραψε τον πίνακα {board}",
|
||||
"{user} has deleted the board {board}" : "Ο/η {user} διέγραψε τον πίνακα {board}",
|
||||
"You have restored the board {board}" : "Εχετε επαναφέρει τον πίνακα {board}",
|
||||
"{user} has restored the board {board}" : "Ο {user} επανέφερε τον πίνακα {board}",
|
||||
"{user} has restored the board {board}" : "Ο/η {user} επανέφερε τον πίνακα {board}",
|
||||
"You have shared the board {board} with {acl}" : "Εχετε διαμοιράσει τον πίνακα {board} με {acl}",
|
||||
"{user} has shared the board {board} with {acl}" : "Ο {user} διαμοίρασε τον πίνακα {board} με {acl}",
|
||||
"{user} has shared the board {board} with {acl}" : "Ο/η {user} διαμοίρασε τον πίνακα {board} με {acl}",
|
||||
"You have removed {acl} from the board {board}" : "Αφαιρέθηκε η {acl} από τον πίνακα {board}",
|
||||
"{user} has removed {acl} from the board {board}" : "Ο {user} αφαίρεσε την {acl} από τον πίνακα {board}",
|
||||
"{user} has removed {acl} from the board {board}" : "Ο/η {user} αφαίρεσε την {acl} από τον πίνακα {board}",
|
||||
"You have renamed the board {before} to {board}" : "Μετονομάσατε τον πίνακα {before} σε {board}",
|
||||
"{user} has renamed the board {before} to {board}" : "Ο {user} μετονόμασε τον πίνακα {before} σε {board}",
|
||||
"{user} has renamed the board {before} to {board}" : "Ο/η {user} μετονόμασε τον πίνακα {before} σε {board}",
|
||||
"You have archived the board {board}" : "Αρχειοθετήσατε τον πίνακα {board}",
|
||||
"{user} has archived the board {before}" : "Ο {user} αρχειοθέτησε τον πίνακα {before}",
|
||||
"You have unarchived the board {board}" : "Επαναφέρατε τον πίνακα {board} από αρχείο",
|
||||
"{user} has unarchived the board {before}" : "Ο {user} επανέφερε τον πίνακα {before} από αρχείο",
|
||||
"{user} has archived the board {before}" : "Ο/η {user} αρχειοθέτησε τον πίνακα {before}",
|
||||
"You have unarchived the board {board}" : "Επαναφέρατε τον πίνακα {board} από το αρχείο",
|
||||
"{user} has unarchived the board {before}" : "Ο/η {user} επανέφερε τον πίνακα {before} από αρχείο",
|
||||
"You have created a new list {stack} on board {board}" : "Έχετε δημιουργήσει μια νέα λίστα {stack} στον πίνακα {board}",
|
||||
"{user} has created a new list {stack} on board {board}" : "Ο {user} δημιούργησε μια νέα λίστα {stack} στον πίνακα {board}",
|
||||
"{user} has created a new list {stack} on board {board}" : "Ο/η {user} δημιούργησε μια νέα λίστα {stack} στον πίνακα {board}",
|
||||
"You have renamed list {before} to {stack} on board {board}" : "Μετονομάσατε την λίστα {before} σε {stack} στον πίνακα {board}",
|
||||
"{user} has renamed list {before} to {stack} on board {board}" : "Ο {user} μετονόμασε την λίστα {before} σε {stack} στον πίνακα {board}",
|
||||
"{user} has renamed list {before} to {stack} on board {board}" : "Ο/η {user} μετονόμασε την λίστα {before} σε {stack} στον πίνακα {board}",
|
||||
"You have deleted list {stack} on board {board}" : "Διαγράψατε την λίστα {stack} στον πίνακα {board}",
|
||||
"{user} has deleted list {stack} on board {board}" : "Ο {user} διέγραψε την λίστα {stack} στον πίνακα {board}",
|
||||
"{user} has deleted list {stack} on board {board}" : "Ο/η {user} διέγραψε την λίστα {stack} στον πίνακα {board}",
|
||||
"You have created card {card} in list {stack} on board {board}" : "Δημιουργήσατε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"{user} has created card {card} in list {stack} on board {board}" : "Ο {user} δημιούργησε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"{user} has created card {card} in list {stack} on board {board}" : "Ο/η {user} δημιούργησε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"You have deleted card {card} in list {stack} on board {board}" : "Διαγράψατε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"{user} has deleted card {card} in list {stack} on board {board}" : "Ο {user} διέγραψε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"{user} has deleted card {card} in list {stack} on board {board}" : "Ο/η {user} διέγραψε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"You have renamed the card {before} to {card}" : "Μετονομάσατε την καρτέλα {before} σε {card}",
|
||||
"{user} has renamed the card {before} to {card}" : "Ο {user} μετονόμασε την καρτέλα {before} σε {card}",
|
||||
"{user} has renamed the card {before} to {card}" : "Ο/η {user} μετονόμασε την καρτέλα {before} σε {card}",
|
||||
"You have added a description to card {card} in list {stack} on board {board}" : "Προσθέσατε μια περιγραφή στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has added a description to card {card} in list {stack} on board {board}" : "Ο {user} πρόσθεσε μια περιγραφή στην καρτέλα {card} της λίστας {stack} του πίνακα {board} ",
|
||||
"{user} has added a description to card {card} in list {stack} on board {board}" : "Ο/η {user} πρόσθεσε μια περιγραφή στην καρτέλα {card} της λίστας {stack} του πίνακα {board} ",
|
||||
"You have updated the description of card {card} in list {stack} on board {board}" : "Ενημερώσατε την περιγραφή στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "Ο {user} ενημέρωσε την περιγραφή της καρτέλας {card} στη λίστα {stack} του πίνακα {board}",
|
||||
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "Ο/η {user} ενημέρωσε την περιγραφή της καρτέλας {card} στη λίστα {stack} του πίνακα {board}",
|
||||
"You have archived card {card} in list {stack} on board {board}" : "Αρχειοθετήσατε την κάρτα {card} στην λίστα {stack} του πίνακα {board} ",
|
||||
"{user} has archived card {card} in list {stack} on board {board}" : "Ο {user} αρχειοθέτησε την κάρτα {card} στην λίστα {stack} του πίνακα {board} ",
|
||||
"{user} has archived card {card} in list {stack} on board {board}" : "Ο/η {user} αρχειοθέτησε την κάρτα {card} στην λίστα {stack} του πίνακα {board} ",
|
||||
"You have unarchived card {card} in list {stack} on board {board}" : "Επαναφέρατε από το αρχείο την καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has unarchived card {card} in list {stack} on board {board}" : "Ο {user} επανέφερε από το αρχείο την κάρτα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has unarchived card {card} in list {stack} on board {board}" : "Ο/η {user} επανέφερε από το αρχείο την κάρτα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"You have removed the due date of card {card}" : "Καταργήσατε την ημερομηνία λήξης της καρτέλας {card}",
|
||||
"{user} has removed the due date of card {card}" : "Ο {user} κατήργησε την ημερομηνία λήξης της καρτέλας {card}",
|
||||
"{user} has removed the due date of card {card}" : "Ο/η {user} κατάργησε την ημερομηνία λήξης της καρτέλας {card}",
|
||||
"You have set the due date of card {card} to {after}" : "Ορίσατε την ημερομηνία λήξης της καρτέλας {card} σε {after}",
|
||||
"{user} has set the due date of card {card} to {after}" : "Ο {user} όρισε την ημερομηνία λήξης της καρτέλας {card} σε {after} ",
|
||||
"{user} has set the due date of card {card} to {after}" : "Ο/η {user} όρισε την ημερομηνία λήξης της καρτέλας {card} σε {after} ",
|
||||
"You have updated the due date of card {card} to {after}" : "Ενημερώσατε την ημερομηνία λήξης της καρτέλας {card} σε {after}",
|
||||
"{user} has updated the due date of card {card} to {after}" : "Ο {user} ενημέρωσε την ημερομηνία λήξης της καρτέλας {card} σε {after}",
|
||||
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Προσθέσατε ετικέτα στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "Ο {user} πρόσθεσε ετικέτα στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Αφαιρέσατε την ετικέτα από την καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has removed the tag {label} from card {card} in list {stack} on board {board}" : "Ο {user} αφαίρεσε την ετικέτα της καρτέλα {card} της λίστας {stack} του πίνακα {board} ",
|
||||
"{user} has updated the due date of card {card} to {after}" : "Ο/η {user} ενημέρωσε την ημερομηνία λήξης της καρτέλας {card} σε {after}",
|
||||
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Προσθέσατε ετικέτα {label} στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "Ο/η {user} πρόσθεσε ετικέτα {label} στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Αφαιρέσατε την ετικέτα {label} από την καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has removed the tag {label} from card {card} in list {stack} on board {board}" : "Ο/η {user} αφαίρεσε την ετικέτα {label} της καρτέλας {card} της λίστας {stack} του πίνακα {board} ",
|
||||
"You have assigned {assigneduser} to card {card} on board {board}" : "Έχετε ορίσει τον {assigneduser} στην καρτέλα {card} στον πίνακα {board}",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "Ο {user} έχει ορισθεί {assigneduser} στην καρτέλα {card} του πίνακα {board}",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Έχετε αφαιρεθεί {assigneduser} από την καρτέλα {card} του πίνακα {board}",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "Ο {user} έχει αφαιρεθεί {assigneduser} από την καρτέλα {card} του πίνακα {board}",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "Ο/η {user} έχει ορισθεί {assigneduser} στην καρτέλα {card} του πίνακα {board}",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Έχετε αφαιρέσει {assigneduser} από την καρτέλα {card} του πίνακα {board}",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "Ο/η {user} έχει αφαιρεθεί {assigneduser} από την καρτέλα {card} του πίνακα {board}",
|
||||
"You have moved the card {card} from list {stackBefore} to {stack}" : "Μετακινήσατε την καρτέλα {card} από την λίστα {stackBefore} στη {stack}",
|
||||
"{user} has moved the card {card} from list {stackBefore} to {stack}" : "Ο {user} μετακίνησε την καρτέλα {card} από την λίστα {stackBefore} στην {stack}",
|
||||
"{user} has moved the card {card} from list {stackBefore} to {stack}" : "Ο/η {user} μετακίνησε την καρτέλα {card} από την λίστα {stackBefore} στην {stack}",
|
||||
"You have added the attachment {attachment} to card {card}" : "Προσθέσατε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "Ο {user} πρόσθεσε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "Ο/η {user} πρόσθεσε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"You have updated the attachment {attachment} on card {card}" : "Ενημερώσατε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"{user} has updated the attachment {attachment} on card {card}" : "Ο {user} ενημέρωσε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"{user} has updated the attachment {attachment} on card {card}" : "Ο/η {user} ενημέρωσε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"You have deleted the attachment {attachment} from card {card}" : "Διαγράψατε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"{user} has deleted the attachment {attachment} from card {card}" : "Ο {user} διέγραψε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"{user} has deleted the attachment {attachment} from card {card}" : "Ο/η {user} διέγραψε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"You have restored the attachment {attachment} to card {card}" : "Επαναφέρατε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "Ο {user} επανέφερε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "Ο/η {user} επανέφερε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"You have commented on card {card}" : "Σχολιάσατε την καρτέλα {card}",
|
||||
"{user} has commented on card {card}" : "Ο {user} σχολίασε την καρτέλα {card}",
|
||||
"{user} has commented on card {card}" : "Ο/η {user} σχολίασε την καρτέλα {card}",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "Η <strong>περιγραφή καρτέλας </strong>στην εφαρμογή Deck άλλαξε",
|
||||
"Deck" : "Deck",
|
||||
"Changes in the <strong>Deck app</strong>" : "Αλλαγές στην <strong>εφαρμογή Deck</strong>",
|
||||
"A <strong>comment</strong> was created on a card" : "Ένα <strong>σχόλιο</strong> δημιουργήθηκε σε μια καρτέλα",
|
||||
"Upcoming cards" : "Επερχόμενες κάρτες",
|
||||
"Upcoming cards" : "Επερχόμενες καρτέλες",
|
||||
"Personal" : "Προσωπικά",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Η καρτέλα \"%s\" του \"%s\" ανατέθηκε σε εσάς από τον %s.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Η κάρτα \"1%s\" στο \"1%s\" έχει λήξει.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s σας ανέφερε σε σχόλιο στο \"%s\".",
|
||||
"The board \"%s\" has been shared with you by %s." : "Ο πίνακας \"%s\" είναι σε κοινή χρήση μαζί σας %s.",
|
||||
"{user} has assigned the card {deck-card} on {deck-board} to you." : "Ο/Η {user} έχει αναθέσει την καρτέλα {deck-card} του πίνακα {deck-board} σε εσάς.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Η καρτέλα \"%s\" στο \"%s\" έχει λήξει.",
|
||||
"The card {deck-card} on {deck-board} has reached its due date." : "Η καρτέλα {deck-card} στο {deck-board} έχει λήξει.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "Ο/η%s σας ανέφερε σε σχόλιο στο \"%s\".",
|
||||
"{user} has mentioned you in a comment on {deck-card}." : "Ο/Η {user} σας ανέφερε σε ένα σχόλιο στο {deck-card}.",
|
||||
"The board \"%s\" has been shared with you by %s." : "Ο πίνακας \"%s\" είναι σε κοινή χρήση μαζί σας από %s.",
|
||||
"{user} has shared {deck-board} with you." : "Ο/Η διαμοιράστηκε μαζί σας το {deck-board}",
|
||||
"Card comments" : "Σχόλια καρτέλας",
|
||||
"%s on %s" : "%s στο %s",
|
||||
"No data was provided to create an attachment." : "Δεν δόθηκαν στοιχεία για δημιουργία συνημμένου.",
|
||||
"Finished" : "Ολοκληρώθηκε",
|
||||
"To review" : "Προς επισκόπηση",
|
||||
"Action needed" : "Απαιτείται ενέργεια",
|
||||
"Later" : "Αργότερα",
|
||||
"copy" : "Αντιγραφή",
|
||||
"To do" : "Να κάνω",
|
||||
"To do" : "Προς Ενέργεια",
|
||||
"Doing" : "Σε εξέλιξη",
|
||||
"Done" : "Ολοκληρώθηκε",
|
||||
"Example Task 3" : "Παράδειγμα Εργασίας 3",
|
||||
"Example Task 2" : "Παράδειγμα Εργασίας 2",
|
||||
"Example Task 1" : "Παράδειγμα Εργασίας 1",
|
||||
"The file was uploaded" : "Το αρχείο μεταφορτώθηκε",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Το μεταφορτωμένο αρχείο υπερβαίνει την οδηγία upload_max_filesize στο php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Το μεταφορτωμένο αρχείο υπερβαίνει την οδηγία MAX_FILE_SIZE που καθορίστηκε στην φόρμα HTML.",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Το αρχείο που εστάλη υπερβαίνει την οδηγία μέγιστου επιτρεπτού μεγέθους \"upload_max_filesize\" του php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Το ανεβασμένο αρχείο υπερβαίνει το MAX_FILE_SIZE που ορίζεται στην HTML φόρμα",
|
||||
"The file was only partially uploaded" : "Το αρχείο μεταφορτώθηκε εν μέρει",
|
||||
"No file was uploaded" : "Δεν μεταφορτώθηκε κάποιο αρχείο",
|
||||
"Missing a temporary folder" : "Λείπει κάποιος προσωρινός φάκελος",
|
||||
"Could not write file to disk" : "Αδυναμία εγγραφής αρχείου στον δίσκο",
|
||||
"A PHP extension stopped the file upload" : "Ένα πρόσθετο PHP διέκοψε την μεταφόρτωση του αρχείου",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Δεν μεταφορτώθηκε αρχείο ή το μέγεθος αρχείου υπερβαίνει το μέγιστο %s",
|
||||
"Card not found" : "Η κάρτα δεν βρέθηκε",
|
||||
"Path is already shared with this card" : "Η διαδρομή κοινοποιείται ήδη σε αυτήν την κάρτα",
|
||||
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Αυτό το σχόλιο έχει περισσότερους από %s χαρακτήρες.\nΠροστέθηκε ως συνημμένο στην καρτέλα με όνομα %s .\nΠροσβάσιμο στη διεύθυνση URL: %s.",
|
||||
"Card not found" : "Η καρτέλα δεν βρέθηκε",
|
||||
"Path is already shared with this card" : "Η διαδρομή κοινοποιείται ήδη σε αυτήν την καρτέλα",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Μη έγκυρη ημερομηνία, η μορφή ημερομηνίας πρέπει να είναι ΕΕΕΕ-ΜΜ-ΗΗ",
|
||||
"Personal planning and team project organization" : "Προσωπικός σχεδιασμός και ομαδική οργάνωση",
|
||||
"Personal planning and team project organization" : "Προσωπικός σχεδιασμός και οργάνωση ομαδικών έργων",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Το Deck είναι ένα εργαλείο οργάνωσης τύπου kanban με στόχο τον προσωπικό προγραμματισμό και την οργάνωση έργων για ομάδες που έχουν ενσωματωθεί στο Nextcloud.\n\n\n- 📥 Προσθέστε τις εργασίες σας στις καρτέλες και βάλτε τες στη σειρά\n- 📄 Γράψτε τις πρόσθετες σημειώσεις\n- 🔖 Αντιστοιχίστε τις ετικέτες για ακόμη καλύτερη οργάνωση\n- 👥 Μοιραστείτε με την ομάδα, φίλους ή την οικογένειά σας\n- 📎 Επισυνάψτε αρχεία και ενσωματώστε τα στην περιγραφή\n- 💬 Συζητήστε με την ομάδα σας χρησιμοποιώντας σχόλια\n- ⚡ Παρακολουθήστε τις αλλαγές στη ροή δραστηριοτήτων\n- 🚀 Έχετε τα όλα οργανωμένα",
|
||||
"Card details" : "Λεπτομέρειες καρτέλας",
|
||||
"Add board" : "Προσθήκη πίνακα",
|
||||
"Select the board to link to a project" : "Επιλέξτε πίνακα και συνδέστε τον σε έργο",
|
||||
"Select the board to link to a project" : "Επιλέξτε πίνακα και συνδέστε τον σε ένα έργο",
|
||||
"Search by board title" : "Αναζήτηση με το όνομα πίνακα",
|
||||
"Select board" : "Επιλογή πίνακα",
|
||||
"Create a new card" : "Δημιουργία νέας κάρτας",
|
||||
"Create a new card" : "Δημιουργία νέας καρτέλας",
|
||||
"Select a board" : "Επιλογή ενός πίνακα",
|
||||
"Select a list" : "Επιλέξτε μια λίστα",
|
||||
"Card title" : "Τίτλος κάρτας",
|
||||
"Card title" : "Τίτλος καρτέλας",
|
||||
"Cancel" : "Aκύρωση",
|
||||
"Open card" : "Άνοιγμα κάρτας",
|
||||
"Creating the new card …" : "Γίνεται δημιουργία της νέας καρτέλας...",
|
||||
"Card \"{card}\" was added to \"{board}\"" : "Η καρτέλα \"{card}\" προστέθηκε στο \"{board}\"",
|
||||
"Open card" : "Άνοιγμα καρτέλας",
|
||||
"Close" : "Κλείσιμο",
|
||||
"Create card" : "Δημιουργία κάρτας",
|
||||
"Select a card" : "Επίλογή μιας καρτέλας",
|
||||
"Create card" : "Δημιουργία καρτέλας",
|
||||
"Select a card" : "Επιλογή μιας καρτέλας",
|
||||
"Select the card to link to a project" : "Επιλογή καρτέλας για σύνδεση στο έργο",
|
||||
"Link to card" : "Σύνδεσμος σε καρτέλα",
|
||||
"File already exists" : "Το αρχείο υπάρχει ήδη",
|
||||
"A file with the name {filename} already exists." : "Το αρχείο με όνομα {filename} υπάρχει ήδη.",
|
||||
"Do you want to overwrite it?" : "Επιθυμείτε να γίνει αντικατάσταση του?",
|
||||
"Overwrite file" : "Αντικατάσταση αρχείου",
|
||||
"Keep existing file" : "Διατήρηση υπάρχων αρχείου",
|
||||
"Keep existing file" : "Διατήρηση υπάρχοντος αρχείου",
|
||||
"This board is read only" : "Ο πίνακας είναι μόνο για ανάγνωση",
|
||||
"Drop your files to upload" : "Αποθέστε τα αρχεία σας για ανέβασμα",
|
||||
"Add card" : "Προσθήκη κάρτας",
|
||||
"Archived cards" : "Αρχειοθετημένες κάρτες",
|
||||
"Add card" : "Προσθήκη καρτέλας",
|
||||
"Archived cards" : "Αρχειοθετημένες καρτέλες",
|
||||
"Add list" : "Προσθήκη λίστας",
|
||||
"List name" : "Λίστα ονομάτων",
|
||||
"List name" : "Όνομα λίστας",
|
||||
"Apply filter" : "Εφαρμογή φίλτρου",
|
||||
"Filter by tag" : "Φίλτρο ανά ετικέτα",
|
||||
"Filter by assigned user" : "Φίλτρο ανά χρήστη",
|
||||
"Unassigned" : "Χωρίς ανάθεση",
|
||||
"Filter by due date" : "Φίλτρο ανά ημερομηνία λήξης",
|
||||
"Overdue" : "Εκπρόθεσμος",
|
||||
"Overdue" : "Εκπρόθεσμες",
|
||||
"Next 24 hours" : "Επόμενες 24 ώρες",
|
||||
"Next 7 days" : "Επόμενες 7 ημέρες",
|
||||
"Next 30 days" : "Επόμενες 30 ημέρες",
|
||||
@@ -147,7 +157,7 @@ OC.L10N.register(
|
||||
"Sharing" : "Διαμοιρασμός",
|
||||
"Tags" : "Ετικέτες",
|
||||
"Deleted items" : "Διαγραμμένα αντικείμενα",
|
||||
"Timeline" : "Χρονοδιάγραμμα",
|
||||
"Timeline" : "Χρονολόγιο",
|
||||
"Deleted lists" : "Διαγραμμένες λίστες",
|
||||
"Undo" : "Αναίρεση",
|
||||
"Deleted cards" : "Διαγραμμένες καρτέλες",
|
||||
@@ -160,14 +170,17 @@ OC.L10N.register(
|
||||
"Can edit" : "Μπορεί να επεξεργαστεί",
|
||||
"Can share" : "Μπορεί να διαμοιράσει",
|
||||
"Can manage" : "Μπορεί να διαχειριστεί",
|
||||
"Owner" : "Κάτοχος",
|
||||
"Delete" : "Διαγραφή",
|
||||
"Failed to create share with {displayName}" : "Αποτυχία δημιουργίας κοινής χρήσης με το {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Είστε σίγουροι ότι θέλετε να μεταφέρετε τον πίνακα {title} για {user}? ",
|
||||
"Transfer" : "Μεταφορά",
|
||||
"Add a new list" : "Προσθήκη νέας λίστας",
|
||||
"Archive all cards" : "Αρχειοθέτηση όλων των καρτελών.",
|
||||
"Delete list" : "Διαγραφή λίστας",
|
||||
"Archive all cards in this list" : "Αρχειοθέτηση όλων των καρτελών σε αυτή τη λίστα.",
|
||||
"Add a new card" : "Προσθήκη νέας καρτέλας",
|
||||
"Card name" : "Όνομα κάρτας",
|
||||
"Card name" : "Όνομα καρτέλας",
|
||||
"List deleted" : "Η λίστα διαγράφηκε",
|
||||
"Edit" : "Επεξεργασία",
|
||||
"Add a new tag" : "Προσθήκη νέας ετικέτας",
|
||||
@@ -175,14 +188,17 @@ OC.L10N.register(
|
||||
"Board name" : "Όνομα πίνακα",
|
||||
"Members" : "Μέλη",
|
||||
"Upload new files" : "Ανεβάστε νέα αρχεία",
|
||||
"Share from Files" : "Κοινή χρήση από αρχεία",
|
||||
"Share from Files" : "Κοινή χρήση από Αρχεία",
|
||||
"Pending share" : "Κοινή χρήση σε εκκρεμότητα",
|
||||
"Add this attachment" : "Προσθήκη αυτού του συνημμένου",
|
||||
"Show in Files" : "Εμφάνιση σε αρχεία",
|
||||
"Delete Attachment" : "Διαγραφή Συνημμένου",
|
||||
"Restore Attachment" : "Επαναφορά Συνημμένου",
|
||||
"Show in Files" : "Εμφάνιση σε Αρχεία",
|
||||
"Download" : "Λήψη",
|
||||
"Remove attachment" : "Αφαίρεση συνημμένου",
|
||||
"Delete Attachment" : "Διαγραφή συνημμένου",
|
||||
"Restore Attachment" : "Επαναφορά συνημμένου",
|
||||
"File to share" : "Αρχείο για κοινή χρήση",
|
||||
"Invalid path selected" : "Επιλέχθηκε μη έγκυρη διαδρομή",
|
||||
"Open in sidebar view" : "Άνοιγμα σε προβολή πλευρικής γραμμής",
|
||||
"Open in sidebar view" : "Άνοιγμα σε προβολή πλευρικής στήλης",
|
||||
"Open in bigger view" : "Άνοιγμα σε μεγαλύτερη προβολή",
|
||||
"Attachments" : "Συνημμένα",
|
||||
"Comments" : "Σχόλια",
|
||||
@@ -190,20 +206,24 @@ OC.L10N.register(
|
||||
"Created" : "Δημιουργήθηκε",
|
||||
"The title cannot be empty." : "Ο τίτλος δεν μπορεί να είναι κενός.",
|
||||
"No comments yet. Begin the discussion!" : "Χωρίς σχόλια ακόμη. Ξεκινήστε την συζήτηση!",
|
||||
"Failed to load comments" : "Αποτυχία φόρτωσης σχολίων",
|
||||
"Assign a tag to this card…" : "Ορίστε μια ετικέτα σε αυτήν την καρτέλα...",
|
||||
"Assign to users" : "Αναθέστε στους χρήστες",
|
||||
"Assign to users" : "Ανάθεση σε χρήστες",
|
||||
"Assign to users/groups/circles" : "Ανάθεση σε χρήστες/ομάδες/κύκλους",
|
||||
"Assign a user to this card…" : "Αναθέστε χρήστη στην καρτέλα...",
|
||||
"Assign a user to this card…" : "Ανάθεση χρήστη στην καρτέλα...",
|
||||
"Due date" : "Ημερομηνία λήξης",
|
||||
"Set a due date" : "Καθορίστε ημερομηνίας λήξης",
|
||||
"Remove due date" : "Αφαίρεση ημερομηνίας λήξης",
|
||||
"Select Date" : "Επέλεξε Ημέρα",
|
||||
"Select Date" : "Επιλέξτε ημερομηνία",
|
||||
"Today" : "Σήμερα",
|
||||
"Tomorrow" : "Αύριο",
|
||||
"Next week" : "Επόμενη εβδομάδα",
|
||||
"Next month" : "Επόμενος μήνας",
|
||||
"Save" : "Αποθήκευση",
|
||||
"The comment cannot be empty." : "Το σχόλιο δεν μπορεί να είναι κενό.",
|
||||
"The comment cannot be longer than 1000 characters." : "Το σχόλιο δεν μπορεί να έχι περισσότερους από 1000 χαρακτήρες.",
|
||||
"In reply to" : "Ως απάντηση σε",
|
||||
"In reply to" : "Σε απάντηση σε",
|
||||
"Cancel reply" : "Ακύρωση απάντησης",
|
||||
"Reply" : "Απάντηση",
|
||||
"Update" : "Ενημέρωση",
|
||||
"Description" : "Περιγραφή",
|
||||
@@ -216,21 +236,23 @@ OC.L10N.register(
|
||||
"Write a description …" : "Γράψτε μια περιγραφή…",
|
||||
"Choose attachment" : "Επιλογή συνημμένου",
|
||||
"(group)" : "(ομάδα)",
|
||||
"{count} comments, {unread} unread" : "{count} σχόλια, {unread} μη αναγνωσμένα",
|
||||
"Assign to me" : "Ανάθεση σε εμένα",
|
||||
"Unassign myself" : "Αποδέσμευσή μου",
|
||||
"Move card" : "Μετακίνηση κάρτας",
|
||||
"Unarchive card" : "Αναίρεση αρχειοθέτησης κάρτας",
|
||||
"Archive card" : "Αρχειοθέτηση κάρτας",
|
||||
"Delete card" : "Διαγραφή κάρτας",
|
||||
"Move card" : "Μετακίνηση καρτέλας",
|
||||
"Unarchive card" : "Αναίρεση αρχειοθέτησης καρτέλας",
|
||||
"Archive card" : "Αρχειοθέτηση καρτέλας",
|
||||
"Delete card" : "Διαγραφή καρτέλας",
|
||||
"Move card to another board" : "Μετακίνηση καρτέλας σε άλλο πίνακα",
|
||||
"Card deleted" : "Η κάρτα διαγράφηκε",
|
||||
"List is empty" : "Η λίστα είναι άδεια.",
|
||||
"Card deleted" : "Η καρτέλα διαγράφηκε",
|
||||
"seconds ago" : " δευτερόλεπτα πριν ",
|
||||
"All boards" : "Όλοι οι πίνακες",
|
||||
"Archived boards" : "Αρχειοθέτηση πινάκων ",
|
||||
"Shared with you" : "Διαμοιρασμένα μαζί σας",
|
||||
"Use bigger card view" : "Χρησιμοποιήστε μεγαλύτερη προβολή κάρτας",
|
||||
"Use bigger card view" : "Χρησιμοποιήστε μεγαλύτερη προβολή καρτέλας",
|
||||
"Show boards in calendar/tasks" : "Εμφάνιση πινάκων στο ημερολόγιο / εργασίες",
|
||||
"Limit deck usage of groups" : "Περιορίστε τη χρήση της εφαρμογής σε ομάδες",
|
||||
"Limit deck usage of groups" : "Περιορίστε τη χρήση της εφαρμογής deck σε ομάδες",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ο περιορισμός του Deck θα εμποδίσει τους χρήστες που δεν είναι μέρος αυτών των ομάδων να δημιουργούν δικούς τους πίνακες. Οι χρήστες θα εξακολουθήσουν να εργάζονται σε πίνακες που έχουν διαμοιραστεί μαζί τους.",
|
||||
"Board details" : "Λεπτομέριες πίνακα",
|
||||
"Edit board" : "Επεξεργασία πίνακα",
|
||||
@@ -240,31 +262,37 @@ OC.L10N.register(
|
||||
"Turn on due date reminders" : "Ενεργοποιήστε τις υπενθυμίσεις ημερομηνίας προθεσμίας",
|
||||
"Turn off due date reminders" : "Απενεργοποιήστε τις υπενθυμίσεις ημερομηνίας προθεσμίας",
|
||||
"Due date reminders" : "Υπενθυμίσεις ημερομηνίας προθεσμίας",
|
||||
"All cards" : "Όλες οι κάρτες",
|
||||
"Assigned cards" : "Ανατεθείς κάρτες",
|
||||
"All cards" : "Όλες οι καρτέλες",
|
||||
"Assigned cards" : "Ανατεθειμένες καρτέλες",
|
||||
"No notifications" : "Δεν υπάρχουν ειδοποιήσεις",
|
||||
"Delete board" : "Διαγραφή πίνακα",
|
||||
"Board {0} deleted" : "Διαγράφηκε {0} πίνακας",
|
||||
"Only assigned cards" : "Μόνο κάρτες που έχουν ανατεθεί",
|
||||
"Board {0} deleted" : "Διαγράφηκε {0} πίνακας ",
|
||||
"Only assigned cards" : "Μόνο καρτέλες που έχουν ανατεθεί",
|
||||
"No reminder" : "Δεν υπάρχει υπενθύμιση",
|
||||
"An error occurred" : "Παρουσιάστηκε σφάλμα",
|
||||
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Είστε βέβαιοι ότι θέλετε να διαγράψετε τον πίνακα {title}; Θα διαγραφούν όλα τα δεδομένα.",
|
||||
"Delete the board?" : "Διαγραφή πίνακα;",
|
||||
"Delete the board?" : "Διαγραφή του πίνακα;",
|
||||
"Loading filtered view" : "Φόρτωση εμφάνισης με βάση το φίλτρο",
|
||||
"This week" : "Αυτή την εβδομάδα",
|
||||
"No due" : "Χωρίς λήξη",
|
||||
"No upcoming cards" : "Δεν υπάρχουν επερχόμενες κάρτες",
|
||||
"upcoming cards" : "Επερχόμενες κάρτες",
|
||||
"Search for {searchQuery} in all boards" : "Αναζήτηση για {searchQuery} σε όλους τους πίνακες",
|
||||
"No results found" : "Δεν βρέθηκαν αποτελέσματα",
|
||||
"No upcoming cards" : "Δεν υπάρχουν επερχόμενες καρτέλες",
|
||||
"upcoming cards" : "επερχόμενες καρτέλες",
|
||||
"Link to a board" : "Σύνδεσμος στον πίνακα",
|
||||
"Link to a card" : "Σύνδεσμος σε καρτέλα",
|
||||
"Create a card" : "Δημιουργία κάρτας",
|
||||
"Create a card" : "Δημιουργία καρτέλας",
|
||||
"Message from {author} in {conversationName}" : "Μήνυμα από {author} σε {conversationName}",
|
||||
"Something went wrong" : "Κάτι πήγε στραβά",
|
||||
"Failed to upload {name}" : "Αποτυχία μεταφόρτωσης {όνομα}",
|
||||
"Failed to upload {name}" : "Αποτυχία μεταφόρτωσης {name}",
|
||||
"Maximum file size of {size} exceeded" : "Υπέρβαση επιτρεπόμενου μεγέθους αρχείου {size}",
|
||||
"Error creating the share" : "Σφάλμα κατά τη δημιουργία της κοινοποίησης",
|
||||
"Share with a Deck card" : "Μοιραστείτε με μια κάρτα Deck",
|
||||
"Share {file} with a Deck card" : "Μοιραστείτε {αρχείο} με μια κάρτα Deck",
|
||||
"Share with a Deck card" : "Μοιραστείτε με μια καρτέλα Deck",
|
||||
"Share {file} with a Deck card" : "Μοιραστείτε το {file} με μια καρτέλα Deck",
|
||||
"Share" : "Μοιραστείτε",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Το Deck είναι ένα εργαλείο οργάνωσης τύπου kanban με στόχο τον προσωπικό προγραμματισμό και την ομαδική οργάνωση για ομάδες που έχουν ενσωματωθεί στο Nextcloud.\n\n\n- 📥 Προσθέστε τις εργασίες σας στις καρτέλες και βάλτε τες στη σειρά\n- 📄 Γράψτε τις πρόσθετες σημειώσεις\n- 🔖 Αντιστοιχίστε τις ετικέτες για ακόμη καλύτερη οργάνωση\n- 👥 Μοιραστείτε με την ομάδα, φίλους ή την οικογένειά σας\n- 📎 Συνδέστε αρχεία και ενσωματώστε τα στην περιγραφή\n- 💬 Συζητήστε με την ομάδα σας χρησιμοποιώντας σχόλια\n- ⚡ Παρακολουθήστε τις αλλαγές στη ροή δραστηριοτήτων\n- 🚀 Έχετε τα όλα οργανωμένα"
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Το Deck είναι ένα εργαλείο οργάνωσης τύπου kanban με στόχο τον προσωπικό προγραμματισμό και την οργάνωση έργων για ομάδες που έχουν ενσωματωθεί στο Nextcloud.\n\n\n- 📥 Προσθέστε τις εργασίες σας στις καρτέλες και βάλτε τες στη σειρά\n- 📄 Γράψτε τις πρόσθετες σημειώσεις\n- 🔖 Αντιστοιχίστε τις ετικέτες για ακόμη καλύτερη οργάνωση\n- 👥 Μοιραστείτε με την ομάδα, φίλους ή την οικογένειά σας\n- 📎 Συνδέστε αρχεία και ενσωματώστε τα στην περιγραφή\n- 💬 Συζητήστε με την ομάδα σας χρησιμοποιώντας σχόλια\n- ⚡ Παρακολουθήστε τις αλλαγές στη ροή δραστηριοτήτων\n- 🚀 Έχετε τα όλα οργανωμένα",
|
||||
"Creating the new card…" : "Δημιουργία νέας καρτέλας...",
|
||||
"\"{card}\" was added to \"{board}\"" : "\"{card}\" προστέθηκε στο \"{board}\"",
|
||||
"(circle)" : "(κύκλος)"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
200
l10n/el.json
200
l10n/el.json
@@ -1,134 +1,144 @@
|
||||
{ "translations": {
|
||||
"You have created a new board {board}" : "Δημιουργήσατε νέο πίνακα {board}",
|
||||
"{user} has created a new board {board}" : "Ο {user} δημιούργησε νέο πίνακα {board}",
|
||||
"{user} has created a new board {board}" : "Ο/η {user} δημιούργησε νέο πίνακα {board}",
|
||||
"You have deleted the board {board}" : "Έχετε διαγράψει τον πίνακα {board}",
|
||||
"{user} has deleted the board {board}" : "Ο {user} διέγραψε τον πίνακα {board}",
|
||||
"{user} has deleted the board {board}" : "Ο/η {user} διέγραψε τον πίνακα {board}",
|
||||
"You have restored the board {board}" : "Εχετε επαναφέρει τον πίνακα {board}",
|
||||
"{user} has restored the board {board}" : "Ο {user} επανέφερε τον πίνακα {board}",
|
||||
"{user} has restored the board {board}" : "Ο/η {user} επανέφερε τον πίνακα {board}",
|
||||
"You have shared the board {board} with {acl}" : "Εχετε διαμοιράσει τον πίνακα {board} με {acl}",
|
||||
"{user} has shared the board {board} with {acl}" : "Ο {user} διαμοίρασε τον πίνακα {board} με {acl}",
|
||||
"{user} has shared the board {board} with {acl}" : "Ο/η {user} διαμοίρασε τον πίνακα {board} με {acl}",
|
||||
"You have removed {acl} from the board {board}" : "Αφαιρέθηκε η {acl} από τον πίνακα {board}",
|
||||
"{user} has removed {acl} from the board {board}" : "Ο {user} αφαίρεσε την {acl} από τον πίνακα {board}",
|
||||
"{user} has removed {acl} from the board {board}" : "Ο/η {user} αφαίρεσε την {acl} από τον πίνακα {board}",
|
||||
"You have renamed the board {before} to {board}" : "Μετονομάσατε τον πίνακα {before} σε {board}",
|
||||
"{user} has renamed the board {before} to {board}" : "Ο {user} μετονόμασε τον πίνακα {before} σε {board}",
|
||||
"{user} has renamed the board {before} to {board}" : "Ο/η {user} μετονόμασε τον πίνακα {before} σε {board}",
|
||||
"You have archived the board {board}" : "Αρχειοθετήσατε τον πίνακα {board}",
|
||||
"{user} has archived the board {before}" : "Ο {user} αρχειοθέτησε τον πίνακα {before}",
|
||||
"You have unarchived the board {board}" : "Επαναφέρατε τον πίνακα {board} από αρχείο",
|
||||
"{user} has unarchived the board {before}" : "Ο {user} επανέφερε τον πίνακα {before} από αρχείο",
|
||||
"{user} has archived the board {before}" : "Ο/η {user} αρχειοθέτησε τον πίνακα {before}",
|
||||
"You have unarchived the board {board}" : "Επαναφέρατε τον πίνακα {board} από το αρχείο",
|
||||
"{user} has unarchived the board {before}" : "Ο/η {user} επανέφερε τον πίνακα {before} από αρχείο",
|
||||
"You have created a new list {stack} on board {board}" : "Έχετε δημιουργήσει μια νέα λίστα {stack} στον πίνακα {board}",
|
||||
"{user} has created a new list {stack} on board {board}" : "Ο {user} δημιούργησε μια νέα λίστα {stack} στον πίνακα {board}",
|
||||
"{user} has created a new list {stack} on board {board}" : "Ο/η {user} δημιούργησε μια νέα λίστα {stack} στον πίνακα {board}",
|
||||
"You have renamed list {before} to {stack} on board {board}" : "Μετονομάσατε την λίστα {before} σε {stack} στον πίνακα {board}",
|
||||
"{user} has renamed list {before} to {stack} on board {board}" : "Ο {user} μετονόμασε την λίστα {before} σε {stack} στον πίνακα {board}",
|
||||
"{user} has renamed list {before} to {stack} on board {board}" : "Ο/η {user} μετονόμασε την λίστα {before} σε {stack} στον πίνακα {board}",
|
||||
"You have deleted list {stack} on board {board}" : "Διαγράψατε την λίστα {stack} στον πίνακα {board}",
|
||||
"{user} has deleted list {stack} on board {board}" : "Ο {user} διέγραψε την λίστα {stack} στον πίνακα {board}",
|
||||
"{user} has deleted list {stack} on board {board}" : "Ο/η {user} διέγραψε την λίστα {stack} στον πίνακα {board}",
|
||||
"You have created card {card} in list {stack} on board {board}" : "Δημιουργήσατε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"{user} has created card {card} in list {stack} on board {board}" : "Ο {user} δημιούργησε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"{user} has created card {card} in list {stack} on board {board}" : "Ο/η {user} δημιούργησε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"You have deleted card {card} in list {stack} on board {board}" : "Διαγράψατε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"{user} has deleted card {card} in list {stack} on board {board}" : "Ο {user} διέγραψε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"{user} has deleted card {card} in list {stack} on board {board}" : "Ο/η {user} διέγραψε την καρτέλα {card} στην λίστα {stack} του πίνακα {board}",
|
||||
"You have renamed the card {before} to {card}" : "Μετονομάσατε την καρτέλα {before} σε {card}",
|
||||
"{user} has renamed the card {before} to {card}" : "Ο {user} μετονόμασε την καρτέλα {before} σε {card}",
|
||||
"{user} has renamed the card {before} to {card}" : "Ο/η {user} μετονόμασε την καρτέλα {before} σε {card}",
|
||||
"You have added a description to card {card} in list {stack} on board {board}" : "Προσθέσατε μια περιγραφή στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has added a description to card {card} in list {stack} on board {board}" : "Ο {user} πρόσθεσε μια περιγραφή στην καρτέλα {card} της λίστας {stack} του πίνακα {board} ",
|
||||
"{user} has added a description to card {card} in list {stack} on board {board}" : "Ο/η {user} πρόσθεσε μια περιγραφή στην καρτέλα {card} της λίστας {stack} του πίνακα {board} ",
|
||||
"You have updated the description of card {card} in list {stack} on board {board}" : "Ενημερώσατε την περιγραφή στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "Ο {user} ενημέρωσε την περιγραφή της καρτέλας {card} στη λίστα {stack} του πίνακα {board}",
|
||||
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "Ο/η {user} ενημέρωσε την περιγραφή της καρτέλας {card} στη λίστα {stack} του πίνακα {board}",
|
||||
"You have archived card {card} in list {stack} on board {board}" : "Αρχειοθετήσατε την κάρτα {card} στην λίστα {stack} του πίνακα {board} ",
|
||||
"{user} has archived card {card} in list {stack} on board {board}" : "Ο {user} αρχειοθέτησε την κάρτα {card} στην λίστα {stack} του πίνακα {board} ",
|
||||
"{user} has archived card {card} in list {stack} on board {board}" : "Ο/η {user} αρχειοθέτησε την κάρτα {card} στην λίστα {stack} του πίνακα {board} ",
|
||||
"You have unarchived card {card} in list {stack} on board {board}" : "Επαναφέρατε από το αρχείο την καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has unarchived card {card} in list {stack} on board {board}" : "Ο {user} επανέφερε από το αρχείο την κάρτα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has unarchived card {card} in list {stack} on board {board}" : "Ο/η {user} επανέφερε από το αρχείο την κάρτα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"You have removed the due date of card {card}" : "Καταργήσατε την ημερομηνία λήξης της καρτέλας {card}",
|
||||
"{user} has removed the due date of card {card}" : "Ο {user} κατήργησε την ημερομηνία λήξης της καρτέλας {card}",
|
||||
"{user} has removed the due date of card {card}" : "Ο/η {user} κατάργησε την ημερομηνία λήξης της καρτέλας {card}",
|
||||
"You have set the due date of card {card} to {after}" : "Ορίσατε την ημερομηνία λήξης της καρτέλας {card} σε {after}",
|
||||
"{user} has set the due date of card {card} to {after}" : "Ο {user} όρισε την ημερομηνία λήξης της καρτέλας {card} σε {after} ",
|
||||
"{user} has set the due date of card {card} to {after}" : "Ο/η {user} όρισε την ημερομηνία λήξης της καρτέλας {card} σε {after} ",
|
||||
"You have updated the due date of card {card} to {after}" : "Ενημερώσατε την ημερομηνία λήξης της καρτέλας {card} σε {after}",
|
||||
"{user} has updated the due date of card {card} to {after}" : "Ο {user} ενημέρωσε την ημερομηνία λήξης της καρτέλας {card} σε {after}",
|
||||
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Προσθέσατε ετικέτα στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "Ο {user} πρόσθεσε ετικέτα στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Αφαιρέσατε την ετικέτα από την καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has removed the tag {label} from card {card} in list {stack} on board {board}" : "Ο {user} αφαίρεσε την ετικέτα της καρτέλα {card} της λίστας {stack} του πίνακα {board} ",
|
||||
"{user} has updated the due date of card {card} to {after}" : "Ο/η {user} ενημέρωσε την ημερομηνία λήξης της καρτέλας {card} σε {after}",
|
||||
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Προσθέσατε ετικέτα {label} στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "Ο/η {user} πρόσθεσε ετικέτα {label} στην καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Αφαιρέσατε την ετικέτα {label} από την καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has removed the tag {label} from card {card} in list {stack} on board {board}" : "Ο/η {user} αφαίρεσε την ετικέτα {label} της καρτέλας {card} της λίστας {stack} του πίνακα {board} ",
|
||||
"You have assigned {assigneduser} to card {card} on board {board}" : "Έχετε ορίσει τον {assigneduser} στην καρτέλα {card} στον πίνακα {board}",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "Ο {user} έχει ορισθεί {assigneduser} στην καρτέλα {card} του πίνακα {board}",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Έχετε αφαιρεθεί {assigneduser} από την καρτέλα {card} του πίνακα {board}",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "Ο {user} έχει αφαιρεθεί {assigneduser} από την καρτέλα {card} του πίνακα {board}",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "Ο/η {user} έχει ορισθεί {assigneduser} στην καρτέλα {card} του πίνακα {board}",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Έχετε αφαιρέσει {assigneduser} από την καρτέλα {card} του πίνακα {board}",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "Ο/η {user} έχει αφαιρεθεί {assigneduser} από την καρτέλα {card} του πίνακα {board}",
|
||||
"You have moved the card {card} from list {stackBefore} to {stack}" : "Μετακινήσατε την καρτέλα {card} από την λίστα {stackBefore} στη {stack}",
|
||||
"{user} has moved the card {card} from list {stackBefore} to {stack}" : "Ο {user} μετακίνησε την καρτέλα {card} από την λίστα {stackBefore} στην {stack}",
|
||||
"{user} has moved the card {card} from list {stackBefore} to {stack}" : "Ο/η {user} μετακίνησε την καρτέλα {card} από την λίστα {stackBefore} στην {stack}",
|
||||
"You have added the attachment {attachment} to card {card}" : "Προσθέσατε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "Ο {user} πρόσθεσε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "Ο/η {user} πρόσθεσε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"You have updated the attachment {attachment} on card {card}" : "Ενημερώσατε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"{user} has updated the attachment {attachment} on card {card}" : "Ο {user} ενημέρωσε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"{user} has updated the attachment {attachment} on card {card}" : "Ο/η {user} ενημέρωσε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"You have deleted the attachment {attachment} from card {card}" : "Διαγράψατε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"{user} has deleted the attachment {attachment} from card {card}" : "Ο {user} διέγραψε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"{user} has deleted the attachment {attachment} from card {card}" : "Ο/η {user} διέγραψε το συνημμένο {attachment} της καρτέλας {card}",
|
||||
"You have restored the attachment {attachment} to card {card}" : "Επαναφέρατε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "Ο {user} επανέφερε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "Ο/η {user} επανέφερε το συνημμένο {attachment} στην καρτέλα {card}",
|
||||
"You have commented on card {card}" : "Σχολιάσατε την καρτέλα {card}",
|
||||
"{user} has commented on card {card}" : "Ο {user} σχολίασε την καρτέλα {card}",
|
||||
"{user} has commented on card {card}" : "Ο/η {user} σχολίασε την καρτέλα {card}",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "Η <strong>περιγραφή καρτέλας </strong>στην εφαρμογή Deck άλλαξε",
|
||||
"Deck" : "Deck",
|
||||
"Changes in the <strong>Deck app</strong>" : "Αλλαγές στην <strong>εφαρμογή Deck</strong>",
|
||||
"A <strong>comment</strong> was created on a card" : "Ένα <strong>σχόλιο</strong> δημιουργήθηκε σε μια καρτέλα",
|
||||
"Upcoming cards" : "Επερχόμενες κάρτες",
|
||||
"Upcoming cards" : "Επερχόμενες καρτέλες",
|
||||
"Personal" : "Προσωπικά",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Η καρτέλα \"%s\" του \"%s\" ανατέθηκε σε εσάς από τον %s.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Η κάρτα \"1%s\" στο \"1%s\" έχει λήξει.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s σας ανέφερε σε σχόλιο στο \"%s\".",
|
||||
"The board \"%s\" has been shared with you by %s." : "Ο πίνακας \"%s\" είναι σε κοινή χρήση μαζί σας %s.",
|
||||
"{user} has assigned the card {deck-card} on {deck-board} to you." : "Ο/Η {user} έχει αναθέσει την καρτέλα {deck-card} του πίνακα {deck-board} σε εσάς.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Η καρτέλα \"%s\" στο \"%s\" έχει λήξει.",
|
||||
"The card {deck-card} on {deck-board} has reached its due date." : "Η καρτέλα {deck-card} στο {deck-board} έχει λήξει.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "Ο/η%s σας ανέφερε σε σχόλιο στο \"%s\".",
|
||||
"{user} has mentioned you in a comment on {deck-card}." : "Ο/Η {user} σας ανέφερε σε ένα σχόλιο στο {deck-card}.",
|
||||
"The board \"%s\" has been shared with you by %s." : "Ο πίνακας \"%s\" είναι σε κοινή χρήση μαζί σας από %s.",
|
||||
"{user} has shared {deck-board} with you." : "Ο/Η διαμοιράστηκε μαζί σας το {deck-board}",
|
||||
"Card comments" : "Σχόλια καρτέλας",
|
||||
"%s on %s" : "%s στο %s",
|
||||
"No data was provided to create an attachment." : "Δεν δόθηκαν στοιχεία για δημιουργία συνημμένου.",
|
||||
"Finished" : "Ολοκληρώθηκε",
|
||||
"To review" : "Προς επισκόπηση",
|
||||
"Action needed" : "Απαιτείται ενέργεια",
|
||||
"Later" : "Αργότερα",
|
||||
"copy" : "Αντιγραφή",
|
||||
"To do" : "Να κάνω",
|
||||
"To do" : "Προς Ενέργεια",
|
||||
"Doing" : "Σε εξέλιξη",
|
||||
"Done" : "Ολοκληρώθηκε",
|
||||
"Example Task 3" : "Παράδειγμα Εργασίας 3",
|
||||
"Example Task 2" : "Παράδειγμα Εργασίας 2",
|
||||
"Example Task 1" : "Παράδειγμα Εργασίας 1",
|
||||
"The file was uploaded" : "Το αρχείο μεταφορτώθηκε",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Το μεταφορτωμένο αρχείο υπερβαίνει την οδηγία upload_max_filesize στο php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Το μεταφορτωμένο αρχείο υπερβαίνει την οδηγία MAX_FILE_SIZE που καθορίστηκε στην φόρμα HTML.",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Το αρχείο που εστάλη υπερβαίνει την οδηγία μέγιστου επιτρεπτού μεγέθους \"upload_max_filesize\" του php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Το ανεβασμένο αρχείο υπερβαίνει το MAX_FILE_SIZE που ορίζεται στην HTML φόρμα",
|
||||
"The file was only partially uploaded" : "Το αρχείο μεταφορτώθηκε εν μέρει",
|
||||
"No file was uploaded" : "Δεν μεταφορτώθηκε κάποιο αρχείο",
|
||||
"Missing a temporary folder" : "Λείπει κάποιος προσωρινός φάκελος",
|
||||
"Could not write file to disk" : "Αδυναμία εγγραφής αρχείου στον δίσκο",
|
||||
"A PHP extension stopped the file upload" : "Ένα πρόσθετο PHP διέκοψε την μεταφόρτωση του αρχείου",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Δεν μεταφορτώθηκε αρχείο ή το μέγεθος αρχείου υπερβαίνει το μέγιστο %s",
|
||||
"Card not found" : "Η κάρτα δεν βρέθηκε",
|
||||
"Path is already shared with this card" : "Η διαδρομή κοινοποιείται ήδη σε αυτήν την κάρτα",
|
||||
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Αυτό το σχόλιο έχει περισσότερους από %s χαρακτήρες.\nΠροστέθηκε ως συνημμένο στην καρτέλα με όνομα %s .\nΠροσβάσιμο στη διεύθυνση URL: %s.",
|
||||
"Card not found" : "Η καρτέλα δεν βρέθηκε",
|
||||
"Path is already shared with this card" : "Η διαδρομή κοινοποιείται ήδη σε αυτήν την καρτέλα",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Μη έγκυρη ημερομηνία, η μορφή ημερομηνίας πρέπει να είναι ΕΕΕΕ-ΜΜ-ΗΗ",
|
||||
"Personal planning and team project organization" : "Προσωπικός σχεδιασμός και ομαδική οργάνωση",
|
||||
"Personal planning and team project organization" : "Προσωπικός σχεδιασμός και οργάνωση ομαδικών έργων",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Το Deck είναι ένα εργαλείο οργάνωσης τύπου kanban με στόχο τον προσωπικό προγραμματισμό και την οργάνωση έργων για ομάδες που έχουν ενσωματωθεί στο Nextcloud.\n\n\n- 📥 Προσθέστε τις εργασίες σας στις καρτέλες και βάλτε τες στη σειρά\n- 📄 Γράψτε τις πρόσθετες σημειώσεις\n- 🔖 Αντιστοιχίστε τις ετικέτες για ακόμη καλύτερη οργάνωση\n- 👥 Μοιραστείτε με την ομάδα, φίλους ή την οικογένειά σας\n- 📎 Επισυνάψτε αρχεία και ενσωματώστε τα στην περιγραφή\n- 💬 Συζητήστε με την ομάδα σας χρησιμοποιώντας σχόλια\n- ⚡ Παρακολουθήστε τις αλλαγές στη ροή δραστηριοτήτων\n- 🚀 Έχετε τα όλα οργανωμένα",
|
||||
"Card details" : "Λεπτομέρειες καρτέλας",
|
||||
"Add board" : "Προσθήκη πίνακα",
|
||||
"Select the board to link to a project" : "Επιλέξτε πίνακα και συνδέστε τον σε έργο",
|
||||
"Select the board to link to a project" : "Επιλέξτε πίνακα και συνδέστε τον σε ένα έργο",
|
||||
"Search by board title" : "Αναζήτηση με το όνομα πίνακα",
|
||||
"Select board" : "Επιλογή πίνακα",
|
||||
"Create a new card" : "Δημιουργία νέας κάρτας",
|
||||
"Create a new card" : "Δημιουργία νέας καρτέλας",
|
||||
"Select a board" : "Επιλογή ενός πίνακα",
|
||||
"Select a list" : "Επιλέξτε μια λίστα",
|
||||
"Card title" : "Τίτλος κάρτας",
|
||||
"Card title" : "Τίτλος καρτέλας",
|
||||
"Cancel" : "Aκύρωση",
|
||||
"Open card" : "Άνοιγμα κάρτας",
|
||||
"Creating the new card …" : "Γίνεται δημιουργία της νέας καρτέλας...",
|
||||
"Card \"{card}\" was added to \"{board}\"" : "Η καρτέλα \"{card}\" προστέθηκε στο \"{board}\"",
|
||||
"Open card" : "Άνοιγμα καρτέλας",
|
||||
"Close" : "Κλείσιμο",
|
||||
"Create card" : "Δημιουργία κάρτας",
|
||||
"Select a card" : "Επίλογή μιας καρτέλας",
|
||||
"Create card" : "Δημιουργία καρτέλας",
|
||||
"Select a card" : "Επιλογή μιας καρτέλας",
|
||||
"Select the card to link to a project" : "Επιλογή καρτέλας για σύνδεση στο έργο",
|
||||
"Link to card" : "Σύνδεσμος σε καρτέλα",
|
||||
"File already exists" : "Το αρχείο υπάρχει ήδη",
|
||||
"A file with the name {filename} already exists." : "Το αρχείο με όνομα {filename} υπάρχει ήδη.",
|
||||
"Do you want to overwrite it?" : "Επιθυμείτε να γίνει αντικατάσταση του?",
|
||||
"Overwrite file" : "Αντικατάσταση αρχείου",
|
||||
"Keep existing file" : "Διατήρηση υπάρχων αρχείου",
|
||||
"Keep existing file" : "Διατήρηση υπάρχοντος αρχείου",
|
||||
"This board is read only" : "Ο πίνακας είναι μόνο για ανάγνωση",
|
||||
"Drop your files to upload" : "Αποθέστε τα αρχεία σας για ανέβασμα",
|
||||
"Add card" : "Προσθήκη κάρτας",
|
||||
"Archived cards" : "Αρχειοθετημένες κάρτες",
|
||||
"Add card" : "Προσθήκη καρτέλας",
|
||||
"Archived cards" : "Αρχειοθετημένες καρτέλες",
|
||||
"Add list" : "Προσθήκη λίστας",
|
||||
"List name" : "Λίστα ονομάτων",
|
||||
"List name" : "Όνομα λίστας",
|
||||
"Apply filter" : "Εφαρμογή φίλτρου",
|
||||
"Filter by tag" : "Φίλτρο ανά ετικέτα",
|
||||
"Filter by assigned user" : "Φίλτρο ανά χρήστη",
|
||||
"Unassigned" : "Χωρίς ανάθεση",
|
||||
"Filter by due date" : "Φίλτρο ανά ημερομηνία λήξης",
|
||||
"Overdue" : "Εκπρόθεσμος",
|
||||
"Overdue" : "Εκπρόθεσμες",
|
||||
"Next 24 hours" : "Επόμενες 24 ώρες",
|
||||
"Next 7 days" : "Επόμενες 7 ημέρες",
|
||||
"Next 30 days" : "Επόμενες 30 ημέρες",
|
||||
@@ -145,7 +155,7 @@
|
||||
"Sharing" : "Διαμοιρασμός",
|
||||
"Tags" : "Ετικέτες",
|
||||
"Deleted items" : "Διαγραμμένα αντικείμενα",
|
||||
"Timeline" : "Χρονοδιάγραμμα",
|
||||
"Timeline" : "Χρονολόγιο",
|
||||
"Deleted lists" : "Διαγραμμένες λίστες",
|
||||
"Undo" : "Αναίρεση",
|
||||
"Deleted cards" : "Διαγραμμένες καρτέλες",
|
||||
@@ -158,14 +168,17 @@
|
||||
"Can edit" : "Μπορεί να επεξεργαστεί",
|
||||
"Can share" : "Μπορεί να διαμοιράσει",
|
||||
"Can manage" : "Μπορεί να διαχειριστεί",
|
||||
"Owner" : "Κάτοχος",
|
||||
"Delete" : "Διαγραφή",
|
||||
"Failed to create share with {displayName}" : "Αποτυχία δημιουργίας κοινής χρήσης με το {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Είστε σίγουροι ότι θέλετε να μεταφέρετε τον πίνακα {title} για {user}? ",
|
||||
"Transfer" : "Μεταφορά",
|
||||
"Add a new list" : "Προσθήκη νέας λίστας",
|
||||
"Archive all cards" : "Αρχειοθέτηση όλων των καρτελών.",
|
||||
"Delete list" : "Διαγραφή λίστας",
|
||||
"Archive all cards in this list" : "Αρχειοθέτηση όλων των καρτελών σε αυτή τη λίστα.",
|
||||
"Add a new card" : "Προσθήκη νέας καρτέλας",
|
||||
"Card name" : "Όνομα κάρτας",
|
||||
"Card name" : "Όνομα καρτέλας",
|
||||
"List deleted" : "Η λίστα διαγράφηκε",
|
||||
"Edit" : "Επεξεργασία",
|
||||
"Add a new tag" : "Προσθήκη νέας ετικέτας",
|
||||
@@ -173,14 +186,17 @@
|
||||
"Board name" : "Όνομα πίνακα",
|
||||
"Members" : "Μέλη",
|
||||
"Upload new files" : "Ανεβάστε νέα αρχεία",
|
||||
"Share from Files" : "Κοινή χρήση από αρχεία",
|
||||
"Share from Files" : "Κοινή χρήση από Αρχεία",
|
||||
"Pending share" : "Κοινή χρήση σε εκκρεμότητα",
|
||||
"Add this attachment" : "Προσθήκη αυτού του συνημμένου",
|
||||
"Show in Files" : "Εμφάνιση σε αρχεία",
|
||||
"Delete Attachment" : "Διαγραφή Συνημμένου",
|
||||
"Restore Attachment" : "Επαναφορά Συνημμένου",
|
||||
"Show in Files" : "Εμφάνιση σε Αρχεία",
|
||||
"Download" : "Λήψη",
|
||||
"Remove attachment" : "Αφαίρεση συνημμένου",
|
||||
"Delete Attachment" : "Διαγραφή συνημμένου",
|
||||
"Restore Attachment" : "Επαναφορά συνημμένου",
|
||||
"File to share" : "Αρχείο για κοινή χρήση",
|
||||
"Invalid path selected" : "Επιλέχθηκε μη έγκυρη διαδρομή",
|
||||
"Open in sidebar view" : "Άνοιγμα σε προβολή πλευρικής γραμμής",
|
||||
"Open in sidebar view" : "Άνοιγμα σε προβολή πλευρικής στήλης",
|
||||
"Open in bigger view" : "Άνοιγμα σε μεγαλύτερη προβολή",
|
||||
"Attachments" : "Συνημμένα",
|
||||
"Comments" : "Σχόλια",
|
||||
@@ -188,20 +204,24 @@
|
||||
"Created" : "Δημιουργήθηκε",
|
||||
"The title cannot be empty." : "Ο τίτλος δεν μπορεί να είναι κενός.",
|
||||
"No comments yet. Begin the discussion!" : "Χωρίς σχόλια ακόμη. Ξεκινήστε την συζήτηση!",
|
||||
"Failed to load comments" : "Αποτυχία φόρτωσης σχολίων",
|
||||
"Assign a tag to this card…" : "Ορίστε μια ετικέτα σε αυτήν την καρτέλα...",
|
||||
"Assign to users" : "Αναθέστε στους χρήστες",
|
||||
"Assign to users" : "Ανάθεση σε χρήστες",
|
||||
"Assign to users/groups/circles" : "Ανάθεση σε χρήστες/ομάδες/κύκλους",
|
||||
"Assign a user to this card…" : "Αναθέστε χρήστη στην καρτέλα...",
|
||||
"Assign a user to this card…" : "Ανάθεση χρήστη στην καρτέλα...",
|
||||
"Due date" : "Ημερομηνία λήξης",
|
||||
"Set a due date" : "Καθορίστε ημερομηνίας λήξης",
|
||||
"Remove due date" : "Αφαίρεση ημερομηνίας λήξης",
|
||||
"Select Date" : "Επέλεξε Ημέρα",
|
||||
"Select Date" : "Επιλέξτε ημερομηνία",
|
||||
"Today" : "Σήμερα",
|
||||
"Tomorrow" : "Αύριο",
|
||||
"Next week" : "Επόμενη εβδομάδα",
|
||||
"Next month" : "Επόμενος μήνας",
|
||||
"Save" : "Αποθήκευση",
|
||||
"The comment cannot be empty." : "Το σχόλιο δεν μπορεί να είναι κενό.",
|
||||
"The comment cannot be longer than 1000 characters." : "Το σχόλιο δεν μπορεί να έχι περισσότερους από 1000 χαρακτήρες.",
|
||||
"In reply to" : "Ως απάντηση σε",
|
||||
"In reply to" : "Σε απάντηση σε",
|
||||
"Cancel reply" : "Ακύρωση απάντησης",
|
||||
"Reply" : "Απάντηση",
|
||||
"Update" : "Ενημέρωση",
|
||||
"Description" : "Περιγραφή",
|
||||
@@ -214,21 +234,23 @@
|
||||
"Write a description …" : "Γράψτε μια περιγραφή…",
|
||||
"Choose attachment" : "Επιλογή συνημμένου",
|
||||
"(group)" : "(ομάδα)",
|
||||
"{count} comments, {unread} unread" : "{count} σχόλια, {unread} μη αναγνωσμένα",
|
||||
"Assign to me" : "Ανάθεση σε εμένα",
|
||||
"Unassign myself" : "Αποδέσμευσή μου",
|
||||
"Move card" : "Μετακίνηση κάρτας",
|
||||
"Unarchive card" : "Αναίρεση αρχειοθέτησης κάρτας",
|
||||
"Archive card" : "Αρχειοθέτηση κάρτας",
|
||||
"Delete card" : "Διαγραφή κάρτας",
|
||||
"Move card" : "Μετακίνηση καρτέλας",
|
||||
"Unarchive card" : "Αναίρεση αρχειοθέτησης καρτέλας",
|
||||
"Archive card" : "Αρχειοθέτηση καρτέλας",
|
||||
"Delete card" : "Διαγραφή καρτέλας",
|
||||
"Move card to another board" : "Μετακίνηση καρτέλας σε άλλο πίνακα",
|
||||
"Card deleted" : "Η κάρτα διαγράφηκε",
|
||||
"List is empty" : "Η λίστα είναι άδεια.",
|
||||
"Card deleted" : "Η καρτέλα διαγράφηκε",
|
||||
"seconds ago" : " δευτερόλεπτα πριν ",
|
||||
"All boards" : "Όλοι οι πίνακες",
|
||||
"Archived boards" : "Αρχειοθέτηση πινάκων ",
|
||||
"Shared with you" : "Διαμοιρασμένα μαζί σας",
|
||||
"Use bigger card view" : "Χρησιμοποιήστε μεγαλύτερη προβολή κάρτας",
|
||||
"Use bigger card view" : "Χρησιμοποιήστε μεγαλύτερη προβολή καρτέλας",
|
||||
"Show boards in calendar/tasks" : "Εμφάνιση πινάκων στο ημερολόγιο / εργασίες",
|
||||
"Limit deck usage of groups" : "Περιορίστε τη χρήση της εφαρμογής σε ομάδες",
|
||||
"Limit deck usage of groups" : "Περιορίστε τη χρήση της εφαρμογής deck σε ομάδες",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ο περιορισμός του Deck θα εμποδίσει τους χρήστες που δεν είναι μέρος αυτών των ομάδων να δημιουργούν δικούς τους πίνακες. Οι χρήστες θα εξακολουθήσουν να εργάζονται σε πίνακες που έχουν διαμοιραστεί μαζί τους.",
|
||||
"Board details" : "Λεπτομέριες πίνακα",
|
||||
"Edit board" : "Επεξεργασία πίνακα",
|
||||
@@ -238,31 +260,37 @@
|
||||
"Turn on due date reminders" : "Ενεργοποιήστε τις υπενθυμίσεις ημερομηνίας προθεσμίας",
|
||||
"Turn off due date reminders" : "Απενεργοποιήστε τις υπενθυμίσεις ημερομηνίας προθεσμίας",
|
||||
"Due date reminders" : "Υπενθυμίσεις ημερομηνίας προθεσμίας",
|
||||
"All cards" : "Όλες οι κάρτες",
|
||||
"Assigned cards" : "Ανατεθείς κάρτες",
|
||||
"All cards" : "Όλες οι καρτέλες",
|
||||
"Assigned cards" : "Ανατεθειμένες καρτέλες",
|
||||
"No notifications" : "Δεν υπάρχουν ειδοποιήσεις",
|
||||
"Delete board" : "Διαγραφή πίνακα",
|
||||
"Board {0} deleted" : "Διαγράφηκε {0} πίνακας",
|
||||
"Only assigned cards" : "Μόνο κάρτες που έχουν ανατεθεί",
|
||||
"Board {0} deleted" : "Διαγράφηκε {0} πίνακας ",
|
||||
"Only assigned cards" : "Μόνο καρτέλες που έχουν ανατεθεί",
|
||||
"No reminder" : "Δεν υπάρχει υπενθύμιση",
|
||||
"An error occurred" : "Παρουσιάστηκε σφάλμα",
|
||||
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Είστε βέβαιοι ότι θέλετε να διαγράψετε τον πίνακα {title}; Θα διαγραφούν όλα τα δεδομένα.",
|
||||
"Delete the board?" : "Διαγραφή πίνακα;",
|
||||
"Delete the board?" : "Διαγραφή του πίνακα;",
|
||||
"Loading filtered view" : "Φόρτωση εμφάνισης με βάση το φίλτρο",
|
||||
"This week" : "Αυτή την εβδομάδα",
|
||||
"No due" : "Χωρίς λήξη",
|
||||
"No upcoming cards" : "Δεν υπάρχουν επερχόμενες κάρτες",
|
||||
"upcoming cards" : "Επερχόμενες κάρτες",
|
||||
"Search for {searchQuery} in all boards" : "Αναζήτηση για {searchQuery} σε όλους τους πίνακες",
|
||||
"No results found" : "Δεν βρέθηκαν αποτελέσματα",
|
||||
"No upcoming cards" : "Δεν υπάρχουν επερχόμενες καρτέλες",
|
||||
"upcoming cards" : "επερχόμενες καρτέλες",
|
||||
"Link to a board" : "Σύνδεσμος στον πίνακα",
|
||||
"Link to a card" : "Σύνδεσμος σε καρτέλα",
|
||||
"Create a card" : "Δημιουργία κάρτας",
|
||||
"Create a card" : "Δημιουργία καρτέλας",
|
||||
"Message from {author} in {conversationName}" : "Μήνυμα από {author} σε {conversationName}",
|
||||
"Something went wrong" : "Κάτι πήγε στραβά",
|
||||
"Failed to upload {name}" : "Αποτυχία μεταφόρτωσης {όνομα}",
|
||||
"Failed to upload {name}" : "Αποτυχία μεταφόρτωσης {name}",
|
||||
"Maximum file size of {size} exceeded" : "Υπέρβαση επιτρεπόμενου μεγέθους αρχείου {size}",
|
||||
"Error creating the share" : "Σφάλμα κατά τη δημιουργία της κοινοποίησης",
|
||||
"Share with a Deck card" : "Μοιραστείτε με μια κάρτα Deck",
|
||||
"Share {file} with a Deck card" : "Μοιραστείτε {αρχείο} με μια κάρτα Deck",
|
||||
"Share with a Deck card" : "Μοιραστείτε με μια καρτέλα Deck",
|
||||
"Share {file} with a Deck card" : "Μοιραστείτε το {file} με μια καρτέλα Deck",
|
||||
"Share" : "Μοιραστείτε",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Το Deck είναι ένα εργαλείο οργάνωσης τύπου kanban με στόχο τον προσωπικό προγραμματισμό και την ομαδική οργάνωση για ομάδες που έχουν ενσωματωθεί στο Nextcloud.\n\n\n- 📥 Προσθέστε τις εργασίες σας στις καρτέλες και βάλτε τες στη σειρά\n- 📄 Γράψτε τις πρόσθετες σημειώσεις\n- 🔖 Αντιστοιχίστε τις ετικέτες για ακόμη καλύτερη οργάνωση\n- 👥 Μοιραστείτε με την ομάδα, φίλους ή την οικογένειά σας\n- 📎 Συνδέστε αρχεία και ενσωματώστε τα στην περιγραφή\n- 💬 Συζητήστε με την ομάδα σας χρησιμοποιώντας σχόλια\n- ⚡ Παρακολουθήστε τις αλλαγές στη ροή δραστηριοτήτων\n- 🚀 Έχετε τα όλα οργανωμένα"
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Το Deck είναι ένα εργαλείο οργάνωσης τύπου kanban με στόχο τον προσωπικό προγραμματισμό και την οργάνωση έργων για ομάδες που έχουν ενσωματωθεί στο Nextcloud.\n\n\n- 📥 Προσθέστε τις εργασίες σας στις καρτέλες και βάλτε τες στη σειρά\n- 📄 Γράψτε τις πρόσθετες σημειώσεις\n- 🔖 Αντιστοιχίστε τις ετικέτες για ακόμη καλύτερη οργάνωση\n- 👥 Μοιραστείτε με την ομάδα, φίλους ή την οικογένειά σας\n- 📎 Συνδέστε αρχεία και ενσωματώστε τα στην περιγραφή\n- 💬 Συζητήστε με την ομάδα σας χρησιμοποιώντας σχόλια\n- ⚡ Παρακολουθήστε τις αλλαγές στη ροή δραστηριοτήτων\n- 🚀 Έχετε τα όλα οργανωμένα",
|
||||
"Creating the new card…" : "Δημιουργία νέας καρτέλας...",
|
||||
"\"{card}\" was added to \"{board}\"" : "\"{card}\" προστέθηκε στο \"{board}\"",
|
||||
"(circle)" : "(κύκλος)"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -239,6 +239,7 @@ OC.L10N.register(
|
||||
"Archive card" : "Archivar tarjeta",
|
||||
"Delete card" : "Eliminar tarjeta",
|
||||
"Move card to another board" : "Mover la tarjeta a otro tablero",
|
||||
"List is empty" : "La lista está vacía",
|
||||
"Card deleted" : "Tarjeta borrada",
|
||||
"seconds ago" : "hace unos segundos",
|
||||
"All boards" : "Todos los tableros",
|
||||
|
||||
@@ -237,6 +237,7 @@
|
||||
"Archive card" : "Archivar tarjeta",
|
||||
"Delete card" : "Eliminar tarjeta",
|
||||
"Move card to another board" : "Mover la tarjeta a otro tablero",
|
||||
"List is empty" : "La lista está vacía",
|
||||
"Card deleted" : "Tarjeta borrada",
|
||||
"seconds ago" : "hace unos segundos",
|
||||
"All boards" : "Todos los tableros",
|
||||
|
||||
@@ -168,8 +168,10 @@ OC.L10N.register(
|
||||
"Can edit" : "Editatu dezake",
|
||||
"Can share" : "Partekatu dezake",
|
||||
"Can manage" : "Kudeatu dezake",
|
||||
"Owner" : "Jabea",
|
||||
"Delete" : "Ezabatu",
|
||||
"Failed to create share with {displayName}" : "Ezin izan da {displayName}-(r)ekin partekatzea sortu",
|
||||
"Transfer" : "Transferitu",
|
||||
"Add a new list" : "Gehitu zerrenda berria",
|
||||
"Archive all cards" : "Artxibatu txartel guztiak",
|
||||
"Delete list" : "Zerrenda ezabatu",
|
||||
|
||||
@@ -166,8 +166,10 @@
|
||||
"Can edit" : "Editatu dezake",
|
||||
"Can share" : "Partekatu dezake",
|
||||
"Can manage" : "Kudeatu dezake",
|
||||
"Owner" : "Jabea",
|
||||
"Delete" : "Ezabatu",
|
||||
"Failed to create share with {displayName}" : "Ezin izan da {displayName}-(r)ekin partekatzea sortu",
|
||||
"Transfer" : "Transferitu",
|
||||
"Add a new list" : "Gehitu zerrenda berria",
|
||||
"Archive all cards" : "Artxibatu txartel guztiak",
|
||||
"Delete list" : "Zerrenda ezabatu",
|
||||
|
||||
@@ -148,7 +148,9 @@ OC.L10N.register(
|
||||
"Can edit" : "Voi muokata",
|
||||
"Can share" : "Voi jakaa",
|
||||
"Can manage" : "Voi hallita",
|
||||
"Owner" : "Omistaja",
|
||||
"Delete" : "Poista",
|
||||
"Transfer" : "Siirrä",
|
||||
"Add a new list" : "Lisää uusi lista",
|
||||
"Archive all cards" : "Arkistoi kaikki kortit",
|
||||
"Delete list" : "Poista lista",
|
||||
@@ -163,6 +165,7 @@ OC.L10N.register(
|
||||
"Members" : "Jäsenet",
|
||||
"Upload new files" : "Lähetä uusia tiedostoja",
|
||||
"Add this attachment" : "Lisää tämä liite",
|
||||
"Download" : "Lataa",
|
||||
"Remove attachment" : "Poista liite",
|
||||
"Delete Attachment" : "Poista liite",
|
||||
"Restore Attachment" : "Palauta liite",
|
||||
@@ -188,6 +191,8 @@ OC.L10N.register(
|
||||
"Save" : "Tallenna",
|
||||
"The comment cannot be empty." : "Kommentti ei voi olla tyhjä.",
|
||||
"The comment cannot be longer than 1000 characters." : "Kommentin on oltava alle 1000 merkkiä pitkä.",
|
||||
"In reply to" : "Vastauksena",
|
||||
"Cancel reply" : "Peru vastaus",
|
||||
"Reply" : "Vastaa",
|
||||
"Update" : "Päivitä",
|
||||
"Description" : "Kuvaus",
|
||||
@@ -208,6 +213,7 @@ OC.L10N.register(
|
||||
"Archive card" : "Arkistoi kortti",
|
||||
"Delete card" : "Poista kortti",
|
||||
"Move card to another board" : "Siirrä kortti toiselle taululle",
|
||||
"List is empty" : "Lista on tyhjä",
|
||||
"Card deleted" : "Kortti poistettu",
|
||||
"seconds ago" : "sekuntia sitten",
|
||||
"All boards" : "Kaikki taulut",
|
||||
@@ -238,6 +244,7 @@ OC.L10N.register(
|
||||
"Maximum file size of {size} exceeded" : "Tiedoston enimmäiskoko {size} ylitetty",
|
||||
"Error creating the share" : "Virhe jakoa luotaessa",
|
||||
"Share" : "Jaa",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Pakka on Nextcloudissa työtään hallinnoivien tiimien käyttöön tarkoitettu kanban-tyyppinen organisointityökalu.\n\n\n- 📥 Lisää tehtävät korteille ja järjestele ne mielesi mukaan\n- 📄 Kirjoita lisätietoja markdown-kielellä\n- 🔖 Määritä tunnisteita helpottaaksesi hallintaa\n- 👥 Jaa tiimin, perheen tai kavereiden kanssa\n- 📎 Lisää tiedostoja ja upota ne lisätietoihin\n- 💬 Keskustele tiimisi kanssa kommenteilla\n- ⚡ Pidä kirjaa muutoksista tapahtumavirran avulla\n- 🚀 Pidä projektisi hallinnassa"
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Pakka on Nextcloudissa työtään hallinnoivien tiimien käyttöön tarkoitettu kanban-tyyppinen organisointityökalu.\n\n\n- 📥 Lisää tehtävät korteille ja järjestele ne mielesi mukaan\n- 📄 Kirjoita lisätietoja markdown-kielellä\n- 🔖 Määritä tunnisteita helpottaaksesi hallintaa\n- 👥 Jaa tiimin, perheen tai kavereiden kanssa\n- 📎 Lisää tiedostoja ja upota ne lisätietoihin\n- 💬 Keskustele tiimisi kanssa kommenteilla\n- ⚡ Pidä kirjaa muutoksista tapahtumavirran avulla\n- 🚀 Pidä projektisi hallinnassa",
|
||||
"(circle)" : "(piiri)"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -146,7 +146,9 @@
|
||||
"Can edit" : "Voi muokata",
|
||||
"Can share" : "Voi jakaa",
|
||||
"Can manage" : "Voi hallita",
|
||||
"Owner" : "Omistaja",
|
||||
"Delete" : "Poista",
|
||||
"Transfer" : "Siirrä",
|
||||
"Add a new list" : "Lisää uusi lista",
|
||||
"Archive all cards" : "Arkistoi kaikki kortit",
|
||||
"Delete list" : "Poista lista",
|
||||
@@ -161,6 +163,7 @@
|
||||
"Members" : "Jäsenet",
|
||||
"Upload new files" : "Lähetä uusia tiedostoja",
|
||||
"Add this attachment" : "Lisää tämä liite",
|
||||
"Download" : "Lataa",
|
||||
"Remove attachment" : "Poista liite",
|
||||
"Delete Attachment" : "Poista liite",
|
||||
"Restore Attachment" : "Palauta liite",
|
||||
@@ -186,6 +189,8 @@
|
||||
"Save" : "Tallenna",
|
||||
"The comment cannot be empty." : "Kommentti ei voi olla tyhjä.",
|
||||
"The comment cannot be longer than 1000 characters." : "Kommentin on oltava alle 1000 merkkiä pitkä.",
|
||||
"In reply to" : "Vastauksena",
|
||||
"Cancel reply" : "Peru vastaus",
|
||||
"Reply" : "Vastaa",
|
||||
"Update" : "Päivitä",
|
||||
"Description" : "Kuvaus",
|
||||
@@ -206,6 +211,7 @@
|
||||
"Archive card" : "Arkistoi kortti",
|
||||
"Delete card" : "Poista kortti",
|
||||
"Move card to another board" : "Siirrä kortti toiselle taululle",
|
||||
"List is empty" : "Lista on tyhjä",
|
||||
"Card deleted" : "Kortti poistettu",
|
||||
"seconds ago" : "sekuntia sitten",
|
||||
"All boards" : "Kaikki taulut",
|
||||
@@ -236,6 +242,7 @@
|
||||
"Maximum file size of {size} exceeded" : "Tiedoston enimmäiskoko {size} ylitetty",
|
||||
"Error creating the share" : "Virhe jakoa luotaessa",
|
||||
"Share" : "Jaa",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Pakka on Nextcloudissa työtään hallinnoivien tiimien käyttöön tarkoitettu kanban-tyyppinen organisointityökalu.\n\n\n- 📥 Lisää tehtävät korteille ja järjestele ne mielesi mukaan\n- 📄 Kirjoita lisätietoja markdown-kielellä\n- 🔖 Määritä tunnisteita helpottaaksesi hallintaa\n- 👥 Jaa tiimin, perheen tai kavereiden kanssa\n- 📎 Lisää tiedostoja ja upota ne lisätietoihin\n- 💬 Keskustele tiimisi kanssa kommenteilla\n- ⚡ Pidä kirjaa muutoksista tapahtumavirran avulla\n- 🚀 Pidä projektisi hallinnassa"
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Pakka on Nextcloudissa työtään hallinnoivien tiimien käyttöön tarkoitettu kanban-tyyppinen organisointityökalu.\n\n\n- 📥 Lisää tehtävät korteille ja järjestele ne mielesi mukaan\n- 📄 Kirjoita lisätietoja markdown-kielellä\n- 🔖 Määritä tunnisteita helpottaaksesi hallintaa\n- 👥 Jaa tiimin, perheen tai kavereiden kanssa\n- 📎 Lisää tiedostoja ja upota ne lisätietoihin\n- 💬 Keskustele tiimisi kanssa kommenteilla\n- ⚡ Pidä kirjaa muutoksista tapahtumavirran avulla\n- 🚀 Pidä projektisi hallinnassa",
|
||||
"(circle)" : "(piiri)"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -292,4 +292,4 @@ OC.L10N.register(
|
||||
"\"{card}\" was added to \"{board}\"" : "La carte \"{card}\" a été ajoutée au tableau \"{board}\"",
|
||||
"(circle)" : "(cercle)"
|
||||
},
|
||||
"nplurals=2; plural=(n > 1);");
|
||||
"nplurals=3; plural=(n==0 || n==1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
|
||||
@@ -289,5 +289,5 @@
|
||||
"Creating the new card…" : "Création de la nouvelle carte…",
|
||||
"\"{card}\" was added to \"{board}\"" : "La carte \"{card}\" a été ajoutée au tableau \"{board}\"",
|
||||
"(circle)" : "(cercle)"
|
||||
},"pluralForm" :"nplurals=2; plural=(n > 1);"
|
||||
},"pluralForm" :"nplurals=3; plural=(n==0 || n==1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -170,8 +170,14 @@ OC.L10N.register(
|
||||
"Can edit" : "Szerkesztheti",
|
||||
"Can share" : "Megoszthatja",
|
||||
"Can manage" : "Kezelheti",
|
||||
"Owner" : "Tulajdonos",
|
||||
"Delete" : "Törlés",
|
||||
"Failed to create share with {displayName}" : "Nem lehet létrehozni a következő megosztást: {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Biztos, hogy átadja a(z) {board} tábla tulajdonjogát {user} számára?",
|
||||
"Transfer the board." : "A tábla átadása.",
|
||||
"Transfer" : "Átadás",
|
||||
"Transfer the board for {user} successfully" : "A tábla átadása {user} számára sikeres",
|
||||
"Failed to transfer the board for {user}" : "A tábla átadása {user} számára sikertelen",
|
||||
"Add a new list" : "Új lista hozzáadása",
|
||||
"Archive all cards" : "Az összes kártya archiválása",
|
||||
"Delete list" : "Lista törlése",
|
||||
|
||||
@@ -168,8 +168,14 @@
|
||||
"Can edit" : "Szerkesztheti",
|
||||
"Can share" : "Megoszthatja",
|
||||
"Can manage" : "Kezelheti",
|
||||
"Owner" : "Tulajdonos",
|
||||
"Delete" : "Törlés",
|
||||
"Failed to create share with {displayName}" : "Nem lehet létrehozni a következő megosztást: {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Biztos, hogy átadja a(z) {board} tábla tulajdonjogát {user} számára?",
|
||||
"Transfer the board." : "A tábla átadása.",
|
||||
"Transfer" : "Átadás",
|
||||
"Transfer the board for {user} successfully" : "A tábla átadása {user} számára sikeres",
|
||||
"Failed to transfer the board for {user}" : "A tábla átadása {user} számára sikertelen",
|
||||
"Add a new list" : "Új lista hozzáadása",
|
||||
"Archive all cards" : "Az összes kártya archiválása",
|
||||
"Delete list" : "Lista törlése",
|
||||
|
||||
@@ -170,8 +170,14 @@ OC.L10N.register(
|
||||
"Can edit" : "Może edytować",
|
||||
"Can share" : "Może udostępnić",
|
||||
"Can manage" : "Może zarządzać",
|
||||
"Owner" : "Właściciel",
|
||||
"Delete" : "Usuń",
|
||||
"Failed to create share with {displayName}" : "Nie udało się utworzyć udostępnienia dla {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Czy na pewno chcesz przenieść tablicę {title} dla {user}?",
|
||||
"Transfer the board." : "Przeniesienie tablicy.",
|
||||
"Transfer" : "Przenieś",
|
||||
"Transfer the board for {user} successfully" : "Przeniesienie tablicy dla {user} pomyślne",
|
||||
"Failed to transfer the board for {user}" : "Nie udało się przenieść tablicy dla {user}",
|
||||
"Add a new list" : "Dodaj nową listę",
|
||||
"Archive all cards" : "Zarchiwizuj wszystkie karty",
|
||||
"Delete list" : "Usuń listę",
|
||||
|
||||
@@ -168,8 +168,14 @@
|
||||
"Can edit" : "Może edytować",
|
||||
"Can share" : "Może udostępnić",
|
||||
"Can manage" : "Może zarządzać",
|
||||
"Owner" : "Właściciel",
|
||||
"Delete" : "Usuń",
|
||||
"Failed to create share with {displayName}" : "Nie udało się utworzyć udostępnienia dla {displayName}",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "Czy na pewno chcesz przenieść tablicę {title} dla {user}?",
|
||||
"Transfer the board." : "Przeniesienie tablicy.",
|
||||
"Transfer" : "Przenieś",
|
||||
"Transfer the board for {user} successfully" : "Przeniesienie tablicy dla {user} pomyślne",
|
||||
"Failed to transfer the board for {user}" : "Nie udało się przenieść tablicy dla {user}",
|
||||
"Add a new list" : "Dodaj nową listę",
|
||||
"Archive all cards" : "Zarchiwizuj wszystkie karty",
|
||||
"Delete list" : "Usuń listę",
|
||||
|
||||
@@ -170,8 +170,14 @@ OC.L10N.register(
|
||||
"Can edit" : "Düzenleyebilir",
|
||||
"Can share" : "Paylaşabilir",
|
||||
"Can manage" : "Yönetebilir",
|
||||
"Owner" : "Sahibi",
|
||||
"Delete" : "Sil",
|
||||
"Failed to create share with {displayName}" : "{displayName} ile paylaşılamadı",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "{title} panosunu {user} kullanıcısına aktarmak istediğinize emin misiniz?",
|
||||
"Transfer the board." : "Panoyu aktar.",
|
||||
"Transfer" : "Aktar",
|
||||
"Transfer the board for {user} successfully" : "Pano {user} kullanıcısına aktarıldı",
|
||||
"Failed to transfer the board for {user}" : "Pano {user} kullanıcısına aktarılamadı",
|
||||
"Add a new list" : "Yeni liste ekle",
|
||||
"Archive all cards" : "Tüm kartları arşivle",
|
||||
"Delete list" : "Listeyi sil",
|
||||
|
||||
@@ -168,8 +168,14 @@
|
||||
"Can edit" : "Düzenleyebilir",
|
||||
"Can share" : "Paylaşabilir",
|
||||
"Can manage" : "Yönetebilir",
|
||||
"Owner" : "Sahibi",
|
||||
"Delete" : "Sil",
|
||||
"Failed to create share with {displayName}" : "{displayName} ile paylaşılamadı",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "{title} panosunu {user} kullanıcısına aktarmak istediğinize emin misiniz?",
|
||||
"Transfer the board." : "Panoyu aktar.",
|
||||
"Transfer" : "Aktar",
|
||||
"Transfer the board for {user} successfully" : "Pano {user} kullanıcısına aktarıldı",
|
||||
"Failed to transfer the board for {user}" : "Pano {user} kullanıcısına aktarılamadı",
|
||||
"Add a new list" : "Yeni liste ekle",
|
||||
"Archive all cards" : "Tüm kartları arşivle",
|
||||
"Delete list" : "Listeyi sil",
|
||||
|
||||
@@ -170,8 +170,14 @@ OC.L10N.register(
|
||||
"Can edit" : "可以編輯",
|
||||
"Can share" : "可以分享",
|
||||
"Can manage" : "可以管理",
|
||||
"Owner" : "所有者",
|
||||
"Delete" : "刪除",
|
||||
"Failed to create share with {displayName}" : "無法為 {displayName} 創建分享",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "您想要轉移 {user} 的面板 {title} 嗎?",
|
||||
"Transfer the board." : "轉移面板。",
|
||||
"Transfer" : "轉移",
|
||||
"Transfer the board for {user} successfully" : "轉移 {user} 的面板成功",
|
||||
"Failed to transfer the board for {user}" : "轉移 {user} 的面板失敗",
|
||||
"Add a new list" : "添加一張新清單",
|
||||
"Archive all cards" : "封存所有卡片",
|
||||
"Delete list" : "刪除清單",
|
||||
|
||||
@@ -168,8 +168,14 @@
|
||||
"Can edit" : "可以編輯",
|
||||
"Can share" : "可以分享",
|
||||
"Can manage" : "可以管理",
|
||||
"Owner" : "所有者",
|
||||
"Delete" : "刪除",
|
||||
"Failed to create share with {displayName}" : "無法為 {displayName} 創建分享",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "您想要轉移 {user} 的面板 {title} 嗎?",
|
||||
"Transfer the board." : "轉移面板。",
|
||||
"Transfer" : "轉移",
|
||||
"Transfer the board for {user} successfully" : "轉移 {user} 的面板成功",
|
||||
"Failed to transfer the board for {user}" : "轉移 {user} 的面板失敗",
|
||||
"Add a new list" : "添加一張新清單",
|
||||
"Archive all cards" : "封存所有卡片",
|
||||
"Delete list" : "刪除清單",
|
||||
|
||||
@@ -170,8 +170,14 @@ OC.L10N.register(
|
||||
"Can edit" : "可以編輯",
|
||||
"Can share" : "可以分享",
|
||||
"Can manage" : "可以管理",
|
||||
"Owner" : "擁有者",
|
||||
"Delete" : "刪除",
|
||||
"Failed to create share with {displayName}" : "無法建立與 {displayName} 的分享",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "您想要轉移 {user} 的看板 {title} 嗎?",
|
||||
"Transfer the board." : "轉移看板。",
|
||||
"Transfer" : "轉移",
|
||||
"Transfer the board for {user} successfully" : "轉移 {user} 的看板成功",
|
||||
"Failed to transfer the board for {user}" : "轉移 {user} 的看板失敗",
|
||||
"Add a new list" : "新增列表",
|
||||
"Archive all cards" : "封存所有卡片",
|
||||
"Delete list" : "刪除列表",
|
||||
|
||||
@@ -168,8 +168,14 @@
|
||||
"Can edit" : "可以編輯",
|
||||
"Can share" : "可以分享",
|
||||
"Can manage" : "可以管理",
|
||||
"Owner" : "擁有者",
|
||||
"Delete" : "刪除",
|
||||
"Failed to create share with {displayName}" : "無法建立與 {displayName} 的分享",
|
||||
"Are you sure you want to transfer the board {title} for {user}?" : "您想要轉移 {user} 的看板 {title} 嗎?",
|
||||
"Transfer the board." : "轉移看板。",
|
||||
"Transfer" : "轉移",
|
||||
"Transfer the board for {user} successfully" : "轉移 {user} 的看板成功",
|
||||
"Failed to transfer the board for {user}" : "轉移 {user} 的看板失敗",
|
||||
"Add a new list" : "新增列表",
|
||||
"Archive all cards" : "封存所有卡片",
|
||||
"Delete list" : "刪除列表",
|
||||
|
||||
@@ -31,7 +31,6 @@ use OCA\Deck\Db\Acl;
|
||||
use OCA\Deck\Db\AclMapper;
|
||||
use OCA\Deck\Db\Assignment;
|
||||
use OCA\Deck\Db\Attachment;
|
||||
use OCA\Deck\Db\AttachmentMapper;
|
||||
use OCA\Deck\Db\Board;
|
||||
use OCA\Deck\Db\BoardMapper;
|
||||
use OCA\Deck\Db\Card;
|
||||
@@ -50,12 +49,15 @@ use OCP\L10N\IFactory;
|
||||
|
||||
class ActivityManager {
|
||||
public const DECK_NOAUTHOR_COMMENT_SYSTEM_ENFORCED = 'DECK_NOAUTHOR_COMMENT_SYSTEM_ENFORCED';
|
||||
|
||||
public const SUBJECT_PARAMS_MAX_LENGTH = 4000;
|
||||
public const SHORTENED_DESCRIPTION_MAX_LENGTH = 2000;
|
||||
|
||||
private $manager;
|
||||
private $userId;
|
||||
private $permissionService;
|
||||
private $boardMapper;
|
||||
private $cardMapper;
|
||||
private $attachmentMapper;
|
||||
private $aclMapper;
|
||||
private $stackMapper;
|
||||
private $l10nFactory;
|
||||
@@ -110,7 +112,6 @@ class ActivityManager {
|
||||
BoardMapper $boardMapper,
|
||||
CardMapper $cardMapper,
|
||||
StackMapper $stackMapper,
|
||||
AttachmentMapper $attachmentMapper,
|
||||
AclMapper $aclMapper,
|
||||
IFactory $l10nFactory,
|
||||
$userId
|
||||
@@ -120,7 +121,6 @@ class ActivityManager {
|
||||
$this->boardMapper = $boardMapper;
|
||||
$this->cardMapper = $cardMapper;
|
||||
$this->stackMapper = $stackMapper;
|
||||
$this->attachmentMapper = $attachmentMapper;
|
||||
$this->aclMapper = $aclMapper;
|
||||
$this->l10nFactory = $l10nFactory;
|
||||
$this->userId = $userId;
|
||||
@@ -249,19 +249,6 @@ class ActivityManager {
|
||||
try {
|
||||
$event = $this->createEvent($objectType, $entity, $subject, $additionalParams, $author);
|
||||
if ($event !== null) {
|
||||
$json = json_encode($event->getSubjectParameters());
|
||||
if (mb_strlen($json) > 4000) {
|
||||
$params = json_decode(json_encode($event->getSubjectParameters()), true);
|
||||
|
||||
$newContent = $params['after'];
|
||||
unset($params['before'], $params['after'], $params['card']['description']);
|
||||
|
||||
$params['after'] = mb_substr($newContent, 0, 2000);
|
||||
if (mb_strlen($newContent) > 2000) {
|
||||
$params['after'] .= '...';
|
||||
}
|
||||
$event->setSubject($event->getSubject(), $params);
|
||||
}
|
||||
$this->sendToUsers($event);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
@@ -410,12 +397,31 @@ class ActivityManager {
|
||||
|
||||
$subjectParams['author'] = $author === null ? $this->userId : $author;
|
||||
|
||||
$subjectParams = array_merge($subjectParams, $additionalParams);
|
||||
$json = json_encode($subjectParams);
|
||||
if (mb_strlen($json) > self::SUBJECT_PARAMS_MAX_LENGTH) {
|
||||
$params = json_decode(json_encode($subjectParams), true);
|
||||
|
||||
if ($subject === self::SUBJECT_CARD_UPDATE_DESCRIPTION && isset($params['after'])) {
|
||||
$newContent = $params['after'];
|
||||
unset($params['before'], $params['after'], $params['card']['description']);
|
||||
|
||||
$params['after'] = mb_substr($newContent, 0, self::SHORTENED_DESCRIPTION_MAX_LENGTH);
|
||||
if (mb_strlen($newContent) > self::SHORTENED_DESCRIPTION_MAX_LENGTH) {
|
||||
$params['after'] .= '...';
|
||||
}
|
||||
$subjectParams = $params;
|
||||
} else {
|
||||
throw new \Exception('Subject parameters too long');
|
||||
}
|
||||
}
|
||||
|
||||
$event = $this->manager->generateEvent();
|
||||
$event->setApp('deck')
|
||||
->setType($eventType)
|
||||
->setAuthor($subjectParams['author'])
|
||||
->setObject($objectType, (int)$object->getId(), $object->getTitle())
|
||||
->setSubject($subject, array_merge($subjectParams, $additionalParams))
|
||||
->setSubject($subject, $subjectParams)
|
||||
->setTimestamp(time());
|
||||
|
||||
if ($message !== null) {
|
||||
|
||||
@@ -35,6 +35,7 @@ use OCP\IConfig;
|
||||
use OCP\IURLGenerator;
|
||||
use OCP\IUserManager;
|
||||
use OCP\L10N\IFactory;
|
||||
use OCA\Deck\Service\CardService;
|
||||
|
||||
class DeckProvider implements IProvider {
|
||||
|
||||
@@ -52,8 +53,10 @@ class DeckProvider implements IProvider {
|
||||
private $l10nFactory;
|
||||
/** @var IConfig */
|
||||
private $config;
|
||||
/** @var CardService */
|
||||
private $cardService;
|
||||
|
||||
public function __construct(IURLGenerator $urlGenerator, ActivityManager $activityManager, IUserManager $userManager, ICommentsManager $commentsManager, IFactory $l10n, IConfig $config, $userId) {
|
||||
public function __construct(IURLGenerator $urlGenerator, ActivityManager $activityManager, IUserManager $userManager, ICommentsManager $commentsManager, IFactory $l10n, IConfig $config, $userId, CardService $cardService) {
|
||||
$this->userId = $userId;
|
||||
$this->urlGenerator = $urlGenerator;
|
||||
$this->activityManager = $activityManager;
|
||||
@@ -61,6 +64,7 @@ class DeckProvider implements IProvider {
|
||||
$this->userManager = $userManager;
|
||||
$this->l10nFactory = $l10n;
|
||||
$this->config = $config;
|
||||
$this->cardService = $cardService;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -131,7 +135,7 @@ class DeckProvider implements IProvider {
|
||||
|
||||
if (array_key_exists('board', $subjectParams)) {
|
||||
$archivedParam = $subjectParams['card']['archived'] ? 'archived/' : '';
|
||||
$card['link'] = $this->deckUrl('/board/' . $subjectParams['board']['id'] . '/' . $archivedParam . 'card/' . $event->getObjectId());
|
||||
$card['link'] = $this->cardService->getRedirectUrlForCard($event->getObjectId());
|
||||
}
|
||||
$params['card'] = $card;
|
||||
}
|
||||
|
||||
105
lib/Command/TransferOwnership.php
Normal file
105
lib/Command/TransferOwnership.php
Normal file
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
namespace OCA\Deck\Command;
|
||||
|
||||
use OCA\Deck\Db\BoardMapper;
|
||||
use OCA\Deck\Service\BoardService;
|
||||
use OCA\Deck\Service\PermissionService;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Helper\QuestionHelper;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Question\ConfirmationQuestion;
|
||||
|
||||
final class TransferOwnership extends Command {
|
||||
protected $boardService;
|
||||
protected $boardMapper;
|
||||
protected $permissionService;
|
||||
protected $questionHelper;
|
||||
|
||||
public function __construct(BoardService $boardService, BoardMapper $boardMapper, PermissionService $permissionService, QuestionHelper $questionHelper) {
|
||||
parent::__construct();
|
||||
|
||||
$this->boardService = $boardService;
|
||||
$this->boardMapper = $boardMapper;
|
||||
$this->permissionService = $permissionService;
|
||||
$this->questionHelper = $questionHelper;
|
||||
}
|
||||
|
||||
protected function configure() {
|
||||
$this
|
||||
->setName('deck:transfer-ownership')
|
||||
->setDescription('Change owner of deck boards')
|
||||
->addArgument(
|
||||
'owner',
|
||||
InputArgument::REQUIRED,
|
||||
'Owner uid'
|
||||
)
|
||||
->addArgument(
|
||||
'newOwner',
|
||||
InputArgument::REQUIRED,
|
||||
'New owner uid'
|
||||
)
|
||||
->addArgument(
|
||||
'boardId',
|
||||
InputArgument::OPTIONAL,
|
||||
'Single board ID'
|
||||
)
|
||||
->addOption(
|
||||
'remap',
|
||||
'r',
|
||||
InputOption::VALUE_NONE,
|
||||
'Reassign card details of the old owner to the new one'
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int {
|
||||
$owner = $input->getArgument('owner');
|
||||
$newOwner = $input->getArgument('newOwner');
|
||||
$boardId = $input->getArgument('boardId');
|
||||
|
||||
$remapAssignment = $input->getOption('remap');
|
||||
|
||||
$this->boardService->setUserId($owner);
|
||||
$this->permissionService->setUserId($owner);
|
||||
|
||||
try {
|
||||
$board = $boardId ? $this->boardMapper->find($boardId) : null;
|
||||
} catch (\Exception $e) {
|
||||
$output->writeln("Could not find a board for the provided id.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ($boardId !== null && $board->getOwner() !== $owner) {
|
||||
$output->writeln("$owner is not the owner of the board $boardId (" . $board->getTitle() . ")");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ($boardId) {
|
||||
$output->writeln("Transfer board " . $board->getTitle() . " from ". $board->getOwner() ." to $newOwner");
|
||||
} else {
|
||||
$output->writeln("Transfer all boards from $owner to $newOwner");
|
||||
}
|
||||
|
||||
$question = new ConfirmationQuestion('Do you really want to continue? (y/n) ', false);
|
||||
if (!$this->questionHelper->ask($input, $output, $question)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ($boardId) {
|
||||
$this->boardService->transferBoardOwnership($boardId, $newOwner, $remapAssignment);
|
||||
$output->writeln("<info>Board " . $board->getTitle() . " from ". $board->getOwner() ." transferred to $newOwner completed</info>");
|
||||
return 0;
|
||||
}
|
||||
|
||||
foreach ($this->boardService->transferOwnership($owner, $newOwner, $remapAssignment) as $board) {
|
||||
$output->writeln(" - " . $board->getTitle() . " transferred");
|
||||
}
|
||||
$output->writeln("<info>All boards from $owner to $newOwner transferred</info>");
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -24,9 +24,12 @@
|
||||
namespace OCA\Deck\Controller;
|
||||
|
||||
use OCA\Deck\Db\Acl;
|
||||
use OCA\Deck\Db\Board;
|
||||
use OCA\Deck\Service\BoardService;
|
||||
use OCA\Deck\Service\PermissionService;
|
||||
use OCP\AppFramework\ApiController;
|
||||
use OCP\AppFramework\Http;
|
||||
use OCP\AppFramework\Http\DataResponse;
|
||||
use OCP\IRequest;
|
||||
|
||||
class BoardController extends ApiController {
|
||||
@@ -150,9 +153,20 @@ class BoardController extends ApiController {
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
* @param $boardId
|
||||
* @return \OCP\Deck\DB\Board
|
||||
* @return Board
|
||||
*/
|
||||
public function clone($boardId) {
|
||||
return $this->boardService->clone($boardId, $this->userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function transferOwner(int $boardId, string $newOwner): DataResponse {
|
||||
if ($this->permissionService->userIsBoardOwner($boardId, $this->userId)) {
|
||||
return new DataResponse($this->boardService->transferBoardOwnership($boardId, $newOwner), HTTP::STATUS_OK);
|
||||
}
|
||||
|
||||
return new DataResponse([], HTTP::STATUS_UNAUTHORIZED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,12 +34,20 @@ use OCP\IInitialStateService;
|
||||
use OCP\IRequest;
|
||||
use OCP\AppFramework\Http\TemplateResponse;
|
||||
use OCP\AppFramework\Controller;
|
||||
use OCA\Deck\Db\CardMapper;
|
||||
use OCP\IURLGenerator;
|
||||
use \OCP\AppFramework\Http\RedirectResponse;
|
||||
use OCA\Deck\Db\Acl;
|
||||
use OCA\Deck\Service\CardService;
|
||||
|
||||
class PageController extends Controller {
|
||||
private $permissionService;
|
||||
private $initialState;
|
||||
private $configService;
|
||||
private $eventDispatcher;
|
||||
private $cardMapper;
|
||||
private $urlGenerator;
|
||||
private $cardService;
|
||||
|
||||
public function __construct(
|
||||
$AppName,
|
||||
@@ -47,7 +55,10 @@ class PageController extends Controller {
|
||||
PermissionService $permissionService,
|
||||
IInitialStateService $initialStateService,
|
||||
ConfigService $configService,
|
||||
IEventDispatcher $eventDispatcher
|
||||
IEventDispatcher $eventDispatcher,
|
||||
CardMapper $cardMapper,
|
||||
IURLGenerator $urlGenerator,
|
||||
CardService $cardService
|
||||
) {
|
||||
parent::__construct($AppName, $request);
|
||||
|
||||
@@ -55,6 +66,9 @@ class PageController extends Controller {
|
||||
$this->initialState = $initialStateService;
|
||||
$this->configService = $configService;
|
||||
$this->eventDispatcher = $eventDispatcher;
|
||||
$this->cardMapper = $cardMapper;
|
||||
$this->urlGenerator = $urlGenerator;
|
||||
$this->cardService = $cardService;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -85,4 +99,17 @@ class PageController extends Controller {
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
* @NoCSRFRequired
|
||||
*/
|
||||
public function redirectToCard($cardId): RedirectResponse {
|
||||
try {
|
||||
$this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_READ);
|
||||
return new RedirectResponse($this->cardService->getCardUrl($cardId));
|
||||
} catch (\Exception $e) {
|
||||
return new RedirectResponse($this->urlGenerator->linkToRouteAbsolute('deck.page.index'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,46 +25,24 @@ namespace OCA\Deck\Db;
|
||||
|
||||
use OCP\AppFramework\Db\DoesNotExistException;
|
||||
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
|
||||
use OCP\AppFramework\Db\QBMapper;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
|
||||
class AclMapper extends QBMapper implements IPermissionMapper {
|
||||
class AclMapper extends DeckMapper implements IPermissionMapper {
|
||||
public function __construct(IDBConnection $db) {
|
||||
parent::__construct($db, 'deck_board_acl', Acl::class);
|
||||
}
|
||||
|
||||
public function find($id): Acl {
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$query->select('*')
|
||||
->from($this->getTableName())
|
||||
->where($query->expr()->eq('id', $query->createNamedParameter($id)));
|
||||
|
||||
return $this->findEntity($query);
|
||||
}
|
||||
|
||||
public function findAll($boardId, $limit = null, $offset = null) {
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$query->select('*')
|
||||
->from($this->getTableName())
|
||||
->where($query->expr()->eq('board_id', $query->createNamedParameter($boardId)))
|
||||
->setMaxResults($limit)
|
||||
->setFirstResult($offset);
|
||||
|
||||
return $this->findEntities($query);
|
||||
$sql = 'SELECT id, board_id, type, participant, permission_edit, permission_share, permission_manage FROM `*PREFIX*deck_board_acl` WHERE `board_id` = ? ';
|
||||
return $this->findEntities($sql, [$boardId], $limit, $offset);
|
||||
}
|
||||
|
||||
public function isOwner($userId, $aclId): bool {
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$query->select('owner')
|
||||
->from('deck_boards', 'b')
|
||||
->innerJoin('b', $this->getTableName(), 'a', $query->expr()->eq('b.id', 'a.board_id'))
|
||||
->where($query->expr()->eq('a.id', $query->createNamedParameter($aclId)));
|
||||
|
||||
$cursor = $query->execute();
|
||||
$row = $cursor->fetch();
|
||||
$cursor->closeCursor();
|
||||
|
||||
return is_array($row) && $row['owner'] === $userId;
|
||||
$sql = 'SELECT owner FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_board_acl` WHERE id = ?)';
|
||||
$stmt = $this->execute($sql, [$aclId]);
|
||||
$row = $stmt->fetch();
|
||||
return ($row['owner'] === $userId);
|
||||
}
|
||||
|
||||
public function findBoardId($id): ?int {
|
||||
@@ -76,13 +54,20 @@ class AclMapper extends QBMapper implements IPermissionMapper {
|
||||
return null;
|
||||
}
|
||||
|
||||
public function findByParticipant(int $type, string $participant): array {
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$query->select('*')
|
||||
->from($this->getTableName())
|
||||
->where($query->expr()->eq('type', $query->createNamedParameter($type)))
|
||||
->andWhere($query->expr()->eq('type', $query->createNamedParameter($participant)));
|
||||
public function findByParticipant($type, $participant): array {
|
||||
$sql = 'SELECT * from *PREFIX*deck_board_acl WHERE type = ? AND participant = ?';
|
||||
return $this->findEntities($sql, [$type, $participant]);
|
||||
}
|
||||
|
||||
return $this->findEntities($query);
|
||||
/**
|
||||
* @throws \OCP\DB\Exception
|
||||
*/
|
||||
public function deleteParticipantFromBoard(int $boardId, int $type, string $participant): void {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->delete('deck_board_acl')
|
||||
->where($qb->expr()->eq('type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT)))
|
||||
->andWhere($qb->expr()->eq('participant', $qb->createNamedParameter($participant, IQueryBuilder::PARAM_STR)))
|
||||
->andWhere($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)));
|
||||
$qb->executeStatement();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ use OCA\Deck\NotFoundException;
|
||||
use OCA\Deck\Service\CirclesService;
|
||||
use OCP\AppFramework\Db\Entity;
|
||||
use OCP\AppFramework\Db\QBMapper;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\IUserManager;
|
||||
@@ -146,4 +147,39 @@ class AssignmentMapper extends QBMapper implements IPermissionMapper {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function remapAssignedUser(int $boardId, string $userId, string $newUserId): void {
|
||||
$subQuery = $this->db->getQueryBuilder();
|
||||
$subQuery->selectAlias('a.id', 'id')
|
||||
->from('deck_assigned_users', 'a')
|
||||
->innerJoin('a', 'deck_cards', 'c', 'c.id = a.card_id')
|
||||
->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id')
|
||||
->where($subQuery->expr()->eq('a.type', $subQuery->createNamedParameter(Assignment::TYPE_USER, IQueryBuilder::PARAM_INT)))
|
||||
->andWhere($subQuery->expr()->eq('a.participant', $subQuery->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
|
||||
->andWhere($subQuery->expr()->eq('s.board_id', $subQuery->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
|
||||
->setMaxResults(1000);
|
||||
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->update('deck_assigned_users')
|
||||
->set('participant', $qb->createParameter('participant'))
|
||||
->where($qb->expr()->in('id', $qb->createParameter('ids')));
|
||||
|
||||
$moreResults = true;
|
||||
do {
|
||||
$result = $subQuery->executeQuery();
|
||||
$ids = array_map(function ($item) {
|
||||
return $item['id'];
|
||||
}, $result->fetchAll());
|
||||
|
||||
if (count($ids) === 0 || $result->rowCount() === 0) {
|
||||
$moreResults = false;
|
||||
}
|
||||
|
||||
$qb->setParameter('participant', $newUserId, IQueryBuilder::PARAM_STR);
|
||||
$qb->setParameter('ids', $ids, IQueryBuilder::PARAM_INT_ARRAY);
|
||||
$qb->executeStatement();
|
||||
} while ($moreResults === true);
|
||||
|
||||
$result->closeCursor();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -475,4 +475,34 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \OCP\DB\Exception
|
||||
*/
|
||||
public function transferOwnership(string $ownerId, string $newOwnerId, $boardId = null): void {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->update('deck_boards')
|
||||
->set('owner', $qb->createNamedParameter($newOwnerId, IQueryBuilder::PARAM_STR))
|
||||
->where($qb->expr()->eq('owner', $qb->createNamedParameter($ownerId, IQueryBuilder::PARAM_STR)));
|
||||
if ($boardId !== null) {
|
||||
$qb->andWhere($qb->expr()->eq('id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)));
|
||||
}
|
||||
$qb->executeStatement();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset cache for a given board or a given user
|
||||
*/
|
||||
public function flushCache(?int $boardId = null, ?string $userId = null) {
|
||||
if ($boardId) {
|
||||
unset($this->boardCache[$boardId]);
|
||||
} else {
|
||||
$this->boardCache = null;
|
||||
}
|
||||
if ($userId) {
|
||||
unset($this->userBoardCache[$userId]);
|
||||
} else {
|
||||
$this->userBoardCache = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -586,4 +586,47 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
public function transferOwnership(string $ownerId, string $newOwnerId, int $boardId = null): void {
|
||||
$params = [
|
||||
'owner' => $ownerId,
|
||||
'newOwner' => $newOwnerId
|
||||
];
|
||||
$sql = "UPDATE `*PREFIX*{$this->tableName}` SET `owner` = :newOwner WHERE `owner` = :owner";
|
||||
$stmt = $this->db->executeQuery($sql, $params);
|
||||
$stmt->closeCursor();
|
||||
}
|
||||
|
||||
public function remapCardOwner(int $boardId, string $userId, string $newUserId): void {
|
||||
$subQuery = $this->db->getQueryBuilder();
|
||||
$subQuery->selectAlias('c.id', 'id')
|
||||
->from('deck_cards', 'c')
|
||||
->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id')
|
||||
->where($subQuery->expr()->eq('c.owner', $subQuery->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
|
||||
->andWhere($subQuery->expr()->eq('s.board_id', $subQuery->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
|
||||
->setMaxResults(1000);
|
||||
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->update('deck_cards')
|
||||
->set('owner', $qb->createParameter('owner'))
|
||||
->where($qb->expr()->in('id', $qb->createParameter('ids')));
|
||||
|
||||
$moreResults = true;
|
||||
do {
|
||||
$result = $subQuery->executeQuery();
|
||||
$ids = array_map(function ($item) {
|
||||
return $item['id'];
|
||||
}, $result->fetchAll());
|
||||
|
||||
if (count($ids) === 0 || $result->rowCount() === 0) {
|
||||
$moreResults = false;
|
||||
}
|
||||
|
||||
$qb->setParameter('owner', $newUserId, IQueryBuilder::PARAM_STR);
|
||||
$qb->setParameter('ids', $ids, IQueryBuilder::PARAM_INT_ARRAY);
|
||||
$qb->executeStatement();
|
||||
} while ($moreResults === true);
|
||||
|
||||
$result->closeCursor();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,12 +24,14 @@
|
||||
|
||||
namespace OCA\Deck\Service;
|
||||
|
||||
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
|
||||
use OCA\Deck\Activity\ActivityManager;
|
||||
use OCA\Deck\Activity\ChangeSet;
|
||||
use OCA\Deck\AppInfo\Application;
|
||||
use OCA\Deck\Db\Acl;
|
||||
use OCA\Deck\Db\AclMapper;
|
||||
use OCA\Deck\Db\AssignmentMapper;
|
||||
use OCA\Deck\Db\CardMapper;
|
||||
use OCA\Deck\Db\ChangeHelper;
|
||||
use OCA\Deck\Db\IPermissionMapper;
|
||||
use OCA\Deck\Db\Label;
|
||||
@@ -45,11 +47,14 @@ use OCP\EventDispatcher\IEventDispatcher;
|
||||
use OCP\IConfig;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\IL10N;
|
||||
use OCA\Deck\Db\Card;
|
||||
use OCA\Deck\Db\Board;
|
||||
use OCA\Deck\Db\BoardMapper;
|
||||
use OCA\Deck\Db\LabelMapper;
|
||||
use OCA\Deck\Event\CardCreatedEvent;
|
||||
use OCP\IUserManager;
|
||||
use OCA\Deck\BadRequestException;
|
||||
use OCP\IURLGenerator;
|
||||
|
||||
class BoardService {
|
||||
private $boardMapper;
|
||||
@@ -68,8 +73,10 @@ class BoardService {
|
||||
private $activityManager;
|
||||
private $eventDispatcher;
|
||||
private $changeHelper;
|
||||
private $cardMapper;
|
||||
|
||||
private $boardsCache = null;
|
||||
private $urlGenerator;
|
||||
|
||||
|
||||
public function __construct(
|
||||
@@ -82,11 +89,13 @@ class BoardService {
|
||||
PermissionService $permissionService,
|
||||
NotificationHelper $notificationHelper,
|
||||
AssignmentMapper $assignedUsersMapper,
|
||||
CardMapper $cardMapper,
|
||||
IUserManager $userManager,
|
||||
IGroupManager $groupManager,
|
||||
ActivityManager $activityManager,
|
||||
IEventDispatcher $eventDispatcher,
|
||||
ChangeHelper $changeHelper,
|
||||
IURLGenerator $urlGenerator,
|
||||
$userId
|
||||
) {
|
||||
$this->boardMapper = $boardMapper;
|
||||
@@ -104,6 +113,8 @@ class BoardService {
|
||||
$this->eventDispatcher = $eventDispatcher;
|
||||
$this->changeHelper = $changeHelper;
|
||||
$this->userId = $userId;
|
||||
$this->urlGenerator = $urlGenerator;
|
||||
$this->cardMapper = $cardMapper;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -515,11 +526,14 @@ class BoardService {
|
||||
$acl->setPermissionManage($manage);
|
||||
$newAcl = $this->aclMapper->insert($acl);
|
||||
|
||||
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_BOARD, $newAcl, ActivityManager::SUBJECT_BOARD_SHARE);
|
||||
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_BOARD, $newAcl, ActivityManager::SUBJECT_BOARD_SHARE, [], $this->userId);
|
||||
$this->notificationHelper->sendBoardShared((int)$boardId, $acl);
|
||||
$this->boardMapper->mapAcl($newAcl);
|
||||
$this->changeHelper->boardChanged($boardId);
|
||||
|
||||
$board = $this->boardMapper->find($boardId);
|
||||
$this->clearBoardFromCache($board);
|
||||
|
||||
// TODO: use the dispatched event for this
|
||||
try {
|
||||
$resourceProvider = \OC::$server->query(\OCA\Deck\Collaboration\Resources\ResourceProvider::class);
|
||||
@@ -661,15 +675,76 @@ class BoardService {
|
||||
|
||||
$stacks = $this->stackMapper->findAll($id);
|
||||
foreach ($stacks as $stack) {
|
||||
$newStack = new Stack();
|
||||
$newStack->setTitle($stack->getTitle());
|
||||
$newStack->setBoardId($newBoard->getId());
|
||||
$this->stackMapper->insert($newStack);
|
||||
$this->cloneStack($stack, $newBoard->getId());
|
||||
}
|
||||
|
||||
return $newBoard;
|
||||
}
|
||||
|
||||
private function cloneStack($stack, $newBoardId)
|
||||
{
|
||||
$newStack = new Stack();
|
||||
$newStack->setTitle($stack->getTitle());
|
||||
$newStack->setBoardId($newBoardId);
|
||||
$insertedStack = $this->stackMapper->insert($newStack);
|
||||
$cards = $this->cardMapper->findAll($stack->getId());
|
||||
|
||||
foreach ($cards as $card) {
|
||||
$newCard = new Card();
|
||||
$newCard->setTitle($card->getTitle());
|
||||
$newCard->setStackId($insertedStack->getId());
|
||||
$newCard->setType($card->getType());
|
||||
$newCard->setOrder($card->getOrder());
|
||||
$newCard->setOwner($card->getOwner());
|
||||
$newCard->setDescription($card->getDescription());
|
||||
$newCard->setDuedate($card->getDuedate());
|
||||
$newCard = $this->cardMapper->insert($newCard);
|
||||
|
||||
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_CREATE);
|
||||
$this->changeHelper->cardChanged($newCard->getId(), false);
|
||||
$this->eventDispatcher->dispatchTyped(new CardCreatedEvent($newCard));
|
||||
}
|
||||
|
||||
return $stack;
|
||||
}
|
||||
|
||||
public function transferBoardOwnership(int $boardId, string $newOwner, bool $changeContent = false): Board {
|
||||
\OC::$server->getDatabaseConnection()->beginTransaction();
|
||||
try {
|
||||
$board = $this->boardMapper->find($boardId);
|
||||
$previousOwner = $board->getOwner();
|
||||
$this->clearBoardFromCache($board);
|
||||
$this->aclMapper->deleteParticipantFromBoard($boardId, Acl::PERMISSION_TYPE_USER, $newOwner);
|
||||
if (!$changeContent) {
|
||||
try {
|
||||
$this->addAcl($boardId, Acl::PERMISSION_TYPE_USER, $previousOwner, true, true, true);
|
||||
} catch (UniqueConstraintViolationException $e) {
|
||||
}
|
||||
}
|
||||
$this->boardMapper->transferOwnership($previousOwner, $newOwner, $boardId);
|
||||
|
||||
// Optionally also change user assignments and card owner information
|
||||
if ($changeContent) {
|
||||
$this->assignedUsersMapper->remapAssignedUser($boardId, $previousOwner, $newOwner);
|
||||
$this->cardMapper->remapCardOwner($boardId, $previousOwner, $newOwner);
|
||||
}
|
||||
\OC::$server->getDatabaseConnection()->commit();
|
||||
return $this->boardMapper->find($boardId);
|
||||
} catch (\Throwable $e) {
|
||||
\OC::$server->getDatabaseConnection()->rollBack();
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
public function transferOwnership(string $owner, string $newOwner, bool $changeContent = false): \Generator {
|
||||
$boards = $this->boardMapper->findAllByUser($owner);
|
||||
foreach ($boards as $board) {
|
||||
if ($board->getOwner() === $owner) {
|
||||
yield $this->transferBoardOwnership($board->getId(), $newOwner, $changeContent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function enrichWithStacks($board, $since = -1) {
|
||||
$stacks = $this->stackMapper->findAll($board->getId(), null, null, $since);
|
||||
|
||||
@@ -697,4 +772,23 @@ class BoardService {
|
||||
}
|
||||
$board->setUsers(array_values($boardUsers));
|
||||
}
|
||||
|
||||
public function getBoardUrl($endpoint) {
|
||||
return $this->urlGenerator->linkToRouteAbsolute('deck.page.index') . '#' . $endpoint;
|
||||
}
|
||||
|
||||
private function clearBoardsCache() {
|
||||
$this->boardsCache = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean a given board data from the Cache
|
||||
*/
|
||||
private function clearBoardFromCache(Board $board) {
|
||||
$boardId = $board->getId();
|
||||
$boardOwnerId = $board->getOwner();
|
||||
|
||||
$this->boardMapper->flushCache($boardId, $boardOwnerId);
|
||||
unset($this->boardsCache[$boardId]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ use OCA\Deck\BadRequestException;
|
||||
use OCP\Comments\ICommentsManager;
|
||||
use OCP\EventDispatcher\IEventDispatcher;
|
||||
use OCP\IUserManager;
|
||||
use OCP\IURLGenerator;
|
||||
|
||||
class CardService {
|
||||
private $cardMapper;
|
||||
@@ -63,6 +64,7 @@ class CardService {
|
||||
private $changeHelper;
|
||||
private $eventDispatcher;
|
||||
private $userManager;
|
||||
private $urlGenerator;
|
||||
|
||||
public function __construct(
|
||||
CardMapper $cardMapper,
|
||||
@@ -79,6 +81,7 @@ class CardService {
|
||||
IUserManager $userManager,
|
||||
ChangeHelper $changeHelper,
|
||||
IEventDispatcher $eventDispatcher,
|
||||
IURLGenerator $urlGenerator,
|
||||
$userId
|
||||
) {
|
||||
$this->cardMapper = $cardMapper;
|
||||
@@ -96,6 +99,7 @@ class CardService {
|
||||
$this->changeHelper = $changeHelper;
|
||||
$this->eventDispatcher = $eventDispatcher;
|
||||
$this->currentUser = $userId;
|
||||
$this->urlGenerator = $urlGenerator;
|
||||
}
|
||||
|
||||
public function enrich($card) {
|
||||
@@ -602,4 +606,14 @@ class CardService {
|
||||
|
||||
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
|
||||
}
|
||||
|
||||
public function getCardUrl($cardId) {
|
||||
$boardId = $this->cardMapper->findBoardId($cardId);
|
||||
|
||||
return $this->urlGenerator->linkToRouteAbsolute('deck.page.index') . "#/board/$boardId/card/$cardId";
|
||||
}
|
||||
|
||||
public function getRedirectUrlForCard($cardId) {
|
||||
return $this->urlGenerator->linkToRouteAbsolute('deck.page.index') . "card/$cardId";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -241,6 +241,7 @@ class PermissionService {
|
||||
if (array_key_exists((string) $boardId, $this->users) && !$refresh) {
|
||||
return $this->users[(string) $boardId];
|
||||
}
|
||||
|
||||
try {
|
||||
$board = $this->boardMapper->find($boardId);
|
||||
} catch (DoesNotExistException $e) {
|
||||
@@ -332,4 +333,13 @@ class PermissionService {
|
||||
}
|
||||
return $groups;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a different user than the current one, e.g. when no user is available in occ
|
||||
*
|
||||
* @param string $userId
|
||||
*/
|
||||
public function setUserId(string $userId): void {
|
||||
$this->userId = $userId;
|
||||
}
|
||||
}
|
||||
|
||||
338
package-lock.json
generated
338
package-lock.json
generated
@@ -9,7 +9,7 @@
|
||||
"license": "agpl",
|
||||
"dependencies": {
|
||||
"@babel/polyfill": "^7.12.1",
|
||||
"@babel/runtime": "^7.17.2",
|
||||
"@babel/runtime": "^7.17.8",
|
||||
"@juliushaertl/vue-richtext": "^1.0.1",
|
||||
"@nextcloud/auth": "^1.3.0",
|
||||
"@nextcloud/axios": "^1.9.0",
|
||||
@@ -18,9 +18,9 @@
|
||||
"@nextcloud/files": "^2.1.0",
|
||||
"@nextcloud/initial-state": "^1.2.1",
|
||||
"@nextcloud/l10n": "^1.4.1",
|
||||
"@nextcloud/moment": "^1.1.1",
|
||||
"@nextcloud/moment": "^1.2.0",
|
||||
"@nextcloud/router": "^2.0.0",
|
||||
"@nextcloud/vue": "^5.0.0",
|
||||
"@nextcloud/vue": "^5.3.0",
|
||||
"@nextcloud/vue-dashboard": "^2.0.1",
|
||||
"blueimp-md5": "^2.19.0",
|
||||
"dompurify": "^2.3.6",
|
||||
@@ -48,7 +48,7 @@
|
||||
"@nextcloud/eslint-config": "^6.1.2",
|
||||
"@nextcloud/stylelint-config": "^2.1.2",
|
||||
"@nextcloud/webpack-vue-config": "^5.0.0",
|
||||
"@relative-ci/agent": "^3.1.1",
|
||||
"@relative-ci/agent": "^3.1.2",
|
||||
"@vue/test-utils": "^1.3.0",
|
||||
"jest": "^27.5.1",
|
||||
"jest-serializer-vue": "^2.0.2",
|
||||
@@ -1605,9 +1605,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.17.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz",
|
||||
"integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==",
|
||||
"version": "7.17.8",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz",
|
||||
"integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==",
|
||||
"dependencies": {
|
||||
"regenerator-runtime": "^0.13.4"
|
||||
},
|
||||
@@ -1667,12 +1667,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@bundle-stats/plugin-webpack-validate": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-validate/-/plugin-webpack-validate-3.1.3.tgz",
|
||||
"integrity": "sha512-8YPquB0+eoUoOtQGitVJGzPi6nhNBkar/IZH24UQflQWXjPlvwT3XJ9HNDDGWjdfUXWCWGOrEqMpoLtxYUxWpQ==",
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-validate/-/plugin-webpack-validate-3.3.0.tgz",
|
||||
"integrity": "sha512-D4a0Isn8EGXy4VcGEYrtKV/patFqMhXEH4BRsXUozBKd7GvRBp1BpFCuIon2UBARG+ZzNGCfVtGqyAdvHNL+Gw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"superstruct": "^0.8.3"
|
||||
"superstruct": "0.8.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 12.0"
|
||||
@@ -2908,52 +2908,27 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@nextcloud/moment": {
|
||||
"version": "1.1.1",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"dependencies": {
|
||||
"@nextcloud/l10n": "1.2.0",
|
||||
"core-js": "3.6.4",
|
||||
"jed": "^1.1.1",
|
||||
"moment": "2.24.0",
|
||||
"node-gettext": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@nextcloud/moment/node_modules/@nextcloud/l10n": {
|
||||
"version": "1.2.0",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"resolved": "https://registry.npmjs.org/@nextcloud/moment/-/moment-1.2.0.tgz",
|
||||
"integrity": "sha512-HOnZqoYQg0eOQW369s5v7jZWmRNYCsadHnVjN+DSXQQ1n4fHKmr0EkdOFHJu1Br5Rd6Fxi4wRw7E7pD1CVZmgA==",
|
||||
"dependencies": {
|
||||
"core-js": "^3.6.4",
|
||||
"@nextcloud/l10n": "1.4.1",
|
||||
"core-js": "3.18.2",
|
||||
"jed": "^1.1.1",
|
||||
"moment": "2.29.1",
|
||||
"node-gettext": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@nextcloud/moment/node_modules/@nextcloud/l10n/node_modules/node-gettext": {
|
||||
"version": "3.0.0",
|
||||
"dependencies": {
|
||||
"lodash.get": "^4.4.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@nextcloud/moment/node_modules/core-js": {
|
||||
"version": "3.6.4",
|
||||
"version": "3.18.2",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.2.tgz",
|
||||
"integrity": "sha512-zNhPOUoSgoizoSQFdX1MeZO16ORRb9FFQLts8gSYbZU5FcgXhp24iMWMxnOQo5uIaIG7/6FA/IqJPwev1o9ZXQ==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/core-js"
|
||||
}
|
||||
},
|
||||
"node_modules/@nextcloud/moment/node_modules/moment": {
|
||||
"version": "2.24.0",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@nextcloud/moment/node_modules/node-gettext": {
|
||||
"version": "2.1.0",
|
||||
"dependencies": {
|
||||
"lodash.get": "^4.4.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@nextcloud/router": {
|
||||
"version": "2.0.0",
|
||||
"license": "GPL-3.0-or-later",
|
||||
@@ -2993,9 +2968,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@nextcloud/vue": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-5.0.0.tgz",
|
||||
"integrity": "sha512-hqfI3n3mebi7dlLUBjyBzIJQJTVjtFrCm49KYo2lQ/qDzBzOf5hrjwEEM3tnQIiPtHU8k24CnoSNqYto9XzERg==",
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-5.3.0.tgz",
|
||||
"integrity": "sha512-yRxEeQIgNHafvD2MC//BQXCkyyXiNQQZUGErlwOuuKpZbTX2BYTdvrN15On7rTqJNzwmwuzXAIPIFc0D8c2h+g==",
|
||||
"dependencies": {
|
||||
"@nextcloud/auth": "^1.2.3",
|
||||
"@nextcloud/axios": "^1.3.2",
|
||||
@@ -3008,7 +2983,7 @@
|
||||
"@nextcloud/logger": "^2.0.0",
|
||||
"@nextcloud/router": "^2.0.0",
|
||||
"debounce": "1.2.1",
|
||||
"emoji-mart-vue-fast": "^7.0.7",
|
||||
"emoji-mart-vue-fast": "^10.2.1",
|
||||
"escape-html": "^1.0.3",
|
||||
"hammerjs": "^2.0.8",
|
||||
"linkify-string": "^3.0.2",
|
||||
@@ -3020,7 +2995,7 @@
|
||||
"tributejs": "^5.1.3",
|
||||
"v-click-outside": "^3.0.1",
|
||||
"v-tooltip": "^2.0.3",
|
||||
"vue": "^2.6.11",
|
||||
"vue": "^2.6.14",
|
||||
"vue-color": "^2.7.1",
|
||||
"vue-material-design-icons": "^5.0.0",
|
||||
"vue-multiselect": "^2.1.6",
|
||||
@@ -3195,6 +3170,19 @@
|
||||
"node": ">=12.20"
|
||||
}
|
||||
},
|
||||
"node_modules/@nextcloud/vue/node_modules/emoji-mart-vue-fast": {
|
||||
"version": "10.2.1",
|
||||
"resolved": "https://registry.npmjs.org/emoji-mart-vue-fast/-/emoji-mart-vue-fast-10.2.1.tgz",
|
||||
"integrity": "sha512-PtKihhsXBEEw1jHwnoRyJAnJP1OlK4EJrEze58EbUUV7iHWGLub+yuiNSj2Uo1JBHraz4fw/pH98nFysVoe0qg==",
|
||||
"dependencies": {
|
||||
"@babel/polyfill": "^7.12.1",
|
||||
"@babel/runtime": "^7.16.3",
|
||||
"vue-virtual-scroller": "^1.0.10"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": ">2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@nextcloud/vue/node_modules/linkify-string": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/linkify-string/-/linkify-string-3.0.2.tgz",
|
||||
@@ -3436,22 +3424,22 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@relative-ci/agent": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@relative-ci/agent/-/agent-3.1.1.tgz",
|
||||
"integrity": "sha512-/6ElcpTRgA8fjzFiq/np4vLJVszKIE0OIbEgT/WwpW8GLyAkFS0guxMIqqUqivpypgEkj/E7u49yfDFwdYy24Q==",
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@relative-ci/agent/-/agent-3.1.2.tgz",
|
||||
"integrity": "sha512-whs+UCR21T3BeTzWmFTnV7O3NCCRj74BZSMWioIreshiWydaNfdbgEjdFCwnw74fiOR4jGP269oVkXt8TDs97g==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@bundle-stats/plugin-webpack-filter": "^3.1.3",
|
||||
"@bundle-stats/plugin-webpack-validate": "^3.1.3",
|
||||
"core-js": "^3.6.4",
|
||||
"cosmiconfig": "^7.0.0",
|
||||
"debug": "^4.1.1",
|
||||
"dotenv": "^16.0.0",
|
||||
"env-ci": "^7.0.0",
|
||||
"fs-extra": "^10.0.0",
|
||||
"isomorphic-fetch": "^3.0.0",
|
||||
"lodash": "^4.17.15",
|
||||
"yargs": "^17.1.1"
|
||||
"@bundle-stats/plugin-webpack-filter": "3.3.0",
|
||||
"@bundle-stats/plugin-webpack-validate": "3.3.0",
|
||||
"core-js": "3.21.1",
|
||||
"cosmiconfig": "7.0.1",
|
||||
"debug": "4.3.3",
|
||||
"dotenv": "16.0.0",
|
||||
"env-ci": "7.1.0",
|
||||
"fs-extra": "10.0.1",
|
||||
"isomorphic-fetch": "3.0.0",
|
||||
"lodash": "4.17.21",
|
||||
"yargs": "17.3.1"
|
||||
},
|
||||
"bin": {
|
||||
"relative-ci-agent": "bin/index.js"
|
||||
@@ -3464,22 +3452,22 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@relative-ci/agent/node_modules/@bundle-stats/plugin-webpack-filter": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-filter/-/plugin-webpack-filter-3.1.3.tgz",
|
||||
"integrity": "sha512-KluPrsSm05jgFxAHO1sqU9ghoDO7XitLZ0pGiRvfU3+KAP+XxNh6I9AfaPJWTtb7vjCF+b46WynAmrOXc9AyFw==",
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-filter/-/plugin-webpack-filter-3.3.0.tgz",
|
||||
"integrity": "sha512-nf/B5Ry+Yw4zPDHj4OLmlj301zhW5rHe0EdGsLdsTHfgw1+0SQn/GZw8PSkJwj4tjuo3fb13mxM/DJjPu4UWpQ==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 12.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"core-js": "^3.9.1",
|
||||
"lodash": "^4.17.11"
|
||||
"core-js": "3.20.2",
|
||||
"lodash": "4.17.21"
|
||||
}
|
||||
},
|
||||
"node_modules/@relative-ci/agent/node_modules/core-js": {
|
||||
"version": "3.16.2",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.2.tgz",
|
||||
"integrity": "sha512-P0KPukO6OjMpjBtHSceAZEWlDD1M2Cpzpg6dBbrjFqFhBHe/BwhxaP820xKOjRn/lZRQirrCusIpLS/n2sgXLQ==",
|
||||
"version": "3.21.1",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz",
|
||||
"integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"funding": {
|
||||
@@ -3488,23 +3476,32 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@relative-ci/agent/node_modules/yargs": {
|
||||
"version": "17.2.1",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz",
|
||||
"integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==",
|
||||
"version": "17.3.1",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",
|
||||
"integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"cliui": "^7.0.2",
|
||||
"escalade": "^3.1.1",
|
||||
"get-caller-file": "^2.0.5",
|
||||
"require-directory": "^2.1.1",
|
||||
"string-width": "^4.2.0",
|
||||
"string-width": "^4.2.3",
|
||||
"y18n": "^5.0.5",
|
||||
"yargs-parser": "^20.2.2"
|
||||
"yargs-parser": "^21.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@relative-ci/agent/node_modules/yargs-parser": {
|
||||
"version": "21.0.1",
|
||||
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
|
||||
"integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@sinonjs/commons": {
|
||||
"version": "1.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
|
||||
@@ -7345,9 +7342,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/env-ci": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/env-ci/-/env-ci-7.0.0.tgz",
|
||||
"integrity": "sha512-yR6deDT5+6I4i009Vqc2INpO7UWzqgB5sIrEUUcePGnQL6dwxNGDFeBMe8B/wD7FW6cJl/fXYtQwMdfkBII3OA==",
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/env-ci/-/env-ci-7.1.0.tgz",
|
||||
"integrity": "sha512-zyRGZQkjp5lgYYRUJS7hbEAhEtfslzwN5ScSnLXhaF2OEtiVC8LW+5mbaIqlFpIE95iFhukrKaLm0Rdt/w2lNg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"execa": "^5.0.0",
|
||||
@@ -9004,9 +9001,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/fs-extra": {
|
||||
"version": "10.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
|
||||
"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
|
||||
"version": "10.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz",
|
||||
"integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.0",
|
||||
@@ -13418,8 +13415,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/minimist": {
|
||||
"version": "1.2.5",
|
||||
"license": "MIT"
|
||||
"version": "1.2.6",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
|
||||
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
|
||||
},
|
||||
"node_modules/minimist-options": {
|
||||
"version": "4.1.0",
|
||||
@@ -17148,9 +17146,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/superstruct": {
|
||||
"version": "0.8.4",
|
||||
"resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.8.4.tgz",
|
||||
"integrity": "sha512-48Ors8IVWZm/tMr8r0Si6+mJiB7mkD7jqvIzktjJ4+EnP5tBp0qOpiM1J8sCUorKx+TXWrfb3i1UcjdD1YK/wA==",
|
||||
"version": "0.8.3",
|
||||
"resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.8.3.tgz",
|
||||
"integrity": "sha512-LbtbFpktW1FcwxVIJlxdk7bCyBq/GzOx2FSFLRLTUhWIA1gHkYPIl3aXRG5mBdGZtnPNT6t+4eEcLDCMOuBHww==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"kind-of": "^6.0.2",
|
||||
@@ -17432,9 +17430,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tiny-invariant": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz",
|
||||
"integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==",
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz",
|
||||
"integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/tinycolor2": {
|
||||
@@ -20198,9 +20196,9 @@
|
||||
}
|
||||
},
|
||||
"@babel/runtime": {
|
||||
"version": "7.17.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz",
|
||||
"integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==",
|
||||
"version": "7.17.8",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz",
|
||||
"integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==",
|
||||
"requires": {
|
||||
"regenerator-runtime": "^0.13.4"
|
||||
}
|
||||
@@ -20248,12 +20246,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"@bundle-stats/plugin-webpack-validate": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-validate/-/plugin-webpack-validate-3.1.3.tgz",
|
||||
"integrity": "sha512-8YPquB0+eoUoOtQGitVJGzPi6nhNBkar/IZH24UQflQWXjPlvwT3XJ9HNDDGWjdfUXWCWGOrEqMpoLtxYUxWpQ==",
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-validate/-/plugin-webpack-validate-3.3.0.tgz",
|
||||
"integrity": "sha512-D4a0Isn8EGXy4VcGEYrtKV/patFqMhXEH4BRsXUozBKd7GvRBp1BpFCuIon2UBARG+ZzNGCfVtGqyAdvHNL+Gw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"superstruct": "^0.8.3"
|
||||
"superstruct": "0.8.3"
|
||||
}
|
||||
},
|
||||
"@discoveryjs/json-ext": {
|
||||
@@ -21150,41 +21148,21 @@
|
||||
}
|
||||
},
|
||||
"@nextcloud/moment": {
|
||||
"version": "1.1.1",
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@nextcloud/moment/-/moment-1.2.0.tgz",
|
||||
"integrity": "sha512-HOnZqoYQg0eOQW369s5v7jZWmRNYCsadHnVjN+DSXQQ1n4fHKmr0EkdOFHJu1Br5Rd6Fxi4wRw7E7pD1CVZmgA==",
|
||||
"requires": {
|
||||
"@nextcloud/l10n": "1.2.0",
|
||||
"core-js": "3.6.4",
|
||||
"@nextcloud/l10n": "1.4.1",
|
||||
"core-js": "3.18.2",
|
||||
"jed": "^1.1.1",
|
||||
"moment": "2.24.0",
|
||||
"node-gettext": "^2.0.0"
|
||||
"moment": "2.29.1",
|
||||
"node-gettext": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nextcloud/l10n": {
|
||||
"version": "1.2.0",
|
||||
"requires": {
|
||||
"core-js": "^3.6.4",
|
||||
"node-gettext": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"node-gettext": {
|
||||
"version": "3.0.0",
|
||||
"requires": {
|
||||
"lodash.get": "^4.4.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"core-js": {
|
||||
"version": "3.6.4"
|
||||
},
|
||||
"moment": {
|
||||
"version": "2.24.0"
|
||||
},
|
||||
"node-gettext": {
|
||||
"version": "2.1.0",
|
||||
"requires": {
|
||||
"lodash.get": "^4.4.2"
|
||||
}
|
||||
"version": "3.18.2",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.2.tgz",
|
||||
"integrity": "sha512-zNhPOUoSgoizoSQFdX1MeZO16ORRb9FFQLts8gSYbZU5FcgXhp24iMWMxnOQo5uIaIG7/6FA/IqJPwev1o9ZXQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -21213,9 +21191,9 @@
|
||||
}
|
||||
},
|
||||
"@nextcloud/vue": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-5.0.0.tgz",
|
||||
"integrity": "sha512-hqfI3n3mebi7dlLUBjyBzIJQJTVjtFrCm49KYo2lQ/qDzBzOf5hrjwEEM3tnQIiPtHU8k24CnoSNqYto9XzERg==",
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-5.3.0.tgz",
|
||||
"integrity": "sha512-yRxEeQIgNHafvD2MC//BQXCkyyXiNQQZUGErlwOuuKpZbTX2BYTdvrN15On7rTqJNzwmwuzXAIPIFc0D8c2h+g==",
|
||||
"requires": {
|
||||
"@nextcloud/auth": "^1.2.3",
|
||||
"@nextcloud/axios": "^1.3.2",
|
||||
@@ -21228,7 +21206,7 @@
|
||||
"@nextcloud/logger": "^2.0.0",
|
||||
"@nextcloud/router": "^2.0.0",
|
||||
"debounce": "1.2.1",
|
||||
"emoji-mart-vue-fast": "^7.0.7",
|
||||
"emoji-mart-vue-fast": "^10.2.1",
|
||||
"escape-html": "^1.0.3",
|
||||
"hammerjs": "^2.0.8",
|
||||
"linkify-string": "^3.0.2",
|
||||
@@ -21240,7 +21218,7 @@
|
||||
"tributejs": "^5.1.3",
|
||||
"v-click-outside": "^3.0.1",
|
||||
"v-tooltip": "^2.0.3",
|
||||
"vue": "^2.6.11",
|
||||
"vue": "^2.6.14",
|
||||
"vue-color": "^2.7.1",
|
||||
"vue-material-design-icons": "^5.0.0",
|
||||
"vue-multiselect": "^2.1.6",
|
||||
@@ -21258,6 +21236,16 @@
|
||||
"resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.0.tgz",
|
||||
"integrity": "sha512-oGu2QekBMXgyQNWPDRQ001bjvDnZe4/zBTz37TMbiKz1NbNiyiH5hRkobe7npRN6GfbGbxMYFck/vQ1r9c1VMA=="
|
||||
},
|
||||
"emoji-mart-vue-fast": {
|
||||
"version": "10.2.1",
|
||||
"resolved": "https://registry.npmjs.org/emoji-mart-vue-fast/-/emoji-mart-vue-fast-10.2.1.tgz",
|
||||
"integrity": "sha512-PtKihhsXBEEw1jHwnoRyJAnJP1OlK4EJrEze58EbUUV7iHWGLub+yuiNSj2Uo1JBHraz4fw/pH98nFysVoe0qg==",
|
||||
"requires": {
|
||||
"@babel/polyfill": "^7.12.1",
|
||||
"@babel/runtime": "^7.16.3",
|
||||
"vue-virtual-scroller": "^1.0.10"
|
||||
}
|
||||
},
|
||||
"linkify-string": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/linkify-string/-/linkify-string-3.0.2.tgz",
|
||||
@@ -21528,51 +21516,57 @@
|
||||
}
|
||||
},
|
||||
"@relative-ci/agent": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@relative-ci/agent/-/agent-3.1.1.tgz",
|
||||
"integrity": "sha512-/6ElcpTRgA8fjzFiq/np4vLJVszKIE0OIbEgT/WwpW8GLyAkFS0guxMIqqUqivpypgEkj/E7u49yfDFwdYy24Q==",
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@relative-ci/agent/-/agent-3.1.2.tgz",
|
||||
"integrity": "sha512-whs+UCR21T3BeTzWmFTnV7O3NCCRj74BZSMWioIreshiWydaNfdbgEjdFCwnw74fiOR4jGP269oVkXt8TDs97g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@bundle-stats/plugin-webpack-filter": "^3.1.3",
|
||||
"@bundle-stats/plugin-webpack-validate": "^3.1.3",
|
||||
"core-js": "^3.6.4",
|
||||
"cosmiconfig": "^7.0.0",
|
||||
"debug": "^4.1.1",
|
||||
"dotenv": "^16.0.0",
|
||||
"env-ci": "^7.0.0",
|
||||
"fs-extra": "^10.0.0",
|
||||
"isomorphic-fetch": "^3.0.0",
|
||||
"lodash": "^4.17.15",
|
||||
"yargs": "^17.1.1"
|
||||
"@bundle-stats/plugin-webpack-filter": "3.3.0",
|
||||
"@bundle-stats/plugin-webpack-validate": "3.3.0",
|
||||
"core-js": "3.21.1",
|
||||
"cosmiconfig": "7.0.1",
|
||||
"debug": "4.3.3",
|
||||
"dotenv": "16.0.0",
|
||||
"env-ci": "7.1.0",
|
||||
"fs-extra": "10.0.1",
|
||||
"isomorphic-fetch": "3.0.0",
|
||||
"lodash": "4.17.21",
|
||||
"yargs": "17.3.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@bundle-stats/plugin-webpack-filter": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-filter/-/plugin-webpack-filter-3.1.3.tgz",
|
||||
"integrity": "sha512-KluPrsSm05jgFxAHO1sqU9ghoDO7XitLZ0pGiRvfU3+KAP+XxNh6I9AfaPJWTtb7vjCF+b46WynAmrOXc9AyFw==",
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-filter/-/plugin-webpack-filter-3.3.0.tgz",
|
||||
"integrity": "sha512-nf/B5Ry+Yw4zPDHj4OLmlj301zhW5rHe0EdGsLdsTHfgw1+0SQn/GZw8PSkJwj4tjuo3fb13mxM/DJjPu4UWpQ==",
|
||||
"dev": true,
|
||||
"requires": {}
|
||||
},
|
||||
"core-js": {
|
||||
"version": "3.16.2",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.2.tgz",
|
||||
"integrity": "sha512-P0KPukO6OjMpjBtHSceAZEWlDD1M2Cpzpg6dBbrjFqFhBHe/BwhxaP820xKOjRn/lZRQirrCusIpLS/n2sgXLQ==",
|
||||
"version": "3.21.1",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz",
|
||||
"integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==",
|
||||
"dev": true
|
||||
},
|
||||
"yargs": {
|
||||
"version": "17.2.1",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz",
|
||||
"integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==",
|
||||
"version": "17.3.1",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",
|
||||
"integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"cliui": "^7.0.2",
|
||||
"escalade": "^3.1.1",
|
||||
"get-caller-file": "^2.0.5",
|
||||
"require-directory": "^2.1.1",
|
||||
"string-width": "^4.2.0",
|
||||
"string-width": "^4.2.3",
|
||||
"y18n": "^5.0.5",
|
||||
"yargs-parser": "^20.2.2"
|
||||
"yargs-parser": "^21.0.0"
|
||||
}
|
||||
},
|
||||
"yargs-parser": {
|
||||
"version": "21.0.1",
|
||||
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
|
||||
"integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -24596,9 +24590,9 @@
|
||||
"peer": true
|
||||
},
|
||||
"env-ci": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/env-ci/-/env-ci-7.0.0.tgz",
|
||||
"integrity": "sha512-yR6deDT5+6I4i009Vqc2INpO7UWzqgB5sIrEUUcePGnQL6dwxNGDFeBMe8B/wD7FW6cJl/fXYtQwMdfkBII3OA==",
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/env-ci/-/env-ci-7.1.0.tgz",
|
||||
"integrity": "sha512-zyRGZQkjp5lgYYRUJS7hbEAhEtfslzwN5ScSnLXhaF2OEtiVC8LW+5mbaIqlFpIE95iFhukrKaLm0Rdt/w2lNg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"execa": "^5.0.0",
|
||||
@@ -25776,9 +25770,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"fs-extra": {
|
||||
"version": "10.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
|
||||
"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
|
||||
"version": "10.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz",
|
||||
"integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"graceful-fs": "^4.2.0",
|
||||
@@ -28919,7 +28913,9 @@
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.5"
|
||||
"version": "1.2.6",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
|
||||
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
|
||||
},
|
||||
"minimist-options": {
|
||||
"version": "4.1.0",
|
||||
@@ -31655,9 +31651,9 @@
|
||||
}
|
||||
},
|
||||
"superstruct": {
|
||||
"version": "0.8.4",
|
||||
"resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.8.4.tgz",
|
||||
"integrity": "sha512-48Ors8IVWZm/tMr8r0Si6+mJiB7mkD7jqvIzktjJ4+EnP5tBp0qOpiM1J8sCUorKx+TXWrfb3i1UcjdD1YK/wA==",
|
||||
"version": "0.8.3",
|
||||
"resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.8.3.tgz",
|
||||
"integrity": "sha512-LbtbFpktW1FcwxVIJlxdk7bCyBq/GzOx2FSFLRLTUhWIA1gHkYPIl3aXRG5mBdGZtnPNT6t+4eEcLDCMOuBHww==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^6.0.2",
|
||||
@@ -31871,9 +31867,9 @@
|
||||
}
|
||||
},
|
||||
"tiny-invariant": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz",
|
||||
"integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==",
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz",
|
||||
"integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==",
|
||||
"dev": true
|
||||
},
|
||||
"tinycolor2": {
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/polyfill": "^7.12.1",
|
||||
"@babel/runtime": "^7.17.2",
|
||||
"@babel/runtime": "^7.17.8",
|
||||
"@juliushaertl/vue-richtext": "^1.0.1",
|
||||
"@nextcloud/auth": "^1.3.0",
|
||||
"@nextcloud/axios": "^1.9.0",
|
||||
@@ -38,9 +38,9 @@
|
||||
"@nextcloud/files": "^2.1.0",
|
||||
"@nextcloud/initial-state": "^1.2.1",
|
||||
"@nextcloud/l10n": "^1.4.1",
|
||||
"@nextcloud/moment": "^1.1.1",
|
||||
"@nextcloud/moment": "^1.2.0",
|
||||
"@nextcloud/router": "^2.0.0",
|
||||
"@nextcloud/vue": "^5.0.0",
|
||||
"@nextcloud/vue": "^5.3.0",
|
||||
"@nextcloud/vue-dashboard": "^2.0.1",
|
||||
"blueimp-md5": "^2.19.0",
|
||||
"dompurify": "^2.3.6",
|
||||
@@ -75,7 +75,7 @@
|
||||
"@nextcloud/eslint-config": "^6.1.2",
|
||||
"@nextcloud/stylelint-config": "^2.1.2",
|
||||
"@nextcloud/webpack-vue-config": "^5.0.0",
|
||||
"@relative-ci/agent": "^3.1.1",
|
||||
"@relative-ci/agent": "^3.1.2",
|
||||
"@vue/test-utils": "^1.3.0",
|
||||
"jest": "^27.5.1",
|
||||
"jest-serializer-vue": "^2.0.2",
|
||||
|
||||
@@ -45,4 +45,7 @@ export default {
|
||||
#app-sidebar .icon-close {
|
||||
z-index: 100;
|
||||
}
|
||||
.app-deck .app-sidebar {
|
||||
z-index: 20000 !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -77,6 +77,7 @@ import Controls from '../Controls'
|
||||
import Stack from './Stack'
|
||||
import { EmptyContent } from '@nextcloud/vue'
|
||||
import GlobalSearchResults from '../search/GlobalSearchResults'
|
||||
import { showError } from '../../helpers/errors'
|
||||
|
||||
export default {
|
||||
name: 'Board',
|
||||
@@ -139,6 +140,7 @@ export default {
|
||||
await this.$store.dispatch('loadStacks', this.id)
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
showError(e)
|
||||
}
|
||||
this.loading = false
|
||||
},
|
||||
|
||||
@@ -53,6 +53,9 @@
|
||||
<ActionCheckbox v-if="canManage" :checked="acl.permissionManage" @change="clickManageAcl(acl)">
|
||||
{{ t('deck', 'Can manage') }}
|
||||
</ActionCheckbox>
|
||||
<ActionCheckbox v-if="acl.type === 0 && isCurrentUser(board.owner.uid)" :checked="acl.owner" @change="clickTransferOwner(acl.participant.uid)">
|
||||
{{ t('deck', 'Owner') }}
|
||||
</ActionCheckbox>
|
||||
<ActionButton v-if="canManage" icon="icon-delete" @click="clickDeleteAcl(acl)">
|
||||
{{ t('deck', 'Delete') }}
|
||||
</ActionButton>
|
||||
@@ -72,7 +75,7 @@ import { Avatar, Multiselect, Actions, ActionButton, ActionCheckbox } from '@nex
|
||||
import { CollectionList } from 'nextcloud-vue-collections'
|
||||
import { mapGetters, mapState } from 'vuex'
|
||||
import { getCurrentUser } from '@nextcloud/auth'
|
||||
import { showError } from '@nextcloud/dialogs'
|
||||
import { showError, showSuccess } from '@nextcloud/dialogs'
|
||||
import debounce from 'lodash/debounce'
|
||||
|
||||
export default {
|
||||
@@ -97,6 +100,7 @@ export default {
|
||||
isSearching: false,
|
||||
addAcl: null,
|
||||
addAclForAPI: null,
|
||||
newOwner: null,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -194,6 +198,38 @@ export default {
|
||||
clickDeleteAcl(acl) {
|
||||
this.$store.dispatch('deleteAclFromCurrentBoard', acl)
|
||||
},
|
||||
clickTransferOwner(newOwner) {
|
||||
OC.dialogs.confirmDestructive(
|
||||
t('deck', 'Are you sure you want to transfer the board {title} for {user}?', { title: this.board.title, user: newOwner }),
|
||||
t('deck', 'Transfer the board.'),
|
||||
{
|
||||
type: OC.dialogs.YES_NO_BUTTONS,
|
||||
confirm: t('deck', 'Transfer'),
|
||||
confirmClasses: 'error',
|
||||
cancel: t('deck', 'Cancel'),
|
||||
},
|
||||
async (result) => {
|
||||
if (result) {
|
||||
try {
|
||||
this.isLoading = true
|
||||
await this.$store.dispatch('transferOwnership', {
|
||||
boardId: this.board.id,
|
||||
newOwner
|
||||
})
|
||||
const successMessage = t('deck', 'Transfer the board for {user} successfully', { user: newOwner })
|
||||
showSuccess(successMessage)
|
||||
this.$router.push({ name: 'main' })
|
||||
} catch (e) {
|
||||
const errorMessage = t('deck', 'Failed to transfer the board for {user}', { user: newOwner.user })
|
||||
showError(errorMessage)
|
||||
} finally {
|
||||
this.isLoading = false
|
||||
}
|
||||
}
|
||||
},
|
||||
true
|
||||
)
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -250,8 +250,6 @@ export default {
|
||||
|
||||
&::v-deep .attachment-list {
|
||||
flex-shrink: 1;
|
||||
overflow: scroll;
|
||||
max-height: 50vh;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
boardsSorted() {
|
||||
return [...this.boards].sort((a, b) => (a.title < b.title) ? -1 : 1)
|
||||
return [...this.boards].sort((a, b) => a.title.localeCompare(b.title))
|
||||
},
|
||||
collapsible() {
|
||||
return this.boards.length > 0
|
||||
|
||||
27
src/helpers/errors.js
Normal file
27
src/helpers/errors.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import { showError as errorDialog } from '@nextcloud/dialogs'
|
||||
|
||||
const showAxiosError = err => {
|
||||
const response = err?.response || {}
|
||||
const message = response?.data.message
|
||||
|
||||
if (message) {
|
||||
errorDialog(message)
|
||||
return
|
||||
}
|
||||
|
||||
errorDialog(err.message)
|
||||
}
|
||||
|
||||
const showError = err => {
|
||||
// axios error
|
||||
if (err.response) {
|
||||
showAxiosError(err)
|
||||
return
|
||||
}
|
||||
|
||||
errorDialog(err.message)
|
||||
}
|
||||
|
||||
export {
|
||||
showError,
|
||||
}
|
||||
@@ -45,7 +45,7 @@ window.addEventListener('DOMContentLoaded', () => {
|
||||
window.OCP.Collaboration.registerType('deck', {
|
||||
action: () => {
|
||||
const BoardSelector = () => import('./BoardSelector')
|
||||
buildSelector(BoardSelector)
|
||||
return buildSelector(BoardSelector)
|
||||
},
|
||||
typeString: t('deck', 'Link to a board'),
|
||||
typeIconClass: 'icon-deck',
|
||||
@@ -54,7 +54,7 @@ window.addEventListener('DOMContentLoaded', () => {
|
||||
window.OCP.Collaboration.registerType('deck-card', {
|
||||
action: () => {
|
||||
const CardSelector = () => import('./CardSelector')
|
||||
buildSelector(CardSelector)
|
||||
return buildSelector(CardSelector)
|
||||
},
|
||||
typeString: t('deck', 'Link to a card'),
|
||||
typeIconClass: 'icon-deck',
|
||||
|
||||
11
src/main.js
11
src/main.js
@@ -63,6 +63,17 @@ Vue.config.errorHandler = (err, vm, info) => {
|
||||
console.error(err)
|
||||
}
|
||||
|
||||
// TODO: remove when we have a proper fileinfo standalone library
|
||||
// original scripts are loaded from
|
||||
// https://github.com/nextcloud/server/blob/5bf3d1bb384da56adbf205752be8f840aac3b0c5/lib/private/legacy/template.php#L120-L122
|
||||
window.addEventListener('DOMContentLoaded', () => {
|
||||
if (!window.OCA.Files) {
|
||||
window.OCA.Files = {}
|
||||
}
|
||||
// register unused client for the sidebar to have access to its parser methods
|
||||
Object.assign(window.OCA.Files, { App: { fileList: { filesClient: OC.Files.getClient() } } }, window.OCA.Files)
|
||||
})
|
||||
|
||||
/* eslint-disable-next-line no-new */
|
||||
new Vue({
|
||||
el: '#content',
|
||||
|
||||
@@ -26,7 +26,7 @@ import { loadState } from '@nextcloud/initial-state'
|
||||
import Vue from 'vue'
|
||||
import Vuex from 'vuex'
|
||||
import axios from '@nextcloud/axios'
|
||||
import { generateOcsUrl } from '@nextcloud/router'
|
||||
import { generateOcsUrl, generateUrl } from '@nextcloud/router'
|
||||
import { BoardApi } from '../services/BoardApi'
|
||||
import actions from './actions'
|
||||
import stack from './stack'
|
||||
@@ -486,5 +486,11 @@ export default new Vuex.Store({
|
||||
dispatch('loadBoardById', acl.boardId)
|
||||
})
|
||||
},
|
||||
async transferOwnership({ commit }, { boardId, owner, newOwner }) {
|
||||
await axios.put(generateUrl(`apps/deck/boards/${boardId}/transferOwner`), {
|
||||
owner,
|
||||
newOwner,
|
||||
})
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
314
tests/integration/database/TransferOwnershipTest.php
Normal file
314
tests/integration/database/TransferOwnershipTest.php
Normal file
@@ -0,0 +1,314 @@
|
||||
<?php
|
||||
|
||||
namespace OCA\Deck\Service;
|
||||
|
||||
use OCA\Deck\Db\Acl;
|
||||
use OCA\Deck\Db\Assignment;
|
||||
use OCA\Deck\Db\AssignmentMapper;
|
||||
use OCA\Deck\Db\Board;
|
||||
use OCA\Deck\Db\Card;
|
||||
|
||||
/**
|
||||
* @group DB
|
||||
* @coversDefaultClass \OCA\Deck\Service\BoardService
|
||||
*/
|
||||
class TransferOwnershipTest extends \Test\TestCase {
|
||||
private const TEST_USER_1 = 'test-share-user1';
|
||||
private const TEST_USER_2 = 'test-user2';
|
||||
private const TEST_USER_3 = 'test-user3';
|
||||
private const TEST_GROUP = 'test-share-user1';
|
||||
|
||||
/** @var BoardService */
|
||||
protected $boardService;
|
||||
/** @var CardService */
|
||||
protected $cardService;
|
||||
/** @var StackService */
|
||||
protected $stackService;
|
||||
/** @var AssignmentMapper */
|
||||
protected $assignmentMapper;
|
||||
/** @var AssignmentService */
|
||||
private $assignmentService;
|
||||
/** @var Board */
|
||||
private $board;
|
||||
private $cards;
|
||||
private $stacks;
|
||||
|
||||
public static function setUpBeforeClass(): void {
|
||||
parent::setUpBeforeClass();
|
||||
|
||||
$backend = new \Test\Util\User\Dummy();
|
||||
\OC_User::useBackend($backend);
|
||||
\OC::$server->getUserManager()->registerBackend($backend);
|
||||
$backend->createUser(self::TEST_USER_1, self::TEST_USER_1);
|
||||
$backend->createUser(self::TEST_USER_2, self::TEST_USER_2);
|
||||
$backend->createUser(self::TEST_USER_3, self::TEST_USER_3);
|
||||
// create group
|
||||
$groupBackend = new \Test\Util\Group\Dummy();
|
||||
$groupBackend->createGroup(self::TEST_GROUP);
|
||||
$groupBackend->addToGroup(self::TEST_USER_1, self::TEST_GROUP);
|
||||
\OC::$server->getGroupManager()->addBackend($groupBackend);
|
||||
}
|
||||
|
||||
public function setUp(): void {
|
||||
parent::setUp();
|
||||
\OC::$server->getUserSession()->login(self::TEST_USER_1, self::TEST_USER_1);
|
||||
$this->boardService = \OC::$server->query(BoardService::class);
|
||||
$this->stackService = \OC::$server->query(StackService::class);
|
||||
$this->cardService = \OC::$server->query(CardService::class);
|
||||
$this->assignmentService = \OC::$server->query(AssignmentService::class);
|
||||
$this->assignmentMapper = \OC::$server->query(AssignmentMapper::class);
|
||||
$this->createBoardWithExampleData();
|
||||
}
|
||||
|
||||
public function createBoardWithExampleData() {
|
||||
$stacks = [];
|
||||
$board = $this->boardService->create('Test', self::TEST_USER_1, '000000');
|
||||
$id = $board->getId();
|
||||
$this->boardService->addAcl($id, Acl::PERMISSION_TYPE_GROUP, self::TEST_GROUP, true, true, true);
|
||||
$this->boardService->addAcl($id, Acl::PERMISSION_TYPE_USER, self::TEST_USER_3, false, true, false);
|
||||
$stacks[] = $this->stackService->create('Stack A', $id, 1);
|
||||
$stacks[] = $this->stackService->create('Stack B', $id, 1);
|
||||
$stacks[] = $this->stackService->create('Stack C', $id, 1);
|
||||
$cards[] = $this->cardService->create('Card 1', $stacks[0]->getId(), 'text', 0, self::TEST_USER_1);
|
||||
$cards[] = $this->cardService->create('Card 2', $stacks[0]->getId(), 'text', 0, self::TEST_USER_1);
|
||||
$this->assignmentService->assignUser($cards[0]->getId(), self::TEST_USER_1);
|
||||
$this->board = $board;
|
||||
$this->cards = $cards;
|
||||
$this->stacks = $stacks;
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testTransferBoardOwnership() {
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2));
|
||||
$board = $this->boardService->find($this->board->getId());
|
||||
$boardOwner = $board->getOwner();
|
||||
$this->assertEquals(self::TEST_USER_2, $boardOwner);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testTransferBoardOwnershipWithData() {
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2));
|
||||
$board = $this->boardService->find($this->board->getId());
|
||||
|
||||
$boardOwner = $board->getOwner();
|
||||
$this->assertEquals(self::TEST_USER_2, $boardOwner);
|
||||
|
||||
$cards = $this->cards;
|
||||
$newOwnerOwnsTheCards = (bool)array_product(array_filter($cards, function (Card $card) {
|
||||
$cardUpdated = $this->cardService->find($card->getId());
|
||||
return $cardUpdated->getOwner() === self::TEST_USER_2;
|
||||
}));
|
||||
$this->assertTrue($newOwnerOwnsTheCards);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testTransferACLOwnership() {
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2, true));
|
||||
$board = $this->boardService->find($this->board->getId());
|
||||
$acl = $board->getAcl();
|
||||
$this->assertBoardDoesNotHaveAclUser($board, self::TEST_USER_1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testTransferACLOwnershipPreserveOwner() {
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2, false));
|
||||
$board = $this->boardService->find($this->board->getId());
|
||||
$acl = $board->getAcl();
|
||||
$this->assertBoardHasAclUser($board, self::TEST_USER_1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testNoTransferAclOwnershipIfGroupType() {
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2));
|
||||
$board = $this->boardService->find($this->board->getId());
|
||||
$acl = $board->getAcl();
|
||||
$isGroupInAcl = (bool)array_filter($acl, function ($item) {
|
||||
return $item->getParticipant() === self::TEST_GROUP && $item->getType() === Acl::PERMISSION_TYPE_GROUP;
|
||||
});
|
||||
$this->assertTrue($isGroupInAcl);
|
||||
}
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testTransferCardOwnership() {
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2, true));
|
||||
$card = $this->cardService->find($this->cards[0]->getId());
|
||||
$cardOwner = $card->getOwner();
|
||||
$this->assertEquals(self::TEST_USER_2, $cardOwner);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testTransferPreserveCardOwnership() {
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2, false));
|
||||
$card = $this->cardService->find($this->cards[0]->getId());
|
||||
$cardOwner = $card->getOwner();
|
||||
$this->assertEquals(self::TEST_USER_1, $cardOwner);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testReassignCardToNewOwner() {
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2, true));
|
||||
$participantsUIDs = array_map(function ($user) {
|
||||
return $user->getParticipant();
|
||||
}, $this->assignmentMapper->findAll($this->cards[0]->getId()));
|
||||
$this->assertContains(self::TEST_USER_2, $participantsUIDs);
|
||||
$this->assertNotContains(self::TEST_USER_1, $participantsUIDs);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testNoReassignCardToNewOwner() {
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2, false));
|
||||
$participantsUIDs = array_map(function ($user) {
|
||||
return $user->getParticipant();
|
||||
}, $this->assignmentMapper->findAll($this->cards[0]->getId()));
|
||||
$this->assertContains(self::TEST_USER_1, $participantsUIDs);
|
||||
$this->assertNotContains(self::TEST_USER_2, $participantsUIDs);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testReassignCardToNewParticipantOnlyIfParticipantHasUserType() {
|
||||
$this->assignmentService->assignUser($this->cards[1]->getId(), self::TEST_USER_1, Assignment::TYPE_GROUP);
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2));
|
||||
$participantsUIDs = array_map(function ($user) {
|
||||
return $user->getParticipant();
|
||||
}, $this->assignmentMapper->findAll($this->cards[1]->getId()));
|
||||
$this->assertContains(self::TEST_USER_1, $participantsUIDs);
|
||||
$this->assertNotContains(self::TEST_USER_2, $participantsUIDs);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testTargetAlreadyParticipantOfBoard() {
|
||||
$this->expectNotToPerformAssertions();
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_3));
|
||||
}
|
||||
|
||||
private function assertBoardHasAclUser($board, $userId) {
|
||||
$hasUser = (bool)array_filter($board->getAcl(), function ($item) use ($userId) {
|
||||
return $item->getParticipant() === $userId && $item->getType() === Acl::PERMISSION_TYPE_USER;
|
||||
});
|
||||
self::assertTrue($hasUser, 'user ' . $userId . ' should be in the board acl list');
|
||||
}
|
||||
|
||||
private function assertBoardDoesNotHaveAclUser($board, $userId) {
|
||||
$hasUser = (bool)array_filter($board->getAcl(), function ($item) use ($userId) {
|
||||
return $item->getParticipant() === $userId && $item->getType() === Acl::PERMISSION_TYPE_USER;
|
||||
});
|
||||
self::assertFalse($hasUser, 'user ' . $userId . ' should not be in the board acl list');
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testDontRemoveOldOwnerFromAcl() {
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2));
|
||||
$board = $this->boardService->find($this->board->getId());
|
||||
|
||||
$this->assertBoardDoesNotHaveAclUser($board, self::TEST_USER_2);
|
||||
$this->assertBoardHasAclUser($board, self::TEST_USER_3);
|
||||
$this->assertBoardHasAclUser($board, self::TEST_USER_1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testRemoveOldOwnerFromAclForChange() {
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_2, true));
|
||||
$board = $this->boardService->find($this->board->getId());
|
||||
$this->assertBoardDoesNotHaveAclUser($board, self::TEST_USER_2);
|
||||
$this->assertBoardHasAclUser($board, self::TEST_USER_3);
|
||||
$this->assertBoardDoesNotHaveAclUser($board, self::TEST_USER_1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testMergePermissions() {
|
||||
$this->boardService->addAcl($this->board->getId(), Acl::PERMISSION_TYPE_USER, self::TEST_USER_2, true, false, true);
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_3));
|
||||
$board = $this->boardService->find($this->board->getId());
|
||||
$acl = $board->getAcl();
|
||||
$isMerged = (bool)array_filter($acl, function ($item) {
|
||||
return $item->getParticipant() === self::TEST_USER_1
|
||||
&& $item->getType() === Acl::PERMISSION_TYPE_USER
|
||||
&& $item->getPermission(Acl::PERMISSION_EDIT)
|
||||
&& $item->getPermission(Acl::PERMISSION_SHARE)
|
||||
&& $item->getPermission(Acl::PERMISSION_MANAGE);
|
||||
});
|
||||
$this->assertTrue($isMerged);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testTargetAlreadyParticipantOfCard() {
|
||||
$this->expectNotToPerformAssertions();
|
||||
$this->assignmentService->assignUser($this->cards[0]->getId(), self::TEST_USER_3, Assignment::TYPE_USER);
|
||||
iterator_to_array($this->boardService->transferOwnership(self::TEST_USER_1, self::TEST_USER_3));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::transferOwnership
|
||||
*/
|
||||
public function testTransferSingleBoardAssignment() {
|
||||
// Arrange separate board next to the one being transferred
|
||||
$board = $this->boardService->create('Test 2', self::TEST_USER_1, '000000');
|
||||
$id = $board->getId();
|
||||
$this->boardService->addAcl($id, Acl::PERMISSION_TYPE_USER, self::TEST_USER_1, true, true, true);
|
||||
$this->boardService->addAcl($id, Acl::PERMISSION_TYPE_GROUP, self::TEST_GROUP, true, true, true);
|
||||
$this->boardService->addAcl($id, Acl::PERMISSION_TYPE_USER, self::TEST_USER_3, false, true, false);
|
||||
$stacks[] = $this->stackService->create('Stack A', $id, 1);
|
||||
$stacks[] = $this->stackService->create('Stack B', $id, 1);
|
||||
$stacks[] = $this->stackService->create('Stack C', $id, 1);
|
||||
$cards[] = $this->cardService->create('Card 1', $stacks[0]->getId(), 'text', 0, self::TEST_USER_1);
|
||||
$cards[] = $this->cardService->create('Card 2', $stacks[0]->getId(), 'text', 0, self::TEST_USER_1);
|
||||
$this->assignmentService->assignUser($cards[0]->getId(), self::TEST_USER_1);
|
||||
|
||||
// Act
|
||||
$this->boardService->transferBoardOwnership($this->board->getId(), self::TEST_USER_2, true);
|
||||
|
||||
// Assert that the selected board was transferred
|
||||
$card = $this->cardService->find($this->cards[0]->getId());
|
||||
$this->assertEquals(self::TEST_USER_2, $card->getOwner());
|
||||
|
||||
$participantsUIDs = array_map(function ($assignment) {
|
||||
return $assignment->getParticipant();
|
||||
}, $this->assignmentMapper->findAll($this->cards[0]->getId()));
|
||||
$this->assertContains(self::TEST_USER_2, $participantsUIDs);
|
||||
$this->assertNotContains(self::TEST_USER_1, $participantsUIDs);
|
||||
|
||||
// Assert that other board remained unchanged
|
||||
$card = $this->cardService->find($cards[0]->getId());
|
||||
$this->assertEquals(self::TEST_USER_1, $card->getOwner());
|
||||
|
||||
$participantsUIDs = array_map(function ($assignment) {
|
||||
return $assignment->getParticipant();
|
||||
}, $this->assignmentMapper->findAll($cards[0]->getId()));
|
||||
$this->assertContains(self::TEST_USER_1, $participantsUIDs);
|
||||
$this->assertNotContains(self::TEST_USER_2, $participantsUIDs);
|
||||
}
|
||||
|
||||
public function tearDown(): void {
|
||||
$this->boardService->deleteForce($this->board->getId());
|
||||
parent::tearDown();
|
||||
}
|
||||
}
|
||||
@@ -26,7 +26,7 @@ composer dump-autoload
|
||||
if [ -z "$EXECUTOR_NUMBER" ]; then
|
||||
EXECUTOR_NUMBER=0
|
||||
fi
|
||||
PORT=$((8080 + $EXECUTOR_NUMBER))
|
||||
PORT=$((9090 + $EXECUTOR_NUMBER))
|
||||
echo $PORT
|
||||
php -S localhost:$PORT -t $OC_PATH &
|
||||
PHPPID=$!
|
||||
|
||||
@@ -26,7 +26,6 @@ namespace OCA\Deck\Activity;
|
||||
use OCA\Deck\Db\AclMapper;
|
||||
use OCA\Deck\Db\Assignment;
|
||||
use OCA\Deck\Db\Attachment;
|
||||
use OCA\Deck\Db\AttachmentMapper;
|
||||
use OCA\Deck\Db\Board;
|
||||
use OCA\Deck\Db\BoardMapper;
|
||||
use OCA\Deck\Db\Card;
|
||||
@@ -41,7 +40,7 @@ use OCP\IL10N;
|
||||
use OCP\IUser;
|
||||
use OCP\L10N\IFactory;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use PHPUnit_Framework_MockObject_MockObject as MockObject;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
|
||||
class ActivityManagerTest extends TestCase {
|
||||
|
||||
@@ -57,8 +56,6 @@ class ActivityManagerTest extends TestCase {
|
||||
private $cardMapper;
|
||||
/** @var StackMapper|MockObject */
|
||||
private $stackMapper;
|
||||
/** @var AttachmentMapper|MockObject */
|
||||
private $attachmentMapper;
|
||||
/** @var AclMapper|MockObject */
|
||||
private $aclMapper;
|
||||
/** @var IFactory|MockObject */
|
||||
@@ -74,7 +71,6 @@ class ActivityManagerTest extends TestCase {
|
||||
$this->boardMapper = $this->createMock(BoardMapper::class);
|
||||
$this->cardMapper = $this->createMock(CardMapper::class);
|
||||
$this->stackMapper = $this->createMock(StackMapper::class);
|
||||
$this->attachmentMapper = $this->createMock(AttachmentMapper::class);
|
||||
$this->aclMapper = $this->createMock(AclMapper::class);
|
||||
$this->l10nFactory = $this->createMock(IFactory::class);
|
||||
$this->l10n = $this->createMock(IL10N::class);
|
||||
@@ -84,7 +80,6 @@ class ActivityManagerTest extends TestCase {
|
||||
$this->boardMapper,
|
||||
$this->cardMapper,
|
||||
$this->stackMapper,
|
||||
$this->attachmentMapper,
|
||||
$this->aclMapper,
|
||||
$this->l10nFactory,
|
||||
$this->userId
|
||||
@@ -93,7 +88,7 @@ class ActivityManagerTest extends TestCase {
|
||||
|
||||
public function testGetActivityFormatOwn() {
|
||||
$managerClass = new \ReflectionClass(ActivityManager::class);
|
||||
$this->l10n->expects($this->any())
|
||||
$this->l10n->expects(self::any())
|
||||
->method('t')
|
||||
->will($this->returnCallback(function ($s) {
|
||||
return $s;
|
||||
@@ -122,22 +117,29 @@ class ActivityManagerTest extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
private function expectEventCreation($subject, $subjectParams) {
|
||||
$event = $this->createMock(IEvent::class);
|
||||
$this->manager->expects(self::once())
|
||||
->method('generateEvent')
|
||||
->willReturn($event);
|
||||
$event->expects(self::once())->method('setApp')->willReturn($event);
|
||||
$event->expects(self::once())->method('setType')->willReturn($event);
|
||||
$event->expects(self::once())->method('setAuthor')->willReturn($event);
|
||||
$event->expects(self::once())->method('setObject')->willReturn($event);
|
||||
$event->expects(self::once())->method('setSubject')->with($subject, $subjectParams)->willReturn($event);
|
||||
$event->expects(self::once())->method('setTimestamp')->willReturn($event);
|
||||
return $event;
|
||||
}
|
||||
|
||||
public function testCreateEvent() {
|
||||
$board = new Board();
|
||||
$board->setTitle('');
|
||||
$this->boardMapper->expects($this->once())
|
||||
$this->boardMapper->expects(self::once())
|
||||
->method('find')
|
||||
->willReturn($board);
|
||||
$event = $this->createMock(IEvent::class);
|
||||
$this->manager->expects($this->once())
|
||||
->method('generateEvent')
|
||||
->willReturn($event);
|
||||
$event->expects($this->once())->method('setApp')->willReturn($event);
|
||||
$event->expects($this->once())->method('setType')->willReturn($event);
|
||||
$event->expects($this->once())->method('setAuthor')->willReturn($event);
|
||||
$event->expects($this->once())->method('setObject')->willReturn($event);
|
||||
$event->expects($this->once())->method('setSubject')->willReturn($event);
|
||||
$event->expects($this->once())->method('setTimestamp')->willReturn($event);
|
||||
$event = $this->expectEventCreation(ActivityManager::SUBJECT_BOARD_CREATE, [
|
||||
'author' => 'admin'
|
||||
]);
|
||||
$actual = $this->invokePrivate($this->activityManager, 'createEvent', [
|
||||
ActivityManager::DECK_OBJECT_BOARD,
|
||||
$board,
|
||||
@@ -146,6 +148,133 @@ class ActivityManagerTest extends TestCase {
|
||||
$this->assertEquals($event, $actual);
|
||||
}
|
||||
|
||||
public function testCreateEventDescription() {
|
||||
$board = new Board();
|
||||
$board->setTitle('');
|
||||
$this->boardMapper->expects(self::once())
|
||||
->method('find')
|
||||
->willReturn($board);
|
||||
|
||||
$card = Card::fromRow([
|
||||
'id' => 123,
|
||||
'title' => 'My card',
|
||||
'description' => str_repeat('A', 1000),
|
||||
]);
|
||||
$this->cardMapper->expects(self::any())
|
||||
->method('find')
|
||||
->willReturn($card);
|
||||
|
||||
$stack = Stack::fromRow([]);
|
||||
$this->stackMapper->expects(self::any())
|
||||
->method('find')
|
||||
->willReturn($stack);
|
||||
|
||||
$expectedCard = $card->jsonSerialize();
|
||||
unset($expectedCard['description']);
|
||||
$event = $this->expectEventCreation(ActivityManager::SUBJECT_CARD_UPDATE_DESCRIPTION, [
|
||||
'card' => $expectedCard,
|
||||
'stack' => $stack->jsonSerialize(),
|
||||
'board' => $board->jsonSerialize(),
|
||||
'diff' => true,
|
||||
'author' => 'admin',
|
||||
'after' => str_repeat('C', 2000),
|
||||
]);
|
||||
|
||||
$actual = $this->invokePrivate($this->activityManager, 'createEvent', [
|
||||
ActivityManager::DECK_OBJECT_CARD,
|
||||
$card,
|
||||
ActivityManager::SUBJECT_CARD_UPDATE_DESCRIPTION,
|
||||
[
|
||||
'before' => str_repeat('B', 2000),
|
||||
'after' => str_repeat('C', 2000)
|
||||
],
|
||||
]);
|
||||
$this->assertEquals($event, $actual);
|
||||
}
|
||||
|
||||
public function testCreateEventLongDescription() {
|
||||
$board = new Board();
|
||||
$board->setTitle('');
|
||||
$this->boardMapper->expects(self::once())
|
||||
->method('find')
|
||||
->willReturn($board);
|
||||
|
||||
$card = new Card();
|
||||
$card->setDescription(str_repeat('A', 5000));
|
||||
$card->setTitle('My card');
|
||||
$card->setId(123);
|
||||
$this->cardMapper->expects(self::any())
|
||||
->method('find')
|
||||
->willReturn($card);
|
||||
|
||||
$stack = new Stack();
|
||||
$this->stackMapper->expects(self::any())
|
||||
->method('find')
|
||||
->willReturn($stack);
|
||||
|
||||
$expectedCard = $card->jsonSerialize();
|
||||
unset($expectedCard['description']);
|
||||
$event = $this->expectEventCreation(ActivityManager::SUBJECT_CARD_UPDATE_DESCRIPTION, [
|
||||
'card' => $expectedCard,
|
||||
'stack' => $stack->jsonSerialize(),
|
||||
'board' => $board->jsonSerialize(),
|
||||
'diff' => true,
|
||||
'author' => 'admin',
|
||||
'after' => str_repeat('C', 2000) . '...',
|
||||
]);
|
||||
|
||||
$actual = $this->invokePrivate($this->activityManager, 'createEvent', [
|
||||
ActivityManager::DECK_OBJECT_CARD,
|
||||
$card,
|
||||
ActivityManager::SUBJECT_CARD_UPDATE_DESCRIPTION,
|
||||
[
|
||||
'before' => str_repeat('B', 5000),
|
||||
'after' => str_repeat('C', 5000)
|
||||
],
|
||||
]);
|
||||
$this->assertEquals($event, $actual);
|
||||
}
|
||||
|
||||
public function testCreateEventLabel() {
|
||||
$board = Board::fromRow([
|
||||
'title' => 'My board'
|
||||
]);
|
||||
$this->boardMapper->expects(self::once())
|
||||
->method('find')
|
||||
->willReturn($board);
|
||||
|
||||
$card = Card::fromParams([]);
|
||||
$card->setDescription(str_repeat('A', 5000));
|
||||
$card->setTitle('My card');
|
||||
$card->setId(123);
|
||||
$this->cardMapper->expects(self::any())
|
||||
->method('find')
|
||||
->willReturn($card);
|
||||
|
||||
$stack = Stack::fromParams([]);
|
||||
$this->stackMapper->expects(self::any())
|
||||
->method('find')
|
||||
->willReturn($stack);
|
||||
|
||||
$event = $this->expectEventCreation(ActivityManager::SUBJECT_CARD_UPDATE_TITLE, [
|
||||
'card' => [
|
||||
'id' => 123,
|
||||
'title' => 'My card',
|
||||
'archived' => false,
|
||||
],
|
||||
'stack' => $stack,
|
||||
'board' => $board,
|
||||
'author' => 'admin',
|
||||
]);
|
||||
|
||||
$actual = $this->invokePrivate($this->activityManager, 'createEvent', [
|
||||
ActivityManager::DECK_OBJECT_CARD,
|
||||
$card,
|
||||
ActivityManager::SUBJECT_CARD_UPDATE_TITLE
|
||||
]);
|
||||
$this->assertEquals($event, $actual);
|
||||
}
|
||||
|
||||
public function dataSendToUsers() {
|
||||
return [
|
||||
[ActivityManager::DECK_OBJECT_BOARD],
|
||||
@@ -155,7 +284,7 @@ class ActivityManagerTest extends TestCase {
|
||||
|
||||
private function mockUser($uid) {
|
||||
$user = $this->createMock(IUser::class);
|
||||
$user->expects($this->any())
|
||||
$user->expects(self::any())
|
||||
->method('getUID')
|
||||
->willReturn($uid);
|
||||
return $user;
|
||||
@@ -169,18 +298,21 @@ class ActivityManagerTest extends TestCase {
|
||||
$this->mockUser('user2'),
|
||||
];
|
||||
$event = $this->createMock(IEvent::class);
|
||||
$event->expects($this->at(0))
|
||||
|
||||
$event->expects(self::once())
|
||||
->method('getObjectType')
|
||||
->willReturn($objectType);
|
||||
$event->expects($this->at(0))
|
||||
$event->expects(self::once())
|
||||
->method('getObjectId')
|
||||
->willReturn(1);
|
||||
$event->expects($this->at(2))
|
||||
$event->expects(self::exactly(2))
|
||||
->method('setAffectedUser')
|
||||
->with('user1');
|
||||
$event->expects($this->at(3))
|
||||
->method('setAffectedUser')
|
||||
->with('user2');
|
||||
->withConsecutive(
|
||||
['user1'],
|
||||
['user2'],
|
||||
)
|
||||
->willReturnSelf();
|
||||
|
||||
$mapper = null;
|
||||
switch ($objectType) {
|
||||
case ActivityManager::DECK_OBJECT_BOARD:
|
||||
@@ -190,16 +322,14 @@ class ActivityManagerTest extends TestCase {
|
||||
$mapper = $this->cardMapper;
|
||||
break;
|
||||
}
|
||||
$mapper->expects($this->once())
|
||||
$mapper->expects(self::once())
|
||||
->method('findBoardId')
|
||||
->willReturn(123);
|
||||
$this->permissionService->expects($this->once())
|
||||
$this->permissionService->expects(self::once())
|
||||
->method('findUsers')
|
||||
->willReturn($users);
|
||||
$this->manager->expects($this->at(0))
|
||||
->method('publish')
|
||||
->with($event);
|
||||
$this->manager->expects($this->at(1))
|
||||
|
||||
$this->manager->expects(self::exactly(2))
|
||||
->method('publish')
|
||||
->with($event);
|
||||
$this->invokePrivate($this->activityManager, 'sendToUsers', [$event]);
|
||||
@@ -243,14 +373,14 @@ class ActivityManagerTest extends TestCase {
|
||||
$card->setId(3);
|
||||
$expected = null;
|
||||
if ($objectType === ActivityManager::DECK_OBJECT_BOARD) {
|
||||
$this->boardMapper->expects($this->once())
|
||||
$this->boardMapper->expects(self::once())
|
||||
->method('find')
|
||||
->with(1)
|
||||
->willReturn($board);
|
||||
$expected = $board;
|
||||
}
|
||||
if ($objectType === ActivityManager::DECK_OBJECT_CARD) {
|
||||
$this->cardMapper->expects($this->once())
|
||||
$this->cardMapper->expects(self::once())
|
||||
->method('find')
|
||||
->with(3)
|
||||
->willReturn($card);
|
||||
@@ -266,11 +396,11 @@ class ActivityManagerTest extends TestCase {
|
||||
$stack->setBoardId(999);
|
||||
$board = new Board();
|
||||
$board->setId(999);
|
||||
$this->stackMapper->expects($this->once())
|
||||
$this->stackMapper->expects(self::once())
|
||||
->method('find')
|
||||
->with(123)
|
||||
->willReturn($stack);
|
||||
$this->boardMapper->expects($this->once())->method('find')
|
||||
$this->boardMapper->expects(self::once())->method('find')
|
||||
->with(999)
|
||||
->willReturn($board);
|
||||
$this->assertEquals([
|
||||
@@ -289,15 +419,15 @@ class ActivityManagerTest extends TestCase {
|
||||
$stack->setBoardId(999);
|
||||
$board = new Board();
|
||||
$board->setId(999);
|
||||
$this->cardMapper->expects($this->once())
|
||||
$this->cardMapper->expects(self::once())
|
||||
->method('find')
|
||||
->with(555)
|
||||
->willReturn($card);
|
||||
$this->stackMapper->expects($this->once())
|
||||
$this->stackMapper->expects(self::once())
|
||||
->method('find')
|
||||
->with(123)
|
||||
->willReturn($stack);
|
||||
$this->boardMapper->expects($this->once())->method('find')
|
||||
$this->boardMapper->expects(self::once())->method('find')
|
||||
->with(999)
|
||||
->willReturn($board);
|
||||
$this->assertEquals([
|
||||
@@ -323,15 +453,15 @@ class ActivityManagerTest extends TestCase {
|
||||
$stack->setBoardId(999);
|
||||
$board = new Board();
|
||||
$board->setId(999);
|
||||
$this->cardMapper->expects($this->once())
|
||||
$this->cardMapper->expects(self::once())
|
||||
->method('find')
|
||||
->with(555)
|
||||
->willReturn($card);
|
||||
$this->stackMapper->expects($this->once())
|
||||
$this->stackMapper->expects(self::once())
|
||||
->method('find')
|
||||
->with(123)
|
||||
->willReturn($stack);
|
||||
$this->boardMapper->expects($this->once())->method('find')
|
||||
$this->boardMapper->expects(self::once())->method('find')
|
||||
->with(999)
|
||||
->willReturn($board);
|
||||
$this->assertEquals([
|
||||
|
||||
@@ -38,6 +38,7 @@ use OCP\L10N\IFactory;
|
||||
use OCP\RichObjectStrings\IValidator;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use PHPUnit_Framework_MockObject_MockObject as MockObject;
|
||||
use OCA\Deck\Service\CardService;
|
||||
|
||||
class DeckProviderTest extends TestCase {
|
||||
|
||||
@@ -56,6 +57,9 @@ class DeckProviderTest extends TestCase {
|
||||
/** @var ICommentsManager|MockObject */
|
||||
private $commentsManager;
|
||||
|
||||
/** @var CardService|MockObject */
|
||||
private $cardService;
|
||||
|
||||
/** @var string */
|
||||
private $userId = 'admin';
|
||||
|
||||
@@ -67,7 +71,9 @@ class DeckProviderTest extends TestCase {
|
||||
$this->commentsManager = $this->createMock(ICommentsManager::class);
|
||||
$this->l10nFactory = $this->createMock(IFactory::class);
|
||||
$this->config = $this->createMock(IConfig::class);
|
||||
$this->provider = new DeckProvider($this->urlGenerator, $this->activityManager, $this->userManager, $this->commentsManager, $this->l10nFactory, $this->config, $this->userId);
|
||||
$this->config = $this->createMock(IConfig::class);
|
||||
$this->cardService = $this->createMock(CardService::class);
|
||||
$this->provider = new DeckProvider($this->urlGenerator, $this->activityManager, $this->userManager, $this->commentsManager, $this->l10nFactory, $this->config, $this->userId, $this->cardService);
|
||||
}
|
||||
|
||||
private function mockEvent($objectType, $objectId, $objectName, $subject, $subjectParameters = []) {
|
||||
|
||||
@@ -66,18 +66,14 @@ class DeleteCronTest extends \Test\TestCase {
|
||||
$this->boardMapper->expects($this->once())
|
||||
->method('findToDelete')
|
||||
->willReturn($boards);
|
||||
$this->boardMapper->expects($this->at(1))
|
||||
$this->boardMapper->expects($this->exactly(count($boards)))
|
||||
->method('delete')
|
||||
->with($boards[0]);
|
||||
$this->boardMapper->expects($this->at(2))
|
||||
->method('delete')
|
||||
->with($boards[1]);
|
||||
$this->boardMapper->expects($this->at(3))
|
||||
->method('delete')
|
||||
->with($boards[2]);
|
||||
$this->boardMapper->expects($this->at(4))
|
||||
->method('delete')
|
||||
->with($boards[3]);
|
||||
->withConsecutive(
|
||||
[$boards[0]],
|
||||
[$boards[1]],
|
||||
[$boards[2]],
|
||||
[$boards[3]]
|
||||
);
|
||||
|
||||
$attachment = new Attachment();
|
||||
$attachment->setType('deck_file');
|
||||
|
||||
@@ -54,10 +54,7 @@ class ScheduledNoificationsTest extends \Test\TestCase {
|
||||
$this->cardMapper->expects($this->once())
|
||||
->method('findOverdue')
|
||||
->willReturn($cards);
|
||||
$this->notificationHelper->expects($this->at(0))
|
||||
->method('sendCardDuedate')
|
||||
->with($c1);
|
||||
$this->notificationHelper->expects($this->at(1))
|
||||
$this->notificationHelper->expects($this->exactly(2))
|
||||
->method('sendCardDuedate')
|
||||
->with($c1);
|
||||
$this->scheduledNotifications->run(null);
|
||||
|
||||
@@ -114,17 +114,18 @@ class NotificationHelperTest extends \Test\TestCase {
|
||||
}
|
||||
|
||||
public function testSendCardDuedate() {
|
||||
$this->config->expects($this->at(0))
|
||||
$param1 = ['foo', 'bar', 'asd'];
|
||||
$param2 = 'deck';
|
||||
$param3 = 'board:234:notify-due';
|
||||
$DUE_ASSIGNED = ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED;
|
||||
|
||||
$this->config->expects($this->exactly(3))
|
||||
->method('getUserValue')
|
||||
->with('foo', 'deck', 'board:234:notify-due', ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED)
|
||||
->willReturn(ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ALL);
|
||||
$this->config->expects($this->at(1))
|
||||
->method('getUserValue')
|
||||
->with('bar', 'deck', 'board:234:notify-due', ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED)
|
||||
->willReturn(ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ALL);
|
||||
$this->config->expects($this->at(2))
|
||||
->method('getUserValue')
|
||||
->with('asd', 'deck', 'board:234:notify-due', ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED)
|
||||
->withConsecutive(
|
||||
[$param1[0], $param2, $param3, $DUE_ASSIGNED],
|
||||
[$param1[1], $param2, $param3, $DUE_ASSIGNED],
|
||||
[$param1[2], $param2, $param3, $DUE_ASSIGNED],
|
||||
)
|
||||
->willReturn(ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ALL);
|
||||
|
||||
$card = Card::fromParams([
|
||||
@@ -180,24 +181,12 @@ class NotificationHelperTest extends \Test\TestCase {
|
||||
$n3->expects($this->once())->method('setSubject')->with('card-overdue', ['MyCardTitle', 'MyBoardTitle'])->willReturn($n3);
|
||||
$n3->expects($this->once())->method('setDateTime')->willReturn($n3);
|
||||
|
||||
$this->notificationManager->expects($this->at(0))
|
||||
$this->notificationManager->expects($this->exactly(3))
|
||||
->method('createNotification')
|
||||
->willReturn($n1);
|
||||
$this->notificationManager->expects($this->at(1))
|
||||
->willReturnOnConsecutiveCalls($n1, $n2, $n3);
|
||||
$this->notificationManager->expects($this->exactly(3))
|
||||
->method('notify')
|
||||
->with($n1);
|
||||
$this->notificationManager->expects($this->at(2))
|
||||
->method('createNotification')
|
||||
->willReturn($n2);
|
||||
$this->notificationManager->expects($this->at(3))
|
||||
->method('notify')
|
||||
->with($n2);
|
||||
$this->notificationManager->expects($this->at(4))
|
||||
->method('createNotification')
|
||||
->willReturn($n3);
|
||||
$this->notificationManager->expects($this->at(5))
|
||||
->method('notify')
|
||||
->with($n3);
|
||||
->withConsecutive([$n1], [$n2], [$n3]);
|
||||
|
||||
$this->cardMapper->expects($this->once())
|
||||
->method('markNotified')
|
||||
@@ -207,18 +196,19 @@ class NotificationHelperTest extends \Test\TestCase {
|
||||
}
|
||||
|
||||
public function testSendCardDuedateAssigned() {
|
||||
$this->config->expects($this->at(0))
|
||||
$param1 = ['foo', 'bar', 'asd'];
|
||||
$param2 = 'deck';
|
||||
$param3 = 'board:234:notify-due';
|
||||
$DUE_ASSIGNED = ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED;
|
||||
|
||||
$this->config->expects($this->exactly(3))
|
||||
->method('getUserValue')
|
||||
->with('foo', 'deck', 'board:234:notify-due', ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED)
|
||||
->willReturn(ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED);
|
||||
$this->config->expects($this->at(1))
|
||||
->method('getUserValue')
|
||||
->with('bar', 'deck', 'board:234:notify-due', ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED)
|
||||
->willReturn(ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED);
|
||||
$this->config->expects($this->at(2))
|
||||
->method('getUserValue')
|
||||
->with('asd', 'deck', 'board:234:notify-due', ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED)
|
||||
->willReturn(ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED);
|
||||
->withConsecutive(
|
||||
[$param1[0], $param2, $param3, $DUE_ASSIGNED],
|
||||
[$param1[1], $param2, $param3, $DUE_ASSIGNED],
|
||||
[$param1[2], $param2, $param3, $DUE_ASSIGNED]
|
||||
)
|
||||
->willReturn($DUE_ASSIGNED);
|
||||
|
||||
$users = [
|
||||
new DummyUser('foo'), new DummyUser('bar'), new DummyUser('asd')
|
||||
@@ -278,24 +268,12 @@ class NotificationHelperTest extends \Test\TestCase {
|
||||
$n3->expects($this->once())->method('setSubject')->with('card-overdue', ['MyCardTitle', 'MyBoardTitle'])->willReturn($n3);
|
||||
$n3->expects($this->once())->method('setDateTime')->willReturn($n3);
|
||||
|
||||
$this->notificationManager->expects($this->at(0))
|
||||
$this->notificationManager->expects($this->exactly(3))
|
||||
->method('createNotification')
|
||||
->willReturn($n1);
|
||||
$this->notificationManager->expects($this->at(1))
|
||||
->willReturnOnConsecutiveCalls($n1, $n2, $n3);
|
||||
$this->notificationManager->expects($this->exactly(3))
|
||||
->method('notify')
|
||||
->with($n1);
|
||||
$this->notificationManager->expects($this->at(2))
|
||||
->method('createNotification')
|
||||
->willReturn($n2);
|
||||
$this->notificationManager->expects($this->at(3))
|
||||
->method('notify')
|
||||
->with($n2);
|
||||
$this->notificationManager->expects($this->at(4))
|
||||
->method('createNotification')
|
||||
->willReturn($n3);
|
||||
$this->notificationManager->expects($this->at(5))
|
||||
->method('notify')
|
||||
->with($n3);
|
||||
->withConsecutive([$n1], [$n2], [$n3]);
|
||||
|
||||
$this->cardMapper->expects($this->once())
|
||||
->method('markNotified')
|
||||
@@ -306,18 +284,20 @@ class NotificationHelperTest extends \Test\TestCase {
|
||||
|
||||
|
||||
public function testSendCardDuedateNever() {
|
||||
$this->config->expects($this->at(0))
|
||||
$param1 = ['foo', 'bar', 'asd'];
|
||||
$param2 = 'deck';
|
||||
$param3 = 'board:234:notify-due';
|
||||
$DUE_ASSIGNED = ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED;
|
||||
$DUE_OFF = ConfigService::SETTING_BOARD_NOTIFICATION_DUE_OFF;
|
||||
|
||||
$this->config->expects($this->exactly(3))
|
||||
->method('getUserValue')
|
||||
->with('foo', 'deck', 'board:234:notify-due', ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED)
|
||||
->willReturn(ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED);
|
||||
$this->config->expects($this->at(1))
|
||||
->method('getUserValue')
|
||||
->with('bar', 'deck', 'board:234:notify-due', ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED)
|
||||
->willReturn(ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED);
|
||||
$this->config->expects($this->at(2))
|
||||
->method('getUserValue')
|
||||
->with('asd', 'deck', 'board:234:notify-due', ConfigService::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED)
|
||||
->willReturn(ConfigService::SETTING_BOARD_NOTIFICATION_DUE_OFF);
|
||||
->withConsecutive(
|
||||
[$param1[0], $param2, $param3, $DUE_ASSIGNED],
|
||||
[$param1[1], $param2, $param3, $DUE_ASSIGNED],
|
||||
[$param1[2], $param2, $param3, $DUE_ASSIGNED]
|
||||
)
|
||||
->willReturnOnConsecutiveCalls($DUE_ASSIGNED, $DUE_ASSIGNED, $DUE_OFF);
|
||||
|
||||
$users = [
|
||||
new DummyUser('foo'), new DummyUser('bar'), new DummyUser('asd')
|
||||
@@ -370,18 +350,12 @@ class NotificationHelperTest extends \Test\TestCase {
|
||||
$n2->expects($this->once())->method('setSubject')->with('card-overdue', ['MyCardTitle', 'MyBoardTitle'])->willReturn($n2);
|
||||
$n2->expects($this->once())->method('setDateTime')->willReturn($n2);
|
||||
|
||||
$this->notificationManager->expects($this->at(0))
|
||||
$this->notificationManager->expects($this->exactly(2))
|
||||
->method('createNotification')
|
||||
->willReturn($n1);
|
||||
$this->notificationManager->expects($this->at(1))
|
||||
->willReturnOnConsecutiveCalls($n1, $n2);
|
||||
$this->notificationManager->expects($this->exactly(2))
|
||||
->method('notify')
|
||||
->with($n1);
|
||||
$this->notificationManager->expects($this->at(2))
|
||||
->method('createNotification')
|
||||
->willReturn($n2);
|
||||
$this->notificationManager->expects($this->at(3))
|
||||
->method('notify')
|
||||
->with($n2);
|
||||
->withConsecutive([$n1], [$n2]);
|
||||
|
||||
$this->cardMapper->expects($this->once())
|
||||
->method('markNotified')
|
||||
@@ -423,10 +397,10 @@ class NotificationHelperTest extends \Test\TestCase {
|
||||
$notification->expects($this->once())->method('setSubject')->with('card-assigned', ['MyCardTitle', 'MyBoardTitle', 'admin'])->willReturn($notification);
|
||||
$notification->expects($this->once())->method('setDateTime')->willReturn($notification);
|
||||
|
||||
$this->notificationManager->expects($this->at(0))
|
||||
$this->notificationManager->expects($this->once())
|
||||
->method('createNotification')
|
||||
->willReturn($notification);
|
||||
$this->notificationManager->expects($this->at(1))
|
||||
$this->notificationManager->expects($this->once())
|
||||
->method('notify')
|
||||
->with($notification);
|
||||
|
||||
@@ -451,10 +425,10 @@ class NotificationHelperTest extends \Test\TestCase {
|
||||
$notification->expects($this->once())->method('setSubject')->with('board-shared', ['MyBoardTitle', 'admin'])->willReturn($notification);
|
||||
$notification->expects($this->once())->method('setDateTime')->willReturn($notification);
|
||||
|
||||
$this->notificationManager->expects($this->at(0))
|
||||
$this->notificationManager->expects($this->once())
|
||||
->method('createNotification')
|
||||
->willReturn($notification);
|
||||
$this->notificationManager->expects($this->at(1))
|
||||
$this->notificationManager->expects($this->once())
|
||||
->method('notify')
|
||||
->with($notification);
|
||||
|
||||
@@ -490,10 +464,10 @@ class NotificationHelperTest extends \Test\TestCase {
|
||||
$notification->expects($this->once())->method('setSubject')->with('board-shared', ['MyBoardTitle', 'admin'])->willReturn($notification);
|
||||
$notification->expects($this->once())->method('setDateTime')->willReturn($notification);
|
||||
|
||||
$this->notificationManager->expects($this->at(0))
|
||||
$this->notificationManager->expects($this->once())
|
||||
->method('createNotification')
|
||||
->willReturn($notification);
|
||||
$this->notificationManager->expects($this->at(1))
|
||||
$this->notificationManager->expects($this->once())
|
||||
->method('notify')
|
||||
->with($notification);
|
||||
|
||||
@@ -540,19 +514,12 @@ class NotificationHelperTest extends \Test\TestCase {
|
||||
$notification2->expects($this->once())->method('setSubject')->with('card-comment-mentioned', ['MyCard', 1, 'admin'])->willReturn($notification2);
|
||||
$notification2->expects($this->once())->method('setDateTime')->willReturn($notification2);
|
||||
|
||||
$this->notificationManager->expects($this->at(0))
|
||||
$this->notificationManager->expects($this->exactly(2))
|
||||
->method('createNotification')
|
||||
->willReturn($notification1);
|
||||
$this->notificationManager->expects($this->at(1))
|
||||
->willReturnOnConsecutiveCalls($notification1, $notification2);
|
||||
$this->notificationManager->expects($this->exactly(2))
|
||||
->method('notify')
|
||||
->with($notification1);
|
||||
|
||||
$this->notificationManager->expects($this->at(2))
|
||||
->method('createNotification')
|
||||
->willReturn($notification2);
|
||||
$this->notificationManager->expects($this->at(3))
|
||||
->method('notify')
|
||||
->with($notification2);
|
||||
->withConsecutive([$notification1], [$notification2]);
|
||||
|
||||
$this->notificationHelper->sendMention($comment);
|
||||
}
|
||||
|
||||
@@ -110,8 +110,16 @@ class AttachmentServiceTest extends TestCase {
|
||||
$this->cache = $this->createMock(ICache::class);
|
||||
$this->cacheFactory->expects($this->any())->method('createDistributed')->willReturn($this->cache);
|
||||
|
||||
$this->appContainer->expects($this->at(0))->method('query')->with(FileService::class)->willReturn($this->attachmentServiceImpl);
|
||||
$this->appContainer->expects($this->at(1))->method('query')->with(FilesAppService::class)->willReturn($this->filesAppServiceImpl);
|
||||
$this->appContainer->expects($this->exactly(2))
|
||||
->method('query')
|
||||
->withConsecutive(
|
||||
[FileService::class],
|
||||
[FilesAppService::class]
|
||||
)
|
||||
->willReturnOnConsecutiveCalls(
|
||||
$this->attachmentServiceImpl,
|
||||
$this->filesAppServiceImpl
|
||||
);
|
||||
|
||||
$this->application->expects($this->any())
|
||||
->method('getContainer')
|
||||
@@ -129,9 +137,18 @@ class AttachmentServiceTest extends TestCase {
|
||||
$fileServiceMock = $this->createMock(FileService::class);
|
||||
$fileAppServiceMock = $this->createMock(FilesAppService::class);
|
||||
|
||||
$appContainer->expects($this->at(0))->method('query')->with(FileService::class)->willReturn($fileServiceMock);
|
||||
$appContainer->expects($this->at(1))->method('query')->with(FilesAppService::class)->willReturn($fileAppServiceMock);
|
||||
$appContainer->expects($this->at(2))->method('query')->with(MyAttachmentService::class)->willReturn(new MyAttachmentService());
|
||||
$appContainer->expects($this->exactly(3))
|
||||
->method('query')
|
||||
->withConsecutive(
|
||||
[FileService::class],
|
||||
[FilesAppService::class],
|
||||
[MyAttachmentService::class]
|
||||
)
|
||||
->willReturnOnConsecutiveCalls(
|
||||
$fileServiceMock,
|
||||
$fileAppServiceMock,
|
||||
new MyAttachmentService()
|
||||
);
|
||||
|
||||
$application->expects($this->any())
|
||||
->method('getContainer')
|
||||
@@ -148,12 +165,24 @@ class AttachmentServiceTest extends TestCase {
|
||||
$appContainer = $this->createMock(IAppContainer::class);
|
||||
$fileServiceMock = $this->createMock(FileService::class);
|
||||
$fileAppServiceMock = $this->createMock(FilesAppService::class);
|
||||
$appContainer->expects($this->at(0))->method('query')->with(FileService::class)->willReturn($fileServiceMock);
|
||||
$appContainer->expects($this->at(1))->method('query')->with(FilesAppService::class)->willReturn($fileAppServiceMock);
|
||||
$appContainer->expects($this->at(2))->method('query')->with(MyAttachmentService::class)->willReturn(new MyAttachmentService());
|
||||
|
||||
$appContainer->expects($this->exactly(3))
|
||||
->method('query')
|
||||
->withConsecutive(
|
||||
[FileService::class],
|
||||
[FilesAppService::class],
|
||||
[MyAttachmentService::class]
|
||||
)
|
||||
->willReturnOnConsecutiveCalls(
|
||||
$fileServiceMock,
|
||||
$fileAppServiceMock,
|
||||
new MyAttachmentService()
|
||||
);
|
||||
|
||||
$application->expects($this->any())
|
||||
->method('getContainer')
|
||||
->willReturn($appContainer);
|
||||
|
||||
$attachmentService = new AttachmentService($this->attachmentMapper, $this->cardMapper, $this->changeHelper, $this->permissionService, $application, $this->cacheFactory, $this->userId, $this->l10n, $this->activityManager);
|
||||
$attachmentService->registerAttachmentService('custom', MyAttachmentService::class);
|
||||
$attachmentService->getService('deck_file_invalid');
|
||||
@@ -185,12 +214,17 @@ class AttachmentServiceTest extends TestCase {
|
||||
->with(123)
|
||||
->willReturn($attachments);
|
||||
|
||||
$this->attachmentServiceImpl->expects($this->at(0))
|
||||
$this->attachmentServiceImpl->expects($this->exactly(2))
|
||||
->method('extendData')
|
||||
->with($attachments[0]);
|
||||
$this->attachmentServiceImpl->expects($this->at(1))
|
||||
->method('extendData')
|
||||
->with($attachments[1]);
|
||||
->withConsecutive(
|
||||
[$attachments[0]],
|
||||
[$attachments[1]],
|
||||
)
|
||||
->willReturnOnConsecutiveCalls(
|
||||
$attachments[0],
|
||||
$attachments[1],
|
||||
);
|
||||
|
||||
$this->assertEquals($attachments, $this->attachmentService->findAll(123, false));
|
||||
}
|
||||
|
||||
@@ -215,12 +249,15 @@ class AttachmentServiceTest extends TestCase {
|
||||
->with(123, false)
|
||||
->willReturn($attachmentsDeleted);
|
||||
|
||||
$this->attachmentServiceImpl->expects($this->at(0))
|
||||
$this->attachmentServiceImpl->expects($this->exactly(4))
|
||||
->method('extendData')
|
||||
->with($attachments[0]);
|
||||
$this->attachmentServiceImpl->expects($this->at(1))
|
||||
->method('extendData')
|
||||
->with($attachments[1]);
|
||||
->withConsecutive(
|
||||
[$attachments[0]],
|
||||
[$attachments[1]],
|
||||
[$attachmentsDeleted[0]],
|
||||
[$attachmentsDeleted[1]]
|
||||
);
|
||||
|
||||
$this->assertEquals(array_merge($attachments, $attachmentsDeleted), $this->attachmentService->findAll(123, true));
|
||||
}
|
||||
|
||||
@@ -396,5 +433,6 @@ class AttachmentServiceTest extends TestCase {
|
||||
->method('allowUndo')
|
||||
->willReturn(false);
|
||||
$actual = $this->attachmentService->restore(1, 1);
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ use OCA\Deck\Db\Assignment;
|
||||
use OCA\Deck\Db\AssignmentMapper;
|
||||
use OCA\Deck\Db\Board;
|
||||
use OCA\Deck\Db\BoardMapper;
|
||||
use OCA\Deck\Db\CardMapper;
|
||||
use OCA\Deck\Db\ChangeHelper;
|
||||
use OCA\Deck\Db\LabelMapper;
|
||||
use OCA\Deck\Db\StackMapper;
|
||||
@@ -42,6 +43,7 @@ use OCP\IUser;
|
||||
use OCP\IUserManager;
|
||||
use OCP\IGroupManager;
|
||||
use \Test\TestCase;
|
||||
use OCP\IURLGenerator;
|
||||
|
||||
class BoardServiceTest extends TestCase {
|
||||
|
||||
@@ -57,6 +59,8 @@ class BoardServiceTest extends TestCase {
|
||||
private $boardMapper;
|
||||
/** @var StackMapper */
|
||||
private $stackMapper;
|
||||
/** @var CardMapper */
|
||||
private $cardMapper;
|
||||
/** @var PermissionService */
|
||||
private $permissionService;
|
||||
/** @var NotificationHelper */
|
||||
@@ -74,6 +78,8 @@ class BoardServiceTest extends TestCase {
|
||||
/** @var IEventDispatcher */
|
||||
private $eventDispatcher;
|
||||
private $userId = 'admin';
|
||||
/** @var IURLGenerator */
|
||||
private $urlGenerator;
|
||||
|
||||
public function setUp(): void {
|
||||
parent::setUp();
|
||||
@@ -82,6 +88,7 @@ class BoardServiceTest extends TestCase {
|
||||
$this->boardMapper = $this->createMock(BoardMapper::class);
|
||||
$this->stackMapper = $this->createMock(StackMapper::class);
|
||||
$this->config = $this->createMock(IConfig::class);
|
||||
$this->cardMapper = $this->createMock(CardMapper::class);
|
||||
$this->labelMapper = $this->createMock(LabelMapper::class);
|
||||
$this->permissionService = $this->createMock(PermissionService::class);
|
||||
$this->notificationHelper = $this->createMock(NotificationHelper::class);
|
||||
@@ -91,6 +98,7 @@ class BoardServiceTest extends TestCase {
|
||||
$this->activityManager = $this->createMock(ActivityManager::class);
|
||||
$this->changeHelper = $this->createMock(ChangeHelper::class);
|
||||
$this->eventDispatcher = $this->createMock(IEventDispatcher::class);
|
||||
$this->urlGenerator = $this->createMock(IURLGenerator::class);
|
||||
|
||||
$this->service = new BoardService(
|
||||
$this->boardMapper,
|
||||
@@ -102,11 +110,13 @@ class BoardServiceTest extends TestCase {
|
||||
$this->permissionService,
|
||||
$this->notificationHelper,
|
||||
$this->assignedUsersMapper,
|
||||
$this->cardMapper,
|
||||
$this->userManager,
|
||||
$this->groupManager,
|
||||
$this->activityManager,
|
||||
$this->eventDispatcher,
|
||||
$this->changeHelper,
|
||||
$this->urlGenerator,
|
||||
$this->userId
|
||||
);
|
||||
|
||||
@@ -144,7 +154,7 @@ class BoardServiceTest extends TestCase {
|
||||
->method('find')
|
||||
->with(1)
|
||||
->willReturn($b1);
|
||||
$this->permissionService->expects($this->once())
|
||||
$this->permissionService->expects($this->any())
|
||||
->method('findUsers')
|
||||
->willReturn([
|
||||
'admin' => 'admin',
|
||||
@@ -248,6 +258,11 @@ class BoardServiceTest extends TestCase {
|
||||
->method('insert')
|
||||
->with($acl)
|
||||
->willReturn($acl);
|
||||
$this->permissionService->expects($this->any())
|
||||
->method('findUsers')
|
||||
->willReturn([
|
||||
'admin' => 'admin',
|
||||
]);
|
||||
$this->assertEquals($acl, $this->service->addAcl(
|
||||
123, 'user', 'admin', true, true, true
|
||||
));
|
||||
@@ -290,30 +305,39 @@ class BoardServiceTest extends TestCase {
|
||||
$existingAcl->setPermissionEdit($currentUserAcl[0]);
|
||||
$existingAcl->setPermissionShare($currentUserAcl[1]);
|
||||
$existingAcl->setPermissionManage($currentUserAcl[2]);
|
||||
$this->permissionService->expects($this->at(0))
|
||||
->method('checkPermission')
|
||||
->with($this->boardMapper, 123, Acl::PERMISSION_SHARE, null);
|
||||
|
||||
if ($currentUserAcl[2]) {
|
||||
$this->permissionService->expects($this->at(1))
|
||||
$this->permissionService->expects($this->exactly(2))
|
||||
->method('checkPermission')
|
||||
->with($this->boardMapper, 123, Acl::PERMISSION_MANAGE, null);
|
||||
->withConsecutive(
|
||||
[$this->boardMapper, 123, Acl::PERMISSION_SHARE, null],
|
||||
[$this->boardMapper, 123, Acl::PERMISSION_MANAGE, null]
|
||||
);
|
||||
} else {
|
||||
$this->aclMapper->expects($this->once())
|
||||
->method('findAll')
|
||||
->willReturn([$existingAcl]);
|
||||
$this->permissionService->expects($this->at(1))
|
||||
|
||||
$this->permissionService->expects($this->exactly(2))
|
||||
->method('checkPermission')
|
||||
->with($this->boardMapper, 123, Acl::PERMISSION_MANAGE, null)
|
||||
->willThrowException(new NoPermissionException('No permission'));
|
||||
$this->permissionService->expects($this->at(2))
|
||||
->withConsecutive(
|
||||
[$this->boardMapper, 123, Acl::PERMISSION_SHARE, null],
|
||||
[$this->boardMapper, 123, Acl::PERMISSION_MANAGE, null]
|
||||
)
|
||||
->will(
|
||||
$this->onConsecutiveCalls(
|
||||
true,
|
||||
$this->throwException(new NoPermissionException('No permission'))
|
||||
)
|
||||
);
|
||||
|
||||
$this->permissionService->expects($this->exactly(3))
|
||||
->method('userCan')
|
||||
->willReturn($currentUserAcl[0]);
|
||||
$this->permissionService->expects($this->at(3))
|
||||
->method('userCan')
|
||||
->willReturn($currentUserAcl[1]);
|
||||
$this->permissionService->expects($this->at(4))
|
||||
->method('userCan')
|
||||
->willReturn($currentUserAcl[2]);
|
||||
->willReturnOnConsecutiveCalls(
|
||||
$currentUserAcl[0],
|
||||
$currentUserAcl[1],
|
||||
$currentUserAcl[2]
|
||||
);
|
||||
}
|
||||
|
||||
$user = $this->createMock(IUser::class);
|
||||
@@ -328,6 +352,11 @@ class BoardServiceTest extends TestCase {
|
||||
$acl->resolveRelation('participant', function ($participant) use (&$user) {
|
||||
return null;
|
||||
});
|
||||
$this->permissionService->expects($this->any())
|
||||
->method('findUsers')
|
||||
->willReturn([
|
||||
'admin' => 'admin',
|
||||
]);
|
||||
$this->notificationHelper->expects($this->once())
|
||||
->method('sendBoardShared');
|
||||
$expected = clone $acl;
|
||||
@@ -391,7 +420,7 @@ class BoardServiceTest extends TestCase {
|
||||
$this->aclMapper->expects($this->once())
|
||||
->method('delete')
|
||||
->with($acl)
|
||||
->willReturn($acl);
|
||||
$this->assertEquals($acl, $this->service->deleteAcl(123));
|
||||
->willReturn(true);
|
||||
$this->assertTrue($this->service->deleteAcl(123));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,6 +43,7 @@ use OCP\IUserManager;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||
use Test\TestCase;
|
||||
use OCP\IURLGenerator;
|
||||
|
||||
class CardServiceTest extends TestCase {
|
||||
|
||||
@@ -76,6 +77,9 @@ class CardServiceTest extends TestCase {
|
||||
/** @var ChangeHelper|MockObject */
|
||||
private $changeHelper;
|
||||
|
||||
/** @var IURLGenerator|MockObject */
|
||||
private $urlGenerator;
|
||||
|
||||
public function setUp(): void {
|
||||
parent::setUp();
|
||||
$this->cardMapper = $this->createMock(CardMapper::class);
|
||||
@@ -92,6 +96,7 @@ class CardServiceTest extends TestCase {
|
||||
$this->userManager = $this->createMock(IUserManager::class);
|
||||
$this->eventDispatcher = $this->createMock(IEventDispatcher::class);
|
||||
$this->changeHelper = $this->createMock(ChangeHelper::class);
|
||||
$this->urlGenerator = $this->createMock(IURLGenerator::class);
|
||||
$this->cardService = new CardService(
|
||||
$this->cardMapper,
|
||||
$this->stackMapper,
|
||||
@@ -107,6 +112,7 @@ class CardServiceTest extends TestCase {
|
||||
$this->userManager,
|
||||
$this->changeHelper,
|
||||
$this->eventDispatcher,
|
||||
$this->urlGenerator,
|
||||
'user1'
|
||||
);
|
||||
}
|
||||
|
||||
@@ -139,13 +139,17 @@ class PermissionServiceTest extends \Test\TestCase {
|
||||
}
|
||||
|
||||
public function testUserIsBoardOwner() {
|
||||
$board = new Board();
|
||||
$board->setOwner('admin');
|
||||
$this->boardMapper->expects($this->at(0))->method('find')->with(123)->willReturn($board);
|
||||
$adminBoard = new Board();
|
||||
$adminBoard->setOwner('admin');
|
||||
$userBoard = new Board();
|
||||
$userBoard->setOwner('user1');
|
||||
|
||||
$this->boardMapper->expects($this->exactly(2))
|
||||
->method('find')
|
||||
->withConsecutive([123], [234])
|
||||
->willReturnOnConsecutiveCalls($adminBoard, $userBoard);
|
||||
|
||||
$this->assertEquals(true, $this->service->userIsBoardOwner(123));
|
||||
$board = new Board();
|
||||
$board->setOwner('user1');
|
||||
$this->boardMapper->expects($this->at(0))->method('find')->with(234)->willReturn($board);
|
||||
$this->assertEquals(false, $this->service->userIsBoardOwner(234));
|
||||
}
|
||||
|
||||
@@ -336,7 +340,7 @@ class PermissionServiceTest extends \Test\TestCase {
|
||||
$aclGroup->setParticipant('group1');
|
||||
|
||||
$board = $this->createMock(Board::class);
|
||||
$board->expects($this->at(0))
|
||||
$board->expects($this->once())
|
||||
->method('__call')
|
||||
->with('getOwner', [])
|
||||
->willReturn('user1');
|
||||
@@ -348,14 +352,11 @@ class PermissionServiceTest extends \Test\TestCase {
|
||||
->method('find')
|
||||
->with(123)
|
||||
->willReturn($board);
|
||||
$this->userManager->expects($this->at(0))
|
||||
$this->userManager->expects($this->exactly(2))
|
||||
->method('get')
|
||||
->with('user1')
|
||||
->willReturn($user1);
|
||||
$this->userManager->expects($this->at(1))
|
||||
->method('get')
|
||||
->with('user2')
|
||||
->willReturn($user2);
|
||||
->withConsecutive(['user1'], ['user2'])
|
||||
->willReturnOnConsecutiveCalls($user1, $user2);
|
||||
|
||||
$group = $this->createMock(IGroup::class);
|
||||
$group->expects($this->once())
|
||||
->method('getUsers')
|
||||
|
||||
@@ -24,32 +24,56 @@
|
||||
|
||||
namespace OCA\Deck\Controller;
|
||||
|
||||
use OCA\Deck\Db\CardMapper;
|
||||
use OCA\Deck\Service\CardService;
|
||||
use OCA\Deck\Service\ConfigService;
|
||||
use OCA\Deck\Service\PermissionService;
|
||||
use OCP\EventDispatcher\IEventDispatcher;
|
||||
use OCP\IInitialStateService;
|
||||
use OCP\IL10N;
|
||||
use OCP\IRequest;
|
||||
use OCP\IURLGenerator;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class PageControllerTest extends \Test\TestCase {
|
||||
class PageControllerTest extends TestCase {
|
||||
private $controller;
|
||||
private $request;
|
||||
private $l10n;
|
||||
private $permissionService;
|
||||
private $initialState;
|
||||
private $configService;
|
||||
private $eventDispatcher;
|
||||
/**
|
||||
* @var mixed|CardMapper|\PHPUnit\Framework\MockObject\MockObject
|
||||
*/
|
||||
private $cardMapper;
|
||||
/**
|
||||
* @var mixed|IURLGenerator|\PHPUnit\Framework\MockObject\MockObject
|
||||
*/
|
||||
private $urlGenerator;
|
||||
/**
|
||||
* @var mixed|CardService|\PHPUnit\Framework\MockObject\MockObject
|
||||
*/
|
||||
private $cardService;
|
||||
|
||||
public function setUp(): void {
|
||||
$this->l10n = $this->createMock(IL10N::class);
|
||||
$this->request = $this->createMock(IRequest::class);
|
||||
$this->permissionService = $this->createMock(PermissionService::class);
|
||||
$this->configService = $this->createMock(ConfigService::class);
|
||||
$this->initialState = $this->createMock(IInitialStateService::class);
|
||||
$this->eventDispatcher = $this->createMock(IEventDispatcher::class);
|
||||
$this->cardMapper = $this->createMock(CardMapper::class);
|
||||
$this->urlGenerator = $this->createMock(IURLGenerator::class);
|
||||
$this->cardService = $this->createMock(CardService::class);
|
||||
|
||||
$this->controller = new PageController(
|
||||
'deck', $this->request, $this->permissionService, $this->initialState, $this->configService, $this->eventDispatcher
|
||||
'deck',
|
||||
$this->request,
|
||||
$this->permissionService,
|
||||
$this->initialState,
|
||||
$this->configService,
|
||||
$this->eventDispatcher,
|
||||
$this->cardMapper,
|
||||
$this->urlGenerator,
|
||||
$this->cardService
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user