Explorar el Código

New feature: Now there is popup selection of Lists/Swimlanes/Calendar/Roles.

New feature, not set visible yet, because switching to it does not
work properly yet: Collapsible Swimlanes #2804

Fix: Public board now loads correctly. When you select one of Lists/Swimlanes/Calendar view and
reload webbrowser page, it can change view. Closes #2311

Fix: List sorting commented out. Closes #2800

Fix: Errors hasHiddenMinicardText, hasShowDragHandles, showSort, hasSortBy, profile,
FirefoxAndroid/IE11/Vivaldi/Chromium browsers not working by using
cookies instead of database.
More details at https://github.com/wekan/wekan/issues/2643#issuecomment-554907955
Note: Cookie changes are not always immediate, if there is no effect,
you may need to reload webbrowser page.
Closes #2643 .

Thanks to xet7 !
Lauri Ojansivu hace 5 años
padre
commit
96abe3c691

+ 1 - 0
.meteor/packages

@@ -96,3 +96,4 @@ konecty:mongo-counter
 percolate:synced-cron
 percolate:synced-cron
 easylogic:summernote
 easylogic:summernote
 cfs:filesystem
 cfs:filesystem
+ostrio:cookies

+ 1 - 0
.meteor/versions

@@ -133,6 +133,7 @@ oauth2@1.2.1
 observe-sequence@1.0.16
 observe-sequence@1.0.16
 ongoworks:speakingurl@1.1.0
 ongoworks:speakingurl@1.1.0
 ordered-dict@1.1.0
 ordered-dict@1.1.0
+ostrio:cookies@2.5.0
 peerlibrary:assert@0.2.5
 peerlibrary:assert@0.2.5
 peerlibrary:base-component@0.16.0
 peerlibrary:base-component@0.16.0
 peerlibrary:blaze-components@0.15.1
 peerlibrary:blaze-components@0.15.1

+ 24 - 5
client/components/boards/boardBody.js

@@ -192,10 +192,13 @@ BlazeComponent.extendComponent({
     // ugly touch event hotfix
     // ugly touch event hotfix
     enableClickOnTouch('.js-swimlane:not(.placeholder)');
     enableClickOnTouch('.js-swimlane:not(.placeholder)');
 
 
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+
     this.autorun(() => {
     this.autorun(() => {
       if (
       if (
         Utils.isMiniScreen() ||
         Utils.isMiniScreen() ||
-        (!Utils.isMiniScreen() && Meteor.user().hasShowDesktopDragHandles())
+        (!Utils.isMiniScreen() && cookies.has('showDesktopDragHandles'))
       ) {
       ) {
         $swimlanesDom.sortable({
         $swimlanesDom.sortable({
           handle: '.js-swimlane-header-handle',
           handle: '.js-swimlane-header-handle',
@@ -227,20 +230,32 @@ BlazeComponent.extendComponent({
   },
   },
 
 
   isViewSwimlanes() {
   isViewSwimlanes() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
     const currentUser = Meteor.user();
     const currentUser = Meteor.user();
-    if (!currentUser) return false;
+    if (!currentUser) {
+      return cookies.get('boardView') === 'board-view-swimlanes';
+    }
     return (currentUser.profile || {}).boardView === 'board-view-swimlanes';
     return (currentUser.profile || {}).boardView === 'board-view-swimlanes';
   },
   },
 
 
   isViewLists() {
   isViewLists() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
     const currentUser = Meteor.user();
     const currentUser = Meteor.user();
-    if (!currentUser) return true;
+    if (!currentUser) {
+      return cookies.get('boardView') === 'board-view-lists';
+    }
     return (currentUser.profile || {}).boardView === 'board-view-lists';
     return (currentUser.profile || {}).boardView === 'board-view-lists';
   },
   },
 
 
   isViewCalendar() {
   isViewCalendar() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
     const currentUser = Meteor.user();
     const currentUser = Meteor.user();
-    if (!currentUser) return false;
+    if (!currentUser) {
+      return cookies.get('boardView') === 'board-view-cal';
+    }
     return (currentUser.profile || {}).boardView === 'board-view-cal';
     return (currentUser.profile || {}).boardView === 'board-view-cal';
   },
   },
 
 
@@ -398,8 +413,12 @@ BlazeComponent.extendComponent({
     };
     };
   },
   },
   isViewCalendar() {
   isViewCalendar() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
     const currentUser = Meteor.user();
     const currentUser = Meteor.user();
-    if (!currentUser) return false;
+    if (!currentUser) {
+      return cookies.get('boardView') === 'board-view-cal';
+    }
     return (currentUser.profile || {}).boardView === 'board-view-cal';
     return (currentUser.profile || {}).boardView === 'board-view-cal';
   },
   },
 }).register('calendarView');
 }).register('calendarView');

+ 76 - 28
client/components/boards/boardHeader.jade

@@ -77,10 +77,11 @@ template(name="boardHeaderBar")
             i.fa.fa-archive
             i.fa.fa-archive
             span {{_ 'archives'}}
             span {{_ 'archives'}}
 
 
-      if showSort
-       a.board-header-btn.js-open-sort-view(title="{{_ 'sort-desc'}}")
-        i.fa(class="{{directionClass}}")
-        span {{_ 'sort'}}{{_ listSortShortDesc}}
+      //if showSort
+      //  a.board-header-btn.js-open-sort-view(title="{{_ 'sort-desc'}}")
+      //    i.fa(class="{{directionClass}}")
+      //    span {{_ 'sort'}}{{_ listSortShortDesc}}
+
       a.board-header-btn.js-open-filter-view(
       a.board-header-btn.js-open-filter-view(
           title="{{#if Filter.isActive}}{{_ 'filter-on-desc'}}{{else}}{{_ 'filter'}}{{/if}}"
           title="{{#if Filter.isActive}}{{_ 'filter-on-desc'}}{{else}}{{_ 'filter'}}{{/if}}"
           class="{{#if Filter.isActive}}emphasis{{/if}}")
           class="{{#if Filter.isActive}}emphasis{{/if}}")
@@ -89,15 +90,6 @@ template(name="boardHeaderBar")
         if Filter.isActive
         if Filter.isActive
           a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
           a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
             i.fa.fa-times-thin
             i.fa.fa-times-thin
-            
-      if currentUser.isAdmin
-        a.board-header-btn.js-open-rules-view(title="{{_ 'rules'}}")
-          i.fa.fa-magic
-          span {{_ 'rules'}}
-      else if currentUser.isBoardAdmin
-        a.board-header-btn.js-open-rules-view(title="{{_ 'rules'}}")
-          i.fa.fa-magic
-          span {{_ 'rules'}}
 
 
       a.board-header-btn.js-open-search-view(title="{{_ 'search'}}")
       a.board-header-btn.js-open-search-view(title="{{_ 'search'}}")
         i.fa.fa-search
         i.fa.fa-search
@@ -106,8 +98,19 @@ template(name="boardHeaderBar")
       unless currentBoard.isTemplatesBoard
       unless currentBoard.isTemplatesBoard
         a.board-header-btn.js-toggle-board-view(
         a.board-header-btn.js-toggle-board-view(
           title="{{_ 'board-view'}}")
           title="{{_ 'board-view'}}")
-          i.fa.fa-th-large
-          span {{#if currentUser.profile.boardView}}{{_ currentUser.profile.boardView}}{{else}}{{_ 'board-view-lists'}}{{/if}}
+          i.fa.fa-caret-down
+          if $eq boardView 'board-view-lists'
+            i.fa.fa-trello
+          if $eq boardView 'board-view-swimlanes'
+            i.fa.fa-th-large
+          //  unless collapseSwimlane
+          //    i.fa.fa-th-large
+          //  if collapseSwimlane
+          //    i.fa.fa-play
+          if $eq boardView 'board-view-cal'
+            i.fa.fa-calendar
+          span {{#if boardView}}{{_ boardView}}{{else}}{{_ 'board-view-lists'}}{{/if}}
+          //span {{#if collapseSwimlane}}{{_ 'board-view-collapse'}}{{else}}{{#if boardView}}{{_ boardView}}{{else}}{{_ 'board-view-lists'}}{{/if}}{{/if}}
 
 
       if canModifyBoard
       if canModifyBoard
         a.board-header-btn.js-multiselection-activate(
         a.board-header-btn.js-multiselection-activate(
@@ -172,6 +175,51 @@ template(name="boardChangeWatchPopup")
             i.fa.fa-check
             i.fa.fa-check
           span.sub-name {{_ 'muted-info'}}
           span.sub-name {{_ 'muted-info'}}
 
 
+template(name="boardChangeViewPopup")
+  ul.pop-over-list
+    li
+      with "board-view-lists"
+        a.js-open-lists-view
+          i.fa.fa-trello.colorful
+          | {{_ 'board-view-lists'}}
+          if $eq Utils.boardView "board-view-lists"
+            i.fa.fa-check
+    li
+      with "board-view-swimlanes"
+        a.js-open-swimlanes-view
+          i.fa.fa-th-large.colorful
+          | {{_ 'board-view-swimlanes'}}
+          if $eq Utils.boardView "board-view-swimlanes"
+            i.fa.fa-check
+    //li
+    //  with "board-view-collapse"
+    //    a.js-open-collapse-view
+    //      i.fa.fa-play.colorful
+    //      | {{_ 'board-view-collapse'}}
+    //      if $eq Utils.boardView "board-view-collapse"
+    //        i.fa.fa-check
+    li
+      with "board-view-cal"
+        a.js-open-cal-view
+          i.fa.fa-calendar.colorful
+          | {{_ 'board-view-cal'}}
+          if $eq Utils.boardView "board-view-cal"
+            i.fa.fa-check
+    if currentUser.isAdmin
+      hr
+      li
+        with "board-view-rules"
+          a.js-open-rules-view(title="{{_ 'rules'}}")
+            i.fa.fa-magic
+            | {{_ 'rules'}}
+    else if currentUser.isBoardAdmin
+      hr
+      li
+        with "board-view-rules"
+          a.js-open-rules-view(title="{{_ 'rules'}}")
+            i.fa.fa-magic
+            | {{_ 'rules'}}
+
 template(name="createBoard")
 template(name="createBoard")
   form
   form
     label
     label
@@ -198,19 +246,19 @@ template(name="createBoard")
       | /
       | /
       a.js-board-template {{_ 'template'}}
       a.js-board-template {{_ 'template'}}
 
 
-template(name="listsortPopup")
-  h2
-   | {{_ 'list-sort-by'}}
-  hr
-  ul.pop-over-list
-    each value in allowedSortValues
-     li
-      a.js-sort-by(name="{{value.name}}")
-        if $eq sortby value.name
-           i(class="fa {{Direction}}") 
-        | {{_ value.label }}{{_ value.shortLabel}}
-        if $eq sortby value.name
-           i(class="fa fa-check")
+//template(name="listsortPopup")
+//  h2
+//   | {{_ 'list-sort-by'}}
+//  hr
+//  ul.pop-over-list
+//    each value in allowedSortValues
+//     li
+//      a.js-sort-by(name="{{value.name}}")
+//        if $eq sortby value.name
+//           i(class="fa {{Direction}}")
+//        | {{_ value.label }}{{_ value.shortLabel}}
+//        if $eq sortby value.name
+//           i(class="fa fa-check")
 
 
 template(name="boardChangeTitlePopup")
 template(name="boardChangeTitlePopup")
   form
   form

+ 88 - 21
client/components/boards/boardHeader.js

@@ -1,5 +1,7 @@
+/*
 const DOWNCLS = 'fa-sort-down';
 const DOWNCLS = 'fa-sort-down';
 const UPCLS = 'fa-sort-up';
 const UPCLS = 'fa-sort-up';
+*/
 Template.boardMenuPopup.events({
 Template.boardMenuPopup.events({
   'click .js-rename-board': Popup.open('boardChangeTitle'),
   'click .js-rename-board': Popup.open('boardChangeTitle'),
   'click .js-custom-fields'() {
   'click .js-custom-fields'() {
@@ -82,6 +84,7 @@ BlazeComponent.extendComponent({
     const currentBoard = Boards.findOne(Session.get('currentBoard'));
     const currentBoard = Boards.findOne(Session.get('currentBoard'));
     return currentBoard && currentBoard.stars >= 2;
     return currentBoard && currentBoard.stars >= 2;
   },
   },
+  /*
   showSort() {
   showSort() {
     return Meteor.user().hasSortBy();
     return Meteor.user().hasSortBy();
   },
   },
@@ -101,6 +104,7 @@ BlazeComponent.extendComponent({
   listSortShortDesc() {
   listSortShortDesc() {
     return `list-label-short-${this.currentListSortBy()}`;
     return `list-label-short-${this.currentListSortBy()}`;
   },
   },
+  */
   events() {
   events() {
     return [
     return [
       {
       {
@@ -114,30 +118,14 @@ BlazeComponent.extendComponent({
         'click .js-open-archived-board'() {
         'click .js-open-archived-board'() {
           Modal.open('archivedBoards');
           Modal.open('archivedBoards');
         },
         },
-        'click .js-toggle-board-view'() {
-          const currentUser = Meteor.user();
-          if (
-            (currentUser.profile || {}).boardView === 'board-view-swimlanes'
-          ) {
-            currentUser.setBoardView('board-view-cal');
-          } else if (
-            (currentUser.profile || {}).boardView === 'board-view-lists'
-          ) {
-            currentUser.setBoardView('board-view-swimlanes');
-          } else if (
-            (currentUser.profile || {}).boardView === 'board-view-cal'
-          ) {
-            currentUser.setBoardView('board-view-lists');
-          } else {
-            currentUser.setBoardView('board-view-swimlanes');
-          }
-        },
+        'click .js-toggle-board-view': Popup.open('boardChangeView'),
         'click .js-toggle-sidebar'() {
         'click .js-toggle-sidebar'() {
           Sidebar.toggle();
           Sidebar.toggle();
         },
         },
         'click .js-open-filter-view'() {
         'click .js-open-filter-view'() {
           Sidebar.setView('filter');
           Sidebar.setView('filter');
         },
         },
+        /*
         'click .js-open-sort-view'(evt) {
         'click .js-open-sort-view'(evt) {
           const target = evt.target;
           const target = evt.target;
           if (target.tagName === 'I') {
           if (target.tagName === 'I') {
@@ -148,6 +136,7 @@ BlazeComponent.extendComponent({
             Popup.open('listsort')(evt);
             Popup.open('listsort')(evt);
           }
           }
         },
         },
+        */
         'click .js-filter-reset'(event) {
         'click .js-filter-reset'(event) {
           event.stopPropagation();
           event.stopPropagation();
           Sidebar.setView();
           Sidebar.setView();
@@ -156,9 +145,6 @@ BlazeComponent.extendComponent({
         'click .js-open-search-view'() {
         'click .js-open-search-view'() {
           Sidebar.setView('search');
           Sidebar.setView('search');
         },
         },
-        'click .js-open-rules-view'() {
-          Modal.openWide('rulesMain');
-        },
         'click .js-multiselection-activate'() {
         'click .js-multiselection-activate'() {
           const currentCard = Session.get('currentCard');
           const currentCard = Session.get('currentCard');
           MultiSelection.activate();
           MultiSelection.activate();
@@ -186,6 +172,85 @@ Template.boardHeaderBar.helpers({
       !Meteor.user().isCommentOnly()
       !Meteor.user().isCommentOnly()
     );
     );
   },
   },
+  boardView() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.get('boardView') === 'board-view-lists') {
+      return 'board-view-lists';
+    } else if (cookies.get('boardView') === 'board-view-swimlanes') {
+      return 'board-view-swimlanes';
+    } else if (cookies.get('boardView') === 'board-view-collapse') {
+      return 'board-view-collapse';
+    } else if (cookies.get('boardView') === 'board-view-cal') {
+      return 'board-view-cal';
+    } else {
+      return false;
+    }
+  },
+  collapseSwimlane() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('collapseSwimlane')) {
+      return true;
+    } else {
+      return false;
+    }
+  },
+});
+
+Template.boardChangeViewPopup.events({
+  'click .js-open-lists-view'() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.get('boardView') !== 'board-view-lists') {
+      cookies.set('boardView', 'board-view-lists');
+      const currentUser = Meteor.user();
+      if (currentUser) {
+        Meteor.user().setBoardView('board-view-lists');
+      }
+    }
+    Popup.close();
+  },
+  'click .js-open-swimlanes-view'() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.get('boardView') !== 'board-view-swimlanes') {
+      cookies.set('boardView', 'board-view-swimlanes');
+      cookies.remove('collapseSwimlane');
+      const currentUser = Meteor.user();
+      if (currentUser) {
+        Meteor.user().setBoardView('board-view-swimlanes');
+      }
+    }
+    Popup.close();
+  },
+  'click .js-open-collapse-view'() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.get('boardView') !== 'board-view-swimlanes') {
+      cookies.set('boardView', 'board-view-swimlanes');
+      cookies.set('collapseSwimlane', 'true');
+      const currentUser = Meteor.user();
+      if (currentUser) {
+        Meteor.user().setBoardView('board-view-swimlanes');
+      }
+    }
+    Popup.close();
+  },
+  'click .js-open-cal-view'() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    cookies.set('boardView', 'board-view-cal');
+    const currentUser = Meteor.user();
+    if (currentUser) {
+      Meteor.user().setBoardView('board-view-cal');
+    }
+    Popup.close();
+  },
+  'click .js-open-rules-view'() {
+    Modal.openWide('rulesMain');
+    Popup.close();
+  },
 });
 });
 
 
 const CreateBoard = BlazeComponent.extendComponent({
 const CreateBoard = BlazeComponent.extendComponent({
@@ -308,6 +373,7 @@ BlazeComponent.extendComponent({
   },
   },
 }).register('boardChangeWatchPopup');
 }).register('boardChangeWatchPopup');
 
 
+/*
 BlazeComponent.extendComponent({
 BlazeComponent.extendComponent({
   onCreated() {
   onCreated() {
     //this.sortBy = new ReactiveVar();
     //this.sortBy = new ReactiveVar();
@@ -377,3 +443,4 @@ BlazeComponent.extendComponent({
     ];
     ];
   },
   },
 }).register('listsortPopup');
 }).register('listsortPopup');
+*/

+ 21 - 3
client/components/cards/minicard.js

@@ -18,7 +18,13 @@ BlazeComponent.extendComponent({
       },
       },
       {
       {
         'click .js-toggle-minicard-label-text'() {
         'click .js-toggle-minicard-label-text'() {
-          Meteor.call('toggleMinicardLabelText');
+          import { Cookies } from 'meteor/ostrio:cookies';
+          const cookies = new Cookies();
+          if (cookies.has('hiddenMinicardLabelText')) {
+            cookies.remove('hiddenMinicardLabelText'); //true
+          } else {
+            cookies.set('hiddenMinicardLabelText', 'true'); //true
+          }
         },
         },
       },
       },
     ];
     ];
@@ -27,9 +33,21 @@ BlazeComponent.extendComponent({
 
 
 Template.minicard.helpers({
 Template.minicard.helpers({
   showDesktopDragHandles() {
   showDesktopDragHandles() {
-    return Meteor.user().hasShowDesktopDragHandles();
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('showDesktopDragHandles')) {
+      return true;
+    } else {
+      return false;
+    }
   },
   },
   hiddenMinicardLabelText() {
   hiddenMinicardLabelText() {
-    return Meteor.user().hasHiddenMinicardLabelText();
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('hiddenMinicardLabelText')) {
+      return true;
+    } else {
+      return false;
+    }
   },
   },
 });
 });

+ 15 - 10
client/components/lists/list.js

@@ -73,16 +73,15 @@ BlazeComponent.extendComponent({
         const listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
         const listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
         const currentBoard = Boards.findOne(Session.get('currentBoard'));
         const currentBoard = Boards.findOne(Session.get('currentBoard'));
         let swimlaneId = '';
         let swimlaneId = '';
-        const boardView = (Meteor.user().profile || {}).boardView;
         if (
         if (
-          boardView === 'board-view-swimlanes' ||
+          Utils.boardView() === 'board-view-swimlanes' ||
           currentBoard.isTemplatesBoard()
           currentBoard.isTemplatesBoard()
         )
         )
           swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
           swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
         else if (
         else if (
-          boardView === 'board-view-lists' ||
-          boardView === 'board-view-cal' ||
-          !boardView
+          Utils.boardView() === 'board-view-lists' ||
+          Utils.boardView() === 'board-view-cal' ||
+          !Utils.boardView
         )
         )
           swimlaneId = currentBoard.getDefaultSwimline()._id;
           swimlaneId = currentBoard.getDefaultSwimline()._id;
 
 
@@ -116,11 +115,11 @@ BlazeComponent.extendComponent({
     // ugly touch event hotfix
     // ugly touch event hotfix
     enableClickOnTouch(itemsSelector);
     enableClickOnTouch(itemsSelector);
 
 
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+
     this.autorun(() => {
     this.autorun(() => {
-      if (
-        Utils.isMiniScreen() ||
-        (!Utils.isMiniScreen() && Meteor.user().hasShowDesktopDragHandles())
-      ) {
+      if (!Utils.isMiniScreen() && cookies.has('showDesktopDragHandles')) {
         $cards.sortable({
         $cards.sortable({
           handle: '.handle',
           handle: '.handle',
         });
         });
@@ -164,7 +163,13 @@ BlazeComponent.extendComponent({
 
 
 Template.list.helpers({
 Template.list.helpers({
   showDesktopDragHandles() {
   showDesktopDragHandles() {
-    return Meteor.user().hasShowDesktopDragHandles();
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('showDesktopDragHandles')) {
+      return true;
+    } else {
+      return false;
+    }
   },
   },
 });
 });
 
 

+ 10 - 15
client/components/lists/listBody.js

@@ -48,7 +48,6 @@ BlazeComponent.extendComponent({
     const board = this.data().board();
     const board = this.data().board();
     let linkedId = '';
     let linkedId = '';
     let swimlaneId = '';
     let swimlaneId = '';
-    const boardView = (Meteor.user().profile || {}).boardView;
     let cardType = 'cardType-card';
     let cardType = 'cardType-card';
     if (title) {
     if (title) {
       if (board.isTemplatesBoard()) {
       if (board.isTemplatesBoard()) {
@@ -71,14 +70,14 @@ BlazeComponent.extendComponent({
           });
           });
           cardType = 'cardType-linkedBoard';
           cardType = 'cardType-linkedBoard';
         }
         }
-      } else if (boardView === 'board-view-swimlanes')
+      } else if (Utils.boardView() === 'board-view-swimlanes')
         swimlaneId = this.parentComponent()
         swimlaneId = this.parentComponent()
           .parentComponent()
           .parentComponent()
           .data()._id;
           .data()._id;
       else if (
       else if (
-        boardView === 'board-view-lists' ||
-        boardView === 'board-view-cal' ||
-        !boardView
+        Utils.boardView() === 'board-view-lists' ||
+        Utils.boardView() === 'board-view-cal' ||
+        !Utils.boardView
       )
       )
         swimlaneId = board.getDefaultSwimline()._id;
         swimlaneId = board.getDefaultSwimline()._id;
 
 
@@ -157,9 +156,8 @@ BlazeComponent.extendComponent({
   },
   },
 
 
   idOrNull(swimlaneId) {
   idOrNull(swimlaneId) {
-    const currentUser = Meteor.user();
     if (
     if (
-      (currentUser.profile || {}).boardView === 'board-view-swimlanes' ||
+      Utils.boardView() === 'board-view-swimlanes' ||
       this.data()
       this.data()
         .board()
         .board()
         .isTemplatesBoard()
         .isTemplatesBoard()
@@ -397,10 +395,9 @@ BlazeComponent.extendComponent({
       '.js-swimlane',
       '.js-swimlane',
     );
     );
     this.swimlaneId = '';
     this.swimlaneId = '';
-    const boardView = (Meteor.user().profile || {}).boardView;
-    if (boardView === 'board-view-swimlanes')
+    if (Utils.boardView() === 'board-view-swimlanes')
       this.swimlaneId = Blaze.getData(swimlane[0])._id;
       this.swimlaneId = Blaze.getData(swimlane[0])._id;
-    else if (boardView === 'board-view-lists' || !boardView)
+    else if (Utils.boardView() === 'board-view-lists' || !Utils.boardView)
       this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id;
       this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id;
   },
   },
 
 
@@ -580,7 +577,7 @@ BlazeComponent.extendComponent({
       const swimlane = $(Popup._getTopStack().openerElement).parents(
       const swimlane = $(Popup._getTopStack().openerElement).parents(
         '.js-swimlane',
         '.js-swimlane',
       );
       );
-      if ((Meteor.user().profile || {}).boardView === 'board-view-swimlanes')
+      if (Utils.boardView() === 'board-view-swimlanes')
         this.swimlaneId = Blaze.getData(swimlane[0])._id;
         this.swimlaneId = Blaze.getData(swimlane[0])._id;
       else this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id;
       else this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id;
       // List where to insert card
       // List where to insert card
@@ -709,8 +706,7 @@ BlazeComponent.extendComponent({
     if (isSandstorm) {
     if (isSandstorm) {
       const user = Meteor.user();
       const user = Meteor.user();
       if (user) {
       if (user) {
-        const boardView = (Meteor.user().profile || {}).boardView;
-        if (boardView === 'board-view-swimlanes') {
+        if (Utils.boardView() === 'board-view-swimlanes') {
           this.swimlaneId = this.parentComponent()
           this.swimlaneId = this.parentComponent()
             .parentComponent()
             .parentComponent()
             .parentComponent()
             .parentComponent()
@@ -718,8 +714,7 @@ BlazeComponent.extendComponent({
         }
         }
       }
       }
     } else {
     } else {
-      const boardView = (Meteor.user().profile || {}).boardView;
-      if (boardView === 'board-view-swimlanes') {
+      if (Utils.boardView() === 'board-view-swimlanes') {
         this.swimlaneId = this.parentComponent()
         this.swimlaneId = this.parentComponent()
           .parentComponent()
           .parentComponent()
           .parentComponent()
           .parentComponent()

+ 12 - 4
client/components/lists/listHeader.js

@@ -44,14 +44,16 @@ BlazeComponent.extendComponent({
   },
   },
 
 
   limitToShowCardsCount() {
   limitToShowCardsCount() {
-    return Meteor.user().getLimitToShowCardsCount();
+    const currentUser = Meteor.user();
+    if (currentUser) {
+      return Meteor.user().getLimitToShowCardsCount();
+    }
   },
   },
 
 
   cardsCount() {
   cardsCount() {
     const list = Template.currentData();
     const list = Template.currentData();
     let swimlaneId = '';
     let swimlaneId = '';
-    const boardView = (Meteor.user().profile || {}).boardView;
-    if (boardView === 'board-view-swimlanes')
+    if (Utils.boardView() === 'board-view-swimlanes')
       swimlaneId = this.parentComponent()
       swimlaneId = this.parentComponent()
         .parentComponent()
         .parentComponent()
         .data()._id;
         .data()._id;
@@ -100,7 +102,13 @@ BlazeComponent.extendComponent({
 
 
 Template.listHeader.helpers({
 Template.listHeader.helpers({
   showDesktopDragHandles() {
   showDesktopDragHandles() {
-    return Meteor.user().hasShowDesktopDragHandles();
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('showDesktopDragHandles')) {
+      return true;
+    } else {
+      return false;
+    }
   },
   },
 });
 });
 
 

+ 14 - 2
client/components/sidebar/sidebar.js

@@ -107,7 +107,13 @@ BlazeComponent.extendComponent({
         'click .js-toggle-sidebar': this.toggle,
         'click .js-toggle-sidebar': this.toggle,
         'click .js-back-home': this.setView,
         'click .js-back-home': this.setView,
         'click .js-toggle-minicard-label-text'() {
         'click .js-toggle-minicard-label-text'() {
-          Meteor.call('toggleMinicardLabelText');
+          import { Cookies } from 'meteor/ostrio:cookies';
+          const cookies = new Cookies();
+          if (cookies.has('hiddenMinicardLabelText')) {
+            cookies.remove('hiddenMinicardLabelText'); //true
+          } else {
+            cookies.set('hiddenMinicardLabelText', 'true'); //true
+          }
         },
         },
         'click .js-shortcuts'() {
         'click .js-shortcuts'() {
           FlowRouter.go('shortcuts');
           FlowRouter.go('shortcuts');
@@ -121,7 +127,13 @@ Blaze.registerHelper('Sidebar', () => Sidebar);
 
 
 Template.homeSidebar.helpers({
 Template.homeSidebar.helpers({
   hiddenMinicardLabelText() {
   hiddenMinicardLabelText() {
-    return Meteor.user().hasHiddenMinicardLabelText();
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('hiddenMinicardLabelText')) {
+      return true;
+    } else {
+      return false;
+    }
   },
   },
 });
 });
 
 

+ 7 - 1
client/components/swimlanes/swimlaneHeader.js

@@ -30,7 +30,13 @@ BlazeComponent.extendComponent({
 
 
 Template.swimlaneHeader.helpers({
 Template.swimlaneHeader.helpers({
   showDesktopDragHandles() {
   showDesktopDragHandles() {
-    return Meteor.user().hasShowDesktopDragHandles();
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('showDesktopDragHandles')) {
+      return true;
+    } else {
+      return false;
+    }
   },
   },
 });
 });
 
 

+ 23 - 3
client/components/swimlanes/swimlanes.jade

@@ -1,9 +1,7 @@
 template(name="swimlane")
 template(name="swimlane")
   .swimlane
   .swimlane
     +swimlaneHeader
     +swimlaneHeader
-  // Minimize swimlanes next 2 lines below https://www.w3schools.com/howto/howto_js_accordion.asp
-  button(class="accordion")
-  div(class="panel")
+  unless collapseSwimlane
     .swimlane.js-lists.js-swimlane
     .swimlane.js-lists.js-swimlane
       if isMiniScreen
       if isMiniScreen
         if currentListIsInThisSwimlane _id
         if currentListIsInThisSwimlane _id
@@ -22,6 +20,28 @@ template(name="swimlane")
         if currentUser.isBoardMember
         if currentUser.isBoardMember
           unless currentUser.isCommentOnly
           unless currentUser.isCommentOnly
             +addListForm
             +addListForm
+  if collapseSwimlane
+    // Minimize swimlanes next 2 lines below https://www.w3schools.com/howto/howto_js_accordion.asp
+    button(class="accordion")
+    div(class="panel")
+      .swimlane.js-lists.js-swimlane
+        if isMiniScreen
+          if currentListIsInThisSwimlane _id
+            +list(currentList)
+          unless currentList
+            each lists
+              +miniList(this)
+            if currentUser.isBoardMember
+              unless currentUser.isCommentOnly
+                +addListForm
+        else
+          each lists
+            +list(this)
+            if currentCardIsInThisList _id ../_id
+              +cardDetails(currentCard)
+          if currentUser.isBoardMember
+            unless currentUser.isCommentOnly
+              +addListForm
 
 
 template(name="listsGroup")
 template(name="listsGroup")
   .swimlane.list-group.js-lists
   .swimlane.list-group.js-lists

+ 33 - 22
client/components/swimlanes/swimlanes.js

@@ -14,7 +14,7 @@ function currentCardIsInThisList(listId, swimlaneId) {
   if (
   if (
     currentUser &&
     currentUser &&
     currentUser.profile &&
     currentUser.profile &&
-    currentUser.profile.boardView === 'board-view-swimlanes'
+    Utils.boardView() === 'board-view-swimlanes'
   )
   )
     return (
     return (
       currentCard &&
       currentCard &&
@@ -97,10 +97,9 @@ function initSortable(boardComponent, $listsDom) {
   }
   }
 
 
   boardComponent.autorun(() => {
   boardComponent.autorun(() => {
-    if (
-      Utils.isMiniScreen() ||
-      (!Utils.isMiniScreen() && Meteor.user().hasShowDesktopDragHandles())
-    ) {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (!Utils.isMiniScreen() && cookies.has('showDesktopDragHandles')) {
       $listsDom.sortable({
       $listsDom.sortable({
         handle: '.js-list-handle',
         handle: '.js-list-handle',
       });
       });
@@ -135,21 +134,25 @@ BlazeComponent.extendComponent({
 
 
     initSortable(boardComponent, $listsDom);
     initSortable(boardComponent, $listsDom);
 
 
-    // Minimize swimlanes start https://www.w3schools.com/howto/howto_js_accordion.asp
-    const acc = document.getElementsByClassName('accordion');
-    let i;
-    for (i = 0; i < acc.length; i++) {
-      acc[i].addEventListener('click', function() {
-        this.classList.toggle('active');
-        const panel = this.nextElementSibling;
-        if (panel.style.maxHeight) {
-          panel.style.maxHeight = null;
-        } else {
-          panel.style.maxHeight = `${panel.scrollHeight}px`;
-        }
-      });
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('collapseSwimlane')) {
+      // Minimize swimlanes start https://www.w3schools.com/howto/howto_js_accordion.asp
+      const acc = document.getElementsByClassName('accordion');
+      let i;
+      for (i = 0; i < acc.length; i++) {
+        acc[i].addEventListener('click', function() {
+          this.classList.toggle('active');
+          const panel = this.nextElementSibling;
+          if (panel.style.maxHeight) {
+            panel.style.maxHeight = null;
+          } else {
+            panel.style.maxHeight = `${panel.scrollHeight}px`;
+          }
+        });
+      }
+      // Minimize swimlanes end https://www.w3schools.com/howto/howto_js_accordion.asp
     }
     }
-    // Minimize swimlanes end https://www.w3schools.com/howto/howto_js_accordion.asp
   },
   },
   onCreated() {
   onCreated() {
     this.draggingActive = new ReactiveVar(false);
     this.draggingActive = new ReactiveVar(false);
@@ -181,10 +184,12 @@ BlazeComponent.extendComponent({
           // the user will legitimately expect to be able to select some text with
           // the user will legitimately expect to be able to select some text with
           // his mouse.
           // his mouse.
 
 
+          import { Cookies } from 'meteor/ostrio:cookies';
+          const cookies = new Cookies();
+
           const noDragInside = ['a', 'input', 'textarea', 'p'].concat(
           const noDragInside = ['a', 'input', 'textarea', 'p'].concat(
             Utils.isMiniScreen() ||
             Utils.isMiniScreen() ||
-              (!Utils.isMiniScreen() &&
-                Meteor.user().hasShowDesktopDragHandles())
+              (!Utils.isMiniScreen() && cookies.has('showDesktopDragHandles'))
               ? ['.js-list-handle', '.js-swimlane-header-handle']
               ? ['.js-list-handle', '.js-swimlane-header-handle']
               : ['.js-list-header'],
               : ['.js-list-header'],
           );
           );
@@ -265,7 +270,13 @@ BlazeComponent.extendComponent({
 
 
 Template.swimlane.helpers({
 Template.swimlane.helpers({
   showDesktopDragHandles() {
   showDesktopDragHandles() {
-    return Meteor.user().hasShowDesktopDragHandles();
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('showDesktopDragHandles')) {
+      return true;
+    } else {
+      return false;
+    }
   },
   },
   canSeeAddList() {
   canSeeAddList() {
     return (
     return (

+ 26 - 4
client/components/users/userHeader.js

@@ -162,19 +162,41 @@ Template.changeLanguagePopup.events({
 
 
 Template.changeSettingsPopup.helpers({
 Template.changeSettingsPopup.helpers({
   showDesktopDragHandles() {
   showDesktopDragHandles() {
-    return Meteor.user().hasShowDesktopDragHandles();
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('showDesktopDragHandles')) {
+      return true;
+    } else {
+      return false;
+    }
   },
   },
   hiddenSystemMessages() {
   hiddenSystemMessages() {
-    return Meteor.user().hasHiddenSystemMessages();
+    const currentUser = Meteor.user();
+    if (currentUser) {
+      return Meteor.user().hasHiddenSystemMessages();
+    } else {
+      return false;
+    }
   },
   },
   showCardsCountAt() {
   showCardsCountAt() {
-    return Meteor.user().getLimitToShowCardsCount();
+    const currentUser = Meteor.user();
+    if (currentUser) {
+      return Meteor.user().getLimitToShowCardsCount();
+    } else {
+      return false;
+    }
   },
   },
 });
 });
 
 
 Template.changeSettingsPopup.events({
 Template.changeSettingsPopup.events({
   'click .js-toggle-desktop-drag-handles'() {
   'click .js-toggle-desktop-drag-handles'() {
-    Meteor.call('toggleDesktopDragHandles');
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('showDesktopDragHandles')) {
+      cookies.remove('showDesktopDragHandles'); //true
+    } else {
+      cookies.set('showDesktopDragHandles', 'true'); //true
+    }
   },
   },
   'click .js-toggle-system-messages'() {
   'click .js-toggle-system-messages'() {
     Meteor.call('toggleSystemMessages');
     Meteor.call('toggleSystemMessages');

+ 54 - 0
client/lib/utils.js

@@ -1,4 +1,58 @@
 Utils = {
 Utils = {
+  setBoardView(view) {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    currentUser = Meteor.user();
+    if (view === 'board-view-lists') {
+      cookies.set('boardView', 'board-view-lists'); //true
+      if (currentUser) {
+        Meteor.user().setBoardView('board-view-lists');
+      }
+    } else if (view === 'board-view-swimlanes') {
+      cookies.set('boardView', 'board-view-swimlanes'); //true
+      if (currentUser) {
+        Meteor.user().setBoardView('board-view-swimlanes');
+      }
+    } else if (view === 'board-view-collapse') {
+      cookies.set('boardView', 'board-view-swimlane'); //true
+      cookies.set('collapseSwimlane', 'true'); //true
+      if (currentUser) {
+        Meteor.user().setBoardView('board-view-swimlane');
+      }
+    } else if (view === 'board-view-cal') {
+      cookies.set('boardView', 'board-view-cal'); //true
+      if (currentUser) {
+        Meteor.user().setBoardView('board-view-cal');
+      }
+    }
+  },
+
+  unsetBoardView() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    cookies.remove('boardView');
+    cookies.remove('collapseSwimlane');
+  },
+
+  boardView() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.get('boardView') === 'board-view-lists') {
+      return 'board-view-lists';
+    } else if (
+      cookies.get('boardView') === 'board-view-swimlanes' &&
+      !cookies.has('collapseSwimlane')
+    ) {
+      return 'board-view-swimlanes';
+    } else if (cookies.has('collapseSwimlane')) {
+      return 'board-view-swimlanes';
+    } else if (cookies.get('boardView') === 'board-view-cal') {
+      return 'board-view-cal';
+    } else {
+      return false;
+    }
+  },
+
   // XXX We should remove these two methods
   // XXX We should remove these two methods
   goBoardId(_id) {
   goBoardId(_id) {
     const board = Boards.findOne(_id);
     const board = Boards.findOne(_id);

+ 6 - 2
models/boards.js

@@ -409,8 +409,12 @@ Boards.helpers({
   },
   },
 
 
   lists() {
   lists() {
-    const enabled = Meteor.user().hasSortBy();
-    return enabled ? this.newestLists() : this.draggableLists();
+    //currentUser = Meteor.user();
+    //if (currentUser) {
+    //  enabled = Meteor.user().hasSortBy();
+    //}
+    //return enabled ? this.newestLists() : this.draggableLists();
+    return this.draggableLists();
   },
   },
 
 
   newestLists() {
   newestLists() {

+ 6 - 2
models/swimlanes.js

@@ -174,8 +174,12 @@ Swimlanes.helpers({
   },
   },
 
 
   lists() {
   lists() {
-    const enabled = Meteor.user().hasSortBy();
-    return enabled ? this.newestLists() : this.draggableLists();
+    //currentUser = Meteor.user();
+    //if (currentUser) {
+    //  enabled = Meteor.user().hasSortBy();
+    //}
+    //return enabled ? this.newestLists() : this.draggableLists();
+    return this.draggableLists();
   },
   },
   newestLists() {
   newestLists() {
     // sorted lists from newest to the oldest, by its creation date or its cards' last modification date
     // sorted lists from newest to the oldest, by its creation date or its cards' last modification date

+ 18 - 53
models/users.js

@@ -119,13 +119,6 @@ Users.attachSchema(
       type: String,
       type: String,
       optional: true,
       optional: true,
     },
     },
-    'profile.showDesktopDragHandles': {
-      /**
-       * does the user want to hide system messages?
-       */
-      type: Boolean,
-      optional: true,
-    },
     'profile.hiddenSystemMessages': {
     'profile.hiddenSystemMessages': {
       /**
       /**
        * does the user want to hide system messages?
        * does the user want to hide system messages?
@@ -133,13 +126,6 @@ Users.attachSchema(
       type: Boolean,
       type: Boolean,
       optional: true,
       optional: true,
     },
     },
-    'profile.hiddenMinicardLabelText': {
-      /**
-       * does the user want to hide minicard label texts?
-       */
-      type: Boolean,
-      optional: true,
-    },
     'profile.initials': {
     'profile.initials': {
       /**
       /**
        * initials of the user
        * initials of the user
@@ -198,6 +184,7 @@ Users.attachSchema(
       allowedValues: [
       allowedValues: [
         'board-view-lists',
         'board-view-lists',
         'board-view-swimlanes',
         'board-view-swimlanes',
+        'board-view-collapse',
         'board-view-cal',
         'board-view-cal',
       ],
       ],
     },
     },
@@ -395,10 +382,18 @@ Users.helpers({
     }
     }
     return ret;
     return ret;
   },
   },
-  hasSortBy() {
-    // if use doesn't have dragHandle, then we can let user to choose sort list by different order
-    return !this.hasShowDesktopDragHandles();
-  },
+  //hasSortBy() {
+  // if use doesn't have dragHandle, then we can let user to choose sort list by different order
+  //return this.hasShowDesktopDragHandles();
+  //  return false;
+  /*
+    if (typeof currentUser === 'undefined' || typeof currentUser === 'null') {
+      return false;
+    } else {
+      return this.hasShowDesktopDragHandles();
+    }
+    */
+  //},
   getListSortBy() {
   getListSortBy() {
     return this._getListSortBy()[0];
     return this._getListSortBy()[0];
   },
   },
@@ -419,21 +414,11 @@ Users.helpers({
     return _.contains(notifications, activityId);
     return _.contains(notifications, activityId);
   },
   },
 
 
-  hasShowDesktopDragHandles() {
-    const profile = this.profile || {};
-    return profile.showDesktopDragHandles || false;
-  },
-
   hasHiddenSystemMessages() {
   hasHiddenSystemMessages() {
     const profile = this.profile || {};
     const profile = this.profile || {};
     return profile.hiddenSystemMessages || false;
     return profile.hiddenSystemMessages || false;
   },
   },
 
 
-  hasHiddenMinicardLabelText() {
-    const profile = this.profile || {};
-    return profile.hiddenMinicardLabelText || false;
-  },
-
   getEmailBuffer() {
   getEmailBuffer() {
     const { emailBuffer = [] } = this.profile || {};
     const { emailBuffer = [] } = this.profile || {};
     return emailBuffer;
     return emailBuffer;
@@ -455,8 +440,11 @@ Users.helpers({
   },
   },
 
 
   getLimitToShowCardsCount() {
   getLimitToShowCardsCount() {
-    const profile = this.profile || {};
-    return profile.showCardsCountAt;
+    currentUser = Meteor.user();
+    if (currentUser) {
+      const profile = this.profile || {};
+      return profile.showCardsCountAt;
+    }
   },
   },
 
 
   getName() {
   getName() {
@@ -536,13 +524,6 @@ Users.mutations({
       },
       },
     };
     };
   },
   },
-  toggleDesktopHandles(value = false) {
-    return {
-      $set: {
-        'profile.showDesktopDragHandles': !value,
-      },
-    };
-  },
 
 
   toggleSystem(value = false) {
   toggleSystem(value = false) {
     return {
     return {
@@ -552,14 +533,6 @@ Users.mutations({
     };
     };
   },
   },
 
 
-  toggleLabelText(value = false) {
-    return {
-      $set: {
-        'profile.hiddenMinicardLabelText': !value,
-      },
-    };
-  },
-
   addNotification(activityId) {
   addNotification(activityId) {
     return {
     return {
       $addToSet: {
       $addToSet: {
@@ -624,18 +597,10 @@ Meteor.methods({
     check(value, String);
     check(value, String);
     Meteor.user().setListSortBy(value);
     Meteor.user().setListSortBy(value);
   },
   },
-  toggleDesktopDragHandles() {
-    const user = Meteor.user();
-    user.toggleDesktopHandles(user.hasShowDesktopDragHandles());
-  },
   toggleSystemMessages() {
   toggleSystemMessages() {
     const user = Meteor.user();
     const user = Meteor.user();
     user.toggleSystem(user.hasHiddenSystemMessages());
     user.toggleSystem(user.hasHiddenSystemMessages());
   },
   },
-  toggleMinicardLabelText() {
-    const user = Meteor.user();
-    user.toggleLabelText(user.hasHiddenMinicardLabelText());
-  },
   changeLimitToShowCardsCount(limit) {
   changeLimitToShowCardsCount(limit) {
     check(limit, Number);
     check(limit, Number);
     Meteor.user().setShowCardsCountAt(limit);
     Meteor.user().setShowCardsCountAt(limit);

+ 24 - 0
server/migrations.js

@@ -793,3 +793,27 @@ Migrations.add('add-assignee', () => {
     noValidateMulti,
     noValidateMulti,
   );
   );
 });
 });
+
+Migrations.add('remove-profile-showDesktopDragHandles', () => {
+  Users.update(
+    {},
+    {
+      $unset: {
+        'profile.showDesktopDragHandles': 1,
+      },
+    },
+    noValidateMulti,
+  );
+});
+
+Migrations.add('remove-profile-hiddenMinicardLabelText', () => {
+  Users.update(
+    {},
+    {
+      $unset: {
+        'profile.hiddenMinicardLabelText': 1,
+      },
+    },
+    noValidateMulti,
+  );
+});