mirror of
https://github.com/wekan/wekan.git
synced 2026-11-05 15:45:01 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
843ff8eaaa | ||
|
|
c5143e2c54 | ||
|
|
0596f5e864 | ||
|
|
8ca1b25daf | ||
|
|
1f76159bfe | ||
|
|
39ece35f52 | ||
|
|
63c1bb9e17 | ||
|
|
354622c5ad | ||
|
|
df7fd8c900 | ||
|
|
7957690fca | ||
|
|
63d19447a0 | ||
|
|
018a84ec59 | ||
|
|
e5c0e623a0 | ||
|
|
9a2d3e15e8 | ||
|
|
c07e262e68 | ||
|
|
cacb2b91ee | ||
|
|
6f269d598f | ||
|
|
57ea254bff | ||
|
|
7e183c838f | ||
|
|
3ffdfd9736 | ||
|
|
621c701bef | ||
|
|
3c24c9966c | ||
|
|
995de525d9 | ||
|
|
ae30b1220a | ||
|
|
e380ad26c2 | ||
|
|
9bb31d2380 | ||
|
|
8ec1e4f3fa | ||
|
|
9f0f6841b0 | ||
|
|
5d18f98b44 | ||
|
|
e738177e08 | ||
|
|
bb201935b9 | ||
|
|
bcfe6bd616 | ||
|
|
9c6352a7bc | ||
|
|
9110e41f20 | ||
|
|
7ae871d3a6 | ||
|
|
0ddf027d43 | ||
|
|
45124a39f3 | ||
|
|
4940af0573 | ||
|
|
924b5d1733 | ||
|
|
2119a3a51e | ||
|
|
dcda99ddf3 | ||
|
|
0e35dcd5ad | ||
|
|
991d42ca0b | ||
|
|
ac242c96b7 | ||
|
|
79d45c8e33 | ||
|
|
8e9f7102f9 | ||
|
|
1952dc309b | ||
|
|
5e7767247f | ||
|
|
676bf686c7 | ||
|
|
5cd6985368 | ||
|
|
807e72dcce | ||
|
|
71702b5821 | ||
|
|
40c56248f1 | ||
|
|
74ac7d8d3f | ||
|
|
e7186b47b0 | ||
|
|
12aa7ea2cb |
No files matched your search
+6
-6
@@ -16,7 +16,7 @@ babel-runtime@1.5.0
|
||||
base64@1.0.12
|
||||
binary-heap@1.0.11
|
||||
blaze@2.4.0
|
||||
blaze-tools@1.1.0
|
||||
blaze-tools@1.1.1
|
||||
boilerplate-generator@1.7.1
|
||||
browser-policy-common@1.0.11
|
||||
browser-policy-framing@1.1.0
|
||||
@@ -52,7 +52,7 @@ ddp@1.4.0
|
||||
ddp-client@2.4.0
|
||||
ddp-common@1.4.0
|
||||
ddp-rate-limiter@1.0.9
|
||||
ddp-server@2.3.2
|
||||
ddp-server@2.3.3
|
||||
deps@1.0.12
|
||||
diff-sequence@1.1.1
|
||||
dynamic-import@0.6.0
|
||||
@@ -70,7 +70,7 @@ fortawesome:fontawesome@4.7.0
|
||||
geojson-utils@1.0.10
|
||||
horka:swipebox@1.0.2
|
||||
hot-code-push@1.0.4
|
||||
html-tools@1.1.0
|
||||
html-tools@1.1.1
|
||||
htmljs@1.1.0
|
||||
http@1.4.3
|
||||
id-map@1.1.0
|
||||
@@ -100,7 +100,7 @@ meteorhacks:collection-utils@1.2.0
|
||||
meteorhacks:picker@1.0.3
|
||||
meteorhacks:subs-manager@1.6.4
|
||||
meteorspark:util@0.2.0
|
||||
minifier-css@1.5.3
|
||||
minifier-css@1.5.4
|
||||
minifier-js@2.6.0
|
||||
minifiers@1.1.8-faster-rebuild.0
|
||||
minimongo@1.6.2
|
||||
@@ -208,10 +208,10 @@ simple:json-routes@2.1.0
|
||||
simple:rest-accounts-password@1.1.2
|
||||
simple:rest-bearer-token-parser@1.0.1
|
||||
simple:rest-json-error-handler@1.0.1
|
||||
socket-stream-client@0.3.1
|
||||
socket-stream-client@0.3.2
|
||||
softwarerero:accounts-t9n@1.3.11
|
||||
spacebars@1.1.0
|
||||
spacebars-compiler@1.2.0
|
||||
spacebars-compiler@1.2.1
|
||||
srp@1.1.0
|
||||
standard-minifier-css@1.7.2
|
||||
standard-minifier-js@2.6.0
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ host = https://www.transifex.com
|
||||
# tap:i18n requires us to use `-` separator in the language identifiers whereas
|
||||
# Transifex uses a `_` separator, without an option to customize it on one side
|
||||
# or the other, so we need to do a Manual mapping.
|
||||
lang_map = ar_EG:ar-EG, bg_BG:bg, de_CH:de-CH, en_GB:en-GB, es_AR:es-AR, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el, fa_IR:fa-IR, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, no:nb, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_HK:zh-HK
|
||||
lang_map = ar_EG:ar-EG, bg_BG:bg, de_CH:de-CH, en_GB:en-GB, es_AR:es-AR, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el, fa_IR:fa-IR, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_HK:zh-HK
|
||||
|
||||
[wekan.application]
|
||||
file_filter = i18n/<lang>.i18n.json
|
||||
|
||||
+84
-3
@@ -1,10 +1,91 @@
|
||||
# v5.26 2021-04-28 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Feature/mini card subtask count](https://github.com/wekan/wekan/pull/3765).
|
||||
Thanks to ryanMushy.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Bring back Almost-Due for Start Date](https://github.com/wekan/wekan/commit/8ca1b25daf3be60c2dc64f03830dea8437bbd8ad).
|
||||
Thanks to darren-teo.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v5.25 2021-04-27 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Swimlane in Export to Excel](https://github.com/wekan/wekan/pull/3764).
|
||||
Thanks to Keelan and ryanMushy.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated release scripts](https://github.com/wekan/wekan/commit/9f0f6841b01b88f5559724b047d5e245617a02c8).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Added missing PostgreSQL password to ToroDB](https://github.com/wekan/wekan/commit/995de525d96946702536f0cdcb98ef281b9df94e).
|
||||
Thanks to xet7.
|
||||
- [Fixed language name of Deutsch (Schweiz)](https://github.com/wekan/wekan/commit/621c701bef1d09d4ddfc93be411cfad98869f0ae).
|
||||
Thanks to urmel1960.
|
||||
- [Bugfix/Summernote on paste](https://github.com/wekan/wekan/pull/3761).
|
||||
Thanks to ryanMushy.
|
||||
- [OpenAPI: Better handle nested schemas](https://github.com/wekan/wekan/pull/3762).
|
||||
Thanks to bentiss.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v5.24 2021-04-24 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Copy Swimlane](https://github.com/wekan/wekan/pull/3753).
|
||||
Thanks to jrsupplee.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/e738177e081e4a7e83fed3389f47847403551fc2).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix Snap: Delete extra symlink that prevented building Snap](https://github.com/wekan/wekan/commit/45124a39f34a918b251a4a36fb016639b558f119).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v5.23 2021-04-22 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Filtering by due date](https://github.com/wekan/wekan/pull/3731).
|
||||
Thanks to mcrute.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/676bf686c7a121b0da744afce5911807a6be48fe).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix: Trello data without labels definition](https://github.com/wekan/wekan/pull/3733).
|
||||
Thanks to jrsupplee.
|
||||
- [Bug fix for Due Cards](https://github.com/wekan/wekan/pull/3741).
|
||||
Thanks to jrsupplee.
|
||||
- [Fix: The bg color of start at button is almost-due](https://github.com/wekan/wekan/pull/3749).
|
||||
Thanks to listenerri.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v5.22 2021-04-16 Wekan release
|
||||
|
||||
This release adds the following new translations:
|
||||
|
||||
- Added German (Switzerland) (de_CH) (Schwiizerdütsch). Updated translations.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/09506c78f3c3439db622574eb851fa0c20d3a066),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/dce99c00be80cceba686fd73b4b78b6c778d78a6).
|
||||
[Part 2](https://github.com/wekan/wekan/commit/dce99c00be80cceba686fd73b4b78b6c778d78a6),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/6ff9c5b58d25ba52b11e5429c9cfe6ed6a97000e).
|
||||
Thanks to translators.
|
||||
|
||||
@@ -19,11 +100,11 @@ Thanks to above GitHub users for their contributions and translators for their t
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Summernote Rich Text Editor:
|
||||
- [Summernote Rich Text Editor](https://github.com/wekan/wekan/pull/3720):
|
||||
1) Add new button to insert a URL link.
|
||||
2) Add new popover allowing you to edit existing URL links.
|
||||
3) Enable spell check.
|
||||
4) Allow client side grammerly extension](https://github.com/wekan/wekan/pull/3720).
|
||||
4) Allow client side grammerly extension.
|
||||
Thanks to ryanMushy.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v5.22.0"
|
||||
appVersion: "v5.26.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -129,3 +129,8 @@ template(name="minicard")
|
||||
.badge(class="{{#if checklistFinished}}is-finished{{/if}}")
|
||||
span.badge-icon.fa.fa-check-square-o
|
||||
span.badge-text.check-list-text {{checklistFinishedCount}}/{{checklistItemCount}}
|
||||
if allSubtasks.count
|
||||
.badge
|
||||
span.badge-icon.fa.fa-sitemap
|
||||
span.badge-text.check-list-text {{subtasksFinishedCount}}/{{allSubtasksCount}}
|
||||
//{{subtasksFinishedCount}}/{{subtasksCount}} does not work because when a subtaks is archived, the count goes down
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
OPERATOR_HAS,
|
||||
OPERATOR_SORT,
|
||||
OPERATOR_USER,
|
||||
ORDER_DESCENDING,
|
||||
ORDER_ASCENDING,
|
||||
PREDICATE_DUE_AT,
|
||||
} from '../../../config/search-const';
|
||||
import { QueryParams } from '../../../config/query-classes';
|
||||
@@ -62,14 +62,14 @@ class DueCardsComponent extends CardSearchPagedComponent {
|
||||
// queryParams[OPERATOR_LIMIT] = 5;
|
||||
queryParams.addPredicate(OPERATOR_SORT, {
|
||||
name: PREDICATE_DUE_AT,
|
||||
order: ORDER_DESCENDING,
|
||||
order: ORDER_ASCENDING,
|
||||
});
|
||||
|
||||
if (Utils.dueCardsView() !== 'all') {
|
||||
queryParams.addPredicate(OPERATOR_USER, Meteor.user().username);
|
||||
}
|
||||
|
||||
this.runGlobalSearch(queryParams.getQueryParams());
|
||||
this.runGlobalSearch(queryParams);
|
||||
}
|
||||
|
||||
dueCardsView() {
|
||||
|
||||
@@ -145,6 +145,7 @@ Template.editor.onRendered(() => {
|
||||
const MAX_IMAGE_PIXEL = Utils.MAX_IMAGE_PIXEL;
|
||||
const COMPRESS_RATIO = Utils.IMAGE_COMPRESS_RATIO;
|
||||
const insertImage = src => {
|
||||
// process all image upload types to the description/comment window
|
||||
const img = document.createElement('img');
|
||||
img.src = src;
|
||||
img.setAttribute('width', '100%');
|
||||
@@ -210,7 +211,16 @@ Template.editor.onRendered(() => {
|
||||
}
|
||||
}
|
||||
},
|
||||
onPaste() {
|
||||
onPaste(e) {
|
||||
var clipboardData = e.clipboardData;
|
||||
var pastedData = clipboardData.getData('Text');
|
||||
|
||||
//if pasted data is an image, exit
|
||||
if( !pastedData.length ){
|
||||
e.preventDefault();
|
||||
return;
|
||||
}
|
||||
|
||||
// clear up unwanted tag info when user pasted in text
|
||||
const thisNote = this;
|
||||
const updatePastedText = function(object) {
|
||||
@@ -219,7 +229,7 @@ Template.editor.onRendered(() => {
|
||||
// (and multiplies by pasting more) by changing paste "p" to "br".
|
||||
// Fixes https://github.com/wekan/wekan/2890 .
|
||||
// == Fix Start ==
|
||||
someNote.execCommand('defaultParagraphSeparator', false, 'br');
|
||||
//someNote.execCommand('defaultParagraphSeparator', false, 'br');
|
||||
// == Fix End ==
|
||||
const original = someNote.summernote('code');
|
||||
const cleaned = cleanPastedHTML(original); //this is where to call whatever clean function you want. I have mine in a different file, called CleanPastedHTML.
|
||||
@@ -231,19 +241,16 @@ Template.editor.onRendered(() => {
|
||||
//the function is called before the text is really pasted.
|
||||
updatePastedText(thisNote);
|
||||
}, 10);
|
||||
},
|
||||
}
|
||||
},
|
||||
dialogsInBody: true,
|
||||
spellCheck: true,
|
||||
disableGrammar: false,
|
||||
disableDragAndDrop: true,
|
||||
disableDragAndDrop: false,
|
||||
toolbar,
|
||||
popover: {
|
||||
image: [
|
||||
[
|
||||
'image',
|
||||
['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone'],
|
||||
],
|
||||
['imagesize', ['imageSize100', 'imageSize50', 'imageSize25']],
|
||||
['float', ['floatLeft', 'floatRight', 'floatNone']],
|
||||
['remove', ['removeMedia']],
|
||||
],
|
||||
|
||||
@@ -78,7 +78,7 @@ Template.userFormsLayout.helpers({
|
||||
// ar-EG = Arabic (Egypt), simply Masri (مَصرى, [ˈmɑsˤɾi], Egyptian, Masr refers to Cairo)
|
||||
name = 'مَصرى';
|
||||
} else if (lang.name === 'de-CH') {
|
||||
name = 'Schwiizerdütsch';
|
||||
name = 'Deutsch (Schweiz)';
|
||||
} else if (lang.name === 'fa-IR') {
|
||||
// fa-IR = Persian (Iran)
|
||||
name = 'فارسی/پارسی (ایران)';
|
||||
|
||||
@@ -72,6 +72,43 @@ template(name="filterSidebar")
|
||||
| (<span class="username">{{ username }}</span>)
|
||||
if Filter.assignees.isSelected _id
|
||||
i.fa.fa-check
|
||||
|
||||
hr
|
||||
h3
|
||||
i.fa.fa-list-alt
|
||||
| {{_ 'filter-dates-label' }}
|
||||
ul.sidebar-list
|
||||
li(class="{{#if Filter.dueAt.isSelected 'noDate'}}active{{/if}}")
|
||||
a.name.js-toggle-no-due-date-filter
|
||||
span.sidebar-list-item-description
|
||||
| {{_ 'filter-no-due-date' }}
|
||||
if Filter.dueAt.isSelected 'noDate'
|
||||
i.fa.fa-check
|
||||
li(class="{{#if Filter.dueAt.isSelected 'past'}}active{{/if}}")
|
||||
a.name.js-toggle-overdue-filter
|
||||
span.sidebar-list-item-description
|
||||
| {{_ 'filter-overdue' }}
|
||||
if Filter.dueAt.isSelected 'past'
|
||||
i.fa.fa-check
|
||||
li(class="{{#if Filter.dueAt.isSelected 'today'}}active{{/if}}")
|
||||
a.name.js-toggle-due-today-filter
|
||||
span.sidebar-list-item-description
|
||||
| {{_ 'filter-due-today' }}
|
||||
if Filter.dueAt.isSelected 'today'
|
||||
i.fa.fa-check
|
||||
li(class="{{#if Filter.dueAt.isSelected 'tomorrow'}}active{{/if}}")
|
||||
a.name.js-toggle-due-tomorrow-filter
|
||||
span.sidebar-list-item-description
|
||||
| {{_ 'filter-due-tomorrow' }}
|
||||
if Filter.dueAt.isSelected 'tomorrow'
|
||||
i.fa.fa-check
|
||||
li(class="{{#if Filter.dueAt.isSelected 'week'}}active{{/if}}")
|
||||
a.name.js-toggle-due-this-week-filter
|
||||
span.sidebar-list-item-description
|
||||
| {{_ 'filter-due-this-week' }}
|
||||
if Filter.dueAt.isSelected 'week'
|
||||
i.fa.fa-check
|
||||
|
||||
hr
|
||||
h3
|
||||
i.fa.fa-list-alt
|
||||
|
||||
@@ -23,6 +23,31 @@ BlazeComponent.extendComponent({
|
||||
Filter.assignees.toggle(this.currentData()._id);
|
||||
Filter.resetExceptions();
|
||||
},
|
||||
'click .js-toggle-no-due-date-filter'(evt) {
|
||||
evt.preventDefault();
|
||||
Filter.dueAt.noDate();
|
||||
Filter.resetExceptions();
|
||||
},
|
||||
'click .js-toggle-overdue-filter'(evt) {
|
||||
evt.preventDefault();
|
||||
Filter.dueAt.past();
|
||||
Filter.resetExceptions();
|
||||
},
|
||||
'click .js-toggle-due-today-filter'(evt) {
|
||||
evt.preventDefault();
|
||||
Filter.dueAt.today();
|
||||
Filter.resetExceptions();
|
||||
},
|
||||
'click .js-toggle-due-tomorrow-filter'(evt) {
|
||||
evt.preventDefault();
|
||||
Filter.dueAt.tomorrow();
|
||||
Filter.resetExceptions();
|
||||
},
|
||||
'click .js-toggle-due-this-week-filter'(evt) {
|
||||
evt.preventDefault();
|
||||
Filter.dueAt.thisWeek();
|
||||
Filter.resetExceptions();
|
||||
},
|
||||
'click .js-toggle-archive-filter'(evt) {
|
||||
evt.preventDefault();
|
||||
Filter.archive.toggle(this.currentData()._id);
|
||||
|
||||
@@ -39,6 +39,8 @@ template(name="swimlaneActionPopup")
|
||||
hr
|
||||
ul.pop-over-list
|
||||
li: a.js-close-swimlane {{_ 'archive-swimlane'}}
|
||||
ul.pop-over-list
|
||||
li: a.js-copy-swimlane {{_ 'copy-swimlane'}}
|
||||
ul.pop-over-list
|
||||
li: a.js-move-swimlane {{_ 'move-swimlane'}}
|
||||
|
||||
|
||||
@@ -55,6 +55,7 @@ Template.swimlaneActionPopup.events({
|
||||
Popup.close();
|
||||
},
|
||||
'click .js-move-swimlane': Popup.open('moveSwimlane'),
|
||||
'click .js-copy-swimlane': Popup.open('copySwimlane'),
|
||||
});
|
||||
|
||||
Template.swimlaneActionPopup.events({
|
||||
|
||||
@@ -71,3 +71,13 @@ template(name="moveSwimlanePopup")
|
||||
|
||||
.edit-controls.clearfix
|
||||
button.primary.confirm.js-done {{_ 'done'}}
|
||||
|
||||
template(name="copySwimlanePopup")
|
||||
unless currentUser.isWorker
|
||||
label {{_ 'boards'}}:
|
||||
select.js-select-boards(autofocus)
|
||||
each toBoard in toBoards
|
||||
option(value="{{toBoard._id}}" selected="{{#if $eq toBoard.title board.title}}1{{/if}}") {{toBoard.title}}
|
||||
|
||||
.edit-controls.clearfix
|
||||
button.primary.confirm.js-done {{_ 'done'}}
|
||||
@@ -324,45 +324,54 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
}).register('listsGroup');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
class MoveSwimlaneComponent extends BlazeComponent {
|
||||
serverMethod = 'moveSwimlane';
|
||||
|
||||
onCreated() {
|
||||
this.currentSwimlane = this.currentData();
|
||||
},
|
||||
}
|
||||
|
||||
board() {
|
||||
return Boards.findOne(Session.get('currentBoard'));
|
||||
},
|
||||
}
|
||||
|
||||
toBoardsSelector() {
|
||||
return {
|
||||
archived: false,
|
||||
'members.userId': Meteor.userId(),
|
||||
type: 'board',
|
||||
_id: { $ne: this.board()._id },
|
||||
};
|
||||
}
|
||||
|
||||
toBoards() {
|
||||
const boards = Boards.find(
|
||||
{
|
||||
archived: false,
|
||||
'members.userId': Meteor.userId(),
|
||||
type: 'board',
|
||||
_id: { $ne: this.board()._id },
|
||||
},
|
||||
{
|
||||
sort: { title: 1 },
|
||||
},
|
||||
);
|
||||
|
||||
return boards;
|
||||
},
|
||||
return Boards.find(this.toBoardsSelector(), { sort: { title: 1 } });
|
||||
}
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-done'() {
|
||||
const swimlane = Swimlanes.findOne(this.currentSwimlane._id);
|
||||
// const swimlane = Swimlanes.findOne(this.currentSwimlane._id);
|
||||
const bSelect = $('.js-select-boards')[0];
|
||||
let boardId;
|
||||
if (bSelect) {
|
||||
boardId = bSelect.options[bSelect.selectedIndex].value;
|
||||
Meteor.call('moveSwimlane', this.currentSwimlane._id, boardId);
|
||||
Meteor.call(this.serverMethod, this.currentSwimlane._id, boardId);
|
||||
}
|
||||
Popup.close();
|
||||
},
|
||||
},
|
||||
];
|
||||
},
|
||||
}).register('moveSwimlanePopup');
|
||||
}
|
||||
}
|
||||
MoveSwimlaneComponent.register('moveSwimlanePopup');
|
||||
|
||||
(class extends MoveSwimlaneComponent {
|
||||
serverMethod = 'copySwimlane';
|
||||
toBoardsSelector() {
|
||||
const selector = super.toBoardsSelector();
|
||||
delete selector._id;
|
||||
return selector;
|
||||
}
|
||||
}.register('copySwimlanePopup'));
|
||||
@@ -175,7 +175,7 @@ Template.changeLanguagePopup.helpers({
|
||||
// fa-IR = Persian (Iran)
|
||||
name = 'فارسی/پارسی (ایران)';
|
||||
} else if (lang.name === 'de-CH') {
|
||||
name = 'Schwiizerdütsch';
|
||||
name = 'Deutsch (Schweiz)';
|
||||
} else if (lang.name === 'fr-BE') {
|
||||
name = 'Français (Belgique)';
|
||||
} else if (lang.name === 'fr-CA') {
|
||||
|
||||
@@ -7,6 +7,125 @@ function showFilterSidebar() {
|
||||
Sidebar.setView('filter');
|
||||
}
|
||||
|
||||
class DateFilter {
|
||||
constructor() {
|
||||
this._dep = new Tracker.Dependency();
|
||||
this.subField = ''; // Prevent name mangling in Filter
|
||||
this._filter = null;
|
||||
this._filterState = null;
|
||||
}
|
||||
|
||||
_updateState(state) {
|
||||
this._filterState = state;
|
||||
showFilterSidebar();
|
||||
this._dep.changed();
|
||||
}
|
||||
|
||||
// past builds a filter for all dates before now
|
||||
past() {
|
||||
if (this._filterState == 'past') { this.reset(); return; }
|
||||
this._filter = { $lte: moment().toDate() };
|
||||
this._updateState('past');
|
||||
}
|
||||
|
||||
// today is a convenience method for calling relativeDay with 0
|
||||
today() {
|
||||
if (this._filterState == 'today') { this.reset(); return; }
|
||||
this.relativeDay(0);
|
||||
this._updateState('today');
|
||||
}
|
||||
|
||||
// tomorrow is a convenience method for calling relativeDay with 1
|
||||
tomorrow() {
|
||||
if (this._filterState == 'tomorrow') { this.reset(); return; }
|
||||
this.relativeDay(1);
|
||||
this._updateState('tomorrow');
|
||||
}
|
||||
|
||||
// thisWeek is a convenience method for calling relativeWeek with 1
|
||||
thisWeek() {
|
||||
this.relativeWeek(1);
|
||||
}
|
||||
|
||||
// relativeDay builds a filter starting from now and including all
|
||||
// days up to today +/- offset.
|
||||
relativeDay(offset) {
|
||||
if (this._filterState == 'day') { this.reset(); return; }
|
||||
|
||||
var startDay = moment().startOf('day').toDate(),
|
||||
endDay = moment().endOf('day').add(offset, 'day').toDate();
|
||||
|
||||
if (offset >= 0) {
|
||||
this._filter = { $gte: startDay, $lte: endDay };
|
||||
} else {
|
||||
this._filter = { $lte: startDay, $gte: endDay };
|
||||
}
|
||||
|
||||
this._updateState('day');
|
||||
}
|
||||
|
||||
// relativeWeek builds a filter starting from today and including all
|
||||
// weeks up to today +/- offset. This considers the user's preferred
|
||||
// start of week day (as defined by Meteor).
|
||||
relativeWeek(offset) {
|
||||
if (this._filterState == 'week') { this.reset(); return; }
|
||||
|
||||
// getStartDayOfWeek returns the offset from Sunday of the user's
|
||||
// preferred starting day of the week. This date should be added
|
||||
// to the moment start of week to get the real start of week date.
|
||||
// The default is 1, meaning Monday.
|
||||
const currentUser = Meteor.user();
|
||||
const weekStartDay = currentUser ? currentUser.getStartDayOfWeek() : 1;
|
||||
|
||||
// Moments are mutable so they must be cloned before modification
|
||||
var thisWeekStart = moment().startOf('day').startOf('week').add(weekStartDay, 'days');
|
||||
var thisWeekEnd = thisWeekStart.clone().add(offset, 'week').endOf('day');
|
||||
var startDate = thisWeekStart.toDate();
|
||||
var endDate = thisWeekEnd.toDate();
|
||||
|
||||
if (offset >= 0) {
|
||||
this._filter = { $gte: startDate, $lte: endDate };
|
||||
} else {
|
||||
this._filter = { $lte: startDate, $gte: endDate };
|
||||
}
|
||||
|
||||
this._updateState('week');
|
||||
}
|
||||
|
||||
// noDate builds a filter for items where date is not set
|
||||
noDate() {
|
||||
if (this._filterState == 'noDate') { this.reset(); return; }
|
||||
this._filter = null;
|
||||
this._updateState('noDate');
|
||||
}
|
||||
|
||||
reset() {
|
||||
this._filter = null;
|
||||
this._filterState = null;
|
||||
this._dep.changed();
|
||||
}
|
||||
|
||||
isSelected(val) {
|
||||
this._dep.depend();
|
||||
return this._filterState == val;
|
||||
}
|
||||
|
||||
_isActive() {
|
||||
this._dep.depend();
|
||||
return this._filterState !== null;
|
||||
}
|
||||
|
||||
_getMongoSelector() {
|
||||
this._dep.depend();
|
||||
return this._filter;
|
||||
}
|
||||
|
||||
_getEmptySelector() {
|
||||
this._dep.depend();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Use a "set" filter for a field that is a set of documents uniquely
|
||||
// identified. For instance `{ labels: ['labelA', 'labelC', 'labelD'] }`.
|
||||
// use "subField" for searching inside object Fields.
|
||||
@@ -462,6 +581,7 @@ Filter = {
|
||||
assignees: new SetFilter(),
|
||||
archive: new SetFilter(),
|
||||
hideEmpty: new SetFilter(),
|
||||
dueAt: new DateFilter(),
|
||||
customFields: new SetFilter('_id'),
|
||||
advanced: new AdvancedFilter(),
|
||||
lists: new AdvancedFilter(), // we need the ability to filter list by name as well
|
||||
@@ -472,6 +592,7 @@ Filter = {
|
||||
'assignees',
|
||||
'archive',
|
||||
'hideEmpty',
|
||||
'dueAt',
|
||||
'customFields',
|
||||
],
|
||||
|
||||
|
||||
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+963
-955
File diff suppressed because it is too large.
Load diff
+9
-1
@@ -344,6 +344,12 @@
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filter",
|
||||
"filter-cards": "Karten oder Listen filtern",
|
||||
"filter-dates-label": "Nach Datum filtern",
|
||||
"filter-no-due-date": "Kein Fälligkeitsdatum",
|
||||
"filter-overdue": "Überfällig",
|
||||
"filter-due-today": "Heute fällig",
|
||||
"filter-due-this-week": "Diese Woche fällig",
|
||||
"filter-due-tomorrow": "Morgen fällig",
|
||||
"list-filter-label": "Liste nach Titel filtern",
|
||||
"filter-clear": "Filter entfernen",
|
||||
"filter-labels-label": "Nach Label filtern",
|
||||
@@ -998,5 +1004,7 @@
|
||||
"filesReportTitle": "Dateien-Bericht",
|
||||
"orphanedFilesReportTitle": "Verwaister Datei-Bericht",
|
||||
"reports": "Berichte",
|
||||
"rulesReportTitle": "Regeln-Bericht"
|
||||
"rulesReportTitle": "Regeln-Bericht",
|
||||
"copy-swimlane": "Kopiere Swimlane",
|
||||
"copySwimlanePopup-title": "Swimlane kopieren"
|
||||
}
|
||||
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+9
-1
@@ -344,6 +344,12 @@
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filter",
|
||||
"filter-cards": "Filter Cards or Lists",
|
||||
"filter-dates-label": "Filter by date",
|
||||
"filter-no-due-date": "No due date",
|
||||
"filter-overdue": "Overdue",
|
||||
"filter-due-today": "Due today",
|
||||
"filter-due-this-week": "Due this week",
|
||||
"filter-due-tomorrow": "Due tomorrow",
|
||||
"list-filter-label": "Filter List by Title",
|
||||
"filter-clear": "Clear filter",
|
||||
"filter-labels-label": "Filter by label",
|
||||
@@ -999,5 +1005,7 @@
|
||||
"filesReportTitle": "Files Report",
|
||||
"orphanedFilesReportTitle": "Orphaned Files Report",
|
||||
"reports": "Reports",
|
||||
"rulesReportTitle": "Rules Report"
|
||||
"rulesReportTitle": "Rules Report",
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane"
|
||||
}
|
||||
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+19
-11
@@ -344,6 +344,12 @@
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filtrer",
|
||||
"filter-cards": "Filtrer les cartes ou listes",
|
||||
"filter-dates-label": "Filtrer par date",
|
||||
"filter-no-due-date": "Pas de date d'échéance",
|
||||
"filter-overdue": "Échue",
|
||||
"filter-due-today": "Arrive à échéance aujourd'hui",
|
||||
"filter-due-this-week": "Arrive à échéance cette semaine",
|
||||
"filter-due-tomorrow": "Arrive à échéance demain",
|
||||
"list-filter-label": "Filtrer la liste par titre",
|
||||
"filter-clear": "Supprimer les filtres",
|
||||
"filter-labels-label": "Filtrer par étiquette",
|
||||
@@ -900,7 +906,7 @@
|
||||
"operator-member-abbrev": "m",
|
||||
"operator-assignee": "personne assignée",
|
||||
"operator-assignee-abbrev": "a",
|
||||
"operator-creator": "creator",
|
||||
"operator-creator": "créateur",
|
||||
"operator-status": "statut",
|
||||
"operator-due": "échéance",
|
||||
"operator-created": "créé",
|
||||
@@ -952,7 +958,7 @@
|
||||
"globalSearch-instructions-operator-at": "`__operator_user_abbrev__nom` - raccourci pour `__operator_user__:<nom>`",
|
||||
"globalSearch-instructions-operator-member": "`__operator_member__:<nom>` - cartes pour lesquelles l'utilisateur *<nom>* est *participant*",
|
||||
"globalSearch-instructions-operator-assignee": "`__operator_assignee__:<nom>` - cartes *assignées* à l'utilisateur *<nom>*",
|
||||
"globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator",
|
||||
"globalSearch-instructions-operator-creator": "`__operator_creator__:<utilisateur>` - cartes dont le créateur est *<utilisateur>*",
|
||||
"globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cartes qui arrive à échéance dans moins de *<n>* jours à partir d'aujourd'hui.\n`__operator_due__:__predicate_overdue__` liste toutes les cartes ayant passé la date d'échéance.",
|
||||
"globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cartes qui ont été créées il y a *<n>* jours ou moins",
|
||||
"globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cartes qui ont été modifiées il y a *<n>* jours ou moins",
|
||||
@@ -990,13 +996,15 @@
|
||||
"now-system-messages-of-all-users-are-hidden": "Les messages système de tous les utilisateurs seront dorénavant masqués",
|
||||
"move-swimlane": "Déplacer le couloir",
|
||||
"moveSwimlanePopup-title": "Déplacer le Couloir",
|
||||
"custom-field-stringtemplate": "String Template",
|
||||
"custom-field-stringtemplate-format": "Format (use %{value} as placeholder)",
|
||||
"custom-field-stringtemplate-separator": "Separator (use   or for a space)",
|
||||
"custom-field-stringtemplate-item-placeholder": "Press enter to add more items",
|
||||
"creator": "Creator",
|
||||
"filesReportTitle": "Files Report",
|
||||
"orphanedFilesReportTitle": "Orphaned Files Report",
|
||||
"reports": "Reports",
|
||||
"rulesReportTitle": "Rules Report"
|
||||
"custom-field-stringtemplate": "Modèle de chaîne",
|
||||
"custom-field-stringtemplate-format": "Format (utiliser %{valeur} pour marquer un emplacement)",
|
||||
"custom-field-stringtemplate-separator": "Séparateur (utiliser   ou pour un espace)",
|
||||
"custom-field-stringtemplate-item-placeholder": "Appuyez sur Entrée pour ajouter plus d'éléments",
|
||||
"creator": "Créateur",
|
||||
"filesReportTitle": "Rapports sur les fichiers",
|
||||
"orphanedFilesReportTitle": "Rapports sur les fichiers orphelins",
|
||||
"reports": "Rapports",
|
||||
"rulesReportTitle": "Rapports sur les règles",
|
||||
"copy-swimlane": "Copier le couloir",
|
||||
"copySwimlanePopup-title": "Copie de Couloir"
|
||||
}
|
||||
+1009
-1001
File diff suppressed because it is too large.
Load diff
+9
-1
@@ -344,6 +344,12 @@
|
||||
"list-label-short-sort": "(י)",
|
||||
"filter": "מסנן",
|
||||
"filter-cards": "סינון כרטיסים או רשימות",
|
||||
"filter-dates-label": "סינון לפי תאריך",
|
||||
"filter-no-due-date": "אין מועד סיום",
|
||||
"filter-overdue": "מועד הסיום עבר",
|
||||
"filter-due-today": "מועד הסיום הוא היום",
|
||||
"filter-due-this-week": "מועד הסיום הוא השבוע",
|
||||
"filter-due-tomorrow": "מועד הסיום הוא מחר",
|
||||
"list-filter-label": "סינון רשימה לפי כותרת",
|
||||
"filter-clear": "ניקוי המסנן",
|
||||
"filter-labels-label": "סינון לפי תווית",
|
||||
@@ -998,5 +1004,7 @@
|
||||
"filesReportTitle": "דוח קבצים",
|
||||
"orphanedFilesReportTitle": "דוח קבצים יתומים",
|
||||
"reports": "דוחות",
|
||||
"rulesReportTitle": "דוח כללים"
|
||||
"rulesReportTitle": "דוח כללים",
|
||||
"copy-swimlane": "העתקת מסלול",
|
||||
"copySwimlanePopup-title": "העתקת מסלול"
|
||||
}
|
||||
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+155
-11
@@ -144,7 +144,7 @@
|
||||
"board-view-collapse": "Slå sammen",
|
||||
"board-view-gantt": "Gantt",
|
||||
"board-view-lists": "Lister",
|
||||
"bucket-example": "Som \"Bucket List\" for eksempel",
|
||||
"bucket-example": "Som 'Bucket List' for eksempel",
|
||||
"cancel": "Avbryt",
|
||||
"card-archived": "Dette kortet er flyttet til Arkivet",
|
||||
"board-archived": "Denne tavlen er flyttet til Arkivet",
|
||||
@@ -207,7 +207,7 @@
|
||||
"clipboard": "Utklippstavle eller Dra og Slipp",
|
||||
"close": "Lukk",
|
||||
"close-board": "Lukk Tavle",
|
||||
"close-board-pop": "Du vil ha muligheten til å gjenopprette Tavle ved å klikke på \"Arkiv\"-knappen i hjem-menyen.",
|
||||
"close-board-pop": "Du vil ha muligheten til å gjenopprette Tavle ved å klikke på 'Arkiv'-knappen i hjem-menyen.",
|
||||
"color-black": "svart",
|
||||
"color-blue": "blå",
|
||||
"color-crimson": "høyrød",
|
||||
@@ -322,11 +322,15 @@
|
||||
"error-user-notAllowSelf": "Du kan ikke invitere deg selv",
|
||||
"error-user-notCreated": "Denne Brukeren er ikke opprettet",
|
||||
"error-username-taken": "Brukernavn allerede i bruk",
|
||||
"error-orgname-taken": "Navn på Organisasjon allerede benyttet",
|
||||
"error-teamname-taken": "Navn på Team allerede benyttet",
|
||||
"error-email-taken": "E-postadressen er allerede i bruk",
|
||||
"export-board": "Eksporter tavle",
|
||||
"export-board-json": "Eksporter tavle til JSON",
|
||||
"export-board-csv": "Eksporter tavle til CSV",
|
||||
"export-board-tsv": "Eksporter tavle til TSV",
|
||||
"export-board-excel": "Eksporter Tavle til Excel",
|
||||
"user-can-not-export-excel": "Bruker kan ikke eksportere til Excel",
|
||||
"export-board-html": "Eksporter tavle til HTML",
|
||||
"exportBoardPopup-title": "Eksporter tavle",
|
||||
"sort": "Sorter",
|
||||
@@ -340,6 +344,12 @@
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filtrer",
|
||||
"filter-cards": "Filtrer Kort eller Lister",
|
||||
"filter-dates-label": "Filtrer etter dato",
|
||||
"filter-no-due-date": "Ingen forfallsdato",
|
||||
"filter-overdue": "Forfalt",
|
||||
"filter-due-today": "Forfall i dag",
|
||||
"filter-due-this-week": "Forfall denne uke",
|
||||
"filter-due-tomorrow": "Forfall i morgen",
|
||||
"list-filter-label": "Filtrer Liste etter tittel",
|
||||
"filter-clear": "Fjern filter",
|
||||
"filter-labels-label": "Filtrer etter Etikett",
|
||||
@@ -382,6 +392,7 @@
|
||||
"import-csv-placeholder": "Lim inn gyldig CSV/TSV-data her",
|
||||
"import-map-members": "Tilknytt medlemmer",
|
||||
"import-members-map": "Importert Tavle har medlemmer. Vennligst tilknytt medlemmer som skal importeres til dine Brukere.",
|
||||
"import-members-map-note": "Merk: Ikke registrerte medlemmer vil bli lagt til nåværende bruker.",
|
||||
"import-show-user-mapping": "Gjennomgang tilknytning medlemmer",
|
||||
"import-user-select": "Velg eksisterende Bruker som skal tilknyttes dette Medlemmet",
|
||||
"importMapMembersAddPopup-title": "Velg Medlem",
|
||||
@@ -527,7 +538,9 @@
|
||||
"custom-login-logo-image-url": "Tilpass URL logo-bilde innlogging",
|
||||
"custom-login-logo-link-url": "Tilpass URL logo-link innlogging",
|
||||
"text-below-custom-login-logo": "Tekst under tilpasset logo innlogging",
|
||||
"automatic-linked-url-schemes": "Egendefinerte URL-tilordninger som automatisk skal kunne klikkes på. Kun én URL-tilordning per linje",
|
||||
"username": "Brukernavn",
|
||||
"import-usernames": "Importer Brukernavn",
|
||||
"view-it": "Se det",
|
||||
"warn-list-archived": "advarsel: dette kortet er i en liste i arkivet",
|
||||
"watch": "Overvåk",
|
||||
@@ -546,7 +559,7 @@
|
||||
"wipLimitErrorPopup-dialog-pt2": "Vennligst flytt noen oppgaver ut av denne listen eller sett høyere WIP-begrensning.",
|
||||
"admin-panel": "Admin-panel",
|
||||
"settings": "Innstillinger",
|
||||
"people": "Folk",
|
||||
"people": "Medlemmer",
|
||||
"registration": "Registrering",
|
||||
"disable-self-registration": "Deaktiver selvregistrering",
|
||||
"invite": "Inviter",
|
||||
@@ -599,7 +612,8 @@
|
||||
"minutes": "minutter",
|
||||
"seconds": "sekunder",
|
||||
"show-field-on-card": "Vis dette feltet på kort",
|
||||
"automatically-field-on-card": "Automatisk oppretting av felt på alle kort",
|
||||
"automatically-field-on-card": "Legg til felt på nye kort",
|
||||
"always-field-on-card": "Legg til felt på alle kort",
|
||||
"showLabel-field-on-card": "Vis feltetikett på minikort",
|
||||
"yes": "Ja",
|
||||
"no": "Nei",
|
||||
@@ -607,6 +621,7 @@
|
||||
"accounts-allowEmailChange": "Tillat endring e-post",
|
||||
"accounts-allowUserNameChange": "Tillat endring brukernavn",
|
||||
"createdAt": "Opprettet på",
|
||||
"modifiedAt": "Endret kl. ",
|
||||
"verified": "Verifisert",
|
||||
"active": "Aktiv",
|
||||
"card-received": "Mottatt",
|
||||
@@ -669,6 +684,7 @@
|
||||
"r-removed-from": "Fjernet fra",
|
||||
"r-the-board": "tavlen",
|
||||
"r-list": "listen",
|
||||
"list": "Liste",
|
||||
"set-filter": "Sett filter",
|
||||
"r-moved-to": "Flyttet til",
|
||||
"r-moved-from": "Flyttet fra",
|
||||
@@ -851,16 +867,144 @@
|
||||
"person": "Person",
|
||||
"my-cards": "Mine Kort",
|
||||
"card": "Kort",
|
||||
"list": "Liste",
|
||||
"board": "Tavle",
|
||||
"context-separator": "/",
|
||||
"myCardsSortChange-title": "Sortering mine Kort",
|
||||
"myCardsSortChangePopup-title": "Sortering mine Kort",
|
||||
"myCardsSortChange-choice-board": "På Tavle",
|
||||
"myCardsSortChange-choice-dueat": "På dato Varighet",
|
||||
"dueCards-title": "Due Cards",
|
||||
"dueCardsViewChange-title": "Due Cards View",
|
||||
"dueCardsViewChange-choice-me": "Me",
|
||||
"dueCardsViewChange-choice-all": "All Users",
|
||||
"dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.",
|
||||
"broken-cards": "Broken Cards"
|
||||
"dueCards-title": "Forfalte Kort",
|
||||
"dueCardsViewChange-title": "Oversikt Forfalte Kort",
|
||||
"dueCardsViewChangePopup-title": "Oversikt Forfalte Kort",
|
||||
"dueCardsViewChange-choice-me": "Meg",
|
||||
"dueCardsViewChange-choice-all": "Alle Brukere",
|
||||
"dueCardsViewChange-choice-all-description": "Viser alle kort som ikke er ferdigstilt, med \"Forfallsdato\" fra tavler som brukeren har rettigheter til.",
|
||||
"broken-cards": "Broken Cards",
|
||||
"board-title-not-found": "Tavle '%s' ikke funnet.",
|
||||
"swimlane-title-not-found": "Svømmebane '%s' ikke funnet.",
|
||||
"list-title-not-found": "Liste '%s' ikke funnet.",
|
||||
"label-not-found": "Merke '%s' ikke funnet.",
|
||||
"label-color-not-found": "Farge på Merke %s ikke funnet.",
|
||||
"user-username-not-found": "Brukernavn '%s' ikke funnet.",
|
||||
"comment-not-found": "Kort med kommentar som inneholder teksten '%s' ikke funnet.",
|
||||
"globalSearch-title": "Søk i alle Tavler.",
|
||||
"no-cards-found": "Ingen Kort funnet.",
|
||||
"one-card-found": "Ett Kort funnet.",
|
||||
"n-cards-found": "%s Kort funnet.",
|
||||
"n-n-of-n-cards-found": "__start__-__end__ av __total__ Kort funnet",
|
||||
"operator-board": "Tavle",
|
||||
"operator-board-abbrev": "t",
|
||||
"operator-swimlane": "svømmebane",
|
||||
"operator-swimlane-abbrev": "s",
|
||||
"operator-list": "listen",
|
||||
"operator-list-abbrev": "l",
|
||||
"operator-label": "etikett",
|
||||
"operator-label-abbrev": "#",
|
||||
"operator-user": "bruker",
|
||||
"operator-user-abbrev": "@",
|
||||
"operator-member": "Medlem",
|
||||
"operator-member-abbrev": "m",
|
||||
"operator-assignee": "Rettighetstaker",
|
||||
"operator-assignee-abbrev": "r",
|
||||
"operator-creator": "oppretter",
|
||||
"operator-status": "status",
|
||||
"operator-due": "forfall",
|
||||
"operator-created": "opprettet",
|
||||
"operator-modified": "endret",
|
||||
"operator-sort": "sorter",
|
||||
"operator-comment": "kommentar",
|
||||
"operator-has": "har",
|
||||
"operator-limit": "begens",
|
||||
"predicate-archived": "arkivert",
|
||||
"predicate-open": "åpne",
|
||||
"predicate-ended": "avsluttet",
|
||||
"predicate-all": "alle",
|
||||
"predicate-overdue": "forfalt",
|
||||
"predicate-week": "uke",
|
||||
"predicate-month": "måned",
|
||||
"predicate-quarter": "kvartal",
|
||||
"predicate-year": "år",
|
||||
"predicate-due": "forfall",
|
||||
"predicate-modified": "endret",
|
||||
"predicate-created": "opprettet",
|
||||
"predicate-attachment": "vedlegg",
|
||||
"predicate-description": "beskrivelse",
|
||||
"predicate-checklist": "sjekkliste",
|
||||
"predicate-start": "start",
|
||||
"predicate-end": "slutt",
|
||||
"predicate-assignee": "Rettighetstaker",
|
||||
"predicate-member": "Medlem",
|
||||
"predicate-public": "offentlig",
|
||||
"predicate-private": "privat",
|
||||
"operator-unknown-error": "%s er ikke en operator",
|
||||
"operator-number-expected": "operator __operator__ forventet et tall, mottok '__value__'",
|
||||
"operator-sort-invalid": "sortering av '%s' er ugyldig",
|
||||
"operator-status-invalid": "'%s' er ikke en gyldig status",
|
||||
"operator-has-invalid": "%s er ikke en gyldig kontroll av eksistens",
|
||||
"operator-limit-invalid": "%ser ikke en gyldig begrensning. Begrensning må være et positivt heltall.",
|
||||
"next-page": "Neste Side",
|
||||
"previous-page": "Forrige Side",
|
||||
"heading-notes": "Notater",
|
||||
"globalSearch-instructions-heading": "Søk etter Instruksjoner",
|
||||
"globalSearch-instructions-description": "Søk kan inkludere operatorer for å avgrense søket. Operatoren spesifiseres ved å skrive operatorens navn og verdi, atskilt med et kolon. For eksempel vil en spesifisering av operatoren `liste:Blokkert' begrense søket til Kort som er inkludert i en liste med navnet \"Blokkert\". Hvis verdien inneholder mellomrom eller spesialtegn, må den være spesifisert i anførselstegn (f.eks. `__operator_list__:\"To Review\"`).",
|
||||
"globalSearch-instructions-operators": "Tilgjengelige operatorer:",
|
||||
"globalSearch-instructions-operator-board": "`__operator_board__:<title>` - kort i tavlene samsvarer med angitt *<title>*",
|
||||
"globalSearch-instructions-operator-list": "`__operator_list__:<title>` - kort i listene stemmer med angitt *<title>*",
|
||||
"globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - kort i svømmebaner samsvarer med angitt *<title>*",
|
||||
"globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - kort med en kommetar inneholdende *<text>*.",
|
||||
"globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - kort med merke som samsvarer med *<color>* or *<name>",
|
||||
"globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - forkortelse for `__operator_label__:<color>` eller `__operator_label__:<name>`",
|
||||
"globalSearch-instructions-operator-user": "`__operator_user__:<username>` - kort hvor *<username>* ier et *medlemr* or *rettighetstaker*",
|
||||
"globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - forkortelse for bruker:<username>`",
|
||||
"globalSearch-instructions-operator-member": "`__operator_member__:<username>` - kort hvor *<username>* er et *medlem*",
|
||||
"globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - kort hvor *<username>* er en *rettighetstaker*",
|
||||
"globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - kort hvor *<username>* er kortenes oppretter",
|
||||
"globalSearch-instructions-operator-due": "`__operator_due__:<n>` - kort som forfaller om *<n>* dager fra nå. `__operator_due__:__predicate_overdue__ lister alle kort med passert forfallsdato.",
|
||||
"globalSearch-instructions-operator-created": "`__operator_created__:<n>` - kort som er opprettet *<n>* dager siden eller mindre",
|
||||
"globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - kort som er modifisert *<n>* dager siden eller mindre",
|
||||
"globalSearch-instructions-operator-status": "`__operator_status__:<status>` - hvor *<status>* er en av de følgende:",
|
||||
"globalSearch-instructions-status-archived": "`__predicate_archived__` - arkiverte kort",
|
||||
"globalSearch-instructions-status-all": "`__predicate_all__` - alle arkiverte eller ikke arkiverte kort",
|
||||
"globalSearch-instructions-status-ended": "`__predicate_ended__` - kort med en sluttdato",
|
||||
"globalSearch-instructions-status-public": "`__predicate_public__` - kort bare i offentlige tavler",
|
||||
"globalSearch-instructions-status-private": "`__predicate_private__` - kort bare i private tavler",
|
||||
"globalSearch-instructions-operator-has": "`__operator_has__:<field>` - hvor *<field>* er en av `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` eller `__predicate_member__`. Plassering av et `-` foran *<field>* søk i mangel på en verdi i et felt (f.eks. `har:-forfall` søker etter alle kort uten en forfallsdato).",
|
||||
"globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - hvor *<sort-name>* er en av `__predicate_due__`, `__predicate_created__` eller `__predicate_modified__`. For en synkende sortering, plassér en `-` foran navn på sortering.",
|
||||
"globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - hvor*<n>* er et positivt heltall som angir antall kort som skal vises på siden.",
|
||||
"globalSearch-instructions-notes-1": "Flere operatorer kan angis.",
|
||||
"globalSearch-instructions-notes-2": "Like operatorer er knyttet sammen med \"ELLER\". Kort som samsvarer med noen av de angitte kriteriene vil returneres.\n`__operator_list__:Tilgjengelig __operator_list__:Blokkert` vil returnere Kort som inneholder lister med navnet \"Blokkert\" eller \"Tilgjengelig\".",
|
||||
"globalSearch-instructions-notes-3": "Forskjellige operatorer er knyttet sammen med *OG*. Bare kort som samsvarer med alle de angitte kriteriene vil returneres. `__operator_list__:Tilgjengelig __operator_list__:rød` vil kun returnere kort i listen *Tilgjengelig* og som er markert med et *rødt* merke.",
|
||||
"globalSearch-instructions-notes-3-2": "Dager kan angis som et positivt eller negativt heltall, eller ved bruk av `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` eller `__predicate_year__` for den aktuelle perioden.",
|
||||
"globalSearch-instructions-notes-4": "Tekstsøk er ikke \"case\"-sensitive.",
|
||||
"globalSearch-instructions-notes-5": "Som standard er arkiverte kort ikke søkbare, ",
|
||||
"link-to-search": "Link til dette søket",
|
||||
"excel-font": "Arial",
|
||||
"number": "Nummer",
|
||||
"label-colors": "Farge Merke",
|
||||
"label-names": "Navn på Merke",
|
||||
"archived-at": "arkivert på",
|
||||
"sort-cards": "Sortér Kort",
|
||||
"cardsSortPopup-title": "Sortér Kort",
|
||||
"due-date": "Forfalldato",
|
||||
"server-error": "Serverfeil",
|
||||
"server-error-troubleshooting": "For hjelp til feilsøk ber vi om innsending av feilmelding generert av server.\nFor Snap-installasjon, kjør: `sudo snap logs wekan.wekan`\nFor Docker-installasjon, kjør: `sudo docker logs wekan-app`",
|
||||
"title-alphabetically": "Tittel (alfabetisk)",
|
||||
"created-at-newest-first": "Opprettet på (Nyeste Først)",
|
||||
"created-at-oldest-first": "Opprettet på (Eldste Først)",
|
||||
"links-heading": "Linker",
|
||||
"hide-system-messages-of-all-users": "Skjul systemmeldinger for alle brukere",
|
||||
"now-system-messages-of-all-users-are-hidden": "Systemmeldinger er nå skjult for alle brukere",
|
||||
"move-swimlane": "Flytt Svømmebane",
|
||||
"moveSwimlanePopup-title": "Flytt Svømmebane",
|
||||
"custom-field-stringtemplate": "Mal Tekststreng",
|
||||
"custom-field-stringtemplate-format": "Format (bruk %{value} som standardverdi)",
|
||||
"custom-field-stringtemplate-separator": "Tekstseparator (bruk   eller som separator)",
|
||||
"custom-field-stringtemplate-item-placeholder": "Trykk Enter for å legge til flere objekt",
|
||||
"creator": "Oppretter",
|
||||
"filesReportTitle": "Rapportering Filer",
|
||||
"orphanedFilesReportTitle": "Rapportering Foreldreløse Filer",
|
||||
"reports": "Rapportering",
|
||||
"rulesReportTitle": "Rapportering Regler",
|
||||
"copy-swimlane": "Kopiér Svømmebane",
|
||||
"copySwimlanePopup-title": "Kopiér Svømmebane"
|
||||
}
|
||||
+10
-2
@@ -172,7 +172,7 @@
|
||||
"card-edit-voting": "Wijzig stemming",
|
||||
"editVoteEndDatePopup-title": "Wijzig einddatum stemming",
|
||||
"allowNonBoardMembers": "Sta alle ingelogde gebruikers toe",
|
||||
"vote-question": "Stemvraag",
|
||||
"vote-question": "Vraag",
|
||||
"vote-public": "Toon wie wat gestemd heeft",
|
||||
"vote-for-it": "Voor",
|
||||
"vote-against": "tegen",
|
||||
@@ -344,6 +344,12 @@
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filter",
|
||||
"filter-cards": "Filter kaarten of lijsten",
|
||||
"filter-dates-label": "Filter op datum",
|
||||
"filter-no-due-date": "Geen vervaldatum",
|
||||
"filter-overdue": "verlopen",
|
||||
"filter-due-today": "Vervalt vandaag",
|
||||
"filter-due-this-week": "Vervalt deze week",
|
||||
"filter-due-tomorrow": "Vervalt morgen",
|
||||
"list-filter-label": "Filter lijst op titel",
|
||||
"filter-clear": "Wis filter",
|
||||
"filter-labels-label": "Filter op label",
|
||||
@@ -998,5 +1004,7 @@
|
||||
"filesReportTitle": "Bestanden Rapportage",
|
||||
"orphanedFilesReportTitle": "Verweesde Bestanden Rapportage",
|
||||
"reports": "Rapportages",
|
||||
"rulesReportTitle": "Regels Rapportage"
|
||||
"rulesReportTitle": "Regels Rapportage",
|
||||
"copy-swimlane": "Kopieer Swimlane",
|
||||
"copySwimlanePopup-title": "Kopieer Swimlane"
|
||||
}
|
||||
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
@@ -344,6 +344,12 @@
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filtrar",
|
||||
"filter-cards": "Filtrar Cartões ou Listas",
|
||||
"filter-dates-label": "Filtrar por data",
|
||||
"filter-no-due-date": "Sem prazo final",
|
||||
"filter-overdue": "Atrasado",
|
||||
"filter-due-today": "Para hoje",
|
||||
"filter-due-this-week": "Para nesta semana",
|
||||
"filter-due-tomorrow": "Para amanhã",
|
||||
"list-filter-label": "Filtrar Lista por Título",
|
||||
"filter-clear": "Limpar filtro",
|
||||
"filter-labels-label": "Filtrar por etiqueta",
|
||||
@@ -998,5 +1004,7 @@
|
||||
"filesReportTitle": "Relatório de Arquivos",
|
||||
"orphanedFilesReportTitle": "Relatório de Arquivos Órfãos",
|
||||
"reports": "Relatórios",
|
||||
"rulesReportTitle": "Regras de Relatório"
|
||||
"rulesReportTitle": "Regras de Relatório",
|
||||
"copy-swimlane": "Copiar Raia",
|
||||
"copySwimlanePopup-title": "Copiar Raia"
|
||||
}
|
||||
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+15
-7
@@ -344,6 +344,12 @@
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Фильтр",
|
||||
"filter-cards": "Фильтр Карточек или Списков",
|
||||
"filter-dates-label": "Фильтр по дате",
|
||||
"filter-no-due-date": "Без срока выполнения",
|
||||
"filter-overdue": "Просрочено",
|
||||
"filter-due-today": "Крайний срок - сегодня",
|
||||
"filter-due-this-week": "Крайний срок - эта неделя",
|
||||
"filter-due-tomorrow": "Крайний срок - завтра",
|
||||
"list-filter-label": "Фильтровать Список по Названию",
|
||||
"filter-clear": "Очистить фильтр",
|
||||
"filter-labels-label": "Фильтр по метке",
|
||||
@@ -900,7 +906,7 @@
|
||||
"operator-member-abbrev": "m",
|
||||
"operator-assignee": "Кому назначено",
|
||||
"operator-assignee-abbrev": "a",
|
||||
"operator-creator": "creator",
|
||||
"operator-creator": "автор",
|
||||
"operator-status": "статус",
|
||||
"operator-due": "выполнить к",
|
||||
"operator-created": "создано",
|
||||
@@ -992,11 +998,13 @@
|
||||
"moveSwimlanePopup-title": "Переместить дорожку",
|
||||
"custom-field-stringtemplate": "Строковый шаблон",
|
||||
"custom-field-stringtemplate-format": "Формат (используйте %{значение} для подстановки)",
|
||||
"custom-field-stringtemplate-separator": "Separator (use   or for a space)",
|
||||
"custom-field-stringtemplate-separator": "Разделитель (для пробела используйте   или )",
|
||||
"custom-field-stringtemplate-item-placeholder": "Press enter to add more items",
|
||||
"creator": "Creator",
|
||||
"filesReportTitle": "Files Report",
|
||||
"orphanedFilesReportTitle": "Orphaned Files Report",
|
||||
"reports": "Reports",
|
||||
"rulesReportTitle": "Rules Report"
|
||||
"creator": "Автор",
|
||||
"filesReportTitle": "Отчёт по файлам",
|
||||
"orphanedFilesReportTitle": "Отчёт по потерянным файлам",
|
||||
"reports": "Отчёты",
|
||||
"rulesReportTitle": "Отчёт по правилам",
|
||||
"copy-swimlane": "Скопировать дорожку",
|
||||
"copySwimlanePopup-title": "Скопировать дорожку"
|
||||
}
|
||||
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+1009
-1001
File diff suppressed because it is too large.
Load diff
+21
-26
@@ -641,37 +641,32 @@ Cards.helpers({
|
||||
);
|
||||
},
|
||||
|
||||
allSubtasks() {
|
||||
return Cards.find(
|
||||
{
|
||||
parentId: this._id,
|
||||
archived: false,
|
||||
},
|
||||
{
|
||||
sort: {
|
||||
sort: 1,
|
||||
},
|
||||
},
|
||||
);
|
||||
},
|
||||
|
||||
subtasksCount() {
|
||||
return Cards.find({
|
||||
parentId: this._id,
|
||||
archived: false,
|
||||
}).count();
|
||||
},
|
||||
|
||||
subtasksFinishedCount() {
|
||||
subtasksFinished() {
|
||||
return Cards.find({
|
||||
parentId: this._id,
|
||||
archived: true,
|
||||
}).count();
|
||||
});
|
||||
},
|
||||
|
||||
subtasksFinished() {
|
||||
const finishCount = this.subtasksFinishedCount();
|
||||
return finishCount > 0 && this.subtasksCount() === finishCount;
|
||||
allSubtasks() {
|
||||
return Cards.find({
|
||||
parentId: this._id
|
||||
});
|
||||
},
|
||||
|
||||
subtasksCount() {
|
||||
const subtasks = this.subtasks();
|
||||
return subtasks.count();
|
||||
},
|
||||
|
||||
subtasksFinishedCount() {
|
||||
const subtasksArchived = this.subtasksFinished();
|
||||
return subtasksArchived.count();
|
||||
},
|
||||
|
||||
allSubtasksCount() {
|
||||
const allSubtasks = this.allSubtasks();
|
||||
return allSubtasks.count();
|
||||
},
|
||||
|
||||
allowsSubtasks() {
|
||||
|
||||
+27
-4
@@ -239,7 +239,7 @@ export class ExporterExcel {
|
||||
},
|
||||
{
|
||||
key: 'c',
|
||||
width: 20,
|
||||
width: 60,
|
||||
},
|
||||
{
|
||||
key: 'd',
|
||||
@@ -342,6 +342,10 @@ export class ExporterExcel {
|
||||
key: 'p',
|
||||
width: 20,
|
||||
},
|
||||
{
|
||||
key: 'q',
|
||||
width: 20,
|
||||
},
|
||||
];
|
||||
|
||||
//add title line
|
||||
@@ -378,10 +382,23 @@ export class ExporterExcel {
|
||||
for (const klist in result.lists) {
|
||||
jlist[result.lists[klist]._id] = result.lists[klist].title;
|
||||
}
|
||||
//get kanban swimlanes info
|
||||
const jswimlane = {};
|
||||
for (const kswimlane in result.swimlanes) {
|
||||
jswimlane[result.swimlanes[kswimlane]._id] = result.swimlanes[kswimlane].title;
|
||||
}
|
||||
//get kanban label info
|
||||
const jlabel = {};
|
||||
for (const klabel in result.labels) {
|
||||
jlabel[result.labels[klabel]._id] = result.labels[klabel].name;
|
||||
var isFirst = 1;
|
||||
for (const klabel in result.labels){
|
||||
console.log(klabel);
|
||||
if (isFirst == 0){
|
||||
jlabel[result.labels[klabel]._id] = `,${result.labels[klabel].name}`;
|
||||
}
|
||||
else{
|
||||
isFirst = 0;
|
||||
jlabel[result.labels[klabel]._id] = result.labels[klabel].name;
|
||||
}
|
||||
}
|
||||
//add data +8 hours
|
||||
function addTZhours(jdate) {
|
||||
@@ -413,7 +430,7 @@ export class ExporterExcel {
|
||||
size: 10,
|
||||
bold: true,
|
||||
};
|
||||
ws.mergeCells('F3:P3');
|
||||
ws.mergeCells('F3:Q3');
|
||||
ws.getCell('B3').style = {
|
||||
font: {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
@@ -487,6 +504,7 @@ export class ExporterExcel {
|
||||
];
|
||||
//add card title
|
||||
//ws.addRow().values = ['编号', '标题', '创建人', '创建时间', '更新时间', '列表', '成员', '描述', '标签'];
|
||||
//this is where order in which the excel file generates
|
||||
ws.addRow().values = [
|
||||
TAPi18n.__('number'),
|
||||
TAPi18n.__('title'),
|
||||
@@ -499,6 +517,7 @@ export class ExporterExcel {
|
||||
TAPi18n.__('card-due'),
|
||||
TAPi18n.__('card-end'),
|
||||
TAPi18n.__('list'),
|
||||
TAPi18n.__('swimlane'),
|
||||
TAPi18n.__('assignee'),
|
||||
TAPi18n.__('members'),
|
||||
TAPi18n.__('labels'),
|
||||
@@ -522,6 +541,7 @@ export class ExporterExcel {
|
||||
allBorder('N5');
|
||||
allBorder('O5');
|
||||
allBorder('P5');
|
||||
allBorder('Q5');
|
||||
cellCenter('A5');
|
||||
cellCenter('B5');
|
||||
cellCenter('C5');
|
||||
@@ -538,6 +558,7 @@ export class ExporterExcel {
|
||||
cellCenter('N5');
|
||||
cellCenter('O5');
|
||||
cellCenter('P5');
|
||||
cellCenter('Q5');
|
||||
ws.getRow(5).font = {
|
||||
name: TAPi18n.__('excel-font'),
|
||||
size: 12,
|
||||
@@ -580,6 +601,7 @@ export class ExporterExcel {
|
||||
addTZhours(jcard.dueAt),
|
||||
addTZhours(jcard.endAt),
|
||||
jlist[jcard.listId],
|
||||
jswimlane[jcard.swimlaneId],
|
||||
jcassig,
|
||||
jcmem,
|
||||
jclabel,
|
||||
@@ -604,6 +626,7 @@ export class ExporterExcel {
|
||||
allBorder(`N${y}`);
|
||||
allBorder(`O${y}`);
|
||||
allBorder(`P${y}`);
|
||||
allBorder(`Q${y}`);
|
||||
cellCenter(`A${y}`);
|
||||
ws.getCell(`B${y}`).alignment = {
|
||||
wrapText: true,
|
||||
|
||||
@@ -147,6 +147,45 @@ Swimlanes.helpers({
|
||||
});
|
||||
},
|
||||
|
||||
move(toBoardId) {
|
||||
this.lists().forEach(list => {
|
||||
const toList = Lists.findOne({
|
||||
boardId: toBoardId,
|
||||
title: list.title,
|
||||
archived: false,
|
||||
});
|
||||
|
||||
let toListId;
|
||||
if (toList) {
|
||||
toListId = toList._id;
|
||||
} else {
|
||||
toListId = Lists.insert({
|
||||
title: list.title,
|
||||
boardId: toBoardId,
|
||||
type: list.type,
|
||||
archived: false,
|
||||
wipLimit: list.wipLimit,
|
||||
});
|
||||
}
|
||||
|
||||
Cards.find({
|
||||
listId: list._id,
|
||||
swimlaneId: this._id,
|
||||
}).forEach(card => {
|
||||
card.move(toBoardId, this._id, toListId);
|
||||
});
|
||||
});
|
||||
|
||||
Swimlanes.update(this._id, {
|
||||
$set: {
|
||||
boardId: toBoardId,
|
||||
},
|
||||
});
|
||||
|
||||
// make sure there is a default swimlane
|
||||
this.board().getDefaultSwimline();
|
||||
},
|
||||
|
||||
cards() {
|
||||
return Cards.find(
|
||||
Filter.mongoSelector({
|
||||
|
||||
+13
-11
@@ -208,17 +208,19 @@ export class TrelloCreator {
|
||||
}
|
||||
});
|
||||
}
|
||||
trelloBoard.labels.forEach(label => {
|
||||
const labelToCreate = {
|
||||
_id: Random.id(6),
|
||||
color: label.color ? label.color : 'black',
|
||||
name: label.name,
|
||||
};
|
||||
// We need to remember them by Trello ID, as this is the only ref we have
|
||||
// when importing cards.
|
||||
this.labels[label.id] = labelToCreate._id;
|
||||
boardToCreate.labels.push(labelToCreate);
|
||||
});
|
||||
if (trelloBoard.labels) {
|
||||
trelloBoard.labels.forEach(label => {
|
||||
const labelToCreate = {
|
||||
_id: Random.id(6),
|
||||
color: label.color ? label.color : 'black',
|
||||
name: label.name,
|
||||
};
|
||||
// We need to remember them by Trello ID, as this is the only ref we have
|
||||
// when importing cards.
|
||||
this.labels[label.id] = labelToCreate._id;
|
||||
boardToCreate.labels.push(labelToCreate);
|
||||
});
|
||||
}
|
||||
const boardId = Boards.direct.insert(boardToCreate);
|
||||
Boards.direct.update(boardId, { $set: { modifiedAt: this._now() } });
|
||||
// log activity
|
||||
|
||||
@@ -607,6 +607,9 @@ class SchemaProperty(object):
|
||||
|
||||
# deal with subschemas
|
||||
if '.' in name:
|
||||
subschema = name.split('.')[0]
|
||||
subschema = subschema.capitalize()
|
||||
|
||||
if name.endswith('$'):
|
||||
# reference in reference
|
||||
subschema = ''.join([n.capitalize() for n in self.name.split('.')[:-1]])
|
||||
@@ -621,9 +624,12 @@ class SchemaProperty(object):
|
||||
print(''' {}:
|
||||
type: object'''.format(subschema))
|
||||
return current_schema
|
||||
elif '$' in name:
|
||||
# In the form of 'profile.notifications.$.activity'
|
||||
subschema = name[:name.index('$') - 1] # 'profile.notifications'
|
||||
subschema = ''.join([s.capitalize() for s in subschema.split('.')])
|
||||
|
||||
subschema = name.split('.')[0]
|
||||
schema_name = self.schema.name + subschema.capitalize()
|
||||
schema_name = self.schema.name + subschema
|
||||
name = name.split('.')[-1]
|
||||
|
||||
if current_schema != schema_name:
|
||||
@@ -755,7 +761,7 @@ class Schemas(object):
|
||||
# then print the references
|
||||
current = None
|
||||
required_properties = []
|
||||
properties = [f for f in self.fields if '.' in f.name and not f.name.endswith('$')]
|
||||
properties = [f for f in self.fields if '.' in f.name and not '$' in f.name]
|
||||
for prop in properties:
|
||||
current = prop.print_openapi(6, current, required_properties)
|
||||
|
||||
@@ -766,7 +772,7 @@ class Schemas(object):
|
||||
|
||||
required_properties = []
|
||||
# then print the references in the references
|
||||
for prop in [f for f in self.fields if '.' in f.name and f.name.endswith('$')]:
|
||||
for prop in [f for f in self.fields if '.' in f.name and '$' in f.name]:
|
||||
current = prop.print_openapi(6, current, required_properties)
|
||||
|
||||
if required_properties:
|
||||
|
||||
Generated
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v5.22.0",
|
||||
"version": "v5.26.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v5.22.0",
|
||||
"version": "v5.26.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
+119
-75
@@ -7,7 +7,7 @@
|
||||
<meta charset="utf-8">
|
||||
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<title>Wekan REST API v5.22</title>
|
||||
<title>Wekan REST API v5.26</title>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@@ -1486,6 +1486,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
|
||||
<!-- backwards compatibility -->
|
||||
<!-- backwards compatibility -->
|
||||
<!-- backwards compatibility -->
|
||||
<!-- backwards compatibility -->
|
||||
<!-- backwards compatibility -->
|
||||
</head>
|
||||
|
||||
@@ -1549,7 +1550,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
|
||||
<ul class="toc-list-h1">
|
||||
|
||||
<li>
|
||||
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v5.22">Wekan REST API v5.22</a>
|
||||
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v5.26">Wekan REST API v5.26</a>
|
||||
|
||||
</li>
|
||||
|
||||
@@ -2062,11 +2063,6 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="#tocs_usersemails" class="toc-h2 toc-link" data-title="">UsersEmails</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="#tocs_usersprofile" class="toc-h2 toc-link" data-title="">UsersProfile</a>
|
||||
|
||||
@@ -2077,6 +2073,16 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="#tocs_usersemails" class="toc-h2 toc-link" data-title="">UsersEmails</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="#tocs_usersprofilenotifications" class="toc-h2 toc-link" data-title="">UsersProfileNotifications</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</li>
|
||||
@@ -2092,7 +2098,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
|
||||
<div class="page-wrapper">
|
||||
<div class="dark-box"></div>
|
||||
<div class="content">
|
||||
<h1 id="wekan-rest-api">Wekan REST API v5.22</h1>
|
||||
<h1 id="wekan-rest-api">Wekan REST API v5.26</h1>
|
||||
<blockquote>
|
||||
<p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
|
||||
</blockquote>
|
||||
@@ -15915,9 +15921,12 @@ System.out.println(response.toString());
|
||||
<span class="hljs-string">"string"</span>
|
||||
],
|
||||
<span class="hljs-attr">"language"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"notifications"</span>: [],
|
||||
<span class="hljs-attr">"activity"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"read"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"notifications"</span>: [
|
||||
{
|
||||
<span class="hljs-attr">"activity"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"read"</span>: <span class="hljs-string">"string"</span>
|
||||
}
|
||||
],
|
||||
<span class="hljs-attr">"showCardsCountAt"</span>: <span class="hljs-number">0</span>,
|
||||
<span class="hljs-attr">"startDayOfWeek"</span>: <span class="hljs-number">0</span>,
|
||||
<span class="hljs-attr">"starredBoards"</span>: [
|
||||
@@ -16653,9 +16662,12 @@ System.out.println(response.toString());
|
||||
<span class="hljs-string">"string"</span>
|
||||
],
|
||||
<span class="hljs-attr">"language"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"notifications"</span>: [],
|
||||
<span class="hljs-attr">"activity"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"read"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"notifications"</span>: [
|
||||
{
|
||||
<span class="hljs-attr">"activity"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"read"</span>: <span class="hljs-string">"string"</span>
|
||||
}
|
||||
],
|
||||
<span class="hljs-attr">"showCardsCountAt"</span>: <span class="hljs-number">0</span>,
|
||||
<span class="hljs-attr">"startDayOfWeek"</span>: <span class="hljs-number">0</span>,
|
||||
<span class="hljs-attr">"starredBoards"</span>: [
|
||||
@@ -20434,9 +20446,12 @@ UserSecurity
|
||||
<span class="hljs-string">"string"</span>
|
||||
],
|
||||
<span class="hljs-attr">"language"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"notifications"</span>: [],
|
||||
<span class="hljs-attr">"activity"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"read"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"notifications"</span>: [
|
||||
{
|
||||
<span class="hljs-attr">"activity"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"read"</span>: <span class="hljs-string">"string"</span>
|
||||
}
|
||||
],
|
||||
<span class="hljs-attr">"showCardsCountAt"</span>: <span class="hljs-number">0</span>,
|
||||
<span class="hljs-attr">"startDayOfWeek"</span>: <span class="hljs-number">0</span>,
|
||||
<span class="hljs-attr">"starredBoards"</span>: [
|
||||
@@ -20572,45 +20587,6 @@ UserSecurity
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="tocs_usersemails">UsersEmails</h2>
|
||||
<p><a id="schemausersemails"></a>
|
||||
<a id="schema_UsersEmails"></a>
|
||||
<a id="tocSusersemails"></a>
|
||||
<a id="tocsusersemails"></a></p>
|
||||
<pre class="highlight tab tab-json"><code>{
|
||||
<span class="hljs-attr">"address"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"verified"</span>: <span class="hljs-literal">true</span>
|
||||
}
|
||||
|
||||
</code></pre>
|
||||
<h3 id="properties-18">Properties</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Type</th>
|
||||
<th>Required</th>
|
||||
<th>Restrictions</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>address</td>
|
||||
<td>string</td>
|
||||
<td>true</td>
|
||||
<td>none</td>
|
||||
<td>The email address</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>verified</td>
|
||||
<td>boolean</td>
|
||||
<td>true</td>
|
||||
<td>none</td>
|
||||
<td>Has the email been verified</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="tocs_usersprofile">UsersProfile</h2>
|
||||
<p><a id="schemausersprofile"></a>
|
||||
<a id="schema_UsersProfile"></a>
|
||||
@@ -20631,9 +20607,12 @@ UserSecurity
|
||||
<span class="hljs-string">"string"</span>
|
||||
],
|
||||
<span class="hljs-attr">"language"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"notifications"</span>: [],
|
||||
<span class="hljs-attr">"activity"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"read"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"notifications"</span>: [
|
||||
{
|
||||
<span class="hljs-attr">"activity"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"read"</span>: <span class="hljs-string">"string"</span>
|
||||
}
|
||||
],
|
||||
<span class="hljs-attr">"showCardsCountAt"</span>: <span class="hljs-number">0</span>,
|
||||
<span class="hljs-attr">"startDayOfWeek"</span>: <span class="hljs-number">0</span>,
|
||||
<span class="hljs-attr">"starredBoards"</span>: [
|
||||
@@ -20649,7 +20628,7 @@ UserSecurity
|
||||
}
|
||||
|
||||
</code></pre>
|
||||
<h3 id="properties-19">Properties</h3>
|
||||
<h3 id="properties-18">Properties</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -20739,20 +20718,6 @@ UserSecurity
|
||||
<td>enabled notifications for the user</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>activity</td>
|
||||
<td>string</td>
|
||||
<td>true</td>
|
||||
<td>none</td>
|
||||
<td>The id of the activity this notification references</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>read</td>
|
||||
<td>string</td>
|
||||
<td>false</td>
|
||||
<td>none</td>
|
||||
<td>the date on which this notification was read</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>showCardsCountAt</td>
|
||||
<td>number</td>
|
||||
<td>false</td>
|
||||
@@ -20882,7 +20847,7 @@ UserSecurity
|
||||
}
|
||||
|
||||
</code></pre>
|
||||
<h3 id="properties-20">Properties</h3>
|
||||
<h3 id="properties-19">Properties</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -20910,6 +20875,84 @@ UserSecurity
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="tocs_usersemails">UsersEmails</h2>
|
||||
<p><a id="schemausersemails"></a>
|
||||
<a id="schema_UsersEmails"></a>
|
||||
<a id="tocSusersemails"></a>
|
||||
<a id="tocsusersemails"></a></p>
|
||||
<pre class="highlight tab tab-json"><code>{
|
||||
<span class="hljs-attr">"address"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"verified"</span>: <span class="hljs-literal">true</span>
|
||||
}
|
||||
|
||||
</code></pre>
|
||||
<h3 id="properties-20">Properties</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Type</th>
|
||||
<th>Required</th>
|
||||
<th>Restrictions</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>address</td>
|
||||
<td>string</td>
|
||||
<td>true</td>
|
||||
<td>none</td>
|
||||
<td>The email address</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>verified</td>
|
||||
<td>boolean</td>
|
||||
<td>true</td>
|
||||
<td>none</td>
|
||||
<td>Has the email been verified</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="tocs_usersprofilenotifications">UsersProfileNotifications</h2>
|
||||
<p><a id="schemausersprofilenotifications"></a>
|
||||
<a id="schema_UsersProfileNotifications"></a>
|
||||
<a id="tocSusersprofilenotifications"></a>
|
||||
<a id="tocsusersprofilenotifications"></a></p>
|
||||
<pre class="highlight tab tab-json"><code>{
|
||||
<span class="hljs-attr">"activity"</span>: <span class="hljs-string">"string"</span>,
|
||||
<span class="hljs-attr">"read"</span>: <span class="hljs-string">"string"</span>
|
||||
}
|
||||
|
||||
</code></pre>
|
||||
<h3 id="properties-21">Properties</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Type</th>
|
||||
<th>Required</th>
|
||||
<th>Restrictions</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>activity</td>
|
||||
<td>string</td>
|
||||
<td>true</td>
|
||||
<td>none</td>
|
||||
<td>The id of the activity this notification references</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>read</td>
|
||||
<td>string</td>
|
||||
<td>false</td>
|
||||
<td>none</td>
|
||||
<td>the date on which this notification was read</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- Renderer: Shins v2.6.0 -->
|
||||
<!-- Generator: Widdershins v4.0.1 -->
|
||||
<!-- backwards compatibility -->
|
||||
@@ -20931,6 +20974,7 @@ UserSecurity
|
||||
<!-- backwards compatibility -->
|
||||
<!-- backwards compatibility -->
|
||||
<!-- backwards compatibility -->
|
||||
<!-- backwards compatibility -->
|
||||
<!-- backwards compatibility -->
|
||||
</div>
|
||||
<div class="dark-box">
|
||||
|
||||
+28
-24
@@ -1,7 +1,7 @@
|
||||
swagger: '2.0'
|
||||
info:
|
||||
title: Wekan REST API
|
||||
version: v5.22
|
||||
version: v5.26
|
||||
description: |
|
||||
The REST API allows you to control and extend Wekan with ease.
|
||||
|
||||
@@ -3681,20 +3681,6 @@ definitions:
|
||||
- createdAt
|
||||
- modifiedAt
|
||||
- authenticationMethod
|
||||
UsersEmails:
|
||||
type: object
|
||||
properties:
|
||||
address:
|
||||
description: |
|
||||
The email address
|
||||
type: string
|
||||
verified:
|
||||
description: |
|
||||
Has the email been verified
|
||||
type: boolean
|
||||
required:
|
||||
- address
|
||||
- verified
|
||||
UsersProfile:
|
||||
type: object
|
||||
properties:
|
||||
@@ -3750,14 +3736,6 @@ definitions:
|
||||
type: array
|
||||
items:
|
||||
$ref: "#/definitions/UsersProfileNotifications"
|
||||
activity:
|
||||
description: |
|
||||
The id of the activity this notification references
|
||||
type: string
|
||||
read:
|
||||
description: |
|
||||
the date on which this notification was read
|
||||
type: string
|
||||
showCardsCountAt:
|
||||
description: |
|
||||
showCardCountAt field of the user
|
||||
@@ -3813,7 +3791,6 @@ definitions:
|
||||
Reference to the board templates swimlane Id
|
||||
type: string
|
||||
required:
|
||||
- activity
|
||||
- templatesBoardId
|
||||
- cardTemplatesSwimlaneId
|
||||
- listTemplatesSwimlaneId
|
||||
@@ -3829,3 +3806,30 @@ definitions:
|
||||
description: |
|
||||
last hit that was returned
|
||||
type: number
|
||||
UsersEmails:
|
||||
type: object
|
||||
properties:
|
||||
address:
|
||||
description: |
|
||||
The email address
|
||||
type: string
|
||||
verified:
|
||||
description: |
|
||||
Has the email been verified
|
||||
type: boolean
|
||||
required:
|
||||
- address
|
||||
- verified
|
||||
UsersProfileNotifications:
|
||||
type: object
|
||||
properties:
|
||||
activity:
|
||||
description: |
|
||||
The id of the activity this notification references
|
||||
type: string
|
||||
read:
|
||||
description: |
|
||||
the date on which this notification was read
|
||||
type: string
|
||||
required:
|
||||
- activity
|
||||
@@ -30,5 +30,8 @@ meteor-spk pack wekan-$1.spk
|
||||
# Publish Sandstorm Wekan to exprimental App Market
|
||||
spk publish wekan-$1.spk
|
||||
|
||||
# Upload spk to https://releases.wekan.team/sandstorm/
|
||||
scp wekan-$1.spk x2:/var/snap/wekan/common/releases.wekan.team/sandstorm/
|
||||
|
||||
# Delete old temporary build directory
|
||||
rm -rf ~/repos/wekan/.meteor-spk
|
||||
@@ -63,7 +63,7 @@ tx pull -f -l ka
|
||||
echo "German:"
|
||||
tx pull -f -l de
|
||||
|
||||
echo "German (Switzerland):"
|
||||
echo "German (Switzerland) => Deutsch (Schweiz):"
|
||||
tx pull -f -l de_CH
|
||||
|
||||
echo "Greek:"
|
||||
|
||||
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
|
||||
appTitle = (defaultText = "Wekan"),
|
||||
# The name of the app as it is displayed to the user.
|
||||
|
||||
appVersion = 522,
|
||||
appVersion = 526,
|
||||
# Increment this for every release.
|
||||
|
||||
appMarketingVersion = (defaultText = "5.22.0~2021-04-16"),
|
||||
appMarketingVersion = (defaultText = "5.26.0~2021-04-28"),
|
||||
# Human-readable presentation of the app version.
|
||||
|
||||
minUpgradableAppVersion = 0,
|
||||
|
||||
@@ -1,49 +1,28 @@
|
||||
Meteor.methods({
|
||||
copySwimlane(swimlaneId, toBoardId) {
|
||||
check(swimlaneId, String);
|
||||
check(toBoardId, String);
|
||||
|
||||
const swimlane = Swimlanes.findOne(swimlaneId);
|
||||
const toBoard = Boards.findOne(toBoardId);
|
||||
|
||||
if (swimlane && toBoard) {
|
||||
swimlane.copy(toBoardId);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
moveSwimlane(swimlaneId, toBoardId) {
|
||||
check(swimlaneId, String);
|
||||
check(toBoardId, String);
|
||||
|
||||
const swimlane = Swimlanes.findOne(swimlaneId);
|
||||
const fromBoard = Boards.findOne(swimlane.boardId);
|
||||
const toBoard = Boards.findOne(toBoardId);
|
||||
|
||||
if (swimlane && toBoard) {
|
||||
swimlane.lists().forEach(list => {
|
||||
const toList = Lists.findOne({
|
||||
boardId: toBoardId,
|
||||
title: list.title,
|
||||
archived: false,
|
||||
});
|
||||
|
||||
let toListId;
|
||||
if (toList) {
|
||||
toListId = toList._id;
|
||||
} else {
|
||||
toListId = Lists.insert({
|
||||
title: list.title,
|
||||
boardId: toBoardId,
|
||||
type: list.type,
|
||||
archived: false,
|
||||
wipLimit: list.wipLimit,
|
||||
});
|
||||
}
|
||||
|
||||
Cards.find({
|
||||
listId: list._id,
|
||||
swimlaneId,
|
||||
}).forEach(card => {
|
||||
card.move(toBoardId, swimlaneId, toListId);
|
||||
});
|
||||
});
|
||||
|
||||
Swimlanes.update(swimlaneId, {
|
||||
$set: {
|
||||
boardId: toBoardId,
|
||||
},
|
||||
});
|
||||
|
||||
// make sure there is a default swimlane
|
||||
fromBoard.getDefaultSwimline();
|
||||
swimlane.move(toBoardId);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,6 +1,5 @@
|
||||
name: wekan
|
||||
version: 0
|
||||
version-script: git describe --tags | cut -c 2-
|
||||
version: '5.26'
|
||||
summary: The open-source kanban
|
||||
description: |
|
||||
Wekan is an open-source and collaborative kanban board application.
|
||||
@@ -155,6 +154,7 @@ parts:
|
||||
README: README.wekan
|
||||
prime:
|
||||
- -lib/node_modules/node-pre-gyp/node_modules/tar/lib/.unpack.js.swp
|
||||
- -lib/node_modules/weka*
|
||||
|
||||
helpers:
|
||||
source: snap-src
|
||||
|
||||
@@ -99,7 +99,7 @@ services:
|
||||
- postgres
|
||||
- mongodb
|
||||
environment:
|
||||
- POSTGRES_PASSWORD
|
||||
- POSTGRES_PASSWORD=wekan
|
||||
- TORODB_SETUP=true
|
||||
- TORODB_SYNC_SOURCE=mongodb:27017
|
||||
- TORODB_BACKEND_HOST=postgres
|
||||
@@ -113,7 +113,7 @@ services:
|
||||
networks:
|
||||
- wekan-tier
|
||||
environment:
|
||||
- POSTGRES_PASSWORD
|
||||
- POSTGRES_PASSWORD=wekan
|
||||
ports:
|
||||
- "5432:5432"
|
||||
mongodb:
|
||||
|
||||
Reference in new issue
Block a user