From cdef8a33e4df1caf9c8796ded4d946a76acb28a0 Mon Sep 17 00:00:00 2001 From: guillaume Date: Fri, 26 Apr 2019 17:53:48 +0200 Subject: [PATCH 1/6] Delete user feature --- client/components/settings/peopleBody.jade | 5 +++- client/components/settings/peopleBody.js | 9 +++++++ client/components/settings/peopleBody.styl | 12 ++++++++++ client/components/users/userHeader.jade | 5 +++- client/components/users/userHeader.js | 5 ++++ models/users.js | 28 ++++++++++++++++++++++ 6 files changed, 62 insertions(+), 2 deletions(-) diff --git a/client/components/settings/peopleBody.jade b/client/components/settings/peopleBody.jade index 4dca5cb19..15deb005d 100644 --- a/client/components/settings/peopleBody.jade +++ b/client/components/settings/peopleBody.jade @@ -107,5 +107,8 @@ template(name="editUserPopup") label | {{_ 'password'}} input.js-profile-password(type="password") + div.buttonsContainer + input.primary.wide(type="submit" value="{{_ 'save'}}") + div + input#deleteButton.primary.wide(type="button" value="{{_ 'delete'}}") - input.primary.wide(type="submit" value="{{_ 'save'}}") diff --git a/client/components/settings/peopleBody.js b/client/components/settings/peopleBody.js index 3ec96bb00..83cf14fa5 100644 --- a/client/components/settings/peopleBody.js +++ b/client/components/settings/peopleBody.js @@ -98,6 +98,7 @@ Template.peopleRow.helpers({ Template.editUserPopup.onCreated(function() { this.authenticationMethods = new ReactiveVar([]); + this.errorMessage = new ReactiveVar(''); Meteor.call('getAuthenticationsEnabled', (_, result) => { if (result) { @@ -129,6 +130,9 @@ Template.editUserPopup.helpers({ const selected = Users.findOne(userId).authenticationMethod; return selected === 'ldap'; }, + errorMessage() { + return Template.instance().errorMessage.get(); + }, }); BlazeComponent.extendComponent({ @@ -220,4 +224,9 @@ Template.editUserPopup.events({ }); } else Popup.close(); }, + + 'click #deleteButton'() { + Users.remove(this.userId); + Popup.close(); + }, }); diff --git a/client/components/settings/peopleBody.styl b/client/components/settings/peopleBody.styl index b98c53409..803876113 100644 --- a/client/components/settings/peopleBody.styl +++ b/client/components/settings/peopleBody.styl @@ -34,3 +34,15 @@ table button min-width: 60px; + +.content-wrapper + margin-top: 10px + +.buttonsContainer + display: flex + + input + margin: 0 + + div + margin: auto diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade index c55b65c28..2a3d04cc5 100644 --- a/client/components/users/userHeader.jade +++ b/client/components/users/userHeader.jade @@ -53,7 +53,10 @@ template(name="editProfilePopup") input.js-profile-email(type="email" value="{{emails.[0].address}}") else input.js-profile-email(type="email" value="{{emails.[0].address}}" readonly) - input.primary.wide(type="submit" value="{{_ 'save'}}") + div.buttonsContainer + input.primary.wide(type="submit" value="{{_ 'save'}}") + div + input#deleteButton.primary.wide(type="button" value="{{_ 'delete'}}") template(name="changePasswordPopup") +atForm(state='changePwd') diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 6a2397a4b..869c9d150 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -95,6 +95,11 @@ Template.editProfilePopup.events({ }); } else Popup.back(); }, + 'click #deleteButton'() { + Users.remove(Meteor.userId()); + Popup.close(); + AccountsTemplates.logout(); + }, }); // XXX For some reason the useraccounts autofocus isnt working in this case. diff --git a/models/users.js b/models/users.js index 0dd9c1d67..c2687e35a 100644 --- a/models/users.js +++ b/models/users.js @@ -238,6 +238,19 @@ Users.allow({ const user = Users.findOne(userId); return user && Meteor.user().isAdmin; }, + remove(userId, doc) { + const adminsNumber = Users.find({ isAdmin: true }).count(); + const { isAdmin } = Users.findOne({ _id: userId }, { fields: { 'isAdmin': 1 } }); + + // Prevents remove of the only one administrator + if (adminsNumber === 1 && isAdmin && userId === doc._id) { + return false; + } + + // If it's the user or an admin + return userId === doc._id || isAdmin; + }, + fetch: [], }); // Search a user in the complete server database by its name or username. This @@ -364,6 +377,10 @@ Users.helpers({ getTemplatesBoardSlug() { return Boards.findOne(this.profile.templatesBoardId).slug; }, + + remove() { + User.remove({ _id: this._id}); + }, }); Users.mutations({ @@ -673,6 +690,17 @@ if (Meteor.isServer) { }, {unique: true}); }); + Users.before.remove((userId, doc) => { + Boards + .find({members: {$elemMatch: {userId: doc._id, isAdmin: true}}}) + .forEach((board) => { + // If only one admin for the board + if (board.members.filter((e) => e.isAdmin).length === 1) { + Boards.remove(board._id); + } + }); + }); + // Each board document contains the de-normalized number of users that have // starred it. If the user star or unstar a board, we need to update this // counter. From 64ee60a008c929dcf63ac5d2c49f7f189508a757 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 9 May 2019 14:32:38 +0300 Subject: [PATCH 2/6] Fix missing profile checks. Thanks to justinr1234 ! --- client/components/boards/boardBody.jade | 2 ++ client/components/boards/boardBody.js | 8 ++++---- client/components/boards/boardHeader.jade | 2 +- client/components/boards/boardHeader.js | 8 +++++--- client/components/lists/list.js | 4 ++-- client/components/lists/listBody.js | 18 +++++++++--------- client/components/lists/listHeader.js | 2 +- client/components/swimlanes/swimlanes.js | 2 +- client/lib/escapeActions.js | 2 +- models/export.js | 2 +- models/swimlanes.js | 6 +++--- models/users.js | 18 +++++++++--------- server/publications/boards.js | 2 +- server/publications/fast-render.js | 2 ++ 14 files changed, 42 insertions(+), 36 deletions(-) diff --git a/client/components/boards/boardBody.jade b/client/components/boards/boardBody.jade index 32f8629f3..017d0b0a9 100644 --- a/client/components/boards/boardBody.jade +++ b/client/components/boards/boardBody.jade @@ -30,6 +30,8 @@ template(name="boardBody") +listsGroup(currentBoard) else if isViewCalendar +calendarView + else + +listsGroup(currentBoard) template(name="calendarView") if isViewCalendar diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js index 9105e6245..301c0742a 100644 --- a/client/components/boards/boardBody.js +++ b/client/components/boards/boardBody.js @@ -191,19 +191,19 @@ BlazeComponent.extendComponent({ isViewSwimlanes() { const currentUser = Meteor.user(); if (!currentUser) return false; - return (currentUser.profile.boardView === 'board-view-swimlanes'); + return ((currentUser.profile || {}).boardView === 'board-view-swimlanes'); }, isViewLists() { const currentUser = Meteor.user(); if (!currentUser) return true; - return (currentUser.profile.boardView === 'board-view-lists'); + return ((currentUser.profile || {}).boardView === 'board-view-lists'); }, isViewCalendar() { const currentUser = Meteor.user(); if (!currentUser) return false; - return (currentUser.profile.boardView === 'board-view-cal'); + return ((currentUser.profile || {}).boardView === 'board-view-cal'); }, openNewListForm() { @@ -335,6 +335,6 @@ BlazeComponent.extendComponent({ isViewCalendar() { const currentUser = Meteor.user(); if (!currentUser) return false; - return (currentUser.profile.boardView === 'board-view-cal'); + return ((currentUser.profile || {}).boardView === 'board-view-cal'); }, }).register('calendarView'); diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade index 98fe20158..8bc619753 100644 --- a/client/components/boards/boardHeader.jade +++ b/client/components/boards/boardHeader.jade @@ -98,7 +98,7 @@ template(name="boardHeaderBar") a.board-header-btn.js-toggle-board-view( title="{{_ 'board-view'}}") i.fa.fa-th-large - span {{_ currentUser.profile.boardView}} + span {{#if currentUser.profile.boardView}}{{_ currentUser.profile.boardView}}{{else}}{{_ 'board-view-lists'}}{{/if}} if canModifyBoard a.board-header-btn.js-multiselection-activate( diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index 86fbebb3b..f2b5c4f52 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -89,12 +89,14 @@ BlazeComponent.extendComponent({ }, 'click .js-toggle-board-view'() { const currentUser = Meteor.user(); - if (currentUser.profile.boardView === 'board-view-swimlanes') { + if ((currentUser.profile || {}).boardView === 'board-view-swimlanes') { currentUser.setBoardView('board-view-cal'); - } else if (currentUser.profile.boardView === 'board-view-lists') { + } else if ((currentUser.profile || {}).boardView === 'board-view-lists') { currentUser.setBoardView('board-view-swimlanes'); - } else if (currentUser.profile.boardView === 'board-view-cal') { + } else if ((currentUser.profile || {}).boardView === 'board-view-cal') { currentUser.setBoardView('board-view-lists'); + } else { + currentUser.setBoardView('board-view-swimlanes'); } }, 'click .js-toggle-sidebar'() { diff --git a/client/components/lists/list.js b/client/components/lists/list.js index 12932a825..ea0068ebb 100644 --- a/client/components/lists/list.js +++ b/client/components/lists/list.js @@ -69,10 +69,10 @@ BlazeComponent.extendComponent({ const listId = Blaze.getData(ui.item.parents('.list').get(0))._id; const currentBoard = Boards.findOne(Session.get('currentBoard')); let swimlaneId = ''; - const boardView = Meteor.user().profile.boardView; + const boardView = (Meteor.user().profile || {}).boardView; if (boardView === 'board-view-swimlanes' || currentBoard.isTemplatesBoard()) swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id; - else if ((boardView === 'board-view-lists') || (boardView === 'board-view-cal')) + else if ((boardView === 'board-view-lists') || (boardView === 'board-view-cal') || !boardView) swimlaneId = currentBoard.getDefaultSwimline()._id; // Normally the jquery-ui sortable library moves the dragged DOM element diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index 43619890d..a5ccba3fb 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -48,7 +48,7 @@ BlazeComponent.extendComponent({ const board = this.data().board(); let linkedId = ''; let swimlaneId = ''; - const boardView = Meteor.user().profile.boardView; + const boardView = (Meteor.user().profile || {}).boardView; let cardType = 'cardType-card'; if (title) { if (board.isTemplatesBoard()) { @@ -72,7 +72,7 @@ BlazeComponent.extendComponent({ } } else if (boardView === 'board-view-swimlanes') swimlaneId = this.parentComponent().parentComponent().data()._id; - else if ((boardView === 'board-view-lists') || (boardView === 'board-view-cal')) + else if ((boardView === 'board-view-lists') || (boardView === 'board-view-cal') || !boardView) swimlaneId = board.getDefaultSwimline()._id; const _id = Cards.insert({ @@ -149,7 +149,7 @@ BlazeComponent.extendComponent({ idOrNull(swimlaneId) { const currentUser = Meteor.user(); - if (currentUser.profile.boardView === 'board-view-swimlanes' || + if ((currentUser.profile || {}).boardView === 'board-view-swimlanes' || this.data().board().isTemplatesBoard()) return swimlaneId; return undefined; @@ -356,10 +356,10 @@ BlazeComponent.extendComponent({ // Swimlane where to insert card const swimlane = $(Popup._getTopStack().openerElement).closest('.js-swimlane'); this.swimlaneId = ''; - const boardView = Meteor.user().profile.boardView; + const boardView = (Meteor.user().profile || {}).boardView; if (boardView === 'board-view-swimlanes') this.swimlaneId = Blaze.getData(swimlane[0])._id; - else if (boardView === 'board-view-lists') + else if (boardView === 'board-view-lists' || !boardView) this.swimlaneId = Swimlanes.findOne({boardId: this.boardId})._id; }, @@ -485,13 +485,13 @@ BlazeComponent.extendComponent({ this.isBoardTemplateSearch; let board = {}; if (this.isTemplateSearch) { - board = Boards.findOne(Meteor.user().profile.templatesBoardId); + board = Boards.findOne((Meteor.user().profile || {}).templatesBoardId); } else { // Prefetch first non-current board id board = Boards.findOne({ archived: false, 'members.userId': Meteor.userId(), - _id: {$nin: [Session.get('currentBoard'), Meteor.user().profile.templatesBoardId]}, + _id: {$nin: [Session.get('currentBoard'), (Meteor.user().profile || {}).templatesBoardId]}, }); } if (!board) { @@ -510,7 +510,7 @@ BlazeComponent.extendComponent({ this.swimlaneId = ''; // Swimlane where to insert card const swimlane = $(Popup._getTopStack().openerElement).parents('.js-swimlane'); - if (Meteor.user().profile.boardView === 'board-view-swimlanes') + if ((Meteor.user().profile || {}).boardView === 'board-view-swimlanes') this.swimlaneId = Blaze.getData(swimlane[0])._id; else this.swimlaneId = Swimlanes.findOne({boardId: this.boardId})._id; @@ -620,7 +620,7 @@ BlazeComponent.extendComponent({ this.listId = this.parentComponent().data()._id; this.swimlaneId = ''; - const boardView = Meteor.user().profile.boardView; + const boardView = (Meteor.user().profile || {}).boardView; if (boardView === 'board-view-swimlanes') this.swimlaneId = this.parentComponent().parentComponent().parentComponent().data()._id; }, diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index 25e6cb691..923d60633 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -30,7 +30,7 @@ BlazeComponent.extendComponent({ cardsCount() { const list = Template.currentData(); let swimlaneId = ''; - const boardView = Meteor.user().profile.boardView; + const boardView = (Meteor.user().profile || {}).boardView; if (boardView === 'board-view-swimlanes') swimlaneId = this.parentComponent().parentComponent().data()._id; diff --git a/client/components/swimlanes/swimlanes.js b/client/components/swimlanes/swimlanes.js index 519b00d2e..d0ec3f4a2 100644 --- a/client/components/swimlanes/swimlanes.js +++ b/client/components/swimlanes/swimlanes.js @@ -8,7 +8,7 @@ function currentListIsInThisSwimlane(swimlaneId) { function currentCardIsInThisList(listId, swimlaneId) { const currentCard = Cards.findOne(Session.get('currentCard')); const currentUser = Meteor.user(); - if (currentUser && currentUser.profile.boardView === 'board-view-swimlanes') + if (currentUser && currentUser.profile && currentUser.profile.boardView === 'board-view-swimlanes') return currentCard && currentCard.listId === listId && currentCard.swimlaneId === swimlaneId; else // Default view: board-view-lists return currentCard && currentCard.listId === listId; diff --git a/client/lib/escapeActions.js b/client/lib/escapeActions.js index 666e33e09..0757ae460 100644 --- a/client/lib/escapeActions.js +++ b/client/lib/escapeActions.js @@ -135,6 +135,6 @@ $(document).on('click', (evt) => { } }); -$(document).on('click', 'a[href=#]', (evt) => { +$(document).on('click', 'a[href=\\#]', (evt) => { evt.preventDefault(); }); diff --git a/models/export.js b/models/export.js index 49aac828d..4f17d7272 100644 --- a/models/export.js +++ b/models/export.js @@ -172,7 +172,7 @@ export class Exporter { }; result.users = Users.find(byUserIds, userFields).fetch().map((user) => { // user avatar is stored as a relative url, we export absolute - if (user.profile.avatarUrl) { + if ((user.profile || {}).avatarUrl) { user.profile.avatarUrl = FlowRouter.url(user.profile.avatarUrl); } return user; diff --git a/models/swimlanes.js b/models/swimlanes.js index bd2565af8..9a53d1162 100644 --- a/models/swimlanes.js +++ b/models/swimlanes.js @@ -168,17 +168,17 @@ Swimlanes.helpers({ isListTemplatesSwimlane() { const user = Users.findOne(Meteor.userId()); - return user.profile.listTemplatesSwimlaneId === this._id; + return (user.profile || {}).listTemplatesSwimlaneId === this._id; }, isCardTemplatesSwimlane() { const user = Users.findOne(Meteor.userId()); - return user.profile.cardTemplatesSwimlaneId === this._id; + return (user.profile || {}).cardTemplatesSwimlaneId === this._id; }, isBoardTemplatesSwimlane() { const user = Users.findOne(Meteor.userId()); - return user.profile.boardTemplatesSwimlaneId === this._id; + return (user.profile || {}).boardTemplatesSwimlaneId === this._id; }, remove() { diff --git a/models/users.js b/models/users.js index 0dd9c1d67..3240f8dee 100644 --- a/models/users.js +++ b/models/users.js @@ -288,32 +288,32 @@ Users.helpers({ }, starredBoards() { - const {starredBoards = []} = this.profile; + const {starredBoards = []} = this.profile || {}; return Boards.find({archived: false, _id: {$in: starredBoards}}); }, hasStarred(boardId) { - const {starredBoards = []} = this.profile; + const {starredBoards = []} = this.profile || {}; return _.contains(starredBoards, boardId); }, invitedBoards() { - const {invitedBoards = []} = this.profile; + const {invitedBoards = []} = this.profile || {}; return Boards.find({archived: false, _id: {$in: invitedBoards}}); }, isInvitedTo(boardId) { - const {invitedBoards = []} = this.profile; + const {invitedBoards = []} = this.profile || {}; return _.contains(invitedBoards, boardId); }, hasTag(tag) { - const {tags = []} = this.profile; + const {tags = []} = this.profile || {}; return _.contains(tags, tag); }, hasNotification(activityId) { - const {notifications = []} = this.profile; + const {notifications = []} = this.profile || {}; return _.contains(notifications, activityId); }, @@ -323,7 +323,7 @@ Users.helpers({ }, getEmailBuffer() { - const {emailBuffer = []} = this.profile; + const {emailBuffer = []} = this.profile || {}; return emailBuffer; }, @@ -358,11 +358,11 @@ Users.helpers({ }, getTemplatesBoardId() { - return this.profile.templatesBoardId; + return (this.profile || {}).templatesBoardId; }, getTemplatesBoardSlug() { - return Boards.findOne(this.profile.templatesBoardId).slug; + return (Boards.findOne((this.profile || {}).templatesBoardId) || {}).slug; }, }); diff --git a/server/publications/boards.js b/server/publications/boards.js index 144eabb86..529407393 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -10,7 +10,7 @@ Meteor.publish('boards', function() { // Defensive programming to verify that starredBoards has the expected // format -- since the field is in the `profile` a user can modify it. - const {starredBoards = []} = Users.findOne(this.userId).profile; + const {starredBoards = []} = Users.findOne(this.userId).profile || {}; check(starredBoards, [String]); return Boards.find({ diff --git a/server/publications/fast-render.js b/server/publications/fast-render.js index e28b6f2e1..7c54c6861 100644 --- a/server/publications/fast-render.js +++ b/server/publications/fast-render.js @@ -1,3 +1,5 @@ +import { FastRender } from 'meteor/staringatlights:fast-render'; + FastRender.onAllRoutes(function() { this.subscribe('boards'); }); From 04c7372a4e665becb7383c319b9b514217468e54 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 9 May 2019 16:02:54 +0300 Subject: [PATCH 3/6] Update changelog. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1ff94a84..bd9a2358d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and fixes the following bugs: - [Fix OIDC login](https://github.com/wekan/wekan/pull/2385). Related [#2383](https://github.com/wekan/wekan/issues/2383). Thanks to faust64. +- [Fix missing profile checks](https://github.com/wekan/wekan/pull/2396). + Thanks to justinr1234. +- [Fix RTL issue #884, part 1](https://github.com/wekan/wekan/pull/2395). + Thanks to guyzyl. Thanks to above GitHub users for their contributions and translators for their translations. From e1b016cf3d4ff93e9e0fe1feb96372e3e1625233 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 9 May 2019 16:17:53 +0300 Subject: [PATCH 4/6] Prevent data loss. Thanks to xet7 ! --- models/users.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/models/users.js b/models/users.js index 4ce0ca3f6..5f949c805 100644 --- a/models/users.js +++ b/models/users.js @@ -690,16 +690,22 @@ if (Meteor.isServer) { }, {unique: true}); }); - Users.before.remove((userId, doc) => { - Boards - .find({members: {$elemMatch: {userId: doc._id, isAdmin: true}}}) - .forEach((board) => { - // If only one admin for the board - if (board.members.filter((e) => e.isAdmin).length === 1) { - Boards.remove(board._id); - } - }); - }); + // OLD WAY THIS CODE DID WORK: When user is last admin of board, + // if admin is removed, board is removed. + // NOW THIS IS COMMENTED OUT, because other board users still need to be able + // to use that board, and not have board deleted. + // Someone can be later changed to be admin of board, by making change to database. + // TODO: Add UI for changing someone as board admin. + //Users.before.remove((userId, doc) => { + // Boards + // .find({members: {$elemMatch: {userId: doc._id, isAdmin: true}}}) + // .forEach((board) => { + // // If only one admin for the board + // if (board.members.filter((e) => e.isAdmin).length === 1) { + // Boards.remove(board._id); + // } + // }); + //}); // Each board document contains the de-normalized number of users that have // starred it. If the user star or unstar a board, we need to update this From 491d27638a6491696912389c733eff4fb9adfed2 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 9 May 2019 16:24:13 +0300 Subject: [PATCH 5/6] Delete user feature. --- CHANGELOG.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd9a2358d..1c342e22e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # Upcoming Wekan release -This release adds the following new translations: +This release adds the following new features: + +- [Delete user feature](https://github.com/wekan/wekan/pull/2384). + Thanks to Akuket. +- Change to Delete user feature: [When last board admin is removed, board is not deleted, other board users can + still use it](https://github.com/wekan/wekan/commit/e1b016cf3d4ff93e9e0fe1feb96372e3e1625233). + Thanks to xet7. + +and adds the following new translations: - Add Chinese (Hong Kong). Thanks to translators. From 7ff4067e88ed59686c86d81447fa2ce550032034 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 9 May 2019 16:32:34 +0300 Subject: [PATCH 6/6] v2.66 --- CHANGELOG.md | 2 +- Stackerfile.yml | 2 +- package.json | 2 +- sandstorm-pkgdef.capnp | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c342e22e..66442ebc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# Upcoming Wekan release +# v2.66 2019-05-09 Wekan release This release adds the following new features: diff --git a/Stackerfile.yml b/Stackerfile.yml index 64ef51d73..3e25f0e83 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v2.65.0" +appVersion: "v2.66.0" files: userUploads: - README.md diff --git a/package.json b/package.json index 11ac23d15..13e971e07 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v2.65.0", + "version": "v2.66.0", "description": "Open-Source kanban", "private": true, "scripts": { diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index b6c4f9c00..fc5393d09 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 267, + appVersion = 268, # Increment this for every release. - appMarketingVersion = (defaultText = "2.65.0~2019-04-24"), + appMarketingVersion = (defaultText = "2.66.0~2019-05-09"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0,