Compare commits
1 Commits
v1.5.0
...
tests/beha
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b02e7fb25 |
4
.github/workflows/appbuild.yml
vendored
4
.github/workflows/appbuild.yml
vendored
@@ -9,7 +9,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [14.x]
|
||||
node-version: [12.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
@@ -17,8 +17,6 @@ jobs:
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
run: npm i -g npm@7
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v1
|
||||
with:
|
||||
|
||||
2
.github/workflows/integration.yml
vendored
2
.github/workflows/integration.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
matrix:
|
||||
php-versions: ['7.4']
|
||||
databases: ['sqlite', 'mysql', 'pgsql']
|
||||
server-versions: ['stable22']
|
||||
server-versions: ['master']
|
||||
|
||||
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
|
||||
|
||||
|
||||
9
.github/workflows/lint.yml
vendored
9
.github/workflows/lint.yml
vendored
@@ -47,7 +47,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [14.x]
|
||||
node-version: [12.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
@@ -55,8 +55,6 @@ jobs:
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
run: npm i -g npm@7
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
- name: ESLint
|
||||
@@ -67,7 +65,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-versions: [14.x]
|
||||
node-versions: [12.x]
|
||||
|
||||
name: stylelint node${{ matrix.node-versions }}
|
||||
steps:
|
||||
@@ -78,9 +76,6 @@ jobs:
|
||||
with:
|
||||
node-versions: ${{ matrix.node-versions }}
|
||||
|
||||
- name: Set up npm7
|
||||
run: npm i -g npm@7
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
|
||||
4
.github/workflows/nightly.yml
vendored
4
.github/workflows/nightly.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [14.x]
|
||||
node-version: [12.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
@@ -22,8 +22,6 @@ jobs:
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
run: npm i -g npm@7
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v1
|
||||
with:
|
||||
|
||||
4
.github/workflows/nodejs.yml
vendored
4
.github/workflows/nodejs.yml
vendored
@@ -9,7 +9,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [14.x]
|
||||
node-version: [12.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
@@ -17,8 +17,6 @@ jobs:
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
run: npm i -g npm@7
|
||||
- name: install dependencies
|
||||
run: |
|
||||
npm ci
|
||||
|
||||
2
.github/workflows/phpunit.yml
vendored
2
.github/workflows/phpunit.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
matrix:
|
||||
php-versions: ['7.3', '7.4']
|
||||
databases: ['sqlite', 'mysql', 'pgsql']
|
||||
server-versions: ['stable22']
|
||||
server-versions: ['master']
|
||||
|
||||
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
|
||||
|
||||
|
||||
2
.github/workflows/static-analysis.yml
vendored
2
.github/workflows/static-analysis.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
ocp-version: [ 'dev-stable22' ]
|
||||
ocp-version: [ 'dev-master' ]
|
||||
name: Nextcloud ${{ matrix.ocp-version }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
|
||||
66
CHANGELOG.md
66
CHANGELOG.md
@@ -1,40 +1,6 @@
|
||||
# Changelog
|
||||
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
|
||||
|
||||
### Added
|
||||
@@ -69,15 +35,15 @@ All notable changes to this project will be documented in this file.
|
||||
## 1.3.0-beta2
|
||||
|
||||
### Fixed
|
||||
* [#2700](https://github.com/nextcloud/deck/pull/2700) Attempt to copy file on dropping it to deck
|
||||
* [#2701](https://github.com/nextcloud/deck/pull/2701) Fix uploading files by drag and drop
|
||||
* [#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 @juliushaertl
|
||||
* [#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
|
||||
* [#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
|
||||
* [#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
|
||||
* [#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
|
||||
@@ -186,31 +152,31 @@ All notable changes to this project will be documented in this file.
|
||||
### Fixed
|
||||
|
||||
|
||||
* [#2116](https://github.com/nextcloud/deck/pull/2116) Fix navigation layout issues
|
||||
* [#2118](https://github.com/nextcloud/deck/pull/2118) Use proper parameter when handling attachments
|
||||
* [#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 @juliushaertl
|
||||
|
||||
## 1.0.4 - 2020-06-26
|
||||
|
||||
### 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
|
||||
* [#2059](https://github.com/nextcloud/deck/pull/2059) Fix fetching attachments on card change
|
||||
* [#2060](https://github.com/nextcloud/deck/pull/2060) Use mixing for relative date in card sidebar
|
||||
* [#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 @juliushaertl
|
||||
|
||||
|
||||
## 1.0.3 - 2020-06-19
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#2019](https://github.com/nextcloud/deck/pull/2019) Remove old global css rule
|
||||
* [#2020](https://github.com/nextcloud/deck/pull/2020) Fix navigation issue with leftover nodes
|
||||
* [#2021](https://github.com/nextcloud/deck/pull/2021) Fix description issues
|
||||
* [#2022](https://github.com/nextcloud/deck/pull/2022) Fix replyto issues with the comments API
|
||||
* [#2027](https://github.com/nextcloud/deck/pull/2027) Allow to unassign current user from card
|
||||
* [#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 @juliushaertl
|
||||
* [#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 @juliushaertl
|
||||
* [#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
|
||||
* [#2032](https://github.com/nextcloud/deck/pull/2032) Force order by id as second sorting key
|
||||
* [#2045](https://github.com/nextcloud/deck/pull/2045) Improve label styling
|
||||
* [#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 @juliushaertl
|
||||
* [#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
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
- 🚀 Get your project organized
|
||||
|
||||
</description>
|
||||
<version>1.5.0</version>
|
||||
<version>2.0.0-alpha1</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Julius Härtl</author>
|
||||
<namespace>Deck</namespace>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"require-dev": {
|
||||
"roave/security-advisories": "dev-master",
|
||||
"christophwurst/nextcloud": "^21@dev",
|
||||
"phpunit/phpunit": "^9",
|
||||
"phpunit/phpunit": "^8",
|
||||
"nextcloud/coding-standard": "^0.5.0",
|
||||
"symfony/event-dispatcher": "^4.0",
|
||||
"vimeo/psalm": "^4.3",
|
||||
|
||||
967
composer.lock
generated
967
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||
"Card not found" : "Karta nebyla nalezena",
|
||||
"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",
|
||||
"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ě",
|
||||
@@ -191,7 +191,7 @@ OC.L10N.register(
|
||||
"Delete Attachment" : "Smazat přílohu",
|
||||
"Restore Attachment" : "Obnovit přílohu",
|
||||
"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 bigger view" : "Otevřít ve větším zobrazení",
|
||||
"Attachments" : "Přílohy",
|
||||
@@ -213,7 +213,7 @@ OC.L10N.register(
|
||||
"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ů.",
|
||||
"In reply to" : "V odpověď na",
|
||||
"Cancel reply" : "Zrušit odpověď",
|
||||
"Cancel reply" : "Odebrat odpověď",
|
||||
"Reply" : "Odpovědět",
|
||||
"Update" : "Aktualizovat",
|
||||
"Description" : "Popis",
|
||||
|
||||
@@ -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",
|
||||
"Card not found" : "Karta nebyla nalezena",
|
||||
"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",
|
||||
"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ě",
|
||||
@@ -189,7 +189,7 @@
|
||||
"Delete Attachment" : "Smazat přílohu",
|
||||
"Restore Attachment" : "Obnovit přílohu",
|
||||
"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 bigger view" : "Otevřít ve větším zobrazení",
|
||||
"Attachments" : "Přílohy",
|
||||
@@ -211,7 +211,7 @@
|
||||
"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ů.",
|
||||
"In reply to" : "V odpověď na",
|
||||
"Cancel reply" : "Zrušit odpověď",
|
||||
"Cancel reply" : "Odebrat odpověď",
|
||||
"Reply" : "Odpovědět",
|
||||
"Update" : "Aktualizovat",
|
||||
"Description" : "Popis",
|
||||
|
||||
58
l10n/hu.js
58
l10n/hu.js
@@ -17,42 +17,42 @@ OC.L10N.register(
|
||||
"{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",
|
||||
"{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",
|
||||
"{user} has created a new list {stack} on board {board}" : "{user} létrehozta az új {stack} listát 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}",
|
||||
"{user} has renamed list {before} to {stack} on board {board}" : "{user} átnevezte a(z) {board} tábla {before} listájá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",
|
||||
"{user} has deleted list {stack} on board {board}" : "{user} törölte a(z) {stack} listát 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",
|
||||
"{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",
|
||||
"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",
|
||||
"{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",
|
||||
"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} 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} rakásá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} rakást 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} 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} 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} 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} 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}",
|
||||
"{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",
|
||||
"{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",
|
||||
"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",
|
||||
"{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",
|
||||
"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",
|
||||
"{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",
|
||||
"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",
|
||||
"{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",
|
||||
"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} 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} 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} 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} 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} 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} 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} 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",
|
||||
"{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",
|
||||
"{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}",
|
||||
"{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",
|
||||
"{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",
|
||||
"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",
|
||||
"{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",
|
||||
"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} 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} 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} 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}",
|
||||
"{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}",
|
||||
"{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",
|
||||
"{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",
|
||||
"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} 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",
|
||||
"{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",
|
||||
@@ -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.",
|
||||
"%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.",
|
||||
"Card comments" : "Kártya hozzászólásai",
|
||||
"Card comments" : "Kártyák hozzászólások",
|
||||
"%s on %s" : "%s ezen: %s",
|
||||
"No data was provided to create an attachment." : "Nincsenek megadva adatok a melléklet létrehozásához.",
|
||||
"Finished" : "Kész",
|
||||
@@ -143,8 +143,8 @@ OC.L10N.register(
|
||||
"Toggle compact mode" : "Kompakt mód be/ki",
|
||||
"Details" : "Részletek",
|
||||
"Loading board" : "Tábla betöltése",
|
||||
"No lists available" : "Nincs elérhető lista",
|
||||
"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",
|
||||
"No lists available" : "Nincs elérhető rakás",
|
||||
"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ó",
|
||||
"Sharing" : "Megosztás",
|
||||
"Tags" : "Címkék",
|
||||
@@ -154,7 +154,7 @@ OC.L10N.register(
|
||||
"Undo" : "Visszavonás",
|
||||
"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…",
|
||||
"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",
|
||||
"Board owner" : "Tábla tulajdonosa",
|
||||
"(Group)" : "(Csoport)",
|
||||
@@ -168,7 +168,7 @@ OC.L10N.register(
|
||||
"Archive all cards" : "Az összes kártya archiválása",
|
||||
"Delete list" : "Lista törlése",
|
||||
"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",
|
||||
"Card name" : "Kártya neve",
|
||||
"List deleted" : "Lista törölve",
|
||||
|
||||
58
l10n/hu.json
58
l10n/hu.json
@@ -15,42 +15,42 @@
|
||||
"{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",
|
||||
"{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",
|
||||
"{user} has created a new list {stack} on board {board}" : "{user} létrehozta az új {stack} listát 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}",
|
||||
"{user} has renamed list {before} to {stack} on board {board}" : "{user} átnevezte a(z) {board} tábla {before} listájá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",
|
||||
"{user} has deleted list {stack} on board {board}" : "{user} törölte a(z) {stack} listát 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",
|
||||
"{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",
|
||||
"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",
|
||||
"{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",
|
||||
"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} 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} rakásá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} rakást 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} 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} 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} 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} 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}",
|
||||
"{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",
|
||||
"{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",
|
||||
"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",
|
||||
"{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",
|
||||
"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",
|
||||
"{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",
|
||||
"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",
|
||||
"{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",
|
||||
"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} 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} 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} 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} 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} 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} 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} 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",
|
||||
"{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",
|
||||
"{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}",
|
||||
"{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",
|
||||
"{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",
|
||||
"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",
|
||||
"{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",
|
||||
"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} 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} 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} 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}",
|
||||
"{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}",
|
||||
"{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",
|
||||
"{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",
|
||||
"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} 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",
|
||||
"{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",
|
||||
@@ -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.",
|
||||
"%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.",
|
||||
"Card comments" : "Kártya hozzászólásai",
|
||||
"Card comments" : "Kártyák hozzászólások",
|
||||
"%s on %s" : "%s ezen: %s",
|
||||
"No data was provided to create an attachment." : "Nincsenek megadva adatok a melléklet létrehozásához.",
|
||||
"Finished" : "Kész",
|
||||
@@ -141,8 +141,8 @@
|
||||
"Toggle compact mode" : "Kompakt mód be/ki",
|
||||
"Details" : "Részletek",
|
||||
"Loading board" : "Tábla betöltése",
|
||||
"No lists available" : "Nincs elérhető lista",
|
||||
"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",
|
||||
"No lists available" : "Nincs elérhető rakás",
|
||||
"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ó",
|
||||
"Sharing" : "Megosztás",
|
||||
"Tags" : "Címkék",
|
||||
@@ -152,7 +152,7 @@
|
||||
"Undo" : "Visszavonás",
|
||||
"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…",
|
||||
"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",
|
||||
"Board owner" : "Tábla tulajdonosa",
|
||||
"(Group)" : "(Csoport)",
|
||||
@@ -166,7 +166,7 @@
|
||||
"Archive all cards" : "Az összes kártya archiválása",
|
||||
"Delete list" : "Lista törlése",
|
||||
"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",
|
||||
"Card name" : "Kártya neve",
|
||||
"List deleted" : "Lista törölve",
|
||||
|
||||
@@ -63,9 +63,9 @@ OC.L10N.register(
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user}が添付ファイル{attachment}をカード{card}に復元しました",
|
||||
"You have commented on card {card}" : "カード{card}にコメントしました",
|
||||
"{user} has commented on card {card}" : "{user}がカード{card}にコメントしました",
|
||||
"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" : "デッキ",
|
||||
"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>が作成されたとき",
|
||||
"Upcoming cards" : "今後のカード",
|
||||
"Personal" : "個人",
|
||||
@@ -197,7 +197,7 @@ OC.L10N.register(
|
||||
"Assign a tag to this card…" : "タグこのをカードに割り当てる…",
|
||||
"Assign to users" : "ユーザーに割り当てる",
|
||||
"Assign to users/groups/circles" : "ユーザー/グループ/サークルに割り当てる",
|
||||
"Assign a user to this card…" : "このカードをユーザーに割り当てる…",
|
||||
"Assign a user to this card…" : "このカードにユーザーに割り当てる…",
|
||||
"Due date" : "期限",
|
||||
"Set a due date" : "期限を設定",
|
||||
"Remove due date" : "期限を削除",
|
||||
|
||||
@@ -61,9 +61,9 @@
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user}が添付ファイル{attachment}をカード{card}に復元しました",
|
||||
"You have commented on card {card}" : "カード{card}にコメントしました",
|
||||
"{user} has commented on card {card}" : "{user}がカード{card}にコメントしました",
|
||||
"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" : "デッキ",
|
||||
"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>が作成されたとき",
|
||||
"Upcoming cards" : "今後のカード",
|
||||
"Personal" : "個人",
|
||||
@@ -195,7 +195,7 @@
|
||||
"Assign a tag to this card…" : "タグこのをカードに割り当てる…",
|
||||
"Assign to users" : "ユーザーに割り当てる",
|
||||
"Assign to users/groups/circles" : "ユーザー/グループ/サークルに割り当てる",
|
||||
"Assign a user to this card…" : "このカードをユーザーに割り当てる…",
|
||||
"Assign a user to this card…" : "このカードにユーザーに割り当てる…",
|
||||
"Due date" : "期限",
|
||||
"Set a due date" : "期限を設定",
|
||||
"Remove due date" : "期限を削除",
|
||||
|
||||
@@ -16,7 +16,6 @@ OC.L10N.register(
|
||||
"Edit" : "Modificar",
|
||||
"Upload new files" : "Enviar fichièrs novèls",
|
||||
"Save" : "Salvar",
|
||||
"Cancel reply" : "Anullar la responsa",
|
||||
"Reply" : "Respondre",
|
||||
"Update" : "Metre a jorn",
|
||||
"Description" : "Descripcion",
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
"Edit" : "Modificar",
|
||||
"Upload new files" : "Enviar fichièrs novèls",
|
||||
"Save" : "Salvar",
|
||||
"Cancel reply" : "Anullar la responsa",
|
||||
"Reply" : "Respondre",
|
||||
"Update" : "Metre a jorn",
|
||||
"Description" : "Descripcion",
|
||||
|
||||
14
l10n/sv.js
14
l10n/sv.js
@@ -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}",
|
||||
"You have commented on card {card}" : "Du 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",
|
||||
"Deck" : "Kortlek",
|
||||
"Changes in the <strong>Deck app</strong>" : "Ändringar i <strong>Kortlek-appen</strong>",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "En <strong>kortbeskrivning</strong> i Kort-appen har ändrats",
|
||||
"Deck" : "Kort",
|
||||
"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",
|
||||
"Upcoming cards" : "Kommande kort",
|
||||
"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",
|
||||
"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",
|
||||
"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",
|
||||
"Add board" : "Lägg till tavla",
|
||||
"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",
|
||||
"Show boards in calendar/tasks" : "Visa tavlor i kalender / uppgifter",
|
||||
"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",
|
||||
"Edit board" : "Ändra tavla",
|
||||
"Clone board" : "Kopiera tavla",
|
||||
@@ -278,8 +278,8 @@ OC.L10N.register(
|
||||
"Failed to upload {name}" : "Kunde inte ladda upp {name}",
|
||||
"Maximum file size of {size} exceeded" : "Maximal filstorlek på {size} överskriden",
|
||||
"Error creating the share" : "Kunde inte skapa delning",
|
||||
"Share with a Deck card" : "Dela med ett Kortlek-kort",
|
||||
"Share {file} with a Deck card" : "Dela {file} med ett Kortlek-kort",
|
||||
"Share with a Deck card" : "Dela med ett kort",
|
||||
"Share {file} with a Deck card" : "Dela {file} med ett kort",
|
||||
"Share" : "Dela"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
14
l10n/sv.json
14
l10n/sv.json
@@ -61,9 +61,9 @@
|
||||
"{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}",
|
||||
"{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",
|
||||
"Deck" : "Kortlek",
|
||||
"Changes in the <strong>Deck app</strong>" : "Ändringar i <strong>Kortlek-appen</strong>",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "En <strong>kortbeskrivning</strong> i Kort-appen har ändrats",
|
||||
"Deck" : "Kort",
|
||||
"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",
|
||||
"Upcoming cards" : "Kommande kort",
|
||||
"Personal" : "Personlig",
|
||||
@@ -102,7 +102,7 @@
|
||||
"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",
|
||||
"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",
|
||||
"Add board" : "Lägg till tavla",
|
||||
"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",
|
||||
"Show boards in calendar/tasks" : "Visa tavlor i kalender / uppgifter",
|
||||
"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",
|
||||
"Edit board" : "Ändra tavla",
|
||||
"Clone board" : "Kopiera tavla",
|
||||
@@ -276,8 +276,8 @@
|
||||
"Failed to upload {name}" : "Kunde inte ladda upp {name}",
|
||||
"Maximum file size of {size} exceeded" : "Maximal filstorlek på {size} överskriden",
|
||||
"Error creating the share" : "Kunde inte skapa delning",
|
||||
"Share with a Deck card" : "Dela med ett Kortlek-kort",
|
||||
"Share {file} with a Deck card" : "Dela {file} med ett Kortlek-kort",
|
||||
"Share with a Deck card" : "Dela med ett kort",
|
||||
"Share {file} with a Deck card" : "Dela {file} med ett kort",
|
||||
"Share" : "Dela"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
12
l10n/tr.js
12
l10n/tr.js
@@ -88,9 +88,9 @@ OC.L10N.register(
|
||||
"To do" : "Yapılacak işler",
|
||||
"Doing" : "Yapılanlar",
|
||||
"Done" : "Bitenler",
|
||||
"Example Task 3" : "3. örnek görev",
|
||||
"Example Task 2" : "2. örnek görev",
|
||||
"Example Task 1" : "1. örnek görev",
|
||||
"Example Task 3" : "3. Örnek Görev",
|
||||
"Example Task 2" : "2. Örnek Görev",
|
||||
"Example Task 1" : "1. Örnek Görev",
|
||||
"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 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",
|
||||
"Show in Files" : "Dosyalarda görüntüle",
|
||||
"Unshare file" : "Dosyayı paylaşımdan kaldır",
|
||||
"Delete Attachment" : "Ek dosyasını sil",
|
||||
"Restore Attachment" : "Ek dosyasını geri yükle",
|
||||
"Delete Attachment" : "Ek Dosyasını Sil",
|
||||
"Restore Attachment" : "Ek Dosyasını Geri Yükle",
|
||||
"File to share" : "Paylaşılacak dosya",
|
||||
"Invalid path selected" : "Seçilen yol geçersiz",
|
||||
"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ı",
|
||||
"Edit description" : "Açıklamayı düzenle",
|
||||
"View description" : "Açıklamayı görüntüle",
|
||||
"Add Attachment" : "Dosya ekle",
|
||||
"Add Attachment" : "Dosya Ekle",
|
||||
"Write a description …" : "Bir açıklama yazın …",
|
||||
"Choose attachment" : "Ek dosyayı seçin",
|
||||
"(group)" : "(grup)",
|
||||
|
||||
12
l10n/tr.json
12
l10n/tr.json
@@ -86,9 +86,9 @@
|
||||
"To do" : "Yapılacak işler",
|
||||
"Doing" : "Yapılanlar",
|
||||
"Done" : "Bitenler",
|
||||
"Example Task 3" : "3. örnek görev",
|
||||
"Example Task 2" : "2. örnek görev",
|
||||
"Example Task 1" : "1. örnek görev",
|
||||
"Example Task 3" : "3. Örnek Görev",
|
||||
"Example Task 2" : "2. Örnek Görev",
|
||||
"Example Task 1" : "1. Örnek Görev",
|
||||
"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 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",
|
||||
"Show in Files" : "Dosyalarda görüntüle",
|
||||
"Unshare file" : "Dosyayı paylaşımdan kaldır",
|
||||
"Delete Attachment" : "Ek dosyasını sil",
|
||||
"Restore Attachment" : "Ek dosyasını geri yükle",
|
||||
"Delete Attachment" : "Ek Dosyasını Sil",
|
||||
"Restore Attachment" : "Ek Dosyasını Geri Yükle",
|
||||
"File to share" : "Paylaşılacak dosya",
|
||||
"Invalid path selected" : "Seçilen yol geçersiz",
|
||||
"Open in sidebar view" : "Yan çubuk görünümünde aç",
|
||||
@@ -220,7 +220,7 @@
|
||||
"Formatting help" : "Biçimlendirme yardımı",
|
||||
"Edit description" : "Açıklamayı düzenle",
|
||||
"View description" : "Açıklamayı görüntüle",
|
||||
"Add Attachment" : "Dosya ekle",
|
||||
"Add Attachment" : "Dosya Ekle",
|
||||
"Write a description …" : "Bir açıklama yazın …",
|
||||
"Choose attachment" : "Ek dosyayı seçin",
|
||||
"(group)" : "(grup)",
|
||||
|
||||
@@ -95,7 +95,7 @@ class CardApiController extends ApiController {
|
||||
* Update a card
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ class CardController extends Controller {
|
||||
* @return \OCP\AppFramework\Db\Entity
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -44,9 +44,9 @@ class AclMapper extends DeckMapper implements IPermissionMapper {
|
||||
return ($row['owner'] === $userId);
|
||||
}
|
||||
|
||||
public function findBoardId($id): ?int {
|
||||
public function findBoardId($aclId): ?int {
|
||||
try {
|
||||
$entity = $this->find($id);
|
||||
$entity = $this->find($aclId);
|
||||
return $entity->getBoardId();
|
||||
} catch (DoesNotExistException | MultipleObjectsReturnedException $e) {
|
||||
}
|
||||
|
||||
@@ -83,8 +83,8 @@ class AssignmentMapper extends QBMapper implements IPermissionMapper {
|
||||
return $this->cardMapper->isOwner($userId, $cardId);
|
||||
}
|
||||
|
||||
public function findBoardId($id): ?int {
|
||||
return $this->cardMapper->findBoardId($id);
|
||||
public function findBoardId($cardId): ?int {
|
||||
return $this->cardMapper->findBoardId($cardId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
|
||||
namespace OCA\Deck\Db;
|
||||
|
||||
use OC\Cache\CappedMemoryCache;
|
||||
use OCP\AppFramework\Db\DoesNotExistException;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IUserManager;
|
||||
@@ -40,8 +39,6 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
|
||||
private $circlesEnabled;
|
||||
|
||||
private $userBoardCache;
|
||||
|
||||
public function __construct(
|
||||
IDBConnection $db,
|
||||
LabelMapper $labelMapper,
|
||||
@@ -59,9 +56,6 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
$this->groupManager = $groupManager;
|
||||
$this->logger = $logger;
|
||||
|
||||
$this->userBoardCache = new CappedMemoryCache();
|
||||
|
||||
|
||||
$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 {
|
||||
$useCache = ($since === -1 && $includeArchived === true);
|
||||
if (!isset($this->userBoardCache[$userId]) || !$useCache) {
|
||||
$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);
|
||||
$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];
|
||||
$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);
|
||||
$circleBoards = $this->findAllByCircles($userId, null, null, $since, $includeArchived);
|
||||
return array_unique(array_merge($userBoards, $groupBoards, $circleBoards));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -546,10 +546,10 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
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 = ?))';
|
||||
$stmt = $this->db->prepare($sql);
|
||||
$stmt->bindParam(1, $id, \PDO::PARAM_INT);
|
||||
$stmt->bindParam(1, $cardId, \PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
return $stmt->fetchColumn() ?? null;
|
||||
}
|
||||
|
||||
@@ -36,8 +36,8 @@ class Circle extends RelationalObject {
|
||||
public function getObjectSerialization() {
|
||||
return [
|
||||
'uid' => $this->object->getUniqueId(),
|
||||
'displayname' => $this->object->getDisplayName(),
|
||||
'typeString' => '',
|
||||
'displayname' => $this->object->getName(),
|
||||
'typeString' => $this->object->getTypeString(),
|
||||
'circleOwner' => $this->object->getOwner(),
|
||||
'type' => 7
|
||||
];
|
||||
|
||||
@@ -101,9 +101,9 @@ class LabelMapper extends DeckMapper implements IPermissionMapper {
|
||||
return ($row['owner'] === $userId);
|
||||
}
|
||||
|
||||
public function findBoardId($id): ?int {
|
||||
public function findBoardId($labelId): ?int {
|
||||
try {
|
||||
$entity = $this->find($id);
|
||||
$entity = $this->find($labelId);
|
||||
return $entity->getBoardId();
|
||||
} catch (DoesNotExistException $e) {
|
||||
} catch (MultipleObjectsReturnedException $e) {
|
||||
|
||||
@@ -75,9 +75,9 @@ class StackMapper extends DeckMapper implements IPermissionMapper {
|
||||
return ($row['owner'] === $userId);
|
||||
}
|
||||
|
||||
public function findBoardId($id): ?int {
|
||||
public function findBoardId($stackId): ?int {
|
||||
try {
|
||||
$entity = $this->find($id);
|
||||
$entity = $this->find($stackId);
|
||||
return $entity->getBoardId();
|
||||
} catch (DoesNotExistException $e) {
|
||||
} catch (MultipleObjectsReturnedException $e) {
|
||||
|
||||
@@ -98,7 +98,9 @@ class ExceptionMiddleware extends Middleware {
|
||||
'status' => 500,
|
||||
'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) {
|
||||
$response['exception'] = (array) $exception;
|
||||
}
|
||||
|
||||
@@ -238,7 +238,7 @@ class DeckProvider implements IFullTextSearchProvider {
|
||||
*
|
||||
* @param ISearchRequest $request
|
||||
*/
|
||||
public function improveSearchRequest(ISearchRequest $searchRequest) {
|
||||
public function improveSearchRequest(ISearchRequest $request) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -257,9 +257,9 @@ class CardService {
|
||||
* @param $title
|
||||
* @param $stackId
|
||||
* @param $type
|
||||
* @param $owner
|
||||
* @param $description
|
||||
* @param $order
|
||||
* @param $description
|
||||
* @param $owner
|
||||
* @param $duedate
|
||||
* @return \OCP\AppFramework\Db\Entity
|
||||
* @throws StatusException
|
||||
@@ -268,7 +268,7 @@ class CardService {
|
||||
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
|
||||
* @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) {
|
||||
throw new BadRequestException('card id must be a number');
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
|
||||
namespace OCA\Deck\Service;
|
||||
|
||||
use OC\Cache\CappedMemoryCache;
|
||||
use OCA\Deck\Db\Acl;
|
||||
use OCA\Deck\Db\AclMapper;
|
||||
use OCA\Deck\Db\Board;
|
||||
@@ -62,7 +61,6 @@ class PermissionService {
|
||||
private $users = [];
|
||||
|
||||
private $circlesEnabled = false;
|
||||
private $boardCache;
|
||||
|
||||
public function __construct(
|
||||
ILogger $logger,
|
||||
@@ -83,8 +81,6 @@ class PermissionService {
|
||||
$this->config = $config;
|
||||
$this->userId = $userId;
|
||||
|
||||
$this->boardCache = new CappedMemoryCache();
|
||||
|
||||
$this->circlesEnabled = \OC::$server->getAppManager()->isEnabledForUser('circles') &&
|
||||
(version_compare(\OC::$server->getAppManager()->getAppVersion('circles'), '0.17.1') >= 0);
|
||||
}
|
||||
@@ -153,13 +149,10 @@ class PermissionService {
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
$acls = $this->getBoard($boardId)->getAcl();
|
||||
$result = $this->userCan($acls, $permission, $userId);
|
||||
if ($result) {
|
||||
return true;
|
||||
}
|
||||
} catch (DoesNotExistException | MultipleObjectsReturnedException $e) {
|
||||
$acls = $this->aclMapper->findAll($boardId);
|
||||
$result = $this->userCan($acls, $permission, $userId);
|
||||
if ($result) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Throw NoPermission to not leak information about existing entries
|
||||
@@ -175,24 +168,13 @@ class PermissionService {
|
||||
$userId = $this->userId;
|
||||
}
|
||||
try {
|
||||
$board = $this->getBoard($boardId);
|
||||
return $userId === $board->getOwner();
|
||||
$board = $this->boardMapper->find($boardId);
|
||||
return $board && $userId === $board->getOwner();
|
||||
} catch (DoesNotExistException | MultipleObjectsReturnedException $e) {
|
||||
}
|
||||
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
|
||||
*
|
||||
@@ -286,11 +268,7 @@ class PermissionService {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($circle->getInheritedMembers() as $member) {
|
||||
if ($member->getUserType() !== 1) {
|
||||
// deck currently only supports user members in circles
|
||||
continue;
|
||||
}
|
||||
foreach ($circle->getMembers() as $member) {
|
||||
$user = $this->userManager->get($member->getUserId());
|
||||
if ($user === null) {
|
||||
$this->logger->info('No user found for circle member ' . $member->getUserId());
|
||||
|
||||
@@ -271,9 +271,9 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
||||
return $share;
|
||||
}
|
||||
|
||||
private function applyBoardPermission($share, $permissions, $userId) {
|
||||
private function applyBoardPermission($share, $permissions) {
|
||||
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) {
|
||||
$permissions &= Constants::PERMISSION_ALL - Constants::PERMISSION_UPDATE;
|
||||
$permissions &= Constants::PERMISSION_ALL - Constants::PERMISSION_CREATE;
|
||||
@@ -281,7 +281,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
||||
}
|
||||
|
||||
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) {
|
||||
$permissions &= Constants::PERMISSION_ALL - Constants::PERMISSION_SHARE;
|
||||
}
|
||||
@@ -646,7 +646,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
||||
$stmt = $query->execute();
|
||||
|
||||
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']);
|
||||
}
|
||||
|
||||
|
||||
39713
package-lock.json
generated
39713
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
59
package.json
59
package.json
@@ -29,7 +29,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/polyfill": "^7.12.1",
|
||||
"@babel/runtime": "^7.14.6",
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@juliushaertl/vue-richtext": "^1.0.1",
|
||||
"@nextcloud/auth": "^1.3.0",
|
||||
"@nextcloud/axios": "^1.6.0",
|
||||
@@ -40,10 +40,10 @@
|
||||
"@nextcloud/l10n": "^1.4.1",
|
||||
"@nextcloud/moment": "^1.1.1",
|
||||
"@nextcloud/router": "^2.0.0",
|
||||
"@nextcloud/vue": "^3.10.1",
|
||||
"@nextcloud/vue": "^3.9.0",
|
||||
"@nextcloud/vue-dashboard": "^2.0.1",
|
||||
"blueimp-md5": "^2.18.0",
|
||||
"dompurify": "^2.2.9",
|
||||
"dompurify": "^2.2.8",
|
||||
"lodash": "^4.17.21",
|
||||
"markdown-it": "^12.0.6",
|
||||
"markdown-it-task-lists": "^2.1.1",
|
||||
@@ -51,7 +51,7 @@
|
||||
"nextcloud-vue-collections": "^0.9.0",
|
||||
"p-queue": "^6.6.2",
|
||||
"url-search-params-polyfill": "^8.1.1",
|
||||
"vue": "^2.6.14",
|
||||
"vue": "^2.6.12",
|
||||
"vue-at": "^2.5.0-beta.2",
|
||||
"vue-click-outside": "^1.1.0",
|
||||
"vue-easymde": "^1.4.0",
|
||||
@@ -65,20 +65,57 @@
|
||||
"extends @nextcloud/browserslist-config"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
"node": ">=10.0.0"
|
||||
},
|
||||
"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/browserslist-config": "^2.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",
|
||||
"@relative-ci/agent": "^2.0.0",
|
||||
"@vue/test-utils": "^1.2.1",
|
||||
"jest": "^27.0.4",
|
||||
"@relative-ci/agent": "^1.6.1",
|
||||
"@vue/test-utils": "^1.2.0",
|
||||
"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",
|
||||
"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": {
|
||||
"moduleFileExtensions": [
|
||||
|
||||
@@ -168,7 +168,6 @@ export default {
|
||||
|
||||
},
|
||||
close() {
|
||||
this.$emit('close')
|
||||
this.$root.$emit('close')
|
||||
},
|
||||
async select() {
|
||||
|
||||
@@ -25,12 +25,6 @@
|
||||
<div v-if="overviewName" class="board-title">
|
||||
<div class="board-bullet icon-calendar-dark" />
|
||||
<h2>{{ overviewName }}</h2>
|
||||
<Actions>
|
||||
<ActionButton icon="icon-add" @click="clickShowAddCardModel">
|
||||
{{ t('deck', 'Add card') }}
|
||||
</ActionButton>
|
||||
</Actions>
|
||||
<CardCreateDialog v-if="showAddCardModal" @close="clickHideAddCardModel" />
|
||||
</div>
|
||||
<div v-else-if="board" class="board-title">
|
||||
<div :style="{backgroundColor: '#' + board.color}" class="board-bullet" />
|
||||
@@ -212,12 +206,11 @@
|
||||
import { mapState, mapGetters } from 'vuex'
|
||||
import { Actions, ActionButton, Popover, Avatar } from '@nextcloud/vue'
|
||||
import labelStyle from '../mixins/labelStyle'
|
||||
import CardCreateDialog from '../CardCreateDialog'
|
||||
|
||||
export default {
|
||||
name: 'Controls',
|
||||
components: {
|
||||
Actions, ActionButton, Popover, Avatar, CardCreateDialog,
|
||||
Actions, ActionButton, Popover, Avatar,
|
||||
},
|
||||
mixins: [labelStyle],
|
||||
props: {
|
||||
@@ -240,7 +233,6 @@ export default {
|
||||
showArchived: false,
|
||||
isAddStackVisible: false,
|
||||
filter: { tags: [], users: [], due: '', unassigned: false },
|
||||
showAddCardModal: false,
|
||||
}
|
||||
},
|
||||
|
||||
@@ -326,12 +318,6 @@ export default {
|
||||
this.$store.dispatch('setFilter', { ...filterReset })
|
||||
this.filter = filterReset
|
||||
},
|
||||
clickShowAddCardModel() {
|
||||
this.showAddCardModal = true
|
||||
},
|
||||
clickHideAddCardModel() {
|
||||
this.showAddCardModal = false
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
</div>
|
||||
<EmptyContent v-else-if="isEmpty" key="empty" icon="icon-deck">
|
||||
{{ t('deck', 'No lists available') }}
|
||||
<template v-if="canManage" #desc>
|
||||
<template #desc>
|
||||
{{ t('deck', 'Create a new list to add cards to this board') }}
|
||||
<form @submit.prevent="addNewStack()">
|
||||
<input id="new-stack-input-main"
|
||||
@@ -110,7 +110,6 @@ export default {
|
||||
}),
|
||||
...mapGetters([
|
||||
'canEdit',
|
||||
'canManage',
|
||||
]),
|
||||
stacksByBoard() {
|
||||
return this.$store.getters.stacksByBoard(this.board.id)
|
||||
|
||||
@@ -264,14 +264,12 @@ export default {
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@use 'sass:math';
|
||||
|
||||
@import './../../css/variables';
|
||||
|
||||
.stack {
|
||||
width: $stack-width + $stack-spacing*3;
|
||||
margin-left: math.div($stack-spacing, 2);
|
||||
margin-right: math.div($stack-spacing, 2);
|
||||
margin-left: $stack-spacing/2;
|
||||
margin-right: $stack-spacing/2;
|
||||
}
|
||||
|
||||
.stack__header {
|
||||
|
||||
@@ -227,7 +227,7 @@ export default {
|
||||
},
|
||||
showViewer(attachment) {
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -21,39 +21,32 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<DashboardWidget :items="cards"
|
||||
empty-content-icon="icon-deck"
|
||||
:empty-content-message="t('deck', 'No upcoming cards')"
|
||||
:show-more-text="t('deck', 'upcoming cards')"
|
||||
:loading="loading"
|
||||
@hide="() => {}"
|
||||
@markDone="() => {}">
|
||||
<template #default="{ item }">
|
||||
<a :key="item.id"
|
||||
:href="cardLink(item)"
|
||||
target="_blank"
|
||||
class="card">
|
||||
<div class="card--header">
|
||||
<DueDate class="right" :card="item" />
|
||||
<span class="title">{{ item.title }}</span>
|
||||
</div>
|
||||
<ul v-if="item.labels && item.labels.length"
|
||||
class="labels">
|
||||
<li v-for="label in item.labels" :key="label.id" :style="labelStyle(label)">
|
||||
<span>{{ label.title }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</a>
|
||||
</template>
|
||||
</DashboardWidget>
|
||||
<div class="center-button">
|
||||
<button @click="toggleAddCardModel">
|
||||
{{ t('deck', 'Add card') }}
|
||||
</button>
|
||||
<CardCreateDialog v-if="showAddCardModal" @close="toggleAddCardModel" />
|
||||
</div>
|
||||
</div>
|
||||
<DashboardWidget :items="cards"
|
||||
empty-content-icon="icon-deck"
|
||||
:empty-content-message="t('deck', 'No upcoming cards')"
|
||||
:show-more-text="t('deck', 'upcoming cards')"
|
||||
:show-more-url="showMoreUrl"
|
||||
:loading="loading"
|
||||
@hide="() => {}"
|
||||
@markDone="() => {}">
|
||||
<template #default="{ item }">
|
||||
<a :key="item.id"
|
||||
:href="cardLink(item)"
|
||||
target="_blank"
|
||||
class="card">
|
||||
<div class="card--header">
|
||||
<DueDate class="right" :card="item" />
|
||||
<span class="title">{{ item.title }}</span>
|
||||
</div>
|
||||
<ul v-if="item.labels && item.labels.length"
|
||||
class="labels">
|
||||
<li v-for="label in item.labels" :key="label.id" :style="labelStyle(label)">
|
||||
<span>{{ label.title }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</a>
|
||||
</template>
|
||||
</DashboardWidget>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@@ -62,20 +55,17 @@ import { mapGetters } from 'vuex'
|
||||
import labelStyle from './../mixins/labelStyle'
|
||||
import DueDate from '../components/cards/badges/DueDate'
|
||||
import { generateUrl } from '@nextcloud/router'
|
||||
import CardCreateDialog from '../CardCreateDialog'
|
||||
|
||||
export default {
|
||||
name: 'Dashboard',
|
||||
components: {
|
||||
DueDate,
|
||||
DashboardWidget,
|
||||
CardCreateDialog,
|
||||
},
|
||||
mixins: [labelStyle],
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
showAddCardModal: false,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -91,7 +81,7 @@ export default {
|
||||
list.sort((a, b) => {
|
||||
return (new Date(a.duedate)).getTime() - (new Date(b.duedate)).getTime()
|
||||
})
|
||||
return list.slice(0, 6)
|
||||
return list
|
||||
},
|
||||
cardLink() {
|
||||
return (card) => {
|
||||
@@ -108,21 +98,12 @@ export default {
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
toggleAddCardModel() {
|
||||
this.showAddCardModal = !this.showAddCardModal
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import './../css/labels';
|
||||
|
||||
.center-button {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#deck-widget-empty-content {
|
||||
text-align: center;
|
||||
margin-top: 5vh;
|
||||
|
||||
@@ -1,3 +1,32 @@
|
||||
const stylelintConfig = require('@nextcloud/stylelint-config')
|
||||
|
||||
module.exports = stylelintConfig
|
||||
module.exports = {
|
||||
extends: 'stylelint-config-recommended-scss',
|
||||
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']
|
||||
}
|
||||
|
||||
@@ -1,18 +1,29 @@
|
||||
{
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~6.5",
|
||||
"behat/behat": "~3.8.0",
|
||||
"guzzlehttp/guzzle": "6.5.2",
|
||||
"jarnaiz/behat-junit-formatter": "^1.3",
|
||||
"sabre/dav": "3.2.3",
|
||||
"symfony/event-dispatcher": "~4.4"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"": [
|
||||
"features/bootstrap/",
|
||||
"../../../../build/integration/features/bootstrap/"
|
||||
]
|
||||
}
|
||||
}
|
||||
"name": "nextcloud/deck-integration",
|
||||
"description": "Integration tests for the deck app",
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9",
|
||||
"behat/behat": "^3",
|
||||
"guzzlehttp/guzzle": "^7",
|
||||
"jarnaiz/behat-junit-formatter": "^1.3",
|
||||
"sabre/dav": "^4",
|
||||
"symfony/event-dispatcher": "~4.4",
|
||||
"juliushaertl/nextcloud-behat": "*"
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
"repositories": [
|
||||
{
|
||||
"type": "path",
|
||||
"url": "/home/jus/repos/nextcloud/nextcloud-behat"
|
||||
}
|
||||
],
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"": [
|
||||
"features/bootstrap/",
|
||||
"../../../../build/integration/features/bootstrap/"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
default:
|
||||
autoload:
|
||||
'': '%paths.base%/../features/bootstrap'
|
||||
suites:
|
||||
test:
|
||||
paths:
|
||||
- '%paths.base%/../features/'
|
||||
contexts:
|
||||
- ServerContext:
|
||||
baseUrl: http://localhost:8080/
|
||||
- RequestContext
|
||||
- \JuliusHaertl\NextcloudBehat\Context\ServerContext:
|
||||
servers:
|
||||
default: http://localhost:8080
|
||||
- \JuliusHaertl\NextcloudBehat\Context\SharingContext
|
||||
- \JuliusHaertl\NextcloudBehat\Context\FilesContext
|
||||
- BoardContext
|
||||
- CommentContext
|
||||
- SearchContext
|
||||
- PendingContext
|
||||
|
||||
@@ -8,83 +8,83 @@ Feature: acl
|
||||
And user "user2" exists
|
||||
Given group "group0" 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
|
||||
Given Logging in using web as "user0"
|
||||
Given Using web as user "user0"
|
||||
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"
|
||||
|
||||
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"
|
||||
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"
|
||||
|
||||
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"
|
||||
Given Logging in using web as "user0"
|
||||
Given Using web as user "user0"
|
||||
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"
|
||||
|
||||
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 shares the board with user "user1"
|
||||
| permissionEdit | 0 |
|
||||
| permissionShare | 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"
|
||||
| permissionEdit | 1 |
|
||||
| permissionShare | 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"
|
||||
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 "share" permissions on the board
|
||||
And the current user should have "manage" permissions on the board
|
||||
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 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"
|
||||
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
|
||||
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 "manage" permissions on the board
|
||||
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
|
||||
Given Logging in using web as "user0"
|
||||
Given Using web as user "user0"
|
||||
And creates a board named "Reshared board" with color "ff0000"
|
||||
And shares the board with user "user1"
|
||||
| permissionEdit | 0 |
|
||||
| permissionShare | 1 |
|
||||
| permissionManage | 0 |
|
||||
And the response should have a status code 200
|
||||
Given Logging in using web as "user1"
|
||||
And the HTTP status code should be 200
|
||||
Given Using web as user "user1"
|
||||
When fetches the board named "Shared board"
|
||||
And shares the board with user "user2"
|
||||
| permissionEdit | 1 |
|
||||
| permissionShare | 1 |
|
||||
| permissionManage | 1 |
|
||||
And the response should have a status code 200
|
||||
Given Logging in using web as "user2"
|
||||
And the HTTP status code should be 200
|
||||
Given Using web as user "user2"
|
||||
When fetches the board named "Shared board"
|
||||
Then the current user should have "read" permissions on the board
|
||||
And the current user should not have "edit" permissions on the board
|
||||
|
||||
@@ -3,12 +3,13 @@
|
||||
use Behat\Behat\Context\Context;
|
||||
use Behat\Behat\Hook\Scope\BeforeScenarioScope;
|
||||
use Behat\Gherkin\Node\TableNode;
|
||||
use JuliusHaertl\NextcloudBehat\Context\ServerContext;
|
||||
use JuliusHaertl\NextcloudBehat\Context\SharingContext;
|
||||
use PHPUnit\Framework\Assert;
|
||||
|
||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||
|
||||
class BoardContext implements Context {
|
||||
use RequestTrait;
|
||||
|
||||
/** @var array Last board response */
|
||||
private $board = null;
|
||||
@@ -19,12 +20,16 @@ class BoardContext implements Context {
|
||||
|
||||
/** @var ServerContext */
|
||||
private $serverContext;
|
||||
/** @var SharingContext */
|
||||
private $sharingContext;
|
||||
|
||||
/** @BeforeScenario */
|
||||
public function gatherContexts(BeforeScenarioScope $scope) {
|
||||
$environment = $scope->getEnvironment();
|
||||
|
||||
$this->serverContext = $environment->getContext('ServerContext');
|
||||
$this->serverContext = $environment->getContext(ServerContext::class);
|
||||
$this->sharingContext = $environment->getContext(SharingContext::class);
|
||||
|
||||
}
|
||||
|
||||
public function getLastUsedCard() {
|
||||
@@ -35,21 +40,21 @@ class BoardContext implements Context {
|
||||
* @Given /^creates a board named "([^"]*)" with 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,
|
||||
'color' => $color
|
||||
]);
|
||||
$this->getResponse()->getBody()->seek(0);
|
||||
$this->board = json_decode((string)$this->getResponse()->getBody(), true);
|
||||
$this->serverContext->getResponse()->getBody()->seek(0);
|
||||
$this->board = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @When /^fetches the board named "([^"]*)"$/
|
||||
*/
|
||||
public function fetchesTheBoardNamed($boardName) {
|
||||
$this->requestContext->sendJSONrequest('GET', '/index.php/apps/deck/boards/' . $this->board['id'], []);
|
||||
$this->getResponse()->getBody()->seek(0);
|
||||
$this->board = json_decode((string)$this->getResponse()->getBody(), true);
|
||||
$this->serverContext->sendJSONrequest('GET', '/index.php/apps/deck/boards/' . $this->board['id'], []);
|
||||
$this->serverContext->getResponse()->getBody()->seek(0);
|
||||
$this->board = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -63,7 +68,7 @@ class BoardContext implements Context {
|
||||
];
|
||||
$tableRows = isset($permissions) ? $permissions->getRowsHash() : [];
|
||||
$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,
|
||||
'participant' => $user,
|
||||
'permissionEdit' => $result['permissionEdit'] === '1',
|
||||
@@ -83,7 +88,7 @@ class BoardContext implements Context {
|
||||
];
|
||||
$tableRows = isset($permissions) ? $permissions->getRowsHash() : [];
|
||||
$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,
|
||||
'participant' => $group,
|
||||
'permissionEdit' => $result['permissionEdit'] === '1',
|
||||
@@ -97,38 +102,38 @@ class BoardContext implements Context {
|
||||
* @When /^fetching the board list$/
|
||||
*/
|
||||
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 "([^"]*)"$/
|
||||
*/
|
||||
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 "([^"]*)"$/
|
||||
*/
|
||||
public function createAStackNamed($name) {
|
||||
$this->requestContext->sendJSONrequest('POST', '/index.php/apps/deck/stacks', [
|
||||
$this->serverContext->sendJSONrequest('POST', '/index.php/apps/deck/stacks', [
|
||||
'title' => $name,
|
||||
'boardId' => $this->board['id']
|
||||
]);
|
||||
$this->requestContext->getResponse()->getBody()->seek(0);
|
||||
$this->stack = json_decode((string)$this->getResponse()->getBody(), true);
|
||||
$this->serverContext->getResponse()->getBody()->seek(0);
|
||||
$this->stack = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Given /^create a card named "([^"]*)"$/
|
||||
*/
|
||||
public function createACardNamed($name) {
|
||||
$this->requestContext->sendJSONrequest('POST', '/index.php/apps/deck/cards', [
|
||||
$this->serverContext->sendJSONrequest('POST', '/index.php/apps/deck/cards', [
|
||||
'title' => $name,
|
||||
'stackId' => $this->stack['id']
|
||||
]);
|
||||
$this->requestContext->getResponse()->getBody()->seek(0);
|
||||
$this->card = json_decode((string)$this->getResponse()->getBody(), true);
|
||||
$this->serverContext->getResponse()->getBody()->seek(0);
|
||||
$this->card = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -164,31 +169,31 @@ class BoardContext implements Context {
|
||||
['shareType', 12],
|
||||
['shareWith', (string)$this->card['id']],
|
||||
]);
|
||||
$this->serverContext->creatingShare($table);
|
||||
$this->sharingContext->createAShareWith($table);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Given /^set the description to "([^"]*)"$/
|
||||
*/
|
||||
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,
|
||||
['description' => $description]
|
||||
));
|
||||
$this->requestContext->getResponse()->getBody()->seek(0);
|
||||
$this->card = json_decode((string)$this->getResponse()->getBody(), true);
|
||||
$this->serverContext->getResponse()->getBody()->seek(0);
|
||||
$this->card = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Given /^set the card attribute "([^"]*)" to "([^"]*)"$/
|
||||
*/
|
||||
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,
|
||||
[$attribute => $value]
|
||||
));
|
||||
$this->requestContext->getResponse()->getBody()->seek(0);
|
||||
$this->card = json_decode((string)$this->getResponse()->getBody(), true);
|
||||
$this->serverContext->getResponse()->getBody()->seek(0);
|
||||
$this->card = json_decode((string)$this->serverContext->getResponse()->getBody(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -214,11 +219,11 @@ class BoardContext implements Context {
|
||||
}
|
||||
|
||||
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,
|
||||
'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;
|
||||
});
|
||||
$label = array_shift($filteredLabels);
|
||||
$this->requestContext->sendJSONrequest('POST', '/index.php/apps/deck/cards/' . $this->card['id'] .'/label/' . $label['id']);
|
||||
$this->requestContext->getResponse()->getBody()->seek(0);
|
||||
$this->serverContext->sendJSONrequest('POST', '/index.php/apps/deck/cards/' . $this->card['id'] .'/label/' . $label['id']);
|
||||
$this->serverContext->getResponse()->getBody()->seek(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,12 +2,14 @@
|
||||
|
||||
use Behat\Behat\Context\Context;
|
||||
use Behat\Behat\Hook\Scope\BeforeScenarioScope;
|
||||
use JuliusHaertl\NextcloudBehat\Context\ServerContext;
|
||||
|
||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||
|
||||
class CommentContext implements Context {
|
||||
use RequestTrait;
|
||||
|
||||
/** @var ServerContext */
|
||||
protected $serverContext;
|
||||
/** @var BoardContext */
|
||||
protected $boardContext;
|
||||
|
||||
@@ -15,6 +17,7 @@ class CommentContext implements Context {
|
||||
public function gatherContexts(BeforeScenarioScope $scope) {
|
||||
$environment = $scope->getEnvironment();
|
||||
|
||||
$this->serverContext = $environment->getContext(ServerContext::class);
|
||||
$this->boardContext = $environment->getContext('BoardContext');
|
||||
}
|
||||
|
||||
@@ -23,7 +26,7 @@ class CommentContext implements Context {
|
||||
*/
|
||||
public function postACommentWithContentOnTheCard($content) {
|
||||
$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,
|
||||
'parentId' => null
|
||||
]);
|
||||
|
||||
@@ -21,26 +21,21 @@
|
||||
*
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
|
||||
use Behat\Behat\Hook\Scope\BeforeScenarioScope;
|
||||
use Behat\Behat\Context\Context;
|
||||
|
||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||
|
||||
class PendingContext implements Context {
|
||||
|
||||
trait RequestTrait {
|
||||
|
||||
/** @var RequestContext */
|
||||
protected $requestContext;
|
||||
/** @var \JuliusHaertl\NextcloudBehat\Context\ServerContext */
|
||||
private $serverContext;
|
||||
|
||||
/** @BeforeScenario */
|
||||
public function gatherRequestTraitContext(BeforeScenarioScope $scope) {
|
||||
public function gatherContexts(BeforeScenarioScope $scope) {
|
||||
$environment = $scope->getEnvironment();
|
||||
$this->requestContext = $environment->getContext('RequestContext');
|
||||
|
||||
$this->serverContext = $environment->getContext(\JuliusHaertl\NextcloudBehat\Context\ServerContext::class);
|
||||
}
|
||||
|
||||
public function getResponse() {
|
||||
return $this->requestContext->getResponse();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -3,12 +3,14 @@
|
||||
use Behat\Behat\Context\Context;
|
||||
use Behat\Behat\Hook\Scope\BeforeScenarioScope;
|
||||
use PHPUnit\Framework\Assert;
|
||||
use JuliusHaertl\NextcloudBehat\Context\ServerContext;
|
||||
|
||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||
|
||||
class SearchContext implements Context {
|
||||
use RequestTrait;
|
||||
|
||||
/** @var ServerContext */
|
||||
protected $serverContext;
|
||||
/** @var BoardContext */
|
||||
protected $boardContext;
|
||||
|
||||
@@ -19,6 +21,7 @@ class SearchContext implements Context {
|
||||
public function gatherContexts(BeforeScenarioScope $scope) {
|
||||
$environment = $scope->getEnvironment();
|
||||
|
||||
$this->serverContext = $environment->getContext(ServerContext::class);
|
||||
$this->boardContext = $environment->getContext('BoardContext');
|
||||
}
|
||||
|
||||
@@ -27,10 +30,10 @@ class SearchContext implements Context {
|
||||
* @param string $term
|
||||
*/
|
||||
public function searchingFor(string $term) {
|
||||
$this->requestContext->sendOCSRequest('GET', '/apps/deck/api/v1.0/search?term=' . urlencode($term), []);
|
||||
$this->requestContext->getResponse()->getBody()->seek(0);
|
||||
$data = (string)$this->getResponse()->getBody();
|
||||
$this->searchResults = json_decode($data, true);
|
||||
$this->serverContext->sendOCSRequest('GET', '/apps/deck/api/v1.0/search?term=' . urlencode($term), []);
|
||||
$this->serverContext->getResponse()->getBody()->seek(0);
|
||||
$data = (string)$this->serverContext->getResponse()->getBody();
|
||||
$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
|
||||
*/
|
||||
public function searchingForComments(string $term) {
|
||||
$this->requestContext->sendOCSRequest('GET', '/search/providers/deck-comment/search?term=' . urlencode($term), []);
|
||||
$this->requestContext->getResponse()->getBody()->seek(0);
|
||||
$data = (string)$this->getResponse()->getBody();
|
||||
$this->serverContext->sendOCSRequest('GET', '/search/providers/deck-comment/search?term=' . urlencode($term), []);
|
||||
$this->serverContext->getResponse()->getBody()->seek(0);
|
||||
$data = (string)$this->serverContext->getResponse()->getBody();
|
||||
$this->unifiedSearchResult = json_decode($data, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -5,10 +5,10 @@ Feature: decks
|
||||
Given user "user0" exists
|
||||
|
||||
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"
|
||||
Then the response should have a status code "200"
|
||||
And the response Content-Type should be "application/json; charset=utf-8"
|
||||
Then the HTTP status code should be "200"
|
||||
And the Content-Type should be "application/json; charset=utf-8"
|
||||
And the response should be a JSON array with the following mandatory values
|
||||
|key|value|
|
||||
|title|MyBoard|
|
||||
|
||||
@@ -3,7 +3,7 @@ Feature: Searching for cards
|
||||
Background:
|
||||
Given user "admin" 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 create a stack named "ToDo"
|
||||
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
|
||||
|
||||
Scenario: Search on shared boards
|
||||
Given Logging in using web as "user0"
|
||||
Given Using web as user "user0"
|
||||
When searching for "task"
|
||||
Then the card "Example task 1" is found
|
||||
Then the card "Example task 2" is found
|
||||
|
||||
@@ -19,12 +19,11 @@ Feature: File sharing
|
||||
And shares the board with user "user1"
|
||||
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"
|
||||
Then the HTTP status code should be "201"
|
||||
Given acting as user "user0"
|
||||
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 as "user1" the file "/Deck/user0-file.txt" exists
|
||||
@@ -40,12 +39,11 @@ Feature: File sharing
|
||||
| permissionManage | 1 |
|
||||
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"
|
||||
Then the HTTP status code should be "201"
|
||||
Given acting as user "user1"
|
||||
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 as "user0" the file "/Deck/user1-file.txt" exists
|
||||
@@ -59,13 +57,11 @@ Feature: File sharing
|
||||
And shares the board with user "user1"
|
||||
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"
|
||||
Then the HTTP status code should be "201"
|
||||
Given acting as user "user1"
|
||||
And share the file "/user1-file.txt" with the card
|
||||
When share the file "/user1-file.txt" with the card
|
||||
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
|
||||
|
||||
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"
|
||||
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"
|
||||
Then the HTTP status code should be "201"
|
||||
Given acting as user "user0"
|
||||
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 as "user2" the file "/Deck/user0-file2.txt" exists
|
||||
@@ -95,12 +90,11 @@ Feature: File sharing
|
||||
And shares the board with group "group1"
|
||||
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"
|
||||
Then the HTTP status code should be "201"
|
||||
Given acting as user "user0"
|
||||
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 as "user2" the file "/Deck/user0-file2.txt" exists
|
||||
@@ -119,12 +113,11 @@ Feature: File sharing
|
||||
And shares the board with group "group1"
|
||||
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"
|
||||
Then the HTTP status code should be "201"
|
||||
Given acting as user "user0"
|
||||
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 as "user2" the file "/Deck/user0-file2.txt" exists
|
||||
|
||||
@@ -5,11 +5,6 @@ OCC=${OC_PATH}occ
|
||||
SCENARIO_TO_RUN=$1
|
||||
HIDE_OC_LOGS=$2
|
||||
|
||||
# Nextcloud integration tests composer
|
||||
(
|
||||
cd ${OC_PATH}build/integration
|
||||
composer install
|
||||
)
|
||||
INSTALLED=$($OCC status | grep installed: | cut -d " " -f 5)
|
||||
|
||||
if [ "$INSTALLED" == "true" ]; then
|
||||
@@ -24,11 +19,11 @@ composer dump-autoload
|
||||
|
||||
# avoid port collision on jenkins - use $EXECUTOR_NUMBER
|
||||
if [ -z "$EXECUTOR_NUMBER" ]; then
|
||||
EXECUTOR_NUMBER=0
|
||||
EXECUTOR_NUMBER=1
|
||||
fi
|
||||
PORT=$((8080 + $EXECUTOR_NUMBER))
|
||||
echo $PORT
|
||||
php -S localhost:$PORT -t $OC_PATH &
|
||||
PHP_CLI_SERVER_WORKERS=10 php -S localhost:$PORT -t $OC_PATH &
|
||||
PHPPID=$!
|
||||
echo $PHPPID
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?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">
|
||||
<TypeDoesNotContainType occurrences="1">
|
||||
<code>$message !== null</code>
|
||||
@@ -197,6 +197,9 @@
|
||||
</TooManyArguments>
|
||||
</file>
|
||||
<file src="lib/Service/CardService.php">
|
||||
<TooFewArguments occurrences="1">
|
||||
<code>findAssignedCards</code>
|
||||
</TooFewArguments>
|
||||
<UndefinedDocblockClass occurrences="1">
|
||||
<code>\OCP\AppFramework\Db\</code>
|
||||
</UndefinedDocblockClass>
|
||||
@@ -274,9 +277,6 @@
|
||||
<InvalidReturnType occurrences="1">
|
||||
<code>getSharesInFolder</code>
|
||||
</InvalidReturnType>
|
||||
<InvalidThrow occurrences="1">
|
||||
<code>throw new GenericShareException('Already shared', $this->l->t('Path is already shared with this card'), 403);</code>
|
||||
</InvalidThrow>
|
||||
<MissingDependency occurrences="8">
|
||||
<code>GenericShareException</code>
|
||||
<code>GenericShareException</code>
|
||||
|
||||
@@ -196,7 +196,7 @@ class CardServiceTest extends TestCase {
|
||||
$this->cardMapper->expects($this->once())->method('update')->willReturnCallback(function ($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(234, $actual->getStackId());
|
||||
$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->never())->method('update');
|
||||
$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() {
|
||||
|
||||
@@ -146,7 +146,7 @@ class PermissionServiceTest extends \Test\TestCase {
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
@@ -225,9 +225,12 @@ class PermissionServiceTest extends \Test\TestCase {
|
||||
$board = new Board();
|
||||
$board->setId($boardId);
|
||||
$board->setOwner($owner);
|
||||
$board->setAcl($this->getAcls($boardId));
|
||||
$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())
|
||||
->method('sharingDisabledForUser')
|
||||
->willReturn(false);
|
||||
@@ -247,12 +250,14 @@ class PermissionServiceTest extends \Test\TestCase {
|
||||
$board = new Board();
|
||||
$board->setId($boardId);
|
||||
$board->setOwner($owner);
|
||||
$board->setAcl($this->getAcls($boardId));
|
||||
if ($boardId === null) {
|
||||
$this->boardMapper->expects($this->any())->method('find')->willThrowException(new DoesNotExistException('not found'));
|
||||
} else {
|
||||
$this->boardMapper->expects($this->any())->method('find')->willReturn($board);
|
||||
}
|
||||
$acls = $this->getAcls($boardId);
|
||||
$this->aclMapper->expects($this->any())->method('findAll')->willReturn($acls);
|
||||
|
||||
|
||||
if ($result) {
|
||||
$actual = $this->service->checkPermission($mapper, 1234, $permission);
|
||||
|
||||
@@ -75,7 +75,7 @@ class CardControllerTest extends TestCase {
|
||||
public function testUpdate() {
|
||||
$this->cardService->expects($this->once())
|
||||
->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);
|
||||
$this->assertEquals(1, $this->controller->update(1, 'title', 3, 'text', 5, 'foo', '2017-01-01 00:00:00', null));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user