Compare commits

..

1 Commits

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

View File

@@ -9,7 +9,7 @@ jobs:
strategy:
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:

View File

@@ -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 }}

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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 }}

View File

@@ -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

View File

@@ -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

View File

@@ -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>

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -102,7 +102,7 @@ OC.L10N.register(
"No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s",
"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",

View File

@@ -100,7 +100,7 @@
"No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s",
"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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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" : "期限を削除",

View File

@@ -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" : "期限を削除",

View File

@@ -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",

View File

@@ -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",

View File

@@ -63,9 +63,9 @@ OC.L10N.register(
"{user} has restored the attachment {attachment} to card {card}" : "{user} har återställt bilagan {attachment} till kortet {card}",
"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);");

View File

@@ -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);"
}

View File

@@ -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)",

View File

@@ -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)",

View File

@@ -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);
}

View File

@@ -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);
}
/**

View File

@@ -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) {
}

View File

@@ -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);
}
/**

View File

@@ -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));
}
/**

View File

@@ -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;
}

View File

@@ -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
];

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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;
}

View File

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

View File

@@ -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');
}

View File

@@ -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());

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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": [

View File

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

View File

@@ -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>

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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;

View File

@@ -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']
}

View File

@@ -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/"
]
}
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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
]);

View File

@@ -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();
}
}

View File

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

View File

@@ -3,12 +3,14 @@
use Behat\Behat\Context\Context;
use Behat\Behat\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);
}

View File

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

View File

@@ -5,10 +5,10 @@ Feature: decks
Given user "user0" exists
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|

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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-&gt;l-&gt;t('Path is already shared with this card'), 403);</code>
</InvalidThrow>
<MissingDependency occurrences="8">
<code>GenericShareException</code>
<code>GenericShareException</code>

View File

@@ -196,7 +196,7 @@ class CardServiceTest extends TestCase {
$this->cardMapper->expects($this->once())->method('update')->willReturnCallback(function ($c) {
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() {

View File

@@ -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);

View File

@@ -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));
}