Merge branch 'master' into bugfix/1806

This commit is contained in:
Jakob
2020-05-15 14:10:48 +02:00
committed by GitHub
33 changed files with 709 additions and 485 deletions

View File

@@ -23,7 +23,7 @@
"classmap-authoritative": true "classmap-authoritative": true
}, },
"scripts": { "scripts": {
"lint": "find . -name \\*.php -not -path './vendor/*' -exec php -l \"{}\" \\;", "lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l",
"cs:check": "php-cs-fixer fix --dry-run --diff", "cs:check": "php-cs-fixer fix --dry-run --diff",
"cs:fix": "php-cs-fixer fix" "cs:fix": "php-cs-fixer fix"
} }

View File

@@ -60,6 +60,7 @@
@include icon-black-white('circles', 'deck', 1); @include icon-black-white('circles', 'deck', 1);
@include icon-black-white('clone', 'deck', 1); @include icon-black-white('clone', 'deck', 1);
@include icon-black-white('filter', 'deck', 1); @include icon-black-white('filter', 'deck', 1);
@include icon-black-white('filter_set', 'deck', 1);
@include icon-black-white('attach', 'deck', 1); @include icon-black-white('attach', 'deck', 1);
@include icon-black-white('reply', 'deck', 1); @include icon-black-white('reply', 'deck', 1);

1
img/filter_set.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4.233 4.233" height="16" width="16"><path d="M.52.465h3.283L2.631 1.918h-.99zm1.122 1.453h.992v1.866l-.996-.455z" paint-order="stroke fill markers"/><ellipse ry=".691" rx=".674" cy="3.461" cx="3.45" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 279 B

View File

@@ -56,7 +56,9 @@ OC.L10N.register(
"You have added the attachment {attachment} to card {card}" : "Heu afegit l'adjunt {attachment} a la targeta {card}", "You have added the attachment {attachment} to card {card}" : "Heu afegit l'adjunt {attachment} a la targeta {card}",
"{user} has added the attachment {attachment} to card {card}" : "{user} ha afegit l'adjunt {attachment} a la targeta {card}", "{user} has added the attachment {attachment} to card {card}" : "{user} ha afegit l'adjunt {attachment} a la targeta {card}",
"You have updated the attachment {attachment} on card {card}" : "Heu actualitzat l'adjunt {attachment} a la targeta {card}", "You have updated the attachment {attachment} on card {card}" : "Heu actualitzat l'adjunt {attachment} a la targeta {card}",
"{user} has updated the attachment {attachment} on card {card}" : "{user} ha actualitzat ladjunt {attachment} a la targeta {card}",
"You have deleted the attachment {attachment} from card {card}" : "Heu suprimit l'adjunt {attachment} de la targeta {card}", "You have deleted the attachment {attachment} from card {card}" : "Heu suprimit l'adjunt {attachment} de la targeta {card}",
"{user} has deleted the attachment {attachment} from card {card}" : "{user} ha suprimit l'adjunt {attachment} de la targeta {card}",
"You have restored the attachment {attachment} to card {card}" : "Heu restaurat l'adjunt {attachment} a la targeta {card}", "You have restored the attachment {attachment} to card {card}" : "Heu restaurat l'adjunt {attachment} a la targeta {card}",
"{user} has restored the attachment {attachment} to card {card}" : "{user} ha restaurat l'adjunt {attachment} a la targeta {card}", "{user} has restored the attachment {attachment} to card {card}" : "{user} ha restaurat l'adjunt {attachment} a la targeta {card}",
"You have commented on card {card}" : "Heu comentat la targeta {card}", "You have commented on card {card}" : "Heu comentat la targeta {card}",
@@ -94,60 +96,122 @@ OC.L10N.register(
"Could not write file to disk" : "No sha pogut escriure el fitxer al disc", "Could not write file to disk" : "No sha pogut escriure el fitxer al disc",
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer", "A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer",
"No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s", "No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s",
"Personal planning and team project organization" : "Planificació personal i organització de projectes en equip",
"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" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en markdown\n- 🔖 Assigneu etiquetes per una organització encara millor\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Debateu amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat", "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" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en markdown\n- 🔖 Assigneu etiquetes per una organització encara millor\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Debateu amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat",
"Create new board" : "Crea un nou tauler", "Create new board" : "Crea un nou tauler",
"new board" : "nou tauler",
"Select the board to link to a project" : "Selecciona el tauler per enllaçar a un projecte", "Select the board to link to a project" : "Selecciona el tauler per enllaçar a un projecte",
"Select board" : "Selecciona un tauler", "Select board" : "Selecciona un tauler",
"Select the card to link to a project" : "Selecciona la targeta per enllaçar a un projecte",
"Select a board" : "Selecciona un tauler",
"Select a card" : "Selecciona una targeta",
"Link to card" : "Enllaç a la targeta",
"Cancel" : "Cancel·la", "Cancel" : "Cancel·la",
"File already exists" : "El fitxer ja existeix", "File already exists" : "El fitxer ja existeix",
"A file with the name {filename} already exists." : "Ja existeix un fitxer amb el nom {filename}.",
"Do you want to overwrite it?" : "Voleu sobre-escriure'l?", "Do you want to overwrite it?" : "Voleu sobre-escriure'l?",
"Overwrite file" : "Sobreescriu el fitxer",
"Keep existing file" : "Mantén el fitxer existent",
"This board is read only" : "Aquest tauler és només de lectura",
"Drop your files to upload" : "Deixeu anar els fitxers per penjar-los",
"Archived cards" : "Targetes arxivades", "Archived cards" : "Targetes arxivades",
"Add new list" : "Afegeix una llista nova",
"List name" : "Nom de llista",
"Apply filter" : "Aplica el filtre",
"Filter by tag" : "Filtra per etiqueta",
"Filter by assigned user" : "Filtra per usuari assignat",
"Filter by due date" : "Filtra per data de venciment",
"Overdue" : "Endarrerit",
"Next 24 hours" : "Pròximes 24 hores",
"Next 7 days" : "Propers 7 dies",
"Next 30 days" : "Propers 30 dies",
"No due date" : "Sense venciment",
"Show archived cards" : "Mostra les targetes arxivades", "Show archived cards" : "Mostra les targetes arxivades",
"Toggle compact mode" : "Commuta el mode compacte", "Toggle compact mode" : "Commuta el mode compacte",
"Details" : "Detalls", "Details" : "Detalls",
"Loading board" : "Carregant tauler",
"Board not found" : "Tauler no trobat",
"Sharing" : "Compartició", "Sharing" : "Compartició",
"Tags" : "Etiquetes", "Tags" : "Etiquetes",
"Deleted items" : "Elements suprimits", "Deleted items" : "Elements suprimits",
"Timeline" : "Línia de temps", "Timeline" : "Línia de temps",
"Deleted lists" : "Llistes suprimides",
"Undo" : "Desfés", "Undo" : "Desfés",
"Deleted cards" : "Targetes suprimides", "Deleted cards" : "Targetes suprimides",
"Share board with a user, group or circle …" : "Compartir tauler amb un usuari, grup o cercle ...",
"Board owner" : "Propietari del tauler",
"(Group)" : "(Grup)", "(Group)" : "(Grup)",
"(Circle)" : "(Cercle)",
"Can edit" : "Pot editar", "Can edit" : "Pot editar",
"Can share" : "Pot compartir", "Can share" : "Pot compartir",
"Can manage" : "Pot gestionar",
"Delete" : "Eliminar", "Delete" : "Eliminar",
"Add a new stack" : "Afegeix una nova pila", "Add a new stack" : "Afegeix una nova pila",
"Delete list" : "Suprimeix la llista",
"Add card" : "Afegeix una targeta", "Add card" : "Afegeix una targeta",
"Add a new card" : "Afegir una nova targeta",
"Edit" : "Edita", "Edit" : "Edita",
"Add a new tag" : "Afegir una etiqueta nova",
"title and color value must be provided" : "sha de proporcionar el valor del títol i del color",
"Add this attachment" : "Afegeix aquest adjunt",
"Delete Attachment" : "Suprimeix ladjunt",
"Restore Attachment" : "Restaura l'adjunt",
"Assign a tag to this card…" : "Assigna una etiqueta a aquesta targeta...",
"Assign to users" : "Assigna als usuaris",
"Assign to users/groups/circles" : "Assigna a usuaris/grups/cercles",
"Assign a user to this card…" : "Assigneu un usuari a aquesta targeta...",
"Due date" : "Per la data", "Due date" : "Per la data",
"Set a due date" : "Definir una data de venciment",
"Remove due date" : "Elimina la data de venciment", "Remove due date" : "Elimina la data de venciment",
"Description" : "Descripció", "Description" : "Descripció",
"(Unsaved)" : "(No desat)",
"(Saving…)" : "(Desant…)",
"Formatting help" : "Format d'ajuda", "Formatting help" : "Format d'ajuda",
"Add Attachment" : "Afegeix un adjunt",
"Edit description" : "Edita descripció",
"View description" : "Veure descripció",
"Attachments" : "Adjunts", "Attachments" : "Adjunts",
"Comments" : "Comentaris", "Comments" : "Comentaris",
"Choose attachment" : "Triar adjunt",
"Modified" : "Darrera modificació", "Modified" : "Darrera modificació",
"Created" : "Creat", "Created" : "Creat",
"Upload attachment" : "Carrega l'adjunt", "Upload attachment" : "Carrega l'adjunt",
"No comments yet. Begin the discussion!" : "No hi ha comentaris encara. Començar la discussió!",
"Save" : "Desa", "Save" : "Desa",
"The comment cannot be empty." : "El comentari no pot estar buit.",
"The comment cannot be longer than 1000 characters." : "El comentari no pot ser més llarg que 1000 caràcters.",
"In reply to" : "En resposta a",
"Reply" : "Respon", "Reply" : "Respon",
"Update" : "Actualitza", "Update" : "Actualitza",
"(group)" : "(grup)", "(group)" : "(grup)",
"(circle)" : "(cercle)",
"Assign to me" : "Assigna'm a mi",
"Delete card" : "Suprimeix targeta", "Delete card" : "Suprimeix targeta",
"Move card" : "Mou la targeta", "Move card" : "Mou la targeta",
"Card details" : "Dades de la targeta",
"Select a stack" : "Seleccioneu una pila",
"seconds ago" : "fa uns segons", "seconds ago" : "fa uns segons",
"All boards" : "Tots els taulers",
"Archived boards" : "Taulers arxivats", "Archived boards" : "Taulers arxivats",
"Shared boards" : "Taulers compartits", "Shared boards" : "Taulers compartits",
"Settings" : "Paràmetres", "Settings" : "Paràmetres",
"Limit deck usage of groups" : "Limitar l'ús del tauler de grups",
"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." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.", "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." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.",
"New board title" : "Títol del nou tauler", "New board title" : "Títol del nou tauler",
"Share" : "Compartir", "Share" : "Compartir",
"Options" : "Opcions", "Options" : "Opcions",
"Edit board" : "Edita el tauler", "Edit board" : "Edita el tauler",
"An error occurred" : "S'ha produït un error", "An error occurred" : "S'ha produït un error",
"Clone board" : "Clonar tauler",
"Archive board" : "Arxiva tauler", "Archive board" : "Arxiva tauler",
"Unarchive board" : "Desarxiva tauler", "Unarchive board" : "Desarxiva tauler",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Esteu segur que voleu suprimir el tauler {title}? Això eliminarà totes les dades d'aquest tauler.",
"Delete the board?" : "Suprimir el tauler?",
"Delete board" : "Suprimeix tauler", "Delete board" : "Suprimeix tauler",
"Board details" : "Detalls de la junta", "Board details" : "Detalls de la junta",
"Link to a board" : "Enllaça a un tauler", "Link to a board" : "Enllaça a un tauler",
"Link to a card" : "Enllaç una targeta",
"Something went wrong" : "Alguna cosa ha anat malament",
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}" "Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}"
}, },
"nplurals=2; plural=(n != 1);"); "nplurals=2; plural=(n != 1);");

View File

@@ -54,7 +54,9 @@
"You have added the attachment {attachment} to card {card}" : "Heu afegit l'adjunt {attachment} a la targeta {card}", "You have added the attachment {attachment} to card {card}" : "Heu afegit l'adjunt {attachment} a la targeta {card}",
"{user} has added the attachment {attachment} to card {card}" : "{user} ha afegit l'adjunt {attachment} a la targeta {card}", "{user} has added the attachment {attachment} to card {card}" : "{user} ha afegit l'adjunt {attachment} a la targeta {card}",
"You have updated the attachment {attachment} on card {card}" : "Heu actualitzat l'adjunt {attachment} a la targeta {card}", "You have updated the attachment {attachment} on card {card}" : "Heu actualitzat l'adjunt {attachment} a la targeta {card}",
"{user} has updated the attachment {attachment} on card {card}" : "{user} ha actualitzat ladjunt {attachment} a la targeta {card}",
"You have deleted the attachment {attachment} from card {card}" : "Heu suprimit l'adjunt {attachment} de la targeta {card}", "You have deleted the attachment {attachment} from card {card}" : "Heu suprimit l'adjunt {attachment} de la targeta {card}",
"{user} has deleted the attachment {attachment} from card {card}" : "{user} ha suprimit l'adjunt {attachment} de la targeta {card}",
"You have restored the attachment {attachment} to card {card}" : "Heu restaurat l'adjunt {attachment} a la targeta {card}", "You have restored the attachment {attachment} to card {card}" : "Heu restaurat l'adjunt {attachment} a la targeta {card}",
"{user} has restored the attachment {attachment} to card {card}" : "{user} ha restaurat l'adjunt {attachment} a la targeta {card}", "{user} has restored the attachment {attachment} to card {card}" : "{user} ha restaurat l'adjunt {attachment} a la targeta {card}",
"You have commented on card {card}" : "Heu comentat la targeta {card}", "You have commented on card {card}" : "Heu comentat la targeta {card}",
@@ -92,60 +94,122 @@
"Could not write file to disk" : "No sha pogut escriure el fitxer al disc", "Could not write file to disk" : "No sha pogut escriure el fitxer al disc",
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer", "A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer",
"No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s", "No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s",
"Personal planning and team project organization" : "Planificació personal i organització de projectes en equip",
"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" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en markdown\n- 🔖 Assigneu etiquetes per una organització encara millor\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Debateu amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat", "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" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en markdown\n- 🔖 Assigneu etiquetes per una organització encara millor\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Debateu amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat",
"Create new board" : "Crea un nou tauler", "Create new board" : "Crea un nou tauler",
"new board" : "nou tauler",
"Select the board to link to a project" : "Selecciona el tauler per enllaçar a un projecte", "Select the board to link to a project" : "Selecciona el tauler per enllaçar a un projecte",
"Select board" : "Selecciona un tauler", "Select board" : "Selecciona un tauler",
"Select the card to link to a project" : "Selecciona la targeta per enllaçar a un projecte",
"Select a board" : "Selecciona un tauler",
"Select a card" : "Selecciona una targeta",
"Link to card" : "Enllaç a la targeta",
"Cancel" : "Cancel·la", "Cancel" : "Cancel·la",
"File already exists" : "El fitxer ja existeix", "File already exists" : "El fitxer ja existeix",
"A file with the name {filename} already exists." : "Ja existeix un fitxer amb el nom {filename}.",
"Do you want to overwrite it?" : "Voleu sobre-escriure'l?", "Do you want to overwrite it?" : "Voleu sobre-escriure'l?",
"Overwrite file" : "Sobreescriu el fitxer",
"Keep existing file" : "Mantén el fitxer existent",
"This board is read only" : "Aquest tauler és només de lectura",
"Drop your files to upload" : "Deixeu anar els fitxers per penjar-los",
"Archived cards" : "Targetes arxivades", "Archived cards" : "Targetes arxivades",
"Add new list" : "Afegeix una llista nova",
"List name" : "Nom de llista",
"Apply filter" : "Aplica el filtre",
"Filter by tag" : "Filtra per etiqueta",
"Filter by assigned user" : "Filtra per usuari assignat",
"Filter by due date" : "Filtra per data de venciment",
"Overdue" : "Endarrerit",
"Next 24 hours" : "Pròximes 24 hores",
"Next 7 days" : "Propers 7 dies",
"Next 30 days" : "Propers 30 dies",
"No due date" : "Sense venciment",
"Show archived cards" : "Mostra les targetes arxivades", "Show archived cards" : "Mostra les targetes arxivades",
"Toggle compact mode" : "Commuta el mode compacte", "Toggle compact mode" : "Commuta el mode compacte",
"Details" : "Detalls", "Details" : "Detalls",
"Loading board" : "Carregant tauler",
"Board not found" : "Tauler no trobat",
"Sharing" : "Compartició", "Sharing" : "Compartició",
"Tags" : "Etiquetes", "Tags" : "Etiquetes",
"Deleted items" : "Elements suprimits", "Deleted items" : "Elements suprimits",
"Timeline" : "Línia de temps", "Timeline" : "Línia de temps",
"Deleted lists" : "Llistes suprimides",
"Undo" : "Desfés", "Undo" : "Desfés",
"Deleted cards" : "Targetes suprimides", "Deleted cards" : "Targetes suprimides",
"Share board with a user, group or circle …" : "Compartir tauler amb un usuari, grup o cercle ...",
"Board owner" : "Propietari del tauler",
"(Group)" : "(Grup)", "(Group)" : "(Grup)",
"(Circle)" : "(Cercle)",
"Can edit" : "Pot editar", "Can edit" : "Pot editar",
"Can share" : "Pot compartir", "Can share" : "Pot compartir",
"Can manage" : "Pot gestionar",
"Delete" : "Eliminar", "Delete" : "Eliminar",
"Add a new stack" : "Afegeix una nova pila", "Add a new stack" : "Afegeix una nova pila",
"Delete list" : "Suprimeix la llista",
"Add card" : "Afegeix una targeta", "Add card" : "Afegeix una targeta",
"Add a new card" : "Afegir una nova targeta",
"Edit" : "Edita", "Edit" : "Edita",
"Add a new tag" : "Afegir una etiqueta nova",
"title and color value must be provided" : "sha de proporcionar el valor del títol i del color",
"Add this attachment" : "Afegeix aquest adjunt",
"Delete Attachment" : "Suprimeix ladjunt",
"Restore Attachment" : "Restaura l'adjunt",
"Assign a tag to this card…" : "Assigna una etiqueta a aquesta targeta...",
"Assign to users" : "Assigna als usuaris",
"Assign to users/groups/circles" : "Assigna a usuaris/grups/cercles",
"Assign a user to this card…" : "Assigneu un usuari a aquesta targeta...",
"Due date" : "Per la data", "Due date" : "Per la data",
"Set a due date" : "Definir una data de venciment",
"Remove due date" : "Elimina la data de venciment", "Remove due date" : "Elimina la data de venciment",
"Description" : "Descripció", "Description" : "Descripció",
"(Unsaved)" : "(No desat)",
"(Saving…)" : "(Desant…)",
"Formatting help" : "Format d'ajuda", "Formatting help" : "Format d'ajuda",
"Add Attachment" : "Afegeix un adjunt",
"Edit description" : "Edita descripció",
"View description" : "Veure descripció",
"Attachments" : "Adjunts", "Attachments" : "Adjunts",
"Comments" : "Comentaris", "Comments" : "Comentaris",
"Choose attachment" : "Triar adjunt",
"Modified" : "Darrera modificació", "Modified" : "Darrera modificació",
"Created" : "Creat", "Created" : "Creat",
"Upload attachment" : "Carrega l'adjunt", "Upload attachment" : "Carrega l'adjunt",
"No comments yet. Begin the discussion!" : "No hi ha comentaris encara. Començar la discussió!",
"Save" : "Desa", "Save" : "Desa",
"The comment cannot be empty." : "El comentari no pot estar buit.",
"The comment cannot be longer than 1000 characters." : "El comentari no pot ser més llarg que 1000 caràcters.",
"In reply to" : "En resposta a",
"Reply" : "Respon", "Reply" : "Respon",
"Update" : "Actualitza", "Update" : "Actualitza",
"(group)" : "(grup)", "(group)" : "(grup)",
"(circle)" : "(cercle)",
"Assign to me" : "Assigna'm a mi",
"Delete card" : "Suprimeix targeta", "Delete card" : "Suprimeix targeta",
"Move card" : "Mou la targeta", "Move card" : "Mou la targeta",
"Card details" : "Dades de la targeta",
"Select a stack" : "Seleccioneu una pila",
"seconds ago" : "fa uns segons", "seconds ago" : "fa uns segons",
"All boards" : "Tots els taulers",
"Archived boards" : "Taulers arxivats", "Archived boards" : "Taulers arxivats",
"Shared boards" : "Taulers compartits", "Shared boards" : "Taulers compartits",
"Settings" : "Paràmetres", "Settings" : "Paràmetres",
"Limit deck usage of groups" : "Limitar l'ús del tauler de grups",
"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." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.", "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." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.",
"New board title" : "Títol del nou tauler", "New board title" : "Títol del nou tauler",
"Share" : "Compartir", "Share" : "Compartir",
"Options" : "Opcions", "Options" : "Opcions",
"Edit board" : "Edita el tauler", "Edit board" : "Edita el tauler",
"An error occurred" : "S'ha produït un error", "An error occurred" : "S'ha produït un error",
"Clone board" : "Clonar tauler",
"Archive board" : "Arxiva tauler", "Archive board" : "Arxiva tauler",
"Unarchive board" : "Desarxiva tauler", "Unarchive board" : "Desarxiva tauler",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Esteu segur que voleu suprimir el tauler {title}? Això eliminarà totes les dades d'aquest tauler.",
"Delete the board?" : "Suprimir el tauler?",
"Delete board" : "Suprimeix tauler", "Delete board" : "Suprimeix tauler",
"Board details" : "Detalls de la junta", "Board details" : "Detalls de la junta",
"Link to a board" : "Enllaça a un tauler", "Link to a board" : "Enllaça a un tauler",
"Link to a card" : "Enllaç una targeta",
"Something went wrong" : "Alguna cosa ha anat malament",
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}" "Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"
} }

View File

@@ -135,7 +135,7 @@ OC.L10N.register(
"Tags" : "Schlagworte", "Tags" : "Schlagworte",
"Deleted items" : "Gelöschte Objekte", "Deleted items" : "Gelöschte Objekte",
"Timeline" : "Zeitachse", "Timeline" : "Zeitachse",
"Deleted lists" : "Listen löschen", "Deleted lists" : "Gelöschte Listen",
"Undo" : "Rückgängig", "Undo" : "Rückgängig",
"Deleted cards" : "Gelöschte Karten", "Deleted cards" : "Gelöschte Karten",
"Share board with a user, group or circle …" : "Board mit Benutzer, Gruppe oder Kreis teilen …", "Share board with a user, group or circle …" : "Board mit Benutzer, Gruppe oder Kreis teilen …",

View File

@@ -133,7 +133,7 @@
"Tags" : "Schlagworte", "Tags" : "Schlagworte",
"Deleted items" : "Gelöschte Objekte", "Deleted items" : "Gelöschte Objekte",
"Timeline" : "Zeitachse", "Timeline" : "Zeitachse",
"Deleted lists" : "Listen löschen", "Deleted lists" : "Gelöschte Listen",
"Undo" : "Rückgängig", "Undo" : "Rückgängig",
"Deleted cards" : "Gelöschte Karten", "Deleted cards" : "Gelöschte Karten",
"Share board with a user, group or circle …" : "Board mit Benutzer, Gruppe oder Kreis teilen …", "Share board with a user, group or circle …" : "Board mit Benutzer, Gruppe oder Kreis teilen …",

View File

@@ -135,7 +135,7 @@ OC.L10N.register(
"Tags" : "Schlagworte", "Tags" : "Schlagworte",
"Deleted items" : "Gelöschte Objekte", "Deleted items" : "Gelöschte Objekte",
"Timeline" : "Zeitachse", "Timeline" : "Zeitachse",
"Deleted lists" : "Listen löschen", "Deleted lists" : "Gelöschte Listen",
"Undo" : "Rückgängig", "Undo" : "Rückgängig",
"Deleted cards" : "Gelöschte Karten", "Deleted cards" : "Gelöschte Karten",
"Share board with a user, group or circle …" : "Board mit Benutzer, Gruppe oder Kreis teilen …", "Share board with a user, group or circle …" : "Board mit Benutzer, Gruppe oder Kreis teilen …",

View File

@@ -133,7 +133,7 @@
"Tags" : "Schlagworte", "Tags" : "Schlagworte",
"Deleted items" : "Gelöschte Objekte", "Deleted items" : "Gelöschte Objekte",
"Timeline" : "Zeitachse", "Timeline" : "Zeitachse",
"Deleted lists" : "Listen löschen", "Deleted lists" : "Gelöschte Listen",
"Undo" : "Rückgängig", "Undo" : "Rückgängig",
"Deleted cards" : "Gelöschte Karten", "Deleted cards" : "Gelöschte Karten",
"Share board with a user, group or circle …" : "Board mit Benutzer, Gruppe oder Kreis teilen …", "Share board with a user, group or circle …" : "Board mit Benutzer, Gruppe oder Kreis teilen …",

View File

@@ -101,6 +101,7 @@ OC.L10N.register(
"Do you want to overwrite it?" : "Vil du overskrive?", "Do you want to overwrite it?" : "Vil du overskrive?",
"Archived cards" : "Arkiver tavle", "Archived cards" : "Arkiver tavle",
"Filter by tag" : "Filtrer på knagg", "Filter by tag" : "Filtrer på knagg",
"Overdue" : "Utløpt",
"Show archived cards" : "Vis arkiverkte kort", "Show archived cards" : "Vis arkiverkte kort",
"Toggle compact mode" : "Endre kompakt modus", "Toggle compact mode" : "Endre kompakt modus",
"Details" : "Detaljer", "Details" : "Detaljer",
@@ -114,6 +115,7 @@ OC.L10N.register(
"Can share" : "Kan dele", "Can share" : "Kan dele",
"Delete" : "Slett", "Delete" : "Slett",
"Add a new stack" : "Legg til en ny stabel", "Add a new stack" : "Legg til en ny stabel",
"Delete list" : "Slett listen",
"Add card" : "Legg til kort", "Add card" : "Legg til kort",
"Edit" : "Rediger", "Edit" : "Rediger",
"Due date" : "Forfallsdato", "Due date" : "Forfallsdato",

View File

@@ -99,6 +99,7 @@
"Do you want to overwrite it?" : "Vil du overskrive?", "Do you want to overwrite it?" : "Vil du overskrive?",
"Archived cards" : "Arkiver tavle", "Archived cards" : "Arkiver tavle",
"Filter by tag" : "Filtrer på knagg", "Filter by tag" : "Filtrer på knagg",
"Overdue" : "Utløpt",
"Show archived cards" : "Vis arkiverkte kort", "Show archived cards" : "Vis arkiverkte kort",
"Toggle compact mode" : "Endre kompakt modus", "Toggle compact mode" : "Endre kompakt modus",
"Details" : "Detaljer", "Details" : "Detaljer",
@@ -112,6 +113,7 @@
"Can share" : "Kan dele", "Can share" : "Kan dele",
"Delete" : "Slett", "Delete" : "Slett",
"Add a new stack" : "Legg til en ny stabel", "Add a new stack" : "Legg til en ny stabel",
"Delete list" : "Slett listen",
"Add card" : "Legg til kort", "Add card" : "Legg til kort",
"Edit" : "Rediger", "Edit" : "Rediger",
"Due date" : "Forfallsdato", "Due date" : "Forfallsdato",

View File

@@ -128,13 +128,13 @@ OC.L10N.register(
"No due date" : "Без назначенной даты", "No due date" : "Без назначенной даты",
"Show archived cards" : "Показать архивные карточки", "Show archived cards" : "Показать архивные карточки",
"Toggle compact mode" : "Переключение в компактный режим и обратно", "Toggle compact mode" : "Переключение в компактный режим и обратно",
"Details" : "Подробнее", "Details" : "Свойства",
"Loading board" : "Загрузка доски", "Loading board" : "Загрузка доски",
"Board not found" : "Доска не найдена", "Board not found" : "Доска не найдена",
"Sharing" : "Общий доступ", "Sharing" : "Общий доступ",
"Tags" : "Метки", "Tags" : "Метки",
"Deleted items" : "Объекты в корзине", "Deleted items" : "Объекты в корзине",
"Timeline" : "Шкала времени", "Timeline" : "История",
"Deleted lists" : "Удалённые списки", "Deleted lists" : "Удалённые списки",
"Undo" : "Отменить", "Undo" : "Отменить",
"Deleted cards" : "Карточки в корзине", "Deleted cards" : "Карточки в корзине",
@@ -188,7 +188,7 @@ OC.L10N.register(
"Assign to me" : "Назначить себе", "Assign to me" : "Назначить себе",
"Delete card" : "Удалить", "Delete card" : "Удалить",
"Move card" : "Переместить карточку", "Move card" : "Переместить карточку",
"Card details" : "Подробные сведения", "Card details" : "Свойства карточки",
"Select a stack" : "Выберите стопку", "Select a stack" : "Выберите стопку",
"seconds ago" : "несколько секунд назад", "seconds ago" : "несколько секунд назад",
"All boards" : "Все доски", "All boards" : "Все доски",
@@ -208,7 +208,7 @@ OC.L10N.register(
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Подтвердите удаление доски «{title}»; это действие приведёт к удалению также все данных, принадлежащих этой доске.", "Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Подтвердите удаление доски «{title}»; это действие приведёт к удалению также все данных, принадлежащих этой доске.",
"Delete the board?" : "Удалить доску?", "Delete the board?" : "Удалить доску?",
"Delete board" : "Удалить доску", "Delete board" : "Удалить доску",
"Board details" : "Подробные сведения", "Board details" : "Свойства доски",
"Link to a board" : "Ссылка на доску", "Link to a board" : "Ссылка на доску",
"Link to a card" : "Ссылка на карточку", "Link to a card" : "Ссылка на карточку",
"Something went wrong" : "Неизвестная ошибка", "Something went wrong" : "Неизвестная ошибка",

View File

@@ -126,13 +126,13 @@
"No due date" : "Без назначенной даты", "No due date" : "Без назначенной даты",
"Show archived cards" : "Показать архивные карточки", "Show archived cards" : "Показать архивные карточки",
"Toggle compact mode" : "Переключение в компактный режим и обратно", "Toggle compact mode" : "Переключение в компактный режим и обратно",
"Details" : "Подробнее", "Details" : "Свойства",
"Loading board" : "Загрузка доски", "Loading board" : "Загрузка доски",
"Board not found" : "Доска не найдена", "Board not found" : "Доска не найдена",
"Sharing" : "Общий доступ", "Sharing" : "Общий доступ",
"Tags" : "Метки", "Tags" : "Метки",
"Deleted items" : "Объекты в корзине", "Deleted items" : "Объекты в корзине",
"Timeline" : "Шкала времени", "Timeline" : "История",
"Deleted lists" : "Удалённые списки", "Deleted lists" : "Удалённые списки",
"Undo" : "Отменить", "Undo" : "Отменить",
"Deleted cards" : "Карточки в корзине", "Deleted cards" : "Карточки в корзине",
@@ -186,7 +186,7 @@
"Assign to me" : "Назначить себе", "Assign to me" : "Назначить себе",
"Delete card" : "Удалить", "Delete card" : "Удалить",
"Move card" : "Переместить карточку", "Move card" : "Переместить карточку",
"Card details" : "Подробные сведения", "Card details" : "Свойства карточки",
"Select a stack" : "Выберите стопку", "Select a stack" : "Выберите стопку",
"seconds ago" : "несколько секунд назад", "seconds ago" : "несколько секунд назад",
"All boards" : "Все доски", "All boards" : "Все доски",
@@ -206,7 +206,7 @@
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Подтвердите удаление доски «{title}»; это действие приведёт к удалению также все данных, принадлежащих этой доске.", "Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Подтвердите удаление доски «{title}»; это действие приведёт к удалению также все данных, принадлежащих этой доске.",
"Delete the board?" : "Удалить доску?", "Delete the board?" : "Удалить доску?",
"Delete board" : "Удалить доску", "Delete board" : "Удалить доску",
"Board details" : "Подробные сведения", "Board details" : "Свойства доски",
"Link to a board" : "Ссылка на доску", "Link to a board" : "Ссылка на доску",
"Link to a card" : "Ссылка на карточку", "Link to a card" : "Ссылка на карточку",
"Something went wrong" : "Неизвестная ошибка", "Something went wrong" : "Неизвестная ошибка",

View File

@@ -39,6 +39,7 @@ OC.L10N.register(
"Attachments" : "Вкладення", "Attachments" : "Вкладення",
"Comments" : "Коментарі", "Comments" : "Коментарі",
"Modified" : "Змінено", "Modified" : "Змінено",
"Upload attachment" : "Завантажити вкладення",
"Save" : "Зберегти", "Save" : "Зберегти",
"Reply" : "Відповісти", "Reply" : "Відповісти",
"Update" : "Оновлення", "Update" : "Оновлення",

View File

@@ -37,6 +37,7 @@
"Attachments" : "Вкладення", "Attachments" : "Вкладення",
"Comments" : "Коментарі", "Comments" : "Коментарі",
"Modified" : "Змінено", "Modified" : "Змінено",
"Upload attachment" : "Завантажити вкладення",
"Save" : "Зберегти", "Save" : "Зберегти",
"Reply" : "Відповісти", "Reply" : "Відповісти",
"Update" : "Оновлення", "Update" : "Оновлення",

View File

@@ -153,6 +153,6 @@ class BoardController extends ApiController {
* @return \OCP\Deck\DB\Board * @return \OCP\Deck\DB\Board
*/ */
public function clone($boardId) { public function clone($boardId) {
return $this->boardService->clone($boardId); return $this->boardService->clone($boardId, $this->userId);
} }
} }

View File

@@ -621,13 +621,14 @@ class BoardService {
/** /**
* @param $id * @param $id
* @param $userId
* @return Board * @return Board
* @throws DoesNotExistException * @throws DoesNotExistException
* @throws \OCA\Deck\NoPermissionException * @throws \OCA\Deck\NoPermissionException
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @throws BadRequestException * @throws BadRequestException
*/ */
public function clone($id) { public function clone($id, $userId) {
if (is_numeric($id) === false) { if (is_numeric($id) === false) {
throw new BadRequestException('board id must be a number'); throw new BadRequestException('board id must be a number');
} }
@@ -637,7 +638,7 @@ class BoardService {
$board = $this->boardMapper->find($id); $board = $this->boardMapper->find($id);
$newBoard = new Board(); $newBoard = new Board();
$newBoard->setTitle($board->getTitle() . ' (' . $this->l10n->t('copy') . ')'); $newBoard->setTitle($board->getTitle() . ' (' . $this->l10n->t('copy') . ')');
$newBoard->setOwner($board->getOwner()); $newBoard->setOwner($userId);
$newBoard->setColor($board->getColor()); $newBoard->setColor($board->getColor());
$permissions = $this->permissionService->matchPermissions($board); $permissions = $this->permissionService->matchPermissions($board);
$newBoard->setPermissions([ $newBoard->setPermissions([

458
package-lock.json generated
View File

@@ -2835,18 +2835,18 @@
"integrity": "sha512-f+sKpdLZXkODV+OY39K1M+Spmd4RgxmtEXmNn4Bviv4R7uBFHXuw+JX9ZdfDeOryfHjJ/TRQxQEp0GMpBwZFUw==" "integrity": "sha512-f+sKpdLZXkODV+OY39K1M+Spmd4RgxmtEXmNn4Bviv4R7uBFHXuw+JX9ZdfDeOryfHjJ/TRQxQEp0GMpBwZFUw=="
}, },
"@nextcloud/dialogs": { "@nextcloud/dialogs": {
"version": "1.2.2", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-1.2.2.tgz", "resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-1.3.0.tgz",
"integrity": "sha512-N8A8J8UKSvz/hqNcm7gwpm70uAAsx0wurjhdYZ989jaMho+H/Hinjd2jkbV8UnsYYw0x/vWvEX5t6Lwbv08K0g==", "integrity": "sha512-Fm/SEcd8DNZzmn/2Uv9O/5sweXkcywqnJuhK5xH3P0c5Ug3Z/mJwGP3EXgLtyjgQUJtmY1DBahqiUYsVNdDkng==",
"requires": { "requires": {
"core-js": "3.6.4", "core-js": "^3.6.4",
"toastify-js": "^1.7.0" "toastify-js": "^1.7.0"
}, },
"dependencies": { "dependencies": {
"core-js": { "core-js": {
"version": "3.6.4", "version": "3.6.5",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
"integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
} }
} }
}, },
@@ -3296,9 +3296,9 @@
} }
}, },
"@vue/test-utils": { "@vue/test-utils": {
"version": "1.0.0-beta.33", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.0-beta.33.tgz", "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.2.tgz",
"integrity": "sha512-Xzqoe0lTLn3QRWfjhmKPOXYR86l0Y+g/zPHaheJQOkPLj5ojJl3rG0t4F3kXFWuLD88YzUVRMIBWOG7v9KOJQQ==", "integrity": "sha512-pnRWJbb0cLqjSJIKRpqoSISeYtufEn8D16VmhlCrDWIVt4iAY4Og4JpOPmFytvtQVz96p6n7T6ERI55ue6n0Ew==",
"dev": true, "dev": true,
"requires": { "requires": {
"dom-event-types": "^1.0.0", "dom-event-types": "^1.0.0",
@@ -3516,9 +3516,9 @@
} }
}, },
"acorn": { "acorn": {
"version": "7.1.1", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz",
"integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==",
"dev": true "dev": true
}, },
"acorn-globals": { "acorn-globals": {
@@ -4906,9 +4906,9 @@
"dev": true "dev": true
}, },
"blueimp-md5": { "blueimp-md5": {
"version": "2.13.0", "version": "2.15.0",
"resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.13.0.tgz", "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.15.0.tgz",
"integrity": "sha512-lmp0m647R5e77ORduxLW5mISIDcvgJZa52vMBv5uVI3UmSWTQjkJsZVBfaFqQPw/QFogJwvY6e3Gl9nP+Loe+Q==" "integrity": "sha512-Zc6sowqlCWu3+V0bocZwdaPPXlRv14EHtYcQDCOghj9EdyKLMkAOODBh3HHAx5r7QRylDYCOaXa/b/edgBLDpA=="
}, },
"bn.js": { "bn.js": {
"version": "4.11.8", "version": "4.11.8",
@@ -6575,9 +6575,9 @@
} }
}, },
"dompurify": { "dompurify": {
"version": "2.0.10", "version": "2.0.11",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.0.10.tgz", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.0.11.tgz",
"integrity": "sha512-ok1dcSztsIuVxWG6Cx0ujyDIzNclz9W9OIU0cOb0IT+VAtSLrOelZF4miUvSm1U4PoCw8D7sIOLCnCQOaVpr3w==" "integrity": "sha512-qVoGPjIW9IqxRij7klDQQ2j6nSe4UNWANBhZNLnsS7ScTtLb+3YdxkRY8brNTpkUiTtcXsCJO+jS0UCDfenLuA=="
}, },
"domutils": { "domutils": {
"version": "1.7.0", "version": "1.7.0",
@@ -9093,9 +9093,9 @@
"integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg=="
}, },
"get-caller-file": { "get-caller-file": {
"version": "1.0.3", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true "dev": true
}, },
"get-stdin": { "get-stdin": {
@@ -9537,12 +9537,6 @@
"toidentifier": "1.0.0" "toidentifier": "1.0.0"
} }
}, },
"http-parser-js": {
"version": "0.4.10",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
"integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
"dev": true
},
"http-proxy": { "http-proxy": {
"version": "1.18.0", "version": "1.18.0",
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz",
@@ -13305,9 +13299,9 @@
"integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ=="
}, },
"node-sass": { "node-sass": {
"version": "4.14.0", "version": "4.14.1",
"resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.0.tgz", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz",
"integrity": "sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw==", "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==",
"dev": true, "dev": true,
"requires": { "requires": {
"async-foreach": "^0.1.3", "async-foreach": "^0.1.3",
@@ -13324,7 +13318,7 @@
"node-gyp": "^3.8.0", "node-gyp": "^3.8.0",
"npmlog": "^4.0.0", "npmlog": "^4.0.0",
"request": "^2.88.0", "request": "^2.88.0",
"sass-graph": "^2.2.4", "sass-graph": "2.2.5",
"stdout-stream": "^1.4.0", "stdout-stream": "^1.4.0",
"true-case-path": "^1.0.2" "true-case-path": "^1.0.2"
}, },
@@ -13773,9 +13767,9 @@
"dev": true "dev": true
}, },
"p-queue": { "p-queue": {
"version": "6.3.0", "version": "6.4.0",
"resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.3.0.tgz", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.4.0.tgz",
"integrity": "sha512-fg5dJlFpd5+3CgG3/0ogpVZUeJbjiyXFg0nu53hrOYsybqSiDyxyOpad0Rm6tAiGjgztAwkyvhlYHC53OiAJOA==", "integrity": "sha512-X7ddxxiQ+bLR/CUt3/BVKrGcJDNxBr0pEEFKHHB6vTPWNUhgDv36GpIH18RmGM3YGPpBT+JWGjDDqsVGuF0ERw==",
"requires": { "requires": {
"eventemitter3": "^4.0.0", "eventemitter3": "^4.0.0",
"p-timeout": "^3.1.0" "p-timeout": "^3.1.0"
@@ -14073,9 +14067,9 @@
"integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ=="
}, },
"portfinder": { "portfinder": {
"version": "1.0.25", "version": "1.0.26",
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz",
"integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"async": "^2.6.2", "async": "^2.6.2",
@@ -15148,9 +15142,9 @@
"dev": true "dev": true
}, },
"request": { "request": {
"version": "2.88.0", "version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
"integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"dev": true, "dev": true,
"requires": { "requires": {
"aws-sign2": "~0.7.0", "aws-sign2": "~0.7.0",
@@ -15160,7 +15154,7 @@
"extend": "~3.0.2", "extend": "~3.0.2",
"forever-agent": "~0.6.1", "forever-agent": "~0.6.1",
"form-data": "~2.3.2", "form-data": "~2.3.2",
"har-validator": "~5.1.0", "har-validator": "~5.1.3",
"http-signature": "~1.2.0", "http-signature": "~1.2.0",
"is-typedarray": "~1.0.0", "is-typedarray": "~1.0.0",
"isstream": "~0.1.2", "isstream": "~0.1.2",
@@ -15170,25 +15164,19 @@
"performance-now": "^2.1.0", "performance-now": "^2.1.0",
"qs": "~6.5.2", "qs": "~6.5.2",
"safe-buffer": "^5.1.2", "safe-buffer": "^5.1.2",
"tough-cookie": "~2.4.3", "tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0", "tunnel-agent": "^0.6.0",
"uuid": "^3.3.2" "uuid": "^3.3.2"
}, },
"dependencies": { "dependencies": {
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
"dev": true
},
"tough-cookie": { "tough-cookie": {
"version": "2.4.3", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"dev": true, "dev": true,
"requires": { "requires": {
"psl": "^1.1.24", "psl": "^1.1.28",
"punycode": "^1.4.1" "punycode": "^2.1.1"
} }
} }
} }
@@ -15705,177 +15693,118 @@
} }
}, },
"sass-graph": { "sass-graph": {
"version": "2.2.4", "version": "2.2.5",
"resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz",
"integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==",
"dev": true, "dev": true,
"requires": { "requires": {
"glob": "^7.0.0", "glob": "^7.0.0",
"lodash": "^4.0.0", "lodash": "^4.0.0",
"scss-tokenizer": "^0.2.3", "scss-tokenizer": "^0.2.3",
"yargs": "^7.0.0" "yargs": "^13.3.2"
}, },
"dependencies": { "dependencies": {
"camelcase": { "ansi-regex": {
"version": "3.0.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true "dev": true
}, },
"cliui": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
"dev": true,
"requires": {
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1",
"wrap-ansi": "^2.0.0"
}
},
"find-up": { "find-up": {
"version": "1.1.2", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true, "dev": true,
"requires": { "requires": {
"path-exists": "^2.0.0", "locate-path": "^3.0.0"
"pinkie-promise": "^2.0.0"
} }
}, },
"invert-kv": { "get-caller-file": {
"version": "1.0.0", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true "dev": true
}, },
"lcid": { "locate-path": {
"version": "1.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true, "dev": true,
"requires": { "requires": {
"invert-kv": "^1.0.0" "p-locate": "^3.0.0",
"path-exists": "^3.0.0"
} }
}, },
"load-json-file": { "p-limit": {
"version": "1.1.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true, "dev": true,
"requires": { "requires": {
"graceful-fs": "^4.1.2", "p-try": "^2.0.0"
"parse-json": "^2.2.0",
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0",
"strip-bom": "^2.0.0"
} }
}, },
"os-locale": { "p-locate": {
"version": "1.4.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"lcid": "^1.0.0" "p-limit": "^2.0.0"
} }
}, },
"path-exists": { "p-try": {
"version": "2.1.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
"requires": {
"pinkie-promise": "^2.0.0"
}
},
"path-type": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
"integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0"
}
},
"read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
"integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
"dev": true,
"requires": {
"load-json-file": "^1.0.0",
"normalize-package-data": "^2.3.2",
"path-type": "^1.0.0"
}
},
"read-pkg-up": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
"integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
"dev": true,
"requires": {
"find-up": "^1.0.0",
"read-pkg": "^1.0.0"
}
},
"require-main-filename": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
"dev": true "dev": true
}, },
"strip-bom": { "string-width": {
"version": "2.0.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true, "dev": true,
"requires": { "requires": {
"is-utf8": "^0.2.0" "emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
} }
}, },
"which-module": { "strip-ansi": {
"version": "1.0.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true "dev": true,
}, "requires": {
"y18n": { "ansi-regex": "^4.1.0"
"version": "3.2.1", }
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
"integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
"dev": true
}, },
"yargs": { "yargs": {
"version": "7.1.0", "version": "13.3.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
"integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
"dev": true, "dev": true,
"requires": { "requires": {
"camelcase": "^3.0.0", "cliui": "^5.0.0",
"cliui": "^3.2.0", "find-up": "^3.0.0",
"decamelize": "^1.1.1", "get-caller-file": "^2.0.1",
"get-caller-file": "^1.0.1",
"os-locale": "^1.4.0",
"read-pkg-up": "^1.0.1",
"require-directory": "^2.1.1", "require-directory": "^2.1.1",
"require-main-filename": "^1.0.1", "require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0", "set-blocking": "^2.0.0",
"string-width": "^1.0.2", "string-width": "^3.0.0",
"which-module": "^1.0.0", "which-module": "^2.0.0",
"y18n": "^3.2.1", "y18n": "^4.0.0",
"yargs-parser": "^5.0.0" "yargs-parser": "^13.1.2"
} }
}, },
"yargs-parser": { "yargs-parser": {
"version": "5.0.0", "version": "13.1.2",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
"integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
"dev": true, "dev": true,
"requires": { "requires": {
"camelcase": "^3.0.0" "camelcase": "^5.0.0",
"decamelize": "^1.2.0"
} }
} }
} }
@@ -16376,13 +16305,22 @@
} }
}, },
"sockjs": { "sockjs": {
"version": "0.3.19", "version": "0.3.20",
"resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz",
"integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==",
"dev": true, "dev": true,
"requires": { "requires": {
"faye-websocket": "^0.10.0", "faye-websocket": "^0.10.0",
"uuid": "^3.0.1" "uuid": "^3.4.0",
"websocket-driver": "0.6.5"
},
"dependencies": {
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"dev": true
}
} }
}, },
"sockjs-client": { "sockjs-client": {
@@ -17464,46 +17402,35 @@
} }
}, },
"stylelint-scss": { "stylelint-scss": {
"version": "3.17.1", "version": "3.17.2",
"resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.17.1.tgz", "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.17.2.tgz",
"integrity": "sha512-KywqqHfK1otZv1QJA4xJDgcPJp1/cP3jnABpbU9gmXOKqKt8cNt27Imsh9JhY133X8D4zDh/38pNq4WjVfUQWQ==", "integrity": "sha512-e0dmxqsofy/HZj4urcGSJw4S6yHDJxiQdT20/1ciCsd5lomisa7YM4+Qtt1EG4hsqEG1dbEeF855tec1UyqcSA==",
"dev": true, "dev": true,
"requires": { "requires": {
"lodash": "^4.17.15", "lodash": "^4.17.15",
"postcss-media-query-parser": "^0.2.3", "postcss-media-query-parser": "^0.2.3",
"postcss-resolve-nested-selector": "^0.1.1", "postcss-resolve-nested-selector": "^0.1.1",
"postcss-selector-parser": "^6.0.2", "postcss-selector-parser": "^6.0.2",
"postcss-value-parser": "^4.0.3" "postcss-value-parser": "^4.1.0"
}, },
"dependencies": { "dependencies": {
"postcss-selector-parser": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
"integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
"indexes-of": "^1.0.1",
"uniq": "^1.0.1"
}
},
"postcss-value-parser": { "postcss-value-parser": {
"version": "4.0.3", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
"integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
"dev": true "dev": true
} }
} }
}, },
"stylelint-webpack-plugin": { "stylelint-webpack-plugin": {
"version": "1.2.3", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/stylelint-webpack-plugin/-/stylelint-webpack-plugin-1.2.3.tgz", "resolved": "https://registry.npmjs.org/stylelint-webpack-plugin/-/stylelint-webpack-plugin-2.0.0.tgz",
"integrity": "sha512-XEevZZzlI6k3e0Amp7AtpZ/elgaOdPPwLFY9InNoajw4KNRcZTkK61ZsZdHvIyK32Ej9L9u4fwfXG2QGKW0imA==", "integrity": "sha512-tN7AnjntcmDnCSxhFgBYctelmth+CQMTSfPeIXpN/9vbkm4747FFaUKOzgWJa4UyAPl98wh8SAhVtqV5Qdxsug==",
"dev": true, "dev": true,
"requires": { "requires": {
"arrify": "^2.0.1", "arrify": "^2.0.1",
"micromatch": "^4.0.2", "micromatch": "^4.0.2",
"schema-utils": "^2.6.1" "schema-utils": "^2.6.6"
}, },
"dependencies": { "dependencies": {
"arrify": { "arrify": {
@@ -19078,17 +19005,17 @@
}, },
"dependencies": { "dependencies": {
"mime": { "mime": {
"version": "2.4.4", "version": "2.4.5",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz",
"integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==",
"dev": true "dev": true
} }
} }
}, },
"webpack-dev-server": { "webpack-dev-server": {
"version": "3.10.3", "version": "3.11.0",
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz",
"integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==",
"dev": true, "dev": true,
"requires": { "requires": {
"ansi-html": "0.0.7", "ansi-html": "0.0.7",
@@ -19099,60 +19026,38 @@
"debug": "^4.1.1", "debug": "^4.1.1",
"del": "^4.1.1", "del": "^4.1.1",
"express": "^4.17.1", "express": "^4.17.1",
"html-entities": "^1.2.1", "html-entities": "^1.3.1",
"http-proxy-middleware": "0.19.1", "http-proxy-middleware": "0.19.1",
"import-local": "^2.0.0", "import-local": "^2.0.0",
"internal-ip": "^4.3.0", "internal-ip": "^4.3.0",
"ip": "^1.1.5", "ip": "^1.1.5",
"is-absolute-url": "^3.0.3", "is-absolute-url": "^3.0.3",
"killable": "^1.0.1", "killable": "^1.0.1",
"loglevel": "^1.6.6", "loglevel": "^1.6.8",
"opn": "^5.5.0", "opn": "^5.5.0",
"p-retry": "^3.0.1", "p-retry": "^3.0.1",
"portfinder": "^1.0.25", "portfinder": "^1.0.26",
"schema-utils": "^1.0.0", "schema-utils": "^1.0.0",
"selfsigned": "^1.10.7", "selfsigned": "^1.10.7",
"semver": "^6.3.0", "semver": "^6.3.0",
"serve-index": "^1.9.1", "serve-index": "^1.9.1",
"sockjs": "0.3.19", "sockjs": "0.3.20",
"sockjs-client": "1.4.0", "sockjs-client": "1.4.0",
"spdy": "^4.0.1", "spdy": "^4.0.2",
"strip-ansi": "^3.0.1", "strip-ansi": "^3.0.1",
"supports-color": "^6.1.0", "supports-color": "^6.1.0",
"url": "^0.11.0", "url": "^0.11.0",
"webpack-dev-middleware": "^3.7.2", "webpack-dev-middleware": "^3.7.2",
"webpack-log": "^2.0.0", "webpack-log": "^2.0.0",
"ws": "^6.2.1", "ws": "^6.2.1",
"yargs": "12.0.5" "yargs": "^13.3.2"
}, },
"dependencies": { "dependencies": {
"ansi-regex": { "ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
"dev": true
},
"cliui": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true, "dev": true
"requires": {
"string-width": "^2.1.1",
"strip-ansi": "^4.0.0",
"wrap-ansi": "^2.0.0"
},
"dependencies": {
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true,
"requires": {
"ansi-regex": "^3.0.0"
}
}
}
}, },
"debug": { "debug": {
"version": "4.1.1", "version": "4.1.1",
@@ -19212,12 +19117,6 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true "dev": true
}, },
"require-main-filename": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
"dev": true
},
"semver": { "semver": {
"version": "6.3.0", "version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -19225,22 +19124,23 @@
"dev": true "dev": true
}, },
"string-width": { "string-width": {
"version": "2.1.1", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true, "dev": true,
"requires": { "requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0", "is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0" "strip-ansi": "^5.1.0"
}, },
"dependencies": { "dependencies": {
"strip-ansi": { "strip-ansi": {
"version": "4.0.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true, "dev": true,
"requires": { "requires": {
"ansi-regex": "^3.0.0" "ansi-regex": "^4.1.0"
} }
} }
} }
@@ -19264,29 +19164,27 @@
} }
}, },
"yargs": { "yargs": {
"version": "12.0.5", "version": "13.3.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
"integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
"dev": true, "dev": true,
"requires": { "requires": {
"cliui": "^4.0.0", "cliui": "^5.0.0",
"decamelize": "^1.2.0",
"find-up": "^3.0.0", "find-up": "^3.0.0",
"get-caller-file": "^1.0.1", "get-caller-file": "^2.0.1",
"os-locale": "^3.0.0",
"require-directory": "^2.1.1", "require-directory": "^2.1.1",
"require-main-filename": "^1.0.1", "require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0", "set-blocking": "^2.0.0",
"string-width": "^2.0.0", "string-width": "^3.0.0",
"which-module": "^2.0.0", "which-module": "^2.0.0",
"y18n": "^3.2.1 || ^4.0.0", "y18n": "^4.0.0",
"yargs-parser": "^11.1.1" "yargs-parser": "^13.1.2"
} }
}, },
"yargs-parser": { "yargs-parser": {
"version": "11.1.1", "version": "13.1.2",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
"integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
"dev": true, "dev": true,
"requires": { "requires": {
"camelcase": "^5.0.0", "camelcase": "^5.0.0",
@@ -19333,13 +19231,11 @@
} }
}, },
"websocket-driver": { "websocket-driver": {
"version": "0.7.3", "version": "0.6.5",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
"integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=",
"dev": true, "dev": true,
"requires": { "requires": {
"http-parser-js": ">=0.4.0 <0.4.11",
"safe-buffer": ">=5.1.0",
"websocket-extensions": ">=0.1.1" "websocket-extensions": ">=0.1.1"
} }
}, },
@@ -19422,16 +19318,6 @@
"errno": "~0.1.7" "errno": "~0.1.7"
} }
}, },
"wrap-ansi": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"dev": true,
"requires": {
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1"
}
},
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",

View File

@@ -33,21 +33,21 @@
"@juliushaertl/vue-richtext": "^0.3.1", "@juliushaertl/vue-richtext": "^0.3.1",
"@nextcloud/auth": "^1.2.3", "@nextcloud/auth": "^1.2.3",
"@nextcloud/axios": "^1.3.2", "@nextcloud/axios": "^1.3.2",
"@nextcloud/dialogs": "^1.2.2", "@nextcloud/dialogs": "^1.3.0",
"@nextcloud/files": "^1.0.1", "@nextcloud/files": "^1.0.1",
"@nextcloud/initial-state": "^1.1.2", "@nextcloud/initial-state": "^1.1.2",
"@nextcloud/l10n": "^1.2.3", "@nextcloud/l10n": "^1.2.3",
"@nextcloud/moment": "^1.1.1", "@nextcloud/moment": "^1.1.1",
"@nextcloud/router": "^1.0.2", "@nextcloud/router": "^1.0.2",
"@nextcloud/vue": "^1.5.0", "@nextcloud/vue": "^1.5.0",
"blueimp-md5": "^2.13.0", "blueimp-md5": "^2.15.0",
"dompurify": "^2.0.10", "dompurify": "^2.0.11",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"markdown-it": "^10.0.0", "markdown-it": "^10.0.0",
"markdown-it-task-lists": "^2.1.1", "markdown-it-task-lists": "^2.1.1",
"moment": "^2.25.3", "moment": "^2.25.3",
"nextcloud-vue-collections": "^0.7.2", "nextcloud-vue-collections": "^0.7.2",
"p-queue": "^6.3.0", "p-queue": "^6.4.0",
"url-search-params-polyfill": "^8.1.0", "url-search-params-polyfill": "^8.1.0",
"vue": "^2.6.11", "vue": "^2.6.11",
"vue-at": "^2.5.0-beta.2", "vue-at": "^2.5.0-beta.2",
@@ -72,8 +72,8 @@
"@nextcloud/browserslist-config": "^1.0.0", "@nextcloud/browserslist-config": "^1.0.0",
"@nextcloud/eslint-config": "^2.0.0", "@nextcloud/eslint-config": "^2.0.0",
"@nextcloud/eslint-plugin": "^1.4.0", "@nextcloud/eslint-plugin": "^1.4.0",
"@vue/test-utils": "^1.0.0-beta.33", "@vue/test-utils": "^1.0.2",
"acorn": "^7.1.1", "acorn": "^7.2.0",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"babel-jest": "^26.0.1", "babel-jest": "^26.0.1",
"babel-loader": "^8.1.0", "babel-loader": "^8.1.0",
@@ -91,14 +91,14 @@
"jest": "^26.0.1", "jest": "^26.0.1",
"jest-serializer-vue": "^2.0.2", "jest-serializer-vue": "^2.0.2",
"minimist": "^1.2.5", "minimist": "^1.2.5",
"node-sass": "^4.14.0", "node-sass": "^4.14.1",
"raw-loader": "^4.0.1", "raw-loader": "^4.0.1",
"sass-loader": "^8.0.2", "sass-loader": "^8.0.2",
"stylelint": "^13.3.3", "stylelint": "^13.3.3",
"stylelint-config-recommended": "^3.0.0", "stylelint-config-recommended": "^3.0.0",
"stylelint-config-recommended-scss": "^4.2.0", "stylelint-config-recommended-scss": "^4.2.0",
"stylelint-scss": "^3.17.1", "stylelint-scss": "^3.17.2",
"stylelint-webpack-plugin": "^1.2.3", "stylelint-webpack-plugin": "^2.0.0",
"url-loader": "^4.1.0", "url-loader": "^4.1.0",
"vue-jest": "^3.0.5", "vue-jest": "^3.0.5",
"vue-loader": "^15.9.2", "vue-loader": "^15.9.2",
@@ -106,7 +106,7 @@
"vue-template-compiler": "^2.6.11", "vue-template-compiler": "^2.6.11",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.10.3", "webpack-dev-server": "^3.11.0",
"webpack-merge": "^4.2.2" "webpack-merge": "^4.2.2"
}, },
"jest": { "jest": {

View File

@@ -24,6 +24,7 @@
<Modal @close="close"> <Modal @close="close">
<div id="modal-inner" :class="{ 'icon-loading': loading }"> <div id="modal-inner" :class="{ 'icon-loading': loading }">
<h1>{{ t('deck', 'Select the board to link to a project') }}</h1> <h1>{{ t('deck', 'Select the board to link to a project') }}</h1>
<input v-model="filter" type="text" :placeholder="t('deck', 'Search by board title')">
<ul v-if="!loading"> <ul v-if="!loading">
<li v-for="board in availableBoards" <li v-for="board in availableBoards"
:key="board.id" :key="board.id"
@@ -46,8 +47,15 @@
padding: 20px; padding: 20px;
} }
input {
width: 100%;
margin-bottom: 15px;
}
ul { ul {
min-height: 100px; min-height: 50vh;
max-height: 300px;
overflow: scroll;
} }
li { li {
@@ -80,7 +88,7 @@
</style> </style>
<script> <script>
import { Modal } from '@nextcloud/vue/dist/Components/Modal' import Modal from '@nextcloud/vue/dist/Components/Modal'
import axios from '@nextcloud/axios' import axios from '@nextcloud/axios'
export default { export default {
@@ -90,6 +98,7 @@ export default {
}, },
data() { data() {
return { return {
filter: '',
boards: [], boards: [],
selectedBoard: null, selectedBoard: null,
loading: true, loading: true,
@@ -98,12 +107,16 @@ export default {
}, },
computed: { computed: {
availableBoards() { availableBoards() {
return this.boards.filter((board) => ('' + board.id !== '' + this.currentBoard)) return this.boards.filter((board) => (
'' + board.id !== '' + this.currentBoard
&& board.title.match(this.filter)
))
}, },
}, },
beforeMount() { beforeMount() {
this.fetchBoards() this.fetchBoards()
this.currentBoard = window.location.hash.match(/\/boards\/([0-9]+)/)[1] || null const hash = window.location.hash.match(/\/boards\/([0-9]+)/)
this.currentBoard = hash.length > 0 ? hash[1] : null
}, },
methods: { methods: {
fetchBoards() { fetchBoards() {

View File

@@ -45,8 +45,8 @@
</template> </template>
<script> <script>
import { Modal } from '@nextcloud/vue/dist/Components/Modal' import Modal from '@nextcloud/vue/dist/Components/Modal'
import { Multiselect } from '@nextcloud/vue/dist/Components/Multiselect' import Multiselect from '@nextcloud/vue/dist/Components/Multiselect'
import axios from '@nextcloud/axios' import axios from '@nextcloud/axios'
export default { export default {

View File

@@ -54,14 +54,14 @@
</div> </div>
<div class="board-action-buttons"> <div class="board-action-buttons">
<Popover> <Popover>
<Actions slot="trigger" :style="filterOpacity" :title="t('deck', 'Apply filter')"> <Actions slot="trigger" :title="t('deck', 'Apply filter')">
<ActionButton icon="icon-filter" /> <ActionButton v-if="isFilterActive" icon="icon-filter_set" />
<ActionButton v-else icon="icon-filter" />
</Actions> </Actions>
<template> <template>
<div class="filter"> <div class="filter">
<h3>{{ t('deck', 'Filter by tag') }}</h3> <h3>{{ t('deck', 'Filter by tag') }}</h3>
{{ filter }}
<div v-for="label in board.labels" :key="label.id" class="filter--item"> <div v-for="label in board.labels" :key="label.id" class="filter--item">
<input <input
:id="label.id" :id="label.id"
@@ -219,11 +219,14 @@ export default {
} }
return 'opacity: .5;' return 'opacity: .5;'
}, },
filterOpacity() { isFilterActive() {
if (this.filter.tags.length !== 0 || this.filter.users.length !== 0 || this.filter.due !== '') { if (this.filter.tags.length !== 0 || this.filter.users.length !== 0 || this.filter.due !== '') {
return 'opacity: 1;' return true
} }
return 'opacity: .5;' return false
},
labelsSorted() {
return [...this.board.labels].sort((a, b) => (a.title < b.title) ? -1 : 1)
}, },
}, },
methods: { methods: {

View File

@@ -28,7 +28,10 @@
<h3 v-if="!canManage"> <h3 v-if="!canManage">
{{ stack.title }} {{ stack.title }}
</h3> </h3>
<h3 v-else-if="!editing" @click="startEditing(stack)"> <h3 v-else-if="!editing"
v-tooltip="stack.title"
class="stack--title"
@click="startEditing(stack)">
{{ stack.title }} {{ stack.title }}
</h3> </h3>
<form v-else @submit.prevent="finishedEdit(stack)"> <form v-else @submit.prevent="finishedEdit(stack)">
@@ -234,12 +237,14 @@ export default {
margin: 3px -3px; margin: 3px -3px;
margin-right: -10px; margin-right: -10px;
margin-top: 0; margin-top: 0;
margin-bottom: 0; margin-bottom: 3px;
background-color: var(--color-main-background-translucent); background-color: var(--color-main-background-translucent);
cursor: grab;
h3, form { h3, form {
flex-grow: 1; flex-grow: 1;
display: flex; display: flex;
cursor: inherit;
input[type=text] { input[type=text] {
flex-grow: 1; flex-grow: 1;
@@ -247,6 +252,13 @@ export default {
} }
} }
.stack--title {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: calc($stack-width - 60px);
}
.stack--card-add { .stack--card-add {
position: sticky; position: sticky;
top: 52px; top: 52px;

View File

@@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<ul class="labels"> <ul class="labels">
<li v-for="label in labels" :key="label.id" :class="{editing: (editingLabelId === label.id)}"> <li v-for="label in labelsSorted" :key="label.id" :class="{editing: (editingLabelId === label.id)}">
<!-- Edit Tag --> <!-- Edit Tag -->
<template v-if="editingLabelId === label.id"> <template v-if="editingLabelId === label.id">
<form class="label-form" @submit.prevent="updateLabel(label)"> <form class="label-form" @submit.prevent="updateLabel(label)">
@@ -111,6 +111,9 @@ export default {
return true return true
}, },
labelsSorted() {
return [...this.labels].sort((a, b) => (a.title < b.title) ? -1 : 1)
},
}, },
methods: { methods: {

View File

@@ -83,6 +83,11 @@ export default {
display: flex; display: flex;
} }
.board-list-row:not(.board-list-header-row):hover {
transition: background-color 0.3s ease;
background-color: var(--color-background-dark);
}
.board-list-header-row { .board-list-header-row {
color: var(--color-text-lighter); color: var(--color-text-lighter);
} }

View File

@@ -203,7 +203,9 @@ import { formatFileSize } from '@nextcloud/files'
import relativeDate from '../../mixins/relativeDate' import relativeDate from '../../mixins/relativeDate'
import AttachmentList from './AttachmentList' import AttachmentList from './AttachmentList'
const markdownIt = new MarkdownIt() const markdownIt = new MarkdownIt({
linkify: true,
})
markdownIt.use(MarkdownItTaskLists, { enabled: true, label: true, labelAfter: true }) markdownIt.use(MarkdownItTaskLists, { enabled: true, label: true, labelAfter: true })
const capabilities = window.OC.getCapabilities() const capabilities = window.OC.getCapabilities()
@@ -325,7 +327,7 @@ export default {
}, },
}, },
renderedDescription() { renderedDescription() {
return markdownIt.render(this.copiedCard.description) return markdownIt.render(this.copiedCard.description || '')
}, },
}, },
watch: { watch: {
@@ -600,15 +602,23 @@ export default {
#description-preview { #description-preview {
min-height: 100px; min-height: 100px;
&::v-deep {
@import "./../../css/markdown";
}
&::v-deep input { &::v-deep input {
min-height: auto; min-height: auto;
} }
&::v-deep a {
text-decoration: underline;
}
} }
.modal__content { .modal__content {
width: 25vw; width: 25vw;
min-width: 250px; min-width: 250px;
height: 120px; min-height: 120px;
text-align: center; text-align: center;
margin: 20px 20px 60px 20px; margin: 20px 20px 60px 20px;
padding-bottom: 20px; padding-bottom: 20px;

View File

@@ -34,138 +34,32 @@
<AvatarList :users="card.assignedUsers" /> <AvatarList :users="card.assignedUsers" />
<div @click.stop.prevent> <CardMenu :id="id" />
<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 CardMenu from './CardMenu'
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, CardMenu },
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*(\*|-|(\d\.))\s+\[\s*(\s|x)\s*\](.*)$/gim) || []).length return (this.card.description.match(/^\s*(\*|-|(\d\.))\s+\[\s*(\s|x)\s*\](.*)$/gim) || []).length
}, },
checkListCheckedCount() { checkListCheckedCount() {
return (this.card.description.match(/^\s*(\*|-|(\d\.))\s+\[\s*x\s*\](.*)$/gim) || []).length return (this.card.description.match(/^\s*(\*|-|(\d\.))\s+\[\s*x\s*\](.*)$/gim) || []).length
}, },
compactMode() {
return false
},
card() { card() {
return this.$store.getters.cardById(this.id) return this.$store.getters.cardById(this.id)
}, },
isBoardAndStackChoosen() {
if (this.selectedBoard === '' || this.selectedStack === '') {
return false
}
return true
},
boards() {
return this.$store.getters.boards.filter(board => {
return board.id !== this.currentBoard.id
})
},
},
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
}
},
}, },
} }
</script> </script>
@@ -236,20 +130,4 @@ export default {
.fade-enter, .fade-leave-to { .fade-enter, .fade-leave-to {
opacity: 0; 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>

View File

@@ -54,6 +54,8 @@
</div> </div>
</transition> </transition>
</div> </div>
<CardMenu v-if="!editing && compactMode" :id="id" class="right" />
</div> </div>
<transition-group name="zoom" <transition-group name="zoom"
tag="ul" tag="ul"
@@ -78,10 +80,11 @@ import CardBadges from './CardBadges'
import Color from '../../mixins/color' import Color from '../../mixins/color'
import labelStyle from '../../mixins/labelStyle' import labelStyle from '../../mixins/labelStyle'
import AttachmentDragAndDrop from '../AttachmentDragAndDrop' import AttachmentDragAndDrop from '../AttachmentDragAndDrop'
import CardMenu from './CardMenu'
export default { export default {
name: 'CardItem', name: 'CardItem',
components: { CardBadges, AttachmentDragAndDrop }, components: { CardBadges, AttachmentDragAndDrop, CardMenu },
directives: { directives: {
ClickOutside, ClickOutside,
}, },
@@ -137,16 +140,9 @@ export default {
return moment(this.card.duedate).format('LLLL') return moment(this.card.duedate).format('LLLL')
}, },
}, },
watch: {
currentCard(newValue) {
if (newValue) {
this.$nextTick(() => this.$el.scrollIntoView())
}
},
},
methods: { methods: {
openCard() { openCard() {
this.$router.push({ name: 'card', params: { cardId: this.id } }) this.$router.push({ name: 'card', params: { cardId: this.id } }).catch(() => {})
}, },
startEditing(card) { startEditing(card) {
this.copiedCard = Object.assign({}, card) this.copiedCard = Object.assign({}, card)
@@ -175,6 +171,10 @@ export default {
border: 1px solid var(--color-border); border: 1px solid var(--color-border);
} }
.card:hover {
box-shadow: 0 0 5px 1px var(--color-box-shadow);
}
.card { .card {
transition: box-shadow 0.1s ease-in-out; transition: box-shadow 0.1s ease-in-out;
box-shadow: 0 0 2px 0 var(--color-box-shadow); box-shadow: 0 0 2px 0 var(--color-box-shadow);

View File

@@ -0,0 +1,171 @@
<!--
- @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
-
- @author Julius Härtl <jus@bitgrid.net>
-
- @license GNU AGPL version 3 or any later version
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-->
<template>
<div>
<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="t('deck', 'Move card to another board')" @close="modalShow=false">
<div class="modal__content">
<h3>{{ t('deck', 'Move card to another board') }}</h3>
<Multiselect v-model="selectedBoard"
:placeholder="t('deck', 'Select a board')"
:options="boards"
:max-height="100"
label="title"
@select="loadStacksFromBoard" />
<Multiselect v-model="selectedStack"
:placeholder="t('deck', 'Select a stack')"
:options="stacksFromBoard"
:max-height="100"
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>
</template>
<script>
import { Modal, Actions, ActionButton, Multiselect } from '@nextcloud/vue'
import { mapGetters, mapState } from 'vuex'
import axios from '@nextcloud/axios'
export default {
name: 'CardMenu',
components: { Actions, ActionButton, Modal, Multiselect },
props: {
id: {
type: Number,
default: null,
},
},
data() {
return {
modalShow: false,
selectedBoard: '',
selectedStack: '',
stacksFromBoard: [],
}
},
computed: {
...mapGetters([
'canEdit',
]),
...mapState({
showArchived: state => state.showArchived,
currentBoard: state => state.currentBoard,
}),
card() {
return this.$store.getters.cardById(this.id)
},
isBoardAndStackChoosen() {
if (this.selectedBoard === '' || this.selectedStack === '') {
return false
}
return true
},
boards() {
return this.$store.getters.boards.filter(board => {
return board.id !== this.currentBoard.id
})
},
},
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 {
const url = OC.generateUrl('/apps/deck/stacks/' + board.id)
const response = await axios.get(url)
this.stacksFromBoard = response.data
} catch (err) {
return err
}
},
},
}
</script>
<style lang="scss" scoped>
.modal__content {
width: 25vw;
min-width: 250px;
min-height: 120px;
text-align: center;
margin: 20px 20px 100px 20px;
.multiselect {
margin-bottom: 10px;
}
}
.modal__content button {
float: right;
margin-top: 50px;
}
</style>

View File

@@ -149,6 +149,7 @@ export default {
text: t('deck', 'Edit board'), text: t('deck', 'Edit board'),
}) })
} }
if (canManage) {
actions.push({ actions.push({
action: async() => { action: async() => {
@@ -168,7 +169,7 @@ export default {
icon: 'icon-clone', icon: 'icon-clone',
text: t('deck', 'Clone board'), text: t('deck', 'Clone board'),
}) })
if (canManage) {
if (!this.board.archived) { if (!this.board.archived) {
actions.push({ actions.push({
action: () => { action: () => {

View File

@@ -29,7 +29,7 @@
{{ text }} {{ text }}
</a> </a>
<ul v-if="boards.length > 0"> <ul v-if="boards.length > 0">
<AppNavigationBoard v-for="board in boards" :key="board.id" :board="board" /> <AppNavigationBoard v-for="board in boardsSorted" :key="board.id" :board="board" />
</ul> </ul>
</li> </li>
</template> </template>
@@ -78,6 +78,9 @@ export default {
} }
}, },
computed: { computed: {
boardsSorted() {
return [...this.boards].sort((a, b) => (a.title < b.title) ? -1 : 1)
},
collapsible() { collapsible() {
return this.boards.length > 0 return this.boards.length > 0
}, },

102
src/css/markdown.scss Normal file
View File

@@ -0,0 +1,102 @@
p {
margin-bottom: 15px;
}
* {
white-space: normal;
word-wrap: break-word;
overflow-wrap: break-word;
}
a {
opacity: 0.5;
text-decoration: underline;
}
ol,
ul {
margin-left: 20px;
margin-bottom: 10px;
}
ul {
list-style-type: disc;
}
h1 {
font-size: 18px;
font-weight: 600;
margin-bottom: 5px;
}
h2 {
font-size: 16px;
font-weight: 600;
}
h3 {
font-size: 14px;
font-weight: 600;
}
h4 {
font-size: 13px;
font-weight: 600;
}
h6 {
font-size: 12px;
font-weight: 600;
}
pre {
background-color: var(--color-background-dark);
padding: 3px;
overflow: auto;
code {
white-space: pre;
}
}
img {
max-width: 100%;
max-height: 50vh;
margin: auto;
display: block;
}
input[type=checkbox] {
margin: 0px 10px 0px 0px;
line-height: 10px;
font-size: 10px;
display: inline-block;
min-height: 12px;
}
li input[type="checkbox"].checkbox + label::before {
margin-left: -15px;
}
input[type="checkbox"].checkbox + label::before {
position: relative;
z-index: 100;
margin-right: 10px;
margin-top: 0;
}
li input[type="checkbox"].checkbox:not(:checked) + label::before {
background-color: var(--color-main-background);
}
table {
margin-bottom: 10px;
border-collapse: collapse;
thead {
background-color: var(--color-background-dark);
}
td, th {
border: 1px solid var(--color-background-darker);
padding: 3px;
}
}

View File

@@ -62,7 +62,7 @@ Vue.config.errorHandler = (err, vm, info) => {
const errorMessage = t('deck', 'Something went wrong') const errorMessage = t('deck', 'Something went wrong')
OCP.Toast.error(`${errorMessage}: ${err.response.data.status} ${err.response.data.message}`) OCP.Toast.error(`${errorMessage}: ${err.response.data.status} ${err.response.data.message}`)
} }
throw err console.error(err)
} }
/* eslint-disable-next-line no-new */ /* eslint-disable-next-line no-new */