Browse Source

Allow the header bar customization

This commit also provide a way to escape the Shorcuts page on
Sandstorm.
Maxime Quandalle 9 years ago
parent
commit
71b9a42f00

+ 1 - 1
client/components/boards/boardArchive.js

@@ -1,4 +1,4 @@
-Template.headerTitle.events({
+Template.boardHeaderBar.events({
   'click .js-open-archived-board'() {
   'click .js-open-archived-board'() {
     Modal.open('archivedBoards');
     Modal.open('archivedBoards');
   },
   },

+ 1 - 1
client/components/boards/boardHeader.jade

@@ -1,4 +1,4 @@
-template(name="headerBoard")
+template(name="boardHeaderBar")
   h1.header-board-menu
   h1.header-board-menu
     with currentBoard
     with currentBoard
       a(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}")
       a(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}")

+ 9 - 0
client/components/boards/boardsList.jade

@@ -23,3 +23,12 @@ template(name="boardList")
                 p.board-list-item-desc= description
                 p.board-list-item-desc= description
       li.js-add-board
       li.js-add-board
         a.board-list-item.label {{_ 'add-board'}}
         a.board-list-item.label {{_ 'add-board'}}
+
+
+template(name="boardListHeaderBar")
+  h1 {{_ 'my-boards'}}
+
+  .board-header-btns.right
+    a.board-header-btn.js-open-archived-board
+      i.fa.fa-archive
+      span {{_ 'archives'}}

+ 1 - 12
client/components/main/header.jade

@@ -32,10 +32,7 @@ template(name="header")
       current page. This bar is contextual based.
       current page. This bar is contextual based.
       If the user is not connected we display "sign in" and "log in" buttons.
       If the user is not connected we display "sign in" and "log in" buttons.
     #header-main-bar(class="{{#if wrappedHeader}}wrapper{{/if}}")
     #header-main-bar(class="{{#if wrappedHeader}}wrapper{{/if}}")
-      if $.Session.get 'currentBoard'
-        +headerBoard
-      else if($eq currentRouteName 'home')
-        +headerTitle
+      +Template.dynamic(template=headerBar)
 
 
       //-
       //-
         On sandstorm, the logo shouldn't be clickable, because we only have one
         On sandstorm, the logo shouldn't be clickable, because we only have one
@@ -47,11 +44,3 @@ template(name="header")
       else
       else
         a.wekan-logo(href="{{pathFor 'home'}}" title="{{_ 'header-logo-title'}}")
         a.wekan-logo(href="{{pathFor 'home'}}" title="{{_ 'header-logo-title'}}")
           img(src="{{pathFor '/wekan-logo-header.png'}}" alt="Wekan")
           img(src="{{pathFor '/wekan-logo-header.png'}}" alt="Wekan")
-
-template(name="headerTitle")
-  h1 {{_ 'my-boards'}}
-
-  .board-header-btns.right
-    a.board-header-btn.js-open-archived-board
-      i.fa.fa-archive
-      span {{_ 'archives'}}

+ 8 - 0
client/components/main/header.styl

@@ -85,6 +85,14 @@
       float: left
       float: left
       border-radius: 3px
       border-radius: 3px
 
 
+      a.fa, a i.fa
+        color: white
+
+      .back-btn
+        font-size: 0.9em
+        margin-right: 10px
+
+
     .wekan-logo
     .wekan-logo
       display: block
       display: block
       margin: 3px auto 0
       margin: 3px auto 0

+ 19 - 0
client/components/main/keyboardShortcuts.jade

@@ -0,0 +1,19 @@
+template(name="shortcutsHeaderBar")
+  h1
+    a.back-btn(href="{{pathFor 'home'}}")
+      i.fa.fa-chevron-left
+    | {{_ 'keyboard-shortcuts'}}
+
+template(name="shortcutsModalTitle")
+  h2
+    i.fa.fa-keyboard-o
+    | {{_ 'keyboard-shortcuts'}}
+
+template(name="keyboardShortcuts")
+  .wrapper.shortcuts-list
+    each mapping
+      .shortcuts-list-item
+        .shortcuts-list-item-keys
+          each keys
+            kbd= this
+        .shortcuts-list-item-action {{_ action}}

+ 0 - 11
client/components/main/keyboardShortcuts.tpl.jade

@@ -1,11 +0,0 @@
-.wrapper.shortcuts-list
-  h2
-    i.fa.fa-keyboard-o
-    | {{_ 'keyboard-shortcuts'}}
-
-  each mapping
-    .shortcuts-list-item
-      .shortcuts-list-item-keys
-        each keys
-          kbd= this
-      .shortcuts-list-item-action {{_ action}}

+ 1 - 0
client/components/main/layouts.jade

@@ -31,6 +31,7 @@ template(name="defaultLayout")
       .modal-content
       .modal-content
         a.modal-close-btn.js-close-modal
         a.modal-close-btn.js-close-modal
           i.fa.fa-times-thin
           i.fa.fa-times-thin
+        +Template.dynamic(template=Modal.getHeaderName)
         +Template.dynamic(template=Modal.getTemplateName)
         +Template.dynamic(template=Modal.getTemplateName)
 
 
 template(name="notFound")
 template(name="notFound")

+ 3 - 0
client/components/main/layouts.styl

@@ -31,6 +31,9 @@ body
   .sk-spinner
   .sk-spinner
     margin-top: 30vh
     margin-top: 30vh
 
 
+  > .wrapper
+    margin-top: 25px
+
 #modal
 #modal
   position: absolute
   position: absolute
   top: 0
   top: 0

+ 17 - 5
client/config/router.js

@@ -13,7 +13,10 @@ FlowRouter.route('/', {
     Filter.reset();
     Filter.reset();
     EscapeActions.executeAll();
     EscapeActions.executeAll();
 
 
-    BlazeLayout.render('defaultLayout', { content: 'boardList' });
+    BlazeLayout.render('defaultLayout', {
+      headerBar: 'boardListHeaderBar',
+      content: 'boardList',
+    });
   },
   },
 });
 });
 
 
@@ -33,7 +36,10 @@ FlowRouter.route('/b/:id/:slug', {
       EscapeActions.executeUpTo('popup-close');
       EscapeActions.executeUpTo('popup-close');
     }
     }
 
 
-    BlazeLayout.render('defaultLayout', { content: 'board' });
+    BlazeLayout.render('defaultLayout', {
+      headerBar: 'boardHeaderBar',
+      content: 'board',
+    });
   },
   },
 });
 });
 
 
@@ -45,7 +51,10 @@ FlowRouter.route('/b/:boardId/:slug/:cardId', {
     Session.set('currentBoard', params.boardId);
     Session.set('currentBoard', params.boardId);
     Session.set('currentCard', params.cardId);
     Session.set('currentCard', params.cardId);
 
 
-    BlazeLayout.render('defaultLayout', { content: 'board' });
+    BlazeLayout.render('defaultLayout', {
+      headerBar: 'boardHeaderBar',
+      content: 'board',
+    });
   },
   },
 });
 });
 
 
@@ -58,11 +67,14 @@ FlowRouter.route('/shortcuts', {
 
 
     if (previousPath) {
     if (previousPath) {
       Modal.open(shortcutsTemplate, {
       Modal.open(shortcutsTemplate, {
+        header: 'shortcutsModalTitle',
         onCloseGoTo: previousPath,
         onCloseGoTo: previousPath,
       });
       });
     } else {
     } else {
-      // XXX There is currently no way to escape this page on Sandstorm
-      BlazeLayout.render('defaultLayout', { content: shortcutsTemplate });
+      BlazeLayout.render('defaultLayout', {
+        headerBar: 'shortcutsHeaderBar',
+        content: shortcutsTemplate,
+      });
     }
     }
   },
   },
 });
 });

+ 9 - 3
client/lib/modal.js

@@ -6,8 +6,14 @@ window.Modal = new class {
     this._onCloseGoTo = '';
     this._onCloseGoTo = '';
   }
   }
 
 
+  getHeaderName() {
+    const currentModal = this._currentModal.get();
+    return currentModal && currentModal.header;
+  }
+
   getTemplateName() {
   getTemplateName() {
-    return this._currentModal.get();
+    const currentModal = this._currentModal.get();
+    return currentModal && currentModal.modalName;
   }
   }
 
 
   isOpen() {
   isOpen() {
@@ -21,8 +27,8 @@ window.Modal = new class {
     }
     }
   }
   }
 
 
-  open(modalName, { onCloseGoTo = ''} = {}) {
-    this._currentModal.set(modalName);
+  open(modalName, { header = '', onCloseGoTo = ''} = {}) {
+    this._currentModal.set({ header, modalName });
     this._onCloseGoTo = onCloseGoTo;
     this._onCloseGoTo = onCloseGoTo;
   }
   }
 };
 };

+ 29 - 17
sandstorm.js

@@ -3,24 +3,24 @@
 const isSandstorm = Meteor.settings && Meteor.settings.public &&
 const isSandstorm = Meteor.settings && Meteor.settings.public &&
                     Meteor.settings.public.sandstorm;
                     Meteor.settings.public.sandstorm;
 
 
-if (isSandstorm && Meteor.isServer) {
-  // In sandstorm we only have one board per sandstorm instance. Since we want
-  // to keep most of our code unchanged, we simply hard-code a board `_id` and
-  // redirect the user to this particular board.
-  const sandstormBoard = {
-    _id: 'sandstorm',
-
-    // XXX Should be shared with the grain instance name.
-    title: 'Wekan',
-    slug: 'libreboard',
-    members: [],
-
-    // Board access security is handled by sandstorm, so in our point of view we
-    // can alway assume that the board is public (unauthorized users won't be
-    // able to access it anyway).
-    permission: 'public',
-  };
+// In sandstorm we only have one board per sandstorm instance. Since we want to
+// keep most of our code unchanged, we simply hard-code a board `_id` and
+// redirect the user to this particular board.
+const sandstormBoard = {
+  _id: 'sandstorm',
+
+  // XXX Should be shared with the grain instance name.
+  title: 'Wekan',
+  slug: 'libreboard',
+  members: [],
+
+  // Board access security is handled by sandstorm, so in our point of view we
+  // can alway assume that the board is public (unauthorized users won't be able
+  // to access it anyway).
+  permission: 'public',
+};
 
 
+if (isSandstorm && Meteor.isServer) {
   function updateUserPermissions(userId, permissions) {
   function updateUserPermissions(userId, permissions) {
     const isActive = permissions.indexOf('participate') > -1;
     const isActive = permissions.indexOf('participate') > -1;
     const isAdmin = permissions.indexOf('configure') > -1;
     const isAdmin = permissions.indexOf('configure') > -1;
@@ -142,6 +142,18 @@ if (isSandstorm && Meteor.isClient) {
     updateSandstormMetaData({ setTitle: DocHead.getTitle() });
     updateSandstormMetaData({ setTitle: DocHead.getTitle() });
   });
   });
 
 
+  // Runtime redirection from the home page to the unique board -- since the
+  // home page contains a list of a single board it's not worth to display.
+  //
+  // XXX Hack. The home route is already defined at this point so we need to
+  // add the redirection trigger to the internal route object.
+  FlowRouter._routesMap.home._triggersEnter.push((context, redirect) => {
+    redirect(FlowRouter.path('board', {
+      id: sandstormBoard._id,
+      slug: sandstormBoard.slug,
+    }));
+  });
+
   // XXX Hack. `Meteor.absoluteUrl` doesn't work in Sandstorm, since every
   // XXX Hack. `Meteor.absoluteUrl` doesn't work in Sandstorm, since every
   // session has a different URL whereas Meteor computes absoluteUrl based on
   // session has a different URL whereas Meteor computes absoluteUrl based on
   // the ROOT_URL environment variable. So we overwrite this function on a
   // the ROOT_URL environment variable. So we overwrite this function on a