Compare commits
1 Commits
v1.0.0-bet
...
enh/nextcl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
96ce840808 |
30
CHANGELOG.md
30
CHANGELOG.md
@@ -1,36 +1,6 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## 1.0.0 - unreleased
|
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- Completly rewritten frontend
|
|
||||||
- Better maintainability
|
|
||||||
- Various small fixes
|
|
||||||
- Unified user interface with Nextcloud
|
|
||||||
- Separate comment and activity timelines
|
|
||||||
- Add ability to reply to comments #1537
|
|
||||||
- Filter cards on board #1507 @jakobroehrl
|
|
||||||
- Add cards to projects #1294 @jakobroehrl
|
|
||||||
- Move cards to other boards #1242 @jakobroehrl
|
|
||||||
- Clone boards with existing stacks and labels #1221 @jakobroehrl
|
|
||||||
- Upload multiple files at once and in parallel
|
|
||||||
|
|
||||||
A huge thangs goes to our awesome community that put enourmous effort into the frontend migration:
|
|
||||||
|
|
||||||
Special thanks for contributing huge parts of the Vue.js migration:
|
|
||||||
@jakobroehrl @weeman1337 @nicolad
|
|
||||||
|
|
||||||
Testers/reporters:
|
|
||||||
@cloud2018 @putt1ck @bpcurse
|
|
||||||
|
|
||||||
Calendar/Tasks integration help:
|
|
||||||
@raimund-schluessler @georgehrke
|
|
||||||
|
|
||||||
Android app team for helping to improve our REST API:
|
|
||||||
@desperateCoder @stefan-niedermann
|
|
||||||
|
|
||||||
## 0.8.0 - 2020-01-16
|
## 0.8.0 - 2020-01-16
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
- 🚀 Get your project organized
|
- 🚀 Get your project organized
|
||||||
|
|
||||||
</description>
|
</description>
|
||||||
<version>1.0.0-beta1</version>
|
<version>1.0.0-alpha1</version>
|
||||||
<licence>agpl</licence>
|
<licence>agpl</licence>
|
||||||
<author>Julius Härtl</author>
|
<author>Julius Härtl</author>
|
||||||
<namespace>Deck</namespace>
|
<namespace>Deck</namespace>
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
<database min-version="9.4">pgsql</database>
|
<database min-version="9.4">pgsql</database>
|
||||||
<database>sqlite</database>
|
<database>sqlite</database>
|
||||||
<database min-version="5.5">mysql</database>
|
<database min-version="5.5">mysql</database>
|
||||||
<nextcloud min-version="18" max-version="19" />
|
<nextcloud min-version="17" max-version="19" />
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<background-jobs>
|
<background-jobs>
|
||||||
<job>OCA\Deck\Cron\DeleteCron</job>
|
<job>OCA\Deck\Cron\DeleteCron</job>
|
||||||
|
|||||||
@@ -161,8 +161,6 @@ OC.L10N.register(
|
|||||||
"Set a due date" : "Vybrat termín",
|
"Set a due date" : "Vybrat termín",
|
||||||
"Remove due date" : "Odstranit termín",
|
"Remove due date" : "Odstranit termín",
|
||||||
"Description" : "Popis",
|
"Description" : "Popis",
|
||||||
"(Unsaved)" : "(Neuloženo)",
|
|
||||||
"(Saving…)" : "(Ukládání…)",
|
|
||||||
"Formatting help" : "Nápověda k formátování",
|
"Formatting help" : "Nápověda k formátování",
|
||||||
"Attachments" : "Přílohy",
|
"Attachments" : "Přílohy",
|
||||||
"Comments" : "Komentáře",
|
"Comments" : "Komentáře",
|
||||||
|
|||||||
@@ -159,8 +159,6 @@
|
|||||||
"Set a due date" : "Vybrat termín",
|
"Set a due date" : "Vybrat termín",
|
||||||
"Remove due date" : "Odstranit termín",
|
"Remove due date" : "Odstranit termín",
|
||||||
"Description" : "Popis",
|
"Description" : "Popis",
|
||||||
"(Unsaved)" : "(Neuloženo)",
|
|
||||||
"(Saving…)" : "(Ukládání…)",
|
|
||||||
"Formatting help" : "Nápověda k formátování",
|
"Formatting help" : "Nápověda k formátování",
|
||||||
"Attachments" : "Přílohy",
|
"Attachments" : "Přílohy",
|
||||||
"Comments" : "Komentáře",
|
"Comments" : "Komentáře",
|
||||||
|
|||||||
@@ -161,8 +161,6 @@ OC.L10N.register(
|
|||||||
"Set a due date" : "Ein Ablaufdatum setzen",
|
"Set a due date" : "Ein Ablaufdatum setzen",
|
||||||
"Remove due date" : "Fälligkeitsdatum löschen",
|
"Remove due date" : "Fälligkeitsdatum löschen",
|
||||||
"Description" : "Beschreibung",
|
"Description" : "Beschreibung",
|
||||||
"(Unsaved)" : "(nicht gespeichert)",
|
|
||||||
"(Saving…)" : "(speichere...)",
|
|
||||||
"Formatting help" : "Formatierungshilfe",
|
"Formatting help" : "Formatierungshilfe",
|
||||||
"Attachments" : "Anhänge",
|
"Attachments" : "Anhänge",
|
||||||
"Comments" : "Kommentare",
|
"Comments" : "Kommentare",
|
||||||
|
|||||||
@@ -159,8 +159,6 @@
|
|||||||
"Set a due date" : "Ein Ablaufdatum setzen",
|
"Set a due date" : "Ein Ablaufdatum setzen",
|
||||||
"Remove due date" : "Fälligkeitsdatum löschen",
|
"Remove due date" : "Fälligkeitsdatum löschen",
|
||||||
"Description" : "Beschreibung",
|
"Description" : "Beschreibung",
|
||||||
"(Unsaved)" : "(nicht gespeichert)",
|
|
||||||
"(Saving…)" : "(speichere...)",
|
|
||||||
"Formatting help" : "Formatierungshilfe",
|
"Formatting help" : "Formatierungshilfe",
|
||||||
"Attachments" : "Anhänge",
|
"Attachments" : "Anhänge",
|
||||||
"Comments" : "Kommentare",
|
"Comments" : "Kommentare",
|
||||||
|
|||||||
@@ -161,8 +161,6 @@ OC.L10N.register(
|
|||||||
"Set a due date" : "Ein Ablaufdatum setzen",
|
"Set a due date" : "Ein Ablaufdatum setzen",
|
||||||
"Remove due date" : "Fälligkeitsdatum entfernen",
|
"Remove due date" : "Fälligkeitsdatum entfernen",
|
||||||
"Description" : "Beschreibung",
|
"Description" : "Beschreibung",
|
||||||
"(Unsaved)" : "(nicht gespeichert)",
|
|
||||||
"(Saving…)" : "(speichere...)",
|
|
||||||
"Formatting help" : "Formatierungshilfe",
|
"Formatting help" : "Formatierungshilfe",
|
||||||
"Attachments" : "Anhänge",
|
"Attachments" : "Anhänge",
|
||||||
"Comments" : "Kommentare",
|
"Comments" : "Kommentare",
|
||||||
|
|||||||
@@ -159,8 +159,6 @@
|
|||||||
"Set a due date" : "Ein Ablaufdatum setzen",
|
"Set a due date" : "Ein Ablaufdatum setzen",
|
||||||
"Remove due date" : "Fälligkeitsdatum entfernen",
|
"Remove due date" : "Fälligkeitsdatum entfernen",
|
||||||
"Description" : "Beschreibung",
|
"Description" : "Beschreibung",
|
||||||
"(Unsaved)" : "(nicht gespeichert)",
|
|
||||||
"(Saving…)" : "(speichere...)",
|
|
||||||
"Formatting help" : "Formatierungshilfe",
|
"Formatting help" : "Formatierungshilfe",
|
||||||
"Attachments" : "Anhänge",
|
"Attachments" : "Anhänge",
|
||||||
"Comments" : "Kommentare",
|
"Comments" : "Kommentare",
|
||||||
|
|||||||
@@ -161,8 +161,6 @@ OC.L10N.register(
|
|||||||
"Set a due date" : "Καθορίστε ημερομηνίας λήξης",
|
"Set a due date" : "Καθορίστε ημερομηνίας λήξης",
|
||||||
"Remove due date" : "Αφαίρεση ημερομηνίας λήξης",
|
"Remove due date" : "Αφαίρεση ημερομηνίας λήξης",
|
||||||
"Description" : "Περιγραφή",
|
"Description" : "Περιγραφή",
|
||||||
"(Unsaved)" : "(Δεν αποθηκεύτηκε)",
|
|
||||||
"(Saving…)" : "(Αποθήκευση...)",
|
|
||||||
"Formatting help" : "Βοήθεια μορφοποίησης",
|
"Formatting help" : "Βοήθεια μορφοποίησης",
|
||||||
"Attachments" : "Συνημμένα",
|
"Attachments" : "Συνημμένα",
|
||||||
"Comments" : "Σχόλια",
|
"Comments" : "Σχόλια",
|
||||||
|
|||||||
@@ -159,8 +159,6 @@
|
|||||||
"Set a due date" : "Καθορίστε ημερομηνίας λήξης",
|
"Set a due date" : "Καθορίστε ημερομηνίας λήξης",
|
||||||
"Remove due date" : "Αφαίρεση ημερομηνίας λήξης",
|
"Remove due date" : "Αφαίρεση ημερομηνίας λήξης",
|
||||||
"Description" : "Περιγραφή",
|
"Description" : "Περιγραφή",
|
||||||
"(Unsaved)" : "(Δεν αποθηκεύτηκε)",
|
|
||||||
"(Saving…)" : "(Αποθήκευση...)",
|
|
||||||
"Formatting help" : "Βοήθεια μορφοποίησης",
|
"Formatting help" : "Βοήθεια μορφοποίησης",
|
||||||
"Attachments" : "Συνημμένα",
|
"Attachments" : "Συνημμένα",
|
||||||
"Comments" : "Σχόλια",
|
"Comments" : "Σχόλια",
|
||||||
|
|||||||
@@ -161,8 +161,6 @@ OC.L10N.register(
|
|||||||
"Set a due date" : "Définir une date d'échéance",
|
"Set a due date" : "Définir une date d'échéance",
|
||||||
"Remove due date" : "Supprimer la date d'échéance",
|
"Remove due date" : "Supprimer la date d'échéance",
|
||||||
"Description" : "Description",
|
"Description" : "Description",
|
||||||
"(Unsaved)" : "(Non enregistré)",
|
|
||||||
"(Saving…)" : "(Enregistrement ...)",
|
|
||||||
"Formatting help" : "Aide sur la mise en forme",
|
"Formatting help" : "Aide sur la mise en forme",
|
||||||
"Attachments" : "Pièces jointes",
|
"Attachments" : "Pièces jointes",
|
||||||
"Comments" : "Commentaires",
|
"Comments" : "Commentaires",
|
||||||
|
|||||||
@@ -159,8 +159,6 @@
|
|||||||
"Set a due date" : "Définir une date d'échéance",
|
"Set a due date" : "Définir une date d'échéance",
|
||||||
"Remove due date" : "Supprimer la date d'échéance",
|
"Remove due date" : "Supprimer la date d'échéance",
|
||||||
"Description" : "Description",
|
"Description" : "Description",
|
||||||
"(Unsaved)" : "(Non enregistré)",
|
|
||||||
"(Saving…)" : "(Enregistrement ...)",
|
|
||||||
"Formatting help" : "Aide sur la mise en forme",
|
"Formatting help" : "Aide sur la mise en forme",
|
||||||
"Attachments" : "Pièces jointes",
|
"Attachments" : "Pièces jointes",
|
||||||
"Comments" : "Commentaires",
|
"Comments" : "Commentaires",
|
||||||
|
|||||||
@@ -161,8 +161,6 @@ OC.L10N.register(
|
|||||||
"Set a due date" : "Estabelecer a data de caducidade",
|
"Set a due date" : "Estabelecer a data de caducidade",
|
||||||
"Remove due date" : "Retirar a data de caducidade",
|
"Remove due date" : "Retirar a data de caducidade",
|
||||||
"Description" : "Descrición",
|
"Description" : "Descrición",
|
||||||
"(Unsaved)" : "(Sen gardar)",
|
|
||||||
"(Saving…)" : "(Gardando…)",
|
|
||||||
"Formatting help" : "Axuda de formatado",
|
"Formatting help" : "Axuda de formatado",
|
||||||
"Attachments" : "Anexos",
|
"Attachments" : "Anexos",
|
||||||
"Comments" : "Comentarios",
|
"Comments" : "Comentarios",
|
||||||
|
|||||||
@@ -159,8 +159,6 @@
|
|||||||
"Set a due date" : "Estabelecer a data de caducidade",
|
"Set a due date" : "Estabelecer a data de caducidade",
|
||||||
"Remove due date" : "Retirar a data de caducidade",
|
"Remove due date" : "Retirar a data de caducidade",
|
||||||
"Description" : "Descrición",
|
"Description" : "Descrición",
|
||||||
"(Unsaved)" : "(Sen gardar)",
|
|
||||||
"(Saving…)" : "(Gardando…)",
|
|
||||||
"Formatting help" : "Axuda de formatado",
|
"Formatting help" : "Axuda de formatado",
|
||||||
"Attachments" : "Anexos",
|
"Attachments" : "Anexos",
|
||||||
"Comments" : "Comentarios",
|
"Comments" : "Comentarios",
|
||||||
|
|||||||
@@ -155,14 +155,11 @@ OC.L10N.register(
|
|||||||
"Details" : "Dettagli",
|
"Details" : "Dettagli",
|
||||||
"Assign a tag to this card…" : "Assegna un'etichetta a questa scheda…",
|
"Assign a tag to this card…" : "Assegna un'etichetta a questa scheda…",
|
||||||
"Assign to users" : "Assegna a utenti",
|
"Assign to users" : "Assegna a utenti",
|
||||||
"Assign to users/groups/circles" : "Assegna a utenti/gruppi/cerchie",
|
|
||||||
"Assign a user to this card…" : "Assegna un utente a questa scheda…",
|
"Assign a user to this card…" : "Assegna un utente a questa scheda…",
|
||||||
"Due date" : "Data di scadenza",
|
"Due date" : "Data di scadenza",
|
||||||
"Set a due date" : "Imposta una data di scadenza",
|
"Set a due date" : "Imposta una data di scadenza",
|
||||||
"Remove due date" : "Rimuovi data di scadenza",
|
"Remove due date" : "Rimuovi data di scadenza",
|
||||||
"Description" : "Descrizione",
|
"Description" : "Descrizione",
|
||||||
"(Unsaved)" : "(Non salvata)",
|
|
||||||
"(Saving…)" : "(Salvataggio...)",
|
|
||||||
"Formatting help" : "Guida di formattazione",
|
"Formatting help" : "Guida di formattazione",
|
||||||
"Attachments" : "Allegati",
|
"Attachments" : "Allegati",
|
||||||
"Comments" : "Commenti",
|
"Comments" : "Commenti",
|
||||||
@@ -179,7 +176,6 @@ OC.L10N.register(
|
|||||||
"Reply" : "Rispondi",
|
"Reply" : "Rispondi",
|
||||||
"Update" : "Aggiorna",
|
"Update" : "Aggiorna",
|
||||||
"(group)" : "(gruppo)",
|
"(group)" : "(gruppo)",
|
||||||
"(circle)" : "(cerchia)",
|
|
||||||
"seconds ago" : "secondi fa",
|
"seconds ago" : "secondi fa",
|
||||||
"Assign to me" : "Assegna a me",
|
"Assign to me" : "Assegna a me",
|
||||||
"Delete card" : "Elimina scheda",
|
"Delete card" : "Elimina scheda",
|
||||||
|
|||||||
@@ -153,14 +153,11 @@
|
|||||||
"Details" : "Dettagli",
|
"Details" : "Dettagli",
|
||||||
"Assign a tag to this card…" : "Assegna un'etichetta a questa scheda…",
|
"Assign a tag to this card…" : "Assegna un'etichetta a questa scheda…",
|
||||||
"Assign to users" : "Assegna a utenti",
|
"Assign to users" : "Assegna a utenti",
|
||||||
"Assign to users/groups/circles" : "Assegna a utenti/gruppi/cerchie",
|
|
||||||
"Assign a user to this card…" : "Assegna un utente a questa scheda…",
|
"Assign a user to this card…" : "Assegna un utente a questa scheda…",
|
||||||
"Due date" : "Data di scadenza",
|
"Due date" : "Data di scadenza",
|
||||||
"Set a due date" : "Imposta una data di scadenza",
|
"Set a due date" : "Imposta una data di scadenza",
|
||||||
"Remove due date" : "Rimuovi data di scadenza",
|
"Remove due date" : "Rimuovi data di scadenza",
|
||||||
"Description" : "Descrizione",
|
"Description" : "Descrizione",
|
||||||
"(Unsaved)" : "(Non salvata)",
|
|
||||||
"(Saving…)" : "(Salvataggio...)",
|
|
||||||
"Formatting help" : "Guida di formattazione",
|
"Formatting help" : "Guida di formattazione",
|
||||||
"Attachments" : "Allegati",
|
"Attachments" : "Allegati",
|
||||||
"Comments" : "Commenti",
|
"Comments" : "Commenti",
|
||||||
@@ -177,7 +174,6 @@
|
|||||||
"Reply" : "Rispondi",
|
"Reply" : "Rispondi",
|
||||||
"Update" : "Aggiorna",
|
"Update" : "Aggiorna",
|
||||||
"(group)" : "(gruppo)",
|
"(group)" : "(gruppo)",
|
||||||
"(circle)" : "(cerchia)",
|
|
||||||
"seconds ago" : "secondi fa",
|
"seconds ago" : "secondi fa",
|
||||||
"Assign to me" : "Assegna a me",
|
"Assign to me" : "Assegna a me",
|
||||||
"Delete card" : "Elimina scheda",
|
"Delete card" : "Elimina scheda",
|
||||||
|
|||||||
@@ -155,14 +155,11 @@ OC.L10N.register(
|
|||||||
"Details" : "Szczegóły",
|
"Details" : "Szczegóły",
|
||||||
"Assign a tag to this card…" : "Przypisz etykietę do tej karty…",
|
"Assign a tag to this card…" : "Przypisz etykietę do tej karty…",
|
||||||
"Assign to users" : "Przypisz do użytkowników",
|
"Assign to users" : "Przypisz do użytkowników",
|
||||||
"Assign to users/groups/circles" : "Przypisz do użytkowników/grup/kręgów",
|
|
||||||
"Assign a user to this card…" : "Przypisz użytkownika do tej karty…",
|
"Assign a user to this card…" : "Przypisz użytkownika do tej karty…",
|
||||||
"Due date" : "Data realizacji",
|
"Due date" : "Data realizacji",
|
||||||
"Set a due date" : "Ustaw termin",
|
"Set a due date" : "Ustaw termin",
|
||||||
"Remove due date" : "Usuń datę realizacji",
|
"Remove due date" : "Usuń datę realizacji",
|
||||||
"Description" : "Opis",
|
"Description" : "Opis",
|
||||||
"(Unsaved)" : "(Niezapisane)",
|
|
||||||
"(Saving…)" : "(Zapisywanie...)",
|
|
||||||
"Formatting help" : "Pomoc przy formatowaniu",
|
"Formatting help" : "Pomoc przy formatowaniu",
|
||||||
"Attachments" : "Załączniki",
|
"Attachments" : "Załączniki",
|
||||||
"Comments" : "Komentarze",
|
"Comments" : "Komentarze",
|
||||||
@@ -179,7 +176,6 @@ OC.L10N.register(
|
|||||||
"Reply" : "Odpowiedz",
|
"Reply" : "Odpowiedz",
|
||||||
"Update" : "Aktualizuj",
|
"Update" : "Aktualizuj",
|
||||||
"(group)" : "(grupa)",
|
"(group)" : "(grupa)",
|
||||||
"(circle)" : "(krąg)",
|
|
||||||
"seconds ago" : "przed chwilą",
|
"seconds ago" : "przed chwilą",
|
||||||
"Assign to me" : "Przydziel do mnie",
|
"Assign to me" : "Przydziel do mnie",
|
||||||
"Delete card" : "Usuń kartę",
|
"Delete card" : "Usuń kartę",
|
||||||
|
|||||||
@@ -153,14 +153,11 @@
|
|||||||
"Details" : "Szczegóły",
|
"Details" : "Szczegóły",
|
||||||
"Assign a tag to this card…" : "Przypisz etykietę do tej karty…",
|
"Assign a tag to this card…" : "Przypisz etykietę do tej karty…",
|
||||||
"Assign to users" : "Przypisz do użytkowników",
|
"Assign to users" : "Przypisz do użytkowników",
|
||||||
"Assign to users/groups/circles" : "Przypisz do użytkowników/grup/kręgów",
|
|
||||||
"Assign a user to this card…" : "Przypisz użytkownika do tej karty…",
|
"Assign a user to this card…" : "Przypisz użytkownika do tej karty…",
|
||||||
"Due date" : "Data realizacji",
|
"Due date" : "Data realizacji",
|
||||||
"Set a due date" : "Ustaw termin",
|
"Set a due date" : "Ustaw termin",
|
||||||
"Remove due date" : "Usuń datę realizacji",
|
"Remove due date" : "Usuń datę realizacji",
|
||||||
"Description" : "Opis",
|
"Description" : "Opis",
|
||||||
"(Unsaved)" : "(Niezapisane)",
|
|
||||||
"(Saving…)" : "(Zapisywanie...)",
|
|
||||||
"Formatting help" : "Pomoc przy formatowaniu",
|
"Formatting help" : "Pomoc przy formatowaniu",
|
||||||
"Attachments" : "Załączniki",
|
"Attachments" : "Załączniki",
|
||||||
"Comments" : "Komentarze",
|
"Comments" : "Komentarze",
|
||||||
@@ -177,7 +174,6 @@
|
|||||||
"Reply" : "Odpowiedz",
|
"Reply" : "Odpowiedz",
|
||||||
"Update" : "Aktualizuj",
|
"Update" : "Aktualizuj",
|
||||||
"(group)" : "(grupa)",
|
"(group)" : "(grupa)",
|
||||||
"(circle)" : "(krąg)",
|
|
||||||
"seconds ago" : "przed chwilą",
|
"seconds ago" : "przed chwilą",
|
||||||
"Assign to me" : "Przydziel do mnie",
|
"Assign to me" : "Przydziel do mnie",
|
||||||
"Delete card" : "Usuń kartę",
|
"Delete card" : "Usuń kartę",
|
||||||
|
|||||||
@@ -161,8 +161,6 @@ OC.L10N.register(
|
|||||||
"Set a due date" : "Definir uma data de finalização",
|
"Set a due date" : "Definir uma data de finalização",
|
||||||
"Remove due date" : "Remover data de vencimento",
|
"Remove due date" : "Remover data de vencimento",
|
||||||
"Description" : "Descrição",
|
"Description" : "Descrição",
|
||||||
"(Unsaved)" : "(Não salvo)",
|
|
||||||
"(Saving…)" : "(Salvando...)",
|
|
||||||
"Formatting help" : "Formatando ajuda",
|
"Formatting help" : "Formatando ajuda",
|
||||||
"Attachments" : "Anexos",
|
"Attachments" : "Anexos",
|
||||||
"Comments" : "Comentários",
|
"Comments" : "Comentários",
|
||||||
|
|||||||
@@ -159,8 +159,6 @@
|
|||||||
"Set a due date" : "Definir uma data de finalização",
|
"Set a due date" : "Definir uma data de finalização",
|
||||||
"Remove due date" : "Remover data de vencimento",
|
"Remove due date" : "Remover data de vencimento",
|
||||||
"Description" : "Descrição",
|
"Description" : "Descrição",
|
||||||
"(Unsaved)" : "(Não salvo)",
|
|
||||||
"(Saving…)" : "(Salvando...)",
|
|
||||||
"Formatting help" : "Formatando ajuda",
|
"Formatting help" : "Formatando ajuda",
|
||||||
"Attachments" : "Anexos",
|
"Attachments" : "Anexos",
|
||||||
"Comments" : "Comentários",
|
"Comments" : "Comentários",
|
||||||
|
|||||||
@@ -155,14 +155,11 @@ OC.L10N.register(
|
|||||||
"Details" : "Подробнее",
|
"Details" : "Подробнее",
|
||||||
"Assign a tag to this card…" : "Назначить метку этой карточке…",
|
"Assign a tag to this card…" : "Назначить метку этой карточке…",
|
||||||
"Assign to users" : "Назначить пользователям",
|
"Assign to users" : "Назначить пользователям",
|
||||||
"Assign to users/groups/circles" : "Назначить пользователям / группам / кругам",
|
|
||||||
"Assign a user to this card…" : "Назначить пользователя этой карточке…",
|
"Assign a user to this card…" : "Назначить пользователя этой карточке…",
|
||||||
"Due date" : "Срок исполнения",
|
"Due date" : "Срок исполнения",
|
||||||
"Set a due date" : "Задать дату исполнения",
|
"Set a due date" : "Задать дату исполнения",
|
||||||
"Remove due date" : "Удалить срок исполнения",
|
"Remove due date" : "Удалить срок исполнения",
|
||||||
"Description" : "Описание",
|
"Description" : "Описание",
|
||||||
"(Unsaved)" : "(Не сохранен)",
|
|
||||||
"(Saving…)" : "(Сохранение...)",
|
|
||||||
"Formatting help" : "Справка по форматированию",
|
"Formatting help" : "Справка по форматированию",
|
||||||
"Attachments" : "Вложения",
|
"Attachments" : "Вложения",
|
||||||
"Comments" : "Комментарии",
|
"Comments" : "Комментарии",
|
||||||
@@ -179,7 +176,6 @@ OC.L10N.register(
|
|||||||
"Reply" : "Ответить",
|
"Reply" : "Ответить",
|
||||||
"Update" : "Обновить",
|
"Update" : "Обновить",
|
||||||
"(group)" : "(группа)",
|
"(group)" : "(группа)",
|
||||||
"(circle)" : "(круг)",
|
|
||||||
"seconds ago" : "несколько секунд назад",
|
"seconds ago" : "несколько секунд назад",
|
||||||
"Assign to me" : "Назначить себе",
|
"Assign to me" : "Назначить себе",
|
||||||
"Delete card" : "Удалить",
|
"Delete card" : "Удалить",
|
||||||
|
|||||||
@@ -153,14 +153,11 @@
|
|||||||
"Details" : "Подробнее",
|
"Details" : "Подробнее",
|
||||||
"Assign a tag to this card…" : "Назначить метку этой карточке…",
|
"Assign a tag to this card…" : "Назначить метку этой карточке…",
|
||||||
"Assign to users" : "Назначить пользователям",
|
"Assign to users" : "Назначить пользователям",
|
||||||
"Assign to users/groups/circles" : "Назначить пользователям / группам / кругам",
|
|
||||||
"Assign a user to this card…" : "Назначить пользователя этой карточке…",
|
"Assign a user to this card…" : "Назначить пользователя этой карточке…",
|
||||||
"Due date" : "Срок исполнения",
|
"Due date" : "Срок исполнения",
|
||||||
"Set a due date" : "Задать дату исполнения",
|
"Set a due date" : "Задать дату исполнения",
|
||||||
"Remove due date" : "Удалить срок исполнения",
|
"Remove due date" : "Удалить срок исполнения",
|
||||||
"Description" : "Описание",
|
"Description" : "Описание",
|
||||||
"(Unsaved)" : "(Не сохранен)",
|
|
||||||
"(Saving…)" : "(Сохранение...)",
|
|
||||||
"Formatting help" : "Справка по форматированию",
|
"Formatting help" : "Справка по форматированию",
|
||||||
"Attachments" : "Вложения",
|
"Attachments" : "Вложения",
|
||||||
"Comments" : "Комментарии",
|
"Comments" : "Комментарии",
|
||||||
@@ -177,7 +174,6 @@
|
|||||||
"Reply" : "Ответить",
|
"Reply" : "Ответить",
|
||||||
"Update" : "Обновить",
|
"Update" : "Обновить",
|
||||||
"(group)" : "(группа)",
|
"(group)" : "(группа)",
|
||||||
"(circle)" : "(круг)",
|
|
||||||
"seconds ago" : "несколько секунд назад",
|
"seconds ago" : "несколько секунд назад",
|
||||||
"Assign to me" : "Назначить себе",
|
"Assign to me" : "Назначить себе",
|
||||||
"Delete card" : "Удалить",
|
"Delete card" : "Удалить",
|
||||||
|
|||||||
10
l10n/sl.js
10
l10n/sl.js
@@ -68,8 +68,6 @@ OC.L10N.register(
|
|||||||
"Changes in the <strong>Deck app</strong>" : "Spremembe v programu <strong>Deck</strong>",
|
"Changes in the <strong>Deck app</strong>" : "Spremembe v programu <strong>Deck</strong>",
|
||||||
"A <strong>comment</strong> was created on a card" : "Nalogi je dodana nova <strong>opomba</strong>",
|
"A <strong>comment</strong> was created on a card" : "Nalogi je dodana nova <strong>opomba</strong>",
|
||||||
"Personal" : "Osebno",
|
"Personal" : "Osebno",
|
||||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} vam dodeli nalogo »%s« na »%s«.",
|
|
||||||
"The card \"%s\" on \"%s\" has reached its due date." : "Naloga »%s« na »%s« je dosegla datum preteka.",
|
|
||||||
"%s has mentioned you in a comment on \"%s\"." : "%s vas omeni v opombi na »%s«.",
|
"%s has mentioned you in a comment on \"%s\"." : "%s vas omeni v opombi na »%s«.",
|
||||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} vas omeni v opombi na »%s«.",
|
"{user} has mentioned you in a comment on \"%s\"." : "{user} vas omeni v opombi na »%s«.",
|
||||||
"{user} has shared the board %s with you." : "{user} vam omogoči souporabo zbirke %s.",
|
"{user} has shared the board %s with you." : "{user} vam omogoči souporabo zbirke %s.",
|
||||||
@@ -105,12 +103,9 @@ OC.L10N.register(
|
|||||||
"Link to card" : "Poveži nalogo",
|
"Link to card" : "Poveži nalogo",
|
||||||
"Cancel" : "Prekliči",
|
"Cancel" : "Prekliči",
|
||||||
"File already exists" : "Datoteka s tem imenom že obstaja.",
|
"File already exists" : "Datoteka s tem imenom že obstaja.",
|
||||||
"A file with the name {filename} already exists." : "Datoteka z imenom {filename} že obstaja.",
|
|
||||||
"Do you want to overwrite it?" : "Ali želite predmet prepisati?",
|
"Do you want to overwrite it?" : "Ali želite predmet prepisati?",
|
||||||
"Overwrite file" : "Prepiši datoteko",
|
"Overwrite file" : "Prepiši datoteko",
|
||||||
"Keep existing file" : "Ohrani obstoječe datoteke",
|
"Keep existing file" : "Ohrani obstoječe datoteke",
|
||||||
"This board is read only" : "Zbirka je označena le za branje",
|
|
||||||
"Drop your files to upload" : "Spustite datoteke za pošiljanje v oblak",
|
|
||||||
"Add new list" : "Dodaj nov seznam",
|
"Add new list" : "Dodaj nov seznam",
|
||||||
"List name" : "Ime seznama",
|
"List name" : "Ime seznama",
|
||||||
"Apply filter" : "Uveljavi filter",
|
"Apply filter" : "Uveljavi filter",
|
||||||
@@ -151,14 +146,11 @@ OC.L10N.register(
|
|||||||
"Details" : "Podrobnosti",
|
"Details" : "Podrobnosti",
|
||||||
"Assign a tag to this card…" : "Dodeli oznako nalogi ...",
|
"Assign a tag to this card…" : "Dodeli oznako nalogi ...",
|
||||||
"Assign to users" : "Dodeli uporabnikom",
|
"Assign to users" : "Dodeli uporabnikom",
|
||||||
"Assign to users/groups/circles" : "Dodeli uporabnikom/skupinam/krogom",
|
|
||||||
"Assign a user to this card…" : "Dodeli uporabnika k nalogi ...",
|
"Assign a user to this card…" : "Dodeli uporabnika k nalogi ...",
|
||||||
"Due date" : "Datum preteka",
|
"Due date" : "Datum preteka",
|
||||||
"Set a due date" : "Nastavi datum preteka",
|
"Set a due date" : "Nastavi datum preteka",
|
||||||
"Remove due date" : "Odstrani datum preteka",
|
"Remove due date" : "Odstrani datum preteka",
|
||||||
"Description" : "Opis",
|
"Description" : "Opis",
|
||||||
"(Unsaved)" : "(neshranjeno)",
|
|
||||||
"(Saving…)" : "(shranjevanje ...)",
|
|
||||||
"Formatting help" : "Pomoč pri oblikovanju",
|
"Formatting help" : "Pomoč pri oblikovanju",
|
||||||
"Attachments" : "Priloge",
|
"Attachments" : "Priloge",
|
||||||
"Comments" : "Opombe",
|
"Comments" : "Opombe",
|
||||||
@@ -171,11 +163,9 @@ OC.L10N.register(
|
|||||||
"Save" : "Shrani",
|
"Save" : "Shrani",
|
||||||
"The comment cannot be empty." : "Polje opombe ne sme biti prazno.",
|
"The comment cannot be empty." : "Polje opombe ne sme biti prazno.",
|
||||||
"The comment cannot be longer than 1000 characters." : "Opomba ne sme biti daljša od 1000 znakov.",
|
"The comment cannot be longer than 1000 characters." : "Opomba ne sme biti daljša od 1000 znakov.",
|
||||||
"In reply to" : "V odgovor",
|
|
||||||
"Reply" : "Odgovori",
|
"Reply" : "Odgovori",
|
||||||
"Update" : "Posodobi",
|
"Update" : "Posodobi",
|
||||||
"(group)" : "(skupina)",
|
"(group)" : "(skupina)",
|
||||||
"(circle)" : "(krog)",
|
|
||||||
"seconds ago" : "pred nekaj sekundami",
|
"seconds ago" : "pred nekaj sekundami",
|
||||||
"Assign to me" : "Nalogo dodeli meni",
|
"Assign to me" : "Nalogo dodeli meni",
|
||||||
"Delete card" : "Izbriši nalogo",
|
"Delete card" : "Izbriši nalogo",
|
||||||
|
|||||||
10
l10n/sl.json
10
l10n/sl.json
@@ -66,8 +66,6 @@
|
|||||||
"Changes in the <strong>Deck app</strong>" : "Spremembe v programu <strong>Deck</strong>",
|
"Changes in the <strong>Deck app</strong>" : "Spremembe v programu <strong>Deck</strong>",
|
||||||
"A <strong>comment</strong> was created on a card" : "Nalogi je dodana nova <strong>opomba</strong>",
|
"A <strong>comment</strong> was created on a card" : "Nalogi je dodana nova <strong>opomba</strong>",
|
||||||
"Personal" : "Osebno",
|
"Personal" : "Osebno",
|
||||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} vam dodeli nalogo »%s« na »%s«.",
|
|
||||||
"The card \"%s\" on \"%s\" has reached its due date." : "Naloga »%s« na »%s« je dosegla datum preteka.",
|
|
||||||
"%s has mentioned you in a comment on \"%s\"." : "%s vas omeni v opombi na »%s«.",
|
"%s has mentioned you in a comment on \"%s\"." : "%s vas omeni v opombi na »%s«.",
|
||||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} vas omeni v opombi na »%s«.",
|
"{user} has mentioned you in a comment on \"%s\"." : "{user} vas omeni v opombi na »%s«.",
|
||||||
"{user} has shared the board %s with you." : "{user} vam omogoči souporabo zbirke %s.",
|
"{user} has shared the board %s with you." : "{user} vam omogoči souporabo zbirke %s.",
|
||||||
@@ -103,12 +101,9 @@
|
|||||||
"Link to card" : "Poveži nalogo",
|
"Link to card" : "Poveži nalogo",
|
||||||
"Cancel" : "Prekliči",
|
"Cancel" : "Prekliči",
|
||||||
"File already exists" : "Datoteka s tem imenom že obstaja.",
|
"File already exists" : "Datoteka s tem imenom že obstaja.",
|
||||||
"A file with the name {filename} already exists." : "Datoteka z imenom {filename} že obstaja.",
|
|
||||||
"Do you want to overwrite it?" : "Ali želite predmet prepisati?",
|
"Do you want to overwrite it?" : "Ali želite predmet prepisati?",
|
||||||
"Overwrite file" : "Prepiši datoteko",
|
"Overwrite file" : "Prepiši datoteko",
|
||||||
"Keep existing file" : "Ohrani obstoječe datoteke",
|
"Keep existing file" : "Ohrani obstoječe datoteke",
|
||||||
"This board is read only" : "Zbirka je označena le za branje",
|
|
||||||
"Drop your files to upload" : "Spustite datoteke za pošiljanje v oblak",
|
|
||||||
"Add new list" : "Dodaj nov seznam",
|
"Add new list" : "Dodaj nov seznam",
|
||||||
"List name" : "Ime seznama",
|
"List name" : "Ime seznama",
|
||||||
"Apply filter" : "Uveljavi filter",
|
"Apply filter" : "Uveljavi filter",
|
||||||
@@ -149,14 +144,11 @@
|
|||||||
"Details" : "Podrobnosti",
|
"Details" : "Podrobnosti",
|
||||||
"Assign a tag to this card…" : "Dodeli oznako nalogi ...",
|
"Assign a tag to this card…" : "Dodeli oznako nalogi ...",
|
||||||
"Assign to users" : "Dodeli uporabnikom",
|
"Assign to users" : "Dodeli uporabnikom",
|
||||||
"Assign to users/groups/circles" : "Dodeli uporabnikom/skupinam/krogom",
|
|
||||||
"Assign a user to this card…" : "Dodeli uporabnika k nalogi ...",
|
"Assign a user to this card…" : "Dodeli uporabnika k nalogi ...",
|
||||||
"Due date" : "Datum preteka",
|
"Due date" : "Datum preteka",
|
||||||
"Set a due date" : "Nastavi datum preteka",
|
"Set a due date" : "Nastavi datum preteka",
|
||||||
"Remove due date" : "Odstrani datum preteka",
|
"Remove due date" : "Odstrani datum preteka",
|
||||||
"Description" : "Opis",
|
"Description" : "Opis",
|
||||||
"(Unsaved)" : "(neshranjeno)",
|
|
||||||
"(Saving…)" : "(shranjevanje ...)",
|
|
||||||
"Formatting help" : "Pomoč pri oblikovanju",
|
"Formatting help" : "Pomoč pri oblikovanju",
|
||||||
"Attachments" : "Priloge",
|
"Attachments" : "Priloge",
|
||||||
"Comments" : "Opombe",
|
"Comments" : "Opombe",
|
||||||
@@ -169,11 +161,9 @@
|
|||||||
"Save" : "Shrani",
|
"Save" : "Shrani",
|
||||||
"The comment cannot be empty." : "Polje opombe ne sme biti prazno.",
|
"The comment cannot be empty." : "Polje opombe ne sme biti prazno.",
|
||||||
"The comment cannot be longer than 1000 characters." : "Opomba ne sme biti daljša od 1000 znakov.",
|
"The comment cannot be longer than 1000 characters." : "Opomba ne sme biti daljša od 1000 znakov.",
|
||||||
"In reply to" : "V odgovor",
|
|
||||||
"Reply" : "Odgovori",
|
"Reply" : "Odgovori",
|
||||||
"Update" : "Posodobi",
|
"Update" : "Posodobi",
|
||||||
"(group)" : "(skupina)",
|
"(group)" : "(skupina)",
|
||||||
"(circle)" : "(krog)",
|
|
||||||
"seconds ago" : "pred nekaj sekundami",
|
"seconds ago" : "pred nekaj sekundami",
|
||||||
"Assign to me" : "Nalogo dodeli meni",
|
"Assign to me" : "Nalogo dodeli meni",
|
||||||
"Delete card" : "Izbriši nalogo",
|
"Delete card" : "Izbriši nalogo",
|
||||||
|
|||||||
@@ -154,7 +154,6 @@ OC.L10N.register(
|
|||||||
"Details" : "Detaljer",
|
"Details" : "Detaljer",
|
||||||
"Assign a tag to this card…" : "Tilldela en tagg till det här kortet ...",
|
"Assign a tag to this card…" : "Tilldela en tagg till det här kortet ...",
|
||||||
"Assign to users" : "Tilldela till användare",
|
"Assign to users" : "Tilldela till användare",
|
||||||
"Assign to users/groups/circles" : "Tilldela till användare/grupper/cirklar",
|
|
||||||
"Assign a user to this card…" : "Tilldela en användare till det här kortet ...",
|
"Assign a user to this card…" : "Tilldela en användare till det här kortet ...",
|
||||||
"Due date" : "Slutdatum",
|
"Due date" : "Slutdatum",
|
||||||
"Set a due date" : "Sätt ett slutdatum",
|
"Set a due date" : "Sätt ett slutdatum",
|
||||||
@@ -176,7 +175,6 @@ OC.L10N.register(
|
|||||||
"Reply" : "Svara",
|
"Reply" : "Svara",
|
||||||
"Update" : "Uppdatera",
|
"Update" : "Uppdatera",
|
||||||
"(group)" : " (grupp)",
|
"(group)" : " (grupp)",
|
||||||
"(circle)" : "(cirkel)",
|
|
||||||
"seconds ago" : "sekunder sedan",
|
"seconds ago" : "sekunder sedan",
|
||||||
"Assign to me" : "Tilldela till mig",
|
"Assign to me" : "Tilldela till mig",
|
||||||
"Delete card" : "Ta bort kort",
|
"Delete card" : "Ta bort kort",
|
||||||
|
|||||||
@@ -152,7 +152,6 @@
|
|||||||
"Details" : "Detaljer",
|
"Details" : "Detaljer",
|
||||||
"Assign a tag to this card…" : "Tilldela en tagg till det här kortet ...",
|
"Assign a tag to this card…" : "Tilldela en tagg till det här kortet ...",
|
||||||
"Assign to users" : "Tilldela till användare",
|
"Assign to users" : "Tilldela till användare",
|
||||||
"Assign to users/groups/circles" : "Tilldela till användare/grupper/cirklar",
|
|
||||||
"Assign a user to this card…" : "Tilldela en användare till det här kortet ...",
|
"Assign a user to this card…" : "Tilldela en användare till det här kortet ...",
|
||||||
"Due date" : "Slutdatum",
|
"Due date" : "Slutdatum",
|
||||||
"Set a due date" : "Sätt ett slutdatum",
|
"Set a due date" : "Sätt ett slutdatum",
|
||||||
@@ -174,7 +173,6 @@
|
|||||||
"Reply" : "Svara",
|
"Reply" : "Svara",
|
||||||
"Update" : "Uppdatera",
|
"Update" : "Uppdatera",
|
||||||
"(group)" : " (grupp)",
|
"(group)" : " (grupp)",
|
||||||
"(circle)" : "(cirkel)",
|
|
||||||
"seconds ago" : "sekunder sedan",
|
"seconds ago" : "sekunder sedan",
|
||||||
"Assign to me" : "Tilldela till mig",
|
"Assign to me" : "Tilldela till mig",
|
||||||
"Delete card" : "Ta bort kort",
|
"Delete card" : "Ta bort kort",
|
||||||
|
|||||||
@@ -155,14 +155,11 @@ OC.L10N.register(
|
|||||||
"Details" : "Ayrıntılar",
|
"Details" : "Ayrıntılar",
|
||||||
"Assign a tag to this card…" : "Bu karta bir etiket ata…",
|
"Assign a tag to this card…" : "Bu karta bir etiket ata…",
|
||||||
"Assign to users" : "Kullanıcılara ata",
|
"Assign to users" : "Kullanıcılara ata",
|
||||||
"Assign to users/groups/circles" : "Kullanıcılara/gruplara/çevrelere ata",
|
|
||||||
"Assign a user to this card…" : "Bu karta bir kullanıcı ata…",
|
"Assign a user to this card…" : "Bu karta bir kullanıcı ata…",
|
||||||
"Due date" : "Bitiş tarihi",
|
"Due date" : "Bitiş tarihi",
|
||||||
"Set a due date" : "Bitiş tarihi ayarla",
|
"Set a due date" : "Bitiş tarihi ayarla",
|
||||||
"Remove due date" : "Bitiş tarihini kaldır",
|
"Remove due date" : "Bitiş tarihini kaldır",
|
||||||
"Description" : "Açıklama",
|
"Description" : "Açıklama",
|
||||||
"(Unsaved)" : "(Kaydedilmemiş)",
|
|
||||||
"(Saving…)" : "(Kaydediliyor…)",
|
|
||||||
"Formatting help" : "Biçimlendirme yardımı",
|
"Formatting help" : "Biçimlendirme yardımı",
|
||||||
"Attachments" : "Ek dosyalar",
|
"Attachments" : "Ek dosyalar",
|
||||||
"Comments" : "Açıklamalar",
|
"Comments" : "Açıklamalar",
|
||||||
@@ -179,7 +176,6 @@ OC.L10N.register(
|
|||||||
"Reply" : "Yanıtla",
|
"Reply" : "Yanıtla",
|
||||||
"Update" : "Güncelle",
|
"Update" : "Güncelle",
|
||||||
"(group)" : "(grup)",
|
"(group)" : "(grup)",
|
||||||
"(circle)" : "(çevre)",
|
|
||||||
"seconds ago" : "saniye önce",
|
"seconds ago" : "saniye önce",
|
||||||
"Assign to me" : "Bana ata",
|
"Assign to me" : "Bana ata",
|
||||||
"Delete card" : "Kartı sil",
|
"Delete card" : "Kartı sil",
|
||||||
|
|||||||
@@ -153,14 +153,11 @@
|
|||||||
"Details" : "Ayrıntılar",
|
"Details" : "Ayrıntılar",
|
||||||
"Assign a tag to this card…" : "Bu karta bir etiket ata…",
|
"Assign a tag to this card…" : "Bu karta bir etiket ata…",
|
||||||
"Assign to users" : "Kullanıcılara ata",
|
"Assign to users" : "Kullanıcılara ata",
|
||||||
"Assign to users/groups/circles" : "Kullanıcılara/gruplara/çevrelere ata",
|
|
||||||
"Assign a user to this card…" : "Bu karta bir kullanıcı ata…",
|
"Assign a user to this card…" : "Bu karta bir kullanıcı ata…",
|
||||||
"Due date" : "Bitiş tarihi",
|
"Due date" : "Bitiş tarihi",
|
||||||
"Set a due date" : "Bitiş tarihi ayarla",
|
"Set a due date" : "Bitiş tarihi ayarla",
|
||||||
"Remove due date" : "Bitiş tarihini kaldır",
|
"Remove due date" : "Bitiş tarihini kaldır",
|
||||||
"Description" : "Açıklama",
|
"Description" : "Açıklama",
|
||||||
"(Unsaved)" : "(Kaydedilmemiş)",
|
|
||||||
"(Saving…)" : "(Kaydediliyor…)",
|
|
||||||
"Formatting help" : "Biçimlendirme yardımı",
|
"Formatting help" : "Biçimlendirme yardımı",
|
||||||
"Attachments" : "Ek dosyalar",
|
"Attachments" : "Ek dosyalar",
|
||||||
"Comments" : "Açıklamalar",
|
"Comments" : "Açıklamalar",
|
||||||
@@ -177,7 +174,6 @@
|
|||||||
"Reply" : "Yanıtla",
|
"Reply" : "Yanıtla",
|
||||||
"Update" : "Güncelle",
|
"Update" : "Güncelle",
|
||||||
"(group)" : "(grup)",
|
"(group)" : "(grup)",
|
||||||
"(circle)" : "(çevre)",
|
|
||||||
"seconds ago" : "saniye önce",
|
"seconds ago" : "saniye önce",
|
||||||
"Assign to me" : "Bana ata",
|
"Assign to me" : "Bana ata",
|
||||||
"Delete card" : "Kartı sil",
|
"Delete card" : "Kartı sil",
|
||||||
|
|||||||
@@ -455,17 +455,6 @@ class BoardService {
|
|||||||
return $board;
|
return $board;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function applyPermissions($boardId, $edit, $share, $manage) {
|
|
||||||
try {
|
|
||||||
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_MANAGE);
|
|
||||||
} catch (NoPermissionException $e) {
|
|
||||||
$acls = $this->aclMapper->findAll($boardId);
|
|
||||||
$edit = $this->permissionService->userCan($acls, Acl::PERMISSION_EDIT, $this->userId) && $edit;
|
|
||||||
$share = $this->permissionService->userCan($acls, Acl::PERMISSION_SHARE, $this->userId) && $share;
|
|
||||||
$manage = $this->permissionService->userCan($acls, Acl::PERMISSION_MANAGE, $this->userId) && $manage;
|
|
||||||
}
|
|
||||||
return [$edit, $share, $manage];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $boardId
|
* @param $boardId
|
||||||
@@ -505,8 +494,6 @@ class BoardService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_SHARE);
|
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_SHARE);
|
||||||
[$edit, $share, $manage] = $this->applyPermissions($boardId, $edit, $share, $manage);
|
|
||||||
|
|
||||||
$acl = new Acl();
|
$acl = new Acl();
|
||||||
$acl->setBoardId($boardId);
|
$acl->setBoardId($boardId);
|
||||||
$acl->setType($type);
|
$acl->setType($type);
|
||||||
@@ -569,10 +556,8 @@ class BoardService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->permissionService->checkPermission($this->aclMapper, $id, Acl::PERMISSION_SHARE);
|
$this->permissionService->checkPermission($this->aclMapper, $id, Acl::PERMISSION_SHARE);
|
||||||
|
|
||||||
/** @var Acl $acl */
|
/** @var Acl $acl */
|
||||||
$acl = $this->aclMapper->find($id);
|
$acl = $this->aclMapper->find($id);
|
||||||
[$edit, $share, $manage] = $this->applyPermissions($acl->getBoardId(), $edit, $share, $manage);
|
|
||||||
$acl->setPermissionEdit($edit);
|
$acl->setPermissionEdit($edit);
|
||||||
$acl->setPermissionShare($share);
|
$acl->setPermissionShare($share);
|
||||||
$acl->setPermissionManage($manage);
|
$acl->setPermissionManage($manage);
|
||||||
|
|||||||
25
package-lock.json
generated
25
package-lock.json
generated
@@ -7049,11 +7049,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
|
||||||
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
|
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
|
||||||
},
|
},
|
||||||
"eventemitter3": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg=="
|
|
||||||
},
|
|
||||||
"events": {
|
"events": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz",
|
||||||
@@ -12783,7 +12778,8 @@
|
|||||||
"p-finally": {
|
"p-finally": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
|
||||||
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
|
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"p-is-promise": {
|
"p-is-promise": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
@@ -12809,23 +12805,6 @@
|
|||||||
"p-limit": "^1.1.0"
|
"p-limit": "^1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"p-queue": {
|
|
||||||
"version": "6.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.3.0.tgz",
|
|
||||||
"integrity": "sha512-fg5dJlFpd5+3CgG3/0ogpVZUeJbjiyXFg0nu53hrOYsybqSiDyxyOpad0Rm6tAiGjgztAwkyvhlYHC53OiAJOA==",
|
|
||||||
"requires": {
|
|
||||||
"eventemitter3": "^4.0.0",
|
|
||||||
"p-timeout": "^3.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"p-timeout": {
|
|
||||||
"version": "3.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
|
|
||||||
"integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
|
|
||||||
"requires": {
|
|
||||||
"p-finally": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"p-try": {
|
"p-try": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
|
||||||
|
|||||||
@@ -40,9 +40,7 @@
|
|||||||
"@nextcloud/vue": "^1.4.1",
|
"@nextcloud/vue": "^1.4.1",
|
||||||
"blueimp-md5": "^2.13.0",
|
"blueimp-md5": "^2.13.0",
|
||||||
"dompurify": "^2.0.8",
|
"dompurify": "^2.0.8",
|
||||||
"moment": "^2.24.0",
|
|
||||||
"nextcloud-vue-collections": "^0.7.2",
|
"nextcloud-vue-collections": "^0.7.2",
|
||||||
"p-queue": "^6.3.0",
|
|
||||||
"url-search-params-polyfill": "^8.0.0",
|
"url-search-params-polyfill": "^8.0.0",
|
||||||
"vue": "^2.6.11",
|
"vue": "^2.6.11",
|
||||||
"vue-at": "^2.5.0-beta.2",
|
"vue-at": "^2.5.0-beta.2",
|
||||||
|
|||||||
@@ -102,15 +102,18 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
dragEnter() {
|
||||||
|
|
||||||
|
},
|
||||||
|
dragLeave() {
|
||||||
|
|
||||||
|
},
|
||||||
handleDropFiles(event) {
|
handleDropFiles(event) {
|
||||||
this.isDraggingOver = false
|
this.isDraggingOver = false
|
||||||
if (this.isReadOnly) {
|
if (this.isReadOnly) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const files = event.dataTransfer.files
|
this.onLocalAttachmentSelected(event.dataTransfer.files[0])
|
||||||
for (const file of files) {
|
|
||||||
this.onLocalAttachmentSelected(file)
|
|
||||||
}
|
|
||||||
event.dataTransfer.value = ''
|
event.dataTransfer.value = ''
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -77,7 +77,7 @@
|
|||||||
:drag-handle-selector="dragHandleSelector"
|
:drag-handle-selector="dragHandleSelector"
|
||||||
@should-accept-drop="canEdit"
|
@should-accept-drop="canEdit"
|
||||||
@drop="($event) => onDropCard(stack.id, $event)">
|
@drop="($event) => onDropCard(stack.id, $event)">
|
||||||
<Draggable v-for="card in cardsByStack" :key="card.id">
|
<Draggable v-for="card in cardsByStack(stack.id)" :key="card.id">
|
||||||
<CardItem v-if="card" :id="card.id" />
|
<CardItem v-if="card" :id="card.id" />
|
||||||
</Draggable>
|
</Draggable>
|
||||||
</Container>
|
</Container>
|
||||||
@@ -122,7 +122,7 @@ export default {
|
|||||||
'canEdit',
|
'canEdit',
|
||||||
]),
|
]),
|
||||||
cardsByStack() {
|
cardsByStack() {
|
||||||
return this.$store.getters.cardsByStack(this.stack.id)
|
return (id) => this.$store.getters.cardsByStack(id)
|
||||||
},
|
},
|
||||||
dragHandleSelector() {
|
dragHandleSelector() {
|
||||||
return this.canEdit ? null : '.no-drag'
|
return this.canEdit ? null : '.no-drag'
|
||||||
@@ -150,7 +150,7 @@ export default {
|
|||||||
},
|
},
|
||||||
payloadForCard(stackId) {
|
payloadForCard(stackId) {
|
||||||
return index => {
|
return index => {
|
||||||
return this.cardsByStack[index]
|
return this.cardsByStack(stackId)[index]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
deleteStack(stack) {
|
deleteStack(stack) {
|
||||||
|
|||||||
@@ -29,7 +29,8 @@
|
|||||||
<AppSidebarTab id="details"
|
<AppSidebarTab id="details"
|
||||||
:order="0"
|
:order="0"
|
||||||
:name="t('deck', 'Details')"
|
:name="t('deck', 'Details')"
|
||||||
icon="icon-home">
|
icon="icon-home"
|
||||||
|
ref="detailsSidebar">
|
||||||
<div class="section-wrapper">
|
<div class="section-wrapper">
|
||||||
<div v-tooltip="t('deck', 'Tags')" class="section-label icon-tag">
|
<div v-tooltip="t('deck', 'Tags')" class="section-label icon-tag">
|
||||||
<span class="hidden-visually">{{ t('deck', 'Tags') }}</span>
|
<span class="hidden-visually">{{ t('deck', 'Tags') }}</span>
|
||||||
@@ -119,20 +120,12 @@
|
|||||||
type="deck-card" />
|
type="deck-card" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h5>
|
<Editor v-if="copiedCard.id" :content="copiedCard.description" ref="editor" type="markdown" @update="updateText">
|
||||||
{{ t('deck', 'Description') }}
|
|
||||||
<span v-if="copiedCard.descriptionLastEdit && !descriptionSaving">{{ t('deck', '(Unsaved)') }}</span>
|
|
||||||
<span v-if="descriptionSaving">{{ t('deck', '(Saving…)') }}</span>
|
|
||||||
<a v-tooltip="t('deck', 'Formatting help')"
|
<a v-tooltip="t('deck', 'Formatting help')"
|
||||||
href="https://deck.readthedocs.io/en/latest/Markdown/"
|
href="https://deck.readthedocs.io/en/latest/Markdown/"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
class="icon icon-info" />
|
class="icon icon-info" />
|
||||||
</h5>
|
</Editor>
|
||||||
<!-- FIXME: make sure the editor is disabled when canEdit is false -->
|
|
||||||
<VueEasymde ref="markdownEditor"
|
|
||||||
:value="copiedCard.description"
|
|
||||||
:configs="mdeConfig"
|
|
||||||
@input="updateDescription" />
|
|
||||||
</AppSidebarTab>
|
</AppSidebarTab>
|
||||||
|
|
||||||
<AppSidebarTab id="attachments"
|
<AppSidebarTab id="attachments"
|
||||||
@@ -163,12 +156,13 @@
|
|||||||
<script>
|
<script>
|
||||||
import { Avatar, Actions, ActionButton, Multiselect, AppSidebar, AppSidebarTab, DatetimePicker } from '@nextcloud/vue'
|
import { Avatar, Actions, ActionButton, Multiselect, AppSidebar, AppSidebarTab, DatetimePicker } from '@nextcloud/vue'
|
||||||
import { mapState, mapGetters } from 'vuex'
|
import { mapState, mapGetters } from 'vuex'
|
||||||
|
import VueEasymde from 'vue-easymde/dist/VueEasyMDE.common'
|
||||||
import Color from '../../mixins/color'
|
import Color from '../../mixins/color'
|
||||||
import { CollectionList } from 'nextcloud-vue-collections'
|
import { CollectionList } from 'nextcloud-vue-collections'
|
||||||
import CardSidebarTabAttachments from './CardSidebarTabAttachments'
|
import CardSidebarTabAttachments from './CardSidebarTabAttachments'
|
||||||
import CardSidebarTabComments from './CardSidebarTabComments'
|
import CardSidebarTabComments from './CardSidebarTabComments'
|
||||||
import CardSidebarTabActivity from './CardSidebarTabActivity'
|
import CardSidebarTabActivity from './CardSidebarTabActivity'
|
||||||
|
import Editor from '@nextcloud/text'
|
||||||
const capabilities = window.OC.getCapabilities()
|
const capabilities = window.OC.getCapabilities()
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -178,7 +172,7 @@ export default {
|
|||||||
AppSidebarTab,
|
AppSidebarTab,
|
||||||
Multiselect,
|
Multiselect,
|
||||||
DatetimePicker,
|
DatetimePicker,
|
||||||
VueEasymde: () => import('vue-easymde/dist/VueEasyMDE.common'),
|
VueEasymde,
|
||||||
Actions,
|
Actions,
|
||||||
ActionButton,
|
ActionButton,
|
||||||
Avatar,
|
Avatar,
|
||||||
@@ -186,6 +180,7 @@ export default {
|
|||||||
CardSidebarTabAttachments,
|
CardSidebarTabAttachments,
|
||||||
CardSidebarTabComments,
|
CardSidebarTabComments,
|
||||||
CardSidebarTabActivity,
|
CardSidebarTabActivity,
|
||||||
|
Editor,
|
||||||
},
|
},
|
||||||
mixins: [
|
mixins: [
|
||||||
Color,
|
Color,
|
||||||
@@ -213,8 +208,6 @@ export default {
|
|||||||
},
|
},
|
||||||
lastModifiedRelative: null,
|
lastModifiedRelative: null,
|
||||||
lastCreatedRemative: null,
|
lastCreatedRemative: null,
|
||||||
descriptionSaveTimeout: null,
|
|
||||||
descriptionSaving: false,
|
|
||||||
hasActivity: capabilities && capabilities.activity,
|
hasActivity: capabilities && capabilities.activity,
|
||||||
hasComments: window.OCP && window.OCP.Comments,
|
hasComments: window.OCP && window.OCP.Comments,
|
||||||
}
|
}
|
||||||
@@ -276,7 +269,7 @@ export default {
|
|||||||
this.copiedCard = JSON.parse(JSON.stringify(this.currentCard))
|
this.copiedCard = JSON.parse(JSON.stringify(this.currentCard))
|
||||||
this.allLabels = this.currentCard.labels
|
this.allLabels = this.currentCard.labels
|
||||||
|
|
||||||
if (this.currentCard.assignedUsers && this.currentCard.assignedUsers.length > 0) {
|
if (this.currentCard.assignedUsers.length > 0) {
|
||||||
this.assignedUsers = this.currentCard.assignedUsers.map((item) => item.participant)
|
this.assignedUsers = this.currentCard.assignedUsers.map((item) => item.participant)
|
||||||
} else {
|
} else {
|
||||||
this.assignedUsers = []
|
this.assignedUsers = []
|
||||||
@@ -294,6 +287,11 @@ export default {
|
|||||||
clearInterval(this.updateRelativeTimestamps)
|
clearInterval(this.updateRelativeTimestamps)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
updateText(text) {
|
||||||
|
console.log(text)
|
||||||
|
this.copiedCard.description = text
|
||||||
|
this.$store.dispatch('updateCardDesc', this.copiedCard)
|
||||||
|
},
|
||||||
updateRelativeTimestamps() {
|
updateRelativeTimestamps() {
|
||||||
this.lastModifiedRelative = OC.Util.relativeModifiedDate(this.currentCard.lastModified * 1000)
|
this.lastModifiedRelative = OC.Util.relativeModifiedDate(this.currentCard.lastModified * 1000)
|
||||||
this.lastCreatedRemative = OC.Util.relativeModifiedDate(this.currentCard.createdAt * 1000)
|
this.lastCreatedRemative = OC.Util.relativeModifiedDate(this.currentCard.createdAt * 1000)
|
||||||
@@ -305,20 +303,8 @@ export default {
|
|||||||
this.copiedCard.duedate = null
|
this.copiedCard.duedate = null
|
||||||
this.$store.dispatch('updateCardDue', this.copiedCard)
|
this.$store.dispatch('updateCardDue', this.copiedCard)
|
||||||
},
|
},
|
||||||
updateDescription(text) {
|
saveDesc() {
|
||||||
this.copiedCard.description = text
|
this.$store.dispatch('updateCardDesc', this.copiedCard)
|
||||||
this.copiedCard.descriptionLastEdit = Date.now()
|
|
||||||
clearTimeout(this.descriptionSaveTimeout)
|
|
||||||
this.descriptionSaveTimeout = setTimeout(async() => {
|
|
||||||
if (!Object.prototype.hasOwnProperty.call(this.copiedCard, 'descriptionLastEdit') || this.descriptionSaving) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.descriptionSaving = true
|
|
||||||
await this.$store.dispatch('updateCardDesc', this.copiedCard)
|
|
||||||
delete this.copiedCard.descriptionLastEdit
|
|
||||||
this.descriptionSaving = false
|
|
||||||
}, 2500)
|
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
closeSidebar() {
|
closeSidebar() {
|
||||||
|
|||||||
@@ -28,24 +28,13 @@
|
|||||||
<input ref="localAttachments"
|
<input ref="localAttachments"
|
||||||
type="file"
|
type="file"
|
||||||
style="display: none;"
|
style="display: none;"
|
||||||
multiple
|
|
||||||
@change="handleUploadFile">
|
@change="handleUploadFile">
|
||||||
<div class="attachment-list">
|
<div class="attachment-list">
|
||||||
<ul>
|
<ul>
|
||||||
<li v-for="attachment in uploadQueue" :key="attachment.name" class="attachment">
|
|
||||||
<a class="fileicon" :style="mimetypeForAttachment('none')" />
|
|
||||||
<div class="details">
|
|
||||||
<a>
|
|
||||||
<div class="filename">
|
|
||||||
<span class="basename">{{ attachment.name }}</span>
|
|
||||||
</div>
|
|
||||||
<progress :value="attachment.progress" max="100" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<li v-for="attachment in attachments"
|
<li v-for="attachment in attachments"
|
||||||
:key="attachment.id"
|
:key="attachment.id"
|
||||||
class="attachment">
|
class="attachment"
|
||||||
|
style="display: flex;">
|
||||||
<a class="fileicon" :style="mimetypeForAttachment(attachment.extendedData.mimetype)" :href="attachmentUrl(attachment)" />
|
<a class="fileicon" :style="mimetypeForAttachment(attachment.extendedData.mimetype)" :href="attachmentUrl(attachment)" />
|
||||||
<div class="details">
|
<div class="details">
|
||||||
<a :href="attachmentUrl(attachment)" target="_blank">
|
<a :href="attachmentUrl(attachment)" target="_blank">
|
||||||
@@ -120,7 +109,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
attachments() {
|
attachments() {
|
||||||
return [...this.$store.getters.attachmentsByCard(this.card.id)].sort((a, b) => b.id - a.id)
|
return this.$store.getters.attachmentsByCard(this.card.id)
|
||||||
},
|
},
|
||||||
formattedFileSize() {
|
formattedFileSize() {
|
||||||
return (filesize) => formatFileSize(filesize)
|
return (filesize) => formatFileSize(filesize)
|
||||||
@@ -145,11 +134,22 @@ export default {
|
|||||||
this.$store.dispatch('fetchAttachments', this.card.id)
|
this.$store.dispatch('fetchAttachments', this.card.id)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleUploadFile(event) {
|
dragEnter() {
|
||||||
const files = event.target.files ?? []
|
|
||||||
for (const file of files) {
|
},
|
||||||
this.onLocalAttachmentSelected(file)
|
dragLeave() {
|
||||||
|
|
||||||
|
},
|
||||||
|
handleDropFiles(event) {
|
||||||
|
this.isDraggingOver = false
|
||||||
|
if (this.isReadOnly) {
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
this.onLocalAttachmentSelected(event.dataTransfer.files[0])
|
||||||
|
event.dataTransfer.value = ''
|
||||||
|
},
|
||||||
|
handleUploadFile(event) {
|
||||||
|
this.onLocalAttachmentSelected(event.target.files[0])
|
||||||
event.target.value = ''
|
event.target.value = ''
|
||||||
},
|
},
|
||||||
clickAddNewAttachmment() {
|
clickAddNewAttachmment() {
|
||||||
@@ -214,7 +214,6 @@ export default {
|
|||||||
li.attachment {
|
li.attachment {
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
min-height: 44px;
|
|
||||||
|
|
||||||
&.deleted {
|
&.deleted {
|
||||||
opacity: .5;
|
opacity: .5;
|
||||||
|
|||||||
@@ -22,10 +22,16 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="badges">
|
<div class="badges">
|
||||||
|
<div v-if="card.description" class="icon icon-edit" />
|
||||||
|
|
||||||
<div v-if="card.commentsUnread > 0" class="icon icon-comment" />
|
<div v-if="card.commentsUnread > 0" class="icon icon-comment" />
|
||||||
|
|
||||||
|
<div v-if="card.duedate" :class="dueIcon">
|
||||||
|
<span>{{ relativeDate }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div v-if="card.description && checkListCount > 0" class="card-tasks icon icon-checkmark">
|
<div v-if="card.description && checkListCount > 0" class="card-tasks icon icon-checkmark">
|
||||||
{{ checkListCheckedCount }}/{{ checkListCount }}
|
<span>{{ checkListCheckedCount }}/{{ checkListCount }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="card.attachmentCount > 0" class="icon-attach icon icon-attach-dark">
|
<div v-if="card.attachmentCount > 0" class="icon-attach icon icon-attach-dark">
|
||||||
@@ -33,79 +39,22 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<AvatarList :users="card.assignedUsers" />
|
<AvatarList :users="card.assignedUsers" />
|
||||||
|
|
||||||
<div @click.stop.prevent>
|
|
||||||
<Actions v-if="canEdit">
|
|
||||||
<ActionButton v-if="showArchived === false" icon="icon-user" @click="assignCardToMe()">
|
|
||||||
{{ t('deck', 'Assign to me') }}
|
|
||||||
</ActionButton>
|
|
||||||
<ActionButton icon="icon-archive" @click="archiveUnarchiveCard()">
|
|
||||||
{{ t('deck', (showArchived ? 'Unarchive card' : '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>
|
|
||||||
</Actions>
|
|
||||||
</div>
|
|
||||||
<Modal v-if="modalShow" title="Move card to another board" @close="modalShow=false">
|
|
||||||
<div class="modal__content">
|
|
||||||
<Multiselect v-model="selectedBoard"
|
|
||||||
:placeholder="t('deck', 'Select a board')"
|
|
||||||
:options="boards"
|
|
||||||
label="title"
|
|
||||||
@select="loadStacksFromBoard" />
|
|
||||||
<Multiselect v-model="selectedStack"
|
|
||||||
:placeholder="t('deck', 'Select a stack')"
|
|
||||||
:options="stacksFromBoard"
|
|
||||||
label="title" />
|
|
||||||
|
|
||||||
<button :disabled="!isBoardAndStackChoosen" class="primary" @click="moveCard">
|
|
||||||
{{ t('deck', 'Move card') }}
|
|
||||||
</button>
|
|
||||||
<button @click="modalShow=false">
|
|
||||||
{{ t('deck', 'Cancel') }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</Modal>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import AvatarList from './AvatarList'
|
import AvatarList from './AvatarList'
|
||||||
import { Modal, Actions, ActionButton, Multiselect } from '@nextcloud/vue'
|
import moment from '@nextcloud/moment'
|
||||||
import { mapGetters, mapState } from 'vuex'
|
|
||||||
import axios from '@nextcloud/axios'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'CardBadges',
|
name: 'CardBadges',
|
||||||
components: { AvatarList, Actions, ActionButton, Modal, Multiselect },
|
components: { AvatarList },
|
||||||
props: {
|
props: {
|
||||||
id: {
|
id: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: null,
|
default: null,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
modalShow: false,
|
|
||||||
selectedBoard: '',
|
|
||||||
selectedStack: '',
|
|
||||||
stacksFromBoard: [],
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters([
|
|
||||||
'canEdit',
|
|
||||||
]),
|
|
||||||
...mapState({
|
|
||||||
showArchived: state => state.showArchived,
|
|
||||||
currentBoard: state => state.currentBoard,
|
|
||||||
}),
|
|
||||||
checkListCount() {
|
checkListCount() {
|
||||||
return (this.card.description.match(/\[\s*\x*\]/g) || []).length
|
return (this.card.description.match(/\[\s*\x*\]/g) || []).length
|
||||||
},
|
},
|
||||||
@@ -118,53 +67,28 @@ export default {
|
|||||||
card() {
|
card() {
|
||||||
return this.$store.getters.cardById(this.id)
|
return this.$store.getters.cardById(this.id)
|
||||||
},
|
},
|
||||||
isBoardAndStackChoosen() {
|
dueDateTooltip() {
|
||||||
if (this.selectedBoard === '' || this.selectedStack === '') {
|
return moment(this.card.duedate).format('LLLL')
|
||||||
return false
|
},
|
||||||
|
relativeDate() {
|
||||||
|
const diff = moment(this.$root.time).diff(this.card.duedate, 'seconds')
|
||||||
|
if (diff >= 0 && diff < 45) {
|
||||||
|
return t('core', 'seconds ago')
|
||||||
}
|
}
|
||||||
return true
|
return moment(this.card.duedate).fromNow()
|
||||||
},
|
},
|
||||||
boards() {
|
dueIcon() {
|
||||||
return this.$store.getters.boards.filter(board => {
|
const days = Math.floor(moment(this.card.duedate).diff(this.$root.time, 'seconds') / 60 / 60 / 24)
|
||||||
return board.id !== this.currentBoard.id
|
if (days < 0) {
|
||||||
})
|
return 'icon-calendar due icon overdue'
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
openCard() {
|
|
||||||
this.$router.push({ name: 'card', params: { cardId: this.id } })
|
|
||||||
},
|
|
||||||
deleteCard() {
|
|
||||||
this.$store.dispatch('deleteCard', this.card)
|
|
||||||
},
|
|
||||||
archiveUnarchiveCard() {
|
|
||||||
this.$store.dispatch('archiveUnarchiveCard', { ...this.card, archived: !this.card.archived })
|
|
||||||
},
|
|
||||||
assignCardToMe() {
|
|
||||||
this.copiedCard = Object.assign({}, this.card)
|
|
||||||
this.$store.dispatch('assignCardToUser', {
|
|
||||||
card: this.copiedCard,
|
|
||||||
assignee: {
|
|
||||||
userId: OC.getCurrentUser().uid,
|
|
||||||
type: 0,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
},
|
|
||||||
moveCard() {
|
|
||||||
this.copiedCard = Object.assign({}, this.card)
|
|
||||||
this.copiedCard.stackId = this.selectedStack.id
|
|
||||||
this.$store.dispatch('moveCard', this.copiedCard)
|
|
||||||
this.modalShow = false
|
|
||||||
},
|
|
||||||
async loadStacksFromBoard(board) {
|
|
||||||
try {
|
|
||||||
console.debug(board)
|
|
||||||
const url = OC.generateUrl('/apps/deck/stacks/' + board.id)
|
|
||||||
const response = await axios.get(url)
|
|
||||||
this.stacksFromBoard = response.data
|
|
||||||
} catch (err) {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
if (days === 0) {
|
||||||
|
return 'icon-calendar-dark due icon now'
|
||||||
|
}
|
||||||
|
if (days === 1) {
|
||||||
|
return 'icon-calendar-dark due icon next'
|
||||||
|
}
|
||||||
|
return 'icon-calendar-dark due icon'
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -178,7 +102,7 @@ export default {
|
|||||||
|
|
||||||
.icon {
|
.icon {
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
padding: 12px 18px;
|
padding: 12px 14px;
|
||||||
padding-right: 4px;
|
padding-right: 4px;
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
background-position: left;
|
background-position: left;
|
||||||
@@ -229,27 +153,4 @@ export default {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.fade-enter-active, .fade-leave-active {
|
|
||||||
transition: opacity .125s;
|
|
||||||
}
|
|
||||||
.fade-enter, .fade-leave-to {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal__content {
|
|
||||||
width: 25vw;
|
|
||||||
min-width: 250px;
|
|
||||||
height: 120px;
|
|
||||||
text-align: center;
|
|
||||||
margin: 20px 20px 60px 20px;
|
|
||||||
|
|
||||||
.multiselect {
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal__content button {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -47,11 +47,44 @@
|
|||||||
<input type="button" class="icon-confirm" @click="finishedEdit(card)">
|
<input type="button" class="icon-confirm" @click="finishedEdit(card)">
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div v-if="!editing" class="right">
|
<Actions v-if="canEdit && !editing" @click.stop.prevent>
|
||||||
<div v-if="card.duedate" :class="dueIcon">
|
<ActionButton v-if="showArchived === false" icon="icon-user" @click="assignCardToMe()">
|
||||||
<span>{{ relativeDate }}</span>
|
{{ t('deck', 'Assign to me') }}
|
||||||
|
</ActionButton>
|
||||||
|
<ActionButton icon="icon-archive" @click="archiveUnarchiveCard()">
|
||||||
|
{{ t('deck', (showArchived ? 'Unarchive card' : '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>
|
||||||
|
</Actions>
|
||||||
|
|
||||||
|
<Modal v-if="modalShow" title="Move card to another board" @close="modalShow=false">
|
||||||
|
<div class="modal__content">
|
||||||
|
<Multiselect v-model="selectedBoard"
|
||||||
|
:placeholder="t('deck', 'Select a board')"
|
||||||
|
:options="boards"
|
||||||
|
label="title"
|
||||||
|
@select="loadStacksFromBoard" />
|
||||||
|
<Multiselect v-model="selectedStack"
|
||||||
|
:placeholder="t('deck', 'Select a stack')"
|
||||||
|
:options="stacksFromBoard"
|
||||||
|
label="title" />
|
||||||
|
|
||||||
|
<button :disabled="!isBoardAndStackChoosen" class="primary" @click="moveCard">
|
||||||
|
{{ t('deck', 'Move card') }}
|
||||||
|
</button>
|
||||||
|
<button @click="modalShow=false">
|
||||||
|
{{ t('deck', 'Cancel') }}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</Modal>
|
||||||
</div>
|
</div>
|
||||||
<ul v-if="card.labels && card.labels.length > 0" class="labels" @click="openCard">
|
<ul v-if="card.labels && card.labels.length > 0" class="labels" @click="openCard">
|
||||||
<li v-for="label in card.labels" :key="label.id" :style="labelStyle(label)">
|
<li v-for="label in card.labels" :key="label.id" :style="labelStyle(label)">
|
||||||
@@ -66,9 +99,11 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import { Modal, Actions, ActionButton, Multiselect } from '@nextcloud/vue'
|
||||||
import ClickOutside from 'vue-click-outside'
|
import ClickOutside from 'vue-click-outside'
|
||||||
import { mapState, mapGetters } from 'vuex'
|
import { mapState, mapGetters } from 'vuex'
|
||||||
import moment from 'moment'
|
import axios from '@nextcloud/axios'
|
||||||
|
|
||||||
import CardBadges from './CardBadges'
|
import CardBadges from './CardBadges'
|
||||||
import Color from '../../mixins/color'
|
import Color from '../../mixins/color'
|
||||||
import labelStyle from '../../mixins/labelStyle'
|
import labelStyle from '../../mixins/labelStyle'
|
||||||
@@ -76,7 +111,7 @@ import AttachmentDragAndDrop from '../AttachmentDragAndDrop'
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'CardItem',
|
name: 'CardItem',
|
||||||
components: { CardBadges, AttachmentDragAndDrop },
|
components: { Modal, CardBadges, Actions, ActionButton, Multiselect, AttachmentDragAndDrop },
|
||||||
directives: {
|
directives: {
|
||||||
ClickOutside,
|
ClickOutside,
|
||||||
},
|
},
|
||||||
@@ -89,8 +124,13 @@ export default {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
menuOpened: false,
|
||||||
editing: false,
|
editing: false,
|
||||||
copiedCard: null,
|
copiedCard: '',
|
||||||
|
modalShow: false,
|
||||||
|
selectedBoard: '',
|
||||||
|
selectedStack: '',
|
||||||
|
stacksFromBoard: [],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -105,37 +145,34 @@ export default {
|
|||||||
card() {
|
card() {
|
||||||
return this.$store.getters.cardById(this.id)
|
return this.$store.getters.cardById(this.id)
|
||||||
},
|
},
|
||||||
|
boards() {
|
||||||
|
return this.$store.getters.boards.filter(board => {
|
||||||
|
return board.id !== this.currentBoard.id
|
||||||
|
})
|
||||||
|
},
|
||||||
|
menu() {
|
||||||
|
return []
|
||||||
|
},
|
||||||
currentCard() {
|
currentCard() {
|
||||||
return this.$route.params.cardId === this.id
|
return this.$route.params.cardId === this.id
|
||||||
},
|
},
|
||||||
relativeDate() {
|
isBoardAndStackChoosen() {
|
||||||
const diff = moment(this.$root.time).diff(this.card.duedate, 'seconds')
|
if (this.selectedBoard === '' || this.selectedStack === '') {
|
||||||
if (diff >= 0 && diff < 45) {
|
return false
|
||||||
return t('core', 'seconds ago')
|
|
||||||
}
|
}
|
||||||
return moment(this.card.duedate).fromNow()
|
return true
|
||||||
},
|
|
||||||
dueIcon() {
|
|
||||||
const days = Math.floor(moment(this.card.duedate).diff(this.$root.time, 'seconds') / 60 / 60 / 24)
|
|
||||||
if (days < 0) {
|
|
||||||
return 'icon-calendar due icon overdue'
|
|
||||||
}
|
|
||||||
if (days === 0) {
|
|
||||||
return 'icon-calendar-dark due icon now'
|
|
||||||
}
|
|
||||||
if (days === 1) {
|
|
||||||
return 'icon-calendar-dark due icon next'
|
|
||||||
}
|
|
||||||
return 'icon-calendar-dark due icon'
|
|
||||||
},
|
|
||||||
dueDateTooltip() {
|
|
||||||
return moment(this.card.duedate).format('LLLL')
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
openCard() {
|
openCard() {
|
||||||
this.$router.push({ name: 'card', params: { cardId: this.id } })
|
this.$router.push({ name: 'card', params: { cardId: this.id } })
|
||||||
},
|
},
|
||||||
|
togglePopoverMenu() {
|
||||||
|
this.menuOpened = !this.menuOpened
|
||||||
|
},
|
||||||
|
hidePopoverMenu() {
|
||||||
|
this.menuOpened = false
|
||||||
|
},
|
||||||
startEditing(card) {
|
startEditing(card) {
|
||||||
this.copiedCard = Object.assign({}, card)
|
this.copiedCard = Object.assign({}, card)
|
||||||
this.editing = true
|
this.editing = true
|
||||||
@@ -149,6 +186,39 @@ export default {
|
|||||||
cancelEdit() {
|
cancelEdit() {
|
||||||
this.editing = false
|
this.editing = false
|
||||||
},
|
},
|
||||||
|
deleteCard() {
|
||||||
|
this.$store.dispatch('deleteCard', this.card)
|
||||||
|
},
|
||||||
|
archiveUnarchiveCard() {
|
||||||
|
this.copiedCard = Object.assign({}, this.card)
|
||||||
|
this.copiedCard.archived = !this.copiedCard.archived
|
||||||
|
this.$store.dispatch('archiveUnarchiveCard', this.copiedCard)
|
||||||
|
},
|
||||||
|
assignCardToMe() {
|
||||||
|
this.copiedCard = Object.assign({}, this.card)
|
||||||
|
this.$store.dispatch('assignCardToUser', {
|
||||||
|
card: this.copiedCard,
|
||||||
|
assignee: {
|
||||||
|
userId: OC.getCurrentUser().uid,
|
||||||
|
type: 0,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
async loadStacksFromBoard(board) {
|
||||||
|
try {
|
||||||
|
const url = OC.generateUrl('/apps/deck/stacks/' + board.id)
|
||||||
|
const response = await axios.get(url)
|
||||||
|
this.stacksFromBoard = response.data
|
||||||
|
} catch (err) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
},
|
||||||
|
moveCard() {
|
||||||
|
this.copiedCard = Object.assign({}, this.card)
|
||||||
|
this.copiedCard.stackId = this.selectedStack.id
|
||||||
|
this.$store.dispatch('moveCard', this.copiedCard)
|
||||||
|
this.modalShow = false
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -157,6 +227,13 @@ export default {
|
|||||||
$card-spacing: 10px;
|
$card-spacing: 10px;
|
||||||
$card-padding: 10px;
|
$card-padding: 10px;
|
||||||
|
|
||||||
|
.fade-enter-active, .fade-leave-active {
|
||||||
|
transition: opacity .125s;
|
||||||
|
}
|
||||||
|
.fade-enter, .fade-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
body.dark .card {
|
body.dark .card {
|
||||||
border: 1px solid var(--color-border);
|
border: 1px solid var(--color-border);
|
||||||
}
|
}
|
||||||
@@ -213,8 +290,8 @@ export default {
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 3px 7px;
|
padding: 1px 3px;
|
||||||
border-radius: 15px;
|
border-radius: 3px;
|
||||||
font-size: 85%;
|
font-size: 85%;
|
||||||
margin-right: 3px;
|
margin-right: 3px;
|
||||||
margin-bottom: 3px;
|
margin-bottom: 3px;
|
||||||
@@ -237,56 +314,13 @@ export default {
|
|||||||
.card-controls {
|
.card-controls {
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-left: $card-padding;
|
margin-left: $card-padding;
|
||||||
|
margin-right: $card-padding;
|
||||||
& > div {
|
& > div {
|
||||||
display: flex;
|
display: flex;
|
||||||
max-height: 44px;
|
max-height: 44px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.right {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
margin-right: 9px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon.due {
|
|
||||||
background-position: 4px center;
|
|
||||||
border-radius: 3px;
|
|
||||||
margin-top: 9px;
|
|
||||||
margin-bottom: 9px;
|
|
||||||
padding: 3px 4px;
|
|
||||||
font-size: 90%;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
opacity: .5;
|
|
||||||
flex-shrink: 1;
|
|
||||||
z-index: 2;
|
|
||||||
|
|
||||||
.icon {
|
|
||||||
background-size: contain;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.overdue {
|
|
||||||
background-color: var(--color-error);
|
|
||||||
color: var(--color-primary-text);
|
|
||||||
opacity: .7;
|
|
||||||
}
|
|
||||||
&.now {
|
|
||||||
background-color: var(--color-warning);
|
|
||||||
opacity: .7;
|
|
||||||
}
|
|
||||||
&.next {
|
|
||||||
background-color: var(--color-background-dark);
|
|
||||||
opacity: .7;
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
margin-left: 20px;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.compact {
|
.compact {
|
||||||
min-height: 50px;
|
min-height: 50px;
|
||||||
@@ -306,4 +340,20 @@ export default {
|
|||||||
color: transparent;
|
color: transparent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.modal__content {
|
||||||
|
width: 25vw;
|
||||||
|
min-width: 250px;
|
||||||
|
height: 120px;
|
||||||
|
text-align: center;
|
||||||
|
margin: 20px 20px 60px 20px;
|
||||||
|
|
||||||
|
.multiselect {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal__content button {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -30,9 +30,6 @@ import { Tooltip } from '@nextcloud/vue'
|
|||||||
import ClickOutside from 'vue-click-outside'
|
import ClickOutside from 'vue-click-outside'
|
||||||
import './models'
|
import './models'
|
||||||
|
|
||||||
// the server snap.js conflicts with vertical scrolling so we disable it
|
|
||||||
document.body.setAttribute('data-snap-ignore', 'true')
|
|
||||||
|
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
__webpack_nonce__ = btoa(OC.requestToken)
|
__webpack_nonce__ = btoa(OC.requestToken)
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
|
|||||||
@@ -21,16 +21,8 @@
|
|||||||
*/
|
*/
|
||||||
import { showError } from '@nextcloud/dialogs'
|
import { showError } from '@nextcloud/dialogs'
|
||||||
import { formatFileSize } from '@nextcloud/files'
|
import { formatFileSize } from '@nextcloud/files'
|
||||||
import PQueue from 'p-queue'
|
|
||||||
|
|
||||||
const queue = new PQueue({ concurrency: 2 })
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
uploadQueue: {},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
async onLocalAttachmentSelected(file) {
|
async onLocalAttachmentSelected(file) {
|
||||||
if (this.maxUploadSize > 0 && file.size > this.maxUploadSize) {
|
if (this.maxUploadSize > 0 && file.size > this.maxUploadSize) {
|
||||||
@@ -42,32 +34,20 @@ export default {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$set(this.uploadQueue, file.name, { name: file.name, progress: 0 })
|
|
||||||
const bodyFormData = new FormData()
|
const bodyFormData = new FormData()
|
||||||
bodyFormData.append('cardId', this.cardId)
|
bodyFormData.append('cardId', this.cardId)
|
||||||
bodyFormData.append('type', 'deck_file')
|
bodyFormData.append('type', 'deck_file')
|
||||||
bodyFormData.append('file', file)
|
bodyFormData.append('file', file)
|
||||||
await queue.add(async() => {
|
try {
|
||||||
try {
|
await this.$store.dispatch('createAttachment', { cardId: this.cardId, formData: bodyFormData })
|
||||||
await this.$store.dispatch('createAttachment', { cardId: this.cardId,
|
} catch (err) {
|
||||||
formData: bodyFormData,
|
if (err.response.data.status === 409) {
|
||||||
onUploadProgress: (e) => {
|
this.overwriteAttachment = err.response.data.data
|
||||||
const percentCompleted = Math.round((e.loaded * 100) / e.total)
|
this.modalShow = true
|
||||||
console.debug(percentCompleted)
|
} else {
|
||||||
this.$set(this.uploadQueue[file.name], 'progress', percentCompleted)
|
showError(err.response.data.message)
|
||||||
},
|
|
||||||
})
|
|
||||||
} catch (err) {
|
|
||||||
if (err.response.data.status === 409) {
|
|
||||||
this.overwriteAttachment = err.response.data.data
|
|
||||||
this.modalShow = true
|
|
||||||
} else {
|
|
||||||
showError(err.response.data.message)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this.$delete(this.uploadQueue, file.name)
|
}
|
||||||
})
|
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
overrideAttachment() {
|
overrideAttachment() {
|
||||||
|
|||||||
@@ -37,12 +37,11 @@ export class AttachmentApi {
|
|||||||
return response.data
|
return response.data
|
||||||
}
|
}
|
||||||
|
|
||||||
async createAttachment({ cardId, formData, onUploadProgress }) {
|
async createAttachment({ cardId, formData }) {
|
||||||
const response = await axios({
|
const response = await axios({
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
url: this.url(`/cards/${cardId}/attachment`),
|
url: this.url(`/cards/${cardId}/attachment`),
|
||||||
data: formData,
|
data: formData,
|
||||||
onUploadProgress,
|
|
||||||
})
|
})
|
||||||
return response.data
|
return response.data
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,8 +83,8 @@ export default {
|
|||||||
commit('createAttachments', { cardId, attachments })
|
commit('createAttachments', { cardId, attachments })
|
||||||
},
|
},
|
||||||
|
|
||||||
async createAttachment({ commit }, { cardId, formData, onUploadProgress }) {
|
async createAttachment({ commit }, { cardId, formData }) {
|
||||||
const attachment = await apiClient.createAttachment({ cardId, formData, onUploadProgress })
|
const attachment = await apiClient.createAttachment({ cardId, formData })
|
||||||
commit('createAttachment', { cardId, attachment })
|
commit('createAttachment', { cardId, attachment })
|
||||||
commit('cardIncreaseAttachmentCount', cardId)
|
commit('cardIncreaseAttachmentCount', cardId)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -76,16 +76,10 @@ export default {
|
|||||||
|
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
.filter((card) => card.stackId === id)
|
.filter((card) => card.stackId === id && (getters.getSearchQuery === ''
|
||||||
.filter((card) => {
|
|| (card.title.toLowerCase().includes(getters.getSearchQuery.toLowerCase())
|
||||||
if (getters.getSearchQuery === '') {
|
|| card.description.toLowerCase().includes(getters.getSearchQuery.toLowerCase()))
|
||||||
return true
|
.sort((a, b) => a.order - b.order)))
|
||||||
}
|
|
||||||
|
|
||||||
return card.title.toLowerCase().includes(getters.getSearchQuery.toLowerCase())
|
|
||||||
|| card.description.toLowerCase().includes(getters.getSearchQuery.toLowerCase())
|
|
||||||
})
|
|
||||||
.sort((a, b) => a.order - b.order)
|
|
||||||
},
|
},
|
||||||
cardById: state => (id) => {
|
cardById: state => (id) => {
|
||||||
return state.cards.find((card) => card.id === id)
|
return state.cards.find((card) => card.id === id)
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ use OCA\Deck\Db\BoardMapper;
|
|||||||
use OCA\Deck\Db\ChangeHelper;
|
use OCA\Deck\Db\ChangeHelper;
|
||||||
use OCA\Deck\Db\LabelMapper;
|
use OCA\Deck\Db\LabelMapper;
|
||||||
use OCA\Deck\Db\StackMapper;
|
use OCA\Deck\Db\StackMapper;
|
||||||
use OCA\Deck\NoPermissionException;
|
|
||||||
use OCA\Deck\Notification\NotificationHelper;
|
use OCA\Deck\Notification\NotificationHelper;
|
||||||
use OCP\IUser;
|
use OCP\IUser;
|
||||||
use OCP\IUserManager;
|
use OCP\IUserManager;
|
||||||
@@ -261,93 +260,6 @@ class BoardServiceTest extends TestCase {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function dataAddAclExtendPermission() {
|
|
||||||
return [
|
|
||||||
[[false, false, false], [false, false, false], [false, false, false]],
|
|
||||||
[[false, false, false], [true, true, true], [false, false, false]],
|
|
||||||
|
|
||||||
// user has share permissions -> can only reshare with those
|
|
||||||
[[false, true, false], [false, false, false], [false, false, false]],
|
|
||||||
[[false, true, false], [false, true, false], [false, true, false]],
|
|
||||||
[[false, true, false], [true, true, true], [false, true, false]],
|
|
||||||
|
|
||||||
// user has write permissions -> can only reshare with those
|
|
||||||
[[true, true, false], [false, false, false], [false, false, false]],
|
|
||||||
[[true, true, false], [false, true, false], [false, true, false]],
|
|
||||||
[[true, true, false], [true, true, true], [true, true, false]],
|
|
||||||
|
|
||||||
// user has manage permissions -> can upgrade acl permissions
|
|
||||||
[[false, false, true], [true, true, true], [true, true, true]],
|
|
||||||
[[true, true, true], [false, false, true], [false, false, true]],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider dataAddAclExtendPermission
|
|
||||||
* @param $currentUserAcl
|
|
||||||
* @param $providedAcl
|
|
||||||
* @param $resultingAcl
|
|
||||||
* @throws NoPermissionException
|
|
||||||
* @throws \OCA\Deck\BadRequestException
|
|
||||||
*/
|
|
||||||
public function testAddAclExtendPermission($currentUserAcl, $providedAcl, $resultingAcl) {
|
|
||||||
$existingAcl = new Acl();
|
|
||||||
$existingAcl->setBoardId(123);
|
|
||||||
$existingAcl->setType('user');
|
|
||||||
$existingAcl->setParticipant('admin');
|
|
||||||
$existingAcl->setPermissionEdit($currentUserAcl[0]);
|
|
||||||
$existingAcl->setPermissionShare($currentUserAcl[1]);
|
|
||||||
$existingAcl->setPermissionManage($currentUserAcl[2]);
|
|
||||||
$this->permissionService->expects($this->at(0))
|
|
||||||
->method('checkPermission')
|
|
||||||
->with($this->boardMapper, 123, Acl::PERMISSION_SHARE, null);
|
|
||||||
if ($currentUserAcl[2]) {
|
|
||||||
$this->permissionService->expects($this->at(1))
|
|
||||||
->method('checkPermission')
|
|
||||||
->with($this->boardMapper, 123, Acl::PERMISSION_MANAGE, null);
|
|
||||||
} else {
|
|
||||||
$this->aclMapper->expects($this->once())
|
|
||||||
->method('findAll')
|
|
||||||
->willReturn([$existingAcl]);
|
|
||||||
$this->permissionService->expects($this->at(1))
|
|
||||||
->method('checkPermission')
|
|
||||||
->with($this->boardMapper, 123, Acl::PERMISSION_MANAGE, null)
|
|
||||||
->willThrowException(new NoPermissionException('No permission'));
|
|
||||||
$this->permissionService->expects($this->at(2))
|
|
||||||
->method('userCan')
|
|
||||||
->willReturn($currentUserAcl[0]);
|
|
||||||
$this->permissionService->expects($this->at(3))
|
|
||||||
->method('userCan')
|
|
||||||
->willReturn($currentUserAcl[1]);
|
|
||||||
$this->permissionService->expects($this->at(4))
|
|
||||||
->method('userCan')
|
|
||||||
->willReturn($currentUserAcl[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$user = $this->createMock(IUser::class);
|
|
||||||
$user->method('getUID')->willReturn('admin');
|
|
||||||
$acl = new Acl();
|
|
||||||
$acl->setBoardId(123);
|
|
||||||
$acl->setType('user');
|
|
||||||
$acl->setParticipant('admin');
|
|
||||||
$acl->setPermissionEdit($resultingAcl[0]);
|
|
||||||
$acl->setPermissionShare($resultingAcl[1]);
|
|
||||||
$acl->setPermissionManage($resultingAcl[2]);
|
|
||||||
$acl->resolveRelation('participant', function($participant) use (&$user) {
|
|
||||||
return null;
|
|
||||||
});
|
|
||||||
$this->notificationHelper->expects($this->once())
|
|
||||||
->method('sendBoardShared');
|
|
||||||
$expected = clone $acl;
|
|
||||||
$this->aclMapper->expects($this->once())
|
|
||||||
->method('insert')
|
|
||||||
->with($acl)
|
|
||||||
->willReturn($acl);
|
|
||||||
$this->assertEquals($expected, $this->service->addAcl(
|
|
||||||
123, 'user', 'admin', $providedAcl[0], $providedAcl[1], $providedAcl[2]
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testUpdateAcl() {
|
public function testUpdateAcl() {
|
||||||
$acl = new Acl();
|
$acl = new Acl();
|
||||||
$acl->setBoardId(123);
|
$acl->setBoardId(123);
|
||||||
|
|||||||
Reference in New Issue
Block a user