Parcourir la source

Merge branch 'TNick-nested-tasks' into devel

Lauri Ojansivu il y a 7 ans
Parent
commit
ca6cadbe6d
66 fichiers modifiés avec 2225 ajouts et 173 suppressions
  1. 1 0
      .eslintrc.json
  2. 6 2
      CHANGELOG.md
  3. 54 0
      client/components/boards/boardHeader.jade
  4. 97 0
      client/components/boards/boardHeader.js
  5. 19 0
      client/components/boards/boardHeader.styl
  6. 37 0
      client/components/cards/cardDetails.jade
  7. 208 50
      client/components/cards/cardDetails.js
  8. 2 3
      client/components/cards/checklists.jade
  9. 2 2
      client/components/cards/checklists.js
  10. 14 1
      client/components/cards/minicard.jade
  11. 7 0
      client/components/cards/minicard.styl
  12. 97 0
      client/components/cards/subtasks.jade
  13. 145 0
      client/components/cards/subtasks.js
  14. 142 0
      client/components/cards/subtasks.styl
  15. 3 6
      client/components/lists/listBody.js
  16. 24 2
      i18n/ar.i18n.json
  17. 24 2
      i18n/bg.i18n.json
  18. 24 2
      i18n/br.i18n.json
  19. 24 2
      i18n/ca.i18n.json
  20. 24 2
      i18n/cs.i18n.json
  21. 24 2
      i18n/de.i18n.json
  22. 24 2
      i18n/el.i18n.json
  23. 24 2
      i18n/en-GB.i18n.json
  24. 25 2
      i18n/en.i18n.json
  25. 24 2
      i18n/eo.i18n.json
  26. 24 2
      i18n/es-AR.i18n.json
  27. 24 2
      i18n/es.i18n.json
  28. 24 2
      i18n/eu.i18n.json
  29. 24 2
      i18n/fa.i18n.json
  30. 24 2
      i18n/fi.i18n.json
  31. 24 2
      i18n/fr.i18n.json
  32. 24 2
      i18n/gl.i18n.json
  33. 24 2
      i18n/he.i18n.json
  34. 24 2
      i18n/hu.i18n.json
  35. 24 2
      i18n/hy.i18n.json
  36. 24 2
      i18n/id.i18n.json
  37. 24 2
      i18n/ig.i18n.json
  38. 24 2
      i18n/it.i18n.json
  39. 24 2
      i18n/ja.i18n.json
  40. 24 2
      i18n/ka.i18n.json
  41. 24 2
      i18n/km.i18n.json
  42. 24 2
      i18n/ko.i18n.json
  43. 24 2
      i18n/lv.i18n.json
  44. 24 2
      i18n/mn.i18n.json
  45. 24 2
      i18n/nb.i18n.json
  46. 24 2
      i18n/nl.i18n.json
  47. 24 2
      i18n/pl.i18n.json
  48. 24 2
      i18n/pt-BR.i18n.json
  49. 24 2
      i18n/pt.i18n.json
  50. 24 2
      i18n/ro.i18n.json
  51. 24 2
      i18n/ru.i18n.json
  52. 24 2
      i18n/sr.i18n.json
  53. 24 2
      i18n/sv.i18n.json
  54. 24 2
      i18n/ta.i18n.json
  55. 24 2
      i18n/th.i18n.json
  56. 24 2
      i18n/tr.i18n.json
  57. 24 2
      i18n/uk.i18n.json
  58. 24 2
      i18n/vi.i18n.json
  59. 24 2
      i18n/zh-CN.i18n.json
  60. 24 2
      i18n/zh-TW.i18n.json
  61. 3 0
      models/activities.js
  62. 102 0
      models/boards.js
  63. 131 0
      models/cards.js
  64. 2 0
      models/export.js
  65. 71 19
      server/migrations.js
  66. 1 0
      server/publications/boards.js

+ 1 - 0
.eslintrc.json

@@ -134,6 +134,7 @@
     "Announcements": true,
     "Swimlanes": true,
     "ChecklistItems": true,
+    "Subtasks": true,
     "Npm": true
   }
 }

+ 6 - 2
CHANGELOG.md

@@ -1,6 +1,10 @@
 # Upcoming Wekan release
 
-This release fixes the following bugs:
+This release adds the following new features:
+
+- [Nested tasks](https://github.com/wekan/wekan/pull/1723).
+
+and fixes the following bugs:
 
 - [Fix warning about missing space in jade file](https://github.com/wekan/wekan/commit/067aef9de948ef0cb6037d52602100b00d214706);
 - Revert [Fix vertical align of user avatar initials](https://github.com/wekan/wekan/pull/1714), so that [initials are again
@@ -9,7 +13,7 @@ This release fixes the following bugs:
   no-unused-vars](https://github.com/wekan/wekan/commit/dd324aa581bed7ea31f20968c6b596f373e7054f);
 - Fix [Minimize board sidebar actually just moves it over](https://github.com/wekan/wekan/issues/1589).
 
-Thanks to GitHub users dagomar, pravdomil and xet7 for their contributions.
+Thanks to GitHub users dagomar, pravdomil, TNick and xet7 for their contributions.
 
 # v1.11 2018-06-30 Wekan release
 

+ 54 - 0
client/components/boards/boardHeader.jade

@@ -130,6 +130,10 @@ template(name="boardMenuPopup")
         li: a(href="{{exportUrl}}", download="{{exportFilename}}") {{_ 'export-board'}}
         li: a.js-archive-board {{_ 'archive-board'}}
         li: a.js-outgoing-webhooks {{_ 'outgoing-webhooks'}}
+      hr
+      ul.pop-over-list
+        li: a.js-subtask-settings {{_ 'subtask-settings'}}
+
   if isSandstorm
     hr
     ul.pop-over-list
@@ -193,6 +197,56 @@ template(name="boardChangeColorPopup")
           if isSelected
             i.fa.fa-check
 
+template(name="boardSubtaskSettingsPopup")
+  form.board-subtask-settings
+    h3 {{_ 'show-parent-in-minicard'}}
+      a#prefix-with-full-path.flex.js-field-show-parent-in-minicard(class="{{#if $eq presentParentTask 'prefix-with-full-path'}}is-checked{{/if}}")
+        .materialCheckBox(class="{{#if $eq presentParentTask 'prefix-with-full-path'}}is-checked{{/if}}")
+        span {{_ 'prefix-with-full-path'}}
+      a#prefix-with-parent.flex.js-field-show-parent-in-minicard(class="{{#if $eq presentParentTask 'prefix-with-parent'}}is-checked{{/if}}")
+        .materialCheckBox(class="{{#if $eq presentParentTask 'prefix-with-parent'}}is-checked{{/if}}")
+        span {{_ 'prefix-with-parent'}}
+      a#subtext-with-full-path.flex.js-field-show-parent-in-minicard(class="{{#if $eq presentParentTask 'subtext-with-full-path'}}is-checked{{/if}}")
+        .materialCheckBox(class="{{#if $eq presentParentTask 'subtext-with-full-path'}}is-checked{{/if}}")
+        span {{_ 'subtext-with-full-path'}}
+      a#subtext-with-parent.flex.js-field-show-parent-in-minicard(class="{{#if $eq presentParentTask 'subtext-with-parent'}}is-checked{{/if}}")
+        .materialCheckBox(class="{{#if $eq presentParentTask 'subtext-with-parent'}}is-checked{{/if}}")
+        span {{_ 'subtext-with-parent'}}
+      a#no-parent.flex.js-field-show-parent-in-minicard(class="{{#if $eq presentParentTask 'no-parent'}}is-checked{{/if}}")
+        .materialCheckBox(class="{{#if $eq presentParentTask 'no-parent'}}is-checked{{/if}}")
+        span {{_ 'no-parent'}}
+    div
+      hr
+
+    div.check-div
+      a.flex.js-field-has-subtasks(class="{{#if allowsSubtasks}}is-checked{{/if}}")
+        .materialCheckBox(class="{{#if allowsSubtasks}}is-checked{{/if}}")
+        span {{_ 'show-subtasks-field'}}
+
+    label
+      | {{_ 'deposit-subtasks-board'}}
+      select.js-field-deposit-board(disabled="{{#unless allowsSubtasks}}disabled{{/unless}}")
+          each boards
+            if isBoardSelected
+              option(value=_id selected="selected") {{title}}
+            else
+              option(value=_id) {{title}}
+          if isNullBoardSelected
+            option(value='null' selected="selected") {{_ 'custom-field-dropdown-none'}}
+          else
+            option(value='null') {{_ 'custom-field-dropdown-none'}}
+    div
+      hr
+
+    label
+      | {{_ 'deposit-subtasks-list'}}
+      select.js-field-deposit-list(disabled="{{#unless hasLists}}disabled{{/unless}}")
+          each lists
+            if isListSelected
+              option(value=_id selected="selected") {{title}}
+            else
+              option(value=_id) {{title}}
+
 template(name="createBoard")
   form
     label

+ 97 - 0
client/components/boards/boardHeader.js

@@ -25,6 +25,7 @@ Template.boardMenuPopup.events({
   }),
   'click .js-outgoing-webhooks': Popup.open('outgoingWebhooks'),
   'click .js-import-board': Popup.open('chooseBoardSource'),
+  'click .js-subtask-settings': Popup.open('boardSubtaskSettings'),
 });
 
 Template.boardMenuPopup.helpers({
@@ -153,6 +154,102 @@ BlazeComponent.extendComponent({
   },
 }).register('boardChangeColorPopup');
 
+BlazeComponent.extendComponent({
+  onCreated() {
+    this.currentBoard = Boards.findOne(Session.get('currentBoard'));
+  },
+
+  allowsSubtasks() {
+    return this.currentBoard.allowsSubtasks;
+  },
+
+  isBoardSelected() {
+    return this.currentBoard.subtasksDefaultBoardId === this.currentData()._id;
+  },
+
+  isNullBoardSelected() {
+    return (this.currentBoard.subtasksDefaultBoardId === null) || (this.currentBoard.subtasksDefaultBoardId === undefined);
+  },
+
+  boards() {
+    return Boards.find({
+      archived: false,
+      'members.userId': Meteor.userId(),
+    }, {
+      sort: ['title'],
+    });
+  },
+
+  lists() {
+    return Lists.find({
+      boardId: this.currentBoard._id,
+      archived: false,
+    }, {
+      sort: ['title'],
+    });
+  },
+
+  hasLists() {
+    return this.lists().count() > 0;
+  },
+
+  isListSelected() {
+    return this.currentBoard.subtasksDefaultBoardId === this.currentData()._id;
+  },
+
+  presentParentTask() {
+    let result = this.currentBoard.presentParentTask;
+    if ((result === null) || (result === undefined)) {
+      result = 'no-parent';
+    }
+    return result;
+  },
+
+  events() {
+    return [{
+      'click .js-field-has-subtasks'(evt) {
+        evt.preventDefault();
+        this.currentBoard.allowsSubtasks = !this.currentBoard.allowsSubtasks;
+        this.currentBoard.setAllowsSubtasks(this.currentBoard.allowsSubtasks);
+        $('.js-field-has-subtasks .materialCheckBox').toggleClass('is-checked', this.currentBoard.allowsSubtasks);
+        $('.js-field-has-subtasks').toggleClass('is-checked', this.currentBoard.allowsSubtasks);
+        $('.js-field-deposit-board').prop('disabled', !this.currentBoard.allowsSubtasks);
+      },
+      'change .js-field-deposit-board'(evt) {
+        let value = evt.target.value;
+        if (value === 'null') {
+          value = null;
+        }
+        this.currentBoard.setSubtasksDefaultBoardId(value);
+        evt.preventDefault();
+      },
+      'change .js-field-deposit-list'(evt) {
+        this.currentBoard.setSubtasksDefaultListId(evt.target.value);
+        evt.preventDefault();
+      },
+      'click .js-field-show-parent-in-minicard'(evt) {
+        const value = evt.target.id || $(evt.target).parent()[0].id ||  $(evt.target).parent()[0].parent()[0].id;
+        const options = [
+          'prefix-with-full-path',
+          'prefix-with-parent',
+          'subtext-with-full-path',
+          'subtext-with-parent',
+          'no-parent'];
+        options.forEach(function(element) {
+          if (element !== value) {
+            $(`#${element} .materialCheckBox`).toggleClass('is-checked', false);
+            $(`#${element}`).toggleClass('is-checked', false);
+          }
+        });
+        $(`#${value} .materialCheckBox`).toggleClass('is-checked', true);
+        $(`#${value}`).toggleClass('is-checked', true);
+        this.currentBoard.setPresentParentTask(value);
+        evt.preventDefault();
+      },
+    }];
+  },
+}).register('boardSubtaskSettingsPopup');
+
 const CreateBoard = BlazeComponent.extendComponent({
   template() {
     return 'createBoard';

+ 19 - 0
client/components/boards/boardHeader.styl

@@ -1,3 +1,22 @@
 .integration-form
   padding: 5px
   border-bottom: 1px solid #ccc
+
+.flex
+  display: -webkit-box
+  display: -moz-box
+  display: -webkit-flex
+  display: -moz-flex
+  display: -ms-flexbox
+  display: flex
+
+.option
+  @extends .flex
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+  background: #fff;
+  text-decoration: none;
+  -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2);
+  box-shadow: 0 1px 2px rgba(0,0,0,0.2);
+  margin-top: 5px;
+  padding: 5px;

+ 37 - 0
client/components/cards/cardDetails.jade

@@ -13,6 +13,12 @@ template(name="cardDetails")
               = title
               if isWatching
                 i.fa.fa-eye.card-details-watch
+        .card-details-path
+          each parentList
+            |   >  
+            a.js-parent-card(href=linkForCard) {{title}}
+          // else
+            {{_ 'top-level-card'}}
 
     if archived
       p.warning {{_ 'card-archived'}}
@@ -144,6 +150,10 @@ template(name="cardDetails")
     hr
     +checklists(cardId = _id)
 
+    if currentBoard.allowsSubtasks
+      hr
+      +subtasks(cardId = _id)
+
     hr
     h3
       i.fa.fa-paperclip
@@ -273,10 +283,37 @@ template(name="cardMorePopup")
       button.js-copy-card-link-to-clipboard(class="btn") {{_ 'copy-card-link-to-clipboard'}}
     span.clearfix
     br
+    h2 {{_ 'change-card-parent'}}
+    label {{_ 'source-board'}}:
+      select.js-field-parent-board
+        each boards
+          if isParentBoard
+            option(value="{{_id}}" selected) {{title}}
+          else
+            option(value="{{_id}}") {{title}}
+        if isTopLevel
+          option(value="none" selected) {{_ 'custom-field-dropdown-none'}}
+        else
+          option(value="none") {{_ 'custom-field-dropdown-none'}}
+
+    label {{_ 'parent-card'}}:
+      select.js-field-parent-card
+        if isTopLevel
+          option(value="none" selected) {{_ 'custom-field-dropdown-none'}}
+        else
+          each cards
+            if isParentCard
+              option(value="{{_id}}" selected) {{title}}
+            else
+              option(value="{{_id}}") {{title}}
+          option(value="none") {{_ 'custom-field-dropdown-none'}}
+    br
     | {{_ 'added'}}
     span.date(title=card.createdAt) {{ moment createdAt 'LLL' }}
     a.js-delete(title="{{_ 'card-delete-notice'}}") {{_ 'delete'}}
 
+
+
 template(name="cardDeletePopup")
   p {{_ "card-delete-pop"}}
   unless archived

+ 208 - 50
client/components/cards/cardDetails.js

@@ -20,10 +20,11 @@ BlazeComponent.extendComponent({
   },
 
   onCreated() {
+    this.currentBoard = Boards.findOne(Session.get('currentBoard'));
     this.isLoaded = new ReactiveVar(false);
     const boardBody =  this.parentComponent().parentComponent();
     //in Miniview parent is Board, not BoardBody.
-    if (boardBody !== null){
+    if (boardBody !== null) {
       boardBody.showOverlay.set(true);
       boardBody.mouseHasEnterCardDetails = false;
     }
@@ -70,6 +71,30 @@ BlazeComponent.extendComponent({
     }
   },
 
+  presentParentTask() {
+    let result = this.currentBoard.presentParentTask;
+    if ((result === null) || (result === undefined)) {
+      result = 'no-parent';
+    }
+    return result;
+  },
+
+  linkForCard() {
+    const card = this.currentData();
+    let result = '#';
+    if (card) {
+      const board = Boards.findOne(card.boardId);
+      if (board) {
+        result = FlowRouter.url('card', {
+          boardId: card.boardId,
+          slug: board.slug,
+          cardId: card._id,
+        });
+      }
+    }
+    return result;
+  },
+
   onRendered() {
     if (!Utils.isMiniScreen()) this.scrollParentContainer();
     const $checklistsDom = this.$('.card-checklist-items');
@@ -107,6 +132,41 @@ BlazeComponent.extendComponent({
       },
     });
 
+    const $subtasksDom = this.$('.card-subtasks-items');
+
+    $subtasksDom.sortable({
+      tolerance: 'pointer',
+      helper: 'clone',
+      handle: '.subtask-title',
+      items: '.js-subtasks',
+      placeholder: 'subtasks placeholder',
+      distance: 7,
+      start(evt, ui) {
+        ui.placeholder.height(ui.helper.height());
+        EscapeActions.executeUpTo('popup-close');
+      },
+      stop(evt, ui) {
+        let prevChecklist = ui.item.prev('.js-subtasks').get(0);
+        if (prevChecklist) {
+          prevChecklist = Blaze.getData(prevChecklist).subtask;
+        }
+        let nextChecklist = ui.item.next('.js-subtasks').get(0);
+        if (nextChecklist) {
+          nextChecklist = Blaze.getData(nextChecklist).subtask;
+        }
+        const sortIndex = calculateIndexData(prevChecklist, nextChecklist, 1);
+
+        $subtasksDom.sortable('cancel');
+        const subtask = Blaze.getData(ui.item.get(0)).subtask;
+
+        Subtasks.update(subtask._id, {
+          $set: {
+            subtaskSort: sortIndex.base,
+          },
+        });
+      },
+    });
+
     function userIsMember() {
       return Meteor.user() && Meteor.user().isBoardMember();
     }
@@ -116,6 +176,9 @@ BlazeComponent.extendComponent({
       if ($checklistsDom.data('sortable')) {
         $checklistsDom.sortable('option', 'disabled', !userIsMember());
       }
+      if ($subtasksDom.data('sortable')) {
+        $subtasksDom.sortable('option', 'disabled', !userIsMember());
+      }
     });
   },
 
@@ -327,7 +390,6 @@ Template.moveCardPopup.events({
     Popup.close();
   },
 });
-
 BlazeComponent.extendComponent({
   onCreated() {
     subManager.subscribe('board', Session.get('currentBoard'));
@@ -364,6 +426,21 @@ BlazeComponent.extendComponent({
   },
 }).register('boardsAndLists');
 
+
+function cloneCheckList(_id, checklist) {
+  'use strict';
+  const checklistId = checklist._id;
+  checklist.cardId = _id;
+  checklist._id = null;
+  const newChecklistId = Checklists.insert(checklist);
+  ChecklistItems.find({checklistId}).forEach(function(item) {
+    item._id = null;
+    item.checklistId = newChecklistId;
+    item.cardId = _id;
+    ChecklistItems.insert(item);
+  });
+}
+
 Template.copyCardPopup.events({
   'click .js-done'() {
     const card = Cards.findOne(Session.get('currentCard'));
@@ -392,19 +469,18 @@ Template.copyCardPopup.events({
 
       // copy checklists
       let cursor = Checklists.find({cardId: oldId});
+      cursor.forEach(function() {
+        cloneCheckList(_id, arguments[0]);
+      });
+
+      // copy subtasks
+      cursor = Cards.find({parentId: oldId});
       cursor.forEach(function() {
         'use strict';
-        const checklist = arguments[0];
-        const checklistId = checklist._id;
-        checklist.cardId = _id;
-        checklist._id = null;
-        const newChecklistId = Checklists.insert(checklist);
-        ChecklistItems.find({checklistId}).forEach(function(item) {
-          item._id = null;
-          item.checklistId = newChecklistId;
-          item.cardId = _id;
-          ChecklistItems.insert(item);
-        });
+        const subtask = arguments[0];
+        subtask.parentId = _id;
+        subtask._id = null;
+        /* const newSubtaskId = */ Cards.insert(subtask);
       });
 
       // copy card comments
@@ -453,19 +529,18 @@ Template.copyChecklistToManyCardsPopup.events({
 
         // copy checklists
         let cursor = Checklists.find({cardId: oldId});
+        cursor.forEach(function() {
+          cloneCheckList(_id, arguments[0]);
+        });
+
+        // copy subtasks
+        cursor = Cards.find({parentId: oldId});
         cursor.forEach(function() {
           'use strict';
-          const checklist = arguments[0];
-          const checklistId = checklist._id;
-          checklist.cardId = _id;
-          checklist._id = null;
-          const newChecklistId = Checklists.insert(checklist);
-          ChecklistItems.find({checklistId}).forEach(function(item) {
-            item._id = null;
-            item.checklistId = newChecklistId;
-            item.cardId = _id;
-            ChecklistItems.insert(item);
-          });
+          const subtask = arguments[0];
+          subtask.parentId = _id;
+          subtask._id = null;
+          /* const newSubtaskId = */ Cards.insert(subtask);
         });
 
         // copy card comments
@@ -483,36 +558,119 @@ Template.copyChecklistToManyCardsPopup.events({
   },
 });
 
+BlazeComponent.extendComponent({
+  onCreated() {
+    this.currentCard = this.currentData();
+    this.parentCard = this.currentCard.parentCard();
+    if (this.parentCard) {
+      this.parentBoard = this.parentCard.board();
+    } else {
+      this.parentBoard = null;
+    }
+  },
 
-Template.cardMorePopup.events({
-  'click .js-copy-card-link-to-clipboard' () {
-    // Clipboard code from:
-    // https://stackoverflow.com/questions/6300213/copy-selected-text-to-the-clipboard-without-using-flash-must-be-cross-browser
-    const StringToCopyElement = document.getElementById('cardURL');
-    StringToCopyElement.select();
-    if (document.execCommand('copy')) {
-      StringToCopyElement.blur();
+  boards() {
+    const boards = Boards.find({
+      archived: false,
+      'members.userId': Meteor.userId(),
+    }, {
+      sort: ['title'],
+    });
+    return boards;
+  },
+
+  cards() {
+    if (this.parentBoard) {
+      return this.parentBoard.cards();
     } else {
-      document.getElementById('cardURL').selectionStart = 0;
-      document.getElementById('cardURL').selectionEnd = 999;
-      document.execCommand('copy');
-      if (window.getSelection) {
-        if (window.getSelection().empty) { // Chrome
-          window.getSelection().empty();
-        } else if (window.getSelection().removeAllRanges) { // Firefox
-          window.getSelection().removeAllRanges();
-        }
-      } else if (document.selection) { // IE?
-        document.selection.empty();
-      }
+      return [];
     }
   },
-  'click .js-delete': Popup.afterConfirm('cardDelete', function () {
-    Popup.close();
-    Cards.remove(this._id);
-    Utils.goBoardId(this.boardId);
-  }),
-});
+
+  isParentBoard() {
+    const board = this.currentData();
+    if (this.parentBoard) {
+      return board._id === this.parentBoard;
+    }
+    return false;
+  },
+
+  isParentCard() {
+    const card = this.currentData();
+    if (this.parentCard) {
+      return card._id === this.parentCard;
+    }
+    return false;
+  },
+
+  setParentCardId(cardId) {
+    if (cardId === 'null') {
+      cardId = null;
+      this.parentCard = null;
+    } else {
+      this.parentCard = Cards.findOne(cardId);
+    }
+    this.currentCard.setParentId(cardId);
+  },
+
+  events() {
+    return [{
+      'click .js-copy-card-link-to-clipboard' () {
+        // Clipboard code from:
+        // https://stackoverflow.com/questions/6300213/copy-selected-text-to-the-clipboard-without-using-flash-must-be-cross-browser
+        const StringToCopyElement = document.getElementById('cardURL');
+        StringToCopyElement.select();
+        if (document.execCommand('copy')) {
+          StringToCopyElement.blur();
+        } else {
+          document.getElementById('cardURL').selectionStart = 0;
+          document.getElementById('cardURL').selectionEnd = 999;
+          document.execCommand('copy');
+          if (window.getSelection) {
+            if (window.getSelection().empty) { // Chrome
+              window.getSelection().empty();
+            } else if (window.getSelection().removeAllRanges) { // Firefox
+              window.getSelection().removeAllRanges();
+            }
+          } else if (document.selection) { // IE?
+            document.selection.empty();
+          }
+        }
+      },
+      'click .js-delete': Popup.afterConfirm('cardDelete', function () {
+        Popup.close();
+        Cards.remove(this._id);
+        Utils.goBoardId(this.boardId);
+      }),
+      'change .js-field-parent-board'(evt) {
+        const selection = $(evt.currentTarget).val();
+        const list = $('.js-field-parent-card');
+        list.empty();
+        if (selection === 'none') {
+          this.parentBoard = null;
+          list.prop('disabled', true);
+        } else {
+          this.parentBoard = Boards.findOne(selection);
+          this.parentBoard.cards().forEach(function(card) {
+            list.append(
+              $('<option></option>').val(card._id).html(card.title)
+            );
+          });
+          list.prop('disabled', false);
+        }
+        list.append(
+          `<option value='none' selected='selected'>${TAPi18n.__('custom-field-dropdown-none')}</option>`
+        );
+        this.setParentCardId('null');
+      },
+      'change .js-field-parent-card'(evt) {
+        const selection = $(evt.currentTarget).val();
+        this.setParentCardId(selection);
+      },
+    }];
+  },
+}).register('cardMorePopup');
+
 
 // Close the card details pane by pressing escape
 EscapeActions.register('detailsPane',

+ 2 - 3
client/components/cards/checklists.jade

@@ -27,7 +27,6 @@ template(name="checklistDetail")
         if canModifyCard
           a.js-delete-checklist.toggle-delete-checklist-dialog {{_ "delete"}}...
 
-        span.checklist-stat(class="{{#if checklist.isFinished}}is-finished{{/if}}") {{checklist.finishedCount}}/{{checklist.itemCount}}
         if canModifyCard
           h2.title.js-open-inlined-form.is-editable
             +viewer
@@ -75,7 +74,7 @@ template(name="checklistItems")
       +inlinedForm(classNames="js-edit-checklist-item" item = item checklist = checklist)
         +editChecklistItemForm(type = 'item' item = item checklist = checklist)
       else
-        +itemDetail(item = item checklist = checklist)
+        +checklistItemDetail(item = item checklist = checklist)
     if canModifyCard
       +inlinedForm(autoclose=false classNames="js-add-checklist-item" checklist = checklist)
         +addChecklistItemForm
@@ -84,7 +83,7 @@ template(name="checklistItems")
           i.fa.fa-plus
           | {{_ 'add-checklist-item'}}...
 
-template(name='itemDetail')
+template(name='checklistItemDetail')
   .js-checklist-item.checklist-item
     if canModifyCard
       .check-box.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}")

+ 2 - 2
client/components/cards/checklists.js

@@ -204,7 +204,7 @@ Template.checklistDeleteDialog.onDestroyed(() => {
   $cardDetails.animate( { scrollTop: this.scrollState.position });
 });
 
-Template.itemDetail.helpers({
+Template.checklistItemDetail.helpers({
   canModifyCard() {
     return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
   },
@@ -223,4 +223,4 @@ BlazeComponent.extendComponent({
       'click .js-checklist-item .check-box': this.toggleItem,
     }];
   },
-}).register('itemDetail');
+}).register('checklistItemDetail');

+ 14 - 1
client/components/cards/minicard.jade

@@ -7,8 +7,21 @@ template(name="minicard")
         each labels
           .minicard-label(class="card-label-{{color}}" title="{{name}}")
     .minicard-title
+      if $eq 'prefix-with-full-path' currentBoard.presentParentTask
+        .parent-prefix
+          | {{ parentString ' > ' }}
+      if $eq 'prefix-with-parent' currentBoard.presentParentTask
+        .parent-prefix
+          | {{ parentCardName }}
       +viewer
-        = title
+        {{ title }}
+      if $eq 'subtext-with-full-path' currentBoard.presentParentTask
+        .parent-subtext
+          | {{ parentString ' > ' }}
+      if $eq 'subtext-with-parent' currentBoard.presentParentTask
+        .parent-subtext
+          | {{ parentCardName }}
+
     .dates
       if receivedAt
         unless startAt

+ 7 - 0
client/components/cards/minicard.styl

@@ -162,6 +162,13 @@
       margin-bottom: 20px
       overflow-y: auto
 
+.parent-prefix
+  color: darken(white, 30%)
+  font-size: 0.9em
+.parent-subtext
+  color: darken(white, 30%)
+  font-size: 0.9em
+
 @media screen and (max-width: 800px)
   .minicard
     .is-selected &

+ 97 - 0
client/components/cards/subtasks.jade

@@ -0,0 +1,97 @@
+template(name="subtasks")
+  h3 {{_ 'subtasks'}}
+  if toggleDeleteDialog.get
+    .board-overlay#card-details-overlay
+    +subtaskDeleteDialog(subtask = subtaskToDelete)
+
+
+  .card-subtasks-items
+    each subtask in currentCard.subtasks
+      +subtaskDetail(subtask = subtask)
+
+  if canModifyCard
+    +inlinedForm(autoclose=false classNames="js-add-subtask" cardId = cardId)
+      +addSubtaskItemForm
+    else
+      a.js-open-inlined-form
+        i.fa.fa-plus
+        | {{_ 'add-subtask'}}...
+
+template(name="subtaskDetail")
+  .js-subtasks.subtask
+    +inlinedForm(classNames="js-edit-subtask-title" subtask = subtask)
+      +editSubtaskItemForm(subtask = subtask)
+    else
+      .subtask-title
+        span
+        a.js-view-subtask(title="{{ subtask.title }}") {{_ "view-it"}}
+        if canModifyCard
+          a.js-delete-subtask.toggle-delete-subtask-dialog {{_ "delete"}}...
+
+        if canModifyCard
+          h2.title.js-open-inlined-form.is-editable
+            +viewer
+              = subtask.title
+        else
+          h2.title
+            +viewer
+                = subtask.title
+
+template(name="subtaskDeleteDialog")
+  .js-confirm-subtask-delete
+    p
+      i(class="fa fa-exclamation-triangle" aria-hidden="true")
+    p
+      | {{_ 'confirm-subtask-delete-dialog'}}
+      span {{subtask.title}}
+      | ?
+    .js-subtask-delete-buttons
+      button.confirm-subtask-delete(type="button") {{_ 'delete'}}
+      button.toggle-delete-subtask-dialog(type="button") {{_ 'cancel'}}
+
+template(name="addSubtaskItemForm")
+  textarea.js-add-subtask-item(rows='1' autofocus)
+  .edit-controls.clearfix
+    button.primary.confirm.js-submit-add-subtask-item-form(type="submit") {{_ 'save'}}
+    a.fa.fa-times-thin.js-close-inlined-form
+
+template(name="editSubtaskItemForm")
+  textarea.js-edit-subtask-item(rows='1' autofocus)
+    if $eq type 'item'
+      = item.title
+    else
+      = subtask.title
+  .edit-controls.clearfix
+    button.primary.confirm.js-submit-edit-subtask-item-form(type="submit") {{_ 'save'}}
+    a.fa.fa-times-thin.js-close-inlined-form
+    span(title=createdAt) {{ moment createdAt }}
+    if canModifyCard
+      a.js-delete-subtask-item {{_ "delete"}}...
+
+template(name="subtasksItems")
+  .subtasks-items.js-subtasks-items
+    each item in subtasks.items
+      +inlinedForm(classNames="js-edit-subtask-item" item = item subtasks = subtasks)
+        +editSubtaskItemForm(type = 'item' item = item subtasks = subtasks)
+      else
+        +subtaskItemDetail(item = item subtasks = subtasks)
+    if canModifyCard
+      +inlinedForm(autoclose=false classNames="js-add-subtask-item" subtasks = subtasks)
+        +addSubtaskItemForm
+      else
+        a.add-subtask-item.js-open-inlined-form
+          i.fa.fa-plus
+          | {{_ 'add-subtask-item'}}...
+
+template(name='subtaskItemDetail')
+  .js-subtasks-item.subtasks-item
+    if canModifyCard
+      .check-box.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}")
+      .item-title.js-open-inlined-form.is-editable(class="{{#if item.isFinished }}is-checked{{/if}}")
+        +viewer
+          = item.title
+    else
+      .materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}")
+      .item-title(class="{{#if item.isFinished }}is-checked{{/if}}")
+        +viewer
+          = item.title

+ 145 - 0
client/components/cards/subtasks.js

@@ -0,0 +1,145 @@
+BlazeComponent.extendComponent({
+  canModifyCard() {
+    return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+  },
+}).register('subtaskDetail');
+
+BlazeComponent.extendComponent({
+
+  addSubtask(event) {
+    event.preventDefault();
+    const textarea = this.find('textarea.js-add-subtask-item');
+    const title = textarea.value.trim();
+    const cardId = this.currentData().cardId;
+    const card = Cards.findOne(cardId);
+    const sortIndex = -1;
+    const crtBoard = Boards.findOne(card.boardId);
+    const targetBoard = crtBoard.getDefaultSubtasksBoard();
+    const listId = targetBoard.getDefaultSubtasksListId();
+    const swimlaneId = targetBoard.getDefaultSwimline()._id;
+
+    if (title) {
+      const _id = Cards.insert({
+        title,
+        parentId: cardId,
+        members: [],
+        labelIds: [],
+        customFields: [],
+        listId,
+        boardId: targetBoard._id,
+        sort: sortIndex,
+        swimlaneId,
+      });
+
+      // In case the filter is active we need to add the newly inserted card in
+      // the list of exceptions -- cards that are not filtered. Otherwise the
+      // card will disappear instantly.
+      // See https://github.com/wekan/wekan/issues/80
+      Filter.addException(_id);
+
+
+      setTimeout(() => {
+        this.$('.add-subtask-item').last().click();
+      }, 100);
+    }
+    textarea.value = '';
+    textarea.focus();
+  },
+
+  canModifyCard() {
+    return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+  },
+
+  deleteSubtask() {
+    const subtask = this.currentData().subtask;
+    if (subtask && subtask._id) {
+      subtask.archive();
+      this.toggleDeleteDialog.set(false);
+    }
+  },
+
+  editSubtask(event) {
+    event.preventDefault();
+    const textarea = this.find('textarea.js-edit-subtask-item');
+    const title = textarea.value.trim();
+    const subtask = this.currentData().subtask;
+    subtask.setTitle(title);
+  },
+
+  onCreated() {
+    this.toggleDeleteDialog = new ReactiveVar(false);
+    this.subtaskToDelete = null; //Store data context to pass to subtaskDeleteDialog template
+  },
+
+  pressKey(event) {
+    //If user press enter key inside a form, submit it
+    //Unless the user is also holding down the 'shift' key
+    if (event.keyCode === 13 && !event.shiftKey) {
+      event.preventDefault();
+      const $form = $(event.currentTarget).closest('form');
+      $form.find('button[type=submit]').click();
+    }
+  },
+
+  events() {
+    const events = {
+      'click .toggle-delete-subtask-dialog'(event) {
+        if($(event.target).hasClass('js-delete-subtask')){
+          this.subtaskToDelete = this.currentData().subtask; //Store data context
+        }
+        this.toggleDeleteDialog.set(!this.toggleDeleteDialog.get());
+      },
+      'click .js-view-subtask'(event) {
+        if($(event.target).hasClass('js-view-subtask')){
+          const subtask = this.currentData().subtask;
+          const board = subtask.board();
+          FlowRouter.go('card', {
+            boardId: board._id,
+            slug: board.slug,
+            cardId: subtask._id,
+          });
+        }
+      },
+    };
+
+    return [{
+      ...events,
+      'submit .js-add-subtask': this.addSubtask,
+      'submit .js-edit-subtask-title': this.editSubtask,
+      'click .confirm-subtask-delete': this.deleteSubtask,
+      keydown: this.pressKey,
+    }];
+  },
+}).register('subtasks');
+
+Template.subtaskDeleteDialog.onCreated(() => {
+  const $cardDetails = this.$('.card-details');
+  this.scrollState = { position: $cardDetails.scrollTop(), //save current scroll position
+    top: false, //required for smooth scroll animation
+  };
+  //Callback's purpose is to only prevent scrolling after animation is complete
+  $cardDetails.animate({ scrollTop: 0 }, 500, () => { this.scrollState.top = true; });
+
+  //Prevent scrolling while dialog is open
+  $cardDetails.on('scroll', () => {
+    if(this.scrollState.top) { //If it's already in position, keep it there. Otherwise let animation scroll
+      $cardDetails.scrollTop(0);
+    }
+  });
+});
+
+Template.subtaskDeleteDialog.onDestroyed(() => {
+  const $cardDetails = this.$('.card-details');
+  $cardDetails.off('scroll'); //Reactivate scrolling
+  $cardDetails.animate( { scrollTop: this.scrollState.position });
+});
+
+Template.subtaskItemDetail.helpers({
+  canModifyCard() {
+    return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+  },
+});
+
+BlazeComponent.extendComponent({
+  // ...
+}).register('subtaskItemDetail');

+ 142 - 0
client/components/cards/subtasks.styl

@@ -0,0 +1,142 @@
+.js-add-subtask
+  color: #8c8c8c
+
+textarea.js-add-subtask-item, textarea.js-edit-subtask-item
+  overflow: hidden
+  word-wrap: break-word
+  resize: none
+  height: 34px
+
+.delete-text
+  color: #8c8c8c
+  text-decoration: underline
+  word-wrap: break-word
+  float: right
+  padding-top: 6px
+  &:hover
+    color: inherit
+
+.subtask-title
+  .checkbox
+    float: left
+    width: 30px
+    height 30px
+    font-size: 18px
+    line-height: 30px
+
+  .title
+    font-size: 18px
+    line-height: 25px
+
+  .subtasks-stat
+    margin: 0 0.5em
+    float: right
+    padding-top: 6px
+    &.is-finished
+      color: #3cb500
+
+  .js-delete-subtask
+    @extends .delete-text
+    margin: 0 0.5em
+
+  .js-view-subtask
+    @extends .delete-text
+
+.js-confirm-subtask-delete
+  background-color: darken(white, 3%)
+  position: absolute
+  float: left;
+  width: 60%
+  margin-top: 0
+  margin-left: 13%
+  padding-bottom: 2%
+  padding-left: 3%
+  padding-right: 3%
+  z-index: 17
+  border-radius: 3px
+
+  p
+    position: relative
+    margin-top: 3%
+    width: 100%
+    text-align: center
+    span
+      font-weight: bold
+
+    i
+      font-size: 2em
+
+  .js-subtask-delete-buttons
+    position: relative
+    padding: left 2% right 2%
+    .confirm-subtask-delete
+      margin-left: 12%
+      float: left
+    .toggle-delete-subtask-dialog
+      margin-right: 12%
+      float: right
+
+#card-details-overlay
+  top: 0
+  bottom: -600px
+  right: 0
+
+.subtasks
+  background: darken(white, 3%)
+
+  &.placeholder
+    background: darken(white, 20%)
+    border-radius: 2px
+
+  &.ui-sortable-helper
+    box-shadow: -2px 2px 8px rgba(0, 0, 0, .3),
+                0 0 1px rgba(0, 0, 0, .5)
+    transform: rotate(4deg)
+    cursor: grabbing
+
+
+.subtasks-item
+  margin: 0 0 0 0.1em
+  line-height: 18px
+  font-size: 1.1em
+  margin-top: 3px
+  display: flex
+  background: darken(white, 3%)
+
+  &.placeholder
+    background: darken(white, 20%)
+    border-radius: 2px
+
+  &.ui-sortable-helper
+    box-shadow: -2px 2px 8px rgba(0, 0, 0, .3),
+                0 0 1px rgba(0, 0, 0, .5)
+    transform: rotate(4deg)
+    cursor: grabbing
+
+  &:hover
+    background-color: darken(white, 8%)
+
+  .check-box
+    margin: 0.1em 0 0 0;
+    &.is-checked
+      border-bottom: 2px solid #3cb500
+      border-right: 2px solid #3cb500
+
+  .item-title
+    flex: 1
+    padding-left: 10px;
+    &.is-checked
+      color: #8c8c8c
+      font-style: italic
+    & .viewer
+      p
+        margin-bottom: 2px
+
+.js-delete-subtask-item
+  margin: 0 0 0.5em 1.33em
+  @extends .delete-text
+  padding: 12px 0 0 0
+
+.add-subtask-item
+  margin: 0.2em 0 0.5em 1.33em
+  display: inline-block

+ 3 - 6
client/components/lists/listBody.js

@@ -36,17 +36,14 @@ BlazeComponent.extendComponent({
     const members = formComponent.members.get();
     const labelIds = formComponent.labels.get();
     const customFields = formComponent.customFields.get();
-    //console.log('members', members);
-    //console.log('labelIds', labelIds);
-    //console.log('customFields', customFields);
 
-    const boardId = this.data().board()._id;
+    const boardId = this.data().board();
     let swimlaneId = '';
     const boardView = Meteor.user().profile.boardView;
     if (boardView === 'board-view-swimlanes')
       swimlaneId = this.parentComponent().parentComponent().data()._id;
     else if ((boardView === 'board-view-lists') || (boardView === 'board-view-cal'))
-      swimlaneId = Swimlanes.findOne({boardId})._id;
+      swimlaneId = boardId.getDefaultSwimline()._id;
 
     if (title) {
       const _id = Cards.insert({
@@ -55,7 +52,7 @@ BlazeComponent.extendComponent({
         labelIds,
         customFields,
         listId: this.data()._id,
-        boardId: this.data().board()._id,
+        boardId: boardId._id,
         sort: sortIndex,
         swimlaneId,
       });

+ 24 - 2
i18n/ar.i18n.json

@@ -2,6 +2,7 @@
     "accept": "اقبلboard",
     "act-activity-notify": "[Wekan] اشعار عن نشاط",
     "act-addAttachment": "ربط __attachment__ الى __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "علق على __comment__ : __card__",
@@ -41,6 +42,7 @@
     "activity-removed": "حذف %s إلى %s",
     "activity-sent": "إرسال %s إلى %s",
     "activity-unjoined": "غادر %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "أضاف قائمة تحقق إلى %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "أضف",
@@ -48,6 +50,7 @@
     "add-board": "إضافة لوحة",
     "add-card": "إضافة بطاقة",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "إضافة قائمة تدقيق",
     "add-checklist-item": "إضافة عنصر إلى قائمة التحقق",
     "add-cover": "إضافة غلاف",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "تغيير كلمة المرور",
     "changePermissionsPopup-title": "تعديل الصلاحيات",
     "changeSettingsPopup-title": "تغيير الاعدادات",
+    "subtasks": "Subtasks",
     "checklists": "قوائم التّدقيق",
     "click-to-star": "اضغط لإضافة اللوحة للمفضلة.",
     "click-to-unstar": "اضغط لحذف اللوحة من المفضلة.",
@@ -163,7 +167,8 @@
     "comment-only": "التعليق فقط",
     "comment-only-desc": "يمكن التعليق على بطاقات فقط.",
     "computer": "حاسوب",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "نسخ رابط البطاقة إلى الحافظة",
     "copyCardPopup-title": "نسخ البطاقة",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/bg.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Accept",
     "act-activity-notify": "[Wekan] Известия за дейности",
     "act-addAttachment": "прикачи __attachment__ към __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "добави списък със задачи __checklist__ към __card__",
     "act-addChecklistItem": "добави __checklistItem__ към списък със задачи __checklist__ в __card__",
     "act-addComment": "Коментира в __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "премахна %s от %s",
     "activity-sent": "изпрати %s до %s",
     "activity-unjoined": "вече не е част от %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "добави списък със задачи към %s",
     "activity-checklist-item-added": "добави точка към '%s' в/във %s",
     "add": "Добави",
@@ -48,6 +50,7 @@
     "add-board": "Добави Табло",
     "add-card": "Добави карта",
     "add-swimlane": "Добави коридор",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Добави списък със задачи",
     "add-checklist-item": "Добави точка към списъка със задачи",
     "add-cover": "Добави корица",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Промени паролата",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Промяна на настройките",
+    "subtasks": "Subtasks",
     "checklists": "Списъци със задачи",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Натиснете, за да премахнете това табло от любими.",
@@ -163,7 +167,8 @@
     "comment-only": "Само коментар",
     "comment-only-desc": "Може да коментира само в карти.",
     "computer": "Компютър",
-    "confirm-checklist-delete-dialog": "Сигурни ли сте, че искате да изтриете този чеклист?",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Копирай връзката на картата в клипборда",
     "copyCardPopup-title": "Копирай картата",
     "copyChecklistToManyCardsPopup-title": "Копирай чеклисти в други карти",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/br.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Asantiñ",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Ouzhpenn",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Ouzphenn ur golo",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Kemmañ ger-tremen",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/ca.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Accepta",
     "act-activity-notify": "[Wekan] Notificació d'activitat",
     "act-addAttachment": "adjuntat __attachment__ a __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "afegida la checklist _checklist__ a __card__",
     "act-addChecklistItem": "afegit __checklistItem__ a la checklist __checklist__ on __card__",
     "act-addComment": "comentat a __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "ha eliminat %s de %s",
     "activity-sent": "ha enviat %s %s",
     "activity-unjoined": "desassignat %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "Checklist afegida a %s",
     "activity-checklist-item-added": "afegida entrada de checklist de '%s' a %s",
     "add": "Afegeix",
@@ -48,6 +50,7 @@
     "add-board": "Afegeix Tauler",
     "add-card": "Afegeix fitxa",
     "add-swimlane": "Afegix Carril de Natació",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Afegeix checklist",
     "add-checklist-item": "Afegeix un ítem",
     "add-cover": "Afegeix coberta",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Canvia la contrasenya",
     "changePermissionsPopup-title": "Canvia permisos",
     "changeSettingsPopup-title": "Canvia configuració",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Fes clic per destacar aquest tauler.",
     "click-to-unstar": "Fes clic per deixar de destacar aquest tauler.",
@@ -163,7 +167,8 @@
     "comment-only": "Només comentaris",
     "comment-only-desc": "Només pots fer comentaris a les fitxes",
     "computer": "Ordinador",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copia l'enllaç de la ftixa al porta-retalls",
     "copyCardPopup-title": "Copia la fitxa",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/cs.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Přijmout",
     "act-activity-notify": "[Wekan] Notifikace aktivit",
     "act-addAttachment": "přiložen __attachment__ do __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "přidán checklist __checklist__ do __card__",
     "act-addChecklistItem": "přidán __checklistItem__ do checklistu __checklist__ v __card__",
     "act-addComment": "komentář k __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "odstraněn %s z %s",
     "activity-sent": "%s posláno na %s",
     "activity-unjoined": "odpojen %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "přidán checklist do %s",
     "activity-checklist-item-added": "přidána položka checklist do '%s' v %s",
     "add": "Přidat",
@@ -48,6 +50,7 @@
     "add-board": "Přidat tablo",
     "add-card": "Přidat kartu",
     "add-swimlane": "Přidat Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Přidat zaškrtávací seznam",
     "add-checklist-item": "Přidat položku do zaškrtávacího seznamu",
     "add-cover": "Přidat obal",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Změnit heslo",
     "changePermissionsPopup-title": "Změnit oprávnění",
     "changeSettingsPopup-title": "Změnit nastavení",
+    "subtasks": "Subtasks",
     "checklists": "Checklisty",
     "click-to-star": "Kliknutím přidat hvězdičku tomuto tablu.",
     "click-to-unstar": "Kliknutím odebrat hvězdičku tomuto tablu.",
@@ -163,7 +167,8 @@
     "comment-only": "Pouze komentáře",
     "comment-only-desc": "Může přidávat komentáře pouze do karet.",
     "computer": "Počítač",
-    "confirm-checklist-delete-dialog": "Opravdu chcete smazat tento checklist?",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Kopírovat adresu karty do mezipaměti",
     "copyCardPopup-title": "Kopírovat kartu",
     "copyChecklistToManyCardsPopup-title": "Kopírovat checklist do více karet",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Smazat tablo?",
-    "delete-board": "Smazat tablo"
+    "delete-board": "Smazat tablo",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/de.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Akzeptieren",
     "act-activity-notify": "[Wekan] Aktivitätsbenachrichtigung",
     "act-addAttachment": "hat __attachment__ an __card__ angehängt",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "hat die Checkliste __checklist__ zu __card__ hinzugefügt",
     "act-addChecklistItem": "hat __checklistItem__ zur Checkliste __checklist__ in __card__ hinzugefügt",
     "act-addComment": "hat __card__ kommentiert: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "hat %s von %s entfernt",
     "activity-sent": "hat %s an %s gesendet",
     "activity-unjoined": "hat %s verlassen",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "hat eine Checkliste zu %s hinzugefügt",
     "activity-checklist-item-added": "hat eine Checklistenposition zu '%s' in %s hinzugefügt",
     "add": "Hinzufügen",
@@ -48,6 +50,7 @@
     "add-board": "neues Board",
     "add-card": "Karte hinzufügen",
     "add-swimlane": "Swimlane hinzufügen",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Checkliste hinzufügen",
     "add-checklist-item": "Position zu einer Checkliste hinzufügen",
     "add-cover": "Cover hinzufügen",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Passwort ändern",
     "changePermissionsPopup-title": "Berechtigungen ändern",
     "changeSettingsPopup-title": "Einstellungen ändern",
+    "subtasks": "Subtasks",
     "checklists": "Checklisten",
     "click-to-star": "Klicken Sie, um das Board mit einem Stern zu markieren.",
     "click-to-unstar": "Klicken Sie, um den Stern vom Board zu entfernen.",
@@ -163,7 +167,8 @@
     "comment-only": "Nur kommentierbar",
     "comment-only-desc": "Kann Karten nur Kommentieren",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Sind Sie sicher, dass Sie die Checkliste löschen möchten?",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Kopiere Link zur Karte in die Zwischenablage",
     "copyCardPopup-title": "Karte kopieren",
     "copyChecklistToManyCardsPopup-title": "Checklistenvorlage in mehrere Karten kopieren",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Löschen kann nicht rückgängig gemacht werden. Sie werden alle Listen, Karten und Aktionen, die mit diesem Board verbunden sind, verlieren.",
     "delete-board-confirm-popup": "Alle Listen, Karten, Labels und Akivitäten werden gelöscht und Sie können die Inhalte des Boards nicht wiederherstellen! Die Aktion kann nicht rückgängig gemacht werden.",
     "boardDeletePopup-title": "Board löschen?",
-    "delete-board": "Board löschen"
+    "delete-board": "Board löschen",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/el.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Accept",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Προσθήκη",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Προσθήκη Κάρτας",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Αλλαγή Κωδικού",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Αλλαγή Ρυθμίσεων",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Υπολογιστής",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/en-GB.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Accept",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached _ attachment _ to _ card _",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Add",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 25 - 2
i18n/en.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Accept",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Add",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,23 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
+
 }

+ 24 - 2
i18n/eo.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Akcepti",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "Sendis %s al %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Aldoni",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Ŝangi pasvorton",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Ŝanĝi agordojn",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Komputilo",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/es-AR.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Aceptar",
     "act-activity-notify": "[Wekan] Notificación de Actividad",
     "act-addAttachment": "adjunto __attachment__ a __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "lista de ítems __checklist__ agregada a __card__",
     "act-addChecklistItem": " __checklistItem__ agregada a lista de ítems __checklist__ en __card__",
     "act-addComment": "comentado en __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "eliminadas %s de %s",
     "activity-sent": "enviadas %s a %s",
     "activity-unjoined": "separadas %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "agregada lista de tareas a %s",
     "activity-checklist-item-added": "agregado item de lista de tareas a '%s' en %s",
     "add": "Agregar",
@@ -48,6 +50,7 @@
     "add-board": "Agregar Tablero",
     "add-card": "Agregar Tarjeta",
     "add-swimlane": "Agregar Calle",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Agregar Lista de Tareas",
     "add-checklist-item": "Agregar ítem a lista de tareas",
     "add-cover": "Agregar Portadas",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Cambiar Contraseña",
     "changePermissionsPopup-title": "Cambiar Permisos",
     "changeSettingsPopup-title": "Cambiar Opciones",
+    "subtasks": "Subtasks",
     "checklists": "Listas de ítems",
     "click-to-star": "Clickeá para darle una estrella a este tablero.",
     "click-to-unstar": "Clickeá para sacarle la estrella al tablero.",
@@ -163,7 +167,8 @@
     "comment-only": "Comentar solamente",
     "comment-only-desc": "Puede comentar en tarjetas solamente.",
     "computer": "Computadora",
-    "confirm-checklist-delete-dialog": "¿Estás segur@ que querés borrar la lista de ítems?",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copiar enlace a tarjeta en el portapapeles",
     "copyCardPopup-title": "Copiar Tarjeta",
     "copyChecklistToManyCardsPopup-title": "Copiar Plantilla Checklist a Muchas Tarjetas",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/es.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Aceptar",
     "act-activity-notify": "[Wekan] Notificación de actividad",
     "act-addAttachment": "ha adjuntado __attachment__ a __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "ha añadido la lista de verificación __checklist__ a __card__",
     "act-addChecklistItem": "ha añadido __checklistItem__ a la lista de verificación __checklist__ en __card__",
     "act-addComment": "ha comentado en __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "ha eliminado %s de %s",
     "activity-sent": "ha enviado %s a %s",
     "activity-unjoined": "se ha desvinculado de %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "ha añadido una lista de verificación a %s",
     "activity-checklist-item-added": "ha añadido el elemento de la lista de verificación a '%s' en %s",
     "add": "Añadir",
@@ -48,6 +50,7 @@
     "add-board": "Añadir tablero",
     "add-card": "Añadir una tarjeta",
     "add-swimlane": "Añadir un carril de flujo",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Añadir una lista de verificación",
     "add-checklist-item": "Añadir un elemento a la lista de verificación",
     "add-cover": "Añadir portada",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Cambiar la contraseña",
     "changePermissionsPopup-title": "Cambiar los permisos",
     "changeSettingsPopup-title": "Cambiar las preferencias",
+    "subtasks": "Subtasks",
     "checklists": "Lista de verificación",
     "click-to-star": "Haz clic para destacar este tablero.",
     "click-to-unstar": "Haz clic para dejar de destacar este tablero.",
@@ -163,7 +167,8 @@
     "comment-only": "Sólo comentarios",
     "comment-only-desc": "Solo puedes comentar en las tarjetas.",
     "computer": "el ordenador",
-    "confirm-checklist-delete-dialog": "¿Seguro que desea eliminar la lista de verificación?",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles",
     "copyCardPopup-title": "Copiar la tarjeta",
     "copyChecklistToManyCardsPopup-title": "Copiar la plantilla de la lista de verificación en varias tarjetas",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Se eliminarán todas las listas, tarjetas y acciones asociadas a este tablero. Esta acción no puede deshacerse.",
     "delete-board-confirm-popup": "Se eliminarán todas las listas, tarjetas, etiquetas y actividades, y no podrás recuperar los contenidos del tablero. Esta acción no puede deshacerse.",
     "boardDeletePopup-title": "¿Borrar el tablero?",
-    "delete-board": "Borrar el tablero"
+    "delete-board": "Borrar el tablero",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/eu.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Onartu",
     "act-activity-notify": "[Wekan] Jarduera-jakinarazpena",
     "act-addAttachment": "__attachment__ __card__ txartelera erantsita",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "gehituta checklist __checklist__ __card__ -ri",
     "act-addChecklistItem": "gehituta __checklistItem__ checklist __checklist__ on __card__ -ri",
     "act-addComment": "__card__ txartelean iruzkina: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "%s %s(e)tik kenduta",
     "activity-sent": "%s %s(e)ri bidalita",
     "activity-unjoined": "%s utzita",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "egiaztaketa zerrenda %s(e)ra gehituta",
     "activity-checklist-item-added": "egiaztaketa zerrendako elementuak '%s'(e)ra gehituta %s(e)n",
     "add": "Gehitu",
@@ -48,6 +50,7 @@
     "add-board": "Gehitu arbela",
     "add-card": "Gehitu txartela",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Gehitu egiaztaketa zerrenda",
     "add-checklist-item": "Gehitu elementu bat egiaztaketa zerrendara",
     "add-cover": "Gehitu azala",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Aldatu pasahitza",
     "changePermissionsPopup-title": "Aldatu baimenak",
     "changeSettingsPopup-title": "Aldatu ezarpenak",
+    "subtasks": "Subtasks",
     "checklists": "Egiaztaketa zerrenda",
     "click-to-star": "Egin klik arbel honi izarra jartzeko",
     "click-to-unstar": "Egin klik arbel honi izarra kentzeko",
@@ -163,7 +167,8 @@
     "comment-only": "Iruzkinak besterik ez",
     "comment-only-desc": "Iruzkinak txarteletan soilik egin ditzake",
     "computer": "Ordenagailua",
-    "confirm-checklist-delete-dialog": "Ziur zaude kontrol-zerrenda ezabatu nahi duzula",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Kopiatu txartela arbelera",
     "copyCardPopup-title": "Kopiatu txartela",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/fa.i18n.json

@@ -2,6 +2,7 @@
     "accept": "پذیرش",
     "act-activity-notify": "[wekan] اطلاع فعالیت",
     "act-addAttachment": "پیوست __attachment__ به __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "سیاهه __checklist__ به __card__ افزوده شد",
     "act-addChecklistItem": "__checklistItem__ به سیاهه __checklist__ در __card__ افزوده شد",
     "act-addComment": "درج نظر برای __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "%s از %s حذف شد",
     "activity-sent": "ارسال %s به %s",
     "activity-unjoined": "قطع اتصال %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "سیاهه به %s اضافه شد",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "افزودن",
@@ -48,6 +50,7 @@
     "add-board": "افزودن برد",
     "add-card": "افزودن کارت",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "افزودن چک لیست",
     "add-checklist-item": "افزودن مورد به سیاهه",
     "add-cover": "جلد کردن",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "تغییر کلمه عبور",
     "changePermissionsPopup-title": "تغییر دسترسی‌ها",
     "changeSettingsPopup-title": "تغییر تنظیمات",
+    "subtasks": "Subtasks",
     "checklists": "سیاهه‌ها",
     "click-to-star": "با کلیک کردن ستاره بدهید",
     "click-to-unstar": "با کلیک کردن ستاره را کم کنید",
@@ -163,7 +167,8 @@
     "comment-only": "فقط نظر",
     "comment-only-desc": "فقط می‌تواند روی کارت‌ها نظر دهد.",
     "computer": "رایانه",
-    "confirm-checklist-delete-dialog": "مطمئنید که می‌خواهید سیاهه را حذف کنید؟",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "درج پیوند کارت در حافظه",
     "copyCardPopup-title": "کپی کارت",
     "copyChecklistToManyCardsPopup-title": "کپی قالب کارت به کارت‌های متعدد",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/fi.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Hyväksy",
     "act-activity-notify": "[Wekan] Toimintailmoitus",
     "act-addAttachment": "liitetty __attachment__ kortille __card__",
+    "act-addSubtask": "lisätty alitehtävä __checklist__ kortille __card__",
     "act-addChecklist": "lisätty tarkistuslista __checklist__ kortille __card__",
     "act-addChecklistItem": "lisätty kohta __checklistItem__ tarkistuslistaan __checklist__ kortilla __card__",
     "act-addComment": "kommentoitu __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "poistettu %s kohteesta %s",
     "activity-sent": "lähetetty %s kohteeseen %s",
     "activity-unjoined": "peruttu %s liittyminen",
+    "activity-subtask-added": "lisätty alitehtävä kohteeseen %s",
     "activity-checklist-added": "lisätty tarkistuslista kortille %s",
     "activity-checklist-item-added": "lisäsi kohdan tarkistuslistaan '%s' kortilla %s",
     "add": "Lisää",
@@ -48,6 +50,7 @@
     "add-board": "Lisää taulu",
     "add-card": "Lisää kortti",
     "add-swimlane": "Lisää Swimlane",
+    "add-subtask": "Lisää alitehtävä",
     "add-checklist": "Lisää tarkistuslista",
     "add-checklist-item": "Lisää kohta tarkistuslistaan",
     "add-cover": "Lisää kansi",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Vaihda salasana",
     "changePermissionsPopup-title": "Muokkaa oikeuksia",
     "changeSettingsPopup-title": "Muokkaa asetuksia",
+    "subtasks": "Alitehtävät",
     "checklists": "Tarkistuslistat",
     "click-to-star": "Klikkaa merkataksesi tämä taulu tähdellä.",
     "click-to-unstar": "Klikkaa poistaaksesi tähtimerkintä taululta.",
@@ -163,7 +167,8 @@
     "comment-only": "Vain kommentointi",
     "comment-only-desc": "Voi vain kommentoida kortteja",
     "computer": "Tietokone",
-    "confirm-checklist-delete-dialog": "Haluatko varmasti poistaa tarkistuslistan",
+    "confirm-subtask-delete-dialog": "Oletko varma että haluat poistaa alitehtävän?",
+    "confirm-checklist-delete-dialog": "Oletko varma että haluat poistaa tarkistuslistan?",
     "copy-card-link-to-clipboard": "Kopioi kortin linkki leikepöydälle",
     "copyCardPopup-title": "Kopioi kortti",
     "copyChecklistToManyCardsPopup-title": "Kopioi tarkistuslistan malli monille korteille",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Poistaminen on lopullista. Menetät kaikki listat, kortit ja toimet tällä taululla.",
     "delete-board-confirm-popup": "Kaikki listat, kortit, tunnisteet ja toimet poistetaan ja et pysty palauttamaan taulun sisältöä. Tätä ei voi peruuttaa.",
     "boardDeletePopup-title": "Poista taulu?",
-    "delete-board": "Poista taulu"
+    "delete-board": "Poista taulu",
+    "default-subtasks-board": "Alitehtävät __board__ taululle",
+    "default": "Oletus",
+    "queue": "Jono",
+    "subtask-settings": "Alitehtävä asetukset",
+    "boardSubtaskSettingsPopup-title": "Taulu alitehtävien asetukset",
+    "show-subtasks-field": "Korteilla voi olla alitehtäviä",
+    "deposit-subtasks-board": "Tallenta alitehtävät tälle taululle:",
+    "deposit-subtasks-list": "Laskeutumislista alatehtäville tallennettu tänne:",
+    "show-parent-in-minicard": "Näytä ylätehtävä minikortilla:",
+    "prefix-with-full-path": "Etuliite koko polulla",
+    "prefix-with-parent": "Etuliite ylätehtävällä",
+    "subtext-with-full-path": "Aliteksti koko polulla",
+    "subtext-with-parent": "Aliteksti ylätehtävällä",
+    "change-card-parent": "Muuta kortin ylätehtävää",
+    "parent-card": "Ylätehtävä kortti",
+    "source-board": "Lähdetaulu",
+    "no-parent": "Älä näytä ylätehtävää"
 }

+ 24 - 2
i18n/fr.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Accepter",
     "act-activity-notify": "[Wekan] Notification d'activité",
     "act-addAttachment": "a joint __attachment__ à __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "a ajouté la checklist __checklist__ à __card__",
     "act-addChecklistItem": "a ajouté l'élément __checklistItem__ à la checklist __checklist__ de __card__",
     "act-addComment": "a commenté __card__ : __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "a supprimé %s de %s",
     "activity-sent": "a envoyé %s vers %s",
     "activity-unjoined": "a quitté %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "a ajouté une checklist à %s",
     "activity-checklist-item-added": "a ajouté un élément à la checklist '%s' dans %s",
     "add": "Ajouter",
@@ -48,6 +50,7 @@
     "add-board": "Ajouter un tableau",
     "add-card": "Ajouter une carte",
     "add-swimlane": "Ajouter un couloir",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Ajouter une checklist",
     "add-checklist-item": "Ajouter un élément à la checklist",
     "add-cover": "Ajouter la couverture",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Modifier le mot de passe",
     "changePermissionsPopup-title": "Modifier les permissions",
     "changeSettingsPopup-title": "Modifier les paramètres",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Cliquez pour ajouter ce tableau aux favoris.",
     "click-to-unstar": "Cliquez pour retirer ce tableau des favoris.",
@@ -163,7 +167,8 @@
     "comment-only": "Commentaire uniquement",
     "comment-only-desc": "Ne peut que commenter des cartes.",
     "computer": "Ordinateur",
-    "confirm-checklist-delete-dialog": "Êtes-vous sûr de vouloir supprimer la checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copier le lien vers la carte dans le presse-papier",
     "copyCardPopup-title": "Copier la carte",
     "copyChecklistToManyCardsPopup-title": "Copier le modèle de checklist vers plusieurs cartes",
@@ -475,5 +480,22 @@
     "board-delete-notice": "La suppression est définitive. Vous perdrez toutes vos listes, cartes et actions associées à ce tableau.",
     "delete-board-confirm-popup": "Toutes les listes, cartes, étiquettes et activités seront supprimées et vous ne pourrez pas retrouver le contenu du tableau. Il n'y a pas d'annulation possible.",
     "boardDeletePopup-title": "Supprimer le tableau ?",
-    "delete-board": "Supprimer le tableau"
+    "delete-board": "Supprimer le tableau",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/gl.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Aceptar",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Engadir",
@@ -48,6 +50,7 @@
     "add-board": "Engadir taboleiro",
     "add-card": "Engadir tarxeta",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Cambiar o contrasinal",
     "changePermissionsPopup-title": "Cambiar os permisos",
     "changeSettingsPopup-title": "Cambiar a configuración",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computador",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/he.i18n.json

@@ -2,6 +2,7 @@
     "accept": "אישור",
     "act-activity-notify": "[Wekan] הודעת פעילות",
     "act-addAttachment": " __attachment__ צורף לכרטיס __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "רשימת משימות __checklist__ נוספה ל __card__",
     "act-addChecklistItem": " __checklistItem__ נוסף לרשימת משימות __checklist__ בכרטיס __card__",
     "act-addComment": "התקבלה תגובה על הכרטיס __card__:‏ __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "%s הוסר מ%s",
     "activity-sent": "%s נשלח ל%s",
     "activity-unjoined": "בטל צירוף %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "נוספה רשימת משימות אל %s",
     "activity-checklist-item-added": "נוסף פריט רשימת משימות אל ‚%s‘ תחת %s",
     "add": "הוספה",
@@ -48,6 +50,7 @@
     "add-board": "הוספת לוח",
     "add-card": "הוספת כרטיס",
     "add-swimlane": "הוספת מסלול",
+    "add-subtask": "Add Subtask",
     "add-checklist": "הוספת רשימת מטלות",
     "add-checklist-item": "הוספת פריט לרשימת משימות",
     "add-cover": "הוספת כיסוי",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "החלפת ססמה",
     "changePermissionsPopup-title": "שינוי הרשאות",
     "changeSettingsPopup-title": "שינוי הגדרות",
+    "subtasks": "Subtasks",
     "checklists": "רשימות",
     "click-to-star": "יש ללחוץ להוספת הלוח למועדפים.",
     "click-to-unstar": "יש ללחוץ להסרת הלוח מהמועדפים.",
@@ -163,7 +167,8 @@
     "comment-only": "הערה בלבד",
     "comment-only-desc": "ניתן להעיר על כרטיסים בלבד.",
     "computer": "מחשב",
-    "confirm-checklist-delete-dialog": "האם אתה בטוח שברצונך למחוק את רשימת המשימות",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "העתקת קישור הכרטיס ללוח הגזירים",
     "copyCardPopup-title": "העתק כרטיס",
     "copyChecklistToManyCardsPopup-title": "העתקת תבנית רשימת מטלות למגוון כרטיסים",
@@ -475,5 +480,22 @@
     "board-delete-notice": "מחיקה היא לצמיתות. כל הרשימות, הכרטיבים והפעולות שקשורים בלוח הזה ילכו לאיבוד.",
     "delete-board-confirm-popup": "כל הרשימות, הכרטיסים, התווית והפעולות יימחקו ולא תהיה לך דרך לשחזר את תכני הלוח. אין אפשרות לבטל.",
     "boardDeletePopup-title": "למחוק את הלוח?",
-    "delete-board": "מחיקת לוח"
+    "delete-board": "מחיקת לוח",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/hu.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Elfogadás",
     "act-activity-notify": "[Wekan] Tevékenység értesítés",
     "act-addAttachment": "__attachment__ mellékletet csatolt a kártyához: __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "__checklist__ ellenőrzőlistát adott hozzá a kártyához: __card__",
     "act-addChecklistItem": "__checklistItem__ elemet adott hozzá a(z) __checklist__ ellenőrzőlistához ezen a kártyán: __card__",
     "act-addComment": "hozzászólt a(z) __card__ kártyán: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "%s eltávolítva innen: %s",
     "activity-sent": "%s elküldve ide: %s",
     "activity-unjoined": "%s kilépett a csoportból",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "ellenőrzőlista hozzáadva ehhez: %s",
     "activity-checklist-item-added": "ellenőrzőlista elem hozzáadva ehhez: „%s”, ebben: %s",
     "add": "Hozzáadás",
@@ -48,6 +50,7 @@
     "add-board": "Tábla hozzáadása",
     "add-card": "Kártya hozzáadása",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Ellenőrzőlista hozzáadása",
     "add-checklist-item": "Elem hozzáadása az ellenőrzőlistához",
     "add-cover": "Borító hozzáadása",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Jelszó megváltoztatása",
     "changePermissionsPopup-title": "Jogosultságok megváltoztatása",
     "changeSettingsPopup-title": "Beállítások megváltoztatása",
+    "subtasks": "Subtasks",
     "checklists": "Ellenőrzőlisták",
     "click-to-star": "Kattintson a tábla csillagozásához.",
     "click-to-unstar": "Kattintson a tábla csillagának eltávolításához.",
@@ -163,7 +167,8 @@
     "comment-only": "Csak megjegyzés",
     "comment-only-desc": "Csak megjegyzést írhat a kártyákhoz.",
     "computer": "Számítógép",
-    "confirm-checklist-delete-dialog": "Biztosan törölni szeretné az ellenőrzőlistát?",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Kártya hivatkozásának másolása a vágólapra",
     "copyCardPopup-title": "Kártya másolása",
     "copyChecklistToManyCardsPopup-title": "Ellenőrzőlista sablon másolása több kártyára",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/hy.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Ընդունել",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "ավելացրել է __checklistItem__ __checklist__ on __card__-ին",
     "act-addComment": "մեկնաբանել է __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Add",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/id.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Terima",
     "act-activity-notify": "[Wekan] Pemberitahuan Kegiatan",
     "act-addAttachment": "Lampirkan__attachment__ke__kartu__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "Dikomentari di__kartu__:__comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "dihapus %s dari %s",
     "activity-sent": "terkirim %s ke %s",
     "activity-unjoined": "tidak bergabung %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "daftar periksa ditambahkan ke %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Tambah",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Tambahkan hal ke daftar periksa",
     "add-cover": "Tambahkan Sampul",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Ubah Kata Sandi",
     "changePermissionsPopup-title": "Ubah Hak Akses",
     "changeSettingsPopup-title": "Ubah Setelan",
+    "subtasks": "Subtasks",
     "checklists": "Daftar Periksa",
     "click-to-star": "Klik untuk tandai bintang panel ini",
     "click-to-unstar": "Klik untuk tidak memberi bintang pada panel ini",
@@ -163,7 +167,8 @@
     "comment-only": "Hanya komentar",
     "comment-only-desc": "Bisa komen hanya di kartu",
     "computer": "Komputer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/ig.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Kwere",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Tinye",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/it.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Accetta",
     "act-activity-notify": "[Wekan] Notifiche attività",
     "act-addAttachment": "ha allegato __attachment__ a __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "aggiunta checklist __checklist__ a __card__",
     "act-addChecklistItem": "aggiunto __checklistItem__ alla checklist __checklist__ di __card__",
     "act-addComment": "ha commentato su __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "rimosso %s da %s",
     "activity-sent": "inviato %s a %s",
     "activity-unjoined": "ha abbandonato %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "aggiunta checklist a %s",
     "activity-checklist-item-added": "Aggiunto l'elemento checklist a '%s' in %s",
     "add": "Aggiungere",
@@ -48,6 +50,7 @@
     "add-board": "Aggiungi Bacheca",
     "add-card": "Aggiungi Scheda",
     "add-swimlane": "Aggiungi Corsia",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Aggiungi Checklist",
     "add-checklist-item": "Aggiungi un elemento alla checklist",
     "add-cover": "Aggiungi copertina",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Cambia password",
     "changePermissionsPopup-title": "Cambia permessi",
     "changeSettingsPopup-title": "Cambia impostazioni",
+    "subtasks": "Subtasks",
     "checklists": "Checklist",
     "click-to-star": "Clicca per stellare questa bacheca",
     "click-to-unstar": "Clicca per togliere la stella da questa bacheca",
@@ -163,7 +167,8 @@
     "comment-only": "Solo commenti",
     "comment-only-desc": "Puoi commentare solo le schede.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Sei sicuro di voler cancellare questa checklist?",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copia link della scheda sulla clipboard",
     "copyCardPopup-title": "Copia Scheda",
     "copyChecklistToManyCardsPopup-title": "Copia template checklist su più schede",
@@ -475,5 +480,22 @@
     "board-delete-notice": "L'eliminazione è permanente. Tutte le azioni, liste e schede associate a questa bacheca andranno perse.",
     "delete-board-confirm-popup": "Tutte le liste, schede, etichette e azioni saranno rimosse e non sarai più in grado di recuperare il contenuto della bacheca. L'azione non è annullabile.",
     "boardDeletePopup-title": "Eliminare la bacheca?",
-    "delete-board": "Elimina bacheca"
+    "delete-board": "Elimina bacheca",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/ja.i18n.json

@@ -2,6 +2,7 @@
     "accept": "受け入れ",
     "act-activity-notify": "[Wekan] アクティビティ通知",
     "act-addAttachment": "__card__ に __attachment__ を添付しました",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "__card__ に __checklist__ を追加しました",
     "act-addChecklistItem": "__checklist__ on __card__ に __checklistItem__ を追加しました",
     "act-addComment": "__card__: __comment__ をコメントしました",
@@ -41,6 +42,7 @@
     "activity-removed": "%s を %s から削除しました",
     "activity-sent": "%s を %s に送りました",
     "activity-unjoined": "%s への参加を止めました",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "%s にチェックリストを追加しました",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "追加",
@@ -48,6 +50,7 @@
     "add-board": "ボードを追加",
     "add-card": "カードを追加",
     "add-swimlane": "スイムレーンを追加",
+    "add-subtask": "Add Subtask",
     "add-checklist": "チェックリストを追加",
     "add-checklist-item": "チェックリストに項目を追加",
     "add-cover": "カバーの追加",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "パスワードの変更",
     "changePermissionsPopup-title": "パーミッションの変更",
     "changeSettingsPopup-title": "設定の変更",
+    "subtasks": "Subtasks",
     "checklists": "チェックリスト",
     "click-to-star": "ボードにスターをつける",
     "click-to-unstar": "ボードからスターを外す",
@@ -163,7 +167,8 @@
     "comment-only": "コメントのみ",
     "comment-only-desc": "カードにのみコメント可能",
     "computer": "コンピューター",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "カードへのリンクをクリップボードにコピー",
     "copyCardPopup-title": "カードをコピー",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "すべてのリスト、カード、ラベル、アクティビティは削除され、ボードの内容を元に戻すことができません。",
     "boardDeletePopup-title": "ボードを削除しますか?",
-    "delete-board": "ボードを削除"
+    "delete-board": "ボードを削除",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/ka.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Accept",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Add",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/km.i18n.json

@@ -2,6 +2,7 @@
     "accept": "យល់ព្រម",
     "act-activity-notify": "[Wekan] សកម្មភាពជូនដំណឹង",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Add",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/ko.i18n.json

@@ -2,6 +2,7 @@
     "accept": "확인",
     "act-activity-notify": "[Wekan] 활동 알림",
     "act-addAttachment": "__attachment__를 __card__에 첨부",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "__card__에 내용 추가 : __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "%s를 %s에서 삭제함",
     "activity-sent": "%s를 %s로 보냄",
     "activity-unjoined": "%s에서 멤버 해제",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "%s에 체크리스트를 추가함",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "추가",
@@ -48,6 +50,7 @@
     "add-board": "보드 추가",
     "add-card": "카드 추가",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "체크리스트 추가",
     "add-checklist-item": "체크리스트에 항목 추가",
     "add-cover": "커버 추가",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "암호 변경",
     "changePermissionsPopup-title": "권한 변경",
     "changeSettingsPopup-title": "설정 변경",
+    "subtasks": "Subtasks",
     "checklists": "체크리스트",
     "click-to-star": "보드에 별 추가.",
     "click-to-unstar": "보드에 별 삭제.",
@@ -163,7 +167,8 @@
     "comment-only": "댓글만 입력 가능",
     "comment-only-desc": "카드에 댓글만 달수 있습니다.",
     "computer": "내 컴퓨터",
-    "confirm-checklist-delete-dialog": "정말 이 체크리스트를 삭제할까요?",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "클립보드에 카드의 링크가 복사되었습니다.",
     "copyCardPopup-title": "카드 복사",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/lv.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Piekrist",
     "act-activity-notify": "[Wekan] Aktivitātes paziņojums",
     "act-addAttachment": "pievienots __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "pievienots checklist __checklist__ to __card__",
     "act-addChecklistItem": "pievienots __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "komentēja __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Add",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/mn.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Зөвшөөрөх",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "_attachment__ хавсралтыг __card__-д хавсаргав",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Нэмэх",
@@ -48,6 +50,7 @@
     "add-board": "Самбар нэмэх",
     "add-card": "Карт нэмэх",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Чеклист нэмэх",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Нууц үг солих",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Тохиргоо өөрчлөх",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/nb.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Godta",
     "act-activity-notify": "[Wekan] Aktivitetsvarsel",
     "act-addAttachment": "la ved __attachment__ til __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "kommenterte til __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "fjernet %s fra %s",
     "activity-sent": "sendte %s til %s",
     "activity-unjoined": "forlot %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "la til sjekkliste til %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Legg til",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Nytt punkt på sjekklisten",
     "add-cover": "Nytt omslag",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Endre passord",
     "changePermissionsPopup-title": "Endre tillatelser",
     "changeSettingsPopup-title": "Endre innstillinger",
+    "subtasks": "Subtasks",
     "checklists": "Sjekklister",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/nl.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Accepteren",
     "act-activity-notify": "[Wekan] Activiteit Notificatie",
     "act-addAttachment": "__attachment__ als bijlage toegevoegd aan __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "__checklist__ toegevoegd aan __card__",
     "act-addChecklistItem": "__checklistItem__ aan checklist toegevoegd aan __checklist__ op __card__",
     "act-addComment": "gereageerd op __card__:__comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "%s verwijderd van %s",
     "activity-sent": "%s gestuurd naar %s",
     "activity-unjoined": "uit %s gegaan",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "checklist toegevoegd aan %s",
     "activity-checklist-item-added": "checklist punt toegevoegd aan '%s' in '%s'",
     "add": "Toevoegen",
@@ -48,6 +50,7 @@
     "add-board": "Voeg Bord Toe",
     "add-card": "Voeg Kaart Toe",
     "add-swimlane": "Swimlane Toevoegen",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Voeg Checklist Toe",
     "add-checklist-item": "Voeg item toe aan checklist",
     "add-cover": "Voeg Cover Toe",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Wijzig wachtwoord",
     "changePermissionsPopup-title": "Wijzig permissies",
     "changeSettingsPopup-title": "Wijzig instellingen",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Klik om het bord als favoriet in te stellen",
     "click-to-unstar": "Klik om het bord uit favorieten weg te halen",
@@ -163,7 +167,8 @@
     "comment-only": "Alleen reageren",
     "comment-only-desc": "Kan alleen op kaarten reageren.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Weet u zeker dat u de checklist wilt verwijderen",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Kopieer kaart link naar klembord",
     "copyCardPopup-title": "Kopieer kaart",
     "copyChecklistToManyCardsPopup-title": "Checklist sjabloon kopiëren naar meerdere kaarten",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/pl.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Akceptuj",
     "act-activity-notify": "[Wekan] Powiadomienia - aktywności",
     "act-addAttachment": "załączono __attachement__ do __karty__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "dodano listę zadań __checklist__ to __card__",
     "act-addChecklistItem": "dodano __checklistItem__ do listy zadań __checklist__ na karcie __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "usunięto %s z %s",
     "activity-sent": "wysłano %s z %s",
     "activity-unjoined": "odłączono %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Dodaj",
@@ -48,6 +50,7 @@
     "add-board": "Dodaj tablicę",
     "add-card": "Dodaj kartę",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Dodaj listę kontrolną",
     "add-checklist-item": "Dodaj element do listy kontrolnej",
     "add-cover": "Dodaj okładkę",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Zmień hasło",
     "changePermissionsPopup-title": "Zmień uprawnienia",
     "changeSettingsPopup-title": "Zmień ustawienia",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Kliknij by odznaczyć tę tablicę.",
     "click-to-unstar": "Kliknij by usunąć odznaczenie tej tablicy.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Komputer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Skopiuj kartę",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/pt-BR.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Aceitar",
     "act-activity-notify": "[Wekan] Notificação de Atividade",
     "act-addAttachment": "anexo __attachment__ de __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ no __card__",
     "act-addChecklistItem": "adicionado __checklistitem__ para a lista de checagem __checklist__ em __card__",
     "act-addComment": "comentou em __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removeu %s de %s",
     "activity-sent": "enviou %s de %s",
     "activity-unjoined": "saiu de %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "Adicionado lista de verificação a %s",
     "activity-checklist-item-added": "adicionado o item de checklist para '%s' em %s",
     "add": "Novo",
@@ -48,6 +50,7 @@
     "add-board": "Adicionar Quadro",
     "add-card": "Adicionar Cartão",
     "add-swimlane": "Adicionar Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Adicionar Checklist",
     "add-checklist-item": "Adicionar um item à lista de verificação",
     "add-cover": "Adicionar Capa",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Alterar Senha",
     "changePermissionsPopup-title": "Alterar Permissões",
     "changeSettingsPopup-title": "Altera configurações",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Marcar quadro como favorito.",
     "click-to-unstar": "Remover quadro dos favoritos.",
@@ -163,7 +167,8 @@
     "comment-only": "Somente comentários",
     "comment-only-desc": "Pode comentar apenas em cartões.",
     "computer": "Computador",
-    "confirm-checklist-delete-dialog": "Tem a certeza de que pretende eliminar lista de verificação",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copiar link do cartão para a área de transferência",
     "copyCardPopup-title": "Copiar o cartão",
     "copyChecklistToManyCardsPopup-title": "Copiar modelo de checklist para vários cartões",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/pt.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Aceitar",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Adicionar",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computador",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/ro.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Accept",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Add",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/ru.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Принять",
     "act-activity-notify": "[Wekan] Уведомление о действиях участников",
     "act-addAttachment": "вложено __attachment__ в __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "добавил контрольный список __checklist__ в __card__",
     "act-addChecklistItem": "добавил __checklistItem__ в контрольный список __checklist__ в __card__",
     "act-addComment": "прокомментировал __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "удалил %s из %s",
     "activity-sent": "отправил %s в %s",
     "activity-unjoined": "вышел из %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "добавил контрольный список в %s",
     "activity-checklist-item-added": "добавил пункт контрольного списка в '%s' в карточке %s",
     "add": "Создать",
@@ -48,6 +50,7 @@
     "add-board": "Добавить доску",
     "add-card": "Добавить карту",
     "add-swimlane": "Добавить дорожку",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Добавить контрольный список",
     "add-checklist-item": "Добавить пункт в контрольный список",
     "add-cover": "Прикрепить",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Изменить пароль",
     "changePermissionsPopup-title": "Изменить настройки доступа",
     "changeSettingsPopup-title": "Изменить Настройки",
+    "subtasks": "Subtasks",
     "checklists": "Контрольные списки",
     "click-to-star": "Добавить в  «Избранное»",
     "click-to-unstar": "Удалить из «Избранного»",
@@ -163,7 +167,8 @@
     "comment-only": "Только комментирование",
     "comment-only-desc": "Может комментировать только карточки.",
     "computer": "Загрузить с компьютера",
-    "confirm-checklist-delete-dialog": "Вы уверены, что хотите удалить контрольный список?",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Копировать ссылку на карточку в буфер обмена",
     "copyCardPopup-title": "Копировать карточку",
     "copyChecklistToManyCardsPopup-title": "Копировать шаблон контрольного списка в несколько карточек",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Удаление является постоянным. Вы потеряете все списки, карты и действия, связанные с этой доской.",
     "delete-board-confirm-popup": "Все списки, карточки, ярлыки и действия будут удалены, и вы не сможете восстановить содержимое доски. Отменить нельзя.",
     "boardDeletePopup-title": "Удалить доску?",
-    "delete-board": "Удалить доску"
+    "delete-board": "Удалить доску",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/sr.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Prihvati",
     "act-activity-notify": "[Wekan] Obaveštenje o aktivnostima",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "uklonio %s iz %s",
     "activity-sent": "poslao %s %s-u",
     "activity-unjoined": "rastavio %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "lista je dodata u %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Dodaj",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Dodaj novu stavku u listu",
     "add-cover": "Dodaj zaglavlje",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Izmeni podešavanja",
+    "subtasks": "Subtasks",
     "checklists": "Liste",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/sv.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Acceptera",
     "act-activity-notify": "[Wekan] Aktivitetsavisering",
     "act-addAttachment": "bifogade __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "lade till checklist __checklist__ till __card__",
     "act-addChecklistItem": "lade till __checklistItem__ till checklistan __checklist__ on __card__",
     "act-addComment": "kommenterade __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "tog bort %s från %s",
     "activity-sent": "skickade %s till %s",
     "activity-unjoined": "gick ur %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "lade kontrollista till %s",
     "activity-checklist-item-added": "lade checklista objekt till '%s' i %s",
     "add": "Lägg till",
@@ -48,6 +50,7 @@
     "add-board": "Lägg till anslagstavla",
     "add-card": "Lägg till kort",
     "add-swimlane": "Lägg till simbana",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Lägg till checklista",
     "add-checklist-item": "Lägg till ett objekt till kontrollista",
     "add-cover": "Lägg till omslag",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Ändra lösenord",
     "changePermissionsPopup-title": "Ändra behörigheter",
     "changeSettingsPopup-title": "Ändra inställningar",
+    "subtasks": "Subtasks",
     "checklists": "Kontrollistor",
     "click-to-star": "Klicka för att stjärnmärka denna anslagstavla.",
     "click-to-unstar": "Klicka för att ta bort stjärnmärkningen från denna anslagstavla.",
@@ -163,7 +167,8 @@
     "comment-only": "Kommentera endast",
     "comment-only-desc": "Kan endast kommentera kort.",
     "computer": "Dator",
-    "confirm-checklist-delete-dialog": "Är du säker på att du vill ta bort checklista",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Kopiera kortlänk till urklipp",
     "copyCardPopup-title": "Kopiera kort",
     "copyChecklistToManyCardsPopup-title": "Kopiera checklist-mallen till flera kort",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Borttagningen är permanent. Du kommer förlora alla listor, kort och händelser kopplade till den här anslagstavlan.",
     "delete-board-confirm-popup": "Alla listor, kort, etiketter och aktiviteter kommer tas bort och du kommer inte kunna återställa anslagstavlans innehåll. Det går inte att ångra.",
     "boardDeletePopup-title": "Ta bort anslagstavla?",
-    "delete-board": "Ta bort anslagstavla"
+    "delete-board": "Ta bort anslagstavla",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/ta.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Accept",
     "act-activity-notify": "[Wekan] Activity Notification",
     "act-addAttachment": "attached __attachment__ to __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "commented on __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Add",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-cover": "Add Cover",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/th.i18n.json

@@ -2,6 +2,7 @@
     "accept": "ยอมรับ",
     "act-activity-notify": "[Wekan] แจ้งกิจกรรม",
     "act-addAttachment": "แนบไฟล์ __attachment__ ไปยัง __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "ออกความเห็นที่ __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "ลบ %s จาด %s",
     "activity-sent": "ส่ง %s ถึง %s",
     "activity-unjoined": "ยกเลิกเข้าร่วม %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "รายการถูกเพิ่มไป %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "เพิ่ม",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "เพิ่มรายการตรวจสอบ",
     "add-cover": "เพิ่มหน้าปก",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "เปลี่ยนรหัสผ่าน",
     "changePermissionsPopup-title": "เปลี่ยนสิทธิ์",
     "changeSettingsPopup-title": "เปลี่ยนการตั้งค่า",
+    "subtasks": "Subtasks",
     "checklists": "รายการตรวจสอบ",
     "click-to-star": "คลิกดาวบอร์ดนี้",
     "click-to-unstar": "คลิกยกเลิกดาวบอร์ดนี้",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "คอมพิวเตอร์",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/tr.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Kabul Et",
     "act-activity-notify": "[Wekan] Etkinlik Bildirimi",
     "act-addAttachment": "__card__ kartına __attachment__ dosyasını ekledi",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "__card__ kartında __checklist__ yapılacak listesini ekledi",
     "act-addChecklistItem": "__checklistItem__ öğesini __card__ kartındaki __checklist__ yapılacak listesine ekledi",
     "act-addComment": "__card__ kartına bir yorum bıraktı: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "%s i %s ten kaldırdı",
     "activity-sent": "%s i %s e gönderdi",
     "activity-unjoined": "%s içinden ayrıldı",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "%s içine yapılacak listesi ekledi",
     "activity-checklist-item-added": "%s içinde %s yapılacak listesine öğe ekledi",
     "add": "Ekle",
@@ -48,6 +50,7 @@
     "add-board": "Pano Ekle",
     "add-card": "Kart Ekle",
     "add-swimlane": "Kulvar Ekle",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Yapılacak Listesi Ekle",
     "add-checklist-item": "Yapılacak listesine yeni bir öğe ekle",
     "add-cover": "Kapak resmi ekle",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Parola Değiştir",
     "changePermissionsPopup-title": "Yetkileri Değiştirme",
     "changeSettingsPopup-title": "Ayarları değiştir",
+    "subtasks": "Subtasks",
     "checklists": "Yapılacak Listeleri",
     "click-to-star": "Bu panoyu yıldızlamak için tıkla.",
     "click-to-unstar": "Bu panunun yıldızını kaldırmak için tıkla.",
@@ -163,7 +167,8 @@
     "comment-only": "Sadece yorum",
     "comment-only-desc": "Sadece kartlara yorum yazabilir.",
     "computer": "Bilgisayar",
-    "confirm-checklist-delete-dialog": "Yapılacak listesini silmek istediğinize emin misiniz",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Kartın linkini kopyala",
     "copyCardPopup-title": "Kartı Kopyala",
     "copyChecklistToManyCardsPopup-title": "Yapılacaklar Listesi şemasını birden çok karta kopyala",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/uk.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Прийняти",
     "act-activity-notify": "[Wekan] Сповіщення Діяльності",
     "act-addAttachment": "__attachment__ додане до __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "комментар в __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "removed %s from %s",
     "activity-sent": "sent %s to %s",
     "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "added checklist to %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Додати",
@@ -48,6 +50,7 @@
     "add-board": "Add Board",
     "add-card": "Add Card",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Додати елемент в список",
     "add-cover": "Додати обкладинку",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/vi.i18n.json

@@ -2,6 +2,7 @@
     "accept": "Chấp nhận",
     "act-activity-notify": "[Wekan] Thông Báo Hoạt Động",
     "act-addAttachment": "đã đính kèm __attachment__ vào __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "đã bình luận trong __card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "đã xóa %s từ %s",
     "activity-sent": "gửi %s đến %s",
     "activity-unjoined": "đã rời khỏi %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "đã thêm checklist vào %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "Thêm",
@@ -48,6 +50,7 @@
     "add-board": "Thêm Bảng",
     "add-card": "Thêm Thẻ",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "Thêm Danh Sách Kiểm Tra",
     "add-checklist-item": "Thêm Một Mục Vào Danh Sách Kiểm Tra",
     "add-cover": "Thêm Bìa",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "Change Password",
     "changePermissionsPopup-title": "Change Permissions",
     "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
     "checklists": "Checklists",
     "click-to-star": "Click to star this board.",
     "click-to-unstar": "Click to unstar this board.",
@@ -163,7 +167,8 @@
     "comment-only": "Comment only",
     "comment-only-desc": "Can comment on cards only.",
     "computer": "Computer",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "Copy card link to clipboard",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/zh-CN.i18n.json

@@ -2,6 +2,7 @@
     "accept": "接受",
     "act-activity-notify": "[Wekan] 活动通知",
     "act-addAttachment": "添加附件 __attachment__ 至卡片 __card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "添加清单 __checklist__ 到 __card__",
     "act-addChecklistItem": "向  __card__ 中的清单 __checklist__ 添加 __checklistItem__",
     "act-addComment": "在 __card__ 发布评论: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "从 %s 中移除 %s",
     "activity-sent": "发送 %s 至 %s",
     "activity-unjoined": "已解除 %s 关联",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "已经将清单添加到 %s",
     "activity-checklist-item-added": "添加清单项至'%s' 于 %s",
     "add": "添加",
@@ -48,6 +50,7 @@
     "add-board": "添加看板",
     "add-card": "添加卡片",
     "add-swimlane": "添加泳道图",
+    "add-subtask": "Add Subtask",
     "add-checklist": "添加待办清单",
     "add-checklist-item": "扩充清单",
     "add-cover": "添加封面",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "更改密码",
     "changePermissionsPopup-title": "更改权限",
     "changeSettingsPopup-title": "更改设置",
+    "subtasks": "Subtasks",
     "checklists": "清单",
     "click-to-star": "点此来标记该看板",
     "click-to-unstar": "点此来去除该看板的标记",
@@ -163,7 +167,8 @@
     "comment-only": "仅能评论",
     "comment-only-desc": "只能在卡片上评论。",
     "computer": "从本机上传",
-    "confirm-checklist-delete-dialog": "确认要删除清单吗",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "复制卡片链接到剪贴板",
     "copyCardPopup-title": "复制卡片",
     "copyChecklistToManyCardsPopup-title": "复制清单模板至多个卡片",
@@ -475,5 +480,22 @@
     "board-delete-notice": "删除时永久操作,将会丢失此看板上的所有列表、卡片和动作。",
     "delete-board-confirm-popup": "所有列表、卡片、标签和活动都回被删除,将无法恢复看板内容。不支持撤销。",
     "boardDeletePopup-title": "删除看板?",
-    "delete-board": "删除看板"
+    "delete-board": "删除看板",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 24 - 2
i18n/zh-TW.i18n.json

@@ -2,6 +2,7 @@
     "accept": "接受",
     "act-activity-notify": "[Wekan] 活動通知",
     "act-addAttachment": "新增附件__attachment__至__card__",
+    "act-addSubtask": "added subtask __checklist__ to __card__",
     "act-addChecklist": "added checklist __checklist__ to __card__",
     "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
     "act-addComment": "評論__card__: __comment__",
@@ -41,6 +42,7 @@
     "activity-removed": "移除 %s 從 %s 中",
     "activity-sent": "寄送 %s 至 %s",
     "activity-unjoined": "解除關聯 %s",
+    "activity-subtask-added": "added subtask to %s",
     "activity-checklist-added": "新增待辦清單至 %s",
     "activity-checklist-item-added": "新增待辦清單項目從 %s 到 %s",
     "add": "新增",
@@ -48,6 +50,7 @@
     "add-board": "新增看板",
     "add-card": "新增卡片",
     "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
     "add-checklist": "新增待辦清單",
     "add-checklist-item": "新增項目",
     "add-cover": "新增封面",
@@ -141,6 +144,7 @@
     "changePasswordPopup-title": "更改密碼",
     "changePermissionsPopup-title": "更改許可權",
     "changeSettingsPopup-title": "更改設定",
+    "subtasks": "Subtasks",
     "checklists": "待辦清單",
     "click-to-star": "點此來標記該看板",
     "click-to-unstar": "點此來去除該看板的標記",
@@ -163,7 +167,8 @@
     "comment-only": "只可以發表評論",
     "comment-only-desc": "只可以對卡片發表評論",
     "computer": "從本機上傳",
-    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
     "copy-card-link-to-clipboard": "將卡片連結複製到剪貼板",
     "copyCardPopup-title": "Copy Card",
     "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
@@ -475,5 +480,22 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "show-subtasks-field": "Cards can have subtasks",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent"
 }

+ 3 - 0
models/activities.js

@@ -44,6 +44,9 @@ Activities.helpers({
   checklistItem() {
     return ChecklistItems.findOne(this.checklistItemId);
   },
+  subtasks() {
+    return Cards.findOne(this.subtaskId);
+  },
   customField() {
     return CustomFields.findOne(this.customFieldId);
   },

+ 102 - 0
models/boards.js

@@ -151,6 +151,32 @@ Boards.attachSchema(new SimpleSchema({
     type: String,
     optional: true,
   },
+  subtasksDefaultBoardId: {
+    type: String,
+    optional: true,
+    defaultValue: null,
+  },
+  subtasksDefaultListId: {
+    type: String,
+    optional: true,
+    defaultValue: null,
+  },
+  allowsSubtasks: {
+    type: Boolean,
+    defaultValue: true,
+  },
+  presentParentTask: {
+    type: String,
+    allowedValues: [
+      'prefix-with-full-path',
+      'prefix-with-parent',
+      'subtext-with-full-path',
+      'subtext-with-parent',
+      'no-parent',
+    ],
+    optional: true,
+    defaultValue: 'no-parent',
+  },
 }));
 
 
@@ -194,6 +220,10 @@ Boards.helpers({
     return Swimlanes.find({ boardId: this._id, archived: false }, { sort: { sort: 1 } });
   },
 
+  cards() {
+    return Cards.find({ boardId: this._id, archived: false }, { sort: { sort: 1 } });
+  },
+
   hasOvertimeCards(){
     const card = Cards.findOne({isOvertime: true, boardId: this._id, archived: false} );
     return card !== undefined;
@@ -284,6 +314,61 @@ Boards.helpers({
 
     return Cards.find(query, projection);
   },
+  // A board alwasy has another board where it deposits subtasks of thasks
+  // that belong to itself.
+  getDefaultSubtasksBoardId() {
+    if ((this.subtasksDefaultBoardId === null) || (this.subtasksDefaultBoardId === undefined)) {
+      this.subtasksDefaultBoardId = Boards.insert({
+        title: `^${this.title}^`,
+        permission: this.permission,
+        members: this.members,
+        color: this.color,
+        description: TAPi18n.__('default-subtasks-board', {board: this.title}),
+      });
+
+      Swimlanes.insert({
+        title: TAPi18n.__('default'),
+        boardId: this.subtasksDefaultBoardId,
+      });
+      Boards.update(this._id, {$set: {
+        subtasksDefaultBoardId: this.subtasksDefaultBoardId,
+      }});
+    }
+    return this.subtasksDefaultBoardId;
+  },
+
+  getDefaultSubtasksBoard() {
+    return Boards.findOne(this.getDefaultSubtasksBoardId());
+  },
+
+  getDefaultSubtasksListId() {
+    if ((this.subtasksDefaultListId === null) || (this.subtasksDefaultListId === undefined)) {
+      this.subtasksDefaultListId = Lists.insert({
+        title: TAPi18n.__('queue'),
+        boardId: this._id,
+      });
+      Boards.update(this._id, {$set: {
+        subtasksDefaultListId: this.subtasksDefaultListId,
+      }});
+    }
+    return this.subtasksDefaultListId;
+  },
+
+  getDefaultSubtasksList() {
+    return Lists.findOne(this.getDefaultSubtasksListId());
+  },
+
+  getDefaultSwimline() {
+    let result = Swimlanes.findOne({boardId: this._id});
+    if (result === undefined) {
+      Swimlanes.insert({
+        title: TAPi18n.__('default'),
+        boardId: this._id,
+      });
+      result = Swimlanes.findOne({boardId: this._id});
+    }
+    return result;
+  },
 
   cardsInInterval(start, end) {
     return Cards.find({
@@ -313,6 +398,7 @@ Boards.helpers({
 
 });
 
+
 Boards.mutations({
   archive() {
     return { $set: { archived: true } };
@@ -434,6 +520,22 @@ Boards.mutations({
       },
     };
   },
+
+  setAllowsSubtasks(allowsSubtasks) {
+    return { $set: { allowsSubtasks } };
+  },
+
+  setSubtasksDefaultBoardId(subtasksDefaultBoardId) {
+    return { $set: { subtasksDefaultBoardId } };
+  },
+
+  setSubtasksDefaultListId(subtasksDefaultListId) {
+    return { $set: { subtasksDefaultListId } };
+  },
+
+  setPresentParentTask(presentParentTask) {
+    return { $set: { presentParentTask } };
+  },
 });
 
 if (Meteor.isServer) {

+ 131 - 0
models/cards.js

@@ -15,6 +15,11 @@ Cards.attachSchema(new SimpleSchema({
       }
     },
   },
+  parentId: {
+    type: String,
+    optional: true,
+    defaultValue: '',
+  },
   listId: {
     type: String,
   },
@@ -122,6 +127,12 @@ Cards.attachSchema(new SimpleSchema({
     type: Number,
     decimal: true,
   },
+  subtaskSort: {
+    type: Number,
+    decimal: true,
+    defaultValue: -1,
+    optional: true,
+  },
 }));
 
 Cards.allow({
@@ -215,6 +226,42 @@ Cards.helpers({
     return this.checklistItemCount() !== 0;
   },
 
+  subtasks() {
+    return Cards.find({
+      parentId: this._id,
+      archived: false,
+    }, {sort: { sort: 1 } });
+  },
+
+  allSubtasks() {
+    return Cards.find({
+      parentId: this._id,
+      archived: false,
+    }, {sort: { sort: 1 } });
+  },
+
+  subtasksCount() {
+    return Cards.find({
+      parentId: this._id,
+      archived: false,
+    }).count();
+  },
+
+  subtasksFinishedCount() {
+    return Cards.find({
+      parentId: this._id,
+      archived: true}).count();
+  },
+
+  subtasksFinished() {
+    const finishCount = this.subtasksFinishedCount();
+    return finishCount > 0 && this.subtasksCount() === finishCount;
+  },
+
+  allowsSubtasks() {
+    return this.subtasksCount() !== 0;
+  },
+
   customFieldIndex(customFieldId) {
     return _.pluck(this.customFields, '_id').indexOf(customFieldId);
   },
@@ -271,14 +318,90 @@ Cards.helpers({
     }
     return true;
   },
+
+  parentCard() {
+    if (this.parentId === '') {
+      return null;
+    }
+    return Cards.findOne(this.parentId);
+  },
+
+  parentCardName() {
+    let result = '';
+    if (this.parentId !== '') {
+      const card = Cards.findOne(this.parentId);
+      if (card) {
+        result = card.title;
+      }
+    }
+    return result;
+  },
+
+  parentListId() {
+    const result = [];
+    let crtParentId = this.parentId;
+    while (crtParentId !== '') {
+      const crt = Cards.findOne(crtParentId);
+      if ((crt === null) || (crt === undefined)) {
+        // maybe it has been deleted
+        break;
+      }
+      if (crtParentId in result) {
+        // circular reference
+        break;
+      }
+      result.unshift(crtParentId);
+      crtParentId = crt.parentId;
+    }
+    return result;
+  },
+
+  parentList() {
+    const resultId = [];
+    const result = [];
+    let crtParentId = this.parentId;
+    while (crtParentId !== '') {
+      const crt = Cards.findOne(crtParentId);
+      if ((crt === null) || (crt === undefined)) {
+        // maybe it has been deleted
+        break;
+      }
+      if (crtParentId in resultId) {
+        // circular reference
+        break;
+      }
+      resultId.unshift(crtParentId);
+      result.unshift(crt);
+      crtParentId = crt.parentId;
+    }
+    return result;
+  },
+
+  parentString(sep) {
+    return this.parentList().map(function(elem){
+      return elem.title;
+    }).join(sep);
+  },
+
+  isTopLevel() {
+    return this.parentId === '';
+  },
 });
 
 Cards.mutations({
+  applyToChildren(funct) {
+    Cards.find({ parentId: this._id }).forEach((card) => {
+      funct(card);
+    });
+  },
+
   archive() {
+    this.applyToChildren((card) => { return card.archive(); });
     return {$set: {archived: true}};
   },
 
   restore() {
+    this.applyToChildren((card) => { return card.restore(); });
     return {$set: {archived: false}};
   },
 
@@ -422,6 +545,11 @@ Cards.mutations({
   unsetSpentTime() {
     return {$unset: {spentTime: '', isOvertime: false}};
   },
+
+  setParentId(parentId) {
+    return {$set: {parentId}};
+  },
+
 });
 
 
@@ -513,6 +641,9 @@ function cardRemover(userId, doc) {
   Checklists.remove({
     cardId: doc._id,
   });
+  Subtasks.remove({
+    cardId: doc._id,
+  });
   CardComments.remove({
     cardId: doc._id,
   });

+ 2 - 0
models/export.js

@@ -58,9 +58,11 @@ class Exporter {
     result.activities = Activities.find(byBoard, noBoardId).fetch();
     result.checklists = [];
     result.checklistItems = [];
+    result.subtaskItems = [];
     result.cards.forEach((card) => {
       result.checklists.push(...Checklists.find({ cardId: card._id }).fetch());
       result.checklistItems.push(...ChecklistItems.find({ cardId: card._id }).fetch());
+      result.subtaskItems.push(...Cards.find({ parentid: card._id }).fetch());
     });
 
     // [Old] for attachments we only export IDs and absolute url to original doc

+ 71 - 19
server/migrations.js

@@ -55,7 +55,7 @@ Migrations.add('lowercase-board-permission', () => {
 // Security migration: see https://github.com/wekan/wekan/issues/99
 Migrations.add('change-attachments-type-for-non-images', () => {
   const newTypeForNonImage = 'application/octet-stream';
-  Attachments.find().forEach((file) => {
+  Attachments.forEach((file) => {
     if (!file.isImage()) {
       Attachments.update(file._id, {
         $set: {
@@ -68,7 +68,7 @@ Migrations.add('change-attachments-type-for-non-images', () => {
 });
 
 Migrations.add('card-covers', () => {
-  Cards.find().forEach((card) => {
+  Cards.forEach((card) => {
     const cover =  Attachments.findOne({ cardId: card._id, cover: true });
     if (cover) {
       Cards.update(card._id, {$set: {coverId: cover._id}}, noValidate);
@@ -86,7 +86,7 @@ Migrations.add('use-css-class-for-boards-colors', () => {
     '#2C3E50': 'midnight',
     '#E67E22': 'pumpkin',
   };
-  Boards.find().forEach((board) => {
+  Boards.forEach((board) => {
     const oldBoardColor = board.background.color;
     const newBoardColor = associationTable[oldBoardColor];
     Boards.update(board._id, {
@@ -97,7 +97,7 @@ Migrations.add('use-css-class-for-boards-colors', () => {
 });
 
 Migrations.add('denormalize-star-number-per-board', () => {
-  Boards.find().forEach((board) => {
+  Boards.forEach((board) => {
     const nStars = Users.find({'profile.starredBoards': board._id}).count();
     Boards.update(board._id, {$set: {stars: nStars}}, noValidate);
   });
@@ -132,7 +132,7 @@ Migrations.add('add-member-isactive-field', () => {
 });
 
 Migrations.add('add-sort-checklists', () => {
-  Checklists.find().forEach((checklist, index) => {
+  Checklists.forEach((checklist, index) => {
     if (!checklist.hasOwnProperty('sort')) {
       Checklists.direct.update(
         checklist._id,
@@ -153,17 +153,8 @@ Migrations.add('add-sort-checklists', () => {
 });
 
 Migrations.add('add-swimlanes', () => {
-  Boards.find().forEach((board) => {
-    const swimlane = Swimlanes.findOne({ boardId: board._id });
-    let swimlaneId = '';
-    if (swimlane)
-      swimlaneId = swimlane._id;
-    else
-      swimlaneId = Swimlanes.direct.insert({
-        boardId: board._id,
-        title: 'Default',
-      });
-
+  Boards.forEach((board) => {
+    const swimlaneId = board.getDefaultSwimline()._id;
     Cards.find({ boardId: board._id }).forEach((card) => {
       if (!card.hasOwnProperty('swimlaneId')) {
         Cards.direct.update(
@@ -177,7 +168,7 @@ Migrations.add('add-swimlanes', () => {
 });
 
 Migrations.add('add-views', () => {
-  Boards.find().forEach((board) => {
+  Boards.forEach((board) => {
     if (!board.hasOwnProperty('view')) {
       Boards.direct.update(
         { _id: board._id },
@@ -189,7 +180,7 @@ Migrations.add('add-views', () => {
 });
 
 Migrations.add('add-checklist-items', () => {
-  Checklists.find().forEach((checklist) => {
+  Checklists.forEach((checklist) => {
     // Create new items
     _.sortBy(checklist.items, 'sort').forEach((item, index) => {
       ChecklistItems.direct.insert({
@@ -210,7 +201,7 @@ Migrations.add('add-checklist-items', () => {
 });
 
 Migrations.add('add-profile-view', () => {
-  Users.find().forEach((user) => {
+  Users.forEach((user) => {
     if (!user.hasOwnProperty('profile.boardView')) {
       // Set default view
       Users.direct.update(
@@ -258,3 +249,64 @@ Migrations.add('add-assigner-field', () => {
   }, noValidateMulti);
 });
 
+Migrations.add('add-parent-field-to-cards', () => {
+  Cards.update({
+    parentId: {
+      $exists: false,
+    },
+  }, {
+    $set: {
+      parentId:'',
+    },
+  }, noValidateMulti);
+});
+
+Migrations.add('add-subtasks-boards', () => {
+  Boards.update({
+    subtasksDefaultBoardId: {
+      $exists: false,
+    },
+  }, {
+    $set: {
+      subtasksDefaultBoardId: null,
+      subtasksDefaultListId: null,
+    },
+  }, noValidateMulti);
+});
+
+Migrations.add('add-subtasks-sort', () => {
+  Boards.update({
+    subtaskSort: {
+      $exists: false,
+    },
+  }, {
+    $set: {
+      subtaskSort: -1,
+    },
+  }, noValidateMulti);
+});
+
+Migrations.add('add-subtasks-allowed', () => {
+  Boards.update({
+    allowsSubtasks: {
+      $exists: false,
+    },
+  }, {
+    $set: {
+      allowsSubtasks: true,
+    },
+  }, noValidateMulti);
+});
+
+Migrations.add('add-subtasks-allowed', () => {
+  Boards.update({
+    presentParentTask: {
+      $exists: false,
+    },
+  }, {
+    $set: {
+      presentParentTask: 'no-parent',
+    },
+  }, noValidateMulti);
+});
+

+ 1 - 0
server/publications/boards.js

@@ -103,6 +103,7 @@ Meteor.publishRelations('board', function(boardId) {
       this.cursor(Attachments.find({ cardId }));
       this.cursor(Checklists.find({ cardId }));
       this.cursor(ChecklistItems.find({ cardId }));
+      this.cursor(Cards.find({ parentId: cardId }));
     });
 
     if (board.members) {