Merge remote-tracking branch 'upstream/master'

This commit is contained in:
helioguardabaxo 2021-01-22 22:12:22 -03:00
commit 545c72fca3
74 changed files with 55248 additions and 55042 deletions

View file

@ -1,3 +1,28 @@
# Upcoming Wekan release
This release adds the following new features:
- [Option to add custom field to all cards](https://github.com/wekan/wekan/pulls/3466).
Thanks to jrsupplee.
and adds the following updates:
- Updated dependencies.
[Part 1](https://github.com/wekan/wekan/commit/7a66cb46a0ec334f4e95a73322641ba029f770ad),
[Part 2](https://github.com/wekan/wekan/commit/953cfd6ecd291196ce2ad1d4a5eac19ca21a20d9).
Thanks to developers of dependencies.
and fixes the following bugs:
- [WIP Limit: Limited number of cards highlighting to true overbooking](https://github.com/wekan/wekan/pull/3468).
Thanks to bronger.
- [Revert table-cell back to inline-block at my-cards-list-wrapper](https://github.com/wekan/wekan/commit/da12c84609674bdf5121ad6b74c97c65b9fc0164).
Thanks to jrsupplee and xet7.
- [Fix for search operators with uppercase letters](https://github.com/wekan/wekan/pull/3470).
Thanks to jrsupplee.
Thanks to above GitHub users for their contributions and translators for their translations.
# v4.84 2021-01-22 Wekan release
This release adds the following new features:

View file

@ -239,7 +239,7 @@ BlazeComponent.extendComponent({
.customFields()
.fetch(),
function(field) {
if (field.automaticallyOnCard)
if (field.automaticallyOnCard || field.alwaysOnCard)
arr.push({ _id: field._id, value: null });
},
);

View file

@ -15,7 +15,7 @@ template(name="listHeader")
= title
if wipLimit.enabled
| (
span(class="{{#if reachedWipLimit}}highlight{{/if}}") {{cards.count}}
span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.count}}
|/#{wipLimit.value})
if showCardsCountForList cards.count

View file

@ -72,6 +72,14 @@ BlazeComponent.extendComponent({
);
},
exceededWipLimit() {
const list = Template.currentData();
return (
list.getWipLimit('enabled') &&
list.getWipLimit('value') < list.cards().count()
);
},
showCardsCountForList(count) {
const limit = this.limitToShowCardsCount();
return limit > 0 && count > limit;

View file

@ -193,25 +193,31 @@ BlazeComponent.extendComponent({
const reText = /^(?<text>\S+)(\s+|$)/;
const reQuotedText = /^(?<quote>["'])(?<text>\w+)\k<quote>(\s+|$)/;
const operators = {
'operator-board': 'boards',
'operator-board-abbrev': 'boards',
'operator-swimlane': 'swimlanes',
'operator-swimlane-abbrev': 'swimlanes',
'operator-list': 'lists',
'operator-list-abbrev': 'lists',
'operator-label': 'labels',
'operator-label-abbrev': 'labels',
'operator-user': 'users',
'operator-user-abbrev': 'users',
'operator-member': 'members',
'operator-member-abbrev': 'members',
'operator-assignee': 'assignees',
'operator-assignee-abbrev': 'assignees',
'operator-is': 'is',
'operator-due': 'dueAt',
'operator-created': 'createdAt',
'operator-modified': 'modifiedAt',
};
const operatorMap = {};
operatorMap[TAPi18n.__('operator-board')] = 'boards';
operatorMap[TAPi18n.__('operator-board-abbrev')] = 'boards';
operatorMap[TAPi18n.__('operator-swimlane')] = 'swimlanes';
operatorMap[TAPi18n.__('operator-swimlane-abbrev')] = 'swimlanes';
operatorMap[TAPi18n.__('operator-list')] = 'lists';
operatorMap[TAPi18n.__('operator-list-abbrev')] = 'lists';
operatorMap[TAPi18n.__('operator-label')] = 'labels';
operatorMap[TAPi18n.__('operator-label-abbrev')] = 'labels';
operatorMap[TAPi18n.__('operator-user')] = 'users';
operatorMap[TAPi18n.__('operator-user-abbrev')] = 'users';
operatorMap[TAPi18n.__('operator-member')] = 'members';
operatorMap[TAPi18n.__('operator-member-abbrev')] = 'members';
operatorMap[TAPi18n.__('operator-assignee')] = 'assignees';
operatorMap[TAPi18n.__('operator-assignee-abbrev')] = 'assignees';
operatorMap[TAPi18n.__('operator-is')] = 'is';
operatorMap[TAPi18n.__('operator-due')] = 'dueAt';
operatorMap[TAPi18n.__('operator-created')] = 'createdAt';
operatorMap[TAPi18n.__('operator-modified')] = 'modifiedAt';
for (const op in operators) {
operatorMap[TAPi18n.__(op).toLowerCase()] = operators[op];
}
// eslint-disable-next-line no-console
console.log('operatorMap:', operatorMap);
@ -247,7 +253,7 @@ BlazeComponent.extendComponent({
} else {
op = m.groups.abbrev;
}
if (op !== "__proto__") {
if (op !== '__proto__') {
if (op in operatorMap) {
let value = m.groups.value;
if (operatorMap[op] === 'labels') {
@ -259,7 +265,9 @@ BlazeComponent.extendComponent({
) {
const days = parseInt(value, 10);
if (isNaN(days)) {
if (['day', 'week', 'month', 'quarter', 'year'].includes(value)) {
if (
['day', 'week', 'month', 'quarter', 'year'].includes(value)
) {
value = moment()
.subtract(1, value)
.format();

View file

@ -49,7 +49,7 @@
border-radius: 5px
padding: 1.5rem
padding-top: 0.75rem
display: table-cell
display: inline-block
min-width: 250px
max-width: 350px

View file

@ -59,6 +59,10 @@ template(name="createCustomFieldPopup")
span {{_ 'automatically-field-on-card'}}
a.flex.js-field-always-on-card(class="{{#if alwaysOnCard}}is-checked{{/if}}")
.materialCheckBox(class="{{#if alwaysOnCard}}is-checked{{/if}}")
span {{_ 'always-field-on-card'}}
a.flex.js-field-showLabel-on-card(class="{{#if showLabelOnMiniCard}}is-checked{{/if}}")
.materialCheckBox(class="{{#if showLabelOnMiniCard}}is-checked{{/if}}")

View file

@ -174,6 +174,14 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({
$target.find('.materialCheckBox').toggleClass('is-checked');
$target.toggleClass('is-checked');
},
'click .js-field-always-on-card'(evt) {
let $target = $(evt.target);
if (!$target.hasClass('js-field-always-on-card')) {
$target = $target.parent();
}
$target.find('.materialCheckBox').toggleClass('is-checked');
$target.toggleClass('is-checked');
},
'click .js-field-showLabel-on-card'(evt) {
let $target = $(evt.target);
if (!$target.hasClass('js-field-showLabel-on-card')) {
@ -194,6 +202,8 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({
this.find('.js-field-showLabel-on-card.is-checked') !== null,
automaticallyOnCard:
this.find('.js-field-automatically-on-card.is-checked') !== null,
alwaysOnCard:
this.find('.js-field-always-on-card.is-checked') !== null,
};
// insert or update

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -601,7 +601,8 @@
"minutes": "minutes",
"seconds": "seconds",
"show-field-on-card": "Show this field on card",
"automatically-field-on-card": "Auto create field to all cards",
"automatically-field-on-card": "Add field to new cards",
"always-field-on-card": "Add field to all cards",
"showLabel-field-on-card": "Show field label on minicard",
"yes": "Yes",
"no": "No",

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -147,6 +147,7 @@ export class CsvCreator {
settings,
showOnCard: false,
automaticallyOnCard: false,
alwaysOnCard: false,
showLabelOnMiniCard: false,
boardIds: [boardId],
});

View file

@ -76,6 +76,12 @@ CustomFields.attachSchema(
*/
type: Boolean,
},
alwaysOnCard: {
/**
* should the custom field be automatically added to all cards?
*/
type: Boolean,
},
showLabelOnMiniCard: {
/**
* should the label of the custom field be shown on minicards?
@ -111,6 +117,19 @@ CustomFields.attachSchema(
}),
);
CustomFields.addToAllCards = cf => {
Cards.update(
{
boardId: { $in: cf.boardIds },
customFields: { $not: { $elemMatch: { _id: cf._id } } },
},
{
$push: { customFields: { _id: cf._id, value: null } },
},
{ multi: true },
);
};
CustomFields.mutations({
addBoard(boardId) {
if (boardId) {
@ -198,6 +217,10 @@ if (Meteor.isServer) {
CustomFields.after.insert((userId, doc) => {
customFieldCreation(userId, doc);
if (doc.alwaysOnCard) {
CustomFields.addToAllCards(doc);
}
});
CustomFields.before.update((userId, doc, fieldNames, modifier) => {
@ -224,6 +247,11 @@ if (Meteor.isServer) {
}
});
CustomFields.after.update((userId, doc) => {
if (doc.alwaysOnCard) {
CustomFields.addToAllCards(doc);
}
});
CustomFields.before.remove((userId, doc) => {
customFieldDeletion(userId, doc);
Activities.remove({

View file

@ -243,6 +243,7 @@ export class TrelloCreator {
showOnCard: field.display.cardFront,
showLabelOnMiniCard: field.display.cardFront,
automaticallyOnCard: true,
alwaysOnCard: false,
type: field.type,
boardIds: [boardId],
settings: {},

View file

@ -537,6 +537,7 @@ export class WekanCreator {
showOnCard: field.showOnCard,
showLabelOnMiniCard: field.showLabelOnMiniCard,
automaticallyOnCard: field.automaticallyOnCard,
alwaysOnCard: field.alwaysOnCard,
//use date "now" if now created at date is provided (e.g. for very old boards)
createdAt: this._now(this.createdAt.customFields[field._id]),
modifiedAt: field.modifiedAt,

1034
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -45,38 +45,38 @@
"eslint-config-meteor": "0.0.9",
"eslint-config-prettier": "^3.6.0",
"eslint-import-resolver-meteor": "^0.4.0",
"eslint-plugin-import": "^2.20.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-meteor": "^5.1.0",
"eslint-plugin-prettier": "^3.1.2",
"eslint-plugin-prettier": "^3.3.1",
"lint-staged": "^7.3.0",
"pre-commit": "^1.2.2",
"prettier": "^1.19.1",
"prettier-eslint": "^9.0.2"
},
"dependencies": {
"@babel/core": "^7.9.6",
"@babel/runtime": "^7.9.6",
"@root/request": "^1.6.1",
"ajv": "^6.12.4",
"@babel/core": "^7.12.10",
"@babel/runtime": "^7.12.5",
"@root/request": "^1.7.0",
"ajv": "^7.0.3",
"babel-runtime": "^6.26.0",
"bcrypt": "^5.0.0",
"bson": "^4.0.3",
"bunyan": "^1.8.12",
"bson": "^4.2.2",
"bunyan": "^1.8.15",
"es6-promise": "^4.2.4",
"exceljs": "^4.2.0",
"fibers": "^5.0.0",
"flatted": "^3.0.4",
"flatted": "^3.1.1",
"gridfs-stream": "https://github.com/wekan/gridfs-stream/tarball/master",
"jszip": "^3.4.0",
"ldapjs": "^2.1.1",
"markdown-it": "^12.0.2",
"jszip": "^3.5.0",
"ldapjs": "^2.2.3",
"markdown-it": "^12.0.4",
"markdown-it-emoji": "^2.0.0",
"meteor-node-stubs": "^1.0.1",
"mongodb": "^3.6.2",
"mongodb": "^3.6.3",
"os": "^0.1.1",
"page": "^1.11.5",
"papaparse": "^5.2.0",
"qs": "^6.9.4",
"papaparse": "^5.3.0",
"qs": "^6.9.6",
"source-map-support": "^0.5.19",
"xss": "^1.0.8"
}