Compare commits
102 Commits
enh/dateSh
...
v1.1.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
124cc94939 | ||
|
|
d45f2e9faa | ||
|
|
2ea019885d | ||
|
|
ccbe2eaf94 | ||
|
|
568b099c17 | ||
|
|
a5bd24f475 | ||
|
|
89bec2752b | ||
|
|
2a1fa11b0d | ||
|
|
ba5570558e | ||
|
|
df0531851e | ||
|
|
bbc218de95 | ||
|
|
9b6d62d24c | ||
|
|
d2ceda08cb | ||
|
|
af01ecd3d1 | ||
|
|
7afe28f2e9 | ||
|
|
56a79c9fcc | ||
|
|
6fa485c6ca | ||
|
|
66e386b547 | ||
|
|
48e6bae44a | ||
|
|
c75463429e | ||
|
|
3d3f2de781 | ||
|
|
2454df9a35 | ||
|
|
2a7a0e4c6d | ||
|
|
6edf265b78 | ||
|
|
8e28f8e67c | ||
|
|
3b11c5c7ea | ||
|
|
be05ec1b45 | ||
|
|
b407f102fe | ||
|
|
e82a2be836 | ||
|
|
d7f7cf584f | ||
|
|
3fae174906 | ||
|
|
b58bba25bb | ||
|
|
407acc47a4 | ||
|
|
2ba19bd6fe | ||
|
|
16e79dc616 | ||
|
|
f48187f28c | ||
|
|
ea5aac3d27 | ||
|
|
3487e06c8c | ||
|
|
fd253009f1 | ||
|
|
039d3e8238 | ||
|
|
31d759ee62 | ||
|
|
53a30585f3 | ||
|
|
a2ebf3d3f0 | ||
|
|
5b7505c60c | ||
|
|
516b15d3a1 | ||
|
|
6ac8cafd46 | ||
|
|
e5c65a67a7 | ||
|
|
7b72c93076 | ||
|
|
f5550c456e | ||
|
|
fb8b724e1b | ||
|
|
a3da157aa4 | ||
|
|
0118c1e409 | ||
|
|
9dbf45ca25 | ||
|
|
184cb01f5a | ||
|
|
b3a4cca482 | ||
|
|
1272c672ae | ||
|
|
214898c3d6 | ||
|
|
7ba20e71ee | ||
|
|
49f84c31fb | ||
|
|
69f56981f4 | ||
|
|
7acd1a054e | ||
|
|
ef90ab0b2a | ||
|
|
1a275b0884 | ||
|
|
ffb25a7553 | ||
|
|
9a0476f538 | ||
|
|
9b9413c5e1 | ||
|
|
e22c6e675b | ||
|
|
92a6cbce37 | ||
|
|
871edf1a25 | ||
|
|
05376a5d3a | ||
|
|
5cc52526cf | ||
|
|
30bb429a57 | ||
|
|
52cbd3d6d8 | ||
|
|
15ae74249b | ||
|
|
aa069805c5 | ||
|
|
e5338bf6d2 | ||
|
|
65a3033403 | ||
|
|
8eb5adfac8 | ||
|
|
c4672f04d2 | ||
|
|
54536eff93 | ||
|
|
62f6cfecc2 | ||
|
|
d7d5365a67 | ||
|
|
8380ae69c8 | ||
|
|
6a409c508e | ||
|
|
31e42079d0 | ||
|
|
4c2346c66e | ||
|
|
79b950e192 | ||
|
|
012e5b8ef9 | ||
|
|
3914127b39 | ||
|
|
be7357d110 | ||
|
|
d61a08baf5 | ||
|
|
f7209fbe5b | ||
|
|
11b37489f5 | ||
|
|
bef6c2801f | ||
|
|
63442be9e1 | ||
|
|
987ce07f83 | ||
|
|
35f9fbc0f5 | ||
|
|
28bf1ceb02 | ||
|
|
623cd540e7 | ||
|
|
31c82bd5cb | ||
|
|
f6a9db6058 | ||
|
|
d22503b02f |
14
.drone.yml
14
.drone.yml
@@ -5,7 +5,7 @@ steps:
|
||||
image: nextcloudci/php7.3:latest
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: master
|
||||
CORE_BRANCH: stable20
|
||||
DB: sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
@@ -20,7 +20,7 @@ steps:
|
||||
image: nextcloudci/php7.2:latest
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: master
|
||||
CORE_BRANCH: stable20
|
||||
DB: sqlite
|
||||
commands:
|
||||
- composer install
|
||||
@@ -29,7 +29,7 @@ steps:
|
||||
image: nextcloudci/php7.3:php7.3-2
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: master
|
||||
CORE_BRANCH: stable20
|
||||
DB: sqlite
|
||||
commands:
|
||||
- composer install
|
||||
@@ -38,7 +38,7 @@ steps:
|
||||
image: nextcloudci/php7.4:latest
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: master
|
||||
CORE_BRANCH: stable20
|
||||
DB: sqlite
|
||||
commands:
|
||||
- composer install
|
||||
@@ -58,7 +58,7 @@ steps:
|
||||
image: nextcloudci/php7.3:latest
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: master
|
||||
CORE_BRANCH: stable20
|
||||
DB: sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
@@ -84,7 +84,7 @@ steps:
|
||||
image: nextcloudci/php7.4:latest
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: master
|
||||
CORE_BRANCH: stable20
|
||||
DB: sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
@@ -111,7 +111,7 @@ steps:
|
||||
image: nextcloudci/php7.3:latest
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: master
|
||||
CORE_BRANCH: stable20
|
||||
DB: sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
|
||||
11
.travis.yml
11
.travis.yml
@@ -2,9 +2,13 @@ language: php
|
||||
services:
|
||||
- mysql
|
||||
php:
|
||||
- 7.2
|
||||
- 7.3
|
||||
- 7.4
|
||||
env:
|
||||
- CORE_BRANCH=master DB=mysql
|
||||
- CORE_BRANCH=stable20 DB=mysql
|
||||
- CORE_BRANCH=stable19 DB=mysql
|
||||
- CORE_BRANCH=stable18 DB=mysql
|
||||
|
||||
matrix:
|
||||
include:
|
||||
@@ -17,10 +21,13 @@ before_install:
|
||||
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
|
||||
- bash ./before_install.sh deck $CORE_BRANCH $DB
|
||||
- cd ../server
|
||||
- ./occ app:enable deck
|
||||
|
||||
before_script:
|
||||
- cd apps/deck
|
||||
- composer install --no-dev
|
||||
- cd ../../
|
||||
- ./occ app:enable deck
|
||||
- cd apps/deck
|
||||
|
||||
script:
|
||||
- composer install
|
||||
|
||||
66
CHANGELOG.md
66
CHANGELOG.md
@@ -1,31 +1,67 @@
|
||||
# Changelog
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## 1.1.0 - unreleased
|
||||
## 1.1.2 - 2020-10-14
|
||||
|
||||
### Merged PRs
|
||||
### Bugfixes
|
||||
|
||||
* [#2436](https://github.com/nextcloud/deck/pull/2436) Move most destructive actions in drop down menus to the bottom
|
||||
* [#2438](https://github.com/nextcloud/deck/pull/2438) Fix scrollable titles with Dyslexia font
|
||||
* [#2439](https://github.com/nextcloud/deck/pull/2439) Only remove card padding for editable cards
|
||||
* [#2442](https://github.com/nextcloud/deck/pull/2442) Move navigation toggle handling to @nextcloud/vue native one
|
||||
* [#2443](https://github.com/nextcloud/deck/pull/2443) Do not open the dialog automatically upon card creation, only upon click
|
||||
|
||||
## 1.1.1 - 2020-10-13
|
||||
|
||||
### Bugfixes
|
||||
|
||||
* [#2364](https://github.com/nextcloud/deck/pull/2364) Use uid instead of displayname for sharee results
|
||||
* [#2365](https://github.com/nextcloud/deck/pull/2365) Comments do not depend on the comments app (@jakobroehrl)
|
||||
* [#2395](https://github.com/nextcloud/deck/pull/2395) Fix failure if full text search app was enabled
|
||||
* [#2396](https://github.com/nextcloud/deck/pull/2396) Also exclude deleted items from calendar boards
|
||||
* [#2425](https://github.com/nextcloud/deck/pull/2425) Fix filter popover styling (@Flamenco)
|
||||
* [#2432](https://github.com/nextcloud/deck/pull/2432) Properly handle multiple shares in a row and refactor sharee loading
|
||||
|
||||
## 1.1.0 - 2020-10-03
|
||||
|
||||
### Features
|
||||
|
||||
* [#2115](https://github.com/nextcloud/deck/pull/2115) Dashboard widget for Nextcloud 20
|
||||
* [#1545](https://github.com/nextcloud/deck/pull/1545) Show cards in calendar/tasks app and make them available though CalDAV
|
||||
* [#2200](https://github.com/nextcloud/deck/pull/2200) Unified search implementation for Nextcloud 20
|
||||
* [#1934](https://github.com/nextcloud/deck/pull/1934) Upcoming cards overview @jakobroehrl
|
||||
* [#2047](https://github.com/nextcloud/deck/pull/2047) Show card details in modal @jakobroehrl
|
||||
* [#1853](https://github.com/nextcloud/deck/pull/1853) Archive all cards from stack @jakobroehrl
|
||||
* [#1865](https://github.com/nextcloud/deck/pull/1865) Add stack button on empty board @jakobroehrl
|
||||
* [#1926](https://github.com/nextcloud/deck/pull/1926) New filter: unassigned cards @jakobroehrl
|
||||
* [#1934](https://github.com/nextcloud/deck/pull/1934) Card dashboard @jakobroehrl
|
||||
|
||||
### Bugfixes
|
||||
|
||||
* [#2035](https://github.com/nextcloud/deck/pull/2035) Attach files in description @jakobroehrl
|
||||
* [#2047](https://github.com/nextcloud/deck/pull/2047) Show card details in modal @jakobroehrl
|
||||
* [#2115](https://github.com/nextcloud/deck/pull/2115) Dashboard panel @juliushaertl
|
||||
* [#2123](https://github.com/nextcloud/deck/pull/2123) Fix control tooltip @jakobroehrl
|
||||
* [#2144](https://github.com/nextcloud/deck/pull/2144) Fix nextcloud if install with dev dependencies @matchish
|
||||
* [#2157](https://github.com/nextcloud/deck/pull/2157) Build/webpack shared config @juliushaertl
|
||||
* [#2158](https://github.com/nextcloud/deck/pull/2158) Fix description in dark mode @juliushaertl
|
||||
* [#2169](https://github.com/nextcloud/deck/pull/2169) Bump webpack-merge from 5.0.9 to 5.1.0 @dependabot
|
||||
* [#2170](https://github.com/nextcloud/deck/pull/2170) Add lastModified date to boards API documentation @stefan-niedermann
|
||||
* [#2158](https://github.com/nextcloud/deck/pull/2158) Fix description in dark mode
|
||||
* [#2188](https://github.com/nextcloud/deck/pull/2188) CardBadges: Count checkboxes started with "+ [ ]" @joreiff
|
||||
* [#2200](https://github.com/nextcloud/deck/pull/2200) Unified search implementation @juliushaertl
|
||||
* [#2206](https://github.com/nextcloud/deck/pull/2206) Fix read-only sidebar (fixes #2033) @juliushaertl
|
||||
* [#2208](https://github.com/nextcloud/deck/pull/2208) Fix design, dark mode and keyboard navigation of the board list @juliushaertl
|
||||
* [#2206](https://github.com/nextcloud/deck/pull/2206) Fix read-only sidebar (fixes #2033)
|
||||
* [#2208](https://github.com/nextcloud/deck/pull/2208) Fix design, dark mode and keyboard navigation of the board list
|
||||
* [#2210](https://github.com/nextcloud/deck/pull/2210) Fix an incorrect/misleading message in lib/Service/BoardService.php @jordanbancino
|
||||
* [#2211](https://github.com/nextcloud/deck/pull/2211) Update incorrect field in API documentation (docs/API.md) @jordanbancino
|
||||
* [#2243](https://github.com/nextcloud/deck/pull/2243) Various smaller styling fixes @juliushaertl
|
||||
* [#2244](https://github.com/nextcloud/deck/pull/2244) Toggle filter on clicking card labels @juliushaertl
|
||||
* [#2243](https://github.com/nextcloud/deck/pull/2243) Various smaller styling fixes
|
||||
* [#2244](https://github.com/nextcloud/deck/pull/2244) Toggle filter on clicking card labels
|
||||
* [#2117](https://github.com/nextcloud/deck/pull/2117) Activity fixes
|
||||
* [#2255](https://github.com/nextcloud/deck/pull/2255) Use unified search events to apply on board filtering
|
||||
* [#2271](https://github.com/nextcloud/deck/pull/2271) Sort tags in filter @jakobroehrl
|
||||
* [#2318](https://github.com/nextcloud/deck/pull/2318) Card title: prevent space and no text @jakobroehrl
|
||||
* [#2319](https://github.com/nextcloud/deck/pull/2319) Move style loading to BeforeTemplateRenderedEvent
|
||||
* [#2320](https://github.com/nextcloud/deck/pull/2320) Consistent naming @jakobroehrl
|
||||
* [#2252](https://github.com/nextcloud/deck/pull/2252) Fix double slash in the deck activity links @baraksoa
|
||||
* [#2270](https://github.com/nextcloud/deck/pull/2270) Fix empty content view to align with other widgets
|
||||
* [#2275](https://github.com/nextcloud/deck/pull/2275) Wait for services to be registered before performing further setup that requires services
|
||||
* [#2278](https://github.com/nextcloud/deck/pull/2278) Fix wrong SQL queries @Chartman123
|
||||
* [#2279](https://github.com/nextcloud/deck/pull/2279) L10n:add translation to card placeholder @mjanssens
|
||||
* [#2282](https://github.com/nextcloud/deck/pull/2282) Duedate picker localization
|
||||
* [#2283](https://github.com/nextcloud/deck/pull/2283) Do not handle exceptions from page controller in the ExceptionMiddleware
|
||||
* [#2298](https://github.com/nextcloud/deck/pull/2298) Use absolute URLs for the search @nickvergessen
|
||||
|
||||
|
||||
|
||||
## 1.0.5 - 2020-07-15
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
- 🚀 Get your project organized
|
||||
|
||||
</description>
|
||||
<version>1.1.0-beta2</version>
|
||||
<version>1.1.2</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Julius Härtl</author>
|
||||
<namespace>Deck</namespace>
|
||||
@@ -36,7 +36,7 @@
|
||||
<database min-version="9.4">pgsql</database>
|
||||
<database>sqlite</database>
|
||||
<database min-version="5.5">mysql</database>
|
||||
<nextcloud min-version="18" max-version="21" />
|
||||
<nextcloud min-version="18" max-version="20" />
|
||||
</dependencies>
|
||||
<background-jobs>
|
||||
<job>OCA\Deck\Cron\DeleteCron</job>
|
||||
|
||||
@@ -191,6 +191,7 @@ OC.L10N.register(
|
||||
"Select Date" : "Vybrat datum",
|
||||
"Modified" : "Změněno",
|
||||
"Created" : "Vytvořeno",
|
||||
"The title cannot be empty." : "Nadpis je třeba vyplnit.",
|
||||
"No comments yet. Begin the discussion!" : "Zatím bez komentářů. Zahajte diskuzi!",
|
||||
"Save" : "Uložit",
|
||||
"The comment cannot be empty." : "Komentář je třeba vyplnit",
|
||||
@@ -216,6 +217,7 @@ OC.L10N.register(
|
||||
"Show boards in calendar/tasks" : "Zobrazit tabule v kalendáři/úkolech",
|
||||
"Limit deck usage of groups" : "Omezit využití deck na skupiny",
|
||||
"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." : "Omezení nastavené pro Deck brání uživatelům, kteří nejsou součástí těchto skupin, ve vytváření vlastních tabulí. Nicméně i tak ale pořád budou moci pracovat na tabulích, které jsou jim nasdíleny.",
|
||||
"Board name" : "Název tabule",
|
||||
"Edit board" : "Upravit tabuli",
|
||||
"Clone board " : "Klonovat tabuli ",
|
||||
"Unarchive board " : "Vrátit tabuli zpět z archivu ",
|
||||
|
||||
@@ -189,6 +189,7 @@
|
||||
"Select Date" : "Vybrat datum",
|
||||
"Modified" : "Změněno",
|
||||
"Created" : "Vytvořeno",
|
||||
"The title cannot be empty." : "Nadpis je třeba vyplnit.",
|
||||
"No comments yet. Begin the discussion!" : "Zatím bez komentářů. Zahajte diskuzi!",
|
||||
"Save" : "Uložit",
|
||||
"The comment cannot be empty." : "Komentář je třeba vyplnit",
|
||||
@@ -214,6 +215,7 @@
|
||||
"Show boards in calendar/tasks" : "Zobrazit tabule v kalendáři/úkolech",
|
||||
"Limit deck usage of groups" : "Omezit využití deck na skupiny",
|
||||
"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." : "Omezení nastavené pro Deck brání uživatelům, kteří nejsou součástí těchto skupin, ve vytváření vlastních tabulí. Nicméně i tak ale pořád budou moci pracovat na tabulích, které jsou jim nasdíleny.",
|
||||
"Board name" : "Název tabule",
|
||||
"Edit board" : "Upravit tabuli",
|
||||
"Clone board " : "Klonovat tabuli ",
|
||||
"Unarchive board " : "Vrátit tabuli zpět z archivu ",
|
||||
|
||||
@@ -100,7 +100,7 @@ OC.L10N.register(
|
||||
"Personal planning and team project organization" : "Persönliche Planung und Teamprojektorganisation",
|
||||
"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 ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Füge Deine Aufgaben zu den Karten hinzu und ordne diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Schlagworten für noch bessere Organisation\n- 👥 Teile mit Deinem Team, Freunden oder der Familie\n- 📎 Füge Dateien hinzu und verwende diese in Deinen Markdown-Beschreibungen\n- 💬 Diskutiere mit Deinem Team mit Kommentaren\n- ⚡ Behalte Überblick über Änderungen mit dem Aktivitäten-Stream\n- 🚀 Organisiere Dein Projekt",
|
||||
"Card details" : "Kartendetails",
|
||||
"Add board" : "Benötigt keine Übersetzung. Für Android wird nur die formelle Übersetzung verwendet (de_DE).",
|
||||
"Add board" : "Board hinzufügen",
|
||||
"Select the board to link to a project" : "Wähle ein Board aus, um dieses mit einem Projekt zu verknüpfen",
|
||||
"Search by board title" : "Nach einem Board suchen",
|
||||
"Select board" : "Board auswählen",
|
||||
@@ -117,7 +117,7 @@ OC.L10N.register(
|
||||
"This board is read only" : "Dieses Board ist schreibgeschützt",
|
||||
"Drop your files to upload" : "Dateien zum Hochladen hineinziehen",
|
||||
"Archived cards" : "Archivierte Karten",
|
||||
"Add list" : "Benötigt keine Übersetzung. Für Android wird nur die formelle Übersetzung verwendet (de_DE).",
|
||||
"Add list" : "Liste hinzufügen",
|
||||
"List name" : "Listenname",
|
||||
"Apply filter" : "Filter anwenden",
|
||||
"Filter by tag" : "Nach Schlagwort filtern",
|
||||
@@ -191,6 +191,7 @@ OC.L10N.register(
|
||||
"Select Date" : "Datum auswählen",
|
||||
"Modified" : "Geändert",
|
||||
"Created" : "Erstellt",
|
||||
"The title cannot be empty." : "Der Titel darf nicht leer sein.",
|
||||
"No comments yet. Begin the discussion!" : "Bislang keine Kommentare. Beginne die Diskussion!",
|
||||
"Save" : "Speichern",
|
||||
"The comment cannot be empty." : "Der Kommentar darf nicht leer sein.",
|
||||
@@ -216,6 +217,7 @@ OC.L10N.register(
|
||||
"Show boards in calendar/tasks" : "Board im Kalender/Aufgaben anzeigen",
|
||||
"Limit deck usage of groups" : "Nutzung von Deck auf Gruppen einschränken",
|
||||
"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." : "Durch die Begrenzung von Deck werden Benutzer, die nicht Teil dieser Gruppen sind, daran gehindert, eigene Boards zu erstellen. Benutzer können weiterhin an Boards arbeiten, die für sie freigegeben wurden.",
|
||||
"Board name" : "Board-Name",
|
||||
"Edit board" : "Board bearbeiten",
|
||||
"Clone board " : "Board duplizieren",
|
||||
"Unarchive board " : "Board dearchivieren",
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
"Personal planning and team project organization" : "Persönliche Planung und Teamprojektorganisation",
|
||||
"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 ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Füge Deine Aufgaben zu den Karten hinzu und ordne diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Schlagworten für noch bessere Organisation\n- 👥 Teile mit Deinem Team, Freunden oder der Familie\n- 📎 Füge Dateien hinzu und verwende diese in Deinen Markdown-Beschreibungen\n- 💬 Diskutiere mit Deinem Team mit Kommentaren\n- ⚡ Behalte Überblick über Änderungen mit dem Aktivitäten-Stream\n- 🚀 Organisiere Dein Projekt",
|
||||
"Card details" : "Kartendetails",
|
||||
"Add board" : "Benötigt keine Übersetzung. Für Android wird nur die formelle Übersetzung verwendet (de_DE).",
|
||||
"Add board" : "Board hinzufügen",
|
||||
"Select the board to link to a project" : "Wähle ein Board aus, um dieses mit einem Projekt zu verknüpfen",
|
||||
"Search by board title" : "Nach einem Board suchen",
|
||||
"Select board" : "Board auswählen",
|
||||
@@ -115,7 +115,7 @@
|
||||
"This board is read only" : "Dieses Board ist schreibgeschützt",
|
||||
"Drop your files to upload" : "Dateien zum Hochladen hineinziehen",
|
||||
"Archived cards" : "Archivierte Karten",
|
||||
"Add list" : "Benötigt keine Übersetzung. Für Android wird nur die formelle Übersetzung verwendet (de_DE).",
|
||||
"Add list" : "Liste hinzufügen",
|
||||
"List name" : "Listenname",
|
||||
"Apply filter" : "Filter anwenden",
|
||||
"Filter by tag" : "Nach Schlagwort filtern",
|
||||
@@ -189,6 +189,7 @@
|
||||
"Select Date" : "Datum auswählen",
|
||||
"Modified" : "Geändert",
|
||||
"Created" : "Erstellt",
|
||||
"The title cannot be empty." : "Der Titel darf nicht leer sein.",
|
||||
"No comments yet. Begin the discussion!" : "Bislang keine Kommentare. Beginne die Diskussion!",
|
||||
"Save" : "Speichern",
|
||||
"The comment cannot be empty." : "Der Kommentar darf nicht leer sein.",
|
||||
@@ -214,6 +215,7 @@
|
||||
"Show boards in calendar/tasks" : "Board im Kalender/Aufgaben anzeigen",
|
||||
"Limit deck usage of groups" : "Nutzung von Deck auf Gruppen einschränken",
|
||||
"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." : "Durch die Begrenzung von Deck werden Benutzer, die nicht Teil dieser Gruppen sind, daran gehindert, eigene Boards zu erstellen. Benutzer können weiterhin an Boards arbeiten, die für sie freigegeben wurden.",
|
||||
"Board name" : "Board-Name",
|
||||
"Edit board" : "Board bearbeiten",
|
||||
"Clone board " : "Board duplizieren",
|
||||
"Unarchive board " : "Board dearchivieren",
|
||||
|
||||
@@ -191,6 +191,7 @@ OC.L10N.register(
|
||||
"Select Date" : "Datum auswählen",
|
||||
"Modified" : "Geändert",
|
||||
"Created" : "Erstellt",
|
||||
"The title cannot be empty." : "Der Titel darf nicht leer sein.",
|
||||
"No comments yet. Begin the discussion!" : "Bislang keine Kommentare. Beginnen Sie die Diskussion!",
|
||||
"Save" : "Speichern",
|
||||
"The comment cannot be empty." : "Der Kommentar darf nicht leer sein.",
|
||||
@@ -216,6 +217,7 @@ OC.L10N.register(
|
||||
"Show boards in calendar/tasks" : "Board in Kalender/Aufgaben anzeigen",
|
||||
"Limit deck usage of groups" : "Nutzung von Deck auf Gruppen einschränken",
|
||||
"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." : "Durch die Begrenzung von Deck werden Benutzer, die nicht Teil dieser Gruppen sind, daran gehindert, eigene Boards zu erstellen. Benutzer können weiterhin an Boards arbeiten, die für sie freigegeben wurden.",
|
||||
"Board name" : "Board-Name",
|
||||
"Edit board" : "Board bearbeiten",
|
||||
"Clone board " : "Board duplizieren",
|
||||
"Unarchive board " : "Board dearchivieren",
|
||||
|
||||
@@ -189,6 +189,7 @@
|
||||
"Select Date" : "Datum auswählen",
|
||||
"Modified" : "Geändert",
|
||||
"Created" : "Erstellt",
|
||||
"The title cannot be empty." : "Der Titel darf nicht leer sein.",
|
||||
"No comments yet. Begin the discussion!" : "Bislang keine Kommentare. Beginnen Sie die Diskussion!",
|
||||
"Save" : "Speichern",
|
||||
"The comment cannot be empty." : "Der Kommentar darf nicht leer sein.",
|
||||
@@ -214,6 +215,7 @@
|
||||
"Show boards in calendar/tasks" : "Board in Kalender/Aufgaben anzeigen",
|
||||
"Limit deck usage of groups" : "Nutzung von Deck auf Gruppen einschränken",
|
||||
"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." : "Durch die Begrenzung von Deck werden Benutzer, die nicht Teil dieser Gruppen sind, daran gehindert, eigene Boards zu erstellen. Benutzer können weiterhin an Boards arbeiten, die für sie freigegeben wurden.",
|
||||
"Board name" : "Board-Name",
|
||||
"Edit board" : "Board bearbeiten",
|
||||
"Clone board " : "Board duplizieren",
|
||||
"Unarchive board " : "Board dearchivieren",
|
||||
|
||||
@@ -191,6 +191,7 @@ OC.L10N.register(
|
||||
"Select Date" : "Seleccione la fecha",
|
||||
"Modified" : "Modificado",
|
||||
"Created" : "Creado",
|
||||
"The title cannot be empty." : "El título no puede estar vacío.",
|
||||
"No comments yet. Begin the discussion!" : "Todavía no hay comentarios. ¡Comienza la discusión!",
|
||||
"Save" : "Guardar",
|
||||
"The comment cannot be empty." : "El comentario no puede estar vacío.",
|
||||
@@ -216,6 +217,7 @@ OC.L10N.register(
|
||||
"Show boards in calendar/tasks" : "Mostrar tableros en calendario/tareas",
|
||||
"Limit deck usage of groups" : "Limitar el uso de Deck a grupos",
|
||||
"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." : "Limitar Deck impedirá que usuarios que no formen parte de esos grupos creen sus propios tableros. Los usuarios todavía podrán trabajar en tableros que hayan sido compartidos con ellos.",
|
||||
"Board name" : "Nombre del tablero",
|
||||
"Edit board" : "Editar tablero",
|
||||
"Clone board " : "Clonar tablero",
|
||||
"Unarchive board " : "Desarchivar tablero",
|
||||
|
||||
@@ -189,6 +189,7 @@
|
||||
"Select Date" : "Seleccione la fecha",
|
||||
"Modified" : "Modificado",
|
||||
"Created" : "Creado",
|
||||
"The title cannot be empty." : "El título no puede estar vacío.",
|
||||
"No comments yet. Begin the discussion!" : "Todavía no hay comentarios. ¡Comienza la discusión!",
|
||||
"Save" : "Guardar",
|
||||
"The comment cannot be empty." : "El comentario no puede estar vacío.",
|
||||
@@ -214,6 +215,7 @@
|
||||
"Show boards in calendar/tasks" : "Mostrar tableros en calendario/tareas",
|
||||
"Limit deck usage of groups" : "Limitar el uso de Deck a grupos",
|
||||
"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." : "Limitar Deck impedirá que usuarios que no formen parte de esos grupos creen sus propios tableros. Los usuarios todavía podrán trabajar en tableros que hayan sido compartidos con ellos.",
|
||||
"Board name" : "Nombre del tablero",
|
||||
"Edit board" : "Editar tablero",
|
||||
"Clone board " : "Clonar tablero",
|
||||
"Unarchive board " : "Desarchivar tablero",
|
||||
|
||||
@@ -191,6 +191,7 @@ OC.L10N.register(
|
||||
"Select Date" : "Sélectionnez une date",
|
||||
"Modified" : "Modifié",
|
||||
"Created" : "Créé",
|
||||
"The title cannot be empty." : "Le titre ne peut pas être vide.",
|
||||
"No comments yet. Begin the discussion!" : "Aucun commentaire pour l'instant, démarrez la discussion !",
|
||||
"Save" : "Enregistrer",
|
||||
"The comment cannot be empty." : "Un commentaire ne peut pas être vide.",
|
||||
@@ -216,6 +217,7 @@ OC.L10N.register(
|
||||
"Show boards in calendar/tasks" : "Afficher les tableaux dans les agendas/tâches",
|
||||
"Limit deck usage of groups" : "Limiter l'utilisation du tableau aux groupes",
|
||||
"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." : "Limiter Deck empêchera les utilisateurs ne faisant pas partie de ces groupes de créer leurs propres tableaux. Ces utilisateurs pourront toujours travailler sur les tableaux qui ont été partagés avec eux.",
|
||||
"Board name" : "Nom du tableau",
|
||||
"Edit board" : "Modifier le tableau",
|
||||
"Clone board " : "Dupliquer le tableau",
|
||||
"Unarchive board " : "Sortir le tableau des archives",
|
||||
|
||||
@@ -189,6 +189,7 @@
|
||||
"Select Date" : "Sélectionnez une date",
|
||||
"Modified" : "Modifié",
|
||||
"Created" : "Créé",
|
||||
"The title cannot be empty." : "Le titre ne peut pas être vide.",
|
||||
"No comments yet. Begin the discussion!" : "Aucun commentaire pour l'instant, démarrez la discussion !",
|
||||
"Save" : "Enregistrer",
|
||||
"The comment cannot be empty." : "Un commentaire ne peut pas être vide.",
|
||||
@@ -214,6 +215,7 @@
|
||||
"Show boards in calendar/tasks" : "Afficher les tableaux dans les agendas/tâches",
|
||||
"Limit deck usage of groups" : "Limiter l'utilisation du tableau aux groupes",
|
||||
"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." : "Limiter Deck empêchera les utilisateurs ne faisant pas partie de ces groupes de créer leurs propres tableaux. Ces utilisateurs pourront toujours travailler sur les tableaux qui ont été partagés avec eux.",
|
||||
"Board name" : "Nom du tableau",
|
||||
"Edit board" : "Modifier le tableau",
|
||||
"Clone board " : "Dupliquer le tableau",
|
||||
"Unarchive board " : "Sortir le tableau des archives",
|
||||
|
||||
@@ -117,7 +117,7 @@ OC.L10N.register(
|
||||
"This board is read only" : "Este taboleiro é só de lectura",
|
||||
"Drop your files to upload" : "Arrastre os seus ficheiros para envialos",
|
||||
"Archived cards" : "Tarxetas arquivadas",
|
||||
"Add list" : "Engadir unha lista...",
|
||||
"Add list" : "Engadir unha lista",
|
||||
"List name" : "Nome da lista",
|
||||
"Apply filter" : "Aplicar filtro",
|
||||
"Filter by tag" : "Filtrar pola etiqueta",
|
||||
@@ -191,6 +191,7 @@ OC.L10N.register(
|
||||
"Select Date" : "Seleccione a data",
|
||||
"Modified" : "Modificado",
|
||||
"Created" : "Creado",
|
||||
"The title cannot be empty." : "O título non pode estar baleiro.",
|
||||
"No comments yet. Begin the discussion!" : "Aínda non hai comentarios. Comece o debate!",
|
||||
"Save" : "Gardar",
|
||||
"The comment cannot be empty." : "O comentario non pode estar baleiro",
|
||||
@@ -216,6 +217,7 @@ OC.L10N.register(
|
||||
"Show boards in calendar/tasks" : "Amosar taboleiros no calendario/tarefas",
|
||||
"Limit deck usage of groups" : "Limitar o uso da plataforma a grupos",
|
||||
"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." : "Limitando Deck bloqueará os usuarios que non formen parte destes grupos, para crear os seus propios taboleiros. Os usuarios aínda así poderán traballar en taboleiros compartidos con eles.",
|
||||
"Board name" : "Nome do taboleiro",
|
||||
"Edit board" : "Editar taboleiro",
|
||||
"Clone board " : "Clonar taboleiro",
|
||||
"Unarchive board " : "Desarquivar taboleiro",
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
"This board is read only" : "Este taboleiro é só de lectura",
|
||||
"Drop your files to upload" : "Arrastre os seus ficheiros para envialos",
|
||||
"Archived cards" : "Tarxetas arquivadas",
|
||||
"Add list" : "Engadir unha lista...",
|
||||
"Add list" : "Engadir unha lista",
|
||||
"List name" : "Nome da lista",
|
||||
"Apply filter" : "Aplicar filtro",
|
||||
"Filter by tag" : "Filtrar pola etiqueta",
|
||||
@@ -189,6 +189,7 @@
|
||||
"Select Date" : "Seleccione a data",
|
||||
"Modified" : "Modificado",
|
||||
"Created" : "Creado",
|
||||
"The title cannot be empty." : "O título non pode estar baleiro.",
|
||||
"No comments yet. Begin the discussion!" : "Aínda non hai comentarios. Comece o debate!",
|
||||
"Save" : "Gardar",
|
||||
"The comment cannot be empty." : "O comentario non pode estar baleiro",
|
||||
@@ -214,6 +215,7 @@
|
||||
"Show boards in calendar/tasks" : "Amosar taboleiros no calendario/tarefas",
|
||||
"Limit deck usage of groups" : "Limitar o uso da plataforma a grupos",
|
||||
"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." : "Limitando Deck bloqueará os usuarios que non formen parte destes grupos, para crear os seus propios taboleiros. Os usuarios aínda así poderán traballar en taboleiros compartidos con eles.",
|
||||
"Board name" : "Nome do taboleiro",
|
||||
"Edit board" : "Editar taboleiro",
|
||||
"Clone board " : "Clonar taboleiro",
|
||||
"Unarchive board " : "Desarquivar taboleiro",
|
||||
|
||||
@@ -121,6 +121,7 @@ OC.L10N.register(
|
||||
"Apply filter" : "Primijeni filtar",
|
||||
"Filter by tag" : "Filtriraj prema oznaci",
|
||||
"Filter by assigned user" : "Filtriraj prema dodijeljenom korisniku",
|
||||
"Unassigned" : "Nedodijeljeno",
|
||||
"Filter by due date" : "Filtriraj prema datumu dospijeća",
|
||||
"Overdue" : "Kasni",
|
||||
"Next 24 hours" : "Sljedeća 24 sata",
|
||||
@@ -133,6 +134,8 @@ OC.L10N.register(
|
||||
"Toggle compact mode" : "Prebaci u kompaktni način rada",
|
||||
"Details" : "Pojedinosti",
|
||||
"Loading board" : "Učitavanje ploče",
|
||||
"No lists available" : "Nema dostupnih popisa",
|
||||
"Create a new list to add cards to this board" : "Stvorite novi popis kako biste dodali kartice na ovu ploču",
|
||||
"Board not found" : "Ploča nije pronađena",
|
||||
"Sharing" : "Dijeljenje",
|
||||
"Tags" : "Oznake",
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"Apply filter" : "Primijeni filtar",
|
||||
"Filter by tag" : "Filtriraj prema oznaci",
|
||||
"Filter by assigned user" : "Filtriraj prema dodijeljenom korisniku",
|
||||
"Unassigned" : "Nedodijeljeno",
|
||||
"Filter by due date" : "Filtriraj prema datumu dospijeća",
|
||||
"Overdue" : "Kasni",
|
||||
"Next 24 hours" : "Sljedeća 24 sata",
|
||||
@@ -131,6 +132,8 @@
|
||||
"Toggle compact mode" : "Prebaci u kompaktni način rada",
|
||||
"Details" : "Pojedinosti",
|
||||
"Loading board" : "Učitavanje ploče",
|
||||
"No lists available" : "Nema dostupnih popisa",
|
||||
"Create a new list to add cards to this board" : "Stvorite novi popis kako biste dodali kartice na ovu ploču",
|
||||
"Board not found" : "Ploča nije pronađena",
|
||||
"Sharing" : "Dijeljenje",
|
||||
"Tags" : "Oznake",
|
||||
|
||||
@@ -191,6 +191,7 @@ OC.L10N.register(
|
||||
"Select Date" : "Seleziona data",
|
||||
"Modified" : "Modificato",
|
||||
"Created" : "Creato il",
|
||||
"The title cannot be empty." : "Il titolo non può essere vuoto.",
|
||||
"No comments yet. Begin the discussion!" : "Ancora nessun commento. Inizia la discussione.",
|
||||
"Save" : "Salva",
|
||||
"The comment cannot be empty." : "Il commento non può essere vuoto.",
|
||||
@@ -216,6 +217,7 @@ OC.L10N.register(
|
||||
"Show boards in calendar/tasks" : "Mostra le lavagne in calendario/attività",
|
||||
"Limit deck usage of groups" : "Limita utilizzo di Deck dei gruppi",
|
||||
"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." : "La limitazione di Deck impedirà agli utenti che non fanno parte di tali gruppi di creare le proprie lavagne. Gli utenti saranno ancora in grado di lavorare sulle lavagne che sono state condivise con loro,",
|
||||
"Board name" : "Nome della lavagna",
|
||||
"Edit board" : "Modifica lavagna",
|
||||
"Clone board " : "Clona lavagna",
|
||||
"Unarchive board " : "Recupera lavagna dall'archivio",
|
||||
|
||||
@@ -189,6 +189,7 @@
|
||||
"Select Date" : "Seleziona data",
|
||||
"Modified" : "Modificato",
|
||||
"Created" : "Creato il",
|
||||
"The title cannot be empty." : "Il titolo non può essere vuoto.",
|
||||
"No comments yet. Begin the discussion!" : "Ancora nessun commento. Inizia la discussione.",
|
||||
"Save" : "Salva",
|
||||
"The comment cannot be empty." : "Il commento non può essere vuoto.",
|
||||
@@ -214,6 +215,7 @@
|
||||
"Show boards in calendar/tasks" : "Mostra le lavagne in calendario/attività",
|
||||
"Limit deck usage of groups" : "Limita utilizzo di Deck dei gruppi",
|
||||
"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." : "La limitazione di Deck impedirà agli utenti che non fanno parte di tali gruppi di creare le proprie lavagne. Gli utenti saranno ancora in grado di lavorare sulle lavagne che sono state condivise con loro,",
|
||||
"Board name" : "Nome della lavagna",
|
||||
"Edit board" : "Modifica lavagna",
|
||||
"Clone board " : "Clona lavagna",
|
||||
"Unarchive board " : "Recupera lavagna dall'archivio",
|
||||
|
||||
@@ -98,7 +98,7 @@ OC.L10N.register(
|
||||
"A PHP extension stopped the file upload" : "Rozszerzenie PHP zatrzymało wysyłanie pliku",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Brak przesłanego pliku lub rozmiar pliku przekracza maksymalny limit %s",
|
||||
"Personal planning and team project organization" : "Indywidualne planowanie i organizacja projektu zespołowego",
|
||||
"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" : "Tablica to narzędzie organizacyjne w stylu kanban, którego celem jest osobiste planowanie i organizacja projektu dla zespołów zintegrowanych z Nextcloud.\n\n\n- 📥 Dodaj swoje zadania do kart i porządkuj je\n- 📄 Zapisuj dodatkowe notatki\n- 🔖 Przypisuj etykiety dla jeszcze lepszej organizacji\n- 👥 Współdziel ze swoim zespołem, przyjaciółmi lub rodziną\n- 📎 Dołączaj pliki i umieszczaj je z opisem\n- 💬 Porozmawiaj ze swoim zespołem za pomocą komentarzy\n- ⚡ Śledź zmiany w strumieniu aktywności\n- 🚀 Organizuj swój projekt",
|
||||
"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" : "Tablica to narzędzie organizacyjne w stylu kanban, którego celem jest osobiste planowanie i organizacja projektu dla zespołów zintegrowanych z Nextcloud.\n\n\n- 📥 Dodaj swoje zadania do kart i porządkuj je\n- 📄 Zapisuj dodatkowe notatki w markdown\n- 🔖 Przypisuj etykiety dla jeszcze lepszej organizacji\n- 👥 Współdziel ze swoim zespołem, przyjaciółmi lub rodziną\n- 📎 Dołączaj pliki i umieszczaj je z opisem\n- 💬 Porozmawiaj ze swoim zespołem za pomocą komentarzy\n- ⚡ Śledź zmiany w strumieniu aktywności\n- 🚀 Organizuj swój projekt",
|
||||
"Card details" : "Szczegóły karty",
|
||||
"Add board" : "Dodaj tablicę",
|
||||
"Select the board to link to a project" : "Wybierz tablicę, aby połączyć się z projektem",
|
||||
@@ -191,6 +191,7 @@ OC.L10N.register(
|
||||
"Select Date" : "Wybierz datę",
|
||||
"Modified" : "Zmodyfikowany",
|
||||
"Created" : "Utworzono",
|
||||
"The title cannot be empty." : "Tytuł nie może być pusty.",
|
||||
"No comments yet. Begin the discussion!" : "Brak komentarzy. Rozpocznij dyskusję!",
|
||||
"Save" : "Zapisz",
|
||||
"The comment cannot be empty." : "Komentarz nie może być pusty.",
|
||||
@@ -216,6 +217,7 @@ OC.L10N.register(
|
||||
"Show boards in calendar/tasks" : "Pokaż tablice w kalendarzu/zadaniach",
|
||||
"Limit deck usage of groups" : "Ogranicz użycie tablic dla grup",
|
||||
"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." : "Ograniczenie Deck zablokuje użytkownikom z tych grup możliwość tworzenia własnych tablic. Użytkownicy nadal będą mogli pracować na tablicach, które zostały im udostępnione.",
|
||||
"Board name" : "Nazwa tablicy",
|
||||
"Edit board" : "Edytuj tablicę",
|
||||
"Clone board " : "Klonuj tablicę ",
|
||||
"Unarchive board " : "Przywróć tablicę ",
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
"A PHP extension stopped the file upload" : "Rozszerzenie PHP zatrzymało wysyłanie pliku",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Brak przesłanego pliku lub rozmiar pliku przekracza maksymalny limit %s",
|
||||
"Personal planning and team project organization" : "Indywidualne planowanie i organizacja projektu zespołowego",
|
||||
"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" : "Tablica to narzędzie organizacyjne w stylu kanban, którego celem jest osobiste planowanie i organizacja projektu dla zespołów zintegrowanych z Nextcloud.\n\n\n- 📥 Dodaj swoje zadania do kart i porządkuj je\n- 📄 Zapisuj dodatkowe notatki\n- 🔖 Przypisuj etykiety dla jeszcze lepszej organizacji\n- 👥 Współdziel ze swoim zespołem, przyjaciółmi lub rodziną\n- 📎 Dołączaj pliki i umieszczaj je z opisem\n- 💬 Porozmawiaj ze swoim zespołem za pomocą komentarzy\n- ⚡ Śledź zmiany w strumieniu aktywności\n- 🚀 Organizuj swój projekt",
|
||||
"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" : "Tablica to narzędzie organizacyjne w stylu kanban, którego celem jest osobiste planowanie i organizacja projektu dla zespołów zintegrowanych z Nextcloud.\n\n\n- 📥 Dodaj swoje zadania do kart i porządkuj je\n- 📄 Zapisuj dodatkowe notatki w markdown\n- 🔖 Przypisuj etykiety dla jeszcze lepszej organizacji\n- 👥 Współdziel ze swoim zespołem, przyjaciółmi lub rodziną\n- 📎 Dołączaj pliki i umieszczaj je z opisem\n- 💬 Porozmawiaj ze swoim zespołem za pomocą komentarzy\n- ⚡ Śledź zmiany w strumieniu aktywności\n- 🚀 Organizuj swój projekt",
|
||||
"Card details" : "Szczegóły karty",
|
||||
"Add board" : "Dodaj tablicę",
|
||||
"Select the board to link to a project" : "Wybierz tablicę, aby połączyć się z projektem",
|
||||
@@ -189,6 +189,7 @@
|
||||
"Select Date" : "Wybierz datę",
|
||||
"Modified" : "Zmodyfikowany",
|
||||
"Created" : "Utworzono",
|
||||
"The title cannot be empty." : "Tytuł nie może być pusty.",
|
||||
"No comments yet. Begin the discussion!" : "Brak komentarzy. Rozpocznij dyskusję!",
|
||||
"Save" : "Zapisz",
|
||||
"The comment cannot be empty." : "Komentarz nie może być pusty.",
|
||||
@@ -214,6 +215,7 @@
|
||||
"Show boards in calendar/tasks" : "Pokaż tablice w kalendarzu/zadaniach",
|
||||
"Limit deck usage of groups" : "Ogranicz użycie tablic dla grup",
|
||||
"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." : "Ograniczenie Deck zablokuje użytkownikom z tych grup możliwość tworzenia własnych tablic. Użytkownicy nadal będą mogli pracować na tablicach, które zostały im udostępnione.",
|
||||
"Board name" : "Nazwa tablicy",
|
||||
"Edit board" : "Edytuj tablicę",
|
||||
"Clone board " : "Klonuj tablicę ",
|
||||
"Unarchive board " : "Przywróć tablicę ",
|
||||
|
||||
@@ -191,6 +191,7 @@ OC.L10N.register(
|
||||
"Select Date" : "Tarih Seçin",
|
||||
"Modified" : "Değiştirilme",
|
||||
"Created" : "Oluşturulma",
|
||||
"The title cannot be empty." : "Başlık boş olamaz.",
|
||||
"No comments yet. Begin the discussion!" : "Henüz bir yorum yapılmamış. Tartışmayı başlatın!",
|
||||
"Save" : "Kaydet",
|
||||
"The comment cannot be empty." : "Yorum boş olamaz.",
|
||||
@@ -216,6 +217,7 @@ OC.L10N.register(
|
||||
"Show boards in calendar/tasks" : "Takvimler ve görevlerde panolar görüntülensin",
|
||||
"Limit deck usage of groups" : "Tahtayı şu gruplar kullanabilsin",
|
||||
"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." : "Tahta kullanımı gruplar ile sınırlandığında belirtilen grupların üyesi olmayan kişiler kendi tahtalarını oluşturamaz. Bu kullanıcılar ancak kendileri ile paylaşılan tahtalar üzerinde çalışabilir.",
|
||||
"Board name" : "Pano adı",
|
||||
"Edit board" : "Panoyu sil",
|
||||
"Clone board " : "Panoyu kopyala",
|
||||
"Unarchive board " : "Panoyu arşivden çıkar",
|
||||
|
||||
@@ -189,6 +189,7 @@
|
||||
"Select Date" : "Tarih Seçin",
|
||||
"Modified" : "Değiştirilme",
|
||||
"Created" : "Oluşturulma",
|
||||
"The title cannot be empty." : "Başlık boş olamaz.",
|
||||
"No comments yet. Begin the discussion!" : "Henüz bir yorum yapılmamış. Tartışmayı başlatın!",
|
||||
"Save" : "Kaydet",
|
||||
"The comment cannot be empty." : "Yorum boş olamaz.",
|
||||
@@ -214,6 +215,7 @@
|
||||
"Show boards in calendar/tasks" : "Takvimler ve görevlerde panolar görüntülensin",
|
||||
"Limit deck usage of groups" : "Tahtayı şu gruplar kullanabilsin",
|
||||
"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." : "Tahta kullanımı gruplar ile sınırlandığında belirtilen grupların üyesi olmayan kişiler kendi tahtalarını oluşturamaz. Bu kullanıcılar ancak kendileri ile paylaşılan tahtalar üzerinde çalışabilir.",
|
||||
"Board name" : "Pano adı",
|
||||
"Edit board" : "Panoyu sil",
|
||||
"Clone board " : "Panoyu kopyala",
|
||||
"Unarchive board " : "Panoyu arşivden çıkar",
|
||||
|
||||
@@ -240,9 +240,25 @@ class ActivityManager {
|
||||
}
|
||||
|
||||
public function triggerEvent($objectType, $entity, $subject, $additionalParams = [], $author = null) {
|
||||
if ($author === null) {
|
||||
$author = $this->userId;
|
||||
}
|
||||
try {
|
||||
$event = $this->createEvent($objectType, $entity, $subject, $additionalParams, $author);
|
||||
if ($event !== null) {
|
||||
$json = json_encode($event->getSubjectParameters());
|
||||
if (mb_strlen($json) > 4000) {
|
||||
$params = json_decode(json_encode($event->getSubjectParameters()), true);
|
||||
|
||||
$newContent = $params['after'];
|
||||
unset($params['before'], $params['after'], $params['card']['description']);
|
||||
|
||||
$params['after'] = mb_substr($newContent, 0, 2000);
|
||||
if (mb_strlen($newContent) > 2000) {
|
||||
$params['after'] .= '...';
|
||||
}
|
||||
$event->setSubject($event->getSubject(), $params);
|
||||
}
|
||||
$this->sendToUsers($event);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
|
||||
@@ -96,6 +96,7 @@ class DeckProvider implements IProvider {
|
||||
unset($subjectParams['author']);
|
||||
}
|
||||
$user = $this->userManager->get($author);
|
||||
$params = [];
|
||||
if ($user !== null) {
|
||||
$params = [
|
||||
'user' => [
|
||||
@@ -328,8 +329,8 @@ class DeckProvider implements IProvider {
|
||||
if (array_key_exists('diff', $subjectParams) && $subjectParams['diff']) {
|
||||
$diff = new Diff();
|
||||
// Don't add diff as message since we are limited to 255 chars here
|
||||
//$event->setMessage($subjectParams['after']);
|
||||
$event->setParsedMessage('<pre class="visualdiff">' . $diff->render($subjectParams['before'], $subjectParams['after']) . '</pre>');
|
||||
$event->setParsedMessage($subjectParams['after']);
|
||||
//$event->setParsedMessage('<pre class="visualdiff">' . $diff->render($subjectParams['before'], $subjectParams['after']) . '</pre>');
|
||||
return $params;
|
||||
}
|
||||
if (array_key_exists('before', $subjectParams)) {
|
||||
|
||||
@@ -59,7 +59,7 @@ class DeckCalendarBackend {
|
||||
}
|
||||
|
||||
public function getBoards(): array {
|
||||
return $this->boardService->findAll();
|
||||
return $this->boardService->findAll(-1, null, false);
|
||||
}
|
||||
|
||||
public function getBoard(int $id): Board {
|
||||
|
||||
@@ -93,10 +93,18 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
* @param null $offset
|
||||
* @return array
|
||||
*/
|
||||
public function findAllByUser($userId, $limit = null, $offset = null, $since = -1) {
|
||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, 0 as shared, last_modified FROM `*PREFIX*deck_boards` WHERE owner = ? AND last_modified > ? UNION ' .
|
||||
public function findAllByUser($userId, $limit = null, $offset = null, $since = -1, $includeArchived = true) {
|
||||
// FIXME: One moving to QBMapper we should allow filtering the boards probably by method chaining for additional where clauses
|
||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, 0 as shared, last_modified FROM `*PREFIX*deck_boards` WHERE owner = ? AND last_modified > ?';
|
||||
if (!$includeArchived) {
|
||||
$sql .= ' AND NOT archived AND deleted_at = 0';
|
||||
}
|
||||
$sql .= ' UNION ' .
|
||||
'SELECT boards.id, title, owner, color, archived, deleted_at, 1 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
|
||||
'JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE acl.participant=? AND acl.type=? AND boards.owner != ? AND last_modified > ?';
|
||||
if (!$includeArchived) {
|
||||
$sql .= ' AND NOT archived AND deleted_at = 0';
|
||||
}
|
||||
$entries = $this->findEntities($sql, [$userId, $since, $userId, Acl::PERMISSION_TYPE_USER, $userId, $since], $limit, $offset);
|
||||
/* @var Board $entry */
|
||||
foreach ($entries as $entry) {
|
||||
@@ -120,7 +128,7 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
* @param null $offset
|
||||
* @return array
|
||||
*/
|
||||
public function findAllByGroups($userId, $groups, $limit = null, $offset = null) {
|
||||
public function findAllByGroups($userId, $groups, $limit = null, $offset = null, $since = -1,$includeArchived = true) {
|
||||
if (count($groups) <= 0) {
|
||||
return [];
|
||||
}
|
||||
@@ -132,7 +140,10 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
$sql .= ' OR ';
|
||||
}
|
||||
}
|
||||
$sql .= ');';
|
||||
$sql .= ')';
|
||||
if (!$includeArchived) {
|
||||
$sql .= ' AND NOT archived AND deleted_at = 0';
|
||||
}
|
||||
$entries = $this->findEntities($sql, array_merge([$userId, Acl::PERMISSION_TYPE_GROUP], $groups), $limit, $offset);
|
||||
/* @var Board $entry */
|
||||
foreach ($entries as $entry) {
|
||||
@@ -142,7 +153,7 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
return $entries;
|
||||
}
|
||||
|
||||
public function findAllByCircles($userId, $limit = null, $offset = null) {
|
||||
public function findAllByCircles($userId, $limit = null, $offset = null, $since = -1,$includeArchived = true) {
|
||||
if (!$this->circlesEnabled) {
|
||||
return [];
|
||||
}
|
||||
@@ -161,7 +172,10 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
$sql .= ' OR ';
|
||||
}
|
||||
}
|
||||
$sql .= ');';
|
||||
$sql .= ')';
|
||||
if (!$includeArchived) {
|
||||
$sql .= ' AND NOT archived AND deleted_at = 0';
|
||||
}
|
||||
$entries = $this->findEntities($sql, array_merge([$userId, Acl::PERMISSION_TYPE_CIRCLE], $circles), $limit, $offset);
|
||||
/* @var Board $entry */
|
||||
foreach ($entries as $entry) {
|
||||
|
||||
@@ -42,7 +42,7 @@ class FTSEvent extends Event {
|
||||
}
|
||||
|
||||
public function getArgument($key) {
|
||||
if ($this->hasArgument($key)) {
|
||||
if (isset($this->arguments[$key])) {
|
||||
return $this->arguments[$key];
|
||||
}
|
||||
|
||||
|
||||
@@ -107,11 +107,11 @@ class BoardService {
|
||||
$this->userId = $userId;
|
||||
}
|
||||
|
||||
public function getUserBoards(int $since = -1): array {
|
||||
public function getUserBoards(int $since = -1, $includeArchived = true): array {
|
||||
$userInfo = $this->getBoardPrerequisites();
|
||||
$userBoards = $this->boardMapper->findAllByUser($userInfo['user'], null, null, $since);
|
||||
$groupBoards = $this->boardMapper->findAllByGroups($userInfo['user'], $userInfo['groups'],null, null, $since);
|
||||
$circleBoards = $this->boardMapper->findAllByCircles($userInfo['user'], null, null, $since);
|
||||
$userBoards = $this->boardMapper->findAllByUser($userInfo['user'], null, null, $since, $includeArchived);
|
||||
$groupBoards = $this->boardMapper->findAllByGroups($userInfo['user'], $userInfo['groups'],null, null, $since, $includeArchived);
|
||||
$circleBoards = $this->boardMapper->findAllByCircles($userInfo['user'], null, null, $since, $includeArchived);
|
||||
$mergedBoards = array_merge($userBoards, $groupBoards, $circleBoards);
|
||||
$result = [];
|
||||
/** @var Board $item */
|
||||
@@ -125,11 +125,11 @@ class BoardService {
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function findAll($since = -1, $details = null) {
|
||||
public function findAll($since = -1, $details = null, $includeArchived = true) {
|
||||
if ($this->boardsCache) {
|
||||
return $this->boardsCache;
|
||||
}
|
||||
$complete = $this->getUserBoards($since);
|
||||
$complete = $this->getUserBoards($since, $includeArchived);
|
||||
$result = [];
|
||||
/** @var Board $item */
|
||||
foreach ($complete as &$item) {
|
||||
|
||||
@@ -415,8 +415,11 @@ class CardService {
|
||||
if ($card->getArchived()) {
|
||||
throw new StatusException('Operation not allowed. This card is archived.');
|
||||
}
|
||||
$changes = new ChangeSet($card);
|
||||
$card->setStackId($stackId);
|
||||
$this->cardMapper->update($card);
|
||||
$changes->setAfter($card);
|
||||
$this->activityManager->triggerUpdateEvents(ActivityManager::DECK_OBJECT_CARD, $changes, ActivityManager::SUBJECT_CARD_UPDATE);
|
||||
|
||||
$cards = $this->cardMapper->findAll($stackId);
|
||||
$result = [];
|
||||
|
||||
1631
package-lock.json
generated
1631
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
39
package.json
39
package.json
@@ -33,29 +33,30 @@
|
||||
"@juliushaertl/vue-richtext": "^0.3.3",
|
||||
"@nextcloud/auth": "^1.3.0",
|
||||
"@nextcloud/axios": "^1.4.0",
|
||||
"@nextcloud/dialogs": "^2.0.1",
|
||||
"@nextcloud/dialogs": "^3.0.0",
|
||||
"@nextcloud/event-bus": "^1.2.0",
|
||||
"@nextcloud/files": "^1.1.0",
|
||||
"@nextcloud/initial-state": "^1.1.2",
|
||||
"@nextcloud/initial-state": "^1.2.0",
|
||||
"@nextcloud/l10n": "^1.4.1",
|
||||
"@nextcloud/moment": "^1.1.1",
|
||||
"@nextcloud/router": "^1.2.0",
|
||||
"@nextcloud/vue": "^2.6.5",
|
||||
"@nextcloud/vue": "^2.7.0",
|
||||
"@nextcloud/vue-dashboard": "^1.0.1",
|
||||
"blueimp-md5": "^2.18.0",
|
||||
"dompurify": "^2.0.16",
|
||||
"dompurify": "^2.1.1",
|
||||
"lodash": "^4.17.20",
|
||||
"markdown-it": "^11.0.1",
|
||||
"markdown-it-task-lists": "^2.1.1",
|
||||
"moment": "^2.28.0",
|
||||
"moment": "^2.29.1",
|
||||
"nextcloud-vue-collections": "^0.8.1",
|
||||
"p-queue": "^6.6.1",
|
||||
"url-search-params-polyfill": "^8.1.0",
|
||||
"vue": "^2.6.12",
|
||||
"vue-at": "^2.5.0-beta.2",
|
||||
"vue-click-outside": "^1.1.0",
|
||||
"vue-easymde": "^1.2.2",
|
||||
"vue-easymde": "^1.3.0",
|
||||
"vue-infinite-loading": "^2.4.5",
|
||||
"vue-router": "^3.4.3",
|
||||
"vue-router": "^3.4.6",
|
||||
"vue-smooth-dnd": "^0.8.1",
|
||||
"vuex": "^3.5.1",
|
||||
"vuex-router-sync": "^5.0.0"
|
||||
@@ -72,44 +73,44 @@
|
||||
"@babel/preset-env": "^7.11.5",
|
||||
"@nextcloud/browserslist-config": "^1.0.0",
|
||||
"@nextcloud/eslint-config": "^2.1.0",
|
||||
"@nextcloud/eslint-plugin": "^1.4.0",
|
||||
"@nextcloud/eslint-plugin": "^1.5.0",
|
||||
"@nextcloud/webpack-vue-config": "^1.4.1",
|
||||
"@vue/test-utils": "^1.1.0",
|
||||
"acorn": "^8.0.1",
|
||||
"acorn": "^8.0.4",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"babel-jest": "^26.3.0",
|
||||
"babel-jest": "^26.5.2",
|
||||
"babel-loader": "^8.1.0",
|
||||
"css-loader": "^4.3.0",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-standard": "^12.0.0",
|
||||
"eslint-friendly-formatter": "^4.0.1",
|
||||
"eslint-loader": "^3.0.4",
|
||||
"eslint-plugin-import": "^2.22.0",
|
||||
"eslint-plugin-import": "^2.22.1",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-promise": "^4.2.1",
|
||||
"eslint-plugin-standard": "^4.0.1",
|
||||
"eslint-plugin-vue": "^6.2.2",
|
||||
"file-loader": "^6.1.0",
|
||||
"jest": "^26.4.2",
|
||||
"file-loader": "^6.1.1",
|
||||
"jest": "^26.5.2",
|
||||
"jest-serializer-vue": "^2.0.2",
|
||||
"minimist": "^1.2.5",
|
||||
"node-sass": "^4.14.1",
|
||||
"raw-loader": "^4.0.1",
|
||||
"sass-loader": "^10.0.2",
|
||||
"style-loader": "^1.2.1",
|
||||
"stylelint": "^13.7.1",
|
||||
"raw-loader": "^4.0.2",
|
||||
"sass-loader": "^10.0.3",
|
||||
"style-loader": "^1.3.0",
|
||||
"stylelint": "^13.7.2",
|
||||
"stylelint-config-recommended": "^3.0.0",
|
||||
"stylelint-config-recommended-scss": "^4.2.0",
|
||||
"stylelint-scss": "^3.18.0",
|
||||
"stylelint-webpack-plugin": "^2.1.0",
|
||||
"url-loader": "^4.1.0",
|
||||
"url-loader": "^4.1.1",
|
||||
"vue-jest": "^3.0.7",
|
||||
"vue-loader": "^15.9.3",
|
||||
"vue-template-compiler": "^2.6.12",
|
||||
"webpack": "^4.44.2",
|
||||
"webpack-cli": "^3.3.12",
|
||||
"webpack-dev-server": "^3.11.0",
|
||||
"webpack-merge": "^5.1.4"
|
||||
"webpack-merge": "^5.2.0"
|
||||
},
|
||||
"jest": {
|
||||
"moduleFileExtensions": [
|
||||
|
||||
39
src/App.vue
39
src/App.vue
@@ -21,11 +21,11 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div id="content" :class="{ 'nav-hidden': !navShown, 'sidebar-hidden': !sidebarRouterView }">
|
||||
<AppNavigation v-show="navShown" />
|
||||
<div id="app-content">
|
||||
<Content id="content" app-name="deck" :class="{ 'nav-hidden': !navShown, 'sidebar-hidden': !sidebarRouterView }">
|
||||
<AppNavigation />
|
||||
<AppContent>
|
||||
<router-view />
|
||||
</div>
|
||||
</AppContent>
|
||||
|
||||
<Modal v-if="cardDetailsInModal && $route.params.cardId" :title="t('deck', 'Card details')" @close="hideModal()">
|
||||
<div class="modal__content modal__card">
|
||||
@@ -34,15 +34,16 @@
|
||||
</Modal>
|
||||
|
||||
<router-view v-show="!cardDetailsInModal || !$route.params.cardId" name="sidebar" />
|
||||
</div>
|
||||
</Content>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import { mapState } from 'vuex'
|
||||
import AppNavigation from './components/navigation/AppNavigation'
|
||||
import { Modal } from '@nextcloud/vue'
|
||||
import { Modal, Content, AppContent } from '@nextcloud/vue'
|
||||
import { BoardApi } from './services/BoardApi'
|
||||
import { emit, subscribe } from '@nextcloud/event-bus'
|
||||
|
||||
const boardApi = new BoardApi()
|
||||
|
||||
@@ -51,6 +52,8 @@ export default {
|
||||
components: {
|
||||
AppNavigation,
|
||||
Modal,
|
||||
Content,
|
||||
AppContent,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@@ -91,6 +94,15 @@ export default {
|
||||
this.$store.dispatch('loadBoards')
|
||||
this.$store.dispatch('loadSharees')
|
||||
},
|
||||
mounted() {
|
||||
// Set navigation to initial state and update in case it gets toggled
|
||||
emit('toggle-navigation', { open: this.navShown, _initial: true })
|
||||
this.$nextTick(() => {
|
||||
subscribe('navigation-toggled', (navState) => {
|
||||
this.$store.dispatch('toggleNav', navState.open)
|
||||
})
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
hideModal() {
|
||||
this.$router.push({ name: 'board' })
|
||||
@@ -131,13 +143,6 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
.multiselect {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.modal__card {
|
||||
min-width: 320px;
|
||||
@@ -147,3 +152,11 @@ export default {
|
||||
height: 80vh;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
.multiselect {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -22,17 +22,17 @@
|
||||
|
||||
<template>
|
||||
<div class="controls">
|
||||
<div id="app-navigation-toggle-custom" class="icon-menu" @click="toggleNav" />
|
||||
<div v-if="board" class="board-title">
|
||||
<div v-if="overviewName" class="board-title">
|
||||
<div class="board-bullet icon-calendar-dark" />
|
||||
<h2>{{ overviewName }}</h2>
|
||||
</div>
|
||||
<div v-else-if="board" class="board-title">
|
||||
<div :style="{backgroundColor: '#' + board.color}" class="board-bullet" />
|
||||
<h2><a href="#">{{ board.title }}</a></h2>
|
||||
<h2>{{ board.title }}</h2>
|
||||
<p v-if="showArchived">
|
||||
({{ t('deck', 'Archived cards') }})
|
||||
</p>
|
||||
</div>
|
||||
<div v-if="overviewName" class="board-title">
|
||||
<h2><a href="#">{{ overviewName }}</a></h2>
|
||||
</div>
|
||||
<div v-if="board" class="board-actions">
|
||||
<div v-if="canManage && !showArchived && !board.archived"
|
||||
id="stack-add"
|
||||
@@ -321,6 +321,9 @@ export default {
|
||||
<style lang="scss" scoped>
|
||||
.controls {
|
||||
display: flex;
|
||||
padding: 3px;
|
||||
height: 44px;
|
||||
padding-left: 44px;
|
||||
|
||||
.board-title {
|
||||
display: flex;
|
||||
@@ -337,7 +340,7 @@ export default {
|
||||
height: 20px;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
background-color: #aaa;
|
||||
background-color: transparent;
|
||||
margin: 12px;
|
||||
margin-left: -4px;
|
||||
}
|
||||
@@ -395,6 +398,7 @@ export default {
|
||||
width: 250px;
|
||||
max-height: 80vh;
|
||||
overflow: auto;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.filter h3 {
|
||||
|
||||
@@ -181,7 +181,7 @@ export default {
|
||||
}
|
||||
|
||||
.board {
|
||||
margin-left: $board-spacing;
|
||||
padding-left: $board-spacing;
|
||||
position: relative;
|
||||
height: calc(100% - 44px);
|
||||
overflow-x: scroll;
|
||||
|
||||
@@ -7,10 +7,19 @@
|
||||
:options="formatedSharees"
|
||||
:user-select="true"
|
||||
label="displayName"
|
||||
:loading="isLoading || !!isSearching"
|
||||
:disabled="isLoading"
|
||||
track-by="multiselectKey"
|
||||
:internal-search="true"
|
||||
@input="clickAddAcl"
|
||||
@search-change="asyncFind" />
|
||||
@search-change="asyncFind">
|
||||
<template #noOptions>
|
||||
{{ isSearching ? t('deck', 'Searching for users, groups and circles ...') : t('deck', 'No participants found') }}
|
||||
</template>
|
||||
<template #noResult>
|
||||
{{ isSearching ? t('deck', 'Searching for users, groups and circles ...') : t('deck', 'No participants found') }}
|
||||
</template>
|
||||
</Multiselect>
|
||||
|
||||
<ul
|
||||
id="shareWithList"
|
||||
@@ -63,6 +72,7 @@ import { Avatar, Multiselect, Actions, ActionButton, ActionCheckbox } from '@nex
|
||||
import { CollectionList } from 'nextcloud-vue-collections'
|
||||
import { mapGetters, mapState } from 'vuex'
|
||||
import { getCurrentUser } from '@nextcloud/auth'
|
||||
import { showError } from '@nextcloud/dialogs'
|
||||
|
||||
export default {
|
||||
name: 'SharingTabSidebar',
|
||||
@@ -83,6 +93,7 @@ export default {
|
||||
data() {
|
||||
return {
|
||||
isLoading: false,
|
||||
isSearching: false,
|
||||
addAcl: null,
|
||||
addAclForAPI: null,
|
||||
}
|
||||
@@ -102,7 +113,7 @@ export default {
|
||||
formatedSharees() {
|
||||
return this.unallocatedSharees.map(item => {
|
||||
const sharee = {
|
||||
user: item.label,
|
||||
user: item.value.shareWith,
|
||||
displayName: item.label,
|
||||
icon: 'icon-user',
|
||||
multiselectKey: item.shareType + ':' + item.primaryKey,
|
||||
@@ -119,7 +130,7 @@ export default {
|
||||
|
||||
sharee.value = item.value
|
||||
return sharee
|
||||
})
|
||||
}).slice(0, 10)
|
||||
},
|
||||
unallocatedSharees() {
|
||||
return this.sharees.filter((sharee) => {
|
||||
@@ -137,13 +148,20 @@ export default {
|
||||
this.asyncFind('')
|
||||
},
|
||||
methods: {
|
||||
asyncFind(query) {
|
||||
this.isLoading = true
|
||||
this.$store.dispatch('loadSharees', query).then(response => {
|
||||
this.isLoading = false
|
||||
})
|
||||
async asyncFind(query) {
|
||||
// manual debounce to handle async searching more easily and have more control over the loading state
|
||||
const timestamp = (new Date()).getTime()
|
||||
if (!this.isSearching || timestamp > this.isSearching + 300) {
|
||||
this.isSearching = timestamp
|
||||
await this.$store.dispatch('loadSharees', query)
|
||||
|
||||
// only reset searching flag if the most recent search finished
|
||||
if (this.isSearching === timestamp) {
|
||||
this.isSearching = false
|
||||
}
|
||||
}
|
||||
},
|
||||
clickAddAcl() {
|
||||
async clickAddAcl() {
|
||||
this.addAclForAPI = {
|
||||
type: this.addAcl.value.shareType,
|
||||
participant: this.addAcl.value.shareWith,
|
||||
@@ -151,7 +169,16 @@ export default {
|
||||
permissionShare: false,
|
||||
permissionManage: false,
|
||||
}
|
||||
this.$store.dispatch('addAclToCurrentBoard', this.addAclForAPI)
|
||||
this.isLoading = true
|
||||
try {
|
||||
await this.$store.dispatch('addAclToCurrentBoard', this.addAclForAPI)
|
||||
} catch (e) {
|
||||
const errorMessage = t('deck', 'Failed to create share with {displayName}', { displayName: this.addAcl.displayName })
|
||||
console.error(errorMessage, e)
|
||||
showError(errorMessage)
|
||||
}
|
||||
this.addAcl = null
|
||||
this.isLoading = false
|
||||
},
|
||||
clickEditAcl(acl) {
|
||||
this.addAclForAPI = Object.assign({}, acl)
|
||||
|
||||
@@ -160,6 +160,7 @@ export default {
|
||||
]),
|
||||
...mapState({
|
||||
showArchived: state => state.showArchived,
|
||||
cardDetailsInModal: state => state.cardDetailsInModal,
|
||||
}),
|
||||
cardsByStack() {
|
||||
return this.$store.getters.cardsByStack(this.stack.id).filter((card) => {
|
||||
@@ -245,7 +246,9 @@ export default {
|
||||
this.$refs.newCardInput.focus()
|
||||
this.animate = false
|
||||
})
|
||||
this.$router.push({ name: 'card', params: { cardId: newCard.id } })
|
||||
if (!this.cardDetailsInModal) {
|
||||
this.$router.push({ name: 'card', params: { cardId: newCard.id } })
|
||||
}
|
||||
} catch (e) {
|
||||
showError('Could not create card: ' + e.response.data.message)
|
||||
} finally {
|
||||
|
||||
@@ -179,7 +179,7 @@
|
||||
<CardSidebarTabAttachments :card="currentCard" />
|
||||
</AppSidebarTab>
|
||||
|
||||
<AppSidebarTab v-if="hasComments"
|
||||
<AppSidebarTab
|
||||
id="comments"
|
||||
:order="2"
|
||||
:name="t('deck', 'Comments')"
|
||||
@@ -283,7 +283,6 @@ export default {
|
||||
descriptionSaveTimeout: null,
|
||||
descriptionSaving: false,
|
||||
hasActivity: capabilities && capabilities.activity,
|
||||
hasComments: !!OC.appswebroots['comments'],
|
||||
modalShow: false,
|
||||
lang: {
|
||||
days: getDayNamesMin(),
|
||||
@@ -572,14 +571,16 @@ export default {
|
||||
// FIXME: Obivously we should at some point not randomly reuse the sidebar component
|
||||
// since this is not oficially supported
|
||||
.modal__card .app-sidebar {
|
||||
$modal-padding: 14px;
|
||||
border: 0;
|
||||
min-width: 100%;
|
||||
min-width: calc(100% - #{$modal-padding*2});
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
max-width: calc(100% - #{$modal-padding*2});
|
||||
padding: 14px;
|
||||
max-height: calc(100% - #{$modal-padding*2});
|
||||
&::v-deep {
|
||||
.app-sidebar-header {
|
||||
position: sticky;
|
||||
|
||||
@@ -144,17 +144,19 @@ export default {
|
||||
}
|
||||
}
|
||||
|
||||
$avatar-offset: 12px;
|
||||
|
||||
.avatar-list {
|
||||
float: right;
|
||||
display: inline-flex;
|
||||
padding-right: 8px;
|
||||
padding-right: $avatar-offset;
|
||||
flex-direction: row-reverse;
|
||||
.avatardiv,
|
||||
/deep/ .avatardiv {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
box-sizing: content-box !important;
|
||||
margin-right: -12px;
|
||||
margin-right: -$avatar-offset;
|
||||
transition: margin-right 0.2s ease-in-out;
|
||||
|
||||
&.icon-more {
|
||||
|
||||
@@ -121,10 +121,6 @@ export default {
|
||||
}
|
||||
}
|
||||
|
||||
.card:not(.card__editable) .avatars {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.fade-enter-active, .fade-leave-active {
|
||||
transition: opacity .125s;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
class="card"
|
||||
@click="openCard">
|
||||
<div class="card-upper">
|
||||
<h3 v-if="isArchived || showArchived || !canEdit">
|
||||
<h3 v-if="compactMode || isArchived || showArchived || !canEdit">
|
||||
{{ card.title }}
|
||||
</h3>
|
||||
<h3 v-else-if="!editing">
|
||||
@@ -41,6 +41,7 @@
|
||||
<form v-if="editing"
|
||||
v-click-outside="cancelEdit"
|
||||
class="dragDisabled"
|
||||
@click.stop
|
||||
@keyup.esc="cancelEdit"
|
||||
@submit.prevent="finishedEdit(card)">
|
||||
<input v-model="copiedCard.title"
|
||||
@@ -59,9 +60,9 @@
|
||||
name="zoom"
|
||||
tag="ul"
|
||||
class="labels"
|
||||
@click="openCard">
|
||||
@click.stop="openCard">
|
||||
<li v-for="label in labelsSorted" :key="label.id" :style="labelStyle(label)">
|
||||
<span @click="applyLabelFilter(label)">{{ label.title }}</span>
|
||||
<span @click.stop="applyLabelFilter(label)">{{ label.title }}</span>
|
||||
</li>
|
||||
</transition-group>
|
||||
<div v-show="!compactMode" class="card-controls compact-item" @click="openCard">
|
||||
@@ -115,10 +116,10 @@ export default {
|
||||
]),
|
||||
canEdit() {
|
||||
if (this.currentBoard) {
|
||||
return this.$store.getters.canEdit
|
||||
return !this.currentBoard.archived && this.$store.getters.canEdit
|
||||
}
|
||||
const board = this.$store.getters.boards.find((item) => item.id === this.card.boardId)
|
||||
return board.permissions.PERMISSION_EDIT
|
||||
return board ? !board.archived && board.permissions.PERMISSION_EDIT : false
|
||||
},
|
||||
card() {
|
||||
return this.item ? this.item : this.$store.getters.cardById(this.id)
|
||||
@@ -171,6 +172,10 @@ export default {
|
||||
background-color: var(--color-main-background);
|
||||
margin-bottom: $card-spacing;
|
||||
|
||||
&::v-deep * {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
body.dark &, body.theme--dark & {
|
||||
border: 2px solid var(--color-border);
|
||||
}
|
||||
@@ -195,7 +200,7 @@ export default {
|
||||
margin: 12px $card-padding;
|
||||
flex-grow: 1;
|
||||
font-size: 100%;
|
||||
overflow-x: hidden;
|
||||
overflow: hidden;
|
||||
word-wrap: break-word;
|
||||
padding-left: 4px;
|
||||
span {
|
||||
@@ -212,11 +217,16 @@ export default {
|
||||
.card-controls {
|
||||
display: flex;
|
||||
margin-left: $card-padding;
|
||||
margin-right: $card-padding;
|
||||
|
||||
& > div {
|
||||
display: flex;
|
||||
max-height: 44px;
|
||||
}
|
||||
}
|
||||
&.card__editable .card-controls {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.duedate {
|
||||
|
||||
@@ -30,18 +30,18 @@
|
||||
<ActionButton v-if="showArchived === false && isCurrentUserAssigned" icon="icon-user" @click="unassignCardFromMe()">
|
||||
{{ t('deck', 'Unassign myself') }}
|
||||
</ActionButton>
|
||||
<ActionButton icon="icon-archive" @click="archiveUnarchiveCard()">
|
||||
{{ showArchived ? t('deck', 'Unarchive card') : t('deck', 'Archive card') }}
|
||||
</ActionButton>
|
||||
<ActionButton v-if="showArchived === false" icon="icon-delete" @click="deleteCard()">
|
||||
{{ t('deck', 'Delete card') }}
|
||||
</ActionButton>
|
||||
<ActionButton icon="icon-external" @click.stop="modalShow=true">
|
||||
{{ t('deck', 'Move card') }}
|
||||
</ActionButton>
|
||||
<ActionButton icon="icon-settings-dark" @click="openCard">
|
||||
{{ t('deck', 'Card details') }}
|
||||
</ActionButton>
|
||||
<ActionButton icon="icon-archive" @click="archiveUnarchiveCard()">
|
||||
{{ showArchived ? t('deck', 'Unarchive card') : t('deck', 'Archive card') }}
|
||||
</ActionButton>
|
||||
<ActionButton v-if="showArchived === false" icon="icon-delete" @click="deleteCard()">
|
||||
{{ t('deck', 'Delete card') }}
|
||||
</ActionButton>
|
||||
</Actions>
|
||||
</div>
|
||||
<Modal v-if="modalShow" :title="t('deck', 'Move card to another board')" @close="modalShow=false">
|
||||
@@ -106,7 +106,7 @@ export default {
|
||||
return this.$store.getters.canEdit
|
||||
}
|
||||
const board = this.$store.getters.boards.find((item) => item.id === this.card.boardId)
|
||||
return board.permissions.PERMISSION_EDIT
|
||||
return !!board?.permissions?.PERMISSION_EDIT
|
||||
},
|
||||
isBoardAndStackChoosen() {
|
||||
if (this.selectedBoard === '' || this.selectedStack === '') {
|
||||
|
||||
@@ -192,8 +192,4 @@ export default {
|
||||
color: var(--color-text-light);
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .app-navigation-toggle {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
10
src/main.js
10
src/main.js
@@ -27,6 +27,7 @@ import { sync } from 'vuex-router-sync'
|
||||
import { translate, translatePlural } from '@nextcloud/l10n'
|
||||
import { generateFilePath } from '@nextcloud/router'
|
||||
import { showError } from '@nextcloud/dialogs'
|
||||
import { subscribe } from '@nextcloud/event-bus'
|
||||
import { Tooltip } from '@nextcloud/vue'
|
||||
import ClickOutside from 'vue-click-outside'
|
||||
import './models'
|
||||
@@ -74,8 +75,17 @@ new Vue({
|
||||
}
|
||||
},
|
||||
created() {
|
||||
subscribe('nextcloud:unified-search.search', ({ query }) => {
|
||||
this.$store.commit('setSearchQuery', query)
|
||||
})
|
||||
subscribe('nextcloud:unified-search.reset', () => {
|
||||
this.$store.commit('setSearchQuery', '')
|
||||
})
|
||||
|
||||
// FIXME remove this once Nextcloud 20 is minimum required version
|
||||
// eslint-disable-next-line
|
||||
new OCA.Search(this.filter, this.cleanSearch)
|
||||
|
||||
this.interval = setInterval(() => {
|
||||
this.time = Date.now()
|
||||
}, 1000)
|
||||
|
||||
@@ -34,7 +34,6 @@ import comment from './comment'
|
||||
import trashbin from './trashbin'
|
||||
import attachment from './attachment'
|
||||
import overview from './overview'
|
||||
import debounce from 'lodash/debounce'
|
||||
Vue.use(Vuex)
|
||||
|
||||
const apiClient = new BoardApi()
|
||||
@@ -59,7 +58,7 @@ export default new Vuex.Store({
|
||||
state: {
|
||||
config: loadState('deck', 'config', {}),
|
||||
showArchived: false,
|
||||
navShown: true,
|
||||
navShown: localStorage.getItem('deck.navShown') === 'true',
|
||||
compactMode: localStorage.getItem('deck.compactMode') === 'true',
|
||||
cardDetailsInModal: localStorage.getItem('deck.cardDetailsInModal') === 'true',
|
||||
sidebarShown: false,
|
||||
@@ -204,8 +203,9 @@ export default new Vuex.Store({
|
||||
return board.id !== b.id
|
||||
})
|
||||
},
|
||||
toggleNav(state) {
|
||||
state.navShown = !state.navShown
|
||||
toggleNav(state, navState) {
|
||||
state.navShown = navState
|
||||
localStorage.setItem('deck.navShown', navState)
|
||||
},
|
||||
toggleSidebar(state) {
|
||||
state.sidebarShown = !state.sidebarShown
|
||||
@@ -392,7 +392,7 @@ export default new Vuex.Store({
|
||||
const boards = await apiClient.loadBoards()
|
||||
commit('setBoards', boards)
|
||||
},
|
||||
loadSharees: debounce(function({ commit }, query) {
|
||||
async loadSharees({ commit }, query) {
|
||||
const params = new URLSearchParams()
|
||||
if (typeof query === 'undefined') {
|
||||
return
|
||||
@@ -402,16 +402,15 @@ export default new Vuex.Store({
|
||||
params.append('perPage', 20)
|
||||
params.append('itemType', [0, 1, 7])
|
||||
|
||||
axios.get(generateOcsUrl('apps/files_sharing/api/v1') + 'sharees', { params }).then((response) => {
|
||||
commit('setSharees', response.data.ocs.data)
|
||||
})
|
||||
}, 250),
|
||||
const response = await axios.get(generateOcsUrl('apps/files_sharing/api/v1') + 'sharees', { params })
|
||||
commit('setSharees', response.data.ocs.data)
|
||||
},
|
||||
|
||||
setBoardFilter({ commmit }, filter) {
|
||||
commmit('setBoardFilter', filter)
|
||||
},
|
||||
toggleNav({ commit }) {
|
||||
commit('toggleNav')
|
||||
toggleNav({ commit }, navState) {
|
||||
commit('toggleNav', navState)
|
||||
},
|
||||
toggleSidebar({ commit }) {
|
||||
commit('toggleSidebar')
|
||||
@@ -454,13 +453,11 @@ export default new Vuex.Store({
|
||||
},
|
||||
|
||||
// acl actions
|
||||
addAclToCurrentBoard({ dispatch, commit }, newAcl) {
|
||||
async addAclToCurrentBoard({ dispatch, commit }, newAcl) {
|
||||
newAcl.boardId = this.state.currentBoard.id
|
||||
apiClient.addAcl(newAcl)
|
||||
.then((returnAcl) => {
|
||||
commit('addAclToCurrentBoard', returnAcl)
|
||||
dispatch('refreshBoard', newAcl.boardId)
|
||||
})
|
||||
const result = await apiClient.addAcl(newAcl)
|
||||
commit('addAclToCurrentBoard', result)
|
||||
dispatch('refreshBoard', newAcl.boardId)
|
||||
},
|
||||
updateAclFromCurrentBoard({ commit }, acl) {
|
||||
acl.boardId = this.state.currentBoard.id
|
||||
|
||||
@@ -287,7 +287,7 @@ class DeckProviderTest extends TestCase {
|
||||
$this->assertEquals('test string Card', $event->getParsedSubject());
|
||||
$this->assertEquals('test string {card}', $event->getRichSubject());
|
||||
$this->assertEquals('BCD', $event->getMessage());
|
||||
$this->assertEquals('<pre class="visualdiff"><del>A</del>BC<ins>D</ins></pre>', $event->getParsedMessage());
|
||||
$this->assertEquals('BCD', $event->getParsedMessage());
|
||||
}
|
||||
|
||||
public function testParseParamForBoard() {
|
||||
|
||||
Reference in New Issue
Block a user