Add the following new Sandstorm features and fixes:

- All Boards page [so it's possible to go back from subtask board](https://github.com/wekan/wekan/issues/2082)
- Board favorites
- New Sandstorm board first user is Admin and [has IFTTT Rules](https://github.com/wekan/wekan/issues/2125)
  and Standalone Wekan Admin Panel. Probably some Admin Panel features do not work yet. Please keep backup of your grains before testig Admin Panel.
- Linked Cards and Linked Boards.
- Some not needed options like Logout etc have been hidden from top bar right menu.
- [Import board now works. "Board not found" is not problem anymore](https://github.com/wekan/wekan/issues/1430), because you can go to All Boards page to change to imported board.

and removes the following features:

- Remove Welcome Board from Standalone Wekan, [to fix Welcome board not translated](https://github.com/wekan/wekan/issues/1601).
  Sandstorm Wekan does not have Welcome Board.

Thanks to xet7 !

Closes #2125,
closes #2082,
closes #1430,
closes #1601,
related #2205,
related #2070,
related #1695,
related #1192.
This commit is contained in:
Lauri Ojansivu 2019-02-27 16:14:14 +02:00
parent 55ad98ecc4
commit 34d8235551
10 changed files with 151 additions and 160 deletions

View file

@ -7,71 +7,69 @@ template(name="boardHeaderBar")
.board-header-btns.left .board-header-btns.left
unless isMiniScreen unless isMiniScreen
unless isSandstorm if currentBoard
if currentBoard if currentUser
if currentUser a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}"
a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}" title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}")
title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}") i.fa(class="fa-star{{#unless isStarred}}-o{{/unless}}")
i.fa(class="fa-star{{#unless isStarred}}-o{{/unless}}") if showStarCounter
if showStarCounter span
span = currentBoard.stars
= currentBoard.stars
a.board-header-btn( a.board-header-btn(
class="{{#if currentUser.isBoardAdmin}}js-change-visibility{{else}}is-disabled{{/if}}" class="{{#if currentUser.isBoardAdmin}}js-change-visibility{{else}}is-disabled{{/if}}"
title="{{_ currentBoard.permission}}") title="{{_ currentBoard.permission}}")
i.fa(class="{{#if currentBoard.isPublic}}fa-globe{{else}}fa-lock{{/if}}") i.fa(class="{{#if currentBoard.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
span {{_ currentBoard.permission}} span {{_ currentBoard.permission}}
a.board-header-btn.js-watch-board( a.board-header-btn.js-watch-board(
title="{{_ watchLevel }}") title="{{_ watchLevel }}")
if $eq watchLevel "watching" if $eq watchLevel "watching"
i.fa.fa-eye i.fa.fa-eye
if $eq watchLevel "tracking" if $eq watchLevel "tracking"
i.fa.fa-bell i.fa.fa-bell
if $eq watchLevel "muted" if $eq watchLevel "muted"
i.fa.fa-bell-slash i.fa.fa-bell-slash
span {{_ watchLevel}} span {{_ watchLevel}}
else else
a.board-header-btn.js-log-in( a.board-header-btn.js-log-in(
title="{{_ 'log-in'}}") title="{{_ 'log-in'}}")
i.fa.fa-sign-in i.fa.fa-sign-in
span {{_ 'log-in'}} span {{_ 'log-in'}}
.board-header-btns.right .board-header-btns.right
if currentBoard if currentBoard
if isMiniScreen if isMiniScreen
unless isSandstorm if currentUser
if currentUser a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}"
a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}" title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}")
title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}") i.fa(class="fa-star{{#unless isStarred}}-o{{/unless}}")
i.fa(class="fa-star{{#unless isStarred}}-o{{/unless}}") if showStarCounter
if showStarCounter span
span = currentBoard.stars
= currentBoard.stars
a.board-header-btn( a.board-header-btn(
class="{{#if currentUser.isBoardAdmin}}js-change-visibility{{else}}is-disabled{{/if}}" class="{{#if currentUser.isBoardAdmin}}js-change-visibility{{else}}is-disabled{{/if}}"
title="{{_ currentBoard.permission}}") title="{{_ currentBoard.permission}}")
i.fa(class="{{#if currentBoard.isPublic}}fa-globe{{else}}fa-lock{{/if}}") i.fa(class="{{#if currentBoard.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
span {{_ currentBoard.permission}} span {{_ currentBoard.permission}}
a.board-header-btn.js-watch-board( a.board-header-btn.js-watch-board(
title="{{_ watchLevel }}") title="{{_ watchLevel }}")
if $eq watchLevel "watching" if $eq watchLevel "watching"
i.fa.fa-eye i.fa.fa-eye
if $eq watchLevel "tracking" if $eq watchLevel "tracking"
i.fa.fa-bell i.fa.fa-bell
if $eq watchLevel "muted" if $eq watchLevel "muted"
i.fa.fa-bell-slash i.fa.fa-bell-slash
span {{_ watchLevel}} span {{_ watchLevel}}
else else
a.board-header-btn.js-log-in( a.board-header-btn.js-log-in(
title="{{_ 'log-in'}}") title="{{_ 'log-in'}}")
i.fa.fa-sign-in i.fa.fa-sign-in
span {{_ 'log-in'}} span {{_ 'log-in'}}
if isSandstorm if isSandstorm
if currentUser if currentUser
@ -143,6 +141,8 @@ template(name="boardMenuPopup")
ul.pop-over-list ul.pop-over-list
li: a(href="{{exportUrl}}", download="{{exportFilename}}") {{_ 'export-board'}} li: a(href="{{exportUrl}}", download="{{exportFilename}}") {{_ 'export-board'}}
li: a.js-import-board {{_ 'import-board-c'}} li: a.js-import-board {{_ 'import-board-c'}}
li: a.js-archive-board {{_ 'archive-board'}}
li: a.js-outgoing-webhooks {{_ 'outgoing-webhooks'}}
hr hr
ul.pop-over-list ul.pop-over-list
li: a.js-subtask-settings {{_ 'subtask-settings'}} li: a.js-subtask-settings {{_ 'subtask-settings'}}

View file

@ -19,16 +19,14 @@ template(name="cardDetails")
a.js-parent-card(href=linkForCard) {{title}} a.js-parent-card(href=linkForCard) {{title}}
// else // else
{{_ 'top-level-card'}} {{_ 'top-level-card'}}
unless isSandstorm if isLinkedCard
if isLinkedCard h3.linked-card-location
h3.linked-card-location +viewer
+viewer | {{getBoardTitle}} > {{getTitle}}
| {{getBoardTitle}} > {{getTitle}}
if getArchived if getArchived
if isLinkedBoard if isLinkedBoard
unless isSandstorm p.warning {{_ 'board-archived'}}
p.warning {{_ 'board-archived'}}
else else
p.warning {{_ 'card-archived'}} p.warning {{_ 'card-archived'}}
@ -192,11 +190,9 @@ template(name="cardDetails")
unless currentUser.isNoComments unless currentUser.isNoComments
if isLoaded.get if isLoaded.get
if isLinkedCard if isLinkedCard
unless isSandstorm +activities(card=this mode="linkedcard")
+activities(card=this mode="linkedcard")
else if isLinkedBoard else if isLinkedBoard
unless isSandstorm +activities(card=this mode="linkedboard")
+activities(card=this mode="linkedboard")
else else
+activities(card=this mode="card") +activities(card=this mode="card")

View file

@ -44,14 +44,13 @@ template(name="addCardForm")
.add-controls.clearfix .add-controls.clearfix
button.primary.confirm(type="submit") {{_ 'add'}} button.primary.confirm(type="submit") {{_ 'add'}}
unless isSandstorm span.quiet
span.quiet | {{_ 'or'}}
| {{_ 'or'}} a.js-link {{_ 'link'}}
a.js-link {{_ 'link'}} span.quiet
span.quiet |  
|   | /
| / a.js-search {{_ 'search'}}
a.js-search {{_ 'search'}}
template(name="autocompleteLabelLine") template(name="autocompleteLabelLine")
.minicard-label(class="card-label-{{colorName}}" title=labelName) .minicard-label(class="card-label-{{colorName}}" title=labelName)
@ -84,8 +83,7 @@ template(name="linkCardPopup")
option(value="{{getId}}") {{getTitle}} option(value="{{getId}}") {{getTitle}}
.edit-controls.clearfix .edit-controls.clearfix
unless isSandstorm input.primary.confirm.js-done(type="button" value="{{_ 'link'}}")
input.primary.confirm.js-done(type="button" value="{{_ 'link'}}")
template(name="searchCardPopup") template(name="searchCardPopup")
label {{_ 'boards'}}: label {{_ 'boards'}}:

View file

@ -4,39 +4,38 @@ template(name="header")
list all starred boards with a link to go there. This is inspired by the list all starred boards with a link to go there. This is inspired by the
Reddit "subreddit" bar. Reddit "subreddit" bar.
The first link goes to the boards page. The first link goes to the boards page.
unless isSandstorm if currentUser
if currentUser #header-quick-access(class=currentBoard.colorClass)
#header-quick-access(class=currentBoard.colorClass) if isMiniScreen
if isMiniScreen ul
ul li
li a(href="{{pathFor 'home'}}")
a(href="{{pathFor 'home'}}") span.fa.fa-home
span.fa.fa-home
if currentList if currentList
each currentBoard.lists each currentBoard.lists
li(class="{{#if $.Session.equals 'currentList' _id}}current{{/if}}") li(class="{{#if $.Session.equals 'currentList' _id}}current{{/if}}")
a.js-select-list a.js-select-list
= title
#header-new-board-icon
else
ul
li
a(href="{{pathFor 'home'}}")
span.fa.fa-home
| {{_ 'all-boards'}}
each currentUser.starredBoards
li.separator -
li(class="{{#if $.Session.equals 'currentBoard' _id}}current{{/if}}")
a(href="{{pathFor 'board' id=_id slug=slug}}")
= title = title
else #header-new-board-icon
li.current {{_ 'quick-access-description'}} else
ul
li
a(href="{{pathFor 'home'}}")
span.fa.fa-home
| {{_ 'all-boards'}}
each currentUser.starredBoards
li.separator -
li(class="{{#if $.Session.equals 'currentBoard' _id}}current{{/if}}")
a(href="{{pathFor 'board' id=_id slug=slug}}")
= title
else
li.current {{_ 'quick-access-description'}}
a#header-new-board-icon.js-create-board a#header-new-board-icon.js-create-board
i.fa.fa-plus(title="Create a new board") i.fa.fa-plus(title="Create a new board")
+headerUserBar +headerUserBar
#header(class=currentBoard.colorClass) #header(class=currentBoard.colorClass)
//- //-
@ -52,13 +51,9 @@ template(name="header")
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
page/document on it, and we don't want to see the home page containing page/document on it, and we don't want to see the home page containing
the list of all boards. the list of all boards.
if isSandstorm unless currentSetting.hideLogo
.wekan-logo 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")
else
unless currentSetting.hideLogo
a.wekan-logo(href="{{pathFor 'home'}}" title="{{_ 'header-logo-title'}}")
img(src="{{pathFor '/wekan-logo-header.png'}}" alt="Wekan")
if appIsOffline if appIsOffline
+offlineWarning +offlineWarning

View file

@ -14,13 +14,13 @@ head
template(name="userFormsLayout") template(name="userFormsLayout")
section.auth-layout section.auth-layout
unless currentSetting.hideLogo
h1.at-form-landing-logo
img(src="{{pathFor '/wekan-logo.png'}}" alt="Wekan")
if currentSetting.hideLogo if currentSetting.hideLogo
h1 h1
br br
br br
else
h1.at-form-landing-logo
img(src="{{pathFor '/wekan-logo.png'}}" alt="Wekan")
section.auth-dialog section.auth-dialog
+Template.dynamic(template=content) +Template.dynamic(template=content)
if currentSetting.displayAuthenticationMethod if currentSetting.displayAuthenticationMethod

View file

@ -4,22 +4,21 @@ template(name="settingHeaderBar")
.setting-header-btns.left .setting-header-btns.left
unless isMiniScreen unless isMiniScreen
unless isSandstorm if currentUser
if currentUser a.setting-header-btn.settings(href="{{pathFor 'setting'}}")
a.setting-header-btn.settings(href="{{pathFor 'setting'}}") i.fa(class="fa-cog")
i.fa(class="fa-cog") span {{_ 'settings'}}
span {{_ 'settings'}}
a.setting-header-btn.people(href="{{pathFor 'people'}}") a.setting-header-btn.people(href="{{pathFor 'people'}}")
i.fa(class="fa-users") i.fa(class="fa-users")
span {{_ 'people'}} span {{_ 'people'}}
a.setting-header-btn.informations(href="{{pathFor 'information'}}") a.setting-header-btn.informations(href="{{pathFor 'information'}}")
i.fa(class="fa-info-circle") i.fa(class="fa-info-circle")
span {{_ 'info'}} span {{_ 'info'}}
else else
a.setting-header-btn.js-log-in( a.setting-header-btn.js-log-in(
title="{{_ 'log-in'}}") title="{{_ 'log-in'}}")
i.fa.fa-sign-in i.fa.fa-sign-in
span {{_ 'log-in'}} span {{_ 'log-in'}}

View file

@ -83,17 +83,16 @@ template(name="memberPopup")
ul.pop-over-list ul.pop-over-list
li li
a.js-filter-member {{_ 'filter-cards'}} a.js-filter-member {{_ 'filter-cards'}}
unless isSandstorm if currentUser.isBoardAdmin
if currentUser.isBoardAdmin
li
a.js-change-role
| {{_ 'change-permissions'}}
span.quiet (#{memberType})
li li
if $eq currentUser._id userId a.js-change-role
a.js-leave-member {{_ 'leave-board'}} | {{_ 'change-permissions'}}
else if currentUser.isBoardAdmin span.quiet (#{memberType})
a.js-remove-member {{_ 'remove-from-board'}} li
if $eq currentUser._id userId
a.js-leave-member {{_ 'leave-board'}}
else if currentUser.isBoardAdmin
a.js-remove-member {{_ 'remove-from-board'}}
template(name="removeMemberPopup") template(name="removeMemberPopup")

View file

@ -4,10 +4,11 @@ template(name="headerUserBar")
.header-user-bar-avatar .header-user-bar-avatar
+userAvatar(userId=currentUser._id) +userAvatar(userId=currentUser._id)
unless isMiniScreen unless isMiniScreen
if currentUser.profile.fullname unless isSandstorm
= currentUser.profile.fullname if currentUser.profile.fullname
else = currentUser.profile.fullname
= currentUser.username else
= currentUser.username
template(name="memberMenuPopup") template(name="memberMenuPopup")
ul.pop-over-list ul.pop-over-list
@ -15,13 +16,15 @@ template(name="memberMenuPopup")
li: a.js-edit-profile {{_ 'edit-profile'}} li: a.js-edit-profile {{_ 'edit-profile'}}
li: a.js-change-settings {{_ 'change-settings'}} li: a.js-change-settings {{_ 'change-settings'}}
li: a.js-change-avatar {{_ 'edit-avatar'}} li: a.js-change-avatar {{_ 'edit-avatar'}}
li: a.js-change-password {{_ 'changePasswordPopup-title'}} unless isSandstorm
li: a.js-change-language {{_ 'changeLanguagePopup-title'}} li: a.js-change-password {{_ 'changePasswordPopup-title'}}
li: a.js-change-language {{_ 'changeLanguagePopup-title'}}
if currentUser.isAdmin if currentUser.isAdmin
li: a.js-go-setting(href="{{pathFor 'setting'}}") {{_ 'admin-panel'}} li: a.js-go-setting(href="{{pathFor 'setting'}}") {{_ 'admin-panel'}}
hr unless isSandstorm
ul.pop-over-list hr
li: a.js-logout {{_ 'log-out'}} ul.pop-over-list
li: a.js-logout {{_ 'log-out'}}
template(name="editProfilePopup") template(name="editProfilePopup")
form form

View file

@ -559,7 +559,7 @@ if (Meteor.isServer) {
}); });
Accounts.onCreateUser((options, user) => { Accounts.onCreateUser((options, user) => {
const userCount = Users.find().count(); const userCount = Users.find().count();
if (!isSandstorm && userCount === 0) { if (userCount === 0) {
user.isAdmin = true; user.isAdmin = true;
return user; return user;
} }
@ -675,7 +675,7 @@ if (Meteor.isServer) {
CollectionHooks.getUserId = () => { CollectionHooks.getUserId = () => {
return fakeUserId.get() || getUserId(); return fakeUserId.get() || getUserId();
}; };
/*
if (!isSandstorm) { if (!isSandstorm) {
Users.after.insert((userId, doc) => { Users.after.insert((userId, doc) => {
const fakeUser = { const fakeUser = {
@ -704,6 +704,7 @@ if (Meteor.isServer) {
}); });
}); });
} }
*/
Users.after.insert((userId, doc) => { Users.after.insert((userId, doc) => {

View file

@ -435,12 +435,12 @@ if (isSandstorm && Meteor.isClient) {
// //
// XXX Hack. The home route is already defined at this point so we need to // XXX Hack. The home route is already defined at this point so we need to
// add the redirection trigger to the internal route object. // add the redirection trigger to the internal route object.
FlowRouter._routesMap.home._triggersEnter.push((context, redirect) => { //FlowRouter._routesMap.home._triggersEnter.push((context, redirect) => {
redirect(FlowRouter.path('board', { // redirect(FlowRouter.path('board', {
id: sandstormBoard._id, // id: sandstormBoard._id,
slug: sandstormBoard.slug, // 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
@ -457,9 +457,9 @@ if (isSandstorm && Meteor.isClient) {
// XXX Hack to fix https://github.com/wefork/wekan/issues/27 // XXX Hack to fix https://github.com/wefork/wekan/issues/27
// Sandstorm Wekan instances only ever have a single board, so there is no need // Sandstorm Wekan instances only ever have a single board, so there is no need
// to cache per-board subscriptions. // to cache per-board subscriptions.
SubsManager.prototype.subscribe = function(...params) { //SubsManager.prototype.subscribe = function(...params) {
return Meteor.subscribe(...params); // return Meteor.subscribe(...params);
}; //};
} }
// We use this blaze helper in the UI to hide some templates that does not make // We use this blaze helper in the UI to hide some templates that does not make