浏览代码

Move card dialog remembers now the last selected board

Martin Filser 3 年之前
父节点
当前提交
0a4e472601
共有 2 个文件被更改,包括 213 次插入24 次删除
  1. 24 1
      client/components/cards/cardDetails.jade
  2. 189 23
      client/components/cards/cardDetails.js

+ 24 - 1
client/components/cards/cardDetails.jade

@@ -712,7 +712,7 @@ template(name="exportCardPopup")
         | {{_ 'export-card-pdf'}}
 
 template(name="moveCardPopup")
-  +boardsAndLists
+  +copyAndMoveCard
 
 template(name="copyCardPopup")
   label(for='copy-card-title') {{_ 'title'}}:
@@ -749,6 +749,29 @@ template(name="boardsAndLists")
   .edit-controls.clearfix
     button.primary.confirm.js-done {{_ 'done'}}
 
+template(name="copyAndMoveCard")
+  unless currentUser.isWorker
+    label {{_ 'boards'}}:
+    select.js-select-boards(autofocus)
+      each boards
+        if $eq _id currentBoard._id
+          option(value="{{_id}}" selected) {{_ 'current'}}
+        else
+          option(value="{{_id}}" selected="{{#if isCardDialogOptionBoardId _id}}selected{{/if}}") {{title}}
+
+  label {{_ 'swimlanes'}}:
+  select.js-select-swimlanes
+    each swimlanes
+      option(value="{{_id}}" selected="{{#if isCardDialogOptionSwimlaneId _id}}selected{{/if}}") {{title}}
+
+  label {{_ 'lists'}}:
+  select.js-select-lists
+    each lists
+      option(value="{{_id}}" selected="{{#if isCardDialogOptionListId _id}}selected{{/if}}") {{title}}
+
+  .edit-controls.clearfix
+    button.primary.confirm.js-done {{_ 'done'}}
+
 template(name="cardMembersPopup")
   input.card-members-filter(type="text" placeholder="{{_ 'search'}}")
   ul.pop-over-list.js-card-member-list

+ 189 - 23
client/components/cards/cardDetails.js

@@ -826,34 +826,200 @@ Template.editCardAssignerForm.events({
   },
 });
 
-Template.moveCardPopup.events({
-  'click .js-done'() {
-    const card = Cards.findOne(this._id);
-    const bSelect = $('.js-select-boards')[0];
-    let boardId;
-    // if we are a worker, we won't have a board select so we just use the
-    // current boardId of the card.
-    if (bSelect) {
-      boardId = bSelect.options[bSelect.selectedIndex].value;
-    } else {
-      boardId = card.boardId;
+class DialogWithBoardSwimlaneList extends BlazeComponent {
+  /** returns the card dialog options
+   * @return Object with properties { boardId, swimlaneId, listId }
+   */
+  getCardDialogOptions() {
+  }
+
+  /** list is done
+   * @param listId the selected list id
+   * @param options the selected options (Object with properties { boardId, swimlaneId, listId })
+   */
+  setDone(listId, options) {
+  }
+
+  onCreated() {
+    this.currentBoardId = Utils.getCurrentBoardId();
+    this.selectedBoardId = new ReactiveVar(this.currentBoardId);
+    this.selectedSwimlaneId = new ReactiveVar('');
+    this.selectedListId = new ReactiveVar('');
+    this.setCardDialogOption(this.currentBoardId);
+  }
+
+  /** set the last confirmed dialog field values
+   * @param boardId the current board id
+   */
+  setCardDialogOption(boardId) {
+    this.cardDialogOption = {
+      'boardId' : "",
+      'swimlaneId' : "",
+      'listId' : "",
     }
-    const lSelect = $('.js-select-lists')[0];
-    const listId = lSelect.options[lSelect.selectedIndex].value;
-    const slSelect = $('.js-select-swimlanes')[0];
-    const swimlaneId = slSelect.options[slSelect.selectedIndex].value;
 
+    let currentOptions = this.getCardDialogOptions();
+    if (currentOptions && boardId && currentOptions[boardId]) {
+      this.cardDialogOption = currentOptions[boardId];
+      if (this.cardDialogOption.boardId &&
+          this.cardDialogOption.swimlaneId &&
+          this.cardDialogOption.listId
+      )
+      {
+        this.selectedBoardId.set(this.cardDialogOption.boardId)
+        this.selectedSwimlaneId.set(this.cardDialogOption.swimlaneId);
+        this.selectedListId.set(this.cardDialogOption.listId);
+      }
+    }
+    this.getBoardData(this.selectedBoardId.get());
+    if (!this.selectedSwimlaneId.get() || !Swimlanes.findOne({_id: this.selectedSwimlaneId.get(), boardId: this.selectedBoardId.get()})) {
+      this.setFirstSwimlaneId();
+    }
+    if (!this.selectedListId.get() || !Lists.findOne({_id: this.selectedListId.get(), boardId: this.selectedBoardId.get()})) {
+      this.setFirstListId();
+    }
+  }
+  /** sets the first swimlane id */
+  setFirstSwimlaneId() {
+    try {
+      const board = Boards.findOne(this.selectedBoardId.get());
+      const swimlaneId = board.swimlanes().fetch()[0]._id;
+      this.selectedSwimlaneId.set(swimlaneId);
+    } catch (e) {}
+  }
+  /** sets the first list id */
+  setFirstListId() {
+    try {
+      const board = Boards.findOne(this.selectedBoardId.get());
+      const listId = board.lists().fetch()[0]._id;
+      this.selectedListId.set(listId);
+    } catch (e) {}
+  }
+
+  /** returns if the board id was the last confirmed one
+   * @param boardId check this board id
+   * @return if the board id was the last confirmed one
+   */
+  isCardDialogOptionBoardId(boardId) {
+    let ret = this.cardDialogOption.boardId == boardId;
+    return ret;
+  }
+
+  /** returns if the swimlane id was the last confirmed one
+   * @param swimlaneId check this swimlane id
+   * @return if the swimlane id was the last confirmed one
+   */
+  isCardDialogOptionSwimlaneId(swimlaneId) {
+    let ret = this.cardDialogOption.swimlaneId == swimlaneId;
+    return ret;
+  }
+
+  /** returns if the list id was the last confirmed one
+   * @param listId check this list id
+   * @return if the list id was the last confirmed one
+   */
+  isCardDialogOptionListId(listId) {
+    let ret = this.cardDialogOption.listId == listId;
+    return ret;
+  }
+
+  /** returns all available board */
+  boards() {
+    const ret = Boards.find(
+      {
+        archived: false,
+        'members.userId': Meteor.userId(),
+        _id: { $ne: Meteor.user().getTemplatesBoardId() },
+      },
+      {
+        sort: { sort: 1 },
+      },
+    );
+    return ret;
+  }
+
+  /** returns all available swimlanes of the current board */
+  swimlanes() {
+    const board = Boards.findOne(this.selectedBoardId.get());
+    const ret = board.swimlanes();
+    return ret;
+  }
+
+  /** returns all available lists of the current board */
+  lists() {
+    const board = Boards.findOne(this.selectedBoardId.get());
+    const ret = board.lists();
+    return ret;
+  }
+
+  /** get the board data from the server
+   * @param boardId get the board data of this board id
+   */
+  getBoardData(boardId) {
+    const self = this;
+    Meteor.subscribe('board', boardId, false, {
+      onReady() {
+        const sameBoardId = self.selectedBoardId.get() == boardId;
+        self.selectedBoardId.set(boardId);
+
+        if (!sameBoardId) {
+          // reset swimlane id (for selection in cards())
+          self.setFirstSwimlaneId();
+
+          // reset list id (for selection in cards())
+          self.setFirstListId();
+        }
+      },
+    });
+  }
+
+  events() {
+    return [
+      {
+        'click .js-done'() {
+          const boardSelect = this.$('.js-select-boards')[0];
+          const boardId = boardSelect.options[boardSelect.selectedIndex].value;
+
+          const listSelect = this.$('.js-select-lists')[0];
+          const listId = listSelect.options[listSelect.selectedIndex].value;
+
+          const swimlaneSelect = this.$('.js-select-swimlanes')[0];
+          const swimlaneId = swimlaneSelect.options[swimlaneSelect.selectedIndex].value;
+
+          const options = {
+            'boardId' : boardId,
+            'swimlaneId' : swimlaneId,
+            'listId' : listId,
+          }
+          this.setDone(boardId, swimlaneId, listId, options);
+          Popup.back(2);
+        },
+        'change .js-select-boards'(event) {
+          const boardId = $(event.currentTarget).val();
+          this.getBoardData(boardId);
+        },
+        'change .js-select-swimlanes'(event) {
+          this.selectedSwimlaneId.set($(event.currentTarget).val());
+        },
+      },
+    ];
+  }
+}
+
+/** Move Card Dialog */
+(class extends DialogWithBoardSwimlaneList {
+  getCardDialogOptions() {
+    const ret = Meteor.user().getMoveAndCopyDialogOptions();
+    return ret;
+  }
+  setDone(boardId, swimlaneId, listId, options) {
+    Meteor.user().setMoveAndCopyDialogOption(this.currentBoardId, options);
+    const card = this.data();
     const minOrder = card.getMinSort(listId, swimlaneId);
     card.move(boardId, swimlaneId, listId, minOrder - 1);
+  }
+}).register('moveCardPopup');
 
-    // set new id's to card object in case the card is moved to top by the comment "moveCard" after this command (.js-move-card)
-    this.boardId = boardId;
-    this.swimlaneId = swimlaneId;
-    this.listId = listId;
-
-    Popup.back(2);
-  },
-});
 BlazeComponent.extendComponent({
   onCreated() {
     this.currentBoardId = Utils.getCurrentBoardId();