Browse Source

Merge branch 'edge' into meteor-1.8

Lauri Ojansivu 6 years ago
parent
commit
202f4235d7
63 changed files with 388 additions and 66 deletions
  1. 9 0
      CHANGELOG.md
  2. 1 1
      Dockerfile
  3. 1 1
      Stackerfile.yml
  4. 22 6
      client/components/sidebar/sidebarArchives.jade
  5. 48 0
      client/components/sidebar/sidebarArchives.js
  6. 4 0
      client/components/swimlanes/swimlaneHeader.jade
  7. 5 1
      i18n/ar.i18n.json
  8. 5 1
      i18n/bg.i18n.json
  9. 5 1
      i18n/br.i18n.json
  10. 5 1
      i18n/ca.i18n.json
  11. 5 1
      i18n/cs.i18n.json
  12. 5 1
      i18n/da.i18n.json
  13. 5 1
      i18n/de.i18n.json
  14. 5 1
      i18n/el.i18n.json
  15. 5 1
      i18n/en-GB.i18n.json
  16. 5 1
      i18n/en.i18n.json
  17. 5 1
      i18n/eo.i18n.json
  18. 5 1
      i18n/es-AR.i18n.json
  19. 5 1
      i18n/es.i18n.json
  20. 5 1
      i18n/eu.i18n.json
  21. 5 1
      i18n/fa.i18n.json
  22. 5 1
      i18n/fi.i18n.json
  23. 5 1
      i18n/fr.i18n.json
  24. 5 1
      i18n/gl.i18n.json
  25. 5 1
      i18n/he.i18n.json
  26. 5 1
      i18n/hi.i18n.json
  27. 5 1
      i18n/hu.i18n.json
  28. 5 1
      i18n/hy.i18n.json
  29. 5 1
      i18n/id.i18n.json
  30. 5 1
      i18n/ig.i18n.json
  31. 5 1
      i18n/it.i18n.json
  32. 5 1
      i18n/ja.i18n.json
  33. 5 1
      i18n/ka.i18n.json
  34. 5 1
      i18n/km.i18n.json
  35. 5 1
      i18n/ko.i18n.json
  36. 5 1
      i18n/lv.i18n.json
  37. 5 1
      i18n/mk.i18n.json
  38. 5 1
      i18n/mn.i18n.json
  39. 5 1
      i18n/nb.i18n.json
  40. 5 1
      i18n/nl.i18n.json
  41. 5 1
      i18n/oc.i18n.json
  42. 5 1
      i18n/pl.i18n.json
  43. 5 1
      i18n/pt-BR.i18n.json
  44. 5 1
      i18n/pt.i18n.json
  45. 5 1
      i18n/ro.i18n.json
  46. 5 1
      i18n/ru.i18n.json
  47. 5 1
      i18n/sr.i18n.json
  48. 5 1
      i18n/sv.i18n.json
  49. 5 1
      i18n/sw.i18n.json
  50. 5 1
      i18n/ta.i18n.json
  51. 5 1
      i18n/th.i18n.json
  52. 5 1
      i18n/tr.i18n.json
  53. 5 1
      i18n/uk.i18n.json
  54. 5 1
      i18n/vi.i18n.json
  55. 5 1
      i18n/zh-CN.i18n.json
  56. 5 1
      i18n/zh-TW.i18n.json
  57. 19 0
      models/boards.js
  58. 2 2
      models/cards.js
  59. 0 2
      models/checklists.js
  60. 10 0
      models/lists.js
  61. 19 1
      models/swimlanes.js
  62. 1 1
      package.json
  63. 2 2
      sandstorm-pkgdef.capnp

+ 9 - 0
CHANGELOG.md

@@ -1,3 +1,12 @@
+# v2.64 2019-04-23 Wekan release
+
+This release adds the following new features:
+
+- [Board Archive: Restore All/Delete All of Cards/Lists/Swimlanes](https://github.com/wekan/wekan/pull/2376).
+  Thanks to Akuket.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
 # v2.63 2019-04-23 Wekan release
 
 This release removes the following Caddy plugins:

+ 1 - 1
Dockerfile

@@ -108,7 +108,7 @@ RUN \
     \
     # OS dependencies
     apt-get update -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \
-    pip3 install -U setuptools wheel && \
+    pip3 install -U pip setuptools wheel && \
     \
     # Meteor installer doesn't work with the default tar binary, so using bsdtar while installing.
     # https://github.com/coreos/bugs/issues/1095#issuecomment-350574389

+ 1 - 1
Stackerfile.yml

@@ -1,5 +1,5 @@
 appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
-appVersion: "v2.63.0"
+appVersion: "v2.64.0"
 files:
   userUploads:
     - README.md

+ 22 - 6
client/components/sidebar/sidebarArchives.jade

@@ -2,6 +2,10 @@ template(name="archivesSidebar")
   +basicTabs(tabs=tabs)
 
    +tabContent(slug="cards")
+    p.quiet
+      a.js-restore-all-cards {{_ 'restore-all'}}
+      | -
+      a.js-delete-all-cards {{_ 'delete-all'}}
     each archivedCards
       .minicard-wrapper.js-minicard
         +minicard(this)
@@ -16,23 +20,35 @@ template(name="archivesSidebar")
       p.no-items-message {{_ 'no-archived-cards'}}
 
    +tabContent(slug="lists")
+    p.quiet
+      a.js-restore-all-lists {{_ 'restore-all'}}
+      | -
+      a.js-delete-all-lists {{_ 'delete-all'}}
     ul.archived-lists
       each archivedLists
         li.archived-lists-item
-          if currentUser.isBoardMember
-            button.js-restore-list
-              i.fa.fa-undo
           = title
+          if currentUser.isBoardMember
+            p.quiet
+              a.js-restore-list {{_ 'restore'}}
+              | -
+              a.js-delete-list {{_ 'delete'}}
       else
         li.no-items-message {{_ 'no-archived-lists'}}
 
    +tabContent(slug="swimlanes")
+    p.quiet
+      a.js-restore-all-swimlanes {{_ 'restore-all'}}
+      | -
+      a.js-delete-all-swimlanes {{_ 'delete-all'}}
     ul.archived-lists
       each archivedSwimlanes
         li.archived-lists-item
-          if currentUser.isBoardMember
-            button.js-restore-swimlane
-              i.fa.fa-undo
           = title
+          if currentUser.isBoardMember
+            p.quiet
+              a.js-restore-swimlane {{_ 'restore'}}
+              | -
+              a.js-delete-swimlane {{_ 'delete'}}
       else
         li.no-items-message {{_ 'no-archived-swimlanes'}}

+ 48 - 0
client/components/sidebar/sidebarArchives.js

@@ -44,19 +44,67 @@ BlazeComponent.extendComponent({
           card.restore();
         }
       },
+      'click .js-restore-all-cards'() {
+        this.archivedCards().forEach((card) => {
+          if(card.canBeRestored()){
+            card.restore();
+          }
+        });
+      },
+
       'click .js-delete-card': Popup.afterConfirm('cardDelete', function() {
         const cardId = this._id;
         Cards.remove(cardId);
         Popup.close();
       }),
+      'click .js-delete-all-cards': Popup.afterConfirm('cardDelete', () => {
+        this.archivedCards().forEach((card) => {
+          Cards.remove(card._id);
+        });
+        Popup.close();
+      }),
+
       'click .js-restore-list'() {
         const list = this.currentData();
         list.restore();
       },
+      'click .js-restore-all-lists'() {
+        this.archivedLists().forEach((list) => {
+          list.restore();
+        });
+      },
+
+      'click .js-delete-list': Popup.afterConfirm('listDelete', function() {
+        this.remove();
+        Popup.close();
+      }),
+      'click .js-delete-all-lists': Popup.afterConfirm('listDelete', () => {
+        this.archivedLists().forEach((list) => {
+          list.remove();
+        });
+        Popup.close();
+      }),
+
       'click .js-restore-swimlane'() {
         const swimlane = this.currentData();
         swimlane.restore();
       },
+      'click .js-restore-all-swimlanes'() {
+        this.archivedSwimlanes().forEach((swimlane) => {
+          swimlane.restore();
+        });
+      },
+
+      'click .js-delete-swimlane': Popup.afterConfirm('swimlaneDelete', function() {
+        this.remove();
+        Popup.close();
+      }),
+      'click .js-delete-all-swimlanes': Popup.afterConfirm('swimlaneDelete', () => {
+        this.archivedSwimlanes().forEach((swimlane) => {
+          swimlane.remove();
+        });
+        Popup.close();
+      }),
     }];
   },
 }).register('archivesSidebar');

+ 4 - 0
client/components/swimlanes/swimlaneHeader.jade

@@ -54,3 +54,7 @@ template(name="setSwimlaneColorPopup")
           i.fa.fa-check
     button.primary.confirm.js-submit {{_ 'save'}}
     button.js-remove-color.negate.wide.right {{_ 'unset-color'}}
+
+template(name="swimlaneDeletePopup")
+  p {{_ "swimlane-delete-pop"}}
+  button.js-confirm.negate.full(type="submit") {{_ 'delete'}}

+ 5 - 1
i18n/ar.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/bg.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/br.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/ca.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/cs.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Zobraz způsob ověřování",
     "default-authentication-method": "Zobraz způsob ověřování",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/da.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/de.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Anzeige Authentifizierungsverfahren",
     "default-authentication-method": "Standardauthentifizierungsverfahren",
     "duplicate-board": "Board duplizieren",
-    "people-number": "Anzahl der Personen:"
+    "people-number": "Anzahl der Personen:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/el.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/en-GB.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/en.i18n.json

@@ -687,5 +687,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is: "
+    "people-number": "The number of people is: ",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/eo.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/es-AR.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/es.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Mostrar el método de autenticación",
     "default-authentication-method": "Método de autenticación por defecto",
     "duplicate-board": "Duplicar tablero",
-    "people-number": "El número de personas es:"
+    "people-number": "El número de personas es:",
+    "swimlaneDeletePopup-title": "¿Eliminar el carril de flujo?",
+    "swimlane-delete-pop": "Todas las acciones serán eliminadas del historial de actividades y no se podrá recuperar el carril de flujo. Esta acción no puede deshacerse.",
+    "restore-all": "Restaurar todas",
+    "delete-all": "Borrar todas"
 }

+ 5 - 1
i18n/eu.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/fa.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "نمایش نوع اعتبارسنجی",
     "default-authentication-method": "نوع اعتبارسنجی پیشفرض",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/fi.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Näytä kirjautumistapa",
     "default-authentication-method": "Oletus kirjautumistapa",
     "duplicate-board": "Tee kaksoiskappale taulusta",
-    "people-number": "Ihmisten määrä on:"
+    "people-number": "Ihmisten määrä on:",
+    "swimlaneDeletePopup-title": "Poista Swimlane ?",
+    "swimlane-delete-pop": "Kaikki toimet poistetaan toimintasyötteestä ja swimlanen poistaminen on lopullista. Tätä ei pysty peruuttamaan.",
+    "restore-all": "Palauta kaikki",
+    "delete-all": "Poista kaikki"
 }

+ 5 - 1
i18n/fr.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Afficher la méthode d'authentification",
     "default-authentication-method": "Méthode d'authentification par défaut",
     "duplicate-board": "Dupliquer le tableau",
-    "people-number": "Le nombre d'utilisateurs est de :"
+    "people-number": "Le nombre d'utilisateurs est de :",
+    "swimlaneDeletePopup-title": "Supprimer le couloir ?",
+    "swimlane-delete-pop": "Toutes les actions vont être supprimées du suivi d'activités et vous ne pourrez plus utiliser ce couloir. Cette action est irréversible.",
+    "restore-all": "Tout supprimer",
+    "delete-all": "Tout restaurer"
 }

+ 5 - 1
i18n/gl.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/he.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "הצגת שיטת אימות",
     "default-authentication-method": "שיטת אימות כבררת מחדל",
     "duplicate-board": "שכפול לוח",
-    "people-number": "מספר האנשים הוא:"
+    "people-number": "מספר האנשים הוא:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/hi.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/hu.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Hitelelesítési mód mutatása",
     "default-authentication-method": "Alapértelmezett hitelesítési mód",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/hy.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/id.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/ig.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/it.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Mostra il metodo di autenticazione",
     "default-authentication-method": "Metodo di autenticazione predefinito",
     "duplicate-board": "Duplica bacheca",
-    "people-number": "Il numero di persone è:"
+    "people-number": "Il numero di persone è:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/ja.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/ka.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/km.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/ko.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/lv.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/mk.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/mn.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/nb.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/nl.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/oc.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/pl.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Wyświetl metodę logowania",
     "default-authentication-method": "Domyślna metoda logowania",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/pt-BR.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Mostrar Método de Autenticação",
     "default-authentication-method": "Método de Autenticação Padrão",
     "duplicate-board": "Duplicar Quadro",
-    "people-number": "O número de pessoas é:"
+    "people-number": "O número de pessoas é:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/pt.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Mostrar Método de Autenticação",
     "default-authentication-method": "Método de Autenticação Padrão",
     "duplicate-board": "Duplicar Quadro",
-    "people-number": "O número de pessoas é:"
+    "people-number": "O número de pessoas é:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/ro.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/ru.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Показывать способ авторизации",
     "default-authentication-method": "Способ авторизации по умолчанию",
     "duplicate-board": "Клонировать доску",
-    "people-number": "Количество человек:"
+    "people-number": "Количество человек:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/sr.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/sv.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Visa autentiseringsmetod",
     "default-authentication-method": "Standard autentiseringsmetod",
     "duplicate-board": "Dubbletttavla",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/sw.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/ta.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/th.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/tr.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/uk.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/vi.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/zh-CN.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "显示认证方式",
     "default-authentication-method": "缺省认证方式",
     "duplicate-board": "复制看板",
-    "people-number": "人数是:"
+    "people-number": "人数是:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 5 - 1
i18n/zh-TW.i18n.json

@@ -684,5 +684,9 @@
     "display-authentication-method": "Display Authentication Method",
     "default-authentication-method": "Default Authentication Method",
     "duplicate-board": "Duplicate Board",
-    "people-number": "The number of people is:"
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all"
 }

+ 19 - 0
models/boards.js

@@ -803,6 +803,13 @@ Boards.mutations({
   },
 });
 
+function boardRemover(userId, doc) {
+  [Cards, Lists, Swimlanes, Integrations, Rules, Activities].forEach((element) => {
+    element.remove({ boardId: doc._id });
+  });
+}
+
+
 if (Meteor.isServer) {
   Boards.allow({
     insert: Meteor.userId,
@@ -966,6 +973,18 @@ if (Meteor.isServer) {
     }
   });
 
+  Boards.before.remove((userId, doc) => {
+    boardRemover(userId, doc);
+    // Add removeBoard activity to keep it
+    Activities.insert({
+      userId,
+      type: 'board',
+      activityTypeId: doc._id,
+      activityType: 'removeBoard',
+      boardId: doc._id,
+    });
+  });
+
   // Add a new activity if we add or remove a member to the board
   Boards.after.update((userId, doc, fieldNames, modifier) => {
     if (!_.contains(fieldNames, 'members')) {

+ 2 - 2
models/cards.js

@@ -1518,7 +1518,7 @@ function cardCreation(userId, doc) {
 }
 
 function cardRemover(userId, doc) {
-  Activities.remove({
+  ChecklistItems.remove({
     cardId: doc._id,
   });
   Checklists.remove({
@@ -1583,7 +1583,7 @@ if (Meteor.isServer) {
 
   // Remove all activities associated with a card if we remove the card
   // Remove also card_comments / checklists / attachments
-  Cards.after.remove((userId, doc) => {
+  Cards.before.remove((userId, doc) => {
     cardRemover(userId, doc);
   });
 }

+ 0 - 2
models/checklists.js

@@ -157,8 +157,6 @@ if (Meteor.isServer) {
       listId: doc.listId,
       swimlaneId: doc.swimlaneId,
     });
-
-
   });
 }
 

+ 10 - 0
models/lists.js

@@ -217,6 +217,10 @@ Lists.helpers({
   isTemplateList() {
     return this.type === 'template-list';
   },
+
+  remove() {
+    Lists.remove({ _id: this._id});
+  },
 });
 
 Lists.mutations({
@@ -310,6 +314,12 @@ if (Meteor.isServer) {
   });
 
   Lists.before.remove((userId, doc) => {
+    const cards = Cards.find({ listId: doc._id });
+    if (cards) {
+      cards.forEach((card) => {
+        Cards.remove(card._id);
+      });
+    }
     Activities.insert({
       userId,
       type: 'list',

+ 19 - 1
models/swimlanes.js

@@ -180,6 +180,10 @@ Swimlanes.helpers({
     const user = Users.findOne(Meteor.userId());
     return user.profile.boardTemplatesSwimlaneId === this._id;
   },
+
+  remove() {
+    Swimlanes.remove({ _id: this._id});
+  },
 });
 
 Swimlanes.mutations({
@@ -234,7 +238,21 @@ if (Meteor.isServer) {
     });
   });
 
-  Swimlanes.before.remove((userId, doc) => {
+  Swimlanes.before.remove(function(userId, doc) {
+    const lists = Lists.find({
+      boardId: doc.boardId,
+      swimlaneId: {$in: [doc._id, '']},
+      archived: false,
+    }, { sort: ['sort'] });
+
+    if (lists.count() < 2) {
+      lists.forEach((list) => {
+        list.remove();
+      });
+    } else {
+      Cards.remove({swimlaneId: doc._id});
+    }
+
     Activities.insert({
       userId,
       type: 'swimlane',

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "wekan",
-  "version": "v2.63.0",
+  "version": "v2.64.0",
   "description": "Open-Source kanban",
   "private": true,
   "scripts": {

+ 2 - 2
sandstorm-pkgdef.capnp

@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
     appTitle = (defaultText = "Wekan"),
     # The name of the app as it is displayed to the user.
 
-    appVersion = 265,
+    appVersion = 266,
     # Increment this for every release.
 
-    appMarketingVersion = (defaultText = "2.63.0~2019-04-23"),
+    appMarketingVersion = (defaultText = "2.64.0~2019-04-23"),
     # Human-readable presentation of the app version.
 
     minUpgradableAppVersion = 0,