|
@@ -4,6 +4,16 @@ const isSandstorm =
|
|
|
Meteor.settings && Meteor.settings.public && Meteor.settings.public.sandstorm;
|
|
|
Users = Meteor.users;
|
|
|
|
|
|
+const allowedSortValues = [
|
|
|
+ '-modifiedAt',
|
|
|
+ 'modifiedAt',
|
|
|
+ '-title',
|
|
|
+ 'title',
|
|
|
+ '-sort',
|
|
|
+ 'sort',
|
|
|
+];
|
|
|
+const defaultSortBy = allowedSortValues[0];
|
|
|
+
|
|
|
/**
|
|
|
* A User in wekan
|
|
|
*/
|
|
@@ -109,6 +119,13 @@ Users.attachSchema(
|
|
|
type: String,
|
|
|
optional: true,
|
|
|
},
|
|
|
+ 'profile.showDesktopDragHandles': {
|
|
|
+ /**
|
|
|
+ * does the user want to hide system messages?
|
|
|
+ */
|
|
|
+ type: Boolean,
|
|
|
+ optional: true,
|
|
|
+ },
|
|
|
'profile.hiddenSystemMessages': {
|
|
|
/**
|
|
|
* does the user want to hide system messages?
|
|
@@ -184,6 +201,15 @@ Users.attachSchema(
|
|
|
'board-view-cal',
|
|
|
],
|
|
|
},
|
|
|
+ 'profile.listSortBy': {
|
|
|
+ /**
|
|
|
+ * default sort list for user
|
|
|
+ */
|
|
|
+ type: String,
|
|
|
+ optional: true,
|
|
|
+ defaultValue: defaultSortBy,
|
|
|
+ allowedValues: allowedSortValues,
|
|
|
+ },
|
|
|
'profile.templatesBoardId': {
|
|
|
/**
|
|
|
* Reference to the templates board
|
|
@@ -358,6 +384,31 @@ Users.helpers({
|
|
|
return _.contains(invitedBoards, boardId);
|
|
|
},
|
|
|
|
|
|
+ _getListSortBy() {
|
|
|
+ const profile = this.profile || {};
|
|
|
+ const sortBy = profile.listSortBy || defaultSortBy;
|
|
|
+ const keyPattern = /^(-{0,1})(.*$)/;
|
|
|
+ const ret = [];
|
|
|
+ if (keyPattern.exec(sortBy)) {
|
|
|
+ ret[0] = RegExp.$2;
|
|
|
+ ret[1] = RegExp.$1 ? -1 : 1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+ },
|
|
|
+ hasSortBy() {
|
|
|
+ // if use doesn't have dragHandle, then we can let user to choose sort list by different order
|
|
|
+ return !this.hasShowDesktopDragHandles();
|
|
|
+ },
|
|
|
+ getListSortBy() {
|
|
|
+ return this._getListSortBy()[0];
|
|
|
+ },
|
|
|
+ getListSortTypes() {
|
|
|
+ return allowedSortValues;
|
|
|
+ },
|
|
|
+ getListSortByDirection() {
|
|
|
+ return this._getListSortBy()[1];
|
|
|
+ },
|
|
|
+
|
|
|
hasTag(tag) {
|
|
|
const { tags = [] } = this.profile || {};
|
|
|
return _.contains(tags, tag);
|
|
@@ -368,6 +419,11 @@ Users.helpers({
|
|
|
return _.contains(notifications, activityId);
|
|
|
},
|
|
|
|
|
|
+ hasShowDesktopDragHandles() {
|
|
|
+ const profile = this.profile || {};
|
|
|
+ return profile.showDesktopDragHandles || false;
|
|
|
+ },
|
|
|
+
|
|
|
hasHiddenSystemMessages() {
|
|
|
const profile = this.profile || {};
|
|
|
return profile.hiddenSystemMessages || false;
|
|
@@ -473,6 +529,21 @@ Users.mutations({
|
|
|
else this.addTag(tag);
|
|
|
},
|
|
|
|
|
|
+ setListSortBy(value) {
|
|
|
+ return {
|
|
|
+ $set: {
|
|
|
+ 'profile.listSortBy': value,
|
|
|
+ },
|
|
|
+ };
|
|
|
+ },
|
|
|
+ toggleDesktopHandles(value = false) {
|
|
|
+ return {
|
|
|
+ $set: {
|
|
|
+ 'profile.showDesktopDragHandles': !value,
|
|
|
+ },
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
toggleSystem(value = false) {
|
|
|
return {
|
|
|
$set: {
|
|
@@ -549,6 +620,14 @@ Meteor.methods({
|
|
|
Users.update(userId, { $set: { username } });
|
|
|
}
|
|
|
},
|
|
|
+ setListSortBy(value) {
|
|
|
+ check(value, String);
|
|
|
+ Meteor.user().setListSortBy(value);
|
|
|
+ },
|
|
|
+ toggleDesktopDragHandles() {
|
|
|
+ const user = Meteor.user();
|
|
|
+ user.toggleDesktopHandles(user.hasShowDesktopDragHandles());
|
|
|
+ },
|
|
|
toggleSystemMessages() {
|
|
|
const user = Meteor.user();
|
|
|
user.toggleSystem(user.hasHiddenSystemMessages());
|
|
@@ -776,6 +855,9 @@ if (Meteor.isServer) {
|
|
|
if (Meteor.isServer) {
|
|
|
// Let mongoDB ensure username unicity
|
|
|
Meteor.startup(() => {
|
|
|
+ allowedSortValues.forEach(value => {
|
|
|
+ Lists._collection._ensureIndex(value);
|
|
|
+ });
|
|
|
Users._collection._ensureIndex({ modifiedAt: -1 });
|
|
|
Users._collection._ensureIndex(
|
|
|
{
|