mirror of
https://github.com/wekan/wekan.git
synced 2025-04-22 21:17:18 -04:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
545c72fca3
74 changed files with 55248 additions and 55042 deletions
25
CHANGELOG.md
25
CHANGELOG.md
|
@ -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:
|
||||
|
|
|
@ -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 });
|
||||
},
|
||||
);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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}}")
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
1849
i18n/ar-EG.i18n.json
1849
i18n/ar-EG.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/ar.i18n.json
1849
i18n/ar.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/bg.i18n.json
1849
i18n/bg.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/br.i18n.json
1849
i18n/br.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/ca.i18n.json
1849
i18n/ca.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/cs.i18n.json
1849
i18n/cs.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/da.i18n.json
1849
i18n/da.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/de.i18n.json
1849
i18n/de.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/el.i18n.json
1849
i18n/el.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/en-GB.i18n.json
1849
i18n/en-GB.i18n.json
File diff suppressed because it is too large
Load diff
|
@ -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",
|
||||
|
|
1849
i18n/eo.i18n.json
1849
i18n/eo.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/es-AR.i18n.json
1849
i18n/es-AR.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/es-CL.i18n.json
1849
i18n/es-CL.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/es-MX.i18n.json
1849
i18n/es-MX.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/es-PE.i18n.json
1849
i18n/es-PE.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/es-PY.i18n.json
1849
i18n/es-PY.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/es.i18n.json
1849
i18n/es.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/eu.i18n.json
1849
i18n/eu.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/fa.i18n.json
1849
i18n/fa.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/fi.i18n.json
1849
i18n/fi.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/fr.i18n.json
1849
i18n/fr.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/gl.i18n.json
1849
i18n/gl.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/he.i18n.json
1849
i18n/he.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/hi.i18n.json
1849
i18n/hi.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/hr.i18n.json
1849
i18n/hr.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/hu.i18n.json
1849
i18n/hu.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/hy.i18n.json
1849
i18n/hy.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/id.i18n.json
1849
i18n/id.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/ig.i18n.json
1849
i18n/ig.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/it.i18n.json
1849
i18n/it.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/ja.i18n.json
1849
i18n/ja.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/ka.i18n.json
1849
i18n/ka.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/km.i18n.json
1849
i18n/km.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/ko.i18n.json
1849
i18n/ko.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/lt.i18n.json
1849
i18n/lt.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/lv.i18n.json
1849
i18n/lv.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/mk.i18n.json
1849
i18n/mk.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/mn.i18n.json
1849
i18n/mn.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/nl.i18n.json
1849
i18n/nl.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/oc.i18n.json
1849
i18n/oc.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/pa.i18n.json
1849
i18n/pa.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/pl.i18n.json
1849
i18n/pl.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/pt-BR.i18n.json
1849
i18n/pt-BR.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/pt.i18n.json
1849
i18n/pt.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/ro.i18n.json
1849
i18n/ro.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/ru.i18n.json
1849
i18n/ru.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/sk.i18n.json
1849
i18n/sk.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/sl.i18n.json
1849
i18n/sl.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/sr.i18n.json
1849
i18n/sr.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/sv.i18n.json
1849
i18n/sv.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/sw.i18n.json
1849
i18n/sw.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/ta.i18n.json
1849
i18n/ta.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/th.i18n.json
1849
i18n/th.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/tr.i18n.json
1849
i18n/tr.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/uk.i18n.json
1849
i18n/uk.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/vi.i18n.json
1849
i18n/vi.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/zh-CN.i18n.json
1849
i18n/zh-CN.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/zh-HK.i18n.json
1849
i18n/zh-HK.i18n.json
File diff suppressed because it is too large
Load diff
1849
i18n/zh-TW.i18n.json
1849
i18n/zh-TW.i18n.json
File diff suppressed because it is too large
Load diff
|
@ -147,6 +147,7 @@ export class CsvCreator {
|
|||
settings,
|
||||
showOnCard: false,
|
||||
automaticallyOnCard: false,
|
||||
alwaysOnCard: false,
|
||||
showLabelOnMiniCard: false,
|
||||
boardIds: [boardId],
|
||||
});
|
||||
|
|
|
@ -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({
|
||||
|
|
|
@ -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: {},
|
||||
|
|
|
@ -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
1034
package-lock.json
generated
File diff suppressed because it is too large
Load diff
30
package.json
30
package.json
|
@ -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"
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue