Compare commits

..

1 Commits

Author SHA1 Message Date
Julius Härtl
1b02e7fb25 Move to behat helper library
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-05-25 18:18:07 +02:00
63 changed files with 15233 additions and 26505 deletions

View File

@@ -9,7 +9,7 @@ jobs:
strategy: strategy:
matrix: matrix:
node-version: [14.x] node-version: [12.x]
steps: steps:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
@@ -17,8 +17,6 @@ jobs:
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
node-version: ${{ matrix.node-version }} node-version: ${{ matrix.node-version }}
- name: Set up npm7
run: npm i -g npm@7
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v1 uses: shivammathur/setup-php@v1
with: with:

View File

@@ -19,7 +19,7 @@ jobs:
matrix: matrix:
php-versions: ['7.4'] php-versions: ['7.4']
databases: ['sqlite', 'mysql', 'pgsql'] databases: ['sqlite', 'mysql', 'pgsql']
server-versions: ['stable22'] server-versions: ['master']
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}

View File

@@ -47,7 +47,7 @@ jobs:
strategy: strategy:
matrix: matrix:
node-version: [14.x] node-version: [12.x]
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
@@ -55,8 +55,6 @@ jobs:
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
node-version: ${{ matrix.node-version }} node-version: ${{ matrix.node-version }}
- name: Set up npm7
run: npm i -g npm@7
- name: Install dependencies - name: Install dependencies
run: npm ci run: npm ci
- name: ESLint - name: ESLint
@@ -67,7 +65,7 @@ jobs:
strategy: strategy:
matrix: matrix:
node-versions: [14.x] node-versions: [12.x]
name: stylelint node${{ matrix.node-versions }} name: stylelint node${{ matrix.node-versions }}
steps: steps:
@@ -78,9 +76,6 @@ jobs:
with: with:
node-versions: ${{ matrix.node-versions }} node-versions: ${{ matrix.node-versions }}
- name: Set up npm7
run: npm i -g npm@7
- name: Install dependencies - name: Install dependencies
run: npm ci run: npm ci

View File

@@ -14,7 +14,7 @@ jobs:
strategy: strategy:
matrix: matrix:
node-version: [14.x] node-version: [12.x]
steps: steps:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
@@ -22,8 +22,6 @@ jobs:
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
node-version: ${{ matrix.node-version }} node-version: ${{ matrix.node-version }}
- name: Set up npm7
run: npm i -g npm@7
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v1 uses: shivammathur/setup-php@v1
with: with:

View File

@@ -9,7 +9,7 @@ jobs:
strategy: strategy:
matrix: matrix:
node-version: [14.x] node-version: [12.x]
steps: steps:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
@@ -17,8 +17,6 @@ jobs:
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
node-version: ${{ matrix.node-version }} node-version: ${{ matrix.node-version }}
- name: Set up npm7
run: npm i -g npm@7
- name: install dependencies - name: install dependencies
run: | run: |
npm ci npm ci

View File

@@ -20,7 +20,7 @@ jobs:
matrix: matrix:
php-versions: ['7.3', '7.4'] php-versions: ['7.3', '7.4']
databases: ['sqlite', 'mysql', 'pgsql'] databases: ['sqlite', 'mysql', 'pgsql']
server-versions: ['stable22'] server-versions: ['master']
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
ocp-version: [ 'dev-stable22' ] ocp-version: [ 'dev-master' ]
name: Nextcloud ${{ matrix.ocp-version }} name: Nextcloud ${{ matrix.ocp-version }}
steps: steps:
- name: Checkout - name: Checkout

View File

@@ -1,40 +1,6 @@
# Changelog # Changelog
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## 1.5.0 - 2021-07-09
### Added
* Nextcloud 22 compatibility
* [#3105](https://github.com/nextcloud/deck/pull/3105) Compatibility with Cirlces changes in 22
* [#3147](https://github.com/nextcloud/deck/pull/3147) Add card button to the dashboard widget @jakobroehrl
* [#2854](https://github.com/nextcloud/deck/pull/2854) Add card button in card overview @jakobroehrl
* [#3078](https://github.com/nextcloud/deck/pull/3078) Show on shared boards unassigned cards to all users @jakobroehrl
### Fixed
* [#2935](https://github.com/nextcloud/deck/pull/2935) Rich object string parameters for notifications @nickvergessen
* [#2950](https://github.com/nextcloud/deck/pull/2950) Remove notification on unshare and add type hints
* [#2983](https://github.com/nextcloud/deck/pull/2983) Fix codemirror description width
* [#2989](https://github.com/nextcloud/deck/pull/2989) Fix unified comments search with postgres
* [#3005](https://github.com/nextcloud/deck/pull/3005) Do not query the lookupserver when looking for sharees
* [#3011](https://github.com/nextcloud/deck/pull/3011) L10n: Spelling unification @Valdnet
* [#3014](https://github.com/nextcloud/deck/pull/3014) Proper error handling when fetching comments fails
* [#3016](https://github.com/nextcloud/deck/pull/3016) Allow searching for filters without a query to match all that have a given filter set
* [#3021](https://github.com/nextcloud/deck/pull/3021) L10n: Add word "Card" @Valdnet
* [#3025](https://github.com/nextcloud/deck/pull/3025) Show comment counter and highlight if unread comments are available
* [#3036](https://github.com/nextcloud/deck/pull/3036) Add link to migration tool for Trello @maxammann
* [#3037](https://github.com/nextcloud/deck/pull/3037) Catch any error during circle detail fetching
* [#3038](https://github.com/nextcloud/deck/pull/3038) Get attachment from the user node instead of the share source
* [#3092](https://github.com/nextcloud/deck/pull/3092) Refactor update to have proper order of optional parameters
* [#3113](https://github.com/nextcloud/deck/pull/3113) Use new viewer syntax with destructuring object @azul
* [#3142](https://github.com/nextcloud/deck/pull/3142) Always pass user id in share provider
* [#3152](https://github.com/nextcloud/deck/pull/3152) Only offer stack creation in emptycontent with proper permissions
* [#3165](https://github.com/nextcloud/deck/pull/3165) Always log generic exceptions
* [#3168](https://github.com/nextcloud/deck/pull/3168) Reduce duplicate queries when fetching user boards an permissions
## 1.4.0 - 2021-04-13 ## 1.4.0 - 2021-04-13
### Added ### Added
@@ -69,15 +35,15 @@ All notable changes to this project will be documented in this file.
## 1.3.0-beta2 ## 1.3.0-beta2
### Fixed ### Fixed
* [#2700](https://github.com/nextcloud/deck/pull/2700) Attempt to copy file on dropping it to deck * [#2700](https://github.com/nextcloud/deck/pull/2700) Attempt to copy file on dropping it to deck @juliushaertl
* [#2701](https://github.com/nextcloud/deck/pull/2701) Fix uploading files by drag and drop * [#2701](https://github.com/nextcloud/deck/pull/2701) Fix uploading files by drag and drop @juliushaertl
* [#2707](https://github.com/nextcloud/deck/pull/2707) L10n: Change to a capital letter @Valdnet * [#2707](https://github.com/nextcloud/deck/pull/2707) L10n: Change to a capital letter @Valdnet
* [#2712](https://github.com/nextcloud/deck/pull/2712) Docs: Fix table in section "GET /api/v1.0/config" @das-g * [#2712](https://github.com/nextcloud/deck/pull/2712) Docs: Fix table in section "GET /api/v1.0/config" @das-g
* [#2716](https://github.com/nextcloud/deck/pull/2716) Remove repair step which is no longer needed as we cleanup properly * [#2716](https://github.com/nextcloud/deck/pull/2716) Remove repair step which is no longer needed as we cleanup properly @juliushaertl
* [#2723](https://github.com/nextcloud/deck/pull/2723) Pad random color with leading zeroes @PVince81 * [#2723](https://github.com/nextcloud/deck/pull/2723) Pad random color with leading zeroes @PVince81
* [#2729](https://github.com/nextcloud/deck/pull/2729) Remove invalid activity parameters @nickvergessen * [#2729](https://github.com/nextcloud/deck/pull/2729) Remove invalid activity parameters @nickvergessen
* [#2750](https://github.com/nextcloud/deck/pull/2750) Fix deck activity emails not being translated @nickvergessen * [#2750](https://github.com/nextcloud/deck/pull/2750) Fix deck activity emails not being translated @nickvergessen
* [#2751](https://github.com/nextcloud/deck/pull/2751) Properly set author for activity events that are triggered by cron * [#2751](https://github.com/nextcloud/deck/pull/2751) Properly set author for activity events that are triggered by cron @juliushaertl
## 1.2.2 - 2020-11-24 ## 1.2.2 - 2020-11-24
@@ -186,31 +152,31 @@ All notable changes to this project will be documented in this file.
### Fixed ### Fixed
* [#2116](https://github.com/nextcloud/deck/pull/2116) Fix navigation layout issues * [#2116](https://github.com/nextcloud/deck/pull/2116) Fix navigation layout issues @juliushaertl
* [#2118](https://github.com/nextcloud/deck/pull/2118) Use proper parameter when handling attachments * [#2118](https://github.com/nextcloud/deck/pull/2118) Use proper parameter when handling attachments @juliushaertl
## 1.0.4 - 2020-06-26 ## 1.0.4 - 2020-06-26
### Fixed ### Fixed
* [#2062](https://github.com/nextcloud/deck/pull/2062) Fix saving card description after toggling checkboxes * [#2062](https://github.com/nextcloud/deck/pull/2062) Fix saving card description after toggling checkboxes @juliushaertl
* [#2065](https://github.com/nextcloud/deck/pull/2065) Adding CSS rule for Markdown Blockquotes @reox * [#2065](https://github.com/nextcloud/deck/pull/2065) Adding CSS rule for Markdown Blockquotes @reox
* [#2059](https://github.com/nextcloud/deck/pull/2059) Fix fetching attachments on card change * [#2059](https://github.com/nextcloud/deck/pull/2059) Fix fetching attachments on card change @juliushaertl
* [#2060](https://github.com/nextcloud/deck/pull/2060) Use mixing for relative date in card sidebar * [#2060](https://github.com/nextcloud/deck/pull/2060) Use mixing for relative date in card sidebar @juliushaertl
## 1.0.3 - 2020-06-19 ## 1.0.3 - 2020-06-19
### Fixed ### Fixed
* [#2019](https://github.com/nextcloud/deck/pull/2019) Remove old global css rule * [#2019](https://github.com/nextcloud/deck/pull/2019) Remove old global css rule @juliushaertl
* [#2020](https://github.com/nextcloud/deck/pull/2020) Fix navigation issue with leftover nodes * [#2020](https://github.com/nextcloud/deck/pull/2020) Fix navigation issue with leftover nodes @juliushaertl
* [#2021](https://github.com/nextcloud/deck/pull/2021) Fix description issues * [#2021](https://github.com/nextcloud/deck/pull/2021) Fix description issues @juliushaertl
* [#2022](https://github.com/nextcloud/deck/pull/2022) Fix replyto issues with the comments API * [#2022](https://github.com/nextcloud/deck/pull/2022) Fix replyto issues with the comments API @juliushaertl
* [#2027](https://github.com/nextcloud/deck/pull/2027) Allow to unassign current user from card * [#2027](https://github.com/nextcloud/deck/pull/2027) Allow to unassign current user from card @juliushaertl
* [#2029](https://github.com/nextcloud/deck/pull/2029) Fix wording : stack -> list @cloud2018 * [#2029](https://github.com/nextcloud/deck/pull/2029) Fix wording : stack -> list @cloud2018
* [#2032](https://github.com/nextcloud/deck/pull/2032) Force order by id as second sorting key * [#2032](https://github.com/nextcloud/deck/pull/2032) Force order by id as second sorting key @juliushaertl
* [#2045](https://github.com/nextcloud/deck/pull/2045) Improve label styling * [#2045](https://github.com/nextcloud/deck/pull/2045) Improve label styling @juliushaertl
* [#2010](https://github.com/nextcloud/deck/pull/2010) User documentation fixes @Nyco * [#2010](https://github.com/nextcloud/deck/pull/2010) User documentation fixes @Nyco
* [#1998](https://github.com/nextcloud/deck/pull/1998) Add Checklist explaination to the doc @4rnoP * [#1998](https://github.com/nextcloud/deck/pull/1998) Add Checklist explaination to the doc @4rnoP

View File

@@ -17,7 +17,7 @@
- 🚀 Get your project organized - 🚀 Get your project organized
</description> </description>
<version>1.5.0</version> <version>2.0.0-alpha1</version>
<licence>agpl</licence> <licence>agpl</licence>
<author>Julius Härtl</author> <author>Julius Härtl</author>
<namespace>Deck</namespace> <namespace>Deck</namespace>

View File

@@ -14,7 +14,7 @@
"require-dev": { "require-dev": {
"roave/security-advisories": "dev-master", "roave/security-advisories": "dev-master",
"christophwurst/nextcloud": "^21@dev", "christophwurst/nextcloud": "^21@dev",
"phpunit/phpunit": "^9", "phpunit/phpunit": "^8",
"nextcloud/coding-standard": "^0.5.0", "nextcloud/coding-standard": "^0.5.0",
"symfony/event-dispatcher": "^4.0", "symfony/event-dispatcher": "^4.0",
"vimeo/psalm": "^4.3", "vimeo/psalm": "^4.3",

967
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -102,7 +102,7 @@ OC.L10N.register(
"No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s", "No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s",
"Card not found" : "Karta nebyla nalezena", "Card not found" : "Karta nebyla nalezena",
"Path is already shared with this card" : "Cesta je již s touto kartou sdílena", "Path is already shared with this card" : "Cesta je již s touto kartou sdílena",
"Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum je třeba, aby formát data byl RRRR-MM-DD", "Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum, formát data musí být RRRR-MM-DD",
"Personal planning and team project organization" : "Osobní plánování a organizování týmového projektu", "Personal planning and team project organization" : "Osobní plánování a organizování týmového projektu",
"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 je nástroj cílený na osobní nebo projektové plánování týmů v Kanban stylu, vestavěný v Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky \n- 🔖 Přiřazujte štítky pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 🚀 Dostaňte svůj projekt pod kontrolu", "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 je nástroj cílený na osobní nebo projektové plánování týmů v Kanban stylu, vestavěný v Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky \n- 🔖 Přiřazujte štítky pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 🚀 Dostaňte svůj projekt pod kontrolu",
"Card details" : "Podrobnosti o kartě", "Card details" : "Podrobnosti o kartě",
@@ -191,7 +191,7 @@ OC.L10N.register(
"Delete Attachment" : "Smazat přílohu", "Delete Attachment" : "Smazat přílohu",
"Restore Attachment" : "Obnovit přílohu", "Restore Attachment" : "Obnovit přílohu",
"File to share" : "Soubor ke sdílení", "File to share" : "Soubor ke sdílení",
"Invalid path selected" : "Je vybrán neplatný popis umístění", "Invalid path selected" : "Je vybrána neplatná cesta",
"Open in sidebar view" : "Otevřít v zobrazení v postranním panelu", "Open in sidebar view" : "Otevřít v zobrazení v postranním panelu",
"Open in bigger view" : "Otevřít ve větším zobrazení", "Open in bigger view" : "Otevřít ve větším zobrazení",
"Attachments" : "Přílohy", "Attachments" : "Přílohy",
@@ -213,7 +213,7 @@ OC.L10N.register(
"The comment cannot be empty." : "Komentář je třeba vyplnit.", "The comment cannot be empty." : "Komentář je třeba vyplnit.",
"The comment cannot be longer than 1000 characters." : "Délka komentáře může být nejvýše 1 000 znaků.", "The comment cannot be longer than 1000 characters." : "Délka komentáře může být nejvýše 1 000 znaků.",
"In reply to" : "V odpověď na", "In reply to" : "V odpověď na",
"Cancel reply" : "Zrušit odpověď", "Cancel reply" : "Odebrat odpověď",
"Reply" : "Odpovědět", "Reply" : "Odpovědět",
"Update" : "Aktualizovat", "Update" : "Aktualizovat",
"Description" : "Popis", "Description" : "Popis",

View File

@@ -100,7 +100,7 @@
"No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s", "No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s",
"Card not found" : "Karta nebyla nalezena", "Card not found" : "Karta nebyla nalezena",
"Path is already shared with this card" : "Cesta je již s touto kartou sdílena", "Path is already shared with this card" : "Cesta je již s touto kartou sdílena",
"Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum je třeba, aby formát data byl RRRR-MM-DD", "Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum, formát data musí být RRRR-MM-DD",
"Personal planning and team project organization" : "Osobní plánování a organizování týmového projektu", "Personal planning and team project organization" : "Osobní plánování a organizování týmového projektu",
"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 je nástroj cílený na osobní nebo projektové plánování týmů v Kanban stylu, vestavěný v Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky \n- 🔖 Přiřazujte štítky pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 🚀 Dostaňte svůj projekt pod kontrolu", "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 je nástroj cílený na osobní nebo projektové plánování týmů v Kanban stylu, vestavěný v Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky \n- 🔖 Přiřazujte štítky pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 🚀 Dostaňte svůj projekt pod kontrolu",
"Card details" : "Podrobnosti o kartě", "Card details" : "Podrobnosti o kartě",
@@ -189,7 +189,7 @@
"Delete Attachment" : "Smazat přílohu", "Delete Attachment" : "Smazat přílohu",
"Restore Attachment" : "Obnovit přílohu", "Restore Attachment" : "Obnovit přílohu",
"File to share" : "Soubor ke sdílení", "File to share" : "Soubor ke sdílení",
"Invalid path selected" : "Je vybrán neplatný popis umístění", "Invalid path selected" : "Je vybrána neplatná cesta",
"Open in sidebar view" : "Otevřít v zobrazení v postranním panelu", "Open in sidebar view" : "Otevřít v zobrazení v postranním panelu",
"Open in bigger view" : "Otevřít ve větším zobrazení", "Open in bigger view" : "Otevřít ve větším zobrazení",
"Attachments" : "Přílohy", "Attachments" : "Přílohy",
@@ -211,7 +211,7 @@
"The comment cannot be empty." : "Komentář je třeba vyplnit.", "The comment cannot be empty." : "Komentář je třeba vyplnit.",
"The comment cannot be longer than 1000 characters." : "Délka komentáře může být nejvýše 1 000 znaků.", "The comment cannot be longer than 1000 characters." : "Délka komentáře může být nejvýše 1 000 znaků.",
"In reply to" : "V odpověď na", "In reply to" : "V odpověď na",
"Cancel reply" : "Zrušit odpověď", "Cancel reply" : "Odebrat odpověď",
"Reply" : "Odpovědět", "Reply" : "Odpovědět",
"Update" : "Aktualizovat", "Update" : "Aktualizovat",
"Description" : "Popis", "Description" : "Popis",

View File

@@ -17,42 +17,42 @@ OC.L10N.register(
"{user} has archived the board {before}" : "{user} archiválta a(z) {before} táblát", "{user} has archived the board {before}" : "{user} archiválta a(z) {before} táblát",
"You have unarchived the board {board}" : "Visszavonta a(z) {board} tábla archiválását", "You have unarchived the board {board}" : "Visszavonta a(z) {board} tábla archiválását",
"{user} has unarchived the board {before}" : "{user} visszavonta a(z) {board} tábla archiválását", "{user} has unarchived the board {before}" : "{user} visszavonta a(z) {board} tábla archiválását",
"You have created a new list {stack} on board {board}" : "Létrehozta az új {stack} listát a(z) {board} táblán", "You have created a new list {stack} on board {board}" : "Létrehozta az új {stack} rakást a(z) {board} táblán",
"{user} has created a new list {stack} on board {board}" : "{user} létrehozta az új {stack} listát a(z) {board} táblán", "{user} has created a new list {stack} on board {board}" : "{user} létrehozta az új {stack} rakást a(z) {board} táblán",
"You have renamed list {before} to {stack} on board {board}" : "Átnevezte a(z) {board} tábla {before} listát erre: {stack}", "You have renamed list {before} to {stack} on board {board}" : "Átnevezte a(z) {board} tábla {before} rakását erre: {stack}",
"{user} has renamed list {before} to {stack} on board {board}" : "{user} átnevezte a(z) {board} tábla {before} listáját erre: {stack}", "{user} has renamed list {before} to {stack} on board {board}" : "{user} átnevezte a(z) {board} táblá {before} rakását erre: {stack}",
"You have deleted list {stack} on board {board}" : "Törölte a(z) {stack} listát a(z) {board} tábláról", "You have deleted list {stack} on board {board}" : "Törölte a(z) {stack} rakást a(z) {board} tábláról",
"{user} has deleted list {stack} on board {board}" : "{user} törölte a(z) {stack} listát a(z) {board} tábláról", "{user} has deleted list {stack} on board {board}" : "{user} törölte a(z) {stack} rakást a(z) {board} tábláról",
"You have created card {card} in list {stack} on board {board}" : "Létrehozta a(z) {card} kártyát a(z) {stack} listában, a(z) {board} táblán", "You have created card {card} in list {stack} on board {board}" : "Létrehozta a(z) {card} kártyát a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has created card {card} in list {stack} on board {board}" : "{user} létrehozta a(z) {card} kártyát a(z) {stack} listában, a(z) {board} táblán", "{user} has created card {card} in list {stack} on board {board}" : "{user} létrehozta a(z) {card} kártyát a(z) {stack} rakásban, a(z) {board} táblán",
"You have deleted card {card} in list {stack} on board {board}" : "Törölte a(z) {card} kártyát a(z) {stack} listából, a(z) {board} táblán", "You have deleted card {card} in list {stack} on board {board}" : "Törölte a(z) {card} kártyát a(z) {stack} rakásból, a(z) {board} táblán",
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} törölte a(z) {card} kártyát a(z) {stack} listában, a(z) {board} táblán", "{user} has deleted card {card} in list {stack} on board {board}" : "{user} törölte a(z) {card} kártyát a(z) {stack} rakásban, a(z) {board} táblán",
"You have renamed the card {before} to {card}" : "Átnevezte a(z) {before} kártyát erre: {card}", "You have renamed the card {before} to {card}" : "Átnevezte a(z) {before} kártyát erre: {card}",
"{user} has renamed the card {before} to {card}" : "{user} átnevezte a(z) {before} kártyát erre: {card}", "{user} has renamed the card {before} to {card}" : "{user} átnevezte a(z) {before} kártyát erre: {card}",
"You have added a description to card {card} in list {stack} on board {board}" : "Leírást adott hozzá a(z) {card} kártyához a(z) {stack} listában, a(z) {board} táblán", "You have added a description to card {card} in list {stack} on board {board}" : "Leírást adott hozzá a(z) {card} kártyához a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} leírást adott hozzá a(z) {card} kártyához a(z) {stack} listában, a(z) {board} táblán", "{user} has added a description to card {card} in list {stack} on board {board}" : "{user} leírást adott hozzá a(z) {card} kártyához a(z) {stack} rakásban, a(z) {board} táblán",
"You have updated the description of card {card} in list {stack} on board {board}" : "Frissítette a(z) {card} kártya leírását a(z) {stack} listában, a(z) {board} táblán", "You have updated the description of card {card} in list {stack} on board {board}" : "Frissítette a(z) {card} kártya leírását a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} frissítette a(z) {card} kártya leírását a(z) {stack} listában, a(z) {board} táblán", "{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} frissítette a(z) {card} kártya leírását a(z) {stack} rakásban, a(z) {board} táblán",
"You have archived card {card} in list {stack} on board {board}" : "Archiválta a(z) {card} kártyát a(z) {stack} listában, a(z) {board} táblán", "You have archived card {card} in list {stack} on board {board}" : "Archiválta a(z) {card} kártyát a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has archived card {card} in list {stack} on board {board}" : "{user} archiválta a(z) {card} kártyát a(z) {stack} listában, a(z) {board} táblán", "{user} has archived card {card} in list {stack} on board {board}" : "{user} archiválta a(z) {card} kártyát a(z) {stack} rakásban, a(z) {board} táblán",
"You have unarchived card {card} in list {stack} on board {board}" : "Visszavonta a(z) {card} kártya archiválását a(z) {stack} listában, a(z) {board} táblán", "You have unarchived card {card} in list {stack} on board {board}" : "Visszavonta a(z) {card} kártya archiválását a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} visszavonta a(z) {card} kártya archiválását a(z) {stack} listában, a(z) {board} táblán", "{user} has unarchived card {card} in list {stack} on board {board}" : "{user} visszavonta a(z) {card} kártya archiválását a(z) {stack} rakásban, a(z) {board} táblán",
"You have removed the due date of card {card}" : "Eltávolította a(z) {card} kártya esedékességét", "You have removed the due date of card {card}" : "Eltávolította a(z) {card} kártya esedékességét",
"{user} has removed the due date of card {card}" : "{user} eltávolította a(z) {card} kártya esedékességét", "{user} has removed the due date of card {card}" : "{user} eltávolította a(z) {card} kártya esedékességét",
"You have set the due date of card {card} to {after}" : "Beállította a(z) {card} kártya esedékességét", "You have set the due date of card {card} to {after}" : "Beállította a(z) {card} kártya esedékességét",
"{user} has set the due date of card {card} to {after}" : "{user} beállította a(z) {card} kártya esedékességét", "{user} has set the due date of card {card} to {after}" : "{user} beállította a(z) {card} kártya esedékességét",
"You have updated the due date of card {card} to {after}" : "Frissítette a(z) {card} kártya esedékességét erre: {after}", "You have updated the due date of card {card} to {after}" : "Frissítette a(z) {card} kártya esedékességét erre: {after}",
"{user} has updated the due date of card {card} to {after}" : "{user} frissítette a(z) {card} kártya esedékességét erre: {after}", "{user} has updated the due date of card {card} to {after}" : "{user} frissítette a(z) {card} kártya esedékességét erre: {after}",
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Hozzáadta a(z) {label} címkét a(z) {card} kártyához, a(z) {stack} listában, a(z) {board} táblán", "You have added the tag {label} to card {card} in list {stack} on board {board}" : "Hozzáadta a(z) {label} címkét a(z) {card} kártyához, a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} hozzáadta a(z) {label} címkét a(z) {card} kártyához, a(z) {stack} listában, a(z) {board} táblán", "{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} hozzáadta a(z) {label} címkét a(z) {card} kártyához, a(z) {stack} rakásban, a(z) {board} táblán",
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Eltávolította a(z) {label} címkét a(z) {card} kártyáról, a(z) {stack} listában, a(z) {board} táblán", "You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Eltávolította a(z) {label} címkét a(z) {card} kártyáról, a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has removed the tag {label} from card {card} in list {stack} on board {board}" : "{user} eltávolította a(z) {label} címkét a(z) {card} kártyáról, a(z) {stack} listában, a(z) {board} táblán", "{user} has removed the tag {label} from card {card} in list {stack} on board {board}" : "{user} eltávolította a(z) {label} címkét a(z) {card} kártyáról, a(z) {stack} rakásban, a(z) {board} táblán",
"You have assigned {assigneduser} to card {card} on board {board}" : "Hozzárendelte a(z) {card} kártyát a(z) {board} táblán a következőhöz: {assigneduser}", "You have assigned {assigneduser} to card {card} on board {board}" : "Hozzárendelte a(z) {card} kártyát a(z) {board} táblán a következőhöz: {assigneduser}",
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} hozzárendelte a(z) {card} kártyát a(z) {board} táblán a következőhöz: {assigneduser}", "{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} hozzárendelte a(z) {card} kártyát a(z) {board} táblán a következőhöz: {assigneduser}",
"You have unassigned {assigneduser} from card {card} on board {board}" : "Eltávolította a(z) {card} kártyát a(z) {board} táblán a következőtől: {assigneduser}", "You have unassigned {assigneduser} from card {card} on board {board}" : "Eltávolította a(z) {card} kártyát a(z) {board} táblán a következőtől: {assigneduser}",
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} eltávolította a(z) {card} kártyát a(z) {board} táblán a következőtől: {assigneduser}", "{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} eltávolította a(z) {card} kártyát a(z) {board} táblán a következőtől: {assigneduser}",
"You have moved the card {card} from list {stackBefore} to {stack}" : "Áthelyezte a(z) {card} kártyát a(z) {stackBefore} listából a(z) {stack} listába", "You have moved the card {card} from list {stackBefore} to {stack}" : "Áthelyezte a(z) {card} kártyát a(z) {stackBefore} rakásból a(z) {stack} rakásba",
"{user} has moved the card {card} from list {stackBefore} to {stack}" : "{user} áthelyezte a(z) {card} kártyát a(z) {stackBefore} listából a(z) {stack} listába", "{user} has moved the card {card} from list {stackBefore} to {stack}" : "{user} áthelyezte a(z) {card} kártyát a(z) {stackBefore} rakásból a(z) {stack} rakásba",
"You have added the attachment {attachment} to card {card}" : "Hozzáadta a(z) {attachment} mellékletet a(z) {card} kártyához", "You have added the attachment {attachment} to card {card}" : "Hozzáadta a(z) {attachment} mellékletet a(z) {card} kártyához",
"{user} has added the attachment {attachment} to card {card}" : "{user} hozzáadta a(z) {attachment} mellékletet a(z) {card} kártyához", "{user} has added the attachment {attachment} to card {card}" : "{user} hozzáadta a(z) {attachment} mellékletet a(z) {card} kártyához",
"You have updated the attachment {attachment} on card {card}" : "Frissítette a(z) {attachment} mellékletet a(z) {card} kártyánál", "You have updated the attachment {attachment} on card {card}" : "Frissítette a(z) {attachment} mellékletet a(z) {card} kártyánál",
@@ -73,7 +73,7 @@ OC.L10N.register(
"The card \"%s\" on \"%s\" has reached its due date." : "A(z) „%s” kártya a(z) „%s” táblán elérte a határidejét.", "The card \"%s\" on \"%s\" has reached its due date." : "A(z) „%s” kártya a(z) „%s” táblán elérte a határidejét.",
"%s has mentioned you in a comment on \"%s\"." : "%s megemlítette egy hozzászólásban ennél: „%s”.", "%s has mentioned you in a comment on \"%s\"." : "%s megemlítette egy hozzászólásban ennél: „%s”.",
"The board \"%s\" has been shared with you by %s." : "A(z) „%s” táblát %s osztotta meg Önnel.", "The board \"%s\" has been shared with you by %s." : "A(z) „%s” táblát %s osztotta meg Önnel.",
"Card comments" : "Kártya hozzászólásai", "Card comments" : "Kártyák hozzászólások",
"%s on %s" : "%s ezen: %s", "%s on %s" : "%s ezen: %s",
"No data was provided to create an attachment." : "Nincsenek megadva adatok a melléklet létrehozásához.", "No data was provided to create an attachment." : "Nincsenek megadva adatok a melléklet létrehozásához.",
"Finished" : "Kész", "Finished" : "Kész",
@@ -143,8 +143,8 @@ OC.L10N.register(
"Toggle compact mode" : "Kompakt mód be/ki", "Toggle compact mode" : "Kompakt mód be/ki",
"Details" : "Részletek", "Details" : "Részletek",
"Loading board" : "Tábla betöltése", "Loading board" : "Tábla betöltése",
"No lists available" : "Nincs elérhető lista", "No lists available" : "Nincs elérhető rakás",
"Create a new list to add cards to this board" : "Hozzon létre egy új listát a kártyák ehhez a táblához való hozzáadásához", "Create a new list to add cards to this board" : "Hozzon létre egy új rakást kártyák ehhez a táblához való hozzáadásához",
"Board not found" : "A tábla nem található", "Board not found" : "A tábla nem található",
"Sharing" : "Megosztás", "Sharing" : "Megosztás",
"Tags" : "Címkék", "Tags" : "Címkék",
@@ -154,7 +154,7 @@ OC.L10N.register(
"Undo" : "Visszavonás", "Undo" : "Visszavonás",
"Deleted cards" : "Törölt kártyák", "Deleted cards" : "Törölt kártyák",
"Share board with a user, group or circle …" : "Tábla megosztása felhasználóval, csoporttal vagy körrel…", "Share board with a user, group or circle …" : "Tábla megosztása felhasználóval, csoporttal vagy körrel…",
"Searching for users, groups and circles …" : "Felhasználók, csoportok és körök keresése", "Searching for users, groups and circles …" : "Felhasználókkal, csoportok és körök keresése",
"No participants found" : "Nem találhatók résztvevők", "No participants found" : "Nem találhatók résztvevők",
"Board owner" : "Tábla tulajdonosa", "Board owner" : "Tábla tulajdonosa",
"(Group)" : "(Csoport)", "(Group)" : "(Csoport)",
@@ -168,7 +168,7 @@ OC.L10N.register(
"Archive all cards" : "Az összes kártya archiválása", "Archive all cards" : "Az összes kártya archiválása",
"Delete list" : "Lista törlése", "Delete list" : "Lista törlése",
"Add card" : "Kártya hozzáadása", "Add card" : "Kártya hozzáadása",
"Archive all cards in this list" : "Az összes kártya archiválása ebben a listában", "Archive all cards in this list" : "Archív kártyák ebben a listában",
"Add a new card" : "Új kártya hozzáadása", "Add a new card" : "Új kártya hozzáadása",
"Card name" : "Kártya neve", "Card name" : "Kártya neve",
"List deleted" : "Lista törölve", "List deleted" : "Lista törölve",

View File

@@ -15,42 +15,42 @@
"{user} has archived the board {before}" : "{user} archiválta a(z) {before} táblát", "{user} has archived the board {before}" : "{user} archiválta a(z) {before} táblát",
"You have unarchived the board {board}" : "Visszavonta a(z) {board} tábla archiválását", "You have unarchived the board {board}" : "Visszavonta a(z) {board} tábla archiválását",
"{user} has unarchived the board {before}" : "{user} visszavonta a(z) {board} tábla archiválását", "{user} has unarchived the board {before}" : "{user} visszavonta a(z) {board} tábla archiválását",
"You have created a new list {stack} on board {board}" : "Létrehozta az új {stack} listát a(z) {board} táblán", "You have created a new list {stack} on board {board}" : "Létrehozta az új {stack} rakást a(z) {board} táblán",
"{user} has created a new list {stack} on board {board}" : "{user} létrehozta az új {stack} listát a(z) {board} táblán", "{user} has created a new list {stack} on board {board}" : "{user} létrehozta az új {stack} rakást a(z) {board} táblán",
"You have renamed list {before} to {stack} on board {board}" : "Átnevezte a(z) {board} tábla {before} listát erre: {stack}", "You have renamed list {before} to {stack} on board {board}" : "Átnevezte a(z) {board} tábla {before} rakását erre: {stack}",
"{user} has renamed list {before} to {stack} on board {board}" : "{user} átnevezte a(z) {board} tábla {before} listáját erre: {stack}", "{user} has renamed list {before} to {stack} on board {board}" : "{user} átnevezte a(z) {board} táblá {before} rakását erre: {stack}",
"You have deleted list {stack} on board {board}" : "Törölte a(z) {stack} listát a(z) {board} tábláról", "You have deleted list {stack} on board {board}" : "Törölte a(z) {stack} rakást a(z) {board} tábláról",
"{user} has deleted list {stack} on board {board}" : "{user} törölte a(z) {stack} listát a(z) {board} tábláról", "{user} has deleted list {stack} on board {board}" : "{user} törölte a(z) {stack} rakást a(z) {board} tábláról",
"You have created card {card} in list {stack} on board {board}" : "Létrehozta a(z) {card} kártyát a(z) {stack} listában, a(z) {board} táblán", "You have created card {card} in list {stack} on board {board}" : "Létrehozta a(z) {card} kártyát a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has created card {card} in list {stack} on board {board}" : "{user} létrehozta a(z) {card} kártyát a(z) {stack} listában, a(z) {board} táblán", "{user} has created card {card} in list {stack} on board {board}" : "{user} létrehozta a(z) {card} kártyát a(z) {stack} rakásban, a(z) {board} táblán",
"You have deleted card {card} in list {stack} on board {board}" : "Törölte a(z) {card} kártyát a(z) {stack} listából, a(z) {board} táblán", "You have deleted card {card} in list {stack} on board {board}" : "Törölte a(z) {card} kártyát a(z) {stack} rakásból, a(z) {board} táblán",
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} törölte a(z) {card} kártyát a(z) {stack} listában, a(z) {board} táblán", "{user} has deleted card {card} in list {stack} on board {board}" : "{user} törölte a(z) {card} kártyát a(z) {stack} rakásban, a(z) {board} táblán",
"You have renamed the card {before} to {card}" : "Átnevezte a(z) {before} kártyát erre: {card}", "You have renamed the card {before} to {card}" : "Átnevezte a(z) {before} kártyát erre: {card}",
"{user} has renamed the card {before} to {card}" : "{user} átnevezte a(z) {before} kártyát erre: {card}", "{user} has renamed the card {before} to {card}" : "{user} átnevezte a(z) {before} kártyát erre: {card}",
"You have added a description to card {card} in list {stack} on board {board}" : "Leírást adott hozzá a(z) {card} kártyához a(z) {stack} listában, a(z) {board} táblán", "You have added a description to card {card} in list {stack} on board {board}" : "Leírást adott hozzá a(z) {card} kártyához a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} leírást adott hozzá a(z) {card} kártyához a(z) {stack} listában, a(z) {board} táblán", "{user} has added a description to card {card} in list {stack} on board {board}" : "{user} leírást adott hozzá a(z) {card} kártyához a(z) {stack} rakásban, a(z) {board} táblán",
"You have updated the description of card {card} in list {stack} on board {board}" : "Frissítette a(z) {card} kártya leírását a(z) {stack} listában, a(z) {board} táblán", "You have updated the description of card {card} in list {stack} on board {board}" : "Frissítette a(z) {card} kártya leírását a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} frissítette a(z) {card} kártya leírását a(z) {stack} listában, a(z) {board} táblán", "{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} frissítette a(z) {card} kártya leírását a(z) {stack} rakásban, a(z) {board} táblán",
"You have archived card {card} in list {stack} on board {board}" : "Archiválta a(z) {card} kártyát a(z) {stack} listában, a(z) {board} táblán", "You have archived card {card} in list {stack} on board {board}" : "Archiválta a(z) {card} kártyát a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has archived card {card} in list {stack} on board {board}" : "{user} archiválta a(z) {card} kártyát a(z) {stack} listában, a(z) {board} táblán", "{user} has archived card {card} in list {stack} on board {board}" : "{user} archiválta a(z) {card} kártyát a(z) {stack} rakásban, a(z) {board} táblán",
"You have unarchived card {card} in list {stack} on board {board}" : "Visszavonta a(z) {card} kártya archiválását a(z) {stack} listában, a(z) {board} táblán", "You have unarchived card {card} in list {stack} on board {board}" : "Visszavonta a(z) {card} kártya archiválását a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} visszavonta a(z) {card} kártya archiválását a(z) {stack} listában, a(z) {board} táblán", "{user} has unarchived card {card} in list {stack} on board {board}" : "{user} visszavonta a(z) {card} kártya archiválását a(z) {stack} rakásban, a(z) {board} táblán",
"You have removed the due date of card {card}" : "Eltávolította a(z) {card} kártya esedékességét", "You have removed the due date of card {card}" : "Eltávolította a(z) {card} kártya esedékességét",
"{user} has removed the due date of card {card}" : "{user} eltávolította a(z) {card} kártya esedékességét", "{user} has removed the due date of card {card}" : "{user} eltávolította a(z) {card} kártya esedékességét",
"You have set the due date of card {card} to {after}" : "Beállította a(z) {card} kártya esedékességét", "You have set the due date of card {card} to {after}" : "Beállította a(z) {card} kártya esedékességét",
"{user} has set the due date of card {card} to {after}" : "{user} beállította a(z) {card} kártya esedékességét", "{user} has set the due date of card {card} to {after}" : "{user} beállította a(z) {card} kártya esedékességét",
"You have updated the due date of card {card} to {after}" : "Frissítette a(z) {card} kártya esedékességét erre: {after}", "You have updated the due date of card {card} to {after}" : "Frissítette a(z) {card} kártya esedékességét erre: {after}",
"{user} has updated the due date of card {card} to {after}" : "{user} frissítette a(z) {card} kártya esedékességét erre: {after}", "{user} has updated the due date of card {card} to {after}" : "{user} frissítette a(z) {card} kártya esedékességét erre: {after}",
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Hozzáadta a(z) {label} címkét a(z) {card} kártyához, a(z) {stack} listában, a(z) {board} táblán", "You have added the tag {label} to card {card} in list {stack} on board {board}" : "Hozzáadta a(z) {label} címkét a(z) {card} kártyához, a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} hozzáadta a(z) {label} címkét a(z) {card} kártyához, a(z) {stack} listában, a(z) {board} táblán", "{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} hozzáadta a(z) {label} címkét a(z) {card} kártyához, a(z) {stack} rakásban, a(z) {board} táblán",
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Eltávolította a(z) {label} címkét a(z) {card} kártyáról, a(z) {stack} listában, a(z) {board} táblán", "You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Eltávolította a(z) {label} címkét a(z) {card} kártyáról, a(z) {stack} rakásban, a(z) {board} táblán",
"{user} has removed the tag {label} from card {card} in list {stack} on board {board}" : "{user} eltávolította a(z) {label} címkét a(z) {card} kártyáról, a(z) {stack} listában, a(z) {board} táblán", "{user} has removed the tag {label} from card {card} in list {stack} on board {board}" : "{user} eltávolította a(z) {label} címkét a(z) {card} kártyáról, a(z) {stack} rakásban, a(z) {board} táblán",
"You have assigned {assigneduser} to card {card} on board {board}" : "Hozzárendelte a(z) {card} kártyát a(z) {board} táblán a következőhöz: {assigneduser}", "You have assigned {assigneduser} to card {card} on board {board}" : "Hozzárendelte a(z) {card} kártyát a(z) {board} táblán a következőhöz: {assigneduser}",
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} hozzárendelte a(z) {card} kártyát a(z) {board} táblán a következőhöz: {assigneduser}", "{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} hozzárendelte a(z) {card} kártyát a(z) {board} táblán a következőhöz: {assigneduser}",
"You have unassigned {assigneduser} from card {card} on board {board}" : "Eltávolította a(z) {card} kártyát a(z) {board} táblán a következőtől: {assigneduser}", "You have unassigned {assigneduser} from card {card} on board {board}" : "Eltávolította a(z) {card} kártyát a(z) {board} táblán a következőtől: {assigneduser}",
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} eltávolította a(z) {card} kártyát a(z) {board} táblán a következőtől: {assigneduser}", "{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} eltávolította a(z) {card} kártyát a(z) {board} táblán a következőtől: {assigneduser}",
"You have moved the card {card} from list {stackBefore} to {stack}" : "Áthelyezte a(z) {card} kártyát a(z) {stackBefore} listából a(z) {stack} listába", "You have moved the card {card} from list {stackBefore} to {stack}" : "Áthelyezte a(z) {card} kártyát a(z) {stackBefore} rakásból a(z) {stack} rakásba",
"{user} has moved the card {card} from list {stackBefore} to {stack}" : "{user} áthelyezte a(z) {card} kártyát a(z) {stackBefore} listából a(z) {stack} listába", "{user} has moved the card {card} from list {stackBefore} to {stack}" : "{user} áthelyezte a(z) {card} kártyát a(z) {stackBefore} rakásból a(z) {stack} rakásba",
"You have added the attachment {attachment} to card {card}" : "Hozzáadta a(z) {attachment} mellékletet a(z) {card} kártyához", "You have added the attachment {attachment} to card {card}" : "Hozzáadta a(z) {attachment} mellékletet a(z) {card} kártyához",
"{user} has added the attachment {attachment} to card {card}" : "{user} hozzáadta a(z) {attachment} mellékletet a(z) {card} kártyához", "{user} has added the attachment {attachment} to card {card}" : "{user} hozzáadta a(z) {attachment} mellékletet a(z) {card} kártyához",
"You have updated the attachment {attachment} on card {card}" : "Frissítette a(z) {attachment} mellékletet a(z) {card} kártyánál", "You have updated the attachment {attachment} on card {card}" : "Frissítette a(z) {attachment} mellékletet a(z) {card} kártyánál",
@@ -71,7 +71,7 @@
"The card \"%s\" on \"%s\" has reached its due date." : "A(z) „%s” kártya a(z) „%s” táblán elérte a határidejét.", "The card \"%s\" on \"%s\" has reached its due date." : "A(z) „%s” kártya a(z) „%s” táblán elérte a határidejét.",
"%s has mentioned you in a comment on \"%s\"." : "%s megemlítette egy hozzászólásban ennél: „%s”.", "%s has mentioned you in a comment on \"%s\"." : "%s megemlítette egy hozzászólásban ennél: „%s”.",
"The board \"%s\" has been shared with you by %s." : "A(z) „%s” táblát %s osztotta meg Önnel.", "The board \"%s\" has been shared with you by %s." : "A(z) „%s” táblát %s osztotta meg Önnel.",
"Card comments" : "Kártya hozzászólásai", "Card comments" : "Kártyák hozzászólások",
"%s on %s" : "%s ezen: %s", "%s on %s" : "%s ezen: %s",
"No data was provided to create an attachment." : "Nincsenek megadva adatok a melléklet létrehozásához.", "No data was provided to create an attachment." : "Nincsenek megadva adatok a melléklet létrehozásához.",
"Finished" : "Kész", "Finished" : "Kész",
@@ -141,8 +141,8 @@
"Toggle compact mode" : "Kompakt mód be/ki", "Toggle compact mode" : "Kompakt mód be/ki",
"Details" : "Részletek", "Details" : "Részletek",
"Loading board" : "Tábla betöltése", "Loading board" : "Tábla betöltése",
"No lists available" : "Nincs elérhető lista", "No lists available" : "Nincs elérhető rakás",
"Create a new list to add cards to this board" : "Hozzon létre egy új listát a kártyák ehhez a táblához való hozzáadásához", "Create a new list to add cards to this board" : "Hozzon létre egy új rakást kártyák ehhez a táblához való hozzáadásához",
"Board not found" : "A tábla nem található", "Board not found" : "A tábla nem található",
"Sharing" : "Megosztás", "Sharing" : "Megosztás",
"Tags" : "Címkék", "Tags" : "Címkék",
@@ -152,7 +152,7 @@
"Undo" : "Visszavonás", "Undo" : "Visszavonás",
"Deleted cards" : "Törölt kártyák", "Deleted cards" : "Törölt kártyák",
"Share board with a user, group or circle …" : "Tábla megosztása felhasználóval, csoporttal vagy körrel…", "Share board with a user, group or circle …" : "Tábla megosztása felhasználóval, csoporttal vagy körrel…",
"Searching for users, groups and circles …" : "Felhasználók, csoportok és körök keresése", "Searching for users, groups and circles …" : "Felhasználókkal, csoportok és körök keresése",
"No participants found" : "Nem találhatók résztvevők", "No participants found" : "Nem találhatók résztvevők",
"Board owner" : "Tábla tulajdonosa", "Board owner" : "Tábla tulajdonosa",
"(Group)" : "(Csoport)", "(Group)" : "(Csoport)",
@@ -166,7 +166,7 @@
"Archive all cards" : "Az összes kártya archiválása", "Archive all cards" : "Az összes kártya archiválása",
"Delete list" : "Lista törlése", "Delete list" : "Lista törlése",
"Add card" : "Kártya hozzáadása", "Add card" : "Kártya hozzáadása",
"Archive all cards in this list" : "Az összes kártya archiválása ebben a listában", "Archive all cards in this list" : "Archív kártyák ebben a listában",
"Add a new card" : "Új kártya hozzáadása", "Add a new card" : "Új kártya hozzáadása",
"Card name" : "Kártya neve", "Card name" : "Kártya neve",
"List deleted" : "Lista törölve", "List deleted" : "Lista törölve",

View File

@@ -63,9 +63,9 @@ OC.L10N.register(
"{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}にコメントしました", "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>が変更されたとき", "A <strong>card description</strong> inside the Deck app has been changed" : "デッキアプリ内の<strong>カードの説明</strong>が変更されました",
"Deck" : "デッキ", "Deck" : "デッキ",
"Changes in the <strong>Deck app</strong>" : "<strong>デッキアプリ</strong>変更があったとき", "Changes in the <strong>Deck app</strong>" : "<strong>デッキアプリ</strong>変更",
"A <strong>comment</strong> was created on a card" : "カードに<strong>コメント</strong>が作成されたとき", "A <strong>comment</strong> was created on a card" : "カードに<strong>コメント</strong>が作成されたとき",
"Upcoming cards" : "今後のカード", "Upcoming cards" : "今後のカード",
"Personal" : "個人", "Personal" : "個人",
@@ -197,7 +197,7 @@ OC.L10N.register(
"Assign a tag to this card…" : "タグこのをカードに割り当てる…", "Assign a tag to this card…" : "タグこのをカードに割り当てる…",
"Assign to users" : "ユーザーに割り当てる", "Assign to users" : "ユーザーに割り当てる",
"Assign to users/groups/circles" : "ユーザー/グループ/サークルに割り当てる", "Assign to users/groups/circles" : "ユーザー/グループ/サークルに割り当てる",
"Assign a user to this card…" : "このカードユーザーに割り当てる…", "Assign a user to this card…" : "このカードユーザーに割り当てる…",
"Due date" : "期限", "Due date" : "期限",
"Set a due date" : "期限を設定", "Set a due date" : "期限を設定",
"Remove due date" : "期限を削除", "Remove due date" : "期限を削除",

View File

@@ -61,9 +61,9 @@
"{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}にコメントしました", "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>が変更されたとき", "A <strong>card description</strong> inside the Deck app has been changed" : "デッキアプリ内の<strong>カードの説明</strong>が変更されました",
"Deck" : "デッキ", "Deck" : "デッキ",
"Changes in the <strong>Deck app</strong>" : "<strong>デッキアプリ</strong>変更があったとき", "Changes in the <strong>Deck app</strong>" : "<strong>デッキアプリ</strong>変更",
"A <strong>comment</strong> was created on a card" : "カードに<strong>コメント</strong>が作成されたとき", "A <strong>comment</strong> was created on a card" : "カードに<strong>コメント</strong>が作成されたとき",
"Upcoming cards" : "今後のカード", "Upcoming cards" : "今後のカード",
"Personal" : "個人", "Personal" : "個人",
@@ -195,7 +195,7 @@
"Assign a tag to this card…" : "タグこのをカードに割り当てる…", "Assign a tag to this card…" : "タグこのをカードに割り当てる…",
"Assign to users" : "ユーザーに割り当てる", "Assign to users" : "ユーザーに割り当てる",
"Assign to users/groups/circles" : "ユーザー/グループ/サークルに割り当てる", "Assign to users/groups/circles" : "ユーザー/グループ/サークルに割り当てる",
"Assign a user to this card…" : "このカードユーザーに割り当てる…", "Assign a user to this card…" : "このカードユーザーに割り当てる…",
"Due date" : "期限", "Due date" : "期限",
"Set a due date" : "期限を設定", "Set a due date" : "期限を設定",
"Remove due date" : "期限を削除", "Remove due date" : "期限を削除",

View File

@@ -16,7 +16,6 @@ OC.L10N.register(
"Edit" : "Modificar", "Edit" : "Modificar",
"Upload new files" : "Enviar fichièrs novèls", "Upload new files" : "Enviar fichièrs novèls",
"Save" : "Salvar", "Save" : "Salvar",
"Cancel reply" : "Anullar la responsa",
"Reply" : "Respondre", "Reply" : "Respondre",
"Update" : "Metre a jorn", "Update" : "Metre a jorn",
"Description" : "Descripcion", "Description" : "Descripcion",

View File

@@ -14,7 +14,6 @@
"Edit" : "Modificar", "Edit" : "Modificar",
"Upload new files" : "Enviar fichièrs novèls", "Upload new files" : "Enviar fichièrs novèls",
"Save" : "Salvar", "Save" : "Salvar",
"Cancel reply" : "Anullar la responsa",
"Reply" : "Respondre", "Reply" : "Respondre",
"Update" : "Metre a jorn", "Update" : "Metre a jorn",
"Description" : "Descripcion", "Description" : "Descripcion",

View File

@@ -63,9 +63,9 @@ OC.L10N.register(
"{user} has restored the attachment {attachment} to card {card}" : "{user} har återställt bilagan {attachment} till kortet {card}", "{user} has restored the attachment {attachment} to card {card}" : "{user} har återställt bilagan {attachment} till kortet {card}",
"You have commented on card {card}" : "Du har kommenterat på kortet {card}", "You have commented on card {card}" : "Du har kommenterat på kortet {card}",
"{user} has commented on card {card}" : "{user} har kommenterat på kortet {card}", "{user} has commented on card {card}" : "{user} har kommenterat på kortet {card}",
"A <strong>card description</strong> inside the Deck app has been changed" : "En <strong>kortbeskrivning</strong> i Kortlek-appen har ändrats", "A <strong>card description</strong> inside the Deck app has been changed" : "En <strong>kortbeskrivning</strong> i Kort-appen har ändrats",
"Deck" : "Kortlek", "Deck" : "Kort",
"Changes in the <strong>Deck app</strong>" : "Ändringar i <strong>Kortlek-appen</strong>", "Changes in the <strong>Deck app</strong>" : "Ändringar i <strong>Kort-appen</strong>",
"A <strong>comment</strong> was created on a card" : "En <strong>kommentar</strong> skapades på ett kort", "A <strong>comment</strong> was created on a card" : "En <strong>kommentar</strong> skapades på ett kort",
"Upcoming cards" : "Kommande kort", "Upcoming cards" : "Kommande kort",
"Personal" : "Personlig", "Personal" : "Personlig",
@@ -104,7 +104,7 @@ OC.L10N.register(
"Path is already shared with this card" : "Sökvägen är redan delad med detta kort", "Path is already shared with this card" : "Sökvägen är redan delad med detta kort",
"Invalid date, date format must be YYYY-MM-DD" : "Ogiltigt datum, måste anges: ÅÅÅÅ-MM-DD", "Invalid date, date format must be YYYY-MM-DD" : "Ogiltigt datum, måste anges: ÅÅÅÅ-MM-DD",
"Personal planning and team project organization" : "Personlig planering och projekthantering för teams", "Personal planning and team project organization" : "Personlig planering och projekthantering för teams",
"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" : "Kortlek är en kanban-liknande projekt- och organiseringsapp för arbetsgrupper i Nextcloud.\n\n\n- 📥 Lägg till uppgifter på kort och ordna dem\n- 📄 Skriv anteckningar i markdown\n- 🔖 Tilldela etiketter för organisering\n- 👥 Dela med arbetsgruppen, vänner eller familj\n- 📎 Bifoga filer och bädda in dem i markdown-anteckningarna\n- 💬 Diskutera i arbetsgruppen genom kommentarer\n- ⚡ Håll koll på ändringar i aktivitetsflödet\n- 🚀 Börja organisera din arbetsgrupp nu!", "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" : "Kort är en kanban-liknande projekt- och organiseringsapp för arbetsgrupper i Nextcloud.\n\n\n- 📥 Lägg till uppgifter på kort och ordna dem\n- 📄 Skriv anteckningar i markdown\n- 🔖 Tilldela etiketter för organisering\n- 👥 Dela med arbetsgruppen, vänner eller familj\n- 📎 Bifoga filer och bädda in dem i markdown-anteckningarna\n- 💬 Diskutera i arbetsgruppen genom kommentarer\n- ⚡ Håll koll på ändringar i aktivitetsflödet\n- 🚀 Börja organisera din arbetsgrupp nu!",
"Card details" : "Kortdetaljer", "Card details" : "Kortdetaljer",
"Add board" : "Lägg till tavla", "Add board" : "Lägg till tavla",
"Select the board to link to a project" : "Välj tavla att länka till ett projekt", "Select the board to link to a project" : "Välj tavla att länka till ett projekt",
@@ -242,7 +242,7 @@ OC.L10N.register(
"Use bigger card view" : "Visa större kort", "Use bigger card view" : "Visa större kort",
"Show boards in calendar/tasks" : "Visa tavlor i kalender / uppgifter", "Show boards in calendar/tasks" : "Visa tavlor i kalender / uppgifter",
"Limit deck usage of groups" : "Begränsa användningen av grupper", "Limit deck usage of groups" : "Begränsa användningen av grupper",
"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." : "Begränsning av Kortlek blockerar användare som inte ingår i dessa grupper från att skapa egna tavlor. Användare kan dock fortfarande integrera med tavlor som har delats med dem.", "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." : "Begränsade kort blockerar användare som inte ingår i dessa grupper från att skapa egna tavlor. Användare kan dock fortfarande integrera med tavlor som har delats med dem.",
"Board details" : "Taveldetaljer", "Board details" : "Taveldetaljer",
"Edit board" : "Ändra tavla", "Edit board" : "Ändra tavla",
"Clone board" : "Kopiera tavla", "Clone board" : "Kopiera tavla",
@@ -278,8 +278,8 @@ OC.L10N.register(
"Failed to upload {name}" : "Kunde inte ladda upp {name}", "Failed to upload {name}" : "Kunde inte ladda upp {name}",
"Maximum file size of {size} exceeded" : "Maximal filstorlek på {size} överskriden", "Maximum file size of {size} exceeded" : "Maximal filstorlek på {size} överskriden",
"Error creating the share" : "Kunde inte skapa delning", "Error creating the share" : "Kunde inte skapa delning",
"Share with a Deck card" : "Dela med ett Kortlek-kort", "Share with a Deck card" : "Dela med ett kort",
"Share {file} with a Deck card" : "Dela {file} med ett Kortlek-kort", "Share {file} with a Deck card" : "Dela {file} med ett kort",
"Share" : "Dela" "Share" : "Dela"
}, },
"nplurals=2; plural=(n != 1);"); "nplurals=2; plural=(n != 1);");

View File

@@ -61,9 +61,9 @@
"{user} has restored the attachment {attachment} to card {card}" : "{user} har återställt bilagan {attachment} till kortet {card}", "{user} has restored the attachment {attachment} to card {card}" : "{user} har återställt bilagan {attachment} till kortet {card}",
"You have commented on card {card}" : "Du har kommenterat på kortet {card}", "You have commented on card {card}" : "Du har kommenterat på kortet {card}",
"{user} has commented on card {card}" : "{user} har kommenterat på kortet {card}", "{user} has commented on card {card}" : "{user} har kommenterat på kortet {card}",
"A <strong>card description</strong> inside the Deck app has been changed" : "En <strong>kortbeskrivning</strong> i Kortlek-appen har ändrats", "A <strong>card description</strong> inside the Deck app has been changed" : "En <strong>kortbeskrivning</strong> i Kort-appen har ändrats",
"Deck" : "Kortlek", "Deck" : "Kort",
"Changes in the <strong>Deck app</strong>" : "Ändringar i <strong>Kortlek-appen</strong>", "Changes in the <strong>Deck app</strong>" : "Ändringar i <strong>Kort-appen</strong>",
"A <strong>comment</strong> was created on a card" : "En <strong>kommentar</strong> skapades på ett kort", "A <strong>comment</strong> was created on a card" : "En <strong>kommentar</strong> skapades på ett kort",
"Upcoming cards" : "Kommande kort", "Upcoming cards" : "Kommande kort",
"Personal" : "Personlig", "Personal" : "Personlig",
@@ -102,7 +102,7 @@
"Path is already shared with this card" : "Sökvägen är redan delad med detta kort", "Path is already shared with this card" : "Sökvägen är redan delad med detta kort",
"Invalid date, date format must be YYYY-MM-DD" : "Ogiltigt datum, måste anges: ÅÅÅÅ-MM-DD", "Invalid date, date format must be YYYY-MM-DD" : "Ogiltigt datum, måste anges: ÅÅÅÅ-MM-DD",
"Personal planning and team project organization" : "Personlig planering och projekthantering för teams", "Personal planning and team project organization" : "Personlig planering och projekthantering för teams",
"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" : "Kortlek är en kanban-liknande projekt- och organiseringsapp för arbetsgrupper i Nextcloud.\n\n\n- 📥 Lägg till uppgifter på kort och ordna dem\n- 📄 Skriv anteckningar i markdown\n- 🔖 Tilldela etiketter för organisering\n- 👥 Dela med arbetsgruppen, vänner eller familj\n- 📎 Bifoga filer och bädda in dem i markdown-anteckningarna\n- 💬 Diskutera i arbetsgruppen genom kommentarer\n- ⚡ Håll koll på ändringar i aktivitetsflödet\n- 🚀 Börja organisera din arbetsgrupp nu!", "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" : "Kort är en kanban-liknande projekt- och organiseringsapp för arbetsgrupper i Nextcloud.\n\n\n- 📥 Lägg till uppgifter på kort och ordna dem\n- 📄 Skriv anteckningar i markdown\n- 🔖 Tilldela etiketter för organisering\n- 👥 Dela med arbetsgruppen, vänner eller familj\n- 📎 Bifoga filer och bädda in dem i markdown-anteckningarna\n- 💬 Diskutera i arbetsgruppen genom kommentarer\n- ⚡ Håll koll på ändringar i aktivitetsflödet\n- 🚀 Börja organisera din arbetsgrupp nu!",
"Card details" : "Kortdetaljer", "Card details" : "Kortdetaljer",
"Add board" : "Lägg till tavla", "Add board" : "Lägg till tavla",
"Select the board to link to a project" : "Välj tavla att länka till ett projekt", "Select the board to link to a project" : "Välj tavla att länka till ett projekt",
@@ -240,7 +240,7 @@
"Use bigger card view" : "Visa större kort", "Use bigger card view" : "Visa större kort",
"Show boards in calendar/tasks" : "Visa tavlor i kalender / uppgifter", "Show boards in calendar/tasks" : "Visa tavlor i kalender / uppgifter",
"Limit deck usage of groups" : "Begränsa användningen av grupper", "Limit deck usage of groups" : "Begränsa användningen av grupper",
"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." : "Begränsning av Kortlek blockerar användare som inte ingår i dessa grupper från att skapa egna tavlor. Användare kan dock fortfarande integrera med tavlor som har delats med dem.", "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." : "Begränsade kort blockerar användare som inte ingår i dessa grupper från att skapa egna tavlor. Användare kan dock fortfarande integrera med tavlor som har delats med dem.",
"Board details" : "Taveldetaljer", "Board details" : "Taveldetaljer",
"Edit board" : "Ändra tavla", "Edit board" : "Ändra tavla",
"Clone board" : "Kopiera tavla", "Clone board" : "Kopiera tavla",
@@ -276,8 +276,8 @@
"Failed to upload {name}" : "Kunde inte ladda upp {name}", "Failed to upload {name}" : "Kunde inte ladda upp {name}",
"Maximum file size of {size} exceeded" : "Maximal filstorlek på {size} överskriden", "Maximum file size of {size} exceeded" : "Maximal filstorlek på {size} överskriden",
"Error creating the share" : "Kunde inte skapa delning", "Error creating the share" : "Kunde inte skapa delning",
"Share with a Deck card" : "Dela med ett Kortlek-kort", "Share with a Deck card" : "Dela med ett kort",
"Share {file} with a Deck card" : "Dela {file} med ett Kortlek-kort", "Share {file} with a Deck card" : "Dela {file} med ett kort",
"Share" : "Dela" "Share" : "Dela"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"
} }

View File

@@ -88,9 +88,9 @@ OC.L10N.register(
"To do" : "Yapılacak işler", "To do" : "Yapılacak işler",
"Doing" : "Yapılanlar", "Doing" : "Yapılanlar",
"Done" : "Bitenler", "Done" : "Bitenler",
"Example Task 3" : "3. örnek görev", "Example Task 3" : "3. Örnek Görev",
"Example Task 2" : "2. örnek görev", "Example Task 2" : "2. Örnek Görev",
"Example Task 1" : "1. örnek görev", "Example Task 1" : "1. Örnek Görev",
"The file was uploaded" : "Dosya yüklendi", "The file was uploaded" : "Dosya yüklendi",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yüklenen dosya php.ini dosyasındaki yüklenebilecek dosya boyutunu belirten upload_max_filesize değişkeninin değerini aşıyor", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yüklenen dosya php.ini dosyasındaki yüklenebilecek dosya boyutunu belirten upload_max_filesize değişkeninin değerini aşıyor",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklenen dosya HTML formundaki yüklenebilecek dosya boyutunu belirten MAX_FILE_SIZE değişkeninin değerini aşıyor", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklenen dosya HTML formundaki yüklenebilecek dosya boyutunu belirten MAX_FILE_SIZE değişkeninin değerini aşıyor",
@@ -188,8 +188,8 @@ OC.L10N.register(
"Add this attachment" : "Bu dosyayı ekle", "Add this attachment" : "Bu dosyayı ekle",
"Show in Files" : "Dosyalarda görüntüle", "Show in Files" : "Dosyalarda görüntüle",
"Unshare file" : "Dosyayı paylaşımdan kaldır", "Unshare file" : "Dosyayı paylaşımdan kaldır",
"Delete Attachment" : "Ek dosyasını sil", "Delete Attachment" : "Ek Dosyasını Sil",
"Restore Attachment" : "Ek dosyasını geri yükle", "Restore Attachment" : "Ek Dosyasını Geri Yükle",
"File to share" : "Paylaşılacak dosya", "File to share" : "Paylaşılacak dosya",
"Invalid path selected" : "Seçilen yol geçersiz", "Invalid path selected" : "Seçilen yol geçersiz",
"Open in sidebar view" : "Yan çubuk görünümünde aç", "Open in sidebar view" : "Yan çubuk görünümünde aç",
@@ -222,7 +222,7 @@ OC.L10N.register(
"Formatting help" : "Biçimlendirme yardımı", "Formatting help" : "Biçimlendirme yardımı",
"Edit description" : "Açıklamayı düzenle", "Edit description" : "Açıklamayı düzenle",
"View description" : "Açıklamayı görüntüle", "View description" : "Açıklamayı görüntüle",
"Add Attachment" : "Dosya ekle", "Add Attachment" : "Dosya Ekle",
"Write a description …" : "Bir açıklama yazın …", "Write a description …" : "Bir açıklama yazın …",
"Choose attachment" : "Ek dosyayı seçin", "Choose attachment" : "Ek dosyayı seçin",
"(group)" : "(grup)", "(group)" : "(grup)",

View File

@@ -86,9 +86,9 @@
"To do" : "Yapılacak işler", "To do" : "Yapılacak işler",
"Doing" : "Yapılanlar", "Doing" : "Yapılanlar",
"Done" : "Bitenler", "Done" : "Bitenler",
"Example Task 3" : "3. örnek görev", "Example Task 3" : "3. Örnek Görev",
"Example Task 2" : "2. örnek görev", "Example Task 2" : "2. Örnek Görev",
"Example Task 1" : "1. örnek görev", "Example Task 1" : "1. Örnek Görev",
"The file was uploaded" : "Dosya yüklendi", "The file was uploaded" : "Dosya yüklendi",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yüklenen dosya php.ini dosyasındaki yüklenebilecek dosya boyutunu belirten upload_max_filesize değişkeninin değerini aşıyor", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yüklenen dosya php.ini dosyasındaki yüklenebilecek dosya boyutunu belirten upload_max_filesize değişkeninin değerini aşıyor",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklenen dosya HTML formundaki yüklenebilecek dosya boyutunu belirten MAX_FILE_SIZE değişkeninin değerini aşıyor", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklenen dosya HTML formundaki yüklenebilecek dosya boyutunu belirten MAX_FILE_SIZE değişkeninin değerini aşıyor",
@@ -186,8 +186,8 @@
"Add this attachment" : "Bu dosyayı ekle", "Add this attachment" : "Bu dosyayı ekle",
"Show in Files" : "Dosyalarda görüntüle", "Show in Files" : "Dosyalarda görüntüle",
"Unshare file" : "Dosyayı paylaşımdan kaldır", "Unshare file" : "Dosyayı paylaşımdan kaldır",
"Delete Attachment" : "Ek dosyasını sil", "Delete Attachment" : "Ek Dosyasını Sil",
"Restore Attachment" : "Ek dosyasını geri yükle", "Restore Attachment" : "Ek Dosyasını Geri Yükle",
"File to share" : "Paylaşılacak dosya", "File to share" : "Paylaşılacak dosya",
"Invalid path selected" : "Seçilen yol geçersiz", "Invalid path selected" : "Seçilen yol geçersiz",
"Open in sidebar view" : "Yan çubuk görünümünde aç", "Open in sidebar view" : "Yan çubuk görünümünde aç",
@@ -220,7 +220,7 @@
"Formatting help" : "Biçimlendirme yardımı", "Formatting help" : "Biçimlendirme yardımı",
"Edit description" : "Açıklamayı düzenle", "Edit description" : "Açıklamayı düzenle",
"View description" : "Açıklamayı görüntüle", "View description" : "Açıklamayı görüntüle",
"Add Attachment" : "Dosya ekle", "Add Attachment" : "Dosya Ekle",
"Write a description …" : "Bir açıklama yazın …", "Write a description …" : "Bir açıklama yazın …",
"Choose attachment" : "Ek dosyayı seçin", "Choose attachment" : "Ek dosyayı seçin",
"(group)" : "(grup)", "(group)" : "(grup)",

View File

@@ -95,7 +95,7 @@ class CardApiController extends ApiController {
* Update a card * Update a card
*/ */
public function update($title, $type, $order = 0, $description = '', $owner, $duedate = null, $archived = null) { public function update($title, $type, $order = 0, $description = '', $owner, $duedate = null, $archived = null) {
$card = $this->cardService->update($this->request->getParam('cardId'), $title, $this->request->getParam('stackId'), $type, $owner, $description, $order, $duedate, 0, $archived); $card = $this->cardService->update($this->request->getParam('cardId'), $title, $this->request->getParam('stackId'), $type, $order, $description, $owner, $duedate, 0, $archived);
return new DataResponse($card, HTTP::STATUS_OK); return new DataResponse($card, HTTP::STATUS_OK);
} }

View File

@@ -95,7 +95,7 @@ class CardController extends Controller {
* @return \OCP\AppFramework\Db\Entity * @return \OCP\AppFramework\Db\Entity
*/ */
public function update($id, $title, $stackId, $type, $order, $description, $duedate, $deletedAt) { public function update($id, $title, $stackId, $type, $order, $description, $duedate, $deletedAt) {
return $this->cardService->update($id, $title, $stackId, $type, $this->userId, $description, $order, $duedate, $deletedAt); return $this->cardService->update($id, $title, $stackId, $type, $order, $description, $this->userId, $duedate, $deletedAt);
} }
/** /**

View File

@@ -44,9 +44,9 @@ class AclMapper extends DeckMapper implements IPermissionMapper {
return ($row['owner'] === $userId); return ($row['owner'] === $userId);
} }
public function findBoardId($id): ?int { public function findBoardId($aclId): ?int {
try { try {
$entity = $this->find($id); $entity = $this->find($aclId);
return $entity->getBoardId(); return $entity->getBoardId();
} catch (DoesNotExistException | MultipleObjectsReturnedException $e) { } catch (DoesNotExistException | MultipleObjectsReturnedException $e) {
} }

View File

@@ -83,8 +83,8 @@ class AssignmentMapper extends QBMapper implements IPermissionMapper {
return $this->cardMapper->isOwner($userId, $cardId); return $this->cardMapper->isOwner($userId, $cardId);
} }
public function findBoardId($id): ?int { public function findBoardId($cardId): ?int {
return $this->cardMapper->findBoardId($id); return $this->cardMapper->findBoardId($cardId);
} }
/** /**

View File

@@ -23,7 +23,6 @@
namespace OCA\Deck\Db; namespace OCA\Deck\Db;
use OC\Cache\CappedMemoryCache;
use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\DoesNotExistException;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCP\IUserManager; use OCP\IUserManager;
@@ -40,8 +39,6 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
private $circlesEnabled; private $circlesEnabled;
private $userBoardCache;
public function __construct( public function __construct(
IDBConnection $db, IDBConnection $db,
LabelMapper $labelMapper, LabelMapper $labelMapper,
@@ -59,9 +56,6 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
$this->groupManager = $groupManager; $this->groupManager = $groupManager;
$this->logger = $logger; $this->logger = $logger;
$this->userBoardCache = new CappedMemoryCache();
$this->circlesEnabled = \OC::$server->getAppManager()->isEnabledForUser('circles'); $this->circlesEnabled = \OC::$server->getAppManager()->isEnabledForUser('circles');
} }
@@ -95,21 +89,13 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
} }
public function findAllForUser(string $userId, int $since = -1, $includeArchived = true): array { public function findAllForUser(string $userId, int $since = -1, $includeArchived = true): array {
$useCache = ($since === -1 && $includeArchived === true); $groups = $this->groupManager->getUserGroupIds(
if (!isset($this->userBoardCache[$userId]) || !$useCache) { $this->userManager->get($userId)
$groups = $this->groupManager->getUserGroupIds( );
$this->userManager->get($userId) $userBoards = $this->findAllByUser($userId, null, null, $since, $includeArchived);
); $groupBoards = $this->findAllByGroups($userId, $groups,null, null, $since, $includeArchived);
$userBoards = $this->findAllByUser($userId, null, null, $since, $includeArchived); $circleBoards = $this->findAllByCircles($userId, null, null, $since, $includeArchived);
$groupBoards = $this->findAllByGroups($userId, $groups, null, null, $since, $includeArchived); return array_unique(array_merge($userBoards, $groupBoards, $circleBoards));
$circleBoards = $this->findAllByCircles($userId, null, null, $since, $includeArchived);
$allBoards = array_unique(array_merge($userBoards, $groupBoards, $circleBoards));
if ($useCache) {
$this->userBoardCache[$userId] = $allBoards;
}
return $allBoards;
}
return $this->userBoardCache[$userId];
} }
/** /**

View File

@@ -546,10 +546,10 @@ class CardMapper extends QBMapper implements IPermissionMapper {
return ($row['owner'] === $userId); return ($row['owner'] === $userId);
} }
public function findBoardId($id): ?int { public function findBoardId($cardId): ?int {
$sql = 'SELECT id FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_stacks` WHERE id IN (SELECT stack_id FROM `*PREFIX*deck_cards` WHERE id = ?))'; $sql = 'SELECT id FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_stacks` WHERE id IN (SELECT stack_id FROM `*PREFIX*deck_cards` WHERE id = ?))';
$stmt = $this->db->prepare($sql); $stmt = $this->db->prepare($sql);
$stmt->bindParam(1, $id, \PDO::PARAM_INT); $stmt->bindParam(1, $cardId, \PDO::PARAM_INT);
$stmt->execute(); $stmt->execute();
return $stmt->fetchColumn() ?? null; return $stmt->fetchColumn() ?? null;
} }

View File

@@ -36,8 +36,8 @@ class Circle extends RelationalObject {
public function getObjectSerialization() { public function getObjectSerialization() {
return [ return [
'uid' => $this->object->getUniqueId(), 'uid' => $this->object->getUniqueId(),
'displayname' => $this->object->getDisplayName(), 'displayname' => $this->object->getName(),
'typeString' => '', 'typeString' => $this->object->getTypeString(),
'circleOwner' => $this->object->getOwner(), 'circleOwner' => $this->object->getOwner(),
'type' => 7 'type' => 7
]; ];

View File

@@ -101,9 +101,9 @@ class LabelMapper extends DeckMapper implements IPermissionMapper {
return ($row['owner'] === $userId); return ($row['owner'] === $userId);
} }
public function findBoardId($id): ?int { public function findBoardId($labelId): ?int {
try { try {
$entity = $this->find($id); $entity = $this->find($labelId);
return $entity->getBoardId(); return $entity->getBoardId();
} catch (DoesNotExistException $e) { } catch (DoesNotExistException $e) {
} catch (MultipleObjectsReturnedException $e) { } catch (MultipleObjectsReturnedException $e) {

View File

@@ -75,9 +75,9 @@ class StackMapper extends DeckMapper implements IPermissionMapper {
return ($row['owner'] === $userId); return ($row['owner'] === $userId);
} }
public function findBoardId($id): ?int { public function findBoardId($stackId): ?int {
try { try {
$entity = $this->find($id); $entity = $this->find($stackId);
return $entity->getBoardId(); return $entity->getBoardId();
} catch (DoesNotExistException $e) { } catch (DoesNotExistException $e) {
} catch (MultipleObjectsReturnedException $e) { } catch (MultipleObjectsReturnedException $e) {

View File

@@ -98,7 +98,9 @@ class ExceptionMiddleware extends Middleware {
'status' => 500, 'status' => 500,
'message' => $exception->getMessage() 'message' => $exception->getMessage()
]; ];
$this->logger->logException($exception); if ($this->config->getSystemValue('loglevel', Util::WARN) === Util::DEBUG) {
$this->logger->logException($exception);
}
if ($this->config->getSystemValue('debug', true) === true) { if ($this->config->getSystemValue('debug', true) === true) {
$response['exception'] = (array) $exception; $response['exception'] = (array) $exception;
} }

View File

@@ -238,7 +238,7 @@ class DeckProvider implements IFullTextSearchProvider {
* *
* @param ISearchRequest $request * @param ISearchRequest $request
*/ */
public function improveSearchRequest(ISearchRequest $searchRequest) { public function improveSearchRequest(ISearchRequest $request) {
} }

View File

@@ -257,9 +257,9 @@ class CardService {
* @param $title * @param $title
* @param $stackId * @param $stackId
* @param $type * @param $type
* @param $owner
* @param $description
* @param $order * @param $order
* @param $description
* @param $owner
* @param $duedate * @param $duedate
* @return \OCP\AppFramework\Db\Entity * @return \OCP\AppFramework\Db\Entity
* @throws StatusException * @throws StatusException
@@ -268,7 +268,7 @@ class CardService {
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @throws BadRequestException * @throws BadRequestException
*/ */
public function update($id, $title, $stackId, $type, $owner, $description = '', $order = 0, $duedate = null, $deletedAt = null, $archived = null) { public function update($id, $title, $stackId, $type, $order = 0, $description = '', $owner, $duedate = null, $deletedAt = null, $archived = null) {
if (is_numeric($id) === false) { if (is_numeric($id) === false) {
throw new BadRequestException('card id must be a number'); throw new BadRequestException('card id must be a number');
} }

View File

@@ -23,7 +23,6 @@
namespace OCA\Deck\Service; namespace OCA\Deck\Service;
use OC\Cache\CappedMemoryCache;
use OCA\Deck\Db\Acl; use OCA\Deck\Db\Acl;
use OCA\Deck\Db\AclMapper; use OCA\Deck\Db\AclMapper;
use OCA\Deck\Db\Board; use OCA\Deck\Db\Board;
@@ -62,7 +61,6 @@ class PermissionService {
private $users = []; private $users = [];
private $circlesEnabled = false; private $circlesEnabled = false;
private $boardCache;
public function __construct( public function __construct(
ILogger $logger, ILogger $logger,
@@ -83,8 +81,6 @@ class PermissionService {
$this->config = $config; $this->config = $config;
$this->userId = $userId; $this->userId = $userId;
$this->boardCache = new CappedMemoryCache();
$this->circlesEnabled = \OC::$server->getAppManager()->isEnabledForUser('circles') && $this->circlesEnabled = \OC::$server->getAppManager()->isEnabledForUser('circles') &&
(version_compare(\OC::$server->getAppManager()->getAppVersion('circles'), '0.17.1') >= 0); (version_compare(\OC::$server->getAppManager()->getAppVersion('circles'), '0.17.1') >= 0);
} }
@@ -153,13 +149,10 @@ class PermissionService {
return true; return true;
} }
try { $acls = $this->aclMapper->findAll($boardId);
$acls = $this->getBoard($boardId)->getAcl(); $result = $this->userCan($acls, $permission, $userId);
$result = $this->userCan($acls, $permission, $userId); if ($result) {
if ($result) { return true;
return true;
}
} catch (DoesNotExistException | MultipleObjectsReturnedException $e) {
} }
// Throw NoPermission to not leak information about existing entries // Throw NoPermission to not leak information about existing entries
@@ -175,24 +168,13 @@ class PermissionService {
$userId = $this->userId; $userId = $this->userId;
} }
try { try {
$board = $this->getBoard($boardId); $board = $this->boardMapper->find($boardId);
return $userId === $board->getOwner(); return $board && $userId === $board->getOwner();
} catch (DoesNotExistException | MultipleObjectsReturnedException $e) { } catch (DoesNotExistException | MultipleObjectsReturnedException $e) {
} }
return false; return false;
} }
/**
* @throws MultipleObjectsReturnedException
* @throws DoesNotExistException
*/
private function getBoard($boardId): Board {
if (!isset($this->boardCache[$boardId])) {
$this->boardCache[$boardId] = $this->boardMapper->find($boardId, false, true);
}
return $this->boardCache[$boardId];
}
/** /**
* Check if permission matches the acl rules for current user and groups * Check if permission matches the acl rules for current user and groups
* *
@@ -286,11 +268,7 @@ class PermissionService {
continue; continue;
} }
foreach ($circle->getInheritedMembers() as $member) { foreach ($circle->getMembers() as $member) {
if ($member->getUserType() !== 1) {
// deck currently only supports user members in circles
continue;
}
$user = $this->userManager->get($member->getUserId()); $user = $this->userManager->get($member->getUserId());
if ($user === null) { if ($user === null) {
$this->logger->info('No user found for circle member ' . $member->getUserId()); $this->logger->info('No user found for circle member ' . $member->getUserId());

View File

@@ -271,9 +271,9 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
return $share; return $share;
} }
private function applyBoardPermission($share, $permissions, $userId) { private function applyBoardPermission($share, $permissions) {
try { try {
$this->permissionService->checkPermission($this->cardMapper, $share->getSharedWith(), Acl::PERMISSION_EDIT, $userId); $this->permissionService->checkPermission($this->cardMapper, $share->getSharedWith(), Acl::PERMISSION_EDIT);
} catch (NoPermissionException $e) { } catch (NoPermissionException $e) {
$permissions &= Constants::PERMISSION_ALL - Constants::PERMISSION_UPDATE; $permissions &= Constants::PERMISSION_ALL - Constants::PERMISSION_UPDATE;
$permissions &= Constants::PERMISSION_ALL - Constants::PERMISSION_CREATE; $permissions &= Constants::PERMISSION_ALL - Constants::PERMISSION_CREATE;
@@ -281,7 +281,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
} }
try { try {
$this->permissionService->checkPermission($this->cardMapper, $share->getSharedWith(), Acl::PERMISSION_SHARE, $userId); $this->permissionService->checkPermission($this->cardMapper, $share->getSharedWith(), Acl::PERMISSION_SHARE);
} catch (NoPermissionException $e) { } catch (NoPermissionException $e) {
$permissions &= Constants::PERMISSION_ALL - Constants::PERMISSION_SHARE; $permissions &= Constants::PERMISSION_ALL - Constants::PERMISSION_SHARE;
} }
@@ -646,7 +646,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
$stmt = $query->execute(); $stmt = $query->execute();
while ($data = $stmt->fetch()) { while ($data = $stmt->fetch()) {
$this->applyBoardPermission($shareMap[$data['parent']], (int)$data['permissions'], $userId); $this->applyBoardPermission($shareMap[$data['parent']], (int)$data['permissions']);
$shareMap[$data['parent']]->setTarget($data['file_target']); $shareMap[$data['parent']]->setTarget($data['file_target']);
} }

39713
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -29,7 +29,7 @@
}, },
"dependencies": { "dependencies": {
"@babel/polyfill": "^7.12.1", "@babel/polyfill": "^7.12.1",
"@babel/runtime": "^7.14.6", "@babel/runtime": "^7.14.0",
"@juliushaertl/vue-richtext": "^1.0.1", "@juliushaertl/vue-richtext": "^1.0.1",
"@nextcloud/auth": "^1.3.0", "@nextcloud/auth": "^1.3.0",
"@nextcloud/axios": "^1.6.0", "@nextcloud/axios": "^1.6.0",
@@ -40,10 +40,10 @@
"@nextcloud/l10n": "^1.4.1", "@nextcloud/l10n": "^1.4.1",
"@nextcloud/moment": "^1.1.1", "@nextcloud/moment": "^1.1.1",
"@nextcloud/router": "^2.0.0", "@nextcloud/router": "^2.0.0",
"@nextcloud/vue": "^3.10.1", "@nextcloud/vue": "^3.9.0",
"@nextcloud/vue-dashboard": "^2.0.1", "@nextcloud/vue-dashboard": "^2.0.1",
"blueimp-md5": "^2.18.0", "blueimp-md5": "^2.18.0",
"dompurify": "^2.2.9", "dompurify": "^2.2.8",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"markdown-it": "^12.0.6", "markdown-it": "^12.0.6",
"markdown-it-task-lists": "^2.1.1", "markdown-it-task-lists": "^2.1.1",
@@ -51,7 +51,7 @@
"nextcloud-vue-collections": "^0.9.0", "nextcloud-vue-collections": "^0.9.0",
"p-queue": "^6.6.2", "p-queue": "^6.6.2",
"url-search-params-polyfill": "^8.1.1", "url-search-params-polyfill": "^8.1.1",
"vue": "^2.6.14", "vue": "^2.6.12",
"vue-at": "^2.5.0-beta.2", "vue-at": "^2.5.0-beta.2",
"vue-click-outside": "^1.1.0", "vue-click-outside": "^1.1.0",
"vue-easymde": "^1.4.0", "vue-easymde": "^1.4.0",
@@ -65,20 +65,57 @@
"extends @nextcloud/browserslist-config" "extends @nextcloud/browserslist-config"
], ],
"engines": { "engines": {
"node": ">=14.0.0", "node": ">=10.0.0"
"npm": ">=7.0.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.14.2",
"@babel/eslint-parser": "^7.14.2",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/preset-env": "^7.14.2",
"@nextcloud/babel-config": "^1.0.0-beta.1", "@nextcloud/babel-config": "^1.0.0-beta.1",
"@nextcloud/browserslist-config": "^2.1.0", "@nextcloud/browserslist-config": "^2.1.0",
"@nextcloud/eslint-config": "^5.1.0", "@nextcloud/eslint-config": "^5.1.0",
"@nextcloud/stylelint-config": "^1.0.0-beta.0", "@nextcloud/eslint-plugin": "^2.0.0",
"@nextcloud/webpack-vue-config": "^4.0.3", "@nextcloud/webpack-vue-config": "^4.0.3",
"@relative-ci/agent": "^2.0.0", "@relative-ci/agent": "^1.6.1",
"@vue/test-utils": "^1.2.1", "@vue/test-utils": "^1.2.0",
"jest": "^27.0.4", "acorn": "^8.2.4",
"babel-eslint": "^10.1.0",
"babel-jest": "^26.6.3",
"babel-loader": "^8.2.2",
"css-loader": "^4.3.0",
"eslint": "^7.26.0",
"eslint-config-standard": "^16.0.2",
"eslint-friendly-formatter": "^4.0.1",
"eslint-loader": "^4.0.2",
"eslint-plugin-import": "^2.23.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.3.1",
"eslint-plugin-standard": "^5.0.0",
"eslint-plugin-vue": "^7.9.0",
"eslint-webpack-plugin": "^2.5.4",
"file-loader": "^6.2.0",
"jest": "^26.6.3",
"jest-serializer-vue": "^2.0.2", "jest-serializer-vue": "^2.0.2",
"vue-jest": "^3.0.7" "minimist": "^1.2.5",
"node-polyfill-webpack-plugin": "^1.1.2",
"raw-loader": "^4.0.2",
"sass": "^1.32.13",
"sass-loader": "^10.1.1",
"style-loader": "^2.0.0",
"stylelint": "^13.13.1",
"stylelint-config-recommended": "^5.0.0",
"stylelint-config-recommended-scss": "^4.2.0",
"stylelint-scss": "^3.19.0",
"stylelint-webpack-plugin": "^2.1.1",
"url-loader": "^4.1.1",
"vue-jest": "^3.0.7",
"vue-loader": "^15.9.7",
"vue-template-compiler": "^2.6.12",
"webpack": "^5.37.0",
"webpack-cli": "^4.7.0",
"webpack-dev-server": "^3.11.2",
"webpack-merge": "^5.7.3"
}, },
"jest": { "jest": {
"moduleFileExtensions": [ "moduleFileExtensions": [

View File

@@ -168,7 +168,6 @@ export default {
}, },
close() { close() {
this.$emit('close')
this.$root.$emit('close') this.$root.$emit('close')
}, },
async select() { async select() {

View File

@@ -25,12 +25,6 @@
<div v-if="overviewName" class="board-title"> <div v-if="overviewName" class="board-title">
<div class="board-bullet icon-calendar-dark" /> <div class="board-bullet icon-calendar-dark" />
<h2>{{ overviewName }}</h2> <h2>{{ overviewName }}</h2>
<Actions>
<ActionButton icon="icon-add" @click="clickShowAddCardModel">
{{ t('deck', 'Add card') }}
</ActionButton>
</Actions>
<CardCreateDialog v-if="showAddCardModal" @close="clickHideAddCardModel" />
</div> </div>
<div v-else-if="board" class="board-title"> <div v-else-if="board" class="board-title">
<div :style="{backgroundColor: '#' + board.color}" class="board-bullet" /> <div :style="{backgroundColor: '#' + board.color}" class="board-bullet" />
@@ -212,12 +206,11 @@
import { mapState, mapGetters } from 'vuex' import { mapState, mapGetters } from 'vuex'
import { Actions, ActionButton, Popover, Avatar } from '@nextcloud/vue' import { Actions, ActionButton, Popover, Avatar } from '@nextcloud/vue'
import labelStyle from '../mixins/labelStyle' import labelStyle from '../mixins/labelStyle'
import CardCreateDialog from '../CardCreateDialog'
export default { export default {
name: 'Controls', name: 'Controls',
components: { components: {
Actions, ActionButton, Popover, Avatar, CardCreateDialog, Actions, ActionButton, Popover, Avatar,
}, },
mixins: [labelStyle], mixins: [labelStyle],
props: { props: {
@@ -240,7 +233,6 @@ export default {
showArchived: false, showArchived: false,
isAddStackVisible: false, isAddStackVisible: false,
filter: { tags: [], users: [], due: '', unassigned: false }, filter: { tags: [], users: [], due: '', unassigned: false },
showAddCardModal: false,
} }
}, },
@@ -326,12 +318,6 @@ export default {
this.$store.dispatch('setFilter', { ...filterReset }) this.$store.dispatch('setFilter', { ...filterReset })
this.filter = filterReset this.filter = filterReset
}, },
clickShowAddCardModel() {
this.showAddCardModal = true
},
clickHideAddCardModel() {
this.showAddCardModal = false
},
}, },
} }
</script> </script>

View File

@@ -32,7 +32,7 @@
</div> </div>
<EmptyContent v-else-if="isEmpty" key="empty" icon="icon-deck"> <EmptyContent v-else-if="isEmpty" key="empty" icon="icon-deck">
{{ t('deck', 'No lists available') }} {{ t('deck', 'No lists available') }}
<template v-if="canManage" #desc> <template #desc>
{{ t('deck', 'Create a new list to add cards to this board') }} {{ t('deck', 'Create a new list to add cards to this board') }}
<form @submit.prevent="addNewStack()"> <form @submit.prevent="addNewStack()">
<input id="new-stack-input-main" <input id="new-stack-input-main"
@@ -110,7 +110,6 @@ export default {
}), }),
...mapGetters([ ...mapGetters([
'canEdit', 'canEdit',
'canManage',
]), ]),
stacksByBoard() { stacksByBoard() {
return this.$store.getters.stacksByBoard(this.board.id) return this.$store.getters.stacksByBoard(this.board.id)

View File

@@ -264,14 +264,12 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
@use 'sass:math';
@import './../../css/variables'; @import './../../css/variables';
.stack { .stack {
width: $stack-width + $stack-spacing*3; width: $stack-width + $stack-spacing*3;
margin-left: math.div($stack-spacing, 2); margin-left: $stack-spacing/2;
margin-right: math.div($stack-spacing, 2); margin-right: $stack-spacing/2;
} }
.stack__header { .stack__header {

View File

@@ -227,7 +227,7 @@ export default {
}, },
showViewer(attachment) { showViewer(attachment) {
if (attachment.extendedData.fileid && window.OCA.Viewer.availableHandlers.map(handler => handler.mimes).flat().includes(attachment.extendedData.mimetype)) { if (attachment.extendedData.fileid && window.OCA.Viewer.availableHandlers.map(handler => handler.mimes).flat().includes(attachment.extendedData.mimetype)) {
window.OCA.Viewer.open({ path: attachment.extendedData.path }) window.OCA.Viewer.open(attachment.extendedData.path)
return return
} }

View File

@@ -21,39 +21,32 @@
--> -->
<template> <template>
<div> <DashboardWidget :items="cards"
<DashboardWidget :items="cards" empty-content-icon="icon-deck"
empty-content-icon="icon-deck" :empty-content-message="t('deck', 'No upcoming cards')"
:empty-content-message="t('deck', 'No upcoming cards')" :show-more-text="t('deck', 'upcoming cards')"
:show-more-text="t('deck', 'upcoming cards')" :show-more-url="showMoreUrl"
:loading="loading" :loading="loading"
@hide="() => {}" @hide="() => {}"
@markDone="() => {}"> @markDone="() => {}">
<template #default="{ item }"> <template #default="{ item }">
<a :key="item.id" <a :key="item.id"
:href="cardLink(item)" :href="cardLink(item)"
target="_blank" target="_blank"
class="card"> class="card">
<div class="card--header"> <div class="card--header">
<DueDate class="right" :card="item" /> <DueDate class="right" :card="item" />
<span class="title">{{ item.title }}</span> <span class="title">{{ item.title }}</span>
</div> </div>
<ul v-if="item.labels && item.labels.length" <ul v-if="item.labels && item.labels.length"
class="labels"> class="labels">
<li v-for="label in item.labels" :key="label.id" :style="labelStyle(label)"> <li v-for="label in item.labels" :key="label.id" :style="labelStyle(label)">
<span>{{ label.title }}</span> <span>{{ label.title }}</span>
</li> </li>
</ul> </ul>
</a> </a>
</template> </template>
</DashboardWidget> </DashboardWidget>
<div class="center-button">
<button @click="toggleAddCardModel">
{{ t('deck', 'Add card') }}
</button>
<CardCreateDialog v-if="showAddCardModal" @close="toggleAddCardModel" />
</div>
</div>
</template> </template>
<script> <script>
@@ -62,20 +55,17 @@ import { mapGetters } from 'vuex'
import labelStyle from './../mixins/labelStyle' import labelStyle from './../mixins/labelStyle'
import DueDate from '../components/cards/badges/DueDate' import DueDate from '../components/cards/badges/DueDate'
import { generateUrl } from '@nextcloud/router' import { generateUrl } from '@nextcloud/router'
import CardCreateDialog from '../CardCreateDialog'
export default { export default {
name: 'Dashboard', name: 'Dashboard',
components: { components: {
DueDate, DueDate,
DashboardWidget, DashboardWidget,
CardCreateDialog,
}, },
mixins: [labelStyle], mixins: [labelStyle],
data() { data() {
return { return {
loading: false, loading: false,
showAddCardModal: false,
} }
}, },
computed: { computed: {
@@ -91,7 +81,7 @@ export default {
list.sort((a, b) => { list.sort((a, b) => {
return (new Date(a.duedate)).getTime() - (new Date(b.duedate)).getTime() return (new Date(a.duedate)).getTime() - (new Date(b.duedate)).getTime()
}) })
return list.slice(0, 6) return list
}, },
cardLink() { cardLink() {
return (card) => { return (card) => {
@@ -108,21 +98,12 @@ export default {
this.loading = false this.loading = false
}) })
}, },
methods: {
toggleAddCardModel() {
this.showAddCardModal = !this.showAddCardModal
},
},
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import './../css/labels'; @import './../css/labels';
.center-button {
text-align: center;
}
#deck-widget-empty-content { #deck-widget-empty-content {
text-align: center; text-align: center;
margin-top: 5vh; margin-top: 5vh;

View File

@@ -1,3 +1,32 @@
const stylelintConfig = require('@nextcloud/stylelint-config') module.exports = {
extends: 'stylelint-config-recommended-scss',
module.exports = stylelintConfig rules: {
indentation: 'tab',
'selector-type-no-unknown': null,
'number-leading-zero': null,
'rule-empty-line-before': [
'always',
{
ignore: ['after-comment', 'inside-block']
}
],
'declaration-empty-line-before': [
'never',
{
ignore: ['after-declaration']
}
],
'comment-empty-line-before': null,
'selector-type-case': null,
'selector-list-comma-newline-after': null,
'no-descending-specificity': null,
'string-quotes': 'single',
'selector-pseudo-element-no-unknown': [
true,
{
ignorePseudoElements: ['v-deep']
}
]
},
plugins: ['stylelint-scss']
}

View File

@@ -1,18 +1,29 @@
{ {
"require-dev": { "name": "nextcloud/deck-integration",
"phpunit/phpunit": "~6.5", "description": "Integration tests for the deck app",
"behat/behat": "~3.8.0", "require-dev": {
"guzzlehttp/guzzle": "6.5.2", "phpunit/phpunit": "^9",
"jarnaiz/behat-junit-formatter": "^1.3", "behat/behat": "^3",
"sabre/dav": "3.2.3", "guzzlehttp/guzzle": "^7",
"symfony/event-dispatcher": "~4.4" "jarnaiz/behat-junit-formatter": "^1.3",
}, "sabre/dav": "^4",
"autoload": { "symfony/event-dispatcher": "~4.4",
"psr-0": { "juliushaertl/nextcloud-behat": "*"
"": [ },
"features/bootstrap/", "minimum-stability": "dev",
"../../../../build/integration/features/bootstrap/" "prefer-stable": true,
] "repositories": [
} {
} "type": "path",
"url": "/home/jus/repos/nextcloud/nextcloud-behat"
}
],
"autoload": {
"psr-0": {
"": [
"features/bootstrap/",
"../../../../build/integration/features/bootstrap/"
]
}
}
} }

View File

@@ -1,12 +1,17 @@
default: default:
autoload:
'': '%paths.base%/../features/bootstrap'
suites: suites:
test: test:
paths: paths:
- '%paths.base%/../features/' - '%paths.base%/../features/'
contexts: contexts:
- ServerContext: - \JuliusHaertl\NextcloudBehat\Context\ServerContext:
baseUrl: http://localhost:8080/ servers:
- RequestContext default: http://localhost:8080
- \JuliusHaertl\NextcloudBehat\Context\SharingContext
- \JuliusHaertl\NextcloudBehat\Context\FilesContext
- BoardContext - BoardContext
- CommentContext - CommentContext
- SearchContext - SearchContext
- PendingContext

View File

@@ -8,83 +8,83 @@ Feature: acl
And user "user2" exists And user "user2" exists
Given group "group0" exists Given group "group0" exists
And group "group1" exists And group "group1" exists
Given user "user1" belongs to group "group1" Given user "user1" is member of group "group1"
Scenario: Fetch the board list Scenario: Fetch the board list
Given Logging in using web as "user0" Given Using web as user "user0"
When fetching the board list When fetching the board list
Then the response should have a status code "200" Then the HTTP status code should be "200"
And the response Content-Type should be "application/json; charset=utf-8" And the response Content-Type should be "application/json; charset=utf-8"
Scenario: Fetch board details of owned board Scenario: Fetch board details of owned board
Given Logging in using web as "admin" Given Using web as user "admin"
And creates a board named "MyPrivateAdminBoard" with color "fafafa" And creates a board named "MyPrivateAdminBoard" with color "fafafa"
When fetches the board named "MyPrivateAdminBoard" When fetches the board named "MyPrivateAdminBoard"
Then the response should have a status code "200" Then the HTTP status code should be "200"
And the response Content-Type should be "application/json; charset=utf-8" And the response Content-Type should be "application/json; charset=utf-8"
Scenario: Fetch board details of an other users board Scenario: Fetch board details of an other users board
Given Logging in using web as "admin" Given Using web as user "admin"
And creates a board named "MyPrivateAdminBoard" with color "ff0000" And creates a board named "MyPrivateAdminBoard" with color "ff0000"
Given Logging in using web as "user0" Given Using web as user "user0"
When fetches the board named "MyPrivateAdminBoard" When fetches the board named "MyPrivateAdminBoard"
Then the response should have a status code "403" Then the HTTP status code should be "403"
And the response Content-Type should be "application/json; charset=utf-8" And the response Content-Type should be "application/json; charset=utf-8"
Scenario: Share a board Scenario: Share a board
Given Logging in using web as "user0" Given Using web as user "user0"
And creates a board named "Shared board" with color "ff0000" And creates a board named "Shared board" with color "ff0000"
And shares the board with user "user1" And shares the board with user "user1"
| permissionEdit | 0 | | permissionEdit | 0 |
| permissionShare | 0 | | permissionShare | 0 |
| permissionManage | 0 | | permissionManage | 0 |
And the response should have a status code 200 And the HTTP status code should be 200
And shares the board with user "user2" And shares the board with user "user2"
| permissionEdit | 1 | | permissionEdit | 1 |
| permissionShare | 1 | | permissionShare | 1 |
| permissionManage | 1 | | permissionManage | 1 |
And the response should have a status code 200 And the HTTP status code should be 200
Given Logging in using web as "user2" Given Using web as user "user2"
When fetches the board named "Shared board" When fetches the board named "Shared board"
Then the current user should have "read" permissions on the board Then the current user should have "read" permissions on the board
And the current user should have "edit" permissions on the board And the current user should have "edit" permissions on the board
And the current user should have "share" permissions on the board And the current user should have "share" permissions on the board
And the current user should have "manage" permissions on the board And the current user should have "manage" permissions on the board
And create a stack named "Stack" And create a stack named "Stack"
And the response should have a status code 200 And the HTTP status code should be 200
And create a card named "Test" And create a card named "Test"
And the response should have a status code 200 And the HTTP status code should be 200
Given Logging in using web as "user1" Given Using web as user "user1"
When fetches the board named "Shared board" When fetches the board named "Shared board"
And create a card named "Test" And create a card named "Test"
And the response should have a status code 403 And the HTTP status code should be 403
Then the current user should have "read" permissions on the board Then the current user should have "read" permissions on the board
And the current user should not have "edit" permissions on the board And the current user should not have "edit" permissions on the board
And the current user should not have "share" permissions on the board And the current user should not have "share" permissions on the board
And the current user should not have "manage" permissions on the board And the current user should not have "manage" permissions on the board
And create a stack named "Stack" And create a stack named "Stack"
And the response should have a status code 403 And the HTTP status code should be 403
Scenario: Reshare a board Scenario: Reshare a board
Given Logging in using web as "user0" Given Using web as user "user0"
And creates a board named "Reshared board" with color "ff0000" And creates a board named "Reshared board" with color "ff0000"
And shares the board with user "user1" And shares the board with user "user1"
| permissionEdit | 0 | | permissionEdit | 0 |
| permissionShare | 1 | | permissionShare | 1 |
| permissionManage | 0 | | permissionManage | 0 |
And the response should have a status code 200 And the HTTP status code should be 200
Given Logging in using web as "user1" Given Using web as user "user1"
When fetches the board named "Shared board" When fetches the board named "Shared board"
And shares the board with user "user2" And shares the board with user "user2"
| permissionEdit | 1 | | permissionEdit | 1 |
| permissionShare | 1 | | permissionShare | 1 |
| permissionManage | 1 | | permissionManage | 1 |
And the response should have a status code 200 And the HTTP status code should be 200
Given Logging in using web as "user2" Given Using web as user "user2"
When fetches the board named "Shared board" When fetches the board named "Shared board"
Then the current user should have "read" permissions on the board Then the current user should have "read" permissions on the board
And the current user should not have "edit" permissions on the board And the current user should not have "edit" permissions on the board

View File

@@ -3,12 +3,13 @@
use Behat\Behat\Context\Context; use Behat\Behat\Context\Context;
use Behat\Behat\Hook\Scope\BeforeScenarioScope; use Behat\Behat\Hook\Scope\BeforeScenarioScope;
use Behat\Gherkin\Node\TableNode; use Behat\Gherkin\Node\TableNode;
use JuliusHaertl\NextcloudBehat\Context\ServerContext;
use JuliusHaertl\NextcloudBehat\Context\SharingContext;
use PHPUnit\Framework\Assert; use PHPUnit\Framework\Assert;
require_once __DIR__ . '/../../vendor/autoload.php'; require_once __DIR__ . '/../../vendor/autoload.php';
class BoardContext implements Context { class BoardContext implements Context {
use RequestTrait;
/** @var array Last board response */ /** @var array Last board response */
private $board = null; private $board = null;
@@ -19,12 +20,16 @@ class BoardContext implements Context {
/** @var ServerContext */ /** @var ServerContext */
private $serverContext; private $serverContext;
/** @var SharingContext */
private $sharingContext;
/** @BeforeScenario */ /** @BeforeScenario */
public function gatherContexts(BeforeScenarioScope $scope) { public function gatherContexts(BeforeScenarioScope $scope) {
$environment = $scope->getEnvironment(); $environment = $scope->getEnvironment();
$this->serverContext = $environment->getContext('ServerContext'); $this->serverContext = $environment->getContext(ServerContext::class);
$this->sharingContext = $environment->getContext(SharingContext::class);
} }
public function getLastUsedCard() { public function getLastUsedCard() {
@@ -35,21 +40,21 @@ class BoardContext implements Context {
* @Given /^creates a board named "([^"]*)" with color "([^"]*)"$/ * @Given /^creates a board named "([^"]*)" with color "([^"]*)"$/
*/ */
public function createsABoardNamedWithColor($title, $color) { public function createsABoardNamedWithColor($title, $color) {
$this->requestContext->sendJSONrequest('POST', '/index.php/apps/deck/boards', [ $this->serverContext->sendJSONrequest('POST', '/index.php/apps/deck/boards', [
'title' => $title, 'title' => $title,
'color' => $color 'color' => $color
]); ]);
$this->getResponse()->getBody()->seek(0); $this->serverContext->getResponse()->getBody()->seek(0);
$this->board = json_decode((string)$this->getResponse()->getBody(), true); $this->board = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
} }
/** /**
* @When /^fetches the board named "([^"]*)"$/ * @When /^fetches the board named "([^"]*)"$/
*/ */
public function fetchesTheBoardNamed($boardName) { public function fetchesTheBoardNamed($boardName) {
$this->requestContext->sendJSONrequest('GET', '/index.php/apps/deck/boards/' . $this->board['id'], []); $this->serverContext->sendJSONrequest('GET', '/index.php/apps/deck/boards/' . $this->board['id'], []);
$this->getResponse()->getBody()->seek(0); $this->serverContext->getResponse()->getBody()->seek(0);
$this->board = json_decode((string)$this->getResponse()->getBody(), true); $this->board = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
} }
/** /**
@@ -63,7 +68,7 @@ class BoardContext implements Context {
]; ];
$tableRows = isset($permissions) ? $permissions->getRowsHash() : []; $tableRows = isset($permissions) ? $permissions->getRowsHash() : [];
$result = array_merge($defaults, $tableRows); $result = array_merge($defaults, $tableRows);
$this->requestContext->sendJSONrequest('POST', '/index.php/apps/deck/boards/' . $this->board['id'] . '/acl', [ $this->serverContext->sendJSONrequest('POST', '/index.php/apps/deck/boards/' . $this->board['id'] . '/acl', [
'type' => 0, 'type' => 0,
'participant' => $user, 'participant' => $user,
'permissionEdit' => $result['permissionEdit'] === '1', 'permissionEdit' => $result['permissionEdit'] === '1',
@@ -83,7 +88,7 @@ class BoardContext implements Context {
]; ];
$tableRows = isset($permissions) ? $permissions->getRowsHash() : []; $tableRows = isset($permissions) ? $permissions->getRowsHash() : [];
$result = array_merge($defaults, $tableRows); $result = array_merge($defaults, $tableRows);
$this->requestContext->sendJSONrequest('POST', '/index.php/apps/deck/boards/' . $this->board['id'] . '/acl', [ $this->serverContext->sendJSONrequest('POST', '/index.php/apps/deck/boards/' . $this->board['id'] . '/acl', [
'type' => 1, 'type' => 1,
'participant' => $group, 'participant' => $group,
'permissionEdit' => $result['permissionEdit'] === '1', 'permissionEdit' => $result['permissionEdit'] === '1',
@@ -97,38 +102,38 @@ class BoardContext implements Context {
* @When /^fetching the board list$/ * @When /^fetching the board list$/
*/ */
public function fetchingTheBoardList() { public function fetchingTheBoardList() {
$this->requestContext->sendJSONrequest('GET', '/index.php/apps/deck/boards'); $this->serverContext->sendJSONrequest('GET', '/index.php/apps/deck/boards');
} }
/** /**
* @When /^fetching the board with id "([^"]*)"$/ * @When /^fetching the board with id "([^"]*)"$/
*/ */
public function fetchingTheBoardWithId($id) { public function fetchingTheBoardWithId($id) {
$this->requestContext->sendJSONrequest('GET', '/index.php/apps/deck/boards/' . $id); $this->serverContext->sendJSONrequest('GET', '/index.php/apps/deck/boards/' . $id);
} }
/** /**
* @Given /^create a stack named "([^"]*)"$/ * @Given /^create a stack named "([^"]*)"$/
*/ */
public function createAStackNamed($name) { public function createAStackNamed($name) {
$this->requestContext->sendJSONrequest('POST', '/index.php/apps/deck/stacks', [ $this->serverContext->sendJSONrequest('POST', '/index.php/apps/deck/stacks', [
'title' => $name, 'title' => $name,
'boardId' => $this->board['id'] 'boardId' => $this->board['id']
]); ]);
$this->requestContext->getResponse()->getBody()->seek(0); $this->serverContext->getResponse()->getBody()->seek(0);
$this->stack = json_decode((string)$this->getResponse()->getBody(), true); $this->stack = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
} }
/** /**
* @Given /^create a card named "([^"]*)"$/ * @Given /^create a card named "([^"]*)"$/
*/ */
public function createACardNamed($name) { public function createACardNamed($name) {
$this->requestContext->sendJSONrequest('POST', '/index.php/apps/deck/cards', [ $this->serverContext->sendJSONrequest('POST', '/index.php/apps/deck/cards', [
'title' => $name, 'title' => $name,
'stackId' => $this->stack['id'] 'stackId' => $this->stack['id']
]); ]);
$this->requestContext->getResponse()->getBody()->seek(0); $this->serverContext->getResponse()->getBody()->seek(0);
$this->card = json_decode((string)$this->getResponse()->getBody(), true); $this->card = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
} }
/** /**
@@ -164,31 +169,31 @@ class BoardContext implements Context {
['shareType', 12], ['shareType', 12],
['shareWith', (string)$this->card['id']], ['shareWith', (string)$this->card['id']],
]); ]);
$this->serverContext->creatingShare($table); $this->sharingContext->createAShareWith($table);
} }
/** /**
* @Given /^set the description to "([^"]*)"$/ * @Given /^set the description to "([^"]*)"$/
*/ */
public function setTheDescriptionTo($description) { public function setTheDescriptionTo($description) {
$this->requestContext->sendJSONrequest('PUT', '/index.php/apps/deck/cards/' . $this->card['id'], array_merge( $this->serverContext->sendJSONrequest('PUT', '/index.php/apps/deck/cards/' . $this->card['id'], array_merge(
$this->card, $this->card,
['description' => $description] ['description' => $description]
)); ));
$this->requestContext->getResponse()->getBody()->seek(0); $this->serverContext->getResponse()->getBody()->seek(0);
$this->card = json_decode((string)$this->getResponse()->getBody(), true); $this->card = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
} }
/** /**
* @Given /^set the card attribute "([^"]*)" to "([^"]*)"$/ * @Given /^set the card attribute "([^"]*)" to "([^"]*)"$/
*/ */
public function setCardAttribute($attribute, $value) { public function setCardAttribute($attribute, $value) {
$this->requestContext->sendJSONrequest('PUT', '/index.php/apps/deck/cards/' . $this->card['id'], array_merge( $this->serverContext->sendJSONrequest('PUT', '/index.php/apps/deck/cards/' . $this->card['id'], array_merge(
$this->card, $this->card,
[$attribute => $value] [$attribute => $value]
)); ));
$this->requestContext->getResponse()->getBody()->seek(0); $this->serverContext->getResponse()->getBody()->seek(0);
$this->card = json_decode((string)$this->getResponse()->getBody(), true); $this->card = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
} }
/** /**
@@ -214,11 +219,11 @@ class BoardContext implements Context {
} }
private function assignToCard($participant, $type) { private function assignToCard($participant, $type) {
$this->requestContext->sendJSONrequest('POST', '/index.php/apps/deck/cards/' . $this->card['id'] .'/assign', [ $this->serverContext->sendJSONrequest('POST', '/index.php/apps/deck/cards/' . $this->card['id'] .'/assign', [
'userId' => $participant, 'userId' => $participant,
'type' => $type 'type' => $type
]); ]);
$this->requestContext->getResponse()->getBody()->seek(0); $this->serverContext->getResponse()->getBody()->seek(0);
} }
/** /**
@@ -229,7 +234,7 @@ class BoardContext implements Context {
return $label['title'] === $tag; return $label['title'] === $tag;
}); });
$label = array_shift($filteredLabels); $label = array_shift($filteredLabels);
$this->requestContext->sendJSONrequest('POST', '/index.php/apps/deck/cards/' . $this->card['id'] .'/label/' . $label['id']); $this->serverContext->sendJSONrequest('POST', '/index.php/apps/deck/cards/' . $this->card['id'] .'/label/' . $label['id']);
$this->requestContext->getResponse()->getBody()->seek(0); $this->serverContext->getResponse()->getBody()->seek(0);
} }
} }

View File

@@ -2,12 +2,14 @@
use Behat\Behat\Context\Context; use Behat\Behat\Context\Context;
use Behat\Behat\Hook\Scope\BeforeScenarioScope; use Behat\Behat\Hook\Scope\BeforeScenarioScope;
use JuliusHaertl\NextcloudBehat\Context\ServerContext;
require_once __DIR__ . '/../../vendor/autoload.php'; require_once __DIR__ . '/../../vendor/autoload.php';
class CommentContext implements Context { class CommentContext implements Context {
use RequestTrait;
/** @var ServerContext */
protected $serverContext;
/** @var BoardContext */ /** @var BoardContext */
protected $boardContext; protected $boardContext;
@@ -15,6 +17,7 @@ class CommentContext implements Context {
public function gatherContexts(BeforeScenarioScope $scope) { public function gatherContexts(BeforeScenarioScope $scope) {
$environment = $scope->getEnvironment(); $environment = $scope->getEnvironment();
$this->serverContext = $environment->getContext(ServerContext::class);
$this->boardContext = $environment->getContext('BoardContext'); $this->boardContext = $environment->getContext('BoardContext');
} }
@@ -23,7 +26,7 @@ class CommentContext implements Context {
*/ */
public function postACommentWithContentOnTheCard($content) { public function postACommentWithContentOnTheCard($content) {
$card = $this->boardContext->getLastUsedCard(); $card = $this->boardContext->getLastUsedCard();
$this->requestContext->sendOCSRequest('POST', '/apps/deck/api/v1.0/cards/' . $card['id'] . '/comments', [ $this->serverContext->sendOCSRequest('POST', '/apps/deck/api/v1.0/cards/' . $card['id'] . '/comments', [
'message' => $content, 'message' => $content,
'parentId' => null 'parentId' => null
]); ]);

View File

@@ -21,26 +21,21 @@
* *
*/ */
declare(strict_types=1);
use Behat\Behat\Hook\Scope\BeforeScenarioScope; use Behat\Behat\Hook\Scope\BeforeScenarioScope;
use Behat\Behat\Context\Context;
require_once __DIR__ . '/../../vendor/autoload.php'; require_once __DIR__ . '/../../vendor/autoload.php';
class PendingContext implements Context {
trait RequestTrait { /** @var \JuliusHaertl\NextcloudBehat\Context\ServerContext */
private $serverContext;
/** @var RequestContext */
protected $requestContext;
/** @BeforeScenario */ /** @BeforeScenario */
public function gatherRequestTraitContext(BeforeScenarioScope $scope) { public function gatherContexts(BeforeScenarioScope $scope) {
$environment = $scope->getEnvironment(); $environment = $scope->getEnvironment();
$this->requestContext = $environment->getContext('RequestContext');
$this->serverContext = $environment->getContext(\JuliusHaertl\NextcloudBehat\Context\ServerContext::class);
} }
public function getResponse() {
return $this->requestContext->getResponse();
}
} }

View File

@@ -1,140 +0,0 @@
<?php
use Behat\Behat\Hook\Scope\BeforeScenarioScope;
use Behat\Gherkin\Node\TableNode;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use PHPUnit\Framework\Assert;
use Behat\Behat\Context\Context;
use Psr\Http\Message\ResponseInterface;
require_once __DIR__ . '/../../vendor/autoload.php';
class RequestContext implements Context {
private $response;
/** @var ServerContext */
private $serverContext;
/** @BeforeScenario */
public function gatherContexts(BeforeScenarioScope $scope) {
$environment = $scope->getEnvironment();
$this->serverContext = $environment->getContext('ServerContext');
}
private function getBaseUrl() {
}
/**
* @Then the response should have a status code :code
* @param string $code
* @throws InvalidArgumentException
*/
public function theResponseShouldHaveStatusCode($code) {
$currentCode = $this->response->getStatusCode();
if ($currentCode !== (int)$code) {
throw new InvalidArgumentException(
sprintf(
'Expected %s as code got %s',
$code,
$currentCode
)
);
}
}
/**
* @Then /^the response Content-Type should be "([^"]*)"$/
* @param string $contentType
*/
public function theResponseContentTypeShouldbe($contentType) {
Assert::assertEquals($contentType, $this->response->getHeader('Content-Type')[0]);
}
/**
* @Then the response should be a JSON array with the following mandatory values
* @param TableNode $table
* @throws InvalidArgumentException
*/
public function theResponseShouldBeAJsonArrayWithTheFollowingMandatoryValues(TableNode $table) {
$this->response->getBody()->seek(0);
$expectedValues = $table->getColumnsHash();
$realResponseArray = json_decode($this->response->getBody()->getContents(), true);
foreach ($expectedValues as $value) {
if ((string)$realResponseArray[$value['key']] !== (string)$value['value']) {
throw new InvalidArgumentException(
sprintf(
'Expected %s for key %s got %s',
(string)$value['value'],
$value['key'],
(string)$realResponseArray[$value['key']]
)
);
}
}
}
/**
* @Then the response should be a JSON array with a length of :length
* @param int $length
* @throws InvalidArgumentException
*/
public function theResponseShouldBeAJsonArrayWithALengthOf($length) {
$this->response->getBody()->seek(0);
$realResponseArray = json_decode($this->response->getBody()->getContents(), true);
if ((int)count($realResponseArray) !== (int)$length) {
throw new InvalidArgumentException(
sprintf(
'Expected %d as length got %d',
$length,
count($realResponseArray)
)
);
}
}
public function sendJSONrequest($method, $url, $data = []) {
$client = new Client;
try {
$this->response = $client->request(
$method,
rtrim($this->serverContext->getBaseUrl(), '/') . '/' . ltrim($url, '/'),
[
'cookies' => $this->serverContext->getCookieJar(),
'json' => $data,
'headers' => [
'requesttoken' => $this->serverContext->getReqestToken(),
]
]
);
} catch (ClientException $e) {
$this->response = $e->getResponse();
}
}
public function sendOCSRequest($method, $url, $data = []) {
$client = new Client;
try {
$this->response = $client->request(
$method,
rtrim($this->serverContext->getBaseUrl(), '/') . '/ocs/v2.php/' . ltrim($url, '/'),
[
'cookies' => $this->serverContext->getCookieJar(),
'json' => $data,
'headers' => [
'requesttoken' => $this->serverContext->getReqestToken(),
'OCS-APIREQUEST' => 'true',
'Accept' => 'application/json'
]
]
);
} catch (ClientException $e) {
$this->response = $e->getResponse();
}
}
public function getResponse(): ResponseInterface {
return $this->response;
}
}

View File

@@ -3,12 +3,14 @@
use Behat\Behat\Context\Context; use Behat\Behat\Context\Context;
use Behat\Behat\Hook\Scope\BeforeScenarioScope; use Behat\Behat\Hook\Scope\BeforeScenarioScope;
use PHPUnit\Framework\Assert; use PHPUnit\Framework\Assert;
use JuliusHaertl\NextcloudBehat\Context\ServerContext;
require_once __DIR__ . '/../../vendor/autoload.php'; require_once __DIR__ . '/../../vendor/autoload.php';
class SearchContext implements Context { class SearchContext implements Context {
use RequestTrait;
/** @var ServerContext */
protected $serverContext;
/** @var BoardContext */ /** @var BoardContext */
protected $boardContext; protected $boardContext;
@@ -19,6 +21,7 @@ class SearchContext implements Context {
public function gatherContexts(BeforeScenarioScope $scope) { public function gatherContexts(BeforeScenarioScope $scope) {
$environment = $scope->getEnvironment(); $environment = $scope->getEnvironment();
$this->serverContext = $environment->getContext(ServerContext::class);
$this->boardContext = $environment->getContext('BoardContext'); $this->boardContext = $environment->getContext('BoardContext');
} }
@@ -27,10 +30,10 @@ class SearchContext implements Context {
* @param string $term * @param string $term
*/ */
public function searchingFor(string $term) { public function searchingFor(string $term) {
$this->requestContext->sendOCSRequest('GET', '/apps/deck/api/v1.0/search?term=' . urlencode($term), []); $this->serverContext->sendOCSRequest('GET', '/apps/deck/api/v1.0/search?term=' . urlencode($term), []);
$this->requestContext->getResponse()->getBody()->seek(0); $this->serverContext->getResponse()->getBody()->seek(0);
$data = (string)$this->getResponse()->getBody(); $data = (string)$this->serverContext->getResponse()->getBody();
$this->searchResults = json_decode($data, true); $this->searchResults = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
} }
/** /**
@@ -39,9 +42,9 @@ class SearchContext implements Context {
* https://cloud.nextcloud.com/ocs/v2.php/search/providers/talk-conversations/search?term=an&from=%2Fapps%2Fdashboard%2F * https://cloud.nextcloud.com/ocs/v2.php/search/providers/talk-conversations/search?term=an&from=%2Fapps%2Fdashboard%2F
*/ */
public function searchingForComments(string $term) { public function searchingForComments(string $term) {
$this->requestContext->sendOCSRequest('GET', '/search/providers/deck-comment/search?term=' . urlencode($term), []); $this->serverContext->sendOCSRequest('GET', '/search/providers/deck-comment/search?term=' . urlencode($term), []);
$this->requestContext->getResponse()->getBody()->seek(0); $this->serverContext->getResponse()->getBody()->seek(0);
$data = (string)$this->getResponse()->getBody(); $data = (string)$this->serverContext->getResponse()->getBody();
$this->unifiedSearchResult = json_decode($data, true); $this->unifiedSearchResult = json_decode($data, true);
} }

View File

@@ -1,49 +0,0 @@
<?php
use Behat\Behat\Context\Context;
use GuzzleHttp\Cookie\CookieJar;
require_once __DIR__ . '/../../vendor/autoload.php';
class ServerContext implements Context {
use WebDav {
WebDav::__construct as private __tConstruct;
}
public function __construct($baseUrl) {
$this->rawBaseUrl = $baseUrl;
$this->__tConstruct($baseUrl . '/index.php/ocs/', ['admin', 'admin'], '123456');
}
/** @var string */
private $mappedUserId;
private $lastInsertIds = [];
/**
* @BeforeSuite
*/
public static function addFilesToSkeleton() {
}
/**
* @Given /^acting as user "([^"]*)"$/
*/
public function actingAsUser($user) {
$this->cookieJar = new CookieJar();
$this->loggingInUsingWebAs($user);
$this->asAn($user);
}
public function getBaseUrl(): string {
return $this->rawBaseUrl;
}
public function getCookieJar(): CookieJar {
return $this->cookieJar;
}
public function getReqestToken(): string {
return $this->requestToken;
}
}

View File

@@ -5,10 +5,10 @@ Feature: decks
Given user "user0" exists Given user "user0" exists
Scenario: Create a new board Scenario: Create a new board
Given Logging in using web as "admin" Given Using web as user "admin"
When creates a board named "MyBoard" with color "000000" When creates a board named "MyBoard" with color "000000"
Then the response should have a status code "200" Then the HTTP status code should be "200"
And the response Content-Type should be "application/json; charset=utf-8" And the Content-Type should be "application/json; charset=utf-8"
And the response should be a JSON array with the following mandatory values And the response should be a JSON array with the following mandatory values
|key|value| |key|value|
|title|MyBoard| |title|MyBoard|

View File

@@ -3,7 +3,7 @@ Feature: Searching for cards
Background: Background:
Given user "admin" exists Given user "admin" exists
Given user "user0" exists Given user "user0" exists
Given Logging in using web as "admin" Given Using web as user "admin"
When creates a board named "MyBoard" with color "000000" When creates a board named "MyBoard" with color "000000"
When create a stack named "ToDo" When create a stack named "ToDo"
And create a card named "Example task 1" And create a card named "Example task 1"
@@ -83,7 +83,7 @@ Feature: Searching for cards
Then the card "Done task 2" is not found Then the card "Done task 2" is not found
Scenario: Search on shared boards Scenario: Search on shared boards
Given Logging in using web as "user0" Given Using web as user "user0"
When searching for "task" When searching for "task"
Then the card "Example task 1" is found Then the card "Example task 1" is found
Then the card "Example task 2" is found Then the card "Example task 2" is found

View File

@@ -19,12 +19,11 @@ Feature: File sharing
And shares the board with user "user1" And shares the board with user "user1"
Then the HTTP status code should be "200" Then the HTTP status code should be "200"
Given using new dav path
When User "user0" uploads file "../data/test.txt" to "/user0-file.txt" When User "user0" uploads file "../data/test.txt" to "/user0-file.txt"
Then the HTTP status code should be "201" Then the HTTP status code should be "201"
Given acting as user "user0" Given acting as user "user0"
When share the file "/user0-file.txt" with the card When share the file "/user0-file.txt" with the card
Then the OCS status code should be "100" Then the OCS status code should be "200"
And the HTTP status code should be "200" And the HTTP status code should be "200"
And as "user1" the file "/Deck/user0-file.txt" exists And as "user1" the file "/Deck/user0-file.txt" exists
@@ -40,12 +39,11 @@ Feature: File sharing
| permissionManage | 1 | | permissionManage | 1 |
Then the HTTP status code should be "200" Then the HTTP status code should be "200"
Given using new dav path
When User "user1" uploads file "../data/test.txt" to "/user1-file.txt" When User "user1" uploads file "../data/test.txt" to "/user1-file.txt"
Then the HTTP status code should be "201" Then the HTTP status code should be "201"
Given acting as user "user1" Given acting as user "user1"
And share the file "/user1-file.txt" with the card And share the file "/user1-file.txt" with the card
Then the OCS status code should be "100" Then the OCS status code should be "200"
And the HTTP status code should be "200" And the HTTP status code should be "200"
And as "user0" the file "/Deck/user1-file.txt" exists And as "user0" the file "/Deck/user1-file.txt" exists
@@ -59,13 +57,11 @@ Feature: File sharing
And shares the board with user "user1" And shares the board with user "user1"
Then the HTTP status code should be "200" Then the HTTP status code should be "200"
Given using new dav path Given acting as user "user1"
When User "user1" uploads file "../data/test.txt" to "/user1-file.txt" When User "user1" uploads file "../data/test.txt" to "/user1-file.txt"
Then the HTTP status code should be "201" Then the HTTP status code should be "201"
Given acting as user "user1" When share the file "/user1-file.txt" with the card
And share the file "/user1-file.txt" with the card
Then the OCS status code should be "404" Then the OCS status code should be "404"
And the HTTP status code should be "200"
And as "user0" the file "/Deck/user1-file.txt" does not exist And as "user0" the file "/Deck/user1-file.txt" does not exist
Scenario: Share a file with a card by another user through a group Scenario: Share a file with a card by another user through a group
@@ -76,12 +72,11 @@ Feature: File sharing
And shares the board with group "group1" And shares the board with group "group1"
Then the HTTP status code should be "200" Then the HTTP status code should be "200"
Given using new dav path
When User "user0" uploads file "../data/test.txt" to "/user0-file2.txt" When User "user0" uploads file "../data/test.txt" to "/user0-file2.txt"
Then the HTTP status code should be "201" Then the HTTP status code should be "201"
Given acting as user "user0" Given acting as user "user0"
When share the file "/user0-file2.txt" with the card When share the file "/user0-file2.txt" with the card
Then the OCS status code should be "100" Then the OCS status code should be "200"
And the HTTP status code should be "200" And the HTTP status code should be "200"
And as "user2" the file "/Deck/user0-file2.txt" exists And as "user2" the file "/Deck/user0-file2.txt" exists
@@ -95,12 +90,11 @@ Feature: File sharing
And shares the board with group "group1" And shares the board with group "group1"
Then the HTTP status code should be "200" Then the HTTP status code should be "200"
Given using new dav path
When User "user0" uploads file "../data/test.txt" to "/user0-file2.txt" When User "user0" uploads file "../data/test.txt" to "/user0-file2.txt"
Then the HTTP status code should be "201" Then the HTTP status code should be "201"
Given acting as user "user0" Given acting as user "user0"
When share the file "/user0-file2.txt" with the card When share the file "/user0-file2.txt" with the card
Then the OCS status code should be "100" Then the OCS status code should be "200"
And the HTTP status code should be "200" And the HTTP status code should be "200"
And as "user2" the file "/Deck/user0-file2.txt" exists And as "user2" the file "/Deck/user0-file2.txt" exists
@@ -119,12 +113,11 @@ Feature: File sharing
And shares the board with group "group1" And shares the board with group "group1"
Then the HTTP status code should be "200" Then the HTTP status code should be "200"
Given using new dav path
When User "user0" uploads file "../data/test.txt" to "/user0-file2.txt" When User "user0" uploads file "../data/test.txt" to "/user0-file2.txt"
Then the HTTP status code should be "201" Then the HTTP status code should be "201"
Given acting as user "user0" Given acting as user "user0"
When share the file "/user0-file2.txt" with the card When share the file "/user0-file2.txt" with the card
Then the OCS status code should be "100" Then the OCS status code should be "200"
And the HTTP status code should be "200" And the HTTP status code should be "200"
And as "user2" the file "/Deck/user0-file2.txt" exists And as "user2" the file "/Deck/user0-file2.txt" exists

View File

@@ -5,11 +5,6 @@ OCC=${OC_PATH}occ
SCENARIO_TO_RUN=$1 SCENARIO_TO_RUN=$1
HIDE_OC_LOGS=$2 HIDE_OC_LOGS=$2
# Nextcloud integration tests composer
(
cd ${OC_PATH}build/integration
composer install
)
INSTALLED=$($OCC status | grep installed: | cut -d " " -f 5) INSTALLED=$($OCC status | grep installed: | cut -d " " -f 5)
if [ "$INSTALLED" == "true" ]; then if [ "$INSTALLED" == "true" ]; then
@@ -24,11 +19,11 @@ composer dump-autoload
# avoid port collision on jenkins - use $EXECUTOR_NUMBER # avoid port collision on jenkins - use $EXECUTOR_NUMBER
if [ -z "$EXECUTOR_NUMBER" ]; then if [ -z "$EXECUTOR_NUMBER" ]; then
EXECUTOR_NUMBER=0 EXECUTOR_NUMBER=1
fi fi
PORT=$((8080 + $EXECUTOR_NUMBER)) PORT=$((8080 + $EXECUTOR_NUMBER))
echo $PORT echo $PORT
php -S localhost:$PORT -t $OC_PATH & PHP_CLI_SERVER_WORKERS=10 php -S localhost:$PORT -t $OC_PATH &
PHPPID=$! PHPPID=$!
echo $PHPPID echo $PHPPID

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<files psalm-version="4.7.3@38c452ae584467e939d55377aaf83b5a26f19dd1"> <files psalm-version="4.7.0@d4377c0baf3ffbf0b1ec6998e8d1be2a40971005">
<file src="lib/Activity/ActivityManager.php"> <file src="lib/Activity/ActivityManager.php">
<TypeDoesNotContainType occurrences="1"> <TypeDoesNotContainType occurrences="1">
<code>$message !== null</code> <code>$message !== null</code>
@@ -197,6 +197,9 @@
</TooManyArguments> </TooManyArguments>
</file> </file>
<file src="lib/Service/CardService.php"> <file src="lib/Service/CardService.php">
<TooFewArguments occurrences="1">
<code>findAssignedCards</code>
</TooFewArguments>
<UndefinedDocblockClass occurrences="1"> <UndefinedDocblockClass occurrences="1">
<code>\OCP\AppFramework\Db\</code> <code>\OCP\AppFramework\Db\</code>
</UndefinedDocblockClass> </UndefinedDocblockClass>
@@ -274,9 +277,6 @@
<InvalidReturnType occurrences="1"> <InvalidReturnType occurrences="1">
<code>getSharesInFolder</code> <code>getSharesInFolder</code>
</InvalidReturnType> </InvalidReturnType>
<InvalidThrow occurrences="1">
<code>throw new GenericShareException('Already shared', $this-&gt;l-&gt;t('Path is already shared with this card'), 403);</code>
</InvalidThrow>
<MissingDependency occurrences="8"> <MissingDependency occurrences="8">
<code>GenericShareException</code> <code>GenericShareException</code>
<code>GenericShareException</code> <code>GenericShareException</code>

View File

@@ -196,7 +196,7 @@ class CardServiceTest extends TestCase {
$this->cardMapper->expects($this->once())->method('update')->willReturnCallback(function ($c) { $this->cardMapper->expects($this->once())->method('update')->willReturnCallback(function ($c) {
return $c; return $c;
}); });
$actual = $this->cardService->update(123, 'newtitle', 234, 'text', 'admin', 'foo', 999, '2017-01-01 00:00:00', null); $actual = $this->cardService->update(123, 'newtitle', 234, 'text', 999, 'foo', 'admin', '2017-01-01 00:00:00', null);
$this->assertEquals('newtitle', $actual->getTitle()); $this->assertEquals('newtitle', $actual->getTitle());
$this->assertEquals(234, $actual->getStackId()); $this->assertEquals(234, $actual->getStackId());
$this->assertEquals('text', $actual->getType()); $this->assertEquals('text', $actual->getType());
@@ -212,7 +212,7 @@ class CardServiceTest extends TestCase {
$this->cardMapper->expects($this->once())->method('find')->willReturn($card); $this->cardMapper->expects($this->once())->method('find')->willReturn($card);
$this->cardMapper->expects($this->never())->method('update'); $this->cardMapper->expects($this->never())->method('update');
$this->expectException(StatusException::class); $this->expectException(StatusException::class);
$this->cardService->update(123, 'newtitle', 234, 'text', 'admin', 'foo', 999, '2017-01-01 00:00:00', null, true); $this->cardService->update(123, 'newtitle', 234, 'text', 999, 'foo', 'admin', '2017-01-01 00:00:00', null, true);
} }
public function testRename() { public function testRename() {

View File

@@ -146,7 +146,7 @@ class PermissionServiceTest extends \Test\TestCase {
} }
public function testUserIsBoardOwnerNull() { public function testUserIsBoardOwnerNull() {
$this->boardMapper->expects($this->once())->method('find')->willThrowException(new DoesNotExistException('board does not exist')); $this->boardMapper->expects($this->once())->method('find')->willReturn(null);
$this->assertEquals(false, $this->service->userIsBoardOwner(123)); $this->assertEquals(false, $this->service->userIsBoardOwner(123));
} }
@@ -225,9 +225,12 @@ class PermissionServiceTest extends \Test\TestCase {
$board = new Board(); $board = new Board();
$board->setId($boardId); $board->setId($boardId);
$board->setOwner($owner); $board->setOwner($owner);
$board->setAcl($this->getAcls($boardId));
$this->boardMapper->expects($this->any())->method('find')->willReturn($board); $this->boardMapper->expects($this->any())->method('find')->willReturn($board);
// acl check
$acls = $this->getAcls($boardId);
$this->aclMapper->expects($this->any())->method('findAll')->willReturn($acls);
$this->shareManager->expects($this->any()) $this->shareManager->expects($this->any())
->method('sharingDisabledForUser') ->method('sharingDisabledForUser')
->willReturn(false); ->willReturn(false);
@@ -247,12 +250,14 @@ class PermissionServiceTest extends \Test\TestCase {
$board = new Board(); $board = new Board();
$board->setId($boardId); $board->setId($boardId);
$board->setOwner($owner); $board->setOwner($owner);
$board->setAcl($this->getAcls($boardId));
if ($boardId === null) { if ($boardId === null) {
$this->boardMapper->expects($this->any())->method('find')->willThrowException(new DoesNotExistException('not found')); $this->boardMapper->expects($this->any())->method('find')->willThrowException(new DoesNotExistException('not found'));
} else { } else {
$this->boardMapper->expects($this->any())->method('find')->willReturn($board); $this->boardMapper->expects($this->any())->method('find')->willReturn($board);
} }
$acls = $this->getAcls($boardId);
$this->aclMapper->expects($this->any())->method('findAll')->willReturn($acls);
if ($result) { if ($result) {
$actual = $this->service->checkPermission($mapper, 1234, $permission); $actual = $this->service->checkPermission($mapper, 1234, $permission);

View File

@@ -75,7 +75,7 @@ class CardControllerTest extends TestCase {
public function testUpdate() { public function testUpdate() {
$this->cardService->expects($this->once()) $this->cardService->expects($this->once())
->method('update') ->method('update')
->with(1, 'title', 3, 'text', $this->userId, 'foo', 5, '2017-01-01 00:00:00') ->with(1, 'title', 3, 'text', 5, 'foo', $this->userId, '2017-01-01 00:00:00')
->willReturn(1); ->willReturn(1);
$this->assertEquals(1, $this->controller->update(1, 'title', 3, 'text', 5, 'foo', '2017-01-01 00:00:00', null)); $this->assertEquals(1, $this->controller->update(1, 'title', 3, 'text', 5, 'foo', '2017-01-01 00:00:00', null));
} }