diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index ccf161886..3f7418699 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -19,6 +19,7 @@ ENV \ ARCHITECTURE=linux-x64 \ SRC_PATH=./ \ WITH_API=true \ + RESULTS_PER_PAGE="" \ ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE=3 \ ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD=60 \ ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW=15 \ diff --git a/.gitignore b/.gitignore index 175c66dd2..7037d0625 100644 --- a/.gitignore +++ b/.gitignore @@ -31,5 +31,4 @@ Thumbs.db ehthumbs.db .eslintcache .meteor/local -.meteor-1.6-snap/.meteor/local .devcontainer/docker-compose.extend.yml diff --git a/.meteor/packages b/.meteor/packages index e34329808..69d9ba153 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -52,6 +52,7 @@ mquandalle:autofocus ongoworks:speakingurl raix:handlebar-helpers tap:i18n +http@1.4.2 # UI components blaze @@ -90,7 +91,6 @@ meteorhacks:aggregate@1.3.0 wekan-markdown konecty:mongo-counter percolate:synced-cron -easylogic:summernote cfs:filesystem tmeasday:check-npm-versions steffo:meteor-accounts-saml @@ -144,4 +144,4 @@ rajit:bootstrap3-datepicker-zh-cn rajit:bootstrap3-datepicker-zh-tw staringatlights:fast-render spacebars -jkuester:http +georgemccann:meteor-emoji-picker diff --git a/.meteor/versions b/.meteor/versions index 9e538cd4e..5fed3db63 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -56,7 +56,6 @@ ddp-server@2.3.2 deps@1.0.12 diff-sequence@1.1.1 dynamic-import@0.6.0 -easylogic:summernote@0.8.8 ecmascript@0.15.0 ecmascript-runtime@0.7.0 ecmascript-runtime-client@0.11.0 @@ -68,6 +67,7 @@ fastclick@1.0.13 fetch@0.1.1 fortawesome:fontawesome@4.7.0 geojson-utils@1.0.10 +georgemccann:meteor-emoji-picker@0.1.74 horka:swipebox@1.0.2 hot-code-push@1.0.4 html-tools@1.0.11 @@ -76,7 +76,6 @@ http@1.4.3 id-map@1.1.0 idmontie:migrations@1.0.3 inter-process-messaging@0.1.1 -jkuester:http@2.0.1 jquery@1.11.11 kadira:blaze-layout@2.3.0 kadira:dochead@1.5.0 @@ -227,7 +226,6 @@ templating-runtime@1.3.2 templating-tools@1.1.2 tmeasday:check-npm-versions@0.3.2 tracker@1.2.0 -twbs:bootstrap@3.3.6 ui@1.0.13 underscore@1.0.10 url@1.3.1 diff --git a/.tx/config b/.tx/config index ddf173871..f70912248 100644 --- a/.tx/config +++ b/.tx/config @@ -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, en_GB:en-GB, es_AR:es-AR, es_CL:es-CL, 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, 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 [wekan.application] file_filter = i18n/.i18n.json diff --git a/CHANGELOG.md b/CHANGELOG.md index e5013c784..52f95b495 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,137 @@ +# v5.14 2021-03-29 Wekan release + +This release adds the following new features: + +- [Clean-up Global Search, Due Cards, and My Cards. New environment variable `RESULTS_PER_PAGE` for search + results](https://github.com/wekan/wekan/pull/3676). + Thanks to jrsupplee. +- [Added environment variable `RESULTS_PER_PAGE` to all Wekan platforms](https://github.com/wekan/wekan/commit/ba05f383ca29211c5474e06c5ba6673e712afe7a). + Thanks to xet7. + +and adds the following updates: + +- [Updated release scripts](https://github.com/wekan/wekan/commit/59580e4b0f711ca55e8cb0d73803a4ff8b56352d). + Thanks to xet7. + +and fixes the following bugs: + +- [Require signed-in user for My Cards, Due Cards, and global search](https://github.com/wekan/wekan/pull/3677). + Thanks to jrsupplee. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.13 2021-03-28 Wekan release + +This release fixes the following bugs: + +- [Fixed Sandstorm Wekan attachments upload](https://github.com/wekan/wekan/commit/d4a1611b86521cd5913277cfa2c86c43958eec7b). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.12 2021-03-28 Wekan release + +This release fixes the following bugs: + +- [Fix HTTP not defined](https://github.com/wekan/wekan/commit/4c609161915cc46ebfccad3d9e7ffdecdef1f85c). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.11 2021-03-28 Wekan release + +This release adds the following new features: + +- [Added emoji picker to card description edit and card comment edit. + Removed and disabled Summernote wysiwyg editor, package-lock.json + etc](https://github.com/wekan/wekan/commit/84fde1ecfc81e89ed1895cab3bcb328e4f166a87). + Thanks to xet7. + +and adds the following updates: + +- [Updated dependencies. Fixed lint](https://github.com/wekan/wekan/commit/4e1c0fdce82e3b4add8c4ffd1832752181573e88). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.10 2021-03-28 Wekan release + +This release adds the following new features: + +- [Move swimlane from one board to another](https://github.com/wekan/wekan/pull/3674). + Thanks to jrsupplee. +- [Added translatable Move Swimlane popup title](https://github.com/wekan/wekan/commit/16665bccf912c5e907739c35f7ef5a376c81740e). + Thanks to xet7. +- [REST API: Export one attachment](https://github.com/wekan/wekan/pull/3673). + Thanks to vagnernascimento. + +and adds the following updates: + +- [Updated package-lock.json](https://github.com/wekan/wekan/commit/3145ec65a3defb8ac8d97aed7e43595f661f7100). + Thanks to developers of dependencies. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.09 2021-03-26 Wekan release + +This release adds the following improvements: + +- [Replace edit icon by plus-square on new links](https://github.com/wekan/wekan/pull/3671). + Thanks to sim51. + +and fixes the following bugs: + +- [Fix openapi docs generation](https://github.com/wekan/wekan/pull/3672). + Thanks to bentiss. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.08 2021-03-26 Wekan release + +This release adds the following new features: + +- [Admin Panel/Settings/Accounts: Hide system messages of all users](https://github.com/wekan/wekan/commit/a249ffc8054189d8e3db9b4c8f082cc7ce7dcb52). + Thanks to bbyszio, r4nc0r and xet7. + +and adds the following improvements: + +- [Add Trello attached links to the card description](https://github.com/wekan/wekan/pull/3669). + Thanks to jrsupplee. +- [Added package-lock.json and updated .gitignore](https://github.com/wekan/wekan/commit/d532a3591f338cec9a3839d43d9a1e9d69f59dc2). + Thanks to xet7. + +and adds the following new translations: + +- [Added translation: español de América Latina](https://github.com/wekan/wekan/commit/ccc9efb2703efda4e199a861920b9ec88e634b59). + Thanks to translators. + +and fixes the following bugs: + +- [Fix typos in translations](https://github.com/wekan/wekan/commit/a0e1b6f918dbb252a13db05d6b9e1f832c28654f). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.07 2021-03-19 Wekan release + +This release fixes the following bugs: + +- [Fixed sort cards feature](https://github.com/wekan/wekan/pull/3662). + Thanks to ednamaeG. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.06 2021-03-18 Wekan release + +This release fixes the following bugs: + +- [Fixed Bug: Calendar & parent cards URLs used absolute URLs](https://github.com/wekan/wekan/pull/3648). + Thanks to Majed6. +- [Fixed Bug: copy to clipboard uses pathname](https://github.com/wekan/wekan/pull/3661). + Thanks to Majed6. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v5.05 2021-03-11 Wekan release This release fixes the following bugs: diff --git a/Dockerfile b/Dockerfile index 1b936dbb9..4797fc8ee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build- ARCHITECTURE=linux-x64 \ SRC_PATH=./ \ WITH_API=true \ + RESULTS_PER_PAGE="" \ ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE=3 \ ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD=60 \ ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW=15 \ diff --git a/README.md b/README.md index 63086056c..8b7623d8c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/wekan/wekan) +[![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/wekan/wekan) # Wekan - Open Source kanban @@ -32,7 +32,7 @@ It's better than at chat where details get lost when chat scrolls up. ## FAQ -**NOTE**: +**NOTE**: - Please read the [FAQ](https://github.com/wekan/wekan/wiki/FAQ) first - Please don't feed the [trolls](https://github.com/wekan/wekan/wiki/FAQ#why-am-i-called-a-troll) and [spammers](https://github.com/wekan/wekan/wiki/FAQ#why-am-i-called-a-spammer) that are mentioned in the FAQ :) @@ -52,7 +52,7 @@ that by providing one-click installation on various platforms. - Wekan is used in [most countries of the world](https://snapcraft.io/wekan). - Wekan largest user has 13k users using Wekan in their company. -- Wekan has been [translated](https://transifex.com/wekan/wekan) to about 61 languages. +- Wekan has been [translated](https://transifex.com/wekan/wekan) to about 62 languages. - [Features][features]: Wekan has real-time user interface. - [Platforms][platforms]: Wekan supports many platforms. Wekan is critical part of new platforms Wekan is currently being integrated to. @@ -64,7 +64,7 @@ that by providing one-click installation on various platforms. [More Platforms](https://github.com/wekan/wekan/wiki/Platforms), bundle for RasPi3 ARM and other CPUs where Node.js and MongoDB exists. - 1 GB RAM minimum free for Wekan. Production server should have minimum total 4 GB RAM. For thousands of users, for example with [Docker](https://github.com/wekan/wekan/blob/master/docker-compose.yml): 3 frontend servers, - each having 2 CPU and 2 wekan-app containers. One backend wekan-db server with many CPUs. + each having 2 CPU and 2 wekan-app containers. One backend wekan-db server with many CPUs. - Enough disk space and alerts about low disk space. If you run out disk space, MongoDB database gets corrupted. - SECURITY: Updating to newest Wekan version very often. Please check you do not have automatic updates of Sandstorm or Snap turned off. Old versions have security issues because of old versions Node.js etc. Only newest Wekan is supported. diff --git a/Stackerfile.yml b/Stackerfile.yml index 076d270c1..69eec282a 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v5.05.0" +appVersion: "v5.14.0" files: userUploads: - README.md diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js index b08de3384..900931d05 100644 --- a/client/components/boards/boardBody.js +++ b/client/components/boards/boardBody.js @@ -360,7 +360,7 @@ BlazeComponent.extendComponent({ end: end || card.endAt, allDay: Math.abs(end.getTime() - start.getTime()) / 1000 === 24 * 3600, - url: FlowRouter.url('card', { + url: FlowRouter.path('card', { boardId: currentBoard._id, slug: currentBoard.slug, cardId: card._id, diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index ed22ac0d2..7bf32a05d 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -130,7 +130,7 @@ BlazeComponent.extendComponent({ Filter.reset(); }, 'click .js-sort-reset'() { - Session.set('sortBy','') + Session.set('sortBy', ''); }, 'click .js-open-search-view'() { Sidebar.setView('search'); @@ -165,9 +165,9 @@ Template.boardHeaderBar.helpers({ boardView() { return Utils.boardView(); }, - isSortActive(){ + isSortActive() { return Session.get('sortBy') ? true : false; - } + }, }); Template.boardChangeViewPopup.events({ @@ -412,7 +412,7 @@ BlazeComponent.extendComponent({ Session.set('sortBy', sortBy); sortCardsBy.set(TAPi18n.__('date-created-oldest-first')); Popup.close(); - } + }, }, ]; }, diff --git a/client/components/cards/cardDescription.jade b/client/components/cards/cardDescription.jade index 8aff284dd..67d20b073 100644 --- a/client/components/cards/cardDescription.jade +++ b/client/components/cards/cardDescription.jade @@ -3,5 +3,5 @@ template(name="descriptionForm") .new-description.js-new-description( class="{{#if descriptionFormIsOpen}}is-open{{/if}}") form.js-new-description-form - +editor(class="js-new-description-input" data-meteor-emoji-large="true" autofocus="autofocus") + +editor(class="js-new-description-input" autofocus="autofocus") | {{getUnsavedValue 'cardDescription' _id getDescription}} diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index bd8a8346a..245ab773d 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -12,7 +12,6 @@ template(name="cardDetails") a.fa.fa-link.card-copy-button.js-copy-link( class="fa-link" title="{{_ 'copy-card-link-to-clipboard'}}" - value="{{ originRelativeUrl }}" ) if isMiniScreen a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 832007f6d..c745f0730 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -114,7 +114,7 @@ BlazeComponent.extendComponent({ if (card) { const board = Boards.findOne(card.boardId); if (board) { - result = FlowRouter.url('card', { + result = FlowRouter.path('card', { boardId: card.boardId, slug: board.slug, cardId: card._id, @@ -291,6 +291,8 @@ BlazeComponent.extendComponent({ }, 'click .js-copy-link'() { StringToCopyElement = document.getElementById('cardURL_copy'); + StringToCopyElement.value = + window.location.origin + window.location.pathname; StringToCopyElement.select(); if (document.execCommand('copy')) { StringToCopyElement.blur(); diff --git a/client/components/cards/resultCard.jade b/client/components/cards/resultCard.jade index 6cff985aa..cf001532b 100644 --- a/client/components/cards/resultCard.jade +++ b/client/components/cards/resultCard.jade @@ -6,8 +6,12 @@ template(name="resultCard") ul.result-card-context-list li.result-card-context(title="{{_ 'board'}}") .result-card-block-wrapper - +viewer - = getBoard.title + if boardId + +viewer + = getBoard.title + else + .broken-cards-null + | NULL if getBoard.archived i.fa.fa-archive li.result-card-context.result-card-context-separator @@ -16,8 +20,12 @@ template(name="resultCard") = ' ' li.result-card-context(title="{{_ 'swimlane'}}") .result-card-block-wrapper - +viewer - = getSwimlane.title + if swimlaneId + +viewer + = getSwimlane.title + else + .broken-cards-null + | NULL if getSwimlane.archived i.fa.fa-archive li.result-card-context.result-card-context-separator @@ -26,7 +34,11 @@ template(name="resultCard") = ' ' li.result-card-context(title="{{_ 'list'}}") .result-card-block-wrapper - +viewer - = getList.title + if listId + +viewer + = getList.title + else + .broken-cards-null + | NULL if getList.archived i.fa.fa-archive diff --git a/client/components/main/brokenCards.jade b/client/components/main/brokenCards.jade index 6986f31dd..9d5828905 100644 --- a/client/components/main/brokenCards.jade +++ b/client/components/main/brokenCards.jade @@ -3,39 +3,15 @@ template(name="brokenCardsHeaderBar") | {{_ 'broken-cards'}} template(name="brokenCards") - .wrapper - .broken-cards-wrapper - each card in brokenCardsList - .broken-cards-card-wrapper - .broken-cards-card-title - = card.title - ul.broken-cards-context-list - li.broken-cards-context(title="{{_ 'board'}}") - if card.boardId - +viewer - = card.getBoard.title - else - .broken-cards-null - | NULL - li.broken-cards-context.broken-cards-context-separator - = ' ' - | {{_ 'context-separator'}} - = ' ' - li.broken-cards-context(title="{{_ 'swimlane'}}") - if card.swimlaneId - +viewer - = card.getSwimlane.title - else - .broken-cards-null - | NULL - li.broken-cards-context - = ' ' - | {{_ 'context-separator'}} - = ' ' - li.broken-cards-context(title="{{_ 'list'}}") - if card.listId - +viewer - = card.getList.title - else - .broken-cards-null - | NULL + if currentUser + if searching.get + +spinner + else if hasResults.get + .global-search-results-list-wrapper + if hasQueryErrors.get + div + each msg in errorMessages + span.global-search-error-messages + = msg + else + +resultsPaged(this) diff --git a/client/components/main/brokenCards.js b/client/components/main/brokenCards.js index 6348a50ed..17d30f37c 100644 --- a/client/components/main/brokenCards.js +++ b/client/components/main/brokenCards.js @@ -1,3 +1,5 @@ +import { CardSearchPagedComponent } from '../../lib/cardSearch'; + BlazeComponent.extendComponent({}).register('brokenCardsHeaderBar'); Template.brokenCards.helpers({ @@ -6,23 +8,11 @@ Template.brokenCards.helpers({ }, }); -BlazeComponent.extendComponent({ +class BrokenCardsComponent extends CardSearchPagedComponent { onCreated() { - Meteor.subscribe('setting'); - Meteor.subscribe('brokenCards'); - }, + super.onCreated(); - brokenCardsList() { - const selector = { - $or: [ - { boardId: { $in: [null, ''] } }, - { swimlaneId: { $in: [null, ''] } }, - { listId: { $in: [null, ''] } }, - { permission: 'public' }, - { members: { $elemMatch: { userId: user._id, isActive: true } } }, - ], - }; - - return Cards.find(selector); - }, -}).register('brokenCards'); + Meteor.subscribe('brokenCards', this.sessionId); + } +} +BrokenCardsComponent.register('brokenCards'); diff --git a/client/components/main/dueCards.jade b/client/components/main/dueCards.jade index 2570984de..a1970839e 100644 --- a/client/components/main/dueCards.jade +++ b/client/components/main/dueCards.jade @@ -22,13 +22,17 @@ template(name="dueCardsModalTitle") template(name="dueCards") if currentUser - if isPageReady.get - .wrapper - .due-cards-dueat-list-wrapper - each card in dueCardsList - +resultCard(card) - else + if searching.get +spinner + else if hasResults.get + .global-search-results-list-wrapper + if hasQueryErrors.get + div + each msg in errorMessages + span.global-search-error-messages + = msg + else + +resultsPaged(this) template(name="dueCardsViewChangePopup") if currentUser diff --git a/client/components/main/dueCards.js b/client/components/main/dueCards.js index 747c4f457..f08e306a0 100644 --- a/client/components/main/dueCards.js +++ b/client/components/main/dueCards.js @@ -1,4 +1,14 @@ -const subManager = new SubsManager(); +import { CardSearchPagedComponent } from '../../lib/cardSearch'; +import { + OPERATOR_HAS, + OPERATOR_SORT, + OPERATOR_USER, + ORDER_DESCENDING, + PREDICATE_DUE_AT, +} from '../../../config/search-const'; +import { QueryParams } from '../../../config/query-classes'; + +// const subManager = new SubsManager(); BlazeComponent.extendComponent({ dueCardsView() { @@ -40,106 +50,51 @@ BlazeComponent.extendComponent({ }, }).register('dueCardsViewChangePopup'); -BlazeComponent.extendComponent({ +class DueCardsComponent extends CardSearchPagedComponent { onCreated() { - this.isPageReady = new ReactiveVar(false); + super.onCreated(); - this.autorun(() => { - const handle = subManager.subscribe( - 'dueCards', - Utils.dueCardsView() === 'all', - ); - Tracker.nonreactive(() => { - Tracker.autorun(() => { - this.isPageReady.set(handle.ready()); - }); - }); + const queryParams = new QueryParams(); + queryParams.addPredicate(OPERATOR_HAS, { + field: PREDICATE_DUE_AT, + exists: true, }); - Meteor.subscribe('setting'); - }, + // queryParams[OPERATOR_LIMIT] = 5; + queryParams.addPredicate(OPERATOR_SORT, { + name: PREDICATE_DUE_AT, + order: ORDER_DESCENDING, + }); + + if (Utils.dueCardsView() !== 'all') { + queryParams.addPredicate(OPERATOR_USER, Meteor.user().username); + } + + this.runGlobalSearch(queryParams.getParams()); + } dueCardsView() { // eslint-disable-next-line no-console //console.log('sort:', Utils.dueCardsView()); return Utils.dueCardsView(); - }, + } sortByBoard() { return this.dueCardsView() === 'board'; - }, + } dueCardsList() { - const allUsers = Utils.dueCardsView() === 'all'; - - const user = Meteor.user(); - - const archivedBoards = []; - Boards.find({ archived: true }).forEach(board => { - archivedBoards.push(board._id); - }); - - const permiitedBoards = []; - let selector = { - archived: false, - }; - // for every user including admin allow her to see cards only from public boards - // or those where she is a member - //if (!user.isAdmin) { - selector.$or = [ - { permission: 'public' }, - { members: { $elemMatch: { userId: user._id, isActive: true } } }, - ]; - //} - Boards.find(selector).forEach(board => { - permiitedBoards.push(board._id); - }); - - const archivedSwimlanes = []; - Swimlanes.find({ archived: true }).forEach(swimlane => { - archivedSwimlanes.push(swimlane._id); - }); - - const archivedLists = []; - Lists.find({ archived: true }).forEach(list => { - archivedLists.push(list._id); - }); - - selector = { - archived: false, - boardId: { - $nin: archivedBoards, - $in: permiitedBoards, - }, - swimlaneId: { $nin: archivedSwimlanes }, - listId: { $nin: archivedLists }, - dueAt: { $ne: null }, - endAt: null, - }; - - if (!allUsers) { - selector.$or = [{ members: user._id }, { assignees: user._id }]; + const results = this.getResults(); + console.log('results:', results); + const cards = []; + if (results) { + results.forEach(card => { + cards.push(card); + }); } - const cards = []; - - // eslint-disable-next-line no-console - // console.log('cards selector:', selector); - Cards.find(selector).forEach(card => { - cards.push(card); - // eslint-disable-next-line no-console - // console.log( - // 'board:', - // card.board(), - // 'swimlane:', - // card.swimlane(), - // 'list:', - // card.list(), - // ); - }); - cards.sort((a, b) => { - const x = a.dueAt === null ? Date('2100-12-31') : a.dueAt; - const y = b.dueAt === null ? Date('2100-12-31') : b.dueAt; + const x = a.dueAt === null ? new Date('2100-12-31') : a.dueAt; + const y = b.dueAt === null ? new Date('2100-12-31') : b.dueAt; if (x > y) return 1; else if (x < y) return -1; @@ -148,7 +103,9 @@ BlazeComponent.extendComponent({ }); // eslint-disable-next-line no-console - // console.log('cards:', cards); + console.log('cards:', cards); return cards; - }, -}).register('dueCards'); + } +} + +DueCardsComponent.register('dueCards'); diff --git a/client/components/main/editor.jade b/client/components/main/editor.jade index dbd617154..9baf95099 100644 --- a/client/components/main/editor.jade +++ b/client/components/main/editor.jade @@ -4,6 +4,7 @@ template(name="editor") class="{{class}}" id=id autofocus=autofocus + data-meteor-emoji="true" placeholder="{{_ 'comment-placeholder'}}") +Template.contentBlock diff --git a/client/components/main/editor.js b/client/components/main/editor.js index bd7260c2b..4b0783d20 100644 --- a/client/components/main/editor.js +++ b/client/components/main/editor.js @@ -1,4 +1,5 @@ Template.editor.onRendered(() => { + new MeteorEmoji(); const textareaSelector = 'textarea'; const mentions = [ // User mentions @@ -99,7 +100,9 @@ Template.editor.onRendered(() => { if (inputs.length === 0) { // only enable richereditor to new comment or edit comment no others enableTextarea(); - } else { + } + /* + else { const placeholder = inputs.attr('placeholder') || ''; const mSummernotes = []; const getSummernote = function(input) { @@ -258,6 +261,7 @@ Template.editor.onRendered(() => { }); }); } + */ } else { enableTextarea(); } diff --git a/client/components/main/globalSearch.jade b/client/components/main/globalSearch.jade index 989075d02..bd2493124 100644 --- a/client/components/main/globalSearch.jade +++ b/client/components/main/globalSearch.jade @@ -10,11 +10,29 @@ template(name="globalSearchModalTitle") i.fa.fa-keyboard-o | {{_ 'globalSearch-title'}} +template(name="resultsPaged") + h1 + = resultsHeading.get + a.fa.fa-link(title="{{_ 'link-to-search' }}" href="{{ getSearchHref }}") + each card in results.get + +resultCard(card) + table.global-search-footer + tr + td.global-search-previous-page + if hasPreviousPage.get + button.js-previous-page + | {{_ 'previous-page' }} + td.global-search-next-page(align="right") + if hasNextPage.get + button.js-next-page + | {{_ 'next-page' }} + template(name="globalSearch") if currentUser .wrapper form.global-search-page.js-search-query-form input.global-search-query-input( + style="{# if hasResults.get #}display: inline-block;{#/if#}" id="global-search-input" type="text" name="searchQuery" @@ -22,31 +40,24 @@ template(name="globalSearch") value="{{ query.get }}" autofocus dir="auto" ) + a.js-new-search.fa.fa-eraser if searching.get +spinner else if hasResults.get .global-search-results-list-wrapper if hasQueryErrors.get - div + ul each msg in errorMessages - span.global-search-error-messages + li.global-search-error-messages = msg else - h1 - = resultsHeading.get - a.fa.fa-link(title="{{_ 'link-to-search' }}" href="{{ getSearchHref }}") - each card in results.get - +resultCard(card) - table.global-search-footer - tr - td.global-search-previous-page - if hasPreviousPage.get - button.js-previous-page - | {{_ 'previous-page' }} - td.global-search-next-page(align="right") - if hasNextPage.get - button.js-next-page - | {{_ 'next-page' }} + +resultsPaged(this) + else if serverError.get + .global-search-page + .global-search-help + h1 {{_ 'server-error' }} + +viewer + | {{_ 'server-error-troubleshooting' }} else .global-search-page .global-search-help @@ -73,24 +84,3 @@ template(name="globalSearch") .global-search-instructions +viewer = searchInstructions - -template(name="globalSearchViewChangePopup") - if currentUser - ul.pop-over-list - li - with "globalSearchViewChange-choice-me" - a.js-global-search-view-me - i.fa.fa-user.colorful - | {{_ 'globalSearchViewChange-choice-me'}} - if $eq Utils.globalSearchView "me" - i.fa.fa-check - li - with "globalSearchViewChange-choice-all" - a.js-global-search-view-all - i.fa.fa-users.colorful - | {{_ 'globalSearchViewChange-choice-all'}} - span.sub-name - +viewer - | {{_ 'globalSearchViewChange-choice-all-description' }} - if $eq Utils.globalSearchView "all" - i.fa.fa-check diff --git a/client/components/main/globalSearch.js b/client/components/main/globalSearch.js index 56acb47a7..133fa1433 100644 --- a/client/components/main/globalSearch.js +++ b/client/components/main/globalSearch.js @@ -1,4 +1,8 @@ -const subManager = new SubsManager(); +import { CardSearchPagedComponent } from '../../lib/cardSearch'; +import Boards from '../../../models/boards'; +import { Query, QueryErrors } from '../../../config/query-classes'; + +// const subManager = new SubsManager(); BlazeComponent.extendComponent({ events() { @@ -16,45 +20,14 @@ Template.globalSearch.helpers({ }, }); -BlazeComponent.extendComponent({ - events() { - return [ - { - 'click .js-due-cards-view-me'() { - Utils.setDueCardsView('me'); - Popup.close(); - }, - - 'click .js-due-cards-view-all'() { - Utils.setDueCardsView('all'); - Popup.close(); - }, - }, - ]; - }, -}).register('globalSearchViewChangePopup'); - -BlazeComponent.extendComponent({ +class GlobalSearchComponent extends CardSearchPagedComponent { onCreated() { - this.searching = new ReactiveVar(false); - this.hasResults = new ReactiveVar(false); - this.hasQueryErrors = new ReactiveVar(false); - this.query = new ReactiveVar(''); - this.resultsHeading = new ReactiveVar(''); - this.searchLink = new ReactiveVar(null); + super.onCreated(); this.myLists = new ReactiveVar([]); this.myLabelNames = new ReactiveVar([]); this.myBoardNames = new ReactiveVar([]); - this.results = new ReactiveVar([]); - this.hasNextPage = new ReactiveVar(false); - this.hasPreviousPage = new ReactiveVar(false); + this.parsingErrors = new QueryErrors(); this.queryParams = null; - this.parsingErrors = []; - this.resultsCount = 0; - this.totalHits = 0; - this.queryErrors = null; - this.colorMap = null; - this.resultsPerPage = 25; Meteor.call('myLists', (err, data) => { if (!err) { @@ -73,510 +46,71 @@ BlazeComponent.extendComponent({ this.myBoardNames.set(data); } }); - }, + } onRendered() { Meteor.subscribe('setting'); // eslint-disable-next-line no-console //console.log('lang:', TAPi18n.getLanguage()); - this.colorMap = Boards.colorMap(); - // eslint-disable-next-line no-console - // console.log('colorMap:', this.colorMap); if (Session.get('globalQuery')) { this.searchAllBoards(Session.get('globalQuery')); } - }, + } resetSearch() { - this.searching.set(false); - this.results.set([]); - this.hasResults.set(false); - this.hasQueryErrors.set(false); - this.resultsHeading.set(''); - this.parsingErrors = []; - this.resultsCount = 0; - this.totalHits = 0; - this.queryErrors = null; - }, - - getSessionData() { - return SessionData.findOne({ - userId: Meteor.userId(), - sessionId: SessionData.getSessionId(), - }); - }, - - getResults() { - // eslint-disable-next-line no-console - // console.log('getting results'); - if (this.queryParams) { - const sessionData = this.getSessionData(); - // eslint-disable-next-line no-console - // console.log('selector:', sessionData.getSelector()); - // console.log('session data:', sessionData); - const projection = sessionData.getProjection(); - projection.skip = 0; - const cards = Cards.find({ _id: { $in: sessionData.cards } }, projection); - this.queryErrors = sessionData.errors; - if (this.queryErrors.length) { - this.hasQueryErrors.set(true); - return null; - } - - if (cards) { - this.totalHits = sessionData.totalHits; - this.resultsCount = cards.count(); - this.resultsStart = sessionData.lastHit - this.resultsCount + 1; - this.resultsEnd = sessionData.lastHit; - this.resultsHeading.set(this.getResultsHeading()); - this.results.set(cards); - this.hasNextPage.set(sessionData.lastHit < sessionData.totalHits); - this.hasPreviousPage.set( - sessionData.lastHit - sessionData.resultsCount > 0, - ); - } - } - this.resultsCount = 0; - return null; - }, + super.resetSearch(); + this.parsingErrors = new QueryErrors(); + } errorMessages() { - if (this.parsingErrors.length) { - return this.parsingErrorMessages(); + if (this.parsingErrors.hasErrors()) { + return this.parsingErrors.errorMessages(); } return this.queryErrorMessages(); - }, + } parsingErrorMessages() { - const messages = []; + this.parsingErrors.errorMessages(); + } - if (this.parsingErrors.length) { - this.parsingErrors.forEach(err => { - messages.push(TAPi18n.__(err.tag, err.value)); - }); - } - - return messages; - }, - - queryErrorMessages() { - messages = []; - - this.queryErrors.forEach(err => { - let value = err.color ? TAPi18n.__(`color-${err.value}`) : err.value; - if (!value) { - value = err.value; - } - messages.push(TAPi18n.__(err.tag, value)); - }); - - return messages; - }, - - searchAllBoards(query) { - query = query.trim(); + searchAllBoards(queryText) { + queryText = queryText.trim(); // eslint-disable-next-line no-console - //console.log('query:', query); + //console.log('queryText:', queryText); - this.query.set(query); + this.query.set(queryText); this.resetSearch(); - if (!query) { + if (!queryText) { return; } this.searching.set(true); - const reOperator1 = new RegExp( - '^((?[\\p{Letter}\\p{Mark}]+):|(?[#@]))(?[\\p{Letter}\\p{Mark}]+)(\\s+|$)', - 'iu', - ); - const reOperator2 = new RegExp( - '^((?[\\p{Letter}\\p{Mark}]+):|(?[#@]))(?["\']*)(?.*?)\\k(\\s+|$)', - 'iu', - ); - const reText = new RegExp('^(?\\S+)(\\s+|$)', 'u'); - const reQuotedText = new RegExp( - '^(?["\'])(?.*?)\\k(\\s+|$)', - 'u', - ); - const reNegatedOperator = new RegExp('^-(?.*)$'); - - 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-status': 'status', - 'operator-due': 'dueAt', - 'operator-created': 'createdAt', - 'operator-modified': 'modifiedAt', - 'operator-comment': 'comments', - 'operator-has': 'has', - 'operator-sort': 'sort', - 'operator-limit': 'limit', - }; - - const predicates = { - due: { - 'predicate-overdue': 'overdue', - }, - durations: { - 'predicate-week': 'week', - 'predicate-month': 'month', - 'predicate-quarter': 'quarter', - 'predicate-year': 'year', - }, - status: { - 'predicate-archived': 'archived', - 'predicate-all': 'all', - 'predicate-open': 'open', - 'predicate-ended': 'ended', - 'predicate-public': 'public', - 'predicate-private': 'private', - }, - sorts: { - 'predicate-due': 'dueAt', - 'predicate-created': 'createdAt', - 'predicate-modified': 'modifiedAt', - }, - has: { - 'predicate-description': 'description', - 'predicate-checklist': 'checklist', - 'predicate-attachment': 'attachment', - 'predicate-start': 'startAt', - 'predicate-end': 'endAt', - 'predicate-due': 'dueAt', - 'predicate-assignee': 'assignees', - 'predicate-member': 'members', - }, - }; - const predicateTranslations = {}; - Object.entries(predicates).forEach(([category, catPreds]) => { - predicateTranslations[category] = {}; - Object.entries(catPreds).forEach(([tag, value]) => { - predicateTranslations[category][TAPi18n.__(tag)] = value; - }); - }); - // eslint-disable-next-line no-console - // console.log('predicateTranslations:', predicateTranslations); - - const operatorMap = {}; - Object.entries(operators).forEach(([key, value]) => { - operatorMap[TAPi18n.__(key).toLowerCase()] = value; - }); - // eslint-disable-next-line no-console - // console.log('operatorMap:', operatorMap); - - const params = { - limit: this.resultsPerPage, - boards: [], - swimlanes: [], - lists: [], - users: [], - members: [], - assignees: [], - labels: [], - status: [], - dueAt: null, - createdAt: null, - modifiedAt: null, - comments: [], - has: [], - }; - - let text = ''; - while (query) { - m = query.match(reOperator1); - if (!m) { - m = query.match(reOperator2); - if (m) { - query = query.replace(reOperator2, ''); - } - } else { - query = query.replace(reOperator1, ''); - } - if (m) { - let op; - if (m.groups.operator) { - op = m.groups.operator.toLowerCase(); - } else { - op = m.groups.abbrev.toLowerCase(); - } - // eslint-disable-next-line no-prototype-builtins - if (operatorMap.hasOwnProperty(op)) { - const operator = operatorMap[op]; - let value = m.groups.value; - if (operator === 'labels') { - if (value in this.colorMap) { - value = this.colorMap[value]; - // console.log('found color:', value); - } - } else if (['dueAt', 'createdAt', 'modifiedAt'].includes(operator)) { - let days = parseInt(value, 10); - let duration = null; - if (isNaN(days)) { - // duration was specified as text - if (predicateTranslations.durations[value]) { - duration = predicateTranslations.durations[value]; - let date = null; - switch (duration) { - case 'week': - let week = moment().week(); - if (week === 52) { - date = moment(1, 'W'); - date.set('year', date.year() + 1); - } else { - date = moment(week + 1, 'W'); - } - break; - case 'month': - let month = moment().month(); - // .month() is zero indexed - if (month === 11) { - date = moment(1, 'M'); - date.set('year', date.year() + 1); - } else { - date = moment(month + 2, 'M'); - } - break; - case 'quarter': - let quarter = moment().quarter(); - if (quarter === 4) { - date = moment(1, 'Q'); - date.set('year', date.year() + 1); - } else { - date = moment(quarter + 1, 'Q'); - } - break; - case 'year': - date = moment(moment().year() + 1, 'YYYY'); - break; - } - if (date) { - value = { - operator: '$lt', - value: date.format('YYYY-MM-DD'), - }; - } - } else if (operator === 'dueAt' && value === 'overdue') { - value = { - operator: '$lt', - value: moment().format('YYYY-MM-DD'), - }; - } else { - this.parsingErrors.push({ - tag: 'operator-number-expected', - value: { operator: op, value }, - }); - value = null; - } - } else { - if (operator === 'dueAt') { - value = { - operator: '$lt', - value: moment(moment().format('YYYY-MM-DD')) - .add(days + 1, duration ? duration : 'days') - .format(), - }; - } else { - value = { - operator: '$gte', - value: moment(moment().format('YYYY-MM-DD')) - .subtract(days, duration ? duration : 'days') - .format(), - }; - } - } - } else if (operator === 'sort') { - let negated = false; - const m = value.match(reNegatedOperator); - if (m) { - value = m.groups.operator; - negated = true; - } - if (!predicateTranslations.sorts[value]) { - this.parsingErrors.push({ - tag: 'operator-sort-invalid', - value, - }); - } else { - value = { - name: predicateTranslations.sorts[value], - order: negated ? 'des' : 'asc', - }; - } - } else if (operator === 'status') { - if (!predicateTranslations.status[value]) { - this.parsingErrors.push({ - tag: 'operator-status-invalid', - value, - }); - } else { - value = predicateTranslations.status[value]; - } - } else if (operator === 'has') { - let negated = false; - const m = value.match(reNegatedOperator); - if (m) { - value = m.groups.operator; - negated = true; - } - if (!predicateTranslations.has[value]) { - this.parsingErrors.push({ - tag: 'operator-has-invalid', - value, - }); - } else { - value = { - field: predicateTranslations.has[value], - exists: !negated, - }; - } - } else if (operator === 'limit') { - const limit = parseInt(value, 10); - if (isNaN(limit) || limit < 1) { - this.parsingErrors.push({ - tag: 'operator-limit-invalid', - value, - }); - } else { - value = limit; - } - } - if (Array.isArray(params[operator])) { - params[operator].push(value); - } else { - params[operator] = value; - } - } else { - this.parsingErrors.push({ - tag: 'operator-unknown-error', - value: op, - }); - } - continue; - } - - m = query.match(reQuotedText); - if (!m) { - m = query.match(reText); - if (m) { - query = query.replace(reText, ''); - } - } else { - query = query.replace(reQuotedText, ''); - } - if (m) { - text += (text ? ' ' : '') + m.groups.text; - } - } + const query = new Query(); + query.buildParams(queryText); // eslint-disable-next-line no-console - // console.log('text:', text); - params.text = text; + // console.log('params:', query.getParams()); - // eslint-disable-next-line no-console - console.log('params:', params); + this.queryParams = query.getParams(); - this.queryParams = params; - - if (this.parsingErrors.length) { + if (query.hasErrors()) { this.searching.set(false); - this.queryErrors = this.parsingErrorMessages(); + this.queryErrors = query.errors(); this.hasResults.set(true); this.hasQueryErrors.set(true); return; } - this.autorun(() => { - const handle = Meteor.subscribe( - 'globalSearch', - SessionData.getSessionId(), - params, - ); - Tracker.nonreactive(() => { - Tracker.autorun(() => { - if (handle.ready()) { - this.getResults(); - this.searching.set(false); - this.hasResults.set(true); - } - }); - }); - }); - }, - - nextPage() { - const sessionData = this.getSessionData(); - - this.autorun(() => { - const handle = Meteor.subscribe('nextPage', sessionData.sessionId); - Tracker.nonreactive(() => { - Tracker.autorun(() => { - if (handle.ready()) { - this.getResults(); - this.searching.set(false); - this.hasResults.set(true); - } - }); - }); - }); - }, - - previousPage() { - const sessionData = this.getSessionData(); - - this.autorun(() => { - const handle = Meteor.subscribe('previousPage', sessionData.sessionId); - Tracker.nonreactive(() => { - Tracker.autorun(() => { - if (handle.ready()) { - this.getResults(); - this.searching.set(false); - this.hasResults.set(true); - } - }); - }); - }); - }, - - getResultsHeading() { - if (this.resultsCount === 0) { - return TAPi18n.__('no-cards-found'); - } else if (this.resultsCount === 1) { - return TAPi18n.__('one-card-found'); - } else if (this.resultsCount === this.totalHits) { - return TAPi18n.__('n-cards-found', this.resultsCount); - } - - return TAPi18n.__('n-n-of-n-cards-found', { - start: this.resultsStart, - end: this.resultsEnd, - total: this.totalHits, - }); - }, - - getSearchHref() { - const baseUrl = window.location.href.replace(/([?#].*$|\s*$)/, ''); - return `${baseUrl}?q=${encodeURIComponent(this.query.get())}`; - }, + this.runGlobalSearch(query.getParams()); + } searchInstructions() { - tags = { + const tags = { operator_board: TAPi18n.__('operator-board'), operator_list: TAPi18n.__('operator-list'), operator_swimlane: TAPi18n.__('operator-swimlane'), @@ -618,61 +152,46 @@ BlazeComponent.extendComponent({ predicate_member: TAPi18n.__('predicate-member'), }; - let text = `# ${TAPi18n.__('globalSearch-instructions-heading')}`; - text += `\n${TAPi18n.__('globalSearch-instructions-description', tags)}`; - text += `\n\n${TAPi18n.__('globalSearch-instructions-operators', tags)}`; - + let text = ''; [ - 'globalSearch-instructions-operator-board', - 'globalSearch-instructions-operator-list', - 'globalSearch-instructions-operator-swimlane', - 'globalSearch-instructions-operator-comment', - 'globalSearch-instructions-operator-label', - 'globalSearch-instructions-operator-hash', - 'globalSearch-instructions-operator-user', - 'globalSearch-instructions-operator-at', - 'globalSearch-instructions-operator-member', - 'globalSearch-instructions-operator-assignee', - 'globalSearch-instructions-operator-due', - 'globalSearch-instructions-operator-created', - 'globalSearch-instructions-operator-modified', - 'globalSearch-instructions-operator-status', - ].forEach(instruction => { - text += `\n* ${TAPi18n.__(instruction, tags)}`; - }); - - [ - 'globalSearch-instructions-status-archived', - 'globalSearch-instructions-status-public', - 'globalSearch-instructions-status-private', - 'globalSearch-instructions-status-all', - 'globalSearch-instructions-status-ended', - ].forEach(instruction => { - text += `\n * ${TAPi18n.__(instruction, tags)}`; - }); - - [ - 'globalSearch-instructions-operator-has', - 'globalSearch-instructions-operator-sort', - 'globalSearch-instructions-operator-limit', - ].forEach(instruction => { - text += `\n* ${TAPi18n.__(instruction, tags)}`; - }); - - text += `\n## ${TAPi18n.__('heading-notes')}`; - [ - 'globalSearch-instructions-notes-1', - 'globalSearch-instructions-notes-2', - 'globalSearch-instructions-notes-3', - 'globalSearch-instructions-notes-3-2', - 'globalSearch-instructions-notes-4', - 'globalSearch-instructions-notes-5', - ].forEach(instruction => { - text += `\n* ${TAPi18n.__(instruction, tags)}`; + ['# ', 'globalSearch-instructions-heading'], + ['\n', 'globalSearch-instructions-description'], + ['\n\n', 'globalSearch-instructions-operators'], + ['\n* ', 'globalSearch-instructions-operator-board'], + ['\n* ', 'globalSearch-instructions-operator-list'], + ['\n* ', 'globalSearch-instructions-operator-swimlane'], + ['\n* ', 'globalSearch-instructions-operator-comment'], + ['\n* ', 'globalSearch-instructions-operator-label'], + ['\n* ', 'globalSearch-instructions-operator-hash'], + ['\n* ', 'globalSearch-instructions-operator-user'], + ['\n* ', 'globalSearch-instructions-operator-at'], + ['\n* ', 'globalSearch-instructions-operator-member'], + ['\n* ', 'globalSearch-instructions-operator-assignee'], + ['\n* ', 'globalSearch-instructions-operator-due'], + ['\n* ', 'globalSearch-instructions-operator-created'], + ['\n* ', 'globalSearch-instructions-operator-modified'], + ['\n* ', 'globalSearch-instructions-operator-status'], + ['\n * ', 'globalSearch-instructions-status-archived'], + ['\n * ', 'globalSearch-instructions-status-public'], + ['\n * ', 'globalSearch-instructions-status-private'], + ['\n * ', 'globalSearch-instructions-status-all'], + ['\n * ', 'globalSearch-instructions-status-ended'], + ['\n* ', 'globalSearch-instructions-operator-has'], + ['\n* ', 'globalSearch-instructions-operator-sort'], + ['\n* ', 'globalSearch-instructions-operator-limit'], + ['\n## ', 'heading-notes'], + ['\n* ', 'globalSearch-instructions-notes-1'], + ['\n* ', 'globalSearch-instructions-notes-2'], + ['\n* ', 'globalSearch-instructions-notes-3'], + ['\n* ', 'globalSearch-instructions-notes-3-2'], + ['\n* ', 'globalSearch-instructions-notes-4'], + ['\n* ', 'globalSearch-instructions-notes-5'], + ].forEach(([prefix, instruction]) => { + text += `${prefix}${TAPi18n.__(instruction, tags)}`; }); return text; - }, + } labelColors() { return Boards.simpleSchema()._schema['labels.$.color'].allowedValues.map( @@ -680,23 +199,16 @@ BlazeComponent.extendComponent({ return { color, name: TAPi18n.__(`color-${color}`) }; }, ); - }, + } events() { return [ { + ...super.events()[0], 'submit .js-search-query-form'(evt) { evt.preventDefault(); this.searchAllBoards(evt.target.searchQuery.value); }, - 'click .js-next-page'(evt) { - evt.preventDefault(); - this.nextPage(); - }, - 'click .js-previous-page'(evt) { - evt.preventDefault(); - this.previousPage(); - }, 'click .js-label-color'(evt) { evt.preventDefault(); const input = document.getElementById('global-search-input'); @@ -737,7 +249,16 @@ BlazeComponent.extendComponent({ ); document.getElementById('global-search-input').focus(); }, + 'click .js-new-search'(evt) { + evt.preventDefault(); + const input = document.getElementById('global-search-input'); + input.value = ''; + this.query.set(''); + this.hasResults.set(false); + }, }, ]; - }, -}).register('globalSearch'); + } +} + +GlobalSearchComponent.register('globalSearch'); diff --git a/client/components/main/layouts.js b/client/components/main/layouts.js index 207dadda8..a43a49d6c 100644 --- a/client/components/main/layouts.js +++ b/client/components/main/layouts.js @@ -77,8 +77,6 @@ Template.userFormsLayout.helpers({ } else if (lang.name === 'ar-EG') { // ar-EG = Arabic (Egypt), simply Masri (مَصرى, [ˈmɑsˤɾi], Egyptian, Masr refers to Cairo) name = 'مَصرى'; - } else if (lang.name === 'es-PY') { - name = 'Español de Paraguayo'; } else if (lang.name === 'fa-IR') { // fa-IR = Persian (Iran) name = 'فارسی/پارسی (ایران‎)'; @@ -94,6 +92,14 @@ Template.userFormsLayout.helpers({ name = 'Latviešu'; } else if (lang.name === 'Español') { name = 'español'; + } else if (lang.name === 'es_419') { + name = 'español de América Latina'; + } else if (lang.name === 'es-419') { + name = 'español de América Latina'; + } else if (lang.name === 'Español de América Latina') { + name = 'español de América Latina'; + } else if (lang.name === 'es-LA') { + name = 'español de América Latina'; } else if (lang.name === 'Español de Argentina') { name = 'español de Argentina'; } else if (lang.name === 'Español de Chile') { @@ -104,6 +110,8 @@ Template.userFormsLayout.helpers({ name = 'español de México'; } else if (lang.name === 'es-PY') { name = 'español de Paraguayo'; + } else if (lang.name === 'Español de Paraguayo') { + name = 'español de Paraguayo'; } else if (lang.name === 'Español de Perú') { name = 'español de Perú'; } else if (lang.name === 'Español de Puerto Rico') { diff --git a/client/components/main/myCards.jade b/client/components/main/myCards.jade index 01a9027fb..e721c281c 100644 --- a/client/components/main/myCards.jade +++ b/client/components/main/myCards.jade @@ -24,7 +24,9 @@ template(name="myCardsModalTitle") template(name="myCards") if currentUser - if isPageReady.get + if searching.get + +spinner + else .wrapper if $eq myCardsSort 'board' each board in myCardsList @@ -50,8 +52,6 @@ template(name="myCards") .my-cards-dueat-list-wrapper each card in myDueCardsList +resultCard(card) - else - +spinner template(name="myCardsSortChangePopup") if currentUser diff --git a/client/components/main/myCards.js b/client/components/main/myCards.js index 13eb3e519..3f79e0f26 100644 --- a/client/components/main/myCards.js +++ b/client/components/main/myCards.js @@ -1,4 +1,14 @@ -const subManager = new SubsManager(); +import { CardSearchPagedComponent } from '../../lib/cardSearch'; +import { QueryParams } from '../../../config/query-classes'; +import { + OPERATOR_LIMIT, + OPERATOR_SORT, + OPERATOR_USER, + ORDER_DESCENDING, + PREDICATE_DUE_AT, +} from '../../../config/search-const'; + +// const subManager = new SubsManager(); BlazeComponent.extendComponent({ myCardsSort() { @@ -42,182 +52,147 @@ BlazeComponent.extendComponent({ }, }).register('myCardsSortChangePopup'); -BlazeComponent.extendComponent({ +class MyCardsComponent extends CardSearchPagedComponent { onCreated() { - this.isPageReady = new ReactiveVar(false); + super.onCreated(); - this.autorun(() => { - const handle = subManager.subscribe('myCards'); - Tracker.nonreactive(() => { - Tracker.autorun(() => { - this.isPageReady.set(handle.ready()); - }); - }); + const queryParams = new QueryParams(); + queryParams.addPredicate(OPERATOR_USER, Meteor.user().username); + queryParams.addPredicate(OPERATOR_SORT, { + name: PREDICATE_DUE_AT, + order: ORDER_DESCENDING, }); + queryParams.addPredicate(OPERATOR_LIMIT, 100); + + this.runGlobalSearch(queryParams); Meteor.subscribe('setting'); - }, + } myCardsSort() { // eslint-disable-next-line no-console //console.log('sort:', Utils.myCardsSort()); return Utils.myCardsSort(); - }, + } sortByBoard() { return this.myCardsSort() === 'board'; - }, + } myCardsList() { - const userId = Meteor.userId(); const boards = []; let board = null; let swimlane = null; let list = null; - const cursor = Cards.find( - { - $or: [{ members: userId }, { assignees: userId }], - archived: false, - }, - { - sort: { - boardId: 1, - swimlaneId: 1, - listId: 1, - sort: 1, - }, - }, - ); + const cursor = this.getResults(); - let newBoard = false; - let newSwimlane = false; - let newList = false; + if (cursor) { + let newBoard = false; + let newSwimlane = false; + let newList = false; - cursor.forEach(card => { - // eslint-disable-next-line no-console - // console.log('card:', card.title); - if (list === null || card.listId !== list._id) { + cursor.forEach(card => { // eslint-disable-next-line no-console - // console.log('new list'); - list = card.getList(); - if (list.archived) { - list = null; - return; + // console.log('card:', card.title); + if (list === null || card.listId !== list._id) { + // eslint-disable-next-line no-console + // console.log('new list'); + list = card.getList(); + if (list.archived) { + list = null; + return; + } + list.myCards = [card]; + newList = true; } - list.myCards = [card]; - newList = true; - } - if (swimlane === null || card.swimlaneId !== swimlane._id) { - // eslint-disable-next-line no-console - // console.log('new swimlane'); - swimlane = card.getSwimlane(); - if (swimlane.archived) { - swimlane = null; - return; + if (swimlane === null || card.swimlaneId !== swimlane._id) { + // eslint-disable-next-line no-console + // console.log('new swimlane'); + swimlane = card.getSwimlane(); + if (swimlane.archived) { + swimlane = null; + return; + } + swimlane.myLists = [list]; + newSwimlane = true; } - swimlane.myLists = [list]; - newSwimlane = true; - } - if (board === null || card.boardId !== board._id) { - // eslint-disable-next-line no-console - // console.log('new board'); - board = card.getBoard(); - if (board.archived) { - board = null; - return; + if (board === null || card.boardId !== board._id) { + // eslint-disable-next-line no-console + // console.log('new board'); + board = card.getBoard(); + if (board.archived) { + board = null; + return; + } + // eslint-disable-next-line no-console + // console.log('board:', b, b._id, b.title); + board.mySwimlanes = [swimlane]; + newBoard = true; } - // eslint-disable-next-line no-console - // console.log('board:', b, b._id, b.title); - board.mySwimlanes = [swimlane]; - newBoard = true; - } - if (newBoard) { - boards.push(board); - } else if (newSwimlane) { - board.mySwimlanes.push(swimlane); - } else if (newList) { - swimlane.myLists.push(list); - } else { - list.myCards.push(card); - } + if (newBoard) { + boards.push(board); + } else if (newSwimlane) { + board.mySwimlanes.push(swimlane); + } else if (newList) { + swimlane.myLists.push(list); + } else { + list.myCards.push(card); + } - newBoard = false; - newSwimlane = false; - newList = false; - }); + newBoard = false; + newSwimlane = false; + newList = false; + }); - // sort the data structure - boards.forEach(board => { - board.mySwimlanes.forEach(swimlane => { - swimlane.myLists.forEach(list => { - list.myCards.sort((a, b) => { + // sort the data structure + boards.forEach(board => { + board.mySwimlanes.forEach(swimlane => { + swimlane.myLists.forEach(list => { + list.myCards.sort((a, b) => { + return a.sort - b.sort; + }); + }); + swimlane.myLists.sort((a, b) => { return a.sort - b.sort; }); }); - swimlane.myLists.sort((a, b) => { + board.mySwimlanes.sort((a, b) => { return a.sort - b.sort; }); }); - board.mySwimlanes.sort((a, b) => { - return a.sort - b.sort; + + boards.sort((a, b) => { + let x = a.sort; + let y = b.sort; + + // show the template board last + if (a.type === 'template-container') { + x = 99999999; + } else if (b.type === 'template-container') { + y = 99999999; + } + return x - y; }); - }); - boards.sort((a, b) => { - let x = a.sort; - let y = b.sort; + // eslint-disable-next-line no-console + // console.log('boards:', boards); + return boards; + } - // show the template board last - if (a.type === 'template-container') { - x = 99999999; - } else if (b.type === 'template-container') { - y = 99999999; - } - return x - y; - }); - - // eslint-disable-next-line no-console - // console.log('boards:', boards); - return boards; - }, + return []; + } myDueCardsList() { - const userId = Meteor.userId(); - - const cursor = Cards.find( - { - $or: [{ members: userId }, { assignees: userId }], - archived: false, - }, - { - sort: { - dueAt: -1, - boardId: 1, - swimlaneId: 1, - listId: 1, - sort: 1, - }, - }, - ); - - // eslint-disable-next-line no-console - // console.log('cursor:', cursor); - + const cursor = this.getResults(); const cards = []; cursor.forEach(card => { - if ( - !card.getBoard().archived && - !card.getSwimlane().archived && - !card.getList().archived - ) { - cards.push(card); - } + cards.push(card); }); cards.sort((a, b) => { - const x = a.dueAt === null ? Date('2100-12-31') : a.dueAt; - const y = b.dueAt === null ? Date('2100-12-31') : b.dueAt; + const x = a.dueAt === null ? new Date('2100-12-31') : a.dueAt; + const y = b.dueAt === null ? new Date('2100-12-31') : b.dueAt; if (x > y) return 1; else if (x < y) return -1; @@ -228,23 +203,6 @@ BlazeComponent.extendComponent({ // eslint-disable-next-line no-console // console.log('cursor:', cards); return cards; - }, - - events() { - return [ - { - // 'click .js-my-card'(evt) { - // const card = this.currentData().card; - // // eslint-disable-next-line no-console - // console.log('currentData():', this.currentData()); - // // eslint-disable-next-line no-console - // console.log('card:', card); - // if (card) { - // Utils.goCardId(card._id); - // } - // evt.preventDefault(); - // }, - }, - ]; - }, -}).register('myCards'); + } +} +MyCardsComponent.register('myCards'); diff --git a/client/components/settings/peopleBody.jade b/client/components/settings/peopleBody.jade index 7cb196973..d1d2228bf 100644 --- a/client/components/settings/peopleBody.jade +++ b/client/components/settings/peopleBody.jade @@ -117,17 +117,17 @@ template(name="peopleGeneral") template(name="newOrgRow") a.new-org - i.fa.fa-edit + i.fa.fa-plus-square | {{_ 'new'}} template(name="newTeamRow") a.new-team - i.fa.fa-edit + i.fa.fa-plus-square | {{_ 'new'}} template(name="newUserRow") a.new-user - i.fa.fa-edit + i.fa.fa-plus-square | {{_ 'new'}} template(name="orgRow") diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade index 84d7a1b18..f8cfc3a59 100644 --- a/client/components/settings/settingBody.jade +++ b/client/components/settings/settingBody.jade @@ -122,6 +122,8 @@ template(name='email') template(name='accountSettings') ul#account-setting.setting-detail + li + button.js-all-hide-system-messages.primary {{_ 'hide-system-messages-of-all-users'}} li.accounts-form .title {{_ 'accounts-allowEmailChange'}} .form-group.flex @@ -129,23 +131,18 @@ template(name='accountSettings') span {{_ 'yes'}} input.wekan-form-control#accounts-allowEmailChange(type="radio" name="allowEmailChange" value="false" checked="{{#unless allowEmailChange}}checked{{/unless}}") span {{_ 'no'}} - li - li.accounts-form .title {{_ 'accounts-allowUserNameChange'}} .form-group.flex input.wekan-form-control#accounts-allowUserNameChange(type="radio" name="allowUserNameChange" value="true" checked="{{#if allowUserNameChange}}checked{{/if}}") span {{_ 'yes'}} input.wekan-form-control#accounts-allowUserNameChange(type="radio" name="allowUserNameChange" value="false" checked="{{#unless allowUserNameChange}}checked{{/unless}}") span {{_ 'no'}} - li - li.accounts-form .title {{_ 'accounts-allowUserDelete'}} .form-group.flex input.wekan-form-control#accounts-allowUserDelete(type="radio" name="allowUserDelete" value="true" checked="{{#if allowUserDelete}}checked{{/if}}") span {{_ 'yes'}} input.wekan-form-control#accounts-allowUserDelete(type="radio" name="allowUserDelete" value="false" checked="{{#unless allowUserDelete}}checked{{/unless}}") span {{_ 'no'}} - li button.js-accounts-save.primary {{_ 'save'}} template(name='announcementSettings') diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js index 68126589e..596b40613 100644 --- a/client/components/settings/settingBody.js +++ b/client/components/settings/settingBody.js @@ -274,7 +274,6 @@ BlazeComponent.extendComponent({ $set: { booleanValue: allowUserDelete }, }); }, - allowEmailChange() { return AccountSettings.findOne('accounts-allowEmailChange').booleanValue; }, @@ -284,12 +283,31 @@ BlazeComponent.extendComponent({ allowUserDelete() { return AccountSettings.findOne('accounts-allowUserDelete').booleanValue; }, + allHideSystemMessages() { + Meteor.call('setAllUsersHideSystemMessages', (err, ret) => { + if (!err && ret) { + if (ret === true) { + const message = `${TAPi18n.__( + 'now-system-messages-of-all-users-are-hidden', + )}`; + alert(message); + } + } else { + const reason = err.reason || ''; + const message = `${TAPi18n.__(err.error)}\n${reason}`; + alert(message); + } + }); + }, events() { return [ { 'click button.js-accounts-save': this.saveAccountsChange, }, + { + 'click button.js-all-hide-system-messages': this.allHideSystemMessages, + }, ]; }, }).register('accountSettings'); diff --git a/client/components/swimlanes/swimlaneHeader.jade b/client/components/swimlanes/swimlaneHeader.jade index 1653ba4ba..49cbb95da 100644 --- a/client/components/swimlanes/swimlaneHeader.jade +++ b/client/components/swimlanes/swimlaneHeader.jade @@ -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-move-swimlane {{_ 'move-swimlane'}} template(name="swimlaneAddPopup") unless currentUser.isCommentOnly diff --git a/client/components/swimlanes/swimlaneHeader.js b/client/components/swimlanes/swimlaneHeader.js index 1efc3defe..610eea685 100644 --- a/client/components/swimlanes/swimlaneHeader.js +++ b/client/components/swimlanes/swimlaneHeader.js @@ -47,20 +47,25 @@ Template.swimlaneFixedHeader.helpers({ }, }); -Template.swimlaneActionPopup.events({ - 'click .js-set-swimlane-color': Popup.open('setSwimlaneColor'), - 'click .js-close-swimlane'(event) { - event.preventDefault(); - this.archive(); - Popup.close(); - }, -}); - -Template.swimlaneActionPopup.helpers({ +BlazeComponent.extendComponent({ isCommentOnly() { return Meteor.user().isCommentOnly(); }, -}); + + events() { + return [ + { + 'click .js-set-swimlane-color': Popup.open('setSwimlaneColor'), + 'click .js-close-swimlane'(event) { + event.preventDefault(); + this.archive(); + Popup.close(); + }, + 'click .js-move-swimlane': Popup.open('moveSwimlane'), + }, + ]; + }, +}).register('swimlaneActionPopup'); BlazeComponent.extendComponent({ onCreated() { diff --git a/client/components/swimlanes/swimlanes.jade b/client/components/swimlanes/swimlanes.jade index cdcb1580d..68c4cc495 100644 --- a/client/components/swimlanes/swimlanes.jade +++ b/client/components/swimlanes/swimlanes.jade @@ -61,3 +61,13 @@ template(name="addListForm") a.open-list-composer.js-open-inlined-form i.fa.fa-plus | {{_ 'add-list'}} + +template(name="moveSwimlanePopup") + unless currentUser.isWorker + label {{_ 'boards'}}: + select.js-select-boards(autofocus) + each toBoard in toBoards + option(value="{{toBoard._id}}") {{toBoard.title}} + + .edit-controls.clearfix + button.primary.confirm.js-done {{_ 'done'}} diff --git a/client/components/swimlanes/swimlanes.js b/client/components/swimlanes/swimlanes.js index fc6bd5b8d..99ce15e61 100644 --- a/client/components/swimlanes/swimlanes.js +++ b/client/components/swimlanes/swimlanes.js @@ -323,3 +323,46 @@ BlazeComponent.extendComponent({ initSortable(boardComponent, $listsDom); }, }).register('listsGroup'); + +BlazeComponent.extendComponent({ + onCreated() { + this.currentSwimlane = this.currentData(); + }, + + board() { + return Boards.findOne(Session.get('currentBoard')); + }, + + toBoards() { + const boards = Boards.find( + { + archived: false, + 'members.userId': Meteor.userId(), + type: 'board', + _id: { $ne: this.board()._id }, + }, + { + sort: { title: 1 }, + }, + ); + + return boards; + }, + + events() { + return [ + { + 'click .js-done'() { + 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); + } + Popup.close(); + }, + }, + ]; + }, +}).register('moveSwimlanePopup'); diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 1e291ecac..7b484bc48 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -171,8 +171,6 @@ Template.changeLanguagePopup.helpers({ } else if (lang.name === 'ar-EG') { // ar-EG = Arabic (Egypt), simply Masri (مَصرى, [ˈmɑsˤɾi], Egyptian, Masr refers to Cairo) name = 'مَصرى'; - } else if (lang.name === 'es-PY') { - name = 'Español de Paraguayo'; } else if (lang.name === 'fa-IR') { // fa-IR = Persian (Iran) name = 'فارسی/پارسی (ایران‎)'; @@ -188,6 +186,14 @@ Template.changeLanguagePopup.helpers({ name = 'Latviešu'; } else if (lang.name === 'Español') { name = 'español'; + } else if (lang.name === 'es_419') { + name = 'español de América Latina'; + } else if (lang.name === 'es-419') { + name = 'español de América Latina'; + } else if (lang.name === 'Español de América Latina') { + name = 'español de América Latina'; + } else if (lang.name === 'es-LA') { + name = 'español de América Latina'; } else if (lang.name === 'Español de Argentina') { name = 'español de Argentina'; } else if (lang.name === 'Español de Chile') { @@ -198,6 +204,8 @@ Template.changeLanguagePopup.helpers({ name = 'español de México'; } else if (lang.name === 'es-PY') { name = 'español de Paraguayo'; + } else if (lang.name === 'Español de Paraguayo') { + name = 'español de Paraguayo'; } else if (lang.name === 'Español de Perú') { name = 'español de Perú'; } else if (lang.name === 'Español de Puerto Rico') { diff --git a/client/lib/cardSearch.js b/client/lib/cardSearch.js new file mode 100644 index 000000000..621b8bd3d --- /dev/null +++ b/client/lib/cardSearch.js @@ -0,0 +1,182 @@ +import Cards from '../../models/cards'; +import SessionData from '../../models/usersessiondata'; + +export class CardSearchPagedComponent extends BlazeComponent { + onCreated() { + this.searching = new ReactiveVar(false); + this.hasResults = new ReactiveVar(false); + this.hasQueryErrors = new ReactiveVar(false); + this.query = new ReactiveVar(''); + this.resultsHeading = new ReactiveVar(''); + this.searchLink = new ReactiveVar(null); + this.results = new ReactiveVar([]); + this.hasNextPage = new ReactiveVar(false); + this.hasPreviousPage = new ReactiveVar(false); + this.resultsCount = 0; + this.totalHits = 0; + this.queryErrors = null; + this.resultsPerPage = 25; + this.sessionId = SessionData.getSessionId(); + this.subscriptionHandle = null; + this.serverError = new ReactiveVar(false); + + const that = this; + this.subscriptionCallbacks = { + onReady() { + that.getResults(); + that.searching.set(false); + that.hasResults.set(true); + that.serverError.set(false); + }, + onError(error) { + that.searching.set(false); + that.hasResults.set(false); + that.serverError.set(true); + console.log('Error.reason:', error.reason); + console.log('Error.message:', error.message); + console.log('Error.stack:', error.stack); + }, + }; + } + + resetSearch() { + this.searching.set(false); + this.results.set([]); + this.hasResults.set(false); + this.hasQueryErrors.set(false); + this.resultsHeading.set(''); + this.serverError.set(false); + this.resultsCount = 0; + this.totalHits = 0; + this.queryErrors = null; + } + + getSessionData(sessionId) { + return SessionData.findOne({ + sessionId: sessionId ? sessionId : SessionData.getSessionId(), + }); + } + + getResults() { + // eslint-disable-next-line no-console + // console.log('getting results'); + const sessionData = this.getSessionData(); + // eslint-disable-next-line no-console + // console.log('selector:', sessionData.getSelector()); + console.log('session data:', sessionData); + const cards = []; + sessionData.cards.forEach(cardId => { + cards.push(Cards.findOne({ _id: cardId })); + }); + this.queryErrors = sessionData.errors; + if (this.queryErrors.length) { + // console.log('queryErrors:', this.queryErrorMessages()); + this.hasQueryErrors.set(true); + return null; + } + + if (cards) { + this.totalHits = sessionData.totalHits; + this.resultsCount = cards.length; + this.resultsStart = sessionData.lastHit - this.resultsCount + 1; + this.resultsEnd = sessionData.lastHit; + this.resultsHeading.set(this.getResultsHeading()); + this.results.set(cards); + this.hasNextPage.set(sessionData.lastHit < sessionData.totalHits); + this.hasPreviousPage.set( + sessionData.lastHit - sessionData.resultsCount > 0, + ); + return cards; + } + + this.resultsCount = 0; + return null; + } + + stopSubscription() { + if (this.subscriptionHandle) { + this.subscriptionHandle.stop(); + } + } + + runGlobalSearch(params) { + this.searching.set(true); + this.stopSubscription(); + this.subscriptionHandle = Meteor.subscribe( + 'globalSearch', + this.sessionId, + params, + this.subscriptionCallbacks, + ); + } + + queryErrorMessages() { + const messages = []; + + this.queryErrors.forEach(err => { + let value = err.color ? TAPi18n.__(`color-${err.value}`) : err.value; + if (!value) { + value = err.value; + } + messages.push(TAPi18n.__(err.tag, value)); + }); + + return messages; + } + + nextPage() { + this.searching.set(true); + this.stopSubscription(); + this.subscriptionHandle = Meteor.subscribe( + 'nextPage', + this.sessionId, + this.subscriptionCallbacks, + ); + } + + previousPage() { + this.searching.set(true); + this.stopSubscription(); + this.subscriptionHandle = Meteor.subscribe( + 'previousPage', + this.sessionId, + this.subscriptionCallbacks, + ); + } + + getResultsHeading() { + if (this.resultsCount === 0) { + return TAPi18n.__('no-cards-found'); + } else if (this.resultsCount === 1) { + return TAPi18n.__('one-card-found'); + } else if (this.resultsCount === this.totalHits) { + return TAPi18n.__('n-cards-found', this.resultsCount); + } + + return TAPi18n.__('n-n-of-n-cards-found', { + start: this.resultsStart, + end: this.resultsEnd, + total: this.totalHits, + }); + } + + getSearchHref() { + const baseUrl = window.location.href.replace(/([?#].*$|\s*$)/, ''); + return `${baseUrl}?q=${encodeURIComponent(this.query.get())}`; + } + + events() { + return [ + { + 'click .js-next-page'(evt) { + evt.preventDefault(); + this.nextPage(); + }, + 'click .js-previous-page'(evt) { + evt.preventDefault(); + this.previousPage(); + }, + }, + ]; + } +} diff --git a/config/query-classes.js b/config/query-classes.js new file mode 100644 index 000000000..3120dce71 --- /dev/null +++ b/config/query-classes.js @@ -0,0 +1,503 @@ +import { + OPERATOR_ASSIGNEE, + OPERATOR_BOARD, + OPERATOR_COMMENT, + OPERATOR_CREATED_AT, + OPERATOR_DUE, + OPERATOR_HAS, + OPERATOR_LABEL, + OPERATOR_LIMIT, + OPERATOR_LIST, + OPERATOR_MEMBER, + OPERATOR_MODIFIED_AT, + OPERATOR_SORT, + OPERATOR_STATUS, + OPERATOR_SWIMLANE, + OPERATOR_UNKNOWN, + OPERATOR_USER, + ORDER_ASCENDING, + ORDER_DESCENDING, + PREDICATE_ALL, + PREDICATE_ARCHIVED, + PREDICATE_ASSIGNEES, + PREDICATE_ATTACHMENT, + PREDICATE_CHECKLIST, + PREDICATE_CREATED_AT, + PREDICATE_DESCRIPTION, + PREDICATE_DUE_AT, + PREDICATE_END_AT, + PREDICATE_ENDED, + PREDICATE_MEMBERS, + PREDICATE_MODIFIED_AT, + PREDICATE_MONTH, + PREDICATE_OPEN, + PREDICATE_OVERDUE, + PREDICATE_PRIVATE, + PREDICATE_PUBLIC, + PREDICATE_QUARTER, + PREDICATE_START_AT, + PREDICATE_WEEK, + PREDICATE_YEAR, +} from './search-const'; +import Boards from '../models/boards'; +import moment from 'moment'; + +export class QueryParams { + text = ''; + + constructor(params = {}) { + this.params = params; + } + + hasOperator(operator) { + return this.params[operator]; + } + + addPredicate(operator, predicate) { + if (!this.hasOperator(operator)) { + this.params[operator] = []; + } + this.params[operator].push(predicate); + } + + setPredicate(operator, predicate) { + this.params[operator] = predicate; + } + + getPredicate(operator) { + return this.params[operator][0]; + } + + getPredicates(operator) { + return this.params[operator]; + } + + getParams() { + return this.params; + } +} + +export class QueryErrors { + operatorTagMap = [ + [OPERATOR_BOARD, 'board-title-not-found'], + [OPERATOR_SWIMLANE, 'swimlane-title-not-found'], + [ + OPERATOR_LABEL, + label => { + if (Boards.labelColors().includes(label)) { + return { + tag: 'label-color-not-found', + value: label, + color: true, + }; + } else { + return { + tag: 'label-not-found', + value: label, + color: false, + }; + } + }, + ], + [OPERATOR_LIST, 'list-title-not-found'], + [OPERATOR_COMMENT, 'comment-not-found'], + [OPERATOR_USER, 'user-username-not-found'], + [OPERATOR_ASSIGNEE, 'user-username-not-found'], + [OPERATOR_MEMBER, 'user-username-not-found'], + ]; + + constructor() { + this._errors = {}; + + this.operatorTags = {}; + this.operatorTagMap.forEach(([operator, tag]) => { + this.operatorTags[operator] = tag; + }); + + this.colorMap = Boards.colorMap(); + } + + addError(operator, error) { + if (!this._errors[operator]) { + this._errors[operator] = []; + } + this._errors[operator].push(error); + } + + addNotFound(operator, value) { + if (typeof this.operatorTags[operator] === 'function') { + this.addError(operator, this.operatorTags[operator](value)); + } else { + this.addError(operator, { tag: this.operatorTags[operator], value }); + } + } + + hasErrors() { + return Object.entries(this._errors).length > 0; + } + + errors() { + const errs = []; + // eslint-disable-next-line no-unused-vars + Object.entries(this._errors).forEach(([, errors]) => { + errors.forEach(err => { + errs.push(err); + }); + }); + return errs; + } + + errorMessages() { + const messages = []; + // eslint-disable-next-line no-unused-vars + Object.entries(this._errors).forEach(([, errors]) => { + errors.forEach(err => { + messages.push(TAPi18n.__(err.tag, err.value)); + }); + }); + return messages; + } +} + +export class Query { + selector = {}; + projection = {}; + + constructor(selector, projection) { + this._errors = new QueryErrors(); + this.queryParams = new QueryParams(); + this.colorMap = Boards.colorMap(); + + if (selector) { + this.selector = selector; + } + + if (projection) { + this.projection = projection; + } + } + + hasErrors() { + return this._errors.hasErrors(); + } + + errors() { + return this._errors.errors(); + } + + errorMessages() { + return this._errors.errorMessages(); + } + + getParams() { + return this.queryParams.getParams(); + } + + addPredicate(operator, predicate) { + this.queryParams.addPredicate(operator, predicate); + } + + buildParams(queryText) { + queryText = queryText.trim(); + // eslint-disable-next-line no-console + //console.log('query:', query); + + if (!queryText) { + return; + } + + const reOperator1 = new RegExp( + '^((?[\\p{Letter}\\p{Mark}]+):|(?[#@]))(?[\\p{Letter}\\p{Mark}]+)(\\s+|$)', + 'iu', + ); + const reOperator2 = new RegExp( + '^((?[\\p{Letter}\\p{Mark}]+):|(?[#@]))(?["\']*)(?.*?)\\k(\\s+|$)', + 'iu', + ); + const reText = new RegExp('^(?\\S+)(\\s+|$)', 'u'); + const reQuotedText = new RegExp( + '^(?["\'])(?.*?)\\k(\\s+|$)', + 'u', + ); + const reNegatedOperator = new RegExp('^-(?.*)$'); + + const operators = { + 'operator-board': OPERATOR_BOARD, + 'operator-board-abbrev': OPERATOR_BOARD, + 'operator-swimlane': OPERATOR_SWIMLANE, + 'operator-swimlane-abbrev': OPERATOR_SWIMLANE, + 'operator-list': OPERATOR_LIST, + 'operator-list-abbrev': OPERATOR_LIST, + 'operator-label': OPERATOR_LABEL, + 'operator-label-abbrev': OPERATOR_LABEL, + 'operator-user': OPERATOR_USER, + 'operator-user-abbrev': OPERATOR_USER, + 'operator-member': OPERATOR_MEMBER, + 'operator-member-abbrev': OPERATOR_MEMBER, + 'operator-assignee': OPERATOR_ASSIGNEE, + 'operator-assignee-abbrev': OPERATOR_ASSIGNEE, + 'operator-status': OPERATOR_STATUS, + 'operator-due': OPERATOR_DUE, + 'operator-created': OPERATOR_CREATED_AT, + 'operator-modified': OPERATOR_MODIFIED_AT, + 'operator-comment': OPERATOR_COMMENT, + 'operator-has': OPERATOR_HAS, + 'operator-sort': OPERATOR_SORT, + 'operator-limit': OPERATOR_LIMIT, + }; + + const predicates = { + due: { + 'predicate-overdue': PREDICATE_OVERDUE, + }, + durations: { + 'predicate-week': PREDICATE_WEEK, + 'predicate-month': PREDICATE_MONTH, + 'predicate-quarter': PREDICATE_QUARTER, + 'predicate-year': PREDICATE_YEAR, + }, + status: { + 'predicate-archived': PREDICATE_ARCHIVED, + 'predicate-all': PREDICATE_ALL, + 'predicate-open': PREDICATE_OPEN, + 'predicate-ended': PREDICATE_ENDED, + 'predicate-public': PREDICATE_PUBLIC, + 'predicate-private': PREDICATE_PRIVATE, + }, + sorts: { + 'predicate-due': PREDICATE_DUE_AT, + 'predicate-created': PREDICATE_CREATED_AT, + 'predicate-modified': PREDICATE_MODIFIED_AT, + }, + has: { + 'predicate-description': PREDICATE_DESCRIPTION, + 'predicate-checklist': PREDICATE_CHECKLIST, + 'predicate-attachment': PREDICATE_ATTACHMENT, + 'predicate-start': PREDICATE_START_AT, + 'predicate-end': PREDICATE_END_AT, + 'predicate-due': PREDICATE_DUE_AT, + 'predicate-assignee': PREDICATE_ASSIGNEES, + 'predicate-member': PREDICATE_MEMBERS, + }, + }; + const predicateTranslations = {}; + Object.entries(predicates).forEach(([category, catPreds]) => { + predicateTranslations[category] = {}; + Object.entries(catPreds).forEach(([tag, value]) => { + predicateTranslations[category][TAPi18n.__(tag)] = value; + }); + }); + // eslint-disable-next-line no-console + // console.log('predicateTranslations:', predicateTranslations); + + const operatorMap = {}; + Object.entries(operators).forEach(([key, value]) => { + operatorMap[TAPi18n.__(key).toLowerCase()] = value; + }); + // eslint-disable-next-line no-console + // console.log('operatorMap:', operatorMap); + + let text = ''; + while (queryText) { + let m = queryText.match(reOperator1); + if (!m) { + m = queryText.match(reOperator2); + if (m) { + queryText = queryText.replace(reOperator2, ''); + } + } else { + queryText = queryText.replace(reOperator1, ''); + } + if (m) { + let op; + if (m.groups.operator) { + op = m.groups.operator.toLowerCase(); + } else { + op = m.groups.abbrev.toLowerCase(); + } + // eslint-disable-next-line no-prototype-builtins + if (operatorMap.hasOwnProperty(op)) { + const operator = operatorMap[op]; + let value = m.groups.value; + if (operator === OPERATOR_LABEL) { + if (value in this.colorMap) { + value = this.colorMap[value]; + // console.log('found color:', value); + } + } else if ( + [OPERATOR_DUE, OPERATOR_CREATED_AT, OPERATOR_MODIFIED_AT].includes( + operator, + ) + ) { + const days = parseInt(value, 10); + let duration = null; + if (isNaN(days)) { + // duration was specified as text + if (predicateTranslations.durations[value]) { + duration = predicateTranslations.durations[value]; + let date = null; + switch (duration) { + case PREDICATE_WEEK: + // eslint-disable-next-line no-case-declarations + const week = moment().week(); + if (week === 52) { + date = moment(1, 'W'); + date.set('year', date.year() + 1); + } else { + date = moment(week + 1, 'W'); + } + break; + case PREDICATE_MONTH: + // eslint-disable-next-line no-case-declarations + const month = moment().month(); + // .month() is zero indexed + if (month === 11) { + date = moment(1, 'M'); + date.set('year', date.year() + 1); + } else { + date = moment(month + 2, 'M'); + } + break; + case PREDICATE_QUARTER: + // eslint-disable-next-line no-case-declarations + const quarter = moment().quarter(); + if (quarter === 4) { + date = moment(1, 'Q'); + date.set('year', date.year() + 1); + } else { + date = moment(quarter + 1, 'Q'); + } + break; + case PREDICATE_YEAR: + date = moment(moment().year() + 1, 'YYYY'); + break; + } + if (date) { + value = { + operator: '$lt', + value: date.format('YYYY-MM-DD'), + }; + } + } else if ( + operator === OPERATOR_DUE && + value === PREDICATE_OVERDUE + ) { + value = { + operator: '$lt', + value: moment().format('YYYY-MM-DD'), + }; + } else { + this.errors.addError(OPERATOR_DUE, { + tag: 'operator-number-expected', + value: { operator: op, value }, + }); + continue; + } + } else if (operator === OPERATOR_DUE) { + value = { + operator: '$lt', + value: moment(moment().format('YYYY-MM-DD')) + .add(days + 1, duration ? duration : 'days') + .format(), + }; + } else { + value = { + operator: '$gte', + value: moment(moment().format('YYYY-MM-DD')) + .subtract(days, duration ? duration : 'days') + .format(), + }; + } + } else if (operator === OPERATOR_SORT) { + let negated = false; + const m = value.match(reNegatedOperator); + if (m) { + value = m.groups.operator; + negated = true; + } + if (!predicateTranslations.sorts[value]) { + this.errors.addError(OPERATOR_SORT, { + tag: 'operator-sort-invalid', + value, + }); + continue; + } else { + value = { + name: predicateTranslations.sorts[value], + order: negated ? ORDER_DESCENDING : ORDER_ASCENDING, + }; + } + } else if (operator === OPERATOR_STATUS) { + if (!predicateTranslations.status[value]) { + this.errors.addError(OPERATOR_STATUS, { + tag: 'operator-status-invalid', + value, + }); + continue; + } else { + value = predicateTranslations.status[value]; + } + } else if (operator === OPERATOR_HAS) { + let negated = false; + const m = value.match(reNegatedOperator); + if (m) { + value = m.groups.operator; + negated = true; + } + if (!predicateTranslations.has[value]) { + this.errors.addError(OPERATOR_HAS, { + tag: 'operator-has-invalid', + value, + }); + continue; + } else { + value = { + field: predicateTranslations.has[value], + exists: !negated, + }; + } + } else if (operator === OPERATOR_LIMIT) { + const limit = parseInt(value, 10); + if (isNaN(limit) || limit < 1) { + this.errors.addError(OPERATOR_LIMIT, { + tag: 'operator-limit-invalid', + value, + }); + continue; + } else { + value = limit; + } + } + + this.queryParams.addPredicate(operator, value); + } else { + this.errors.addError(OPERATOR_UNKNOWN, { + tag: 'operator-unknown-error', + value: op, + }); + } + continue; + } + + m = queryText.match(reQuotedText); + if (!m) { + m = queryText.match(reText); + if (m) { + queryText = queryText.replace(reText, ''); + } + } else { + queryText = queryText.replace(reQuotedText, ''); + } + if (m) { + text += (text ? ' ' : '') + m.groups.text; + } + } + + // eslint-disable-next-line no-console + // console.log('text:', text); + this.queryParams.text = text; + + // eslint-disable-next-line no-console + console.log('queryParams:', this.queryParams); + } +} diff --git a/config/router.js b/config/router.js index 644d33dd1..0704adb63 100644 --- a/config/router.js +++ b/config/router.js @@ -118,6 +118,7 @@ FlowRouter.route('/shortcuts', { FlowRouter.route('/my-cards', { name: 'my-cards', + triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Filter.reset(); Session.set('sortBy', '') @@ -137,6 +138,7 @@ FlowRouter.route('/my-cards', { FlowRouter.route('/due-cards', { name: 'due-cards', + triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Filter.reset(); Session.set('sortBy', '') @@ -156,6 +158,7 @@ FlowRouter.route('/due-cards', { FlowRouter.route('/global-search', { name: 'global-search', + triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Filter.reset(); Session.set('sortBy', '') diff --git a/config/search-const.js b/config/search-const.js new file mode 100644 index 000000000..26f8ad00b --- /dev/null +++ b/config/search-const.js @@ -0,0 +1,41 @@ +export const DEFAULT_LIMIT = 25; +export const OPERATOR_ASSIGNEE = 'assignee'; +export const OPERATOR_COMMENT = 'comment'; +export const OPERATOR_CREATED_AT = 'createdAt'; +export const OPERATOR_DUE = 'dueAt'; +export const OPERATOR_BOARD = 'board'; +export const OPERATOR_HAS = 'has'; +export const OPERATOR_LABEL = 'label'; +export const OPERATOR_LIMIT = 'limit'; +export const OPERATOR_LIST = 'list'; +export const OPERATOR_MEMBER = 'member'; +export const OPERATOR_MODIFIED_AT = 'modifiedAt'; +export const OPERATOR_SORT = 'sort'; +export const OPERATOR_STATUS = 'status'; +export const OPERATOR_SWIMLANE = 'swimlane'; +export const OPERATOR_UNKNOWN = 'unknown'; +export const OPERATOR_USER = 'user'; +export const ORDER_ASCENDING = 'asc'; +export const ORDER_DESCENDING = 'des'; +export const PREDICATE_ALL = 'all'; +export const PREDICATE_ARCHIVED = 'archived'; +export const PREDICATE_ASSIGNEES = 'assignees'; +export const PREDICATE_ATTACHMENT = 'attachment'; +export const PREDICATE_CHECKLIST = 'checklist'; +export const PREDICATE_CREATED_AT = 'createdAt'; +export const PREDICATE_DESCRIPTION = 'description'; +export const PREDICATE_DUE_AT = 'dueAt'; +export const PREDICATE_END_AT = 'endAt'; +export const PREDICATE_ENDED = 'ended'; +export const PREDICATE_MEMBERS = 'members'; +export const PREDICATE_MODIFIED_AT = 'modifiedAt'; +export const PREDICATE_MONTH = 'month'; +export const PREDICATE_OPEN = 'open'; +export const PREDICATE_OVERDUE = 'overdue'; +export const PREDICATE_PRIVATE = 'private'; +export const PREDICATE_PUBLIC = 'public'; +export const PREDICATE_QUARTER = 'quarter'; +export const PREDICATE_START_AT = 'startAt'; +export const PREDICATE_SYSTEM = 'system'; +export const PREDICATE_WEEK = 'week'; +export const PREDICATE_YEAR = 'year'; diff --git a/docker-compose.yml b/docker-compose.yml index 7eff8e493..ce862c664 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -209,6 +209,9 @@ services: # There is Feature Request: Logging date and time of all activity with summary reports, # and requesting reason for changing card to other column https://github.com/wekan/wekan/issues/1598 #--------------------------------------------------------------- + # ==== NUMBER OF SEARCH RESULTS PER PAGE BY DEFAULT ==== + #- RESULTS_PER_PAGE=20 + #--------------------------------------------------------------- # ==== WEKAN API AND EXPORT BOARD ==== # Wekan Export Board works when WITH_API=true. # https://github.com/wekan/wekan/wiki/REST-API diff --git a/i18n/ar-EG.i18n.json b/i18n/ar-EG.i18n.json index fa6f0b52b..5caaf0daf 100644 --- a/i18n/ar-EG.i18n.json +++ b/i18n/ar-EG.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 3975ba899..0a007fa7f 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/bg.i18n.json b/i18n/bg.i18n.json index aa8a1a0bc..1582690c4 100644 --- a/i18n/bg.i18n.json +++ b/i18n/bg.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index ce5d644ec..0e568e8bd 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index 05f501278..df1a4d721 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index bcb1530f4..47d2bb2d4 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -906,7 +906,7 @@ "operator-modified": "modifikováno", "operator-sort": "třídění", "operator-comment": "komentář", - "operator-has": "has", + "operator-has": "má", "operator-limit": "limit", "predicate-archived": "archivováno", "predicate-open": "otevřít", @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Třídit", "cardsSortPopup-title": "Třídit", "due-date": "Požadovaný termín", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Nadpis (Abecedně)", "created-at-newest-first": "Vyvtořeno (Od nejnovějších)", - "created-at-oldest-first": "Vytvořeno (Od nejstarších)" + "created-at-oldest-first": "Vytvořeno (Od nejstarších)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/da.i18n.json b/i18n/da.i18n.json index 944039a16..e24020c3b 100644 --- a/i18n/da.i18n.json +++ b/i18n/da.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index c5a01d6e5..296ab3a23 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` – Karten in Swimlanes, auf die das angebene *<title>* passt", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` – Karten mit einem Kommentar, das *<text>* enthält.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` – Karten, die ein Label haben, auf das *<color>* oder *<name> passt", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` – Kurzform von `__operator_label__:<color>` oder `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<Name|Farbe>` – Kurzform für `__operator_label__:<color>` oder `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` – Karten, für die *<username>* ein *Mitglied* oder ein *Zugewiesener* ist", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` – Kurzform für `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` – Karten, von denen *<username>* *Mitglied* ist", @@ -978,7 +978,14 @@ "sort-cards": "Sortiere Karten", "cardsSortPopup-title": "Sortiere Karten", "due-date": "Fälligkeitsdatum", + "server-error": "Server-Fehler", + "server-error-troubleshooting": "Bitte übermitteln Sie den Fehler, den der Server erzeugt hat.\nRufen Sie für eine Snap-Installation auf: `sudo snap logs wekan.wekan`\nRufen Sie für eine Docker-Installation auf: `sudo docker logs wekan-app`", "title-alphabetically": "Überschrift (alphabetisch)", "created-at-newest-first": "Erstelldatum (neueste zuerst)", - "created-at-oldest-first": "Erstelldatum (älteste zuerst)" + "created-at-oldest-first": "Erstelldatum (älteste zuerst)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Alle System-Nachrichten aller Nutzer verbergen", + "now-system-messages-of-all-users-are-hidden": "Alle System-Nachrichten aller Nutzer sind nun verborgen", + "move-swimlane": "Swimlane verschieben", + "moveSwimlanePopup-title": "Swimlane verschieben" } diff --git a/i18n/el.i18n.json b/i18n/el.i18n.json index 80cb97a05..025fa1334 100644 --- a/i18n/el.i18n.json +++ b/i18n/el.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json index 9a306ce44..75f444d84 100644 --- a/i18n/en-GB.i18n.json +++ b/i18n/en-GB.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 7420018b8..e20645c51 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -947,7 +947,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -979,7 +979,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json index 9219e3843..96816baef 100644 --- a/i18n/eo.i18n.json +++ b/i18n/eo.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json index 69e50d842..6484bed3e 100644 --- a/i18n/es-AR.i18n.json +++ b/i18n/es-AR.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/es-CL.i18n.json b/i18n/es-CL.i18n.json index 5fb689cf2..c8c333796 100644 --- a/i18n/es-CL.i18n.json +++ b/i18n/es-CL.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/es-LA.i18n.json b/i18n/es-LA.i18n.json new file mode 100644 index 000000000..5caaf0daf --- /dev/null +++ b/i18n/es-LA.i18n.json @@ -0,0 +1,991 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-card": "Add Card", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardDeletePopup-title": "Delete Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "exportBoardPopup-title": "Export board", + "sort": "Sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "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", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-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", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" +} diff --git a/i18n/es-MX.i18n.json b/i18n/es-MX.i18n.json index 23bbbfbac..24ea55a87 100644 --- a/i18n/es-MX.i18n.json +++ b/i18n/es-MX.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/es-PE.i18n.json b/i18n/es-PE.i18n.json index eb0e479d9..39c9209ad 100644 --- a/i18n/es-PE.i18n.json +++ b/i18n/es-PE.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/es-PY.i18n.json b/i18n/es-PY.i18n.json index fa6f0b52b..5caaf0daf 100644 --- a/i18n/es-PY.i18n.json +++ b/i18n/es-PY.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index 9e754b313..f2b7ffaba 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json index 8467348cd..f0fe97fb1 100644 --- a/i18n/eu.i18n.json +++ b/i18n/eu.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/fa-IR.i18n.json b/i18n/fa-IR.i18n.json index fa6f0b52b..5caaf0daf 100644 --- a/i18n/fa-IR.i18n.json +++ b/i18n/fa-IR.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index 1e7089e33..8a3a97364 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "تاریخ اجرا", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "تیتر (به صورت الفبا)", "created-at-newest-first": "ساخته شده در تاریخ (با اولویت جدید تر)", - "created-at-oldest-first": "ساخته شده در تاریخ (با اولویت قدیمی تر)" + "created-at-oldest-first": "ساخته شده در تاریخ (با اولویت قدیمی تر)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index 16f2f412c..e3306006e 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - kortit swimlaneilla jotka täsmää määritettyyn *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - kortit joilla on kommentti joka sisältää *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - kortit joilla on nimilappu joka täsmää *<color>* tai *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - lyhenne `__operator_label__:<color>` tai `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<nimi|väri>` - lyhenne `__operator_label__:<color>` tai `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - kortit joilla *<username>* on *jäsen* tai *käsittelijä*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - lyhenne `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards joilla *<username>* on *jäsen*", @@ -978,7 +978,14 @@ "sort-cards": "Lajittele kortit", "cardsSortPopup-title": "Lajittele kortit", "due-date": "Eräpäivä", + "server-error": "Palvelin virhe", + "server-error-troubleshooting": "Ole hyvä ja lähetä palvelimen tekemät lokit.\nSnap asennuksessan, komennolla: `sudo snap logs wekan.wekan`\nDocker asennuksessa, komennolla: `sudo docker logs wekan-app`", "title-alphabetically": "Otsikko (Aakkosjärjestyksessä)", "created-at-newest-first": "Luotu (Uusin ensin)", - "created-at-oldest-first": "Luotu (Vanhin ensin)" + "created-at-oldest-first": "Luotu (Vanhin ensin)", + "links-heading": "Linkit", + "hide-system-messages-of-all-users": "Piilota kaikkien käyttäjien järjestelmäviestit", + "now-system-messages-of-all-users-are-hidden": "Nyt kaikkien käyttäjien järjestelmäviestit on piilotettu", + "move-swimlane": "Siirrä Swimlane", + "moveSwimlanePopup-title": "Siirrä Swimlane" } diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 03b2e9ac9..0eca0ea4c 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -978,7 +978,14 @@ "sort-cards": "Trier les cartes", "cardsSortPopup-title": "Trier les cartes", "due-date": "Date d'échéance", + "server-error": "Erreur serveur", + "server-error-troubleshooting": "Merci de soumettre l'erreur générée par le serveur. Pour une installation snap, lancer `sudo snap logs wekan.wekan`. Pour une installation docker, lancer `sudo docker logs wekan-app`", "title-alphabetically": "Titre (Alphabétiquement)", "created-at-newest-first": "Date de création (Plus récentes en premier)", - "created-at-oldest-first": "Date de création (Plus anciennes en premier)" + "created-at-oldest-first": "Date de création (Plus anciennes en premier)", + "links-heading": "Liens", + "hide-system-messages-of-all-users": "Masquer les messages système de tous les utilisateurs", + "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" } diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json index a3d64595a..010623124 100644 --- a/i18n/gl.i18n.json +++ b/i18n/gl.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index 20b359c5e..85d862f08 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - כרטיסים במסלולים שעונים על *<title>* שצוין", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - כרטיסים עם הערה שמכילים *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - כרטיסים שיש להם תווית שתואמת את *<color>* או את *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - קיצור של `__operator_label__:<color>` או `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - כרטיסים שהוקצו אל *<username>* או שהוא *חבר* בהם", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - קיצור של `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - כרטיסים בהם *<username>* *חבר*", @@ -978,7 +978,14 @@ "sort-cards": "מיון כרטיסים", "cardsSortPopup-title": "מיון כרטיסים", "due-date": "מועד סיום", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "כותרת (לפי האלפבית)", "created-at-newest-first": "מועד יצירה (החדש ביותר בהתחלה)", - "created-at-oldest-first": "מועד יצירה (הישן ביותר בהתחלה)" + "created-at-oldest-first": "מועד יצירה (הישן ביותר בהתחלה)", + "links-heading": "קישורים", + "hide-system-messages-of-all-users": "להסתיר את הודעות המערכת של כל המשתמשים", + "now-system-messages-of-all-users-are-hidden": "כעת הודעות המערכת של כל המשתמשים מוסתרות", + "move-swimlane": "העברת מסלול", + "moveSwimlanePopup-title": "העברת מסלול" } diff --git a/i18n/hi.i18n.json b/i18n/hi.i18n.json index 9a6a0bd99..1f1a8ef89 100644 --- a/i18n/hi.i18n.json +++ b/i18n/hi.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/hr.i18n.json b/i18n/hr.i18n.json index c9299d81e..5990fd25b 100644 --- a/i18n/hr.i18n.json +++ b/i18n/hr.i18n.json @@ -132,10 +132,10 @@ "board-private-info": "This board will be <strong>private</strong>.", "board-public-info": "This board will be <strong>public</strong>.", "boardChangeColorPopup-title": "Change Board Background", - "boardChangeTitlePopup-title": "Rename Board", - "boardChangeVisibilityPopup-title": "Change Visibility", - "boardChangeWatchPopup-title": "Change Watch", - "boardMenuPopup-title": "Board Settings", + "boardChangeTitlePopup-title": "Preimenuj ploču", + "boardChangeVisibilityPopup-title": "Promijeni vidljivost", + "boardChangeWatchPopup-title": "Promijeni praćenje", + "boardMenuPopup-title": "Postavke ploče", "boardChangeViewPopup-title": "Board View", "boards": "Ploče", "board-view": "Board View", @@ -144,27 +144,27 @@ "board-view-collapse": "Collapse", "board-view-gantt": "Gantt", "board-view-lists": "Liste", - "bucket-example": "Like “Bucket List” for example", + "bucket-example": "Na primjer, poput \"Liste zadataka\"", "cancel": "Odustani", "card-archived": "Ova kartica prebačena je u arhivu.", "board-archived": "Ova ploča prebačena je u arhivu.", "card-comments-title": "Broj komentara na ovoj kartici je %s.", - "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", - "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", - "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", - "card-due": "Due", - "card-due-on": "Due on", + "card-delete-notice": "Brisanje je trajno. Izgubit ćete sve radnje povezane s ovom karticom.", + "card-delete-pop": "Sve radnje će biti uklonjene iz liste aktivnosti i nećete moći ponovo otvoriti karticu. Nema poništavanja radnje.", + "card-delete-suggest-archive": "Karticu možete premjestiti u arhivu da biste je uklonili s ploče i sačuvali aktivnost.", + "card-due": "Dospijeće", + "card-due-on": "Dospijeće na", "card-spent": "Provedeno vrijeme", "card-edit-attachments": "Uredi privitke", "card-edit-custom-fields": "Uredi prilagođena polja", "card-edit-labels": "Uredi oznake", "card-edit-members": "Uredi korisnike", - "card-labels-title": "Change the labels for the card.", - "card-members-title": "Add or remove members of the board from the card.", - "card-start": "Start", - "card-start-on": "Starts on", - "cardAttachmentsPopup-title": "Attach From", - "cardCustomField-datePopup-title": "Change date", + "card-labels-title": "Promijenite oznake na kartici.", + "card-members-title": "Dodajte ili uklonite članove ploče s kartice.", + "card-start": "Početak", + "card-start-on": "Počinje od", + "cardAttachmentsPopup-title": "Privitak od", + "cardCustomField-datePopup-title": "Promjena datuma", "cardCustomFieldsPopup-title": "Uredi prilagođena polja", "cardStartVotingPopup-title": "Pokreni glasanje", "positiveVoteMembersPopup-title": "Proponents", @@ -186,7 +186,7 @@ "cardTemplatePopup-title": "Dodati predložak", "cards": "Kartice", "cards-count": "Kartice", - "casSignIn": "Sign In with CAS", + "casSignIn": "Prijavite se s CAS-om", "cardType-card": "Kartica", "cardType-linkedCard": "Povezane kartice", "cardType-linkedBoard": "Povezane ploče", @@ -202,12 +202,12 @@ "changeSettingsPopup-title": "Promijeni postavke", "subtasks": "Podzadaci", "checklists": "Liste provjere", - "click-to-star": "Click to star this board.", - "click-to-unstar": "Click to unstar this board.", - "clipboard": "Clipboard or drag & drop", + "click-to-star": "Kliknite da biste ovu ploču označili zvjezdicom.", + "click-to-unstar": "Kliknite da biste uklonili zvjezdicu s ove ploče.", + "clipboard": "Međuspremnik ili povucite i ispustite", "close": "Zatvori", "close-board": "Zatvori ploču", - "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-board-pop": "Ploču ćete moći vratiti klikom na gumb \"Arhiviraj\" u zaglavlju.", "color-black": "crna", "color-blue": "plava", "color-crimson": "tamnocrvena", @@ -219,26 +219,26 @@ "color-lime": "lime", "color-magenta": "magenta", "color-mistyrose": "mistyrose", - "color-navy": "navy", + "color-navy": "mornarsko plava", "color-orange": "orange", "color-paleturquoise": "paleturquoise", "color-peachpuff": "peachpuff", - "color-pink": "pink", + "color-pink": "ružičasta", "color-plum": "plum", - "color-purple": "purple", - "color-red": "red", + "color-purple": "ljubičasta", + "color-red": "crvena", "color-saddlebrown": "saddlebrown", - "color-silver": "silver", + "color-silver": "srebrna", "color-sky": "sky", "color-slateblue": "slateblue", - "color-white": "white", - "color-yellow": "yellow", + "color-white": "bijela", + "color-yellow": "žuta", "unset-color": "Unset", "comment": "Komentiraj", "comment-placeholder": "Napiši komentar", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "no-comments": "No comments", + "no-comments": "Nema komentara", "no-comments-desc": "Can not see comments and activities.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", @@ -266,8 +266,8 @@ "custom-field-date": "Datum", "custom-field-dropdown": "Padajuća lista", "custom-field-dropdown-none": "(none)", - "custom-field-dropdown-options": "List Options", - "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-options": "Opcije popisa", + "custom-field-dropdown-options-placeholder": "Pritisnite enter da biste dodali više opcija", "custom-field-dropdown-unknown": "(nepoznato)", "custom-field-number": "Broj", "custom-field-text": "Tekst", @@ -478,7 +478,7 @@ "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", "removeMemberPopup-title": "Ukloniti korisnika?", "rename": "Preimenovati", - "rename-board": "Rename Board", + "rename-board": "Preimenuj ploču", "restore": "Restore", "save": "Spremi", "search": "Traži", @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json index af8809445..5bfc67ada 100644 --- a/i18n/hu.i18n.json +++ b/i18n/hu.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/hy.i18n.json b/i18n/hy.i18n.json index f14dc8c94..be258582e 100644 --- a/i18n/hy.i18n.json +++ b/i18n/hy.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json index 035e31fd2..24de2a449 100644 --- a/i18n/id.i18n.json +++ b/i18n/id.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/ig.i18n.json b/i18n/ig.i18n.json index 96b9efe00..efe96c17c 100644 --- a/i18n/ig.i18n.json +++ b/i18n/ig.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 54a9710b9..bb3104a06 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - schede in swimlane corrispondenti a *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - schede con commenti contenenti *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - schede aventi un'etichetta corrispondente a *<color>* oppure *<name>*", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - abbreviazione per `__operator_label__:<color>` oppure `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - schede dove *<username>* è un *membro* oppure *assegnatario*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - abbreviazione per `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - schede dove *<username>* è un *membro*", @@ -978,7 +978,14 @@ "sort-cards": "Ordina schede", "cardsSortPopup-title": "Ordina schede", "due-date": "Data di scadenza", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Titolo (ordine alfabetico)", "created-at-newest-first": "Data di creazione (dalla più nuova)", - "created-at-oldest-first": "Data di creazione (dalla più vecchia)" + "created-at-oldest-first": "Data di creazione (dalla più vecchia)", + "links-heading": "Link", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Sposta swimlane", + "moveSwimlanePopup-title": "Sposta swimlane" } diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index 4e81b9032..8d6532755 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -322,8 +322,8 @@ "error-user-notAllowSelf": "自分を招待することはできません。", "error-user-notCreated": "ユーザーが作成されていません", "error-username-taken": "このユーザ名は既に使用されています", - "error-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", + "error-orgname-taken": "この組織名はすでに使われています", + "error-teamname-taken": "このチーム名はすでに使われています", "error-email-taken": "メールは既に受け取られています", "export-board": "ボードのエクスポート", "export-board-json": "ボードをJSONにエクスポート", @@ -931,7 +931,7 @@ "predicate-private": "非公開", "operator-unknown-error": "%sは演算子ではありません", "operator-number-expected": "演算子 __operator__ には数値の指定が必要ですが、「__value__」が入力されました", - "operator-sort-invalid": "sort of '%s' is invalid", + "operator-sort-invalid": "ソート「%s」は無効です", "operator-status-invalid": "「%s」は無効なステータスです", "operator-has-invalid": "%s is not a valid existence check", "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "カードの並び替え", "cardsSortPopup-title": "カードの並び替え", "due-date": "期限日", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "タイトル(アルファベット順)", "created-at-newest-first": "作成日(新しいものから)", - "created-at-oldest-first": "作成日(古いものから)" + "created-at-oldest-first": "作成日(古いものから)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/ka.i18n.json b/i18n/ka.i18n.json index 5a2add7f7..876d4a5ae 100644 --- a/i18n/ka.i18n.json +++ b/i18n/ka.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/km.i18n.json b/i18n/km.i18n.json index 6b1a028a2..150553f55 100644 --- a/i18n/km.i18n.json +++ b/i18n/km.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index fd9afb755..1416ab322 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/lt.i18n.json b/i18n/lt.i18n.json index fa6f0b52b..5caaf0daf 100644 --- a/i18n/lt.i18n.json +++ b/i18n/lt.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json index f076d69eb..4b4f59e86 100644 --- a/i18n/lv.i18n.json +++ b/i18n/lv.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/mk.i18n.json b/i18n/mk.i18n.json index eb1043fca..7bc945041 100644 --- a/i18n/mk.i18n.json +++ b/i18n/mk.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json index 37e514cea..1030e2b6e 100644 --- a/i18n/mn.i18n.json +++ b/i18n/mn.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index 45aa62446..de7c61288 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -532,7 +532,7 @@ "custom-login-logo-image-url": "URL Voor Maatwerk Login Logo Afbeelding", "custom-login-logo-link-url": "URL Voor Maatwerk Login Logo Link", "text-below-custom-login-logo": "Tekst onder Maatwerk Login Logo", - "automatic-linked-url-schemes": "Maatwerk URL's die automatisch klikbaar zouden moeten zijn. Een URL per regel.", + "automatic-linked-url-schemes": "Maatwerk URL-schema's die automatisch klikbaar zouden moeten zijn. Een URL per regel.", "username": "Gebruikersnaam", "import-usernames": "Importeer Gebruikersnamen", "view-it": "Bekijk het", @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` -kaarten in swimlanes die overeenkomen met *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` -kaarten met commentaar die bevat *<text>*", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - kaarten die een label hebben met *<color>* of *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - afkorting voor `__operator_label__:<color>` of `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - kaarten waar *<username>* is a *lid* or *actiehouder*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - afkorting voor `gebruiker:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - kaarten waar *<username>* een *lid* is", @@ -978,7 +978,14 @@ "sort-cards": "Sorteer Kaarten", "cardsSortPopup-title": "Sorteer Kaarten", "due-date": "vervaldatum", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Titel (Alfabetisch)", "created-at-newest-first": "Aangemaakt op (Nieuwste Eerst)", - "created-at-oldest-first": "Aangemaakt op (Oudste Eerst)" + "created-at-oldest-first": "Aangemaakt op (Oudste Eerst)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Verberg systeemberichten voor alle gebruikers", + "now-system-messages-of-all-users-are-hidden": "Systeemberichten zijn nu verborgen voor alle gebruikers", + "move-swimlane": "Verplaats Swimlane", + "moveSwimlanePopup-title": "Verplaats Swimlane" } diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json index 192f218c5..d2b5d5f99 100644 --- a/i18n/oc.i18n.json +++ b/i18n/oc.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/pa.i18n.json b/i18n/pa.i18n.json index fa6f0b52b..5caaf0daf 100644 --- a/i18n/pa.i18n.json +++ b/i18n/pa.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index bf36d3819..fec439258 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -532,7 +532,7 @@ "custom-login-logo-image-url": "URL obrazu logo ekranu logowania", "custom-login-logo-link-url": "URL linku logo ekranu logowania", "text-below-custom-login-logo": "Tekst pod logo na ekranie logowania", - "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "automatic-linked-url-schemes": "Schematy adresów URL, które powinny być automatycznie przekształcane w aktywne. Wpisz jeden schemat URL w każdej linii", "username": "Nazwa użytkownika", "import-usernames": "Importuj użytkowników", "view-it": "Zobacz", @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - karty na ścieżkach pasujących do klucza *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - karty z komentarzem zawierającym *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - karty z etykietą pasującą do *<color>* lub *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - skrócona forma dla `__operator_label__:<color>` lub `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - karty, których *użytkownikiem* lub *osobą przypisaną* jest *<username>*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - skrócona forma dla `użytkownik:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - karty, których *użytkownikiem* jest *<username>*", @@ -978,7 +978,14 @@ "sort-cards": "Sortuj karty", "cardsSortPopup-title": "Sortuj karty według", "due-date": "terminu wykonania", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "nazwy (alfabetycznie)", "created-at-newest-first": "daty utworzenia (najpierw najnowsze)", - "created-at-oldest-first": "daty utworzenia (najpierw najstarsze)" + "created-at-oldest-first": "daty utworzenia (najpierw najstarsze)", + "links-heading": "Linki", + "hide-system-messages-of-all-users": "Ukryj powiadomienia systemowe wszystkich użytkowników", + "now-system-messages-of-all-users-are-hidden": "Odtąd powiadomienia systemowe wszystkich użytkowników będą ukryte", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index 06d19bef5..159aa9f9e 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cartões em raias correspondente ao especificado *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cartões com um comentário contendo *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cartões que possuem uma etiqueta correspondente a *<color>* ou *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - abreviação para `__operator_label__:<color>` ou `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cartões onde *<username>* é um *member* ou *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - abreviação para `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cartões onde *<username>* é um *member*", @@ -978,7 +978,14 @@ "sort-cards": "Ordenar Cartões", "cardsSortPopup-title": "Ordenar Cartões", "due-date": "Prazo Final", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Título (alfabeticamente) ", "created-at-newest-first": "Criado em (o mais recente primeiro) ", - "created-at-oldest-first": "Criado em (o mais antigo primeiro) " + "created-at-oldest-first": "Criado em (o mais antigo primeiro) ", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Esconder mensagens do sistema para todos os usuários", + "now-system-messages-of-all-users-are-hidden": "Agora as mensagens do sistema para todos os usuários estão escondidas ", + "move-swimlane": "Mover Raia", + "moveSwimlanePopup-title": "Mover Raia" } diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index 4f8f24368..d72420725 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index 145763e3c..5fdbd91c7 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index 63fba70cd..601ccee83 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -943,30 +943,30 @@ "globalSearch-instructions-operators": "Доступные операторы:", "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - карточки соответствуют: *<title>*", "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - карточки в списке соответствуют: *<title>*", - "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", - "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", - "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", - "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", - "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", - "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", - "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", - "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", - "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", - "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", - "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - карточки на дорожках, соответствующих *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - карточки с комментарием содержащим *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - карточки, которые имеют метку соответствующую *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - карточки в которых *<username>* *участник* или *исполнитель*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - сокращение для `пользователь:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - карточки, в которых *<username>* *участник*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - карточки, в которых *<username>* *исполнитель*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - карточки с датой завершения до *<n>* дней от текущей даты. `__operator_due__:__predicate_overdue__ список всех просроченных карточек.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - карточки, которые были созданы до *<n>* дней назад", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - карточки, который изменены до *<n>* дней назад", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - где *<status>* что-то из следующего:", "globalSearch-instructions-status-archived": "`__predicate_archived__` - архивированные карточки", "globalSearch-instructions-status-all": "`__predicate_all__` - все архивированные и не архивированные карточки", "globalSearch-instructions-status-ended": "`__predicate_ended__` - карточки с датой завершения", "globalSearch-instructions-status-public": "`__predicate_public__` - карточки только на публичных досках", "globalSearch-instructions-status-private": "`__predicate_private__` - карточки только на личных досках", - "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", - "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", - "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - где *<field>* что-либо из `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` или `__predicate_member__`. Указание `-` перед *<field>* производит поиск по отсутствию значения в указанном поле. (напр. `has:-due` поиск карточек без даты завершения).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - где*<sort-name>* что-либо из `__predicate_due__`, `__predicate_created__` или `__predicate_modified__`. Для сортировки по убыванию, укажите `-` перед названием сортировки.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - где *<n>* положительное целое определяющее количество карточек на одной странице.", "globalSearch-instructions-notes-1": "Может быть задано несколько операторов.", "globalSearch-instructions-notes-2": "Одинаковые операторы объединяются логическим \"ИЛИ\", например:\n`__operator_list__:Available __operator_list__:Blocked` вернет карточки, которые содержатся в списке *Blocked* или *Available*.", "globalSearch-instructions-notes-3": "Разные операторы объединяются логическим \"И\". Возвращаются только объекты удовлетворяющие всем заданным условиям.`__operator_list__:Available __operator_label__:red` вернет карточки, которые содержатся в списке *Available* и имеют метку *red*.", - "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-3-2": "Количество дней может быть задано положительным или отрицательным целым или используя `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` или `__predicate_year__` для текущего периода.", "globalSearch-instructions-notes-4": "Текстовый поиск нечувствителен к регистру символов.", "globalSearch-instructions-notes-5": "По умолчанию, поиск в архивированных карточках не производится.", "link-to-search": "Ссылка на этот поиск", @@ -978,7 +978,14 @@ "sort-cards": "Сортировать карточки", "cardsSortPopup-title": "Сортировать карточки", "due-date": "Назначенная дата", + "server-error": "Ошибка сервера", + "server-error-troubleshooting": "Пожалуйста отправьте описание ошибки созданное сервером.\nДля установки с помощью snap, запустите: `sudo snap logs wekan.wekan`\nДля установки с помощью Docker, запустите: `sudo docker logs wekan-app`", "title-alphabetically": "Название (по алфавиту)", "created-at-newest-first": "Дата создания (сначала новые)", - "created-at-oldest-first": "Дата создания (сначала старые)" + "created-at-oldest-first": "Дата создания (сначала старые)", + "links-heading": "Ссылки", + "hide-system-messages-of-all-users": "Скрыть системные сообщения всех пользователей", + "now-system-messages-of-all-users-are-hidden": "Системные сообщения всех пользователей скрыты", + "move-swimlane": "Переместить дорожку", + "moveSwimlanePopup-title": "Переместить дорожку" } diff --git a/i18n/sk.i18n.json b/i18n/sk.i18n.json index c9c78c86f..d94f09878 100644 --- a/i18n/sk.i18n.json +++ b/i18n/sk.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/sl.i18n.json b/i18n/sl.i18n.json index 4fa089df8..4bd00fc3f 100644 --- a/i18n/sl.i18n.json +++ b/i18n/sl.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index 864c7c955..bba40770e 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json index 23b40f45f..3d621a36b 100644 --- a/i18n/sv.i18n.json +++ b/i18n/sv.i18n.json @@ -532,7 +532,7 @@ "custom-login-logo-image-url": "Länk till bild för anpassad logotyp på inloggningssidan", "custom-login-logo-link-url": "Länk för anpassad logotyp på inloggningssidan", "text-below-custom-login-logo": "Text under anpassad logga för inloggning", - "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "automatic-linked-url-schemes": "Anpassade URL-scheman som ska vara klickbara automatiskt. Ett URL-schema per rad", "username": "Änvandarnamn", "import-usernames": "Importera användarnamn", "view-it": "Visa det", @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - kort i simbanor matchande den specifierade *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - kort med kommentar innehållandes *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` -kort med märkning som matchar *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color> - förkortning för `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - förkortning för `__operator_label__:<color>` eller `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - kort där*<username>* är en *medlem* eller *tilldelad*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - förkortning för `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - kort där *<username>* är en *medlem*", @@ -978,7 +978,14 @@ "sort-cards": "Sortera Kort", "cardsSortPopup-title": "Sortera Kort", "due-date": "Förfallodatum", + "server-error": "Serverfel", + "server-error-troubleshooting": "Skicka in felet som inträffade på servern.\nFör snap-installationer, kör: `sudo snap logs wekan.wekan`\nFör Docker-installationer, kör: `sudo docker logs wekan-app`", "title-alphabetically": "Titel (Alfabetisk)", "created-at-newest-first": "Skapad den (Nyast först)", - "created-at-oldest-first": "Skapad den (äldst först)" + "created-at-oldest-first": "Skapad den (äldst först)", + "links-heading": "Länkar", + "hide-system-messages-of-all-users": "Göm systemmeddelanden för alla användare", + "now-system-messages-of-all-users-are-hidden": "Systemmeddelande dolda för alla användare", + "move-swimlane": "Flytta simbana", + "moveSwimlanePopup-title": "Flytta simbana" } diff --git a/i18n/sw.i18n.json b/i18n/sw.i18n.json index 06cf38ed1..4d8628d04 100644 --- a/i18n/sw.i18n.json +++ b/i18n/sw.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json index f7764e4d6..954b11302 100644 --- a/i18n/ta.i18n.json +++ b/i18n/ta.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json index 2cabf10ea..57e04bfdf 100644 --- a/i18n/th.i18n.json +++ b/i18n/th.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index 65a363a91..c7164986b 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json index 58be767fb..26c7f53d6 100644 --- a/i18n/uk.i18n.json +++ b/i18n/uk.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json index 26c1dffa5..3b4a3d835 100644 --- a/i18n/vi.i18n.json +++ b/i18n/vi.i18n.json @@ -1,52 +1,52 @@ { "accept": "Chấp nhận", "act-activity-notify": "Thông báo hoạt động", - "act-addAttachment": "thêm tập tin đính kèm __attachment__ vào thẻ __list__ tại danh sách __list__ tại đường bơi __swimlane__ tại bảng __board__", - "act-deleteAttachment": "xóa tập tin đính kèm __attachment__ tại thẻ __card__ tại danh sách __list__ tại đường bơi __swimlane__ tại bảng __board__ ", - "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addLabel": "Đã thêm nhãn __label__ vào thẻ __card__ tại danh sách __list__ tại luồng __swimlane__ tại bảng __board__", - "act-addedLabel": "Đã thêm nhãn __label__ vào thẻ __card__ tại danh sách __list__ tại luồng __swimlane__ tại bảng __board__", - "act-removeLabel": "Đã xóa nhãn __label__ từ thẻ __card__ tại danh sách __list__ tại luồng __swimlane__ tại bảng __board__", - "act-removedLabel": "Đã xóa nhãn __label__ từ thẻ __card__ tại danh sách __list__ tại luồng __swimlane__ tại bảng __board__", - "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-completeChecklist": "đã hoàn thành checklist __checklist__ tại thẻ __card__ tại danh sách __list__ tại luồng __swimlane__ tại bảng __board__", - "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createBoard": "created board __board__", - "act-createSwimlane": "created swimlane __swimlane__ to board __board__", - "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-addAttachment": "thêm tập tin đính kèm __attachment__ vào thẻ __list__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-deleteAttachment": "xóa tập tin đính kèm __attachment__ tại thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__ ", + "act-addSubtask": "đã thêm nhiệm vụ con __subtask__ vào thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ at board __board__", + "act-addLabel": "Đã thêm nhãn __label__ vào thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-addedLabel": "Đã thêm nhãn __label__ vào thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-removeLabel": "Đã xóa nhãn __label__ từ thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-removedLabel": "Đã xóa nhãn __label__ từ thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-addChecklist": "đã thêm checklist __checklist__ vào thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-addChecklistItem": "đã thêm mục checklist __checklistItem__ vào checklist __checklist__ tại thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-removeChecklist": "đã xóa checklist __checklist__ từ thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-removeChecklistItem": "đã xóa mục checklist __checklistItem__ từ checklist __checkList__ tại thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-checkedItem": "đã đánh dấu hoàn thành mục __checklistItem__ của checklist __checklist__ tại thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-uncheckedItem": "đã bỏ đánh dấu hoàn thành mục __checklistItem__ của checklist __checklist__ tại thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-completeChecklist": "đã hoàn thành checklist __checklist__ tại thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-uncompleteChecklist": "đã bỏ đánh dấu hoàn thành checklist __checklist__ tại thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-addComment": "đã bình luận trên thẻ __card__: __comment__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-editComment": "đã sửa bình luận trên thẻ __card__: __comment__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-deleteComment": "đã xóa bình luận trên thẻ __card__: __comment__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-createBoard": "đã tạo bảng __board__", + "act-createSwimlane": "đã tạo làn ngang __swimlane__ tới bảng __board__", + "act-createCard": "đã tạo thẻ __card__ vào danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", "act-createCustomField": "đã tạo trường __customField__ tại bảng __board__", "act-deleteCustomField": "đã xóa trường tùy chỉnh __customField__ tại bảng __board__", - "act-setCustomField": "trường tùy chỉnh đã chỉnh sửa __customField__: __customFieldValue__ Tại thẻ __card__ tại danh sách __list__ tại luồng __swimlane__ tại bảng __board__", - "act-createList": "added list __list__ to board __board__", + "act-setCustomField": "trường tùy chỉnh đã chỉnh sửa __customField__: __customFieldValue__ Tại thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-createList": "đã thêm danh sách __list__ vàng bảng __board__", "act-addBoardMember": "đã thêm thành viên __member__ vào bảng __board__", - "act-archivedBoard": "Board __board__ moved to Archive", - "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedBoard": "Bảng __board__ đã được chuyển đến Lưu trữ", + "act-archivedCard": "Thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__ được chuyển vào Lưu trữ", + "act-archivedList": "Danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__ đã chuyển đến Lưu trữ", + "act-archivedSwimlane": "Làn ngang __swimlane__ tại bảng __board__ được chuyển đến Lưu trữ", "act-importBoard": "đã nhập bảng __board__", - "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", - "act-joinMember": "đã thêm thành viên __member__ vào thẻ __card__ tại danh sách __list__ tại luồng __swimlane__ at board __board__", - "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", - "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-removeBoardMember": "removed member __member__ from board __board__", - "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-importCard": "đã nhập thẻ __card__ vào danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-importList": "đã nhập danh sách __list__ vào làn ngang __swimlane__ tại bảng __board__", + "act-joinMember": "đã thêm thành viên __member__ vào thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ at board __board__", + "act-moveCard": "đã di chuyển thẻ __card__ tại bảng __board__ từ danh sách __oldList__ tại làn ngang __oldSwimlane__ tới danh sách __list__ tại làn ngang __swimlane__", + "act-moveCardToOtherBoard": "đã di chuyển thẻ __card__ từ danh sách __oldList__ tại làn ngang __oldSwimlane__ tại bảng __oldBoard__ tới danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-removeBoardMember": "đã xóa thành viên __member__ khỏi bảng __board__", + "act-restoredCard": "đã khôi phục thẻ __card__ vào danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", + "act-unjoinMember": "đã xóa thành viên __member__ từ thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", "act-withBoardTitle": "__board__", "act-withCardTitle": "[__board__] __card__", "actions": "Hành Động", "activities": "Hoạt Động", "activity": "Hoạt Động", "activity-added": "đã thêm %s vào %s", - "activity-archived": "%s đã chuyển đến Lưu trữ", + "activity-archived": "đã chuyển %s đến Lưu trữ", "activity-attached": "đã đính kèm %s vào %s", "activity-created": "đã tạo %s", "activity-customfield-created": "đã tạo trường tuỳ chỉnh %s", @@ -71,7 +71,7 @@ "add": "Thêm", "activity-checked-item-card": "đã hoàn thành %s trong checklist %s", "activity-unchecked-item-card": "đã bỏ đánh dấu hoàn thành %s trong checklist %s", - "activity-checklist-completed-card": "đã hoàn thành checklist __checklist__ tại thẻ __card__ tại danh sách __list__ tại luồng __swimlane__ tại bảng __board__", + "activity-checklist-completed-card": "đã hoàn thành checklist __checklist__ tại thẻ __card__ tại danh sách __list__ tại làn ngang __swimlane__ tại bảng __board__", "activity-checklist-uncompleted-card": "chưa hoàn thành checklist", "activity-editComment": "lời bình đã sửa", "activity-deleteComment": "đã xoá lời bình %s", @@ -82,7 +82,7 @@ "add-attachment": "Thêm Bản Đính Kèm", "add-board": "Thêm Bảng", "add-card": "Thêm Thẻ", - "add-swimlane": "Add Swimlane", + "add-swimlane": "Thêm làn ngang", "add-subtask": "Thêm Nhiệm vụ phụ", "add-checklist": "Thêm Danh Sách Kiểm Tra", "add-checklist-item": "Thêm Một Mục Vào Danh Sách Kiểm Tra", @@ -100,14 +100,14 @@ "all-boards": "Tất cả các bảng", "and-n-other-card": "Và __count__ thẻ khác", "and-n-other-card_plural": "Và __count__ thẻ khác", - "apply": "Ứng Dụng", + "apply": "Áp Dụng", "app-is-offline": "Đang tải, vui lòng đợi. Làm mới trang sẽ làm mất dữ liệu. Nếu quá trình tải không hoạt động, vui lòng kiểm tra lại máy chủ.", "archive": "Di chuyển đến Lưu trữ", "archive-all": "Di chuyển tất cả vào Lưu trữ", "archive-board": "Di chuyển Bảng sang Lưu trữ", "archive-card": "Di chuyển Thẻ vào Lưu trữ", "archive-list": "Di chuyển Danh sách vào Lưu trữ", - "archive-swimlane": "Move Swimlane to Archive", + "archive-swimlane": "Di chuyển Làn ngang vào Lưu trữ", "archive-selection": "Di chuyển lựa chọn vào Lưu trữ", "archiveBoardPopup-title": "Chuyển Bảng sang Lưu trữ?", "archived-items": "Lưu Trữ", @@ -129,8 +129,8 @@ "board-change-color": "Đổi màu", "board-nb-stars": "%s sao", "board-not-found": "Không tìm được bảng", - "board-private-info": "Bảng này sẽ chuyển sang <strong> chế độ private</strong>.", - "board-public-info": "Bảng này sẽ chuyển sang <strong> chế độ public</strong>.", + "board-private-info": "Bảng này sẽ chuyển sang chế độ <strong>riêng tư</strong>.", + "board-public-info": "Bảng này sẽ chuyển sang chế độ <strong>công khai</strong>.", "boardChangeColorPopup-title": "Thay hình nền của bảng", "boardChangeTitlePopup-title": "Đổi tên bảng", "boardChangeVisibilityPopup-title": "Đổi cách hiển thị", @@ -140,11 +140,11 @@ "boards": "Bảng", "board-view": "Kiểu xem Bảng", "board-view-cal": "Lịch", - "board-view-swimlanes": "Thu gọn", + "board-view-swimlanes": "Làn ngang", "board-view-collapse": "Thu gọn", - "board-view-gantt": "Gantt", + "board-view-gantt": "Biểu đồ Gantt", "board-view-lists": "Danh sách", - "bucket-example": "Like “Bucket List” for example", + "bucket-example": "Ví dụ như \"Danh sách nhóm\"", "cancel": "Hủy", "card-archived": "Thẻ này đã được chuyển đến Lưu trữ.", "board-archived": "Bảng này đã được chuyển đến Lưu trữ.", @@ -184,12 +184,12 @@ "cardMembersPopup-title": "Thành Viên", "cardMorePopup-title": "Thêm nữa", "cardTemplatePopup-title": "Tạo mẫu", - "cards": "Cards", - "cards-count": "Cards", + "cards": "Thẻ", + "cards-count": "Thẻ", "casSignIn": "Đăng nhập bằng CAS", "cardType-card": "Thẻ", - "cardType-linkedCard": "Linked Card", - "cardType-linkedBoard": "Linked Board", + "cardType-linkedCard": "Thẻ đã liên kết", + "cardType-linkedBoard": "Bảng đã liên kết", "change": "Thay đổi", "change-avatar": "Thay đổi hình đại diện", "change-password": "Đổi mật khẩu", @@ -201,7 +201,7 @@ "changePermissionsPopup-title": "Thay đổi quyền", "changeSettingsPopup-title": "Thay đổi Cài đặt", "subtasks": "Nhiệm vụ phụ", - "checklists": "Checklists", + "checklists": "Danh sách việc cần hoàn thành", "click-to-star": "Bấm để gắn dấu sao bảng này.", "click-to-unstar": "Bấm để bỏ gắn bảng này.", "clipboard": "Clipboard hoặc kéo và thả", @@ -233,7 +233,7 @@ "color-slateblue": "slateblue", "color-white": "white", "color-yellow": "yellow", - "unset-color": "Unset", + "unset-color": "Không đặt", "comment": "Bình luận", "comment-placeholder": "Viết Bình Luận", "comment-only": "Chỉ bình luận", @@ -260,7 +260,7 @@ "createCustomFieldPopup-title": "Tạo Trường", "current": "hiện tại", "custom-field-delete-pop": "Không thể hoàn tác. Thao tác này sẽ xóa trường tùy chỉnh này khỏi tất cả các thẻ và hủy lịch sử của nó.", - "custom-field-checkbox": "Checkbox", + "custom-field-checkbox": "Hộp kiểm", "custom-field-currency": "Tiền tệ", "custom-field-currency-option": "Mã tiền tệ", "custom-field-date": "Ngày", @@ -315,8 +315,8 @@ "error-board-notAdmin": "Bạn cần phải là quản trị viên của bảng này để làm điều đó", "error-board-notAMember": "Bạn cần phải là thành viên của bảng này để làm điều đó", "error-json-malformed": "Văn bản của bạn không phải là JSON hợp lệ", - "error-json-schema": "Your JSON data does not include the proper information in the correct format", - "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-json-schema": "Dữ liệu JSON của bạn không bao gồm thông tin thích hợp ở định dạng chính xác", + "error-csv-schema": "CSV (Giá trị được phân tách bằng dấu phẩy)/TSV (Giá trị được phân cách bằng tab) của bạn không bao gồm thông tin thích hợp ở định dạng chính xác", "error-list-doesNotExist": "Danh sách này không tồn tại", "error-user-doesNotExist": "Người dùng này không tồn tại", "error-user-notAllowSelf": "Bạn không thể mời chính mình", @@ -382,8 +382,8 @@ "import-board-instruction-csv": "Dán Giá trị được phân tách bằng dấu phẩy(CSV)/ Giá trị được phân cách bằng tab (TSV) của bạn.", "import-board-instruction-wekan": "Trong bảng của bạn, hãy chuyển đến \"Menu\", sau đó \"Xuất bảng\" và sao chép văn bản trong tệp đã tải xuống.", "import-board-instruction-about-errors": "Nếu bạn gặp lỗi khi nhập bảng, đôi khi quá trình nhập vẫn hoạt động và bảng ở trang Tất cả bảng.", - "import-json-placeholder": "Paste your valid JSON data here", - "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-json-placeholder": "Dán dữ liệu JSON hợp lệ của bạn vào đây", + "import-csv-placeholder": "Dán dữ liệu CSV/TSV hợp lệ của bạn vào đây", "import-map-members": "Bản đồ thành viên", "import-members-map": "Bảng nhập khẩu của bạn có một số thành viên. Vui lòng ánh xạ các thành viên bạn muốn nhập với người dùng của mình", "import-members-map-note": "Lưu ý: Các thành viên chưa được ánh xạ sẽ được chỉ định cho người dùng hiện tại.", @@ -415,8 +415,8 @@ "set-color-list": "Đặt Màu", "listActionPopup-title": "Liệt kê các hành động", "settingsUserPopup-title": "Cài đặt người dùng", - "swimlaneActionPopup-title": "Swimlane Actions", - "swimlaneAddPopup-title": "Add a Swimlane below", + "swimlaneActionPopup-title": "Hành động trên Làn ngang", + "swimlaneAddPopup-title": "Thêm một Làn ngang bên dưới", "listImportCardPopup-title": "Nhập thẻ Trello", "listImportCardsTsvPopup-title": "Nhập Excel CSV/TSV", "listMorePopup-title": "Thêm nữa", @@ -424,7 +424,7 @@ "list-delete-pop": "Tất cả các hành động sẽ bị xóa khỏi nguồn cấp dữ liệu hoạt động và bạn sẽ không thể khôi phục danh sách. Không có hoàn tác.", "list-delete-suggest-archive": "Bạn có thể di chuyển danh sách vào Lưu trữ để xóa danh sách đó khỏi Bảng và duy trì hoạt động.", "lists": "Danh sách", - "swimlanes": "Thu gọn", + "swimlanes": "Làn ngang", "log-out": "Đăng Xuất", "log-in": "Đăng nhập", "loginPopup-title": "Đăng nhập", @@ -446,7 +446,7 @@ "name": "Tên", "no-archived-cards": "Không có thẻ nào trong Lưu trữ.", "no-archived-lists": "Không có danh sách nào trong Lưu trữ.", - "no-archived-swimlanes": "No swimlanes in Archive.", + "no-archived-swimlanes": "Không có Làn ngang nào trong Lưu trữ.", "no-results": "Không có kết quả", "normal": "Bình thường", "normal-desc": "Có thể xem và chỉnh sửa thẻ. Không thể thay đổi cài đặt.", @@ -467,7 +467,7 @@ "private-desc": "Bảng này là riêng tư. Chỉ những người được thêm vào bảng mới có thể xem và chỉnh sửa nó.", "profile": "Hồ sơ", "public": "Công khai", - "public-desc": "Bảng này là công khai. Nó hiển thị với bất kỳ ai có liên kết và sẽ hiển thị trong các công cụ tìm kiếm như Google. Chỉ những người được thêm vào diễn đàn mới có thể chỉnh sửa.", + "public-desc": "Bảng này là công khai. Nó hiển thị với bất kỳ ai có liên kết và sẽ hiển thị trong các công cụ tìm kiếm như Google. Chỉ những người được thêm vào Bảng mới có thể chỉnh sửa.", "quick-access-description": "Gắn dấu sao bảng để thêm lối tắt trong thanh này.", "remove-cover": "Remove Cover", "remove-from-board": "Xóa khỏi Bảng", @@ -519,10 +519,10 @@ "title": "Tiêu đề", "tracking": "Đang theo dõi", "tracking-info": "Bạn sẽ được thông báo về bất kỳ thay đổi nào đối với những thẻ mà bạn tham gia với tư cách là người sáng tạo hoặc thành viên.", - "type": "Type", + "type": "Kiểu", "unassign-member": "Bỏ chỉ định thành viên", "unsaved-description": "Bạn có một mô tả chưa được lưu.", - "unwatch": "Unwatch", + "unwatch": "Bỏ theo dõi", "upload": "Tải lên", "upload-avatar": "Tải lên hình đại diện", "uploaded-avatar": "Đã tải lên hình đại diện", @@ -533,16 +533,16 @@ "custom-login-logo-link-url": "Đăng nhập tùy chỉnh - Url liên kết Logo", "text-below-custom-login-logo": "Đăng nhập tùy chỉnh - Văn bản bên dưới Logo", "automatic-linked-url-schemes": "Lược đồ URL tùy chỉnh sẽ tự động có thể nhấp được. Một Lược đồ URL trên mỗi dòng", - "username": "Username", - "import-usernames": "Import Usernames", + "username": "Tài khoản", + "import-usernames": "Nhập khẩu Usernames", "view-it": "Xem", "warn-list-archived": "cảnh báo: thẻ này nằm trong một danh sách tại Lưu trữ", - "watch": "Watch", + "watch": "Theo dõi", "watching": "Đang xem", "watching-info": "Bạn sẽ được thông báo về bất kỳ thay đổi nào trong bảng này", "welcome-board": "Welcome Board", "welcome-swimlane": "Milestone 1", - "welcome-list1": "Basics", + "welcome-list1": "Cơ bản", "welcome-list2": "Nâng cao", "card-templates-swimlane": "Mẫu Thẻ", "list-templates-swimlane": "Mẫu Danh sách", @@ -558,17 +558,17 @@ "disable-self-registration": "Vô hiệu hoá tự đăng ký", "invite": "Mời", "invite-people": "Mời mọi người", - "to-boards": "To board(s)", + "to-boards": "Đến bảng(s)", "email-addresses": "Địa chỉ Email", "smtp-host-description": "Địa chỉ của máy chủ SMTP xử lý email của bạn.", "smtp-port-description": "Cổng mà máy chủ SMTP của bạn sử dụng cho các email gửi đi.", "smtp-tls-description": "Bật hỗ trợ TLS cho máy chủ SMTP", "smtp-host": "SMTP Host", "smtp-port": "SMTP Port", - "smtp-username": "Username", + "smtp-username": "Tài khoản", "smtp-password": "Mật khẩu", "smtp-tls": "Hỗ trợ TLS", - "send-from": "From", + "send-from": "Từ", "send-smtp-test": "Gửi một email thử nghiệm cho chính bạn", "invitation-code": "Mã lời mời", "email-invite-register-subject": "__inviter__ đã gửi cho bạn lời mời", @@ -577,15 +577,15 @@ "email-smtp-test-text": "Bạn đã gửi thành công một email", "error-invitation-code-not-exist": "Mã lời mời không tồn tại", "error-notAuthorized": "Bạn không được phép xem trang này.", - "webhook-title": "Webhook Name", + "webhook-title": "Tên Webhook", "webhook-token": "Mã thông báo (Tùy chọn để xác thực)", - "outgoing-webhooks": "Outgoing Webhooks", - "bidirectional-webhooks": "Two-Way Webhooks", - "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "outgoing-webhooks": "Webhooks gửi đi", + "bidirectional-webhooks": "Webhooks hai chiều", + "outgoingWebhooksPopup-title": "Webhook gửi đi", "boardCardTitlePopup-title": "Lọc tiêu đề thẻ", "disable-webhook": "Vô hiệu hóa Webhook này", - "global-webhook": "Global Webhooks", - "new-outgoing-webhook": "New Outgoing Webhook", + "global-webhook": "Webhook toàn cầu", + "new-outgoing-webhook": "Webhook gửi đi mới", "no-name": "(Không xác định)", "Node_version": "Phiên bản Node", "Meteor_version": "Phiên bản Meteor", @@ -593,14 +593,14 @@ "MongoDB_storage_engine": "MongoDB storage engine", "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", "OS_Arch": "OS Arch", - "OS_Cpus": "OS CPU Count", - "OS_Freemem": "OS Free Memory", - "OS_Loadavg": "OS Load Average", - "OS_Platform": "OS Platform", - "OS_Release": "OS Release", - "OS_Totalmem": "OS Total Memory", - "OS_Type": "OS Type", - "OS_Uptime": "OS Uptime", + "OS_Cpus": "Số CPU", + "OS_Freemem": "Bộ nhớ trống", + "OS_Loadavg": "Tải trung bình", + "OS_Platform": "Nền tảng", + "OS_Release": "Phiên bản", + "OS_Totalmem": "Tổng bộ nhớ hệ điều hành", + "OS_Type": "Kiểu hệ điều hành", + "OS_Uptime": "Thời gian chạy", "days": "ngày", "hours": "giờ", "minutes": "phút", @@ -643,14 +643,14 @@ "boardCardSettingsPopup-title": "Cài đặt thẻ", "deposit-subtasks-board": "Gửi các nhiệm vụ phụ vào bảng này:", "deposit-subtasks-list": "Danh sách đích cho các nhiệm vụ phụ được gửi tại đây:", - "show-parent-in-minicard": "Show parent in minicard:", + "show-parent-in-minicard": "Hiện cha mẹ trong minicard:", "prefix-with-full-path": "Tiền tố với đường dẫn đầy đủ", "prefix-with-parent": "Tiền tố với cha mẹ", "subtext-with-full-path": "Văn bản phụ với đường dẫn đầy đủ", - "subtext-with-parent": "Subtext with parent", + "subtext-with-parent": "Văn bản phụ với cha mẹ", "change-card-parent": "Thay đổi phụ huynh của thẻ", - "parent-card": "Parent card", - "source-board": "Source board", + "parent-card": "Thẻ cha", + "source-board": "Bảng nguồn", "no-parent": "Không hiển thị cho cha mẹ", "activity-added-label": "đã thêm nhãn '%s' vào %s", "activity-removed-label": "đã xóa nhãn '%s' khỏi %s", @@ -672,41 +672,41 @@ "r-trigger": "Kích hoạt", "r-action": "Hoạt động", "r-when-a-card": "Khi một thẻ", - "r-is": "is", + "r-is": "là", "r-is-moved": "được chuyển đi", - "r-added-to": "Added to", + "r-added-to": "Đã thêm vào", "r-removed-from": "Bị loại khỏi", - "r-the-board": "the board", + "r-the-board": "bảng", "r-list": "danh sách", - "list": "List", + "list": "Danh sách", "set-filter": "Đặt bộ lọc", "r-moved-to": "Chuyển đến", - "r-moved-from": "Moved from", - "r-archived": "Moved to Archive", - "r-unarchived": "Restored from Archive", - "r-a-card": "a card", + "r-moved-from": "Đã di chuyển từ", + "r-archived": "Đã chuyển đến Lưu trữ", + "r-unarchived": "Đã khôi phục từ lưu trữ", + "r-a-card": "thẻ", "r-when-a-label-is": "Khi một nhãn là", "r-when-the-label": "Khi nhãn", - "r-list-name": "list name", + "r-list-name": "tên danh sách", "r-when-a-member": "Khi một thành viên là", "r-when-the-member": "Khi thành viên", - "r-name": "name", + "r-name": "tên", "r-when-a-attach": "Khi một tệp đính kèm", "r-when-a-checklist": "Khi một checklist là", "r-when-the-checklist": "Khi checklist", - "r-completed": "Completed", - "r-made-incomplete": "Made incomplete", + "r-completed": "Đã hoàn thành", + "r-made-incomplete": "Làm chưa hoàn thành", "r-when-a-item": "Khi một mục checklist là", "r-when-the-item": "Khi mục checklist", - "r-checked": "Checked", - "r-unchecked": "Unchecked", + "r-checked": "Đã chọn", + "r-unchecked": "Đã bỏ chọn", "r-move-card-to": "Di chuyển thẻ đến", - "r-top-of": "Top of", - "r-bottom-of": "Bottom of", + "r-top-of": "Trên cùng của", + "r-bottom-of": "Dưới cùng của", "r-its-list": "danh sách của nó", "r-archive": "Di chuyển đến Lưu trữ", - "r-unarchive": "Restore from Archive", - "r-card": "card", + "r-unarchive": "Khôi phục từ Lưu trữ", + "r-card": "thẻ", "r-add": "Thêm", "r-remove": "Xóa", "r-label": "nhãn", @@ -714,17 +714,17 @@ "r-remove-all": "Xóa tất cả thành viên khỏi thẻ", "r-set-color": "Đặt màu cho", "r-checklist": "checklist", - "r-check-all": "Check all", - "r-uncheck-all": "Uncheck all", + "r-check-all": "Đánh dấu tất cả", + "r-uncheck-all": "Bỏ đánh dấu tất cả", "r-items-check": "mục của checklist", - "r-check": "Check", - "r-uncheck": "Uncheck", + "r-check": "Chọn", + "r-uncheck": "Bỏ chọn", "r-item": "mục", "r-of-checklist": "của checklist", "r-send-email": "Gửi email", "r-to": "đến", "r-of": "của", - "r-subject": "subject", + "r-subject": "Chủ đề", "r-rule-details": "Chi tiết quy tắc", "r-d-move-to-top-gen": "Di chuyển thẻ lên đầu danh sách của nó", "r-d-move-to-top-spec": "Di chuyển thẻ lên đầu của danh sách", @@ -732,15 +732,15 @@ "r-d-move-to-bottom-spec": "Di chuyển thẻ xuống cuối của danh sách", "r-d-send-email": "Gửi email", "r-d-send-email-to": "đến", - "r-d-send-email-subject": "subject", + "r-d-send-email-subject": "Chủ đề", "r-d-send-email-message": "tin nhắn", "r-d-archive": "Di chuyển thẻ vào Lưu trữ", - "r-d-unarchive": "Restore card from Archive", + "r-d-unarchive": "Khôi phục thẻ từ Lưu trữ", "r-d-add-label": "Thêm nhãn", "r-d-remove-label": "Xóa nhãn", "r-create-card": "Tạo thẻ mới", "r-in-list": "trong danh sách", - "r-in-swimlane": "in swimlane", + "r-in-swimlane": "trong làn ngang", "r-d-add-member": "Thêm thành viên", "r-d-remove-member": "Xóa thành viên", "r-d-remove-all-member": "Xóa tất cả thành viên", @@ -755,8 +755,8 @@ "r-add-checklist": "Thêm checklist", "r-with-items": "với các mục", "r-items-list": "item1,item2,item3", - "r-add-swimlane": "Add swimlane", - "r-swimlane-name": "swimlane name", + "r-add-swimlane": "Thêm làn ngang", + "r-swimlane-name": "tên làn ngang", "r-board-note": "Lưu ý: để trống một trường để khớp với mọi giá trị có thể.", "r-checklist-note": "Lưu ý: các mục của danh sách kiểm tra phải được viết dưới dạng các giá trị được phân tách bằng dấu phẩy.", "r-when-a-card-is-moved": "Khi một thẻ được chuyển sang một danh sách khác", @@ -794,18 +794,18 @@ "loading": "Đang tải, vui lòng đợi.", "previous_as": "lần trước là", "act-a-dueAt": "sửa đổi thời gian đến hạn \nKhi nào: __timeValue__\nỞ đâu: __card__\n đến hạn trước đó là __timeOldValue__", - "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-endAt": "đã sửa đổi thời gian kết thúc thành __timeValue__ từ (__timeOldValue__)", "act-a-startAt": "sửa đổi thời gian bắt đầu thành __timeValue__ from (__timeOldValue__)", - "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "đã sửa đổi thời gian nhận thành __timeValue__ từ (__timeOldValue__)", "a-dueAt": "sửa đổi thời gian đến hạn thành", - "a-endAt": "modified ending time to be", + "a-endAt": "đã sửa đổi thời gian kết thúc thành", "a-startAt": "thời gian bắt đầu được sửa đổi thành", "a-receivedAt": "đã sửa đổi thời gian nhận được", - "almostdue": "current due time %s is approaching", - "pastdue": "current due time %s is past", - "duenow": "current due time %s is today", - "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", - "act-withDue": "__list__/__card__ due reminders [__board__]", + "almostdue": "thời gian đến hạn hiện tại %s đang đến gần", + "pastdue": "thời gian đến hạn hiện tại %s đã qua", + "duenow": "giờ đến hạn hiện tại %s là hôm nay", + "act-newDue": "__list__/__card__ có lời nhắc đến hạn lần 1 [__board__]", + "act-withDue": "__list__/__card__ lời nhắc đến hạn [__board__]", "act-almostdue": "đang nhắc nhở thời hạn hiện tại là (__timeValue__) của __card__ đang đến gần", "act-pastdue": "đang nhắc nhở thời hạn hiện tại (__timeValue__) của __card__ đã qua", "act-duenow": "đã được nhắc nhở hiện tại đến hạn (__timeValue__) của __card__ bây giờ là", @@ -813,7 +813,7 @@ "delete-user-confirm-popup": "Bạn có chắc chắn muốn xóa tài khoản này không? Không thể hoàn tác.", "accounts-allowUserDelete": "Cho phép người dùng tự xóa tài khoản của họ", "hide-minicard-label-text": "Ẩn nhãn minicard", - "show-desktop-drag-handles": "Show desktop drag handles", + "show-desktop-drag-handles": "Hiển thị nút kéo thả trên Desktop", "assignee": "Người được giao", "cardAssigneesPopup-title": "Người được giao", "addmore-detail": "Thêm mô tả chi tiết hơn", @@ -841,7 +841,7 @@ "saturday": "Thứ bảy", "sunday": "Chủ nhật", "status": "Trạng thái", - "swimlane": "Swimlane", + "swimlane": "Làn ngang", "owner": "Chủ sở hữu", "last-modified-at": "Sửa đổi lần cuối lúc", "last-activity": "Hoạt động cuối", @@ -858,7 +858,7 @@ "displayName": "Tên Hiển Thị", "shortName": "Tên ngắn", "website": "Website", - "person": "Person", + "person": "Cá nhân", "my-cards": "Thẻ của tôi", "card": "Thẻ", "board": "Bảng", @@ -867,7 +867,7 @@ "myCardsSortChangePopup-title": "Sắp xếp thẻ của tôi", "myCardsSortChange-choice-board": "Theo bảng", "myCardsSortChange-choice-dueat": "Theo Ngày đến hạn", - "dueCards-title": "Due Cards", + "dueCards-title": "Thẻ đến hạn", "dueCardsViewChange-title": "Xem Thẻ đến hạn", "dueCardsViewChangePopup-title": "Xem Thẻ đến hạn", "dueCardsViewChange-choice-me": "Tôi", @@ -875,7 +875,7 @@ "dueCardsViewChange-choice-all-description": "Hiển thị tất cả các thẻ chưa hoàn thành có ngày *Đến hạn* từ bảng mà người dùng có quyền.", "broken-cards": "Thẻ bị hỏng", "board-title-not-found": "Không tìm thấy bảng '%s'", - "swimlane-title-not-found": "Swimlane '%s' not found.", + "swimlane-title-not-found": "Không tìm thấy làn ngang '%s'", "list-title-not-found": "Không tìm thấy danh sách '%s'", "label-not-found": "Không tìm thấy nhãn '%s'", "label-color-not-found": "Không tìm thấy màu nhãn %s", @@ -888,13 +888,13 @@ "n-n-of-n-cards-found": "__start__-__end__ của __total__ Thẻ được Tìm thấy", "operator-board": "bảng", "operator-board-abbrev": "b", - "operator-swimlane": "swimlane", + "operator-swimlane": "làn ngang", "operator-swimlane-abbrev": "s", "operator-list": "danh sách", "operator-list-abbrev": "l", "operator-label": "nhãn", "operator-label-abbrev": "#", - "operator-user": "user", + "operator-user": "người dùng", "operator-user-abbrev": "@", "operator-member": "thành viên", "operator-member-abbrev": "m", @@ -929,12 +929,12 @@ "predicate-member": "thành viên", "predicate-public": "công khai", "predicate-private": "riêng tư", - "operator-unknown-error": "%s is not an operator", - "operator-number-expected": "operator __operator__ expected a number, got '__value__'", - "operator-sort-invalid": "sort of '%s' is invalid", - "operator-status-invalid": "'%s' is not a valid status", - "operator-has-invalid": "%s is not a valid existence check", - "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-unknown-error": "%s không phải là một toán tử", + "operator-number-expected": "toán tử __operator__ chấp nhận một số, có giá trị '__value__'", + "operator-sort-invalid": "sắp xếp của '%s' không hợp lệ", + "operator-status-invalid": "'%s' không phải là trạng thái hợp lệ", + "operator-has-invalid": "%s không phải là một kiểm tra sự tồn tại hợp lệ", + "operator-limit-invalid": "%s không phải là giới hạn hợp lệ. Giới hạn phải là một số nguyên dương.", "next-page": "Trang tiếp theo", "previous-page": "Trang trước", "heading-notes": "Ghi chú", @@ -943,30 +943,30 @@ "globalSearch-instructions-operators": "Các toán tử có sẵn:", "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - thẻ trong bảng phù hợp với *<title>*", "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - thẻ trong danh sách phù hợp với *<title>*", - "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - thẻ trong luồng phù hợp với *<title>*", - "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - thẻ trong làn ngang phù hợp với *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - thẻ có nhận xét chứa *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - thẻ có nhãn phù hợp *<color>* hoặc *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - viết tắt cho `__operator_label__:<color>` hoặc `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - thẻ trong đó *<username>* là *thành viên* hoặc *người được giao*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - viết tắt cho `người dùng:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - thẻ trong đó *<username>* là *thành viên*", - "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - thẻ trong đó *<username>* là *người được giao*", "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - thẻ có thời hạn lên đến *<n>* ngày kể từ bây giờ. `__operator_due__:__predicate_overdue__ liệt kê tất cả các thẻ đã quá hạn sử dụng.", - "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", - "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", - "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", - "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", - "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - thẻ đã được tạo *<n>* ngày trước hoặc ít hơn", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - thẻ đã được sửa đổi *<n>* ngày trước hoặc ít hơn", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - trong đó *<status>* là một trong các giá trị sau:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - thẻ đã lưu trữ", + "globalSearch-instructions-status-all": "`__predicate_all__` - tất cả các thẻ lưu trữ và hủy lưu trữ", "globalSearch-instructions-status-ended": "`__predicate_ended__` - thẻ với ngày kết thúc", - "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", - "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-status-public": "`__predicate_public__` - chỉ thẻ trong bảng công khai", + "globalSearch-instructions-status-private": "`__predicate_private__` - chỉ thẻ trong bảng riêng tư", "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - trong đó *<field>* là một trong `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` hoặc `__predicate_member__`. Đặt dấu `-` trước *<field>* sẽ tìm kiếm sự không có giá trị trong trường đó (ví dụ. `has:-due` tìm kiếm các thẻ không có ngày đến hạn).", - "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - trong đó *<sort-name>* là một trong `__predicate_due__`, `__predicate_created__` hoặc `__predicate_modified__`. Đối với sắp xếp giảm dần, hãy đặt dấu `-` trước tên sắp xếp.", "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - trong đó *<n>* là một số nguyên dương thể hiện số lượng thẻ được hiển thị trên mỗi trang.", "globalSearch-instructions-notes-1": "Nhiều toán tử có thể được chỉ định.", "globalSearch-instructions-notes-2": "Các toán tử tương tự là *OR* cùng nhau. Các thẻ phù hợp với bất kỳ điều kiện nào sẽ được trả lại.\n`__operator_list__:Available __operator_list__:Blocked` sẽ trả lại các thẻ có trong bất kỳ danh sách nào có tên *Blocked* hoặc *Available*.", "globalSearch-instructions-notes-3": "Các toán tử khác nhau là *AND* kết hợp với nhau. Chỉ những thẻ phù hợp với tất cả các toán tử khác nhau mới được trả lại. `__operator_list__:Available __operator_label__:red` chỉ trả về các thẻ trong danh sách *Có sẵn* với nhãn *red*.", - "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-3-2": "Ngày có thể được chỉ định dưới dạng số nguyên dương hoặc âm hoặc sử dụng `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` hoặc `__predicate_year__` cho giai đoạn hiện tại.", "globalSearch-instructions-notes-4": "Tìm kiếm văn bản không phân biệt chữ hoa chữ thường.", "globalSearch-instructions-notes-5": "Theo mặc định, thẻ đã lưu trữ không được tìm kiếm.", "link-to-search": "Liên kết đến tìm kiếm này", @@ -978,7 +978,14 @@ "sort-cards": "Sắp xếp thẻ", "cardsSortPopup-title": "Sắp xếp thẻ", "due-date": "Ngày đến hạn", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Tiêu đề (theo thứ tự bảng chữ cái)", "created-at-newest-first": "Được tạo lúc (Mới nhất đầu tiên)", - "created-at-oldest-first": "Được tạo lúc (Cũ nhất trước)" + "created-at-oldest-first": "Được tạo lúc (Cũ nhất trước)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index 8af525e29..684c93dd3 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -322,8 +322,8 @@ "error-user-notAllowSelf": "无法邀请自己", "error-user-notCreated": "该用户未能成功创建", "error-username-taken": "此用户名已存在", - "error-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", + "error-orgname-taken": "此组织名称已被使用", + "error-teamname-taken": "此团队名称已被使用", "error-email-taken": "此EMail已存在", "export-board": "导出看板", "export-board-json": "看板导出为JSON", @@ -399,7 +399,7 @@ "just-invited": "您刚刚被邀请加入此看板", "keyboard-shortcuts": "键盘快捷键", "label-create": "创建标签", - "label-default": "%s 标签 (默认)", + "label-default": "%s 标签(默认)", "label-delete-pop": "此操作不可逆,这将会删除该标签并清除它的历史记录。", "labels": "标签", "language": "语言", @@ -528,10 +528,10 @@ "uploaded-avatar": "头像已经上传", "custom-top-left-corner-logo-image-url": "通过图片链接设置左上角图标", "custom-top-left-corner-logo-link-url": "设置左上角图标链接地址", - "custom-top-left-corner-logo-height": "设置左上角图标高度. 默认值: 27", - "custom-login-logo-image-url": "设置登陆图标链接地址", - "custom-login-logo-link-url": "通过连接上传logo", - "text-below-custom-login-logo": "自定义登陆图标下方文字", + "custom-top-left-corner-logo-height": "设置左上角图标高度。默认值:27", + "custom-login-logo-image-url": "设置登录图标链接地址", + "custom-login-logo-link-url": "设置登录图标链接", + "text-below-custom-login-logo": "设置登录图标下方文字", "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", "username": "用户名", "import-usernames": "导入用户名", @@ -635,7 +635,7 @@ "boardDeletePopup-title": "删除看板?", "delete-board": "删除看板", "default-subtasks-board": "__board__ 看板的子任务", - "default": "缺省", + "default": "默认", "queue": "队列", "subtask-settings": "子任务设置", "card-settings": "卡片设置", @@ -776,13 +776,13 @@ "authentication-type": "认证类型", "custom-product-name": "自定义产品名称", "layout": "布局", - "hide-logo": "隐藏LOGO", + "hide-logo": "隐藏图标", "add-custom-html-after-body-start": "添加定制的HTML在开始<body>之前", "add-custom-html-before-body-end": "添加定制的HTML在结束</body>之后", "error-undefined": "出了点问题", - "error-ldap-login": "尝试登陆时出错", + "error-ldap-login": "尝试登录时出错", "display-authentication-method": "显示认证方式", - "default-authentication-method": "缺省认证方式", + "default-authentication-method": "默认认证方式", "duplicate-board": "复制看板", "org-number": "组织数量为:", "team-number": "团队数量为:", @@ -885,7 +885,7 @@ "no-cards-found": "无法查询到卡片", "one-card-found": "查询到一个卡片", "n-cards-found": "查询到%s个卡片", - "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ 共 __total__ 卡片被找到", "operator-board": "看板", "operator-board-abbrev": "b", "operator-swimlane": "泳道", @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -968,17 +968,24 @@ "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", "globalSearch-instructions-notes-4": "文本搜索大小写不敏感。", - "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "globalSearch-instructions-notes-5": "默认情况下,不搜索存档卡片。", "link-to-search": "关联至本次查询", "excel-font": "Arial", "number": "数字", "label-colors": "标签颜色", "label-names": "标签名", - "archived-at": "archived at", - "sort-cards": "Sort Cards", - "cardsSortPopup-title": "Sort Cards", - "due-date": "Due Date", - "title-alphabetically": "Title (Alphabetically)", - "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "archived-at": "归档于", + "sort-cards": "排序卡片", + "cardsSortPopup-title": "排序卡片", + "due-date": "截至日期", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "标题(按字母顺序)", + "created-at-newest-first": "创建时间(最新)", + "created-at-oldest-first": "创建时间(最旧)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/zh-HK.i18n.json b/i18n/zh-HK.i18n.json index 0e434bfeb..a223862f1 100644 --- a/i18n/zh-HK.i18n.json +++ b/i18n/zh-HK.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)" + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index 499c8dcdf..0c50845f5 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -946,7 +946,7 @@ "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name | color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", @@ -978,7 +978,14 @@ "sort-cards": "排序卡片", "cardsSortPopup-title": "排序卡片", "due-date": "到期日", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "標題 (按字母順序)", "created-at-newest-first": "創建於(最新優先)", - "created-at-oldest-first": "創建於(最早優先)" + "created-at-oldest-first": "創建於(最早優先)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane" } diff --git a/models/cards.js b/models/cards.js index 712f18e11..a0aed5c69 100644 --- a/models/cards.js +++ b/models/cards.js @@ -1527,14 +1527,17 @@ Cards.mutations({ return this.move(boardId, swimlaneId, listId, sort); }, - move(boardId, swimlaneId, listId, sort) { + move(boardId, swimlaneId, listId, sort = null) { const mutatedFields = { boardId, swimlaneId, listId, - sort, }; + if (sort !== null) { + mutatedFields.sort = sort; + } + // we must only copy the labels and custom fields if the target board // differs from the source board if (this.boardId !== boardId) { diff --git a/models/export.js b/models/export.js index 17b08dad8..7b74c20fe 100644 --- a/models/export.js +++ b/models/export.js @@ -48,6 +48,57 @@ if (Meteor.isServer) { } }); + // todo XXX once we have a real API in place, move that route there + // todo XXX also share the route definition between the client and the server + // so that we could use something like + // `ApiRoutes.path('boards/export', boardId)`` + // on the client instead of copy/pasting the route path manually between the + // client and the server. + /** + * @operation exportJson + * @tag Boards + * + * @summary This route is used to export a attachement to a json file format. + * + * @description If user is already logged-in, pass loginToken as param + * "authToken": '/api/boards/:boardId/attachments/:attachmentId/export?authToken=:token' + * + * + * @param {string} boardId the ID of the board we are exporting + * @param {string} attachmentId the ID of the attachment we are exporting + * @param {string} authToken the loginToken + */ + JsonRoutes.add( + 'get', + '/api/boards/:boardId/attachments/:attachmentId/export', + function(req, res) { + const boardId = req.params.boardId; + const attachmentId = req.params.attachmentId; + let user = null; + const loginToken = req.query.authToken; + if (loginToken) { + const hashToken = Accounts._hashLoginToken(loginToken); + user = Meteor.users.findOne({ + 'services.resume.loginTokens.hashedToken': hashToken, + }); + } else if (!Meteor.settings.public.sandstorm) { + Authentication.checkUserId(req.userId); + user = Users.findOne({ _id: req.userId, isAdmin: true }); + } + const exporter = new Exporter(boardId, attachmentId); + if (exporter.canExport(user)) { + JsonRoutes.sendResult(res, { + code: 200, + data: exporter.build(), + }); + } else { + // we could send an explicit error message, but on the other hand the only + // way to get there is by hacking the UI so let's keep it raw. + JsonRoutes.sendResult(res, 403); + } + }, + ); + /** * @operation exportCSV/TSV * @tag Boards diff --git a/models/exporter.js b/models/exporter.js index 0c6d2a4f2..999f30606 100644 --- a/models/exporter.js +++ b/models/exporter.js @@ -2,8 +2,9 @@ const Papa = require('papaparse'); // exporter maybe is broken since Gridfs introduced, add fs and path export class Exporter { - constructor(boardId) { + constructor(boardId, attachmentId) { this._boardId = boardId; + this._attachmentId = attachmentId; } build() { @@ -33,6 +34,62 @@ export class Exporter { }, }), ); + + // [Old] for attachments we only export IDs and absolute url to original doc + // [New] Encode attachment to base64 + + const getBase64Data = function(doc, callback) { + let buffer = Buffer.allocUnsafe(0); + buffer.fill(0); + + // callback has the form function (err, res) {} + const tmpFile = path.join( + os.tmpdir(), + `tmpexport${process.pid}${Math.random()}`, + ); + const tmpWriteable = fs.createWriteStream(tmpFile); + const readStream = doc.createReadStream(); + readStream.on('data', function(chunk) { + buffer = Buffer.concat([buffer, chunk]); + }); + + readStream.on('error', function() { + callback(null, null); + }); + readStream.on('end', function() { + // done + fs.unlink(tmpFile, () => { + //ignored + }); + + callback(null, buffer.toString('base64')); + }); + readStream.pipe(tmpWriteable); + }; + const getBase64DataSync = Meteor.wrapAsync(getBase64Data); + const byBoardAndAttachment = this._attachmentId + ? { boardId: this._boardId, _id: this._attachmentId } + : byBoard; + result.attachments = Attachments.find(byBoardAndAttachment) + .fetch() + .map(attachment => { + let filebase64 = null; + filebase64 = getBase64DataSync(attachment); + + return { + _id: attachment._id, + cardId: attachment.cardId, + //url: FlowRouter.url(attachment.url()), + file: filebase64, + name: attachment.original.name, + type: attachment.original.type, + }; + }); + //When has a especific valid attachment return the single element + if (this._attachmentId) { + return result.attachments.length > 0 ? result.attachments[0] : {}; + } + result.lists = Lists.find(byBoard, noBoardId).fetch(); result.cards = Cards.find(byBoardNoLinked, noBoardId).fetch(); result.swimlanes = Swimlanes.find(byBoard, noBoardId).fetch(); @@ -84,54 +141,6 @@ export class Exporter { ); }); - // [Old] for attachments we only export IDs and absolute url to original doc - // [New] Encode attachment to base64 - - const getBase64Data = function(doc, callback) { - let buffer = Buffer.allocUnsafe(0); - buffer.fill(0); - - // callback has the form function (err, res) {} - const tmpFile = path.join( - os.tmpdir(), - `tmpexport${process.pid}${Math.random()}`, - ); - const tmpWriteable = fs.createWriteStream(tmpFile); - const readStream = doc.createReadStream(); - readStream.on('data', function(chunk) { - buffer = Buffer.concat([buffer, chunk]); - }); - - readStream.on('error', function() { - callback(null, null); - }); - readStream.on('end', function() { - // done - fs.unlink(tmpFile, () => { - //ignored - }); - - callback(null, buffer.toString('base64')); - }); - readStream.pipe(tmpWriteable); - }; - const getBase64DataSync = Meteor.wrapAsync(getBase64Data); - result.attachments = Attachments.find(byBoard) - .fetch() - .map(attachment => { - let filebase64 = null; - filebase64 = getBase64DataSync(attachment); - - return { - _id: attachment._id, - cardId: attachment.cardId, - //url: FlowRouter.url(attachment.url()), - file: filebase64, - name: attachment.original.name, - type: attachment.original.type, - }; - }); - // we also have to export some user data - as the other elements only // include id but we have to be careful: // 1- only exports users that are linked somehow to that board diff --git a/models/lists.js b/models/lists.js index 141804492..49cda140b 100644 --- a/models/lists.js +++ b/models/lists.js @@ -202,7 +202,7 @@ Lists.helpers({ this.swimlaneId = swimlaneId; let _id = null; - existingListWithSameName = Lists.findOne({ + const existingListWithSameName = Lists.findOne({ boardId, title: this.title, archived: false, @@ -225,6 +225,35 @@ Lists.helpers({ }); }, + move(boardId, swimlaneId) { + const boardList = Lists.findOne({ + boardId, + title: this.title, + archived: false, + }); + let listId; + if (boardList) { + listId = boardList._id; + this.cards().forEach(card => { + card.move(boardId, this._id, boardList._id); + }); + } else { + console.log('list.title:', this.title); + console.log('boardList:', boardList); + listId = Lists.insert({ + title: this.title, + boardId, + type: this.type, + archived: false, + wipLimit: this.wipLimit, + }); + } + + this.cards(swimlaneId).forEach(card => { + card.move(boardId, swimlaneId, listId); + }); + }, + cards(swimlaneId) { const selector = { listId: this._id, @@ -378,8 +407,13 @@ Meteor.methods({ // my lists return _.uniq( Lists.find( - { boardId: { $in: Boards.userBoardIds(this.userId) } }, - { fields: { title: 1 } }, + { + boardId: { $in: Boards.userBoardIds(this.userId) }, + archived: false, + }, + { + fields: { title: 1 }, + }, ) .fetch() .map(list => { diff --git a/models/trelloCreator.js b/models/trelloCreator.js index 60eddde66..d9ae006f5 100644 --- a/models/trelloCreator.js +++ b/models/trelloCreator.js @@ -416,39 +416,62 @@ export class TrelloCreator { const attachments = this.attachments[card.id]; const trelloCoverId = card.idAttachmentCover; if (attachments) { + const links = []; attachments.forEach(att => { - const file = new FS.File(); - // Simulating file.attachData on the client generates multiple errors - // - HEAD returns null, which causes exception down the line - // - the template then tries to display the url to the attachment which causes other errors - // so we make it server only, and let UI catch up once it is done, forget about latency comp. - const self = this; - if (Meteor.isServer) { - file.attachData(att.url, function(error) { - file.boardId = boardId; - file.cardId = cardId; - file.userId = self._user(att.idMemberCreator); - // The field source will only be used to prevent adding - // attachments' related activities automatically - file.source = 'import'; - if (error) { - throw error; - } else { - const wekanAtt = Attachments.insert(file, () => { - // we do nothing - }); - self.attachmentIds[att.id] = wekanAtt._id; - // - if (trelloCoverId === att.id) { - Cards.direct.update(cardId, { - $set: { coverId: wekanAtt._id }, + // if the attachment `name` and `url` are the same, then the + // attachment is an attached link + if (att.name === att.url) { + links.push(att.url); + } else { + const file = new FS.File(); + // Simulating file.attachData on the client generates multiple errors + // - HEAD returns null, which causes exception down the line + // - the template then tries to display the url to the attachment which causes other errors + // so we make it server only, and let UI catch up once it is done, forget about latency comp. + const self = this; + if (Meteor.isServer) { + file.attachData(att.url, function(error) { + file.boardId = boardId; + file.cardId = cardId; + file.userId = self._user(att.idMemberCreator); + // The field source will only be used to prevent adding + // attachments' related activities automatically + file.source = 'import'; + if (error) { + throw error; + } else { + const wekanAtt = Attachments.insert(file, () => { + // we do nothing }); + self.attachmentIds[att.id] = wekanAtt._id; + // + if (trelloCoverId === att.id) { + Cards.direct.update(cardId, { + $set: { coverId: wekanAtt._id }, + }); + } } - } - }); + }); + } } // todo XXX set cover - if need be }); + + if (links.length) { + let desc = cardToCreate.description.trim(); + if (desc) { + desc += '\n\n'; + } + desc += `## ${TAPi18n.__('links-heading')}\n`; + links.forEach(link => { + desc += `* ${link}\n`; + }); + Cards.direct.update(cardId, { + $set: { + description: desc, + }, + }); + } } result.push(cardId); }); diff --git a/models/users.js b/models/users.js index c88572af0..13e623318 100644 --- a/models/users.js +++ b/models/users.js @@ -797,6 +797,25 @@ Meteor.methods({ if (Meteor.isServer) { Meteor.methods({ + setAllUsersHideSystemMessages() { + if (Meteor.user() && Meteor.user().isAdmin) { + // If setting is missing, add it + Users.update( + { 'profile.hiddenSystemMessages': { $exists: false } }, + { $set: { 'profile.hiddenSystemMessages': true } }, + { multi: true }, + ); + // If setting is false, set it to true + Users.update( + { 'profile.hiddenSystemMessages': false }, + { $set: { 'profile.hiddenSystemMessages': true } }, + { multi: true }, + ); + return true; + } else { + return false; + } + }, setCreateUser( fullname, username, diff --git a/openapi/generate_openapi.py b/openapi/generate_openapi.py index d23fba8b3..41c6fa5d8 100644 --- a/openapi/generate_openapi.py +++ b/openapi/generate_openapi.py @@ -1,6 +1,7 @@ #!/bin/env python3 import argparse +import esprima import json import logging import os @@ -14,7 +15,7 @@ err_context = 3 def get_req_body_elems(obj, elems): - if obj.type == 'FunctionExpression': + if obj.type in ['FunctionExpression', 'ArrowFunctionExpression']: get_req_body_elems(obj.body, elems) elif obj.type == 'BlockStatement': for s in obj.body: diff --git a/package-lock.json b/package-lock.json index 59d563d9c..6802ac20e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,326 +1,707 @@ { "name": "wekan", - "version": "v5.05.0", + "version": "v5.14.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, "requires": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.8.3" } }, "@babel/core": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.16.tgz", - "integrity": "sha512-t/hHIB504wWceOeaOoONOhu+gX+hpjfeN6YRBT209X/4sibZQfSF1I0HFRRlBe97UZZosGx5XwUg1ZgNbelmNw==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", + "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.15", - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helpers": "^7.12.13", - "@babel/parser": "^7.12.16", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13", + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.2", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helpers": "^7.10.1", + "@babel/parser": "^7.10.2", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", - "lodash": "^4.17.19", + "lodash": "^4.17.13", + "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" - } - }, - "@babel/eslint-parser": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.12.16.tgz", - "integrity": "sha512-NZHtJr2pLRYcQjvo/GVU3kFxIGEHveswoWfY5Wm2tJ7pb3AoqoQ+PP17rRTDh+POFWM15VvH+23x2/9Od0CYxQ==", - "requires": { - "eslint-scope": "5.1.0", - "eslint-visitor-keys": "^1.3.0", - "semver": "^6.3.0" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" } } }, "@babel/generator": { - "version": "7.12.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", - "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", + "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", + "dev": true, "requires": { - "@babel/types": "^7.12.13", + "@babel/types": "^7.9.5", "jsesc": "^2.5.1", + "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" } }, "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.8.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.16.tgz", - "integrity": "sha512-zYoZC1uvebBFmj1wFAlXwt35JLEgecefATtKp20xalwEK8vHAixLBXTGxNrVGEmTT+gzOThUgr8UEdgtalc1BQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-imports": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", - "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-transforms": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", - "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13", - "@babel/helper-simple-access": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13", - "lodash": "^4.17.19" + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-replace-supers": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", - "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-simple-access": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", - "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", "requires": { - "@babel/types": "^7.12.13" + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.8.3" } }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true }, "@babel/helpers": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.13.tgz", - "integrity": "sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", + "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", - "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==" + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true }, "@babel/runtime": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", - "integrity": "sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", - "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.19" + "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, - "@eslint/eslintrc": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", - "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "@fast-csv/format": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", - "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", - "requires": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isboolean": "^3.0.3", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0" - } - }, - "@fast-csv/parse": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", - "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", - "requires": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } + "@root/request": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@root/request/-/request-1.6.1.tgz", + "integrity": "sha512-8wrWyeBLRp7T8J36GkT3RODJ6zYmL0/maWlAUD5LOXT28D3TDquUepyYDKYANNA3Gc8R5ZCgf+AXvSTYpJEWwQ==" }, "@samverschueren/stream-to-observable": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", "dev": true, "requires": { "any-observable": "^0.3.0" @@ -333,22 +714,11 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", "dev": true }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/node": { - "version": "14.14.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.27.tgz", - "integrity": "sha512-Ecfmo4YDQPwuqTCl1yBxLV5ihKfRlkBmzUEDcfIRvDxOTGQEeikr317Ln7Gcv0tjA8dVgKI3rniqW2G1OyKDng==" - }, "@typescript-eslint/experimental-utils": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", @@ -358,28 +728,30 @@ "@types/json-schema": "^7.0.3", "@typescript-eslint/typescript-estree": "1.13.0", "eslint-scope": "^4.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", + "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "1.13.0", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", + "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" }, "dependencies": { - "@typescript-eslint/typescript-estree": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", - "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", - "dev": true, - "requires": { - "lodash.unescape": "4.0.1", - "semver": "5.5.0" - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -388,110 +760,39 @@ } } }, - "@typescript-eslint/parser": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.0.tgz", - "integrity": "sha512-L6Dtbq8Bc7g2aZwnIBETpmUa9XDKCMzKVwAArnGp5Mn7PRNFjf3mUzq8UeBjL3K8t311hvevnyqXAMSmxO8Gpg==", - "requires": { - "@typescript-eslint/scope-manager": "4.15.0", - "@typescript-eslint/types": "4.15.0", - "@typescript-eslint/typescript-estree": "4.15.0", - "debug": "^4.1.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.0.tgz", - "integrity": "sha512-CSNBZnCC2jEA/a+pR9Ljh8Y+5TY5qgbPz7ICEk9WCpSEgT6Pi7H2RIjxfrrbUXvotd6ta+i27sssKEH8Azm75g==", - "requires": { - "@typescript-eslint/types": "4.15.0", - "@typescript-eslint/visitor-keys": "4.15.0" - } - }, - "@typescript-eslint/types": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.0.tgz", - "integrity": "sha512-su4RHkJhS+iFwyqyXHcS8EGPlUVoC+XREfy5daivjLur9JP8GhvTmDipuRpcujtGC4M+GYhUOJCPDE3rC5NJrg==" - }, - "@typescript-eslint/typescript-estree": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.0.tgz", - "integrity": "sha512-jG6xTmcNbi6xzZq0SdWh7wQ9cMb2pqXaUp6bUZOMsIlu5aOlxGxgE/t6L/gPybybQGvdguajXGkZKSndZJpksA==", - "requires": { - "@typescript-eslint/types": "4.15.0", - "@typescript-eslint/visitor-keys": "4.15.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.0.tgz", - "integrity": "sha512-RnDtJwOwFucWFAMjG3ghCG/ikImFJFEg20DI7mn4pHEx3vC48lIAoyjhffvfHmErRDboUPC7p9Z2il4CLb7qxA==", - "requires": { - "@typescript-eslint/types": "4.15.0", - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==" - } - } - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.0.tgz", + "integrity": "sha512-/oA9z7JszpIioo6J6dB79LVUgJ3eD3cxkAmdCkvWWS+Y9tPtALs1rLqOekLUXUbYqM2fB9TTK0ibAyZJJOP/CA==" }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, "ajv": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz", - "integrity": "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "requires": { "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", @@ -499,10 +800,9 @@ "dev": true }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "3.2.1", @@ -523,66 +823,6 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "archiver": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.2.0.tgz", - "integrity": "sha512-QEAKlgQuAtUxKeZB9w5/ggKXh21bZS+dzzuQ0RPBC20qtDCbTyzqmisoeJP46MP39fg4B4IcyvR+yeyEBdblsQ==", - "requires": { - "archiver-utils": "^2.1.0", - "async": "^3.2.0", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.1.4", - "zip-stream": "^4.0.4" - } - }, - "archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", @@ -590,35 +830,6 @@ "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "argparse": { @@ -649,23 +860,16 @@ "dev": true }, "array-includes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", - "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "get-intrinsic": "^1.0.1", + "es-abstract": "^1.17.0", "is-string": "^1.0.5" } }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -673,14 +877,13 @@ "dev": true }, "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "es-abstract": "^1.17.0-next.1" } }, "asn1": { @@ -708,15 +911,25 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } }, "babel-runtime": { "version": "6.26.0", @@ -727,11 +940,6 @@ "regenerator-runtime": "^0.11.0" }, "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" - }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -775,13 +983,42 @@ "requires": { "is-descriptor": "^1.0.0" } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, "bcrypt": { "version": "5.0.0", @@ -792,20 +1029,6 @@ "node-pre-gyp": "0.15.0" } }, - "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" - }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, "bl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", @@ -813,42 +1036,8 @@ "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -859,57 +1048,64 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, "requires": { - "fill-range": "^7.0.1" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "bson": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.2.2.tgz", - "integrity": "sha512-9fX257PVHAUpiRGmY3356RVWKQxLA73BgjA/x5MGuJkTEMeG7yzjuBrsiFB67EXRJnFVKrbJY9t/M+oElKYktQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.0.4.tgz", + "integrity": "sha512-Ioi3TD0/1V3aI8+hPfC56TetYmzfq2H07jJa9A1lKTxWsFtHtYdLMGMXjtGEg9v0f72NSM07diRQEUNYhLupIA==", "requires": { - "buffer": "^5.6.0" + "buffer": "^5.1.0", + "long": "^4.0.0" } }, "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, - "buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" - }, "bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", + "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", "requires": { "dtrace-provider": "~0.8", - "moment": "^2.19.3", + "moment": "^2.10.6", "mv": "~2", "safe-json-stringify": "~1" } @@ -931,16 +1127,6 @@ "unset-value": "^1.0.0" } }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -973,14 +1159,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1022,63 +1200,6 @@ "requires": { "is-descriptor": "^0.1.0" } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true } } }, @@ -1099,6 +1220,14 @@ "requires": { "slice-ansi": "0.0.4", "string-width": "^1.0.1" + }, + "dependencies": { + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + } } }, "cli-width": { @@ -1152,17 +1281,6 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "compress-commons": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.0.2.tgz", - "integrity": "sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A==", - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1178,38 +1296,6 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "console-control-strings": { @@ -1238,9 +1324,9 @@ "dev": true }, "core-js": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", - "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "core-util-is": { "version": "1.0.2", @@ -1269,6 +1355,16 @@ "resolve-from": "^3.0.0" } }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -1277,33 +1373,17 @@ } } }, - "crc-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } - }, - "crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - } - }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "cssfilter": { @@ -1317,23 +1397,19 @@ "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", "dev": true }, - "dayjs": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", - "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" - }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true }, "dedent": { "version": "0.7.0", @@ -1369,6 +1445,37 @@ "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } } }, "delegates": { @@ -1377,23 +1484,15 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, "dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -1418,43 +1517,6 @@ "nan": "^2.14.0" } }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "elegant-spinner": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", @@ -1467,27 +1529,10 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" }, "error-ex": { "version": "1.3.2", @@ -1499,25 +1544,22 @@ } }, "es-abstract": { - "version": "1.18.0-next.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", - "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", "dev": true, "requires": { - "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.1", - "object-inspect": "^1.9.0", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.3", - "string.prototype.trimstart": "^1.0.3" + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, "es-to-primitive": { @@ -1542,54 +1584,53 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz", - "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.3.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.2.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", "esutils": "^2.0.2", - "file-entry-cache": "^6.0.0", + "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob": "^7.1.2", + "globals": "^11.7.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.20", + "levn": "^0.3.0", + "lodash": "^4.17.11", "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.4", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" }, "dependencies": { "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -1598,69 +1639,16 @@ "uri-js": "^4.2.2" } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", - "dev": true - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, "json-schema-traverse": { @@ -1669,22 +1657,13 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" + "ansi-regex": "^3.0.0" } } } @@ -1715,9 +1694,9 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", "dev": true, "requires": { "debug": "^2.6.9", @@ -1769,24 +1748,23 @@ } }, "eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", "has": "^1.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.1", + "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" + "resolve": "^1.12.0" }, "dependencies": { "debug": { @@ -1808,12 +1786,6 @@ "isarray": "^1.0.0" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1823,55 +1795,57 @@ } }, "eslint-plugin-meteor": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-meteor/-/eslint-plugin-meteor-7.2.2.tgz", - "integrity": "sha512-Lmmg+4WoRJfoDpfMuBO6jLU7+IksZGqIoyWrhfQGEuMRTYNWysIDVTGp+w6ygeq4hvdiZMHwuaAUR5dlxmfoLA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-meteor/-/eslint-plugin-meteor-5.2.0.tgz", + "integrity": "sha512-bHzs/0BwHdKcBbX7tYrSnBaMG+1i2f1wy8k6H/sBBsERD/yifmBUrNLiPyZkIvyVUeI8OaZw8U9fsMvLP5GhIg==", "dev": true, "requires": { "invariant": "2.2.4" } }, "eslint-plugin-prettier": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", - "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz", + "integrity": "sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" } }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "dev": true, "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "esprima": { @@ -1881,41 +1855,36 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", "dev": true } } }, "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } + "estraverse": "^4.1.0" } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true }, "esutils": { "version": "2.0.3", @@ -1923,22 +1892,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "exceljs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.2.0.tgz", - "integrity": "sha512-r0/ClXRs3cQmMGJOQY6/ymnZSBSzeJL/LjAlKjY75ev1iQgf0LcmeFfTqFTFK0fADLAWieOMXe7abPoGYWI6hA==", - "requires": { - "archiver": "^5.0.0", - "dayjs": "^1.8.34", - "fast-csv": "^4.3.1", - "jszip": "^3.5.0", - "readable-stream": "^3.6.0", - "saxes": "^5.0.1", - "tmp": "^0.2.0", - "unzipper": "^0.10.11", - "uuid": "^8.3.0" - } - }, "execa": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", @@ -1964,54 +1917,9 @@ "shebang-command": "^1.2.0", "which": "^1.2.9" } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true } } }, - "exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -2054,69 +1962,6 @@ "is-extendable": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -2133,6 +1978,17 @@ "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "external-editor": { @@ -2144,17 +2000,6 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } } }, "extglob": { @@ -2191,11 +2036,34 @@ "is-extendable": "^0.1.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, @@ -2204,15 +2072,6 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=" }, - "fast-csv": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", - "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", - "requires": { - "@fast-csv/format": "4.3.5", - "@fast-csv/parse": "4.3.6" - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2224,24 +2083,10 @@ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "dev": true }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -2249,14 +2094,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fastq": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz", - "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==", - "requires": { - "reusify": "^1.0.4" - } - }, "fibers": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.0.tgz", @@ -2266,30 +2103,44 @@ } }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", - "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "dev": true, "requires": { - "flat-cache": "^3.0.4" + "flat-cache": "^2.0.1" } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, "requires": { - "to-regex-range": "^5.0.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "find-parent-dir": { @@ -2308,19 +2159,37 @@ } }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "dev": true, "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.0.4.tgz", + "integrity": "sha512-4gZhsMc26tSiMgQ+0gRN818ST2KCkX/4EvqocCkE1+SRb7mapNk4KLSP+XAj02jc8rxuyD3DrmI3a0BQ/TNOpg==" }, "flushwritable": { "version": "1.0.0", @@ -2342,11 +2211,6 @@ "map-cache": "^0.2.2" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "fs-minipass": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", @@ -2360,27 +2224,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -2406,38 +2249,12 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } } }, "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" }, "get-own-enumerable-property-symbols": { "version": "3.0.2", @@ -2476,43 +2293,16 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, - "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" - } - } - }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true }, "gridfs-stream": { "version": "https://github.com/wekan/gridfs-stream/tarball/master", @@ -2537,14 +2327,6 @@ "dev": true, "requires": { "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } } }, "has-flag": { @@ -2584,26 +2366,6 @@ "kind-of": "^4.0.0" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -2630,9 +2392,9 @@ } }, "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "ignore": { "version": "4.0.6", @@ -2654,13 +2416,21 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } } }, "imurmurhash": { @@ -2690,9 +2460,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" }, "inquirer": { "version": "6.5.2", @@ -2715,14 +2485,11 @@ "through": "^2.3.6" }, "dependencies": { - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -2780,12 +2547,23 @@ } }, "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-arrayish": { @@ -2801,27 +2579,29 @@ "dev": true }, "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "dev": true }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-date-object": { @@ -2831,14 +2611,22 @@ "dev": true }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, "is-directory": { @@ -2848,18 +2636,16 @@ "dev": true }, "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", @@ -2873,20 +2659,30 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, "requires": { "is-extglob": "^2.1.1" } }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, "is-obj": { "version": "1.0.1", @@ -2913,19 +2709,18 @@ } }, "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" + "has": "^1.0.3" } }, "is-regexp": { @@ -2962,9 +2757,9 @@ "dev": true }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -3002,9 +2797,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3023,9 +2818,9 @@ "dev": true }, "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -3034,51 +2829,22 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "requires": { "minimist": "^1.2.5" } }, "jszip": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", - "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.4.0.tgz", + "integrity": "sha512-gZAOYuPl4EhPTXT0GjhI3o+ZAz3su6EhLrKUoAivcKqyqC7laS5JEv4XWZND9BgcDcF83vI85yGbDmDR6UhrIg==", "requires": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "set-immediate-shim": "~1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "kind-of": { @@ -3087,43 +2853,6 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { - "readable-stream": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "ldap-filter": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", @@ -3133,9 +2862,9 @@ } }, "ldapjs": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.2.3.tgz", - "integrity": "sha512-143MayI+cSo1PEngge0HMVj3Fb0TneX4Qp9yl9bKs45qND3G64B75GMSxtZCfNuVsvg833aOp1UWG8peFu1LrQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.1.1.tgz", + "integrity": "sha512-XzF2BEGeM/nenYDAJvkDMYovZ07fIGalrYD+suprSqUWPCWpoa+a4vWl5g8o/En85m6NHWBpirDFNClWLAd77w==", "requires": { "abstract-logging": "^2.0.0", "asn1": "^0.2.4", @@ -3154,13 +2883,13 @@ "dev": true }, "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "lie": { @@ -3209,131 +2938,23 @@ "stringify-object": "^3.2.2" }, "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { + "pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true } } }, - "listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" - }, "listr": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", @@ -3381,12 +3002,6 @@ "strip-ansi": "^3.0.1" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -3406,6 +3021,16 @@ "supports-color": "^2.0.0" } }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, "log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", @@ -3415,15 +3040,6 @@ "chalk": "^1.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -3442,17 +3058,6 @@ "cli-cursor": "^2.1.0", "date-fns": "^1.27.2", "figures": "^2.0.0" - }, - "dependencies": { - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - } } }, "load-json-file": { @@ -3465,23 +3070,6 @@ "parse-json": "^2.2.0", "pify": "^2.0.0", "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } } }, "locate-path": { @@ -3495,64 +3083,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "lodash.isnil": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", - "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isundefined": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", - "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash.merge": { "version": "4.6.2", @@ -3566,16 +3099,6 @@ "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", "dev": true }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -3597,9 +3120,9 @@ } }, "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", "dev": true }, "loglevel-colored-level-prefix": { @@ -3612,12 +3135,6 @@ "loglevel": "^1.4.1" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -3637,15 +3154,6 @@ "supports-color": "^2.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -3654,6 +3162,11 @@ } } }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -3664,17 +3177,20 @@ } }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, "requires": { - "yallist": "^4.0.0" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" }, "dependencies": { "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true } } }, @@ -3694,12 +3210,12 @@ } }, "markdown-it": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.0.4.tgz", - "integrity": "sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.0.2.tgz", + "integrity": "sha512-4Lkvjbv2kK+moL9TbeV+6/NHx+1Q+R/NIdUlFlkqkkzUcTod4uiyTJRiBidKR9qXSdkNFkgv+AELY8KN9vSgVA==", "requires": { "argparse": "^2.0.1", - "entities": "~2.1.0", + "entities": "~2.0.0", "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" @@ -3728,11 +3244,6 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "optional": true }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, "meteor-node-stubs": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.0.1.tgz", @@ -4295,12 +3806,24 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "mimic-fn": { @@ -4347,6 +3870,17 @@ "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "mkdirp": { @@ -4358,15 +3892,15 @@ } }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", + "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==", "optional": true }, "mongodb": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.4.tgz", - "integrity": "sha512-Y+Ki9iXE9jI+n9bVtbTOOdK0B95d6wVGSucwtBkvQ+HIvVdTCfpVRp01FDC24uhC/Q2WXQ8Lpq3/zwtB5Op9Qw==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.2.tgz", + "integrity": "sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==", "requires": { "bl": "^2.2.1", "bson": "^1.1.4", @@ -4430,9 +3964,9 @@ } }, "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "optional": true }, "nanomatch": { @@ -4467,9 +4001,9 @@ "optional": true }, "needle": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", - "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", + "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", @@ -4477,9 +4011,9 @@ }, "dependencies": { "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { "ms": "^2.1.1" } @@ -4493,9 +4027,9 @@ "dev": true }, "node-addon-api": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", - "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz", + "integrity": "sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==" }, "node-pre-gyp": { "version": "0.15.0", @@ -4512,16 +4046,6 @@ "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4.4.2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } } }, "nopt": { @@ -4545,11 +4069,6 @@ "validate-npm-package-license": "^3.0.1" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, "npm-bundled": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", @@ -4580,17 +4099,6 @@ "dev": true, "requires": { "which": "^1.2.10" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "npm-run-path": { @@ -4600,14 +4108,6 @@ "dev": true, "requires": { "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - } } }, "npm-which": { @@ -4619,17 +4119,6 @@ "commander": "^2.9.0", "npm-path": "^2.0.2", "which": "^1.2.10" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "npmlog": { @@ -4673,43 +4162,6 @@ "is-descriptor": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -4722,9 +4174,9 @@ } }, "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "dev": true }, "object-keys": { @@ -4743,15 +4195,15 @@ } }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "object.pick": { @@ -4764,14 +4216,14 @@ } }, "object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", "dev": true, "requires": { - "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", "has": "^1.0.3" } }, @@ -4793,17 +4245,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" } }, "os": { @@ -4886,9 +4338,9 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "papaparse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.0.tgz", - "integrity": "sha512-Lb7jN/4bTpiuGPrYy4tkKoUS8sTki8zacB5ke1p5zolhcSE4TlWgrlsxjrDTbG/dFVh07ck7X36hUf/b5V68pg==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.2.0.tgz", + "integrity": "sha512-ylq1wgUSnagU+MKQtNeVqrPhZuMYBvOSL00DHycFTCxownF95gpLAk1HiHdUW77N8yxRq1qHXLdlIPyBSG9NSA==" }, "parent-module": { "version": "1.0.1", @@ -4900,13 +4352,12 @@ } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "^1.2.0" } }, "pascalcase": { @@ -4933,16 +4384,15 @@ "dev": true }, "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { "version": "1.2.1", @@ -4950,22 +4400,28 @@ "integrity": "sha1-szcFwUAjTYc8hyHHuf2LVB7Tr/k=", "requires": { "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } } }, "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pkg-dir": { @@ -5014,31 +4470,6 @@ "which": "^1.2.9" } }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, "which": { "version": "1.2.14", "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", @@ -5047,12 +4478,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true } } }, @@ -5062,9 +4487,9 @@ "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" }, "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, "prettier": { @@ -5094,165 +4519,10 @@ "vue-eslint-parser": "^2.0.2" }, "dependencies": { - "@typescript-eslint/parser": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", - "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "1.13.0", - "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", - "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", - "dev": true, - "requires": { - "lodash.unescape": "4.0.1", - "semver": "5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - } - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", - "dev": true, - "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", "dev": true }, "indent-string": { @@ -5260,174 +4530,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -5448,13 +4550,16 @@ "requires": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } } }, - "printj": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -5478,14 +4583,9 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" - }, - "queue-microtask": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", - "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==" + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" }, "rc": { "version": "1.2.8", @@ -5496,13 +4596,6 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - } } }, "read-pkg": { @@ -5514,23 +4607,6 @@ "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", "path-type": "^2.0.0" - }, - "dependencies": { - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } } }, "read-pkg-up": { @@ -5544,27 +4620,23 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "requires": { - "minimatch": "^3.0.4" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" }, "regex-not": { "version": "1.0.2", @@ -5577,9 +4649,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, "repeat-element": { @@ -5594,11 +4666,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, "require-relative": { "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", @@ -5612,30 +4679,20 @@ "requires": { "resolve-from": "^2.0.0", "semver": "^5.1.0" - }, - "dependencies": { - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - } } }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", + "integrity": "sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==", "requires": { - "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" }, "resolve-url": { "version": "0.2.1", @@ -5659,37 +4716,27 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } }, "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "dev": true, "requires": { - "queue-microtask": "^1.2.2" + "is-promise": "^2.1.0" } }, "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -5734,14 +4781,6 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "requires": { - "xmlchars": "^2.2.0" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -5783,33 +4822,22 @@ "requires": { "is-extendable": "^0.1.0" } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { @@ -5817,16 +4845,24 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } }, "snapdragon": { "version": "0.8.2", @@ -5871,87 +4907,11 @@ "is-extendable": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } } } }, @@ -5974,6 +4934,35 @@ "requires": { "is-descriptor": "^1.0.0" } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, @@ -6003,12 +4992,16 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, "requires": { "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -6028,9 +5021,9 @@ } }, "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, "sparse-bitfield": { @@ -6053,9 +5046,9 @@ } }, "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -6069,9 +5062,9 @@ "dev": true }, "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -6079,9 +5072,9 @@ } }, "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split-string": { @@ -6123,63 +5116,6 @@ "requires": { "is-descriptor": "^0.1.0" } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true } } }, @@ -6197,56 +5133,56 @@ "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } } }, "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" } }, "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } + "safe-buffer": "~5.1.0" } }, "stringify-object": { @@ -6261,20 +5197,11 @@ } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - } + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -6290,10 +5217,9 @@ "dev": true }, "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { "version": "5.5.0", @@ -6310,79 +5236,71 @@ "dev": true }, "table": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", - "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "ajv": "^7.0.2", - "lodash": "^4.17.20", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" } } } @@ -6401,30 +5319,6 @@ "yallist": "^3.0.3" } }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - } - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -6438,11 +5332,12 @@ "dev": true }, "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { - "rimraf": "^3.0.0" + "os-tmpdir": "~1.0.2" } }, "to-fast-properties": { @@ -6483,69 +5378,30 @@ } }, "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" - }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tsutils": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", - "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==", - "requires": { - "tslib": "^1.8.1" - } + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true }, "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "^1.2.1" + "prelude-ls": "~1.1.2" } }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -6553,9 +5409,10 @@ "dev": true }, "typescript": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", - "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==" + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", + "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", + "dev": true }, "uc.micro": { "version": "1.0.6", @@ -6572,14 +5429,6 @@ "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } } }, "unset-value": { @@ -6619,65 +5468,13 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } } } }, "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { "punycode": "^2.1.0" } @@ -6699,17 +5496,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", - "dev": true - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -6776,9 +5562,9 @@ } }, "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -6807,9 +5593,9 @@ } }, "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -6839,6 +5625,12 @@ "strip-ansi": "^4.0.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -6880,11 +5672,6 @@ "mkdirp": "^0.5.1" } }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, "xss": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.8.tgz", @@ -6898,16 +5685,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "zip-stream": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.0.4.tgz", - "integrity": "sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw==", - "requires": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.0.2", - "readable-stream": "^3.6.0" - } } } } diff --git a/package.json b/package.json index f7afc19ad..f4dac16d8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v5.05.0", + "version": "v5.14.0", "description": "Open-Source kanban", "private": true, "scripts": { @@ -40,47 +40,44 @@ }, "homepage": "https://wekan.github.io", "devDependencies": { - "eslint": "^7.19.0", + "babel-eslint": "^10.1.0", + "eslint": "^5.16.0", "eslint-config-meteor": "0.0.9", "eslint-config-prettier": "^3.6.0", "eslint-import-resolver-meteor": "^0.4.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-meteor": "^7.2.2", - "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-import": "^2.20.0", + "eslint-plugin-meteor": "^5.1.0", + "eslint-plugin-prettier": "^3.1.2", "lint-staged": "^7.3.0", "pre-commit": "^1.2.2", "prettier": "^1.19.1", "prettier-eslint": "^9.0.2" }, "dependencies": { - "@babel/core": "^7.12.10", - "@babel/eslint-parser": "^7.12.13", - "@babel/runtime": "^7.12.5", - "@typescript-eslint/parser": "^4.14.2", - "ajv": "^7.0.4", + "@babel/core": "^7.9.6", + "@babel/runtime": "^7.9.6", + "@root/request": "^1.6.1", + "ajv": "^6.12.4", "babel-runtime": "^6.26.0", "bcrypt": "^5.0.0", - "bson": "^4.2.2", - "bunyan": "^1.8.15", - "core-js": "^3.8.3", + "bson": "^4.0.3", + "bunyan": "^1.8.12", "es6-promise": "^4.2.4", - "exceljs": "^4.2.0", + "exceljs": "^4.2.1", "fibers": "^5.0.0", - "flatted": "^3.1.1", + "flatted": "^3.0.4", "gridfs-stream": "https://github.com/wekan/gridfs-stream/tarball/master", - "jszip": "^3.5.0", - "ldapjs": "^2.2.3", - "markdown-it": "^12.0.4", + "jszip": "^3.4.0", + "ldapjs": "^2.1.1", + "markdown-it": "^12.0.2", "markdown-it-emoji": "^2.0.0", "meteor-node-stubs": "^1.0.1", - "mongodb": "^3.6.4", + "mongodb": "^3.6.2", "os": "^0.1.1", "page": "^1.11.5", - "papaparse": "^5.3.0", - "qs": "^6.9.6", - "source-map-resolve": "^0.6.0", + "papaparse": "^5.2.0", + "qs": "^6.9.4", "source-map-support": "^0.5.19", - "typescript": "^4.1.3", "xss": "^1.0.8" } } diff --git a/public/api/wekan.html b/public/api/wekan.html index 75e2b4411..9fc7995b5 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -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.05 + Wekan REST API v5.14 @@ -1467,6 +1467,26 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc + + + + + + + + + + + + + + + + + + + + @@ -1529,7 +1549,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc + + +
  • + Boards + + + +
  • + +
  • + Checklists + + + +
  • + +
  • + ChecklistItems + + + +
  • + +
  • + CardComments + + + +
  • + +
  • + Cards + + + +
  • + +
  • + CustomFields + + + +
  • + +
  • + Integrations + + + +
  • + +
  • + Lists + + + +
  • + +
  • + Users + + + +
  • + +
  • + Swimlanes + + + +
  • + +
  • + Schemas + + +
  • @@ -1573,7 +2092,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
    -

    Wekan REST API v5.05

    +

    Wekan REST API v5.14

    Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

    @@ -1683,7 +2202,7 @@ headers = { r = requests.post('/users/login', headers = headers) -print(r.json()) +print(r.json())
    URL obj = new URL("/users/login");
    @@ -1985,7 +2504,7 @@ headers = {
     
     r = requests.post('/users/register', headers = headers)
     
    -print(r.json())
    +print(r.json())
     
     
    URL obj = new URL("/users/register");
    @@ -2212,8 +2731,18152 @@ System.out.println(response.toString());
     
    +

    Boards

    +

    get_public_boards

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards

    +

    Get all public boards

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "title": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » titlestringfalsenonenone
    + +

    new_board

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "title": "string",
    +  "owner": "string",
    +  "isAdmin": true,
    +  "isActive": true,
    +  "isNoComments": true,
    +  "isCommentOnly": true,
    +  "isWorker": true,
    +  "permission": "string",
    +  "color": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "title": "string",
    +  "owner": "string",
    +  "isAdmin": true,
    +  "isActive": true,
    +  "isNoComments": true,
    +  "isCommentOnly": true,
    +  "isWorker": true,
    +  "permission": "string",
    +  "color": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards

    +

    Create a board

    +

    This allows to create a board.

    +

    The color has to be chosen between belize, nephritis, pomegranate, +pumpkin, wisteria, moderatepink, strongcyan, +limegreen, midnight, dark, relax, corteza:

    + Wekan logo +
    +

    Body parameter

    +
    +
    title: string
    +owner: string
    +isAdmin: true
    +isActive: true
    +isNoComments: true
    +isCommentOnly: true
    +isWorker: true
    +permission: string
    +color: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    bodybodyobjecttruenone
    » titlebodystringtruethe new title of the board
    » ownerbodystringtrue"ABCDE12345" <= User ID in Wekan.
    » isAdminbodybooleanfalseis the owner an admin of the board (default true)
    » isActivebodybooleanfalseis the board active (default true)
    » isNoCommentsbodybooleanfalsedisable comments (default false)
    » isCommentOnlybodybooleanfalseonly enable comments (default false)
    » isWorkerbodybooleanfalseonly move cards, assign himself to card and comment (default false)
    » permissionbodystringfalse"private" board <== Set to "public" if you
    » colorbodystringfalsethe color of the board
    +

    Detailed descriptions

    +

    » owner: "ABCDE12345" <= User ID in Wekan. +(Not username or email)

    +

    » permission: "private" board <== Set to "public" if you +want public Wekan board

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string",
    +  "defaultSwimlaneId": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » defaultSwimlaneIdstringfalsenonenone
    + +

    get_board

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}

    +

    Get the board with that particular ID

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe ID of the board to retrieve the data
    +

    Detailed descriptions

    +

    board: the ID of the board to retrieve the data

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "title": "string",
    +  "slug": "string",
    +  "archived": true,
    +  "archivedAt": "string",
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "stars": 0,
    +  "labels": [
    +    {
    +      "_id": "string",
    +      "name": "string",
    +      "color": "green"
    +    }
    +  ],
    +  "members": [
    +    {
    +      "userId": "string",
    +      "isAdmin": true,
    +      "isActive": true,
    +      "isNoComments": true,
    +      "isCommentOnly": true,
    +      "isWorker": true
    +    }
    +  ],
    +  "permission": "public",
    +  "color": "belize",
    +  "description": "string",
    +  "subtasksDefaultBoardId": "string",
    +  "subtasksDefaultListId": "string",
    +  "dateSettingsDefaultBoardId": "string",
    +  "dateSettingsDefaultListId": "string",
    +  "allowsSubtasks": true,
    +  "allowsAttachments": true,
    +  "allowsChecklists": true,
    +  "allowsComments": true,
    +  "allowsDescriptionTitle": true,
    +  "allowsDescriptionText": true,
    +  "allowsActivities": true,
    +  "allowsLabels": true,
    +  "allowsAssignee": true,
    +  "allowsMembers": true,
    +  "allowsRequestedBy": true,
    +  "allowsAssignedBy": true,
    +  "allowsReceivedDate": true,
    +  "allowsStartDate": true,
    +  "allowsEndDate": true,
    +  "allowsDueDate": true,
    +  "presentParentTask": "prefix-with-full-path",
    +  "startAt": "string",
    +  "dueAt": "string",
    +  "endAt": "string",
    +  "spentTime": 0,
    +  "isOvertime": true,
    +  "type": "string",
    +  "sort": 0
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseBoards
    + +

    delete_board

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/boards/{board} \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/boards/{board} HTTP/1.1
    +
    +
    +
    
    +const headers = {
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/boards/{board}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/boards/{board}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/boards/{board}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/boards/{board}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/boards/{board}

    +

    Delete a board

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe ID of the board
    +

    Detailed descriptions

    +

    board: the ID of the board

    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseNone
    + +

    get_board_attachments

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/attachments \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/attachments HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/attachments',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/attachments',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/attachments',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/attachments', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/attachments");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/attachments", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/attachments', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/attachments

    +

    Get the list of attachments of a board

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    +

    Detailed descriptions

    +

    board: the board ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "attachmentId": "string",
    +    "attachmentName": "string",
    +    "attachmentType": "string",
    +    "cardId": "string",
    +    "listId": "string",
    +    "swimlaneId": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » attachmentIdstringfalsenonenone
    » attachmentNamestringfalsenonenone
    » attachmentTypestringfalsenonenone
    » cardIdstringfalsenonenone
    » listIdstringfalsenonenone
    » swimlaneIdstringfalsenonenone
    + +

    exportJson

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/export \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/export HTTP/1.1
    +
    +
    +
    
    +const headers = {
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/export',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/export',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/export',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/export', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/export");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/export", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/export', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/export

    +

    This route is used to export the board to a json file format.

    +

    If user is already logged-in, pass loginToken as param +"authToken": '/api/boards/:boardId/export?authToken=:token'

    +

    See https://blog.kayla.com.au/server-side-route-authentication-in-meteor/ +for detailed explanations

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe ID of the board we are exporting
    +

    Detailed descriptions

    +

    board: the ID of the board we are exporting

    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseNone
    + +

    add_board_label

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X PUT /api/boards/{board}/labels \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    PUT /api/boards/{board}/labels HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "label": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/labels',
    +{
    +  method: 'PUT',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "label": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/labels',
    +{
    +  method: 'PUT',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.put '/api/boards/{board}/labels',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.put('/api/boards/{board}/labels', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/labels");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("PUT");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("PUT", "/api/boards/{board}/labels", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('PUT','/api/boards/{board}/labels', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    PUT /api/boards/{board}/labels

    +

    Add a label to a board

    +

    If the board doesn't have the name/color label, this function +adds the label to the board.

    +
    +

    Body parameter

    +
    +
    label: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board
    bodybodyobjecttruenone
    » labelbodystringtruethe label value
    +

    Detailed descriptions

    +

    board: the board

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    "string"
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responsestring
    + +

    set_board_member_permission

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/members/{member} \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/members/{member} HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +
    +
    +
    const inputBody = '{
    +  "isAdmin": true,
    +  "isNoComments": true,
    +  "isCommentOnly": true,
    +  "isWorker": true
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/members/{member}',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "isAdmin": true,
    +  "isNoComments": true,
    +  "isCommentOnly": true,
    +  "isWorker": true
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/members/{member}',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/members/{member}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/members/{member}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/members/{member}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/members/{member}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/members/{member}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/members/{member}

    +

    Change the permission of a member of a board

    +
    +

    Body parameter

    +
    +
    isAdmin: true
    +isNoComments: true
    +isCommentOnly: true
    +isWorker: true
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe ID of the board that we are changing
    memberpathstringtruethe ID of the user to change permissions
    bodybodyobjecttruenone
    » isAdminbodybooleantrueadmin capability
    » isNoCommentsbodybooleantrueNoComments capability
    » isCommentOnlybodybooleantrueCommentsOnly capability
    » isWorkerbodybooleantrueWorker capability
    +

    Detailed descriptions

    +

    board: the ID of the board that we are changing

    +

    member: the ID of the user to change permissions

    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseNone
    + +

    get_boards_count

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards_count \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards_count HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards_count',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards_count',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards_count',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards_count', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards_count");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards_count", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards_count', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards_count

    +

    Get public and private boards count

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "private": 0,
    +  "public": 0
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » privateintegerfalsenonenone
    » publicintegerfalsenonenone
    + +

    get_boards_from_user

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/users/{user}/boards \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/users/{user}/boards HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users/{user}/boards',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users/{user}/boards',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/users/{user}/boards',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/users/{user}/boards', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/users/{user}/boards");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/users/{user}/boards", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/users/{user}/boards', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/users/{user}/boards

    +

    Get all boards attached to a user

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    userpathstringtruethe ID of the user to retrieve the data
    +

    Detailed descriptions

    +

    user: the ID of the user to retrieve the data

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "title": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » titlestringfalsenonenone
    + +

    Checklists

    +

    get_all_checklists

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/cards/{card}/checklists \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/cards/{card}/checklists HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/cards/{card}/checklists',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/cards/{card}/checklists', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cards/{card}/checklists");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/cards/{card}/checklists", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/cards/{card}/checklists', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/cards/{card}/checklists

    +

    Get the list of checklists attached to a card

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    cardpathstringtruethe card ID
    +

    Detailed descriptions

    +

    board: the board ID

    +

    card: the card ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "title": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » titlestringfalsenonenone
    + +

    new_checklist

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/cards/{card}/checklists \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/cards/{card}/checklists HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "title": "string",
    +  "items": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "title": "string",
    +  "items": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/cards/{card}/checklists',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/cards/{card}/checklists', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cards/{card}/checklists");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/cards/{card}/checklists", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/cards/{card}/checklists', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/cards/{card}/checklists

    +

    create a new checklist

    +
    +

    Body parameter

    +
    +
    title: string
    +items: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    cardpathstringtruethe card ID
    bodybodyobjecttruenone
    » titlebodystringtruethe title of the new checklist
    » itemsbodystringfalsethe list of items on the new checklist
    +

    Detailed descriptions

    +

    board: the board ID

    +

    card: the card ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    get_checklist

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/cards/{card}/checklists/{checklist} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/cards/{card}/checklists/{checklist} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists/{checklist}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists/{checklist}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/cards/{card}/checklists/{checklist}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/cards/{card}/checklists/{checklist}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cards/{card}/checklists/{checklist}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/cards/{card}/checklists/{checklist}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/cards/{card}/checklists/{checklist}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/cards/{card}/checklists/{checklist}

    +

    Get a checklist

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    cardpathstringtruethe card ID
    checklistpathstringtruethe ID of the checklist
    +

    Detailed descriptions

    +

    board: the board ID

    +

    card: the card ID

    +

    checklist: the ID of the checklist

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "cardId": "string",
    +  "title": "string",
    +  "finishedAt": "string",
    +  "createdAt": "string",
    +  "sort": 0,
    +  "items": [
    +    {
    +      "_id": "string",
    +      "title": "string",
    +      "isFinished": true
    +    }
    +  ]
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » cardIdstringfalsenonenone
    » titlestringfalsenonenone
    » finishedAtstringfalsenonenone
    » createdAtstringfalsenonenone
    » sortnumberfalsenonenone
    » items[object]falsenonenone
    »» _idstringfalsenonenone
    »» titlestringfalsenonenone
    »» isFinishedbooleanfalsenonenone
    + +

    delete_checklist

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/boards/{board}/cards/{card}/checklists/{checklist} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/boards/{board}/cards/{card}/checklists/{checklist} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists/{checklist}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists/{checklist}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/boards/{board}/cards/{card}/checklists/{checklist}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/boards/{board}/cards/{card}/checklists/{checklist}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cards/{card}/checklists/{checklist}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/boards/{board}/cards/{card}/checklists/{checklist}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/boards/{board}/cards/{card}/checklists/{checklist}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/boards/{board}/cards/{card}/checklists/{checklist}

    +

    Delete a checklist

    +

    The checklist will be removed, not put in the recycle bin.

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    cardpathstringtruethe card ID
    checklistpathstringtruethe ID of the checklist to remove
    +

    Detailed descriptions

    +

    board: the board ID

    +

    card: the card ID

    +

    checklist: the ID of the checklist to remove

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    ChecklistItems

    +

    get_checklist_item

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}

    +

    Get a checklist item

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    cardpathstringtruethe card ID
    checklistpathstringtruethe checklist ID
    itempathstringtruethe ID of the item
    +

    Detailed descriptions

    +

    board: the board ID

    +

    card: the card ID

    +

    checklist: the checklist ID

    +

    item: the ID of the item

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "title": "string",
    +  "sort": 0,
    +  "isFinished": true,
    +  "checklistId": "string",
    +  "cardId": "string",
    +  "createdAt": "string",
    +  "modifiedAt": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseChecklistItems
    + +

    edit_checklist_item

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X PUT /api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item} \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    PUT /api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item} HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "isFinished": "string",
    +  "title": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}',
    +{
    +  method: 'PUT',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "isFinished": "string",
    +  "title": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}',
    +{
    +  method: 'PUT',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.put '/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.put('/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("PUT");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("PUT", "/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('PUT','/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    PUT /api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}

    +

    Edit a checklist item

    +
    +

    Body parameter

    +
    +
    isFinished: string
    +title: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    cardpathstringtruethe card ID
    checklistpathstringtruethe checklist ID
    itempathstringtruethe ID of the item
    bodybodyobjectfalsenone
    » isFinishedbodystringfalseis the item checked?
    » titlebodystringfalsethe new text of the item
    +

    Detailed descriptions

    +

    board: the board ID

    +

    card: the card ID

    +

    checklist: the checklist ID

    +

    item: the ID of the item

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    delete_checklist_item

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}

    +

    Delete a checklist item

    +

    Note: this operation can't be reverted.

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    cardpathstringtruethe card ID
    checklistpathstringtruethe checklist ID
    itempathstringtruethe ID of the item to be removed
    +

    Detailed descriptions

    +

    board: the board ID

    +

    card: the card ID

    +

    checklist: the checklist ID

    +

    item: the ID of the item to be removed

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    CardComments

    +

    get_all_comments

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/cards/{card}/comments \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/cards/{card}/comments HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/comments',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/comments',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/cards/{card}/comments',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/cards/{card}/comments', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cards/{card}/comments");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/cards/{card}/comments", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/cards/{card}/comments', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/cards/{card}/comments

    +

    Get all comments attached to a card

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID of the card
    cardpathstringtruethe ID of the card
    +

    Detailed descriptions

    +

    board: the board ID of the card

    +

    card: the ID of the card

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "comment": "string",
    +    "authorId": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » commentstringfalsenonenone
    » authorIdstringfalsenonenone
    + +

    new_comment

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/cards/{card}/comments \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/cards/{card}/comments HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "authorId": "string",
    +  "comment": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/comments',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "authorId": "string",
    +  "comment": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/comments',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/cards/{card}/comments',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/cards/{card}/comments', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cards/{card}/comments");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/cards/{card}/comments", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/cards/{card}/comments', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/cards/{card}/comments

    +

    Add a comment on a card

    +
    +

    Body parameter

    +
    +
    authorId: string
    +comment: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID of the card
    cardpathstringtruethe ID of the card
    bodybodyobjecttruenone
    » authorIdbodystringtruethe user who 'posted' the comment
    » commentbodystringtruethe comment value
    +

    Detailed descriptions

    +

    board: the board ID of the card

    +

    card: the ID of the card

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    get_comment

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/cards/{card}/comments/{comment} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/cards/{card}/comments/{comment} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/comments/{comment}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/comments/{comment}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/cards/{card}/comments/{comment}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/cards/{card}/comments/{comment}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cards/{card}/comments/{comment}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/cards/{card}/comments/{comment}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/cards/{card}/comments/{comment}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/cards/{card}/comments/{comment}

    +

    Get a comment on a card

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID of the card
    cardpathstringtruethe ID of the card
    commentpathstringtruethe ID of the comment to retrieve
    +

    Detailed descriptions

    +

    board: the board ID of the card

    +

    card: the ID of the card

    +

    comment: the ID of the comment to retrieve

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "boardId": "string",
    +  "cardId": "string",
    +  "text": "string",
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "userId": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseCardComments
    + +

    delete_comment

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/boards/{board}/cards/{card}/comments/{comment} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/boards/{board}/cards/{card}/comments/{comment} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/comments/{comment}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cards/{card}/comments/{comment}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/boards/{board}/cards/{card}/comments/{comment}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/boards/{board}/cards/{card}/comments/{comment}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cards/{card}/comments/{comment}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/boards/{board}/cards/{card}/comments/{comment}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/boards/{board}/cards/{card}/comments/{comment}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/boards/{board}/cards/{card}/comments/{comment}

    +

    Delete a comment on a card

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID of the card
    cardpathstringtruethe ID of the card
    commentpathstringtruethe ID of the comment to delete
    +

    Detailed descriptions

    +

    board: the board ID of the card

    +

    card: the ID of the card

    +

    comment: the ID of the comment to delete

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    Cards

    +

    get_cards_by_custom_field

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/cardsByCustomField/{customField}/{customFieldValue} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/cardsByCustomField/{customField}/{customFieldValue} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cardsByCustomField/{customField}/{customFieldValue}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/cardsByCustomField/{customField}/{customFieldValue}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/cardsByCustomField/{customField}/{customFieldValue}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/cardsByCustomField/{customField}/{customFieldValue}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/cardsByCustomField/{customField}/{customFieldValue}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/cardsByCustomField/{customField}/{customFieldValue}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/cardsByCustomField/{customField}/{customFieldValue}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/cardsByCustomField/{customField}/{customFieldValue}

    +

    Get all Cards that matchs a value of a specific custom field

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    customFieldpathstringtruethe list ID
    customFieldValuepathstringtruethe value to look for
    +

    Detailed descriptions

    +

    board: the board ID

    +

    customField: the list ID

    +

    customFieldValue: the value to look for

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "title": "string",
    +    "description": "string",
    +    "listId": "string",
    +    "swinlaneId": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » titlestringfalsenonenone
    » descriptionstringfalsenonenone
    » listIdstringfalsenonenone
    » swinlaneIdstringfalsenonenone
    + +

    get_all_cards

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/lists/{list}/cards \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/lists/{list}/cards HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}/cards',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}/cards',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/lists/{list}/cards',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/lists/{list}/cards', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/lists/{list}/cards");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/lists/{list}/cards", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/lists/{list}/cards', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/lists/{list}/cards

    +

    Get all Cards attached to a List

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    listpathstringtruethe list ID
    +

    Detailed descriptions

    +

    board: the board ID

    +

    list: the list ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "title": "string",
    +    "description": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » titlestringfalsenonenone
    » descriptionstringfalsenonenone
    + +

    new_card

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/lists/{list}/cards \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/lists/{list}/cards HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "authorId": "string",
    +  "members": "string",
    +  "assignees": "string",
    +  "title": "string",
    +  "description": "string",
    +  "swimlaneId": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}/cards',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "authorId": "string",
    +  "members": "string",
    +  "assignees": "string",
    +  "title": "string",
    +  "description": "string",
    +  "swimlaneId": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}/cards',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/lists/{list}/cards',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/lists/{list}/cards', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/lists/{list}/cards");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/lists/{list}/cards", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/lists/{list}/cards', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/lists/{list}/cards

    +

    Create a new Card

    +
    +

    Body parameter

    +
    +
    authorId: string
    +members: string
    +assignees: string
    +title: string
    +description: string
    +swimlaneId: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID of the new card
    listpathstringtruethe list ID of the new card
    bodybodyobjecttruenone
    » authorIdbodystringtruethe authorId value
    » membersbodystringfalsethe member IDs list of the new card
    » assigneesbodystringfalsethe array of maximum one ID of assignee of the new card
    » titlebodystringtruethe title of the new card
    » descriptionbodystringtruethe description of the new card
    » swimlaneIdbodystringtruethe swimlane ID of the new card
    +

    Detailed descriptions

    +

    board: the board ID of the new card

    +

    list: the list ID of the new card

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    get_card

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/lists/{list}/cards/{card} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/lists/{list}/cards/{card} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}/cards/{card}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}/cards/{card}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/lists/{list}/cards/{card}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/lists/{list}/cards/{card}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/lists/{list}/cards/{card}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/lists/{list}/cards/{card}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/lists/{list}/cards/{card}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/lists/{list}/cards/{card}

    +

    Get a Card

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    listpathstringtruethe list ID of the card
    cardpathstringtruethe card ID
    +

    Detailed descriptions

    +

    board: the board ID

    +

    list: the list ID of the card

    +

    card: the card ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "title": "string",
    +  "archived": true,
    +  "archivedAt": "string",
    +  "parentId": "string",
    +  "listId": "string",
    +  "swimlaneId": "string",
    +  "boardId": "string",
    +  "coverId": "string",
    +  "color": "white",
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "customFields": [
    +    {}
    +  ],
    +  "dateLastActivity": "string",
    +  "description": "string",
    +  "requestedBy": "string",
    +  "assignedBy": "string",
    +  "labelIds": [
    +    "string"
    +  ],
    +  "members": [
    +    "string"
    +  ],
    +  "assignees": [
    +    "string"
    +  ],
    +  "receivedAt": "string",
    +  "startAt": "string",
    +  "dueAt": "string",
    +  "endAt": "string",
    +  "spentTime": 0,
    +  "isOvertime": true,
    +  "userId": "string",
    +  "sort": 0,
    +  "subtaskSort": 0,
    +  "type": "string",
    +  "linkedId": "string",
    +  "vote": {
    +    "question": "string",
    +    "positive": [
    +      "string"
    +    ],
    +    "negative": [
    +      "string"
    +    ],
    +    "end": "string",
    +    "public": true,
    +    "allowNonBoardMembers": true
    +  }
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseCards
    + +

    edit_card

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X PUT /api/boards/{board}/lists/{list}/cards/{card} \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    PUT /api/boards/{board}/lists/{list}/cards/{card} HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "title": "string",
    +  "sort": "string",
    +  "parentId": "string",
    +  "description": "string",
    +  "color": "string",
    +  "vote": {},
    +  "labelIds": "string",
    +  "requestedBy": "string",
    +  "assignedBy": "string",
    +  "receivedAt": "string",
    +  "startAt": "string",
    +  "dueAt": "string",
    +  "endAt": "string",
    +  "spentTime": "string",
    +  "isOverTime": true,
    +  "customFields": "string",
    +  "members": "string",
    +  "assignees": "string",
    +  "swimlaneId": "string",
    +  "listId": "string",
    +  "authorId": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}/cards/{card}',
    +{
    +  method: 'PUT',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "title": "string",
    +  "sort": "string",
    +  "parentId": "string",
    +  "description": "string",
    +  "color": "string",
    +  "vote": {},
    +  "labelIds": "string",
    +  "requestedBy": "string",
    +  "assignedBy": "string",
    +  "receivedAt": "string",
    +  "startAt": "string",
    +  "dueAt": "string",
    +  "endAt": "string",
    +  "spentTime": "string",
    +  "isOverTime": true,
    +  "customFields": "string",
    +  "members": "string",
    +  "assignees": "string",
    +  "swimlaneId": "string",
    +  "listId": "string",
    +  "authorId": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}/cards/{card}',
    +{
    +  method: 'PUT',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.put '/api/boards/{board}/lists/{list}/cards/{card}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.put('/api/boards/{board}/lists/{list}/cards/{card}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/lists/{list}/cards/{card}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("PUT");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("PUT", "/api/boards/{board}/lists/{list}/cards/{card}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('PUT','/api/boards/{board}/lists/{list}/cards/{card}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    PUT /api/boards/{board}/lists/{list}/cards/{card}

    +

    Edit Fields in a Card

    +

    Edit a card

    +

    The color has to be chosen between white, green, yellow, orange, +red, purple, blue, sky, lime, pink, black, silver, +peachpuff, crimson, plum, darkgreen, slateblue, magenta, +gold, navy, gray, saddlebrown, paleturquoise, mistyrose, +indigo:

    + Wekan card colors +

    Note: setting the color to white has the same effect than removing it.

    +
    +

    Body parameter

    +
    +
    title: string
    +sort: string
    +parentId: string
    +description: string
    +color: string
    +vote: {}
    +labelIds: string
    +requestedBy: string
    +assignedBy: string
    +receivedAt: string
    +startAt: string
    +dueAt: string
    +endAt: string
    +spentTime: string
    +isOverTime: true
    +customFields: string
    +members: string
    +assignees: string
    +swimlaneId: string
    +listId: string
    +authorId: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID of the card
    listpathstringtruethe list ID of the card
    cardpathstringtruethe ID of the card
    bodybodyobjectfalsenone
    » titlebodystringfalsethe new title of the card
    » sortbodystringfalsethe new sort value of the card
    » parentIdbodystringfalsechange the parent of the card
    » descriptionbodystringfalsethe new description of the card
    » colorbodystringfalsethe new color of the card
    » votebodyobjectfalsethe vote object
    » labelIdsbodystringfalsethe new list of label IDs attached to the card
    » requestedBybodystringfalsethe new requestedBy field of the card
    » assignedBybodystringfalsethe new assignedBy field of the card
    » receivedAtbodystringfalsethe new receivedAt field of the card
    » startAtbodystringfalsethe new startAt field of the card
    » dueAtbodystringfalsethe new dueAt field of the card
    » endAtbodystringfalsethe new endAt field of the card
    » spentTimebodystringfalsethe new spentTime field of the card
    » isOverTimebodybooleanfalsethe new isOverTime field of the card
    » customFieldsbodystringfalsethe new customFields value of the card
    » membersbodystringfalsethe new list of member IDs attached to the card
    » assigneesbodystringfalsethe array of maximum one ID of assignee attached to the card
    » swimlaneIdbodystringfalsethe new swimlane ID of the card
    » listIdbodystringfalsethe new list ID of the card (move operation)
    » authorIdbodystringfalsechange the owner of the card
    +

    Detailed descriptions

    +

    board: the board ID of the card

    +

    list: the list ID of the card

    +

    card: the ID of the card

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    delete_card

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/boards/{board}/lists/{list}/cards/{card} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/boards/{board}/lists/{list}/cards/{card} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}/cards/{card}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}/cards/{card}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/boards/{board}/lists/{list}/cards/{card}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/boards/{board}/lists/{list}/cards/{card}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/lists/{list}/cards/{card}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/boards/{board}/lists/{list}/cards/{card}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/boards/{board}/lists/{list}/cards/{card}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/boards/{board}/lists/{list}/cards/{card}

    +

    Delete a card from a board

    +

    This operation deletes a card, and therefore the card +is not put in the recycle bin.

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID of the card
    listpathstringtruethe list ID of the card
    cardpathstringtruethe ID of the card
    +

    Detailed descriptions

    +

    board: the board ID of the card

    +

    list: the list ID of the card

    +

    card: the ID of the card

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    get_swimlane_cards

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/swimlanes/{swimlane}/cards \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/swimlanes/{swimlane}/cards HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/swimlanes/{swimlane}/cards',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/swimlanes/{swimlane}/cards',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/swimlanes/{swimlane}/cards',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/swimlanes/{swimlane}/cards', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/swimlanes/{swimlane}/cards");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/swimlanes/{swimlane}/cards", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/swimlanes/{swimlane}/cards', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/swimlanes/{swimlane}/cards

    +

    get all cards attached to a swimlane

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    swimlanepathstringtruethe swimlane ID
    +

    Detailed descriptions

    +

    board: the board ID

    +

    swimlane: the swimlane ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "title": "string",
    +    "description": "string",
    +    "listId": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » titlestringfalsenonenone
    » descriptionstringfalsenonenone
    » listIdstringfalsenonenone
    + +

    CustomFields

    +

    get_all_custom_fields

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/custom-fields \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/custom-fields HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/custom-fields',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/custom-fields', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/custom-fields");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/custom-fields", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/custom-fields', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/custom-fields

    +

    Get the list of Custom Fields attached to a board

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board value
    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "name": "string",
    +    "type": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » namestringfalsenonenone
    » typestringfalsenonenone
    + +

    new_custom_field

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/custom-fields \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/custom-fields HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "name": "string",
    +  "type": "string",
    +  "settings": "string",
    +  "showOnCard": true,
    +  "automaticallyOnCard": true,
    +  "showLabelOnMiniCard": true,
    +  "authorId": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "name": "string",
    +  "type": "string",
    +  "settings": "string",
    +  "showOnCard": true,
    +  "automaticallyOnCard": true,
    +  "showLabelOnMiniCard": true,
    +  "authorId": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/custom-fields',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/custom-fields', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/custom-fields");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/custom-fields", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/custom-fields', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/custom-fields

    +

    Create a Custom Field

    +
    +

    Body parameter

    +
    +
    name: string
    +type: string
    +settings: string
    +showOnCard: true
    +automaticallyOnCard: true
    +showLabelOnMiniCard: true
    +authorId: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board value
    bodybodyobjecttruenone
    » namebodystringtruethe name of the custom field
    » typebodystringtruethe type of the custom field
    » settingsbodystringtruethe settings object of the custom field
    » showOnCardbodybooleantrueshould we show the custom field on cards?
    » automaticallyOnCardbodybooleantrueshould the custom fields automatically be added on cards?
    » showLabelOnMiniCardbodybooleantrueshould the label of the custom field be shown on minicards?
    » authorIdbodystringtruethe authorId value
    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    get_custom_field

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/custom-fields/{customField} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/custom-fields/{customField} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/custom-fields/{customField}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/custom-fields/{customField}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/custom-fields/{customField}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/custom-fields/{customField}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/custom-fields/{customField}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/custom-fields/{customField}

    +

    Get a Custom Fields attached to a board

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board value
    customFieldpathstringtruethe ID of the custom field
    +

    Detailed descriptions

    +

    customField: the ID of the custom field

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "boardIds": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » boardIdsstringfalsenonenone
    + +

    edit_custom_field

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X PUT /api/boards/{board}/custom-fields/{customField} \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    PUT /api/boards/{board}/custom-fields/{customField} HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "name": "string",
    +  "type": "string",
    +  "settings": "string",
    +  "showOnCard": true,
    +  "automaticallyOnCard": true,
    +  "alwaysOnCard": "string",
    +  "showLabelOnMiniCard": true
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}',
    +{
    +  method: 'PUT',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "name": "string",
    +  "type": "string",
    +  "settings": "string",
    +  "showOnCard": true,
    +  "automaticallyOnCard": true,
    +  "alwaysOnCard": "string",
    +  "showLabelOnMiniCard": true
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}',
    +{
    +  method: 'PUT',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.put '/api/boards/{board}/custom-fields/{customField}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.put('/api/boards/{board}/custom-fields/{customField}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/custom-fields/{customField}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("PUT");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("PUT", "/api/boards/{board}/custom-fields/{customField}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('PUT','/api/boards/{board}/custom-fields/{customField}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    PUT /api/boards/{board}/custom-fields/{customField}

    +

    Update a Custom Field

    +
    +

    Body parameter

    +
    +
    name: string
    +type: string
    +settings: string
    +showOnCard: true
    +automaticallyOnCard: true
    +alwaysOnCard: string
    +showLabelOnMiniCard: true
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board value
    customFieldpathstringtruethe customField value
    bodybodyobjecttruenone
    » namebodystringtruethe name of the custom field
    » typebodystringtruethe type of the custom field
    » settingsbodystringtruethe settings object of the custom field
    » showOnCardbodybooleantrueshould we show the custom field on cards
    » automaticallyOnCardbodybooleantrueshould the custom fields automatically be added on cards
    » alwaysOnCardbodystringtruethe alwaysOnCard value
    » showLabelOnMiniCardbodybooleantrueshould the label of the custom field be shown on minicards
    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    delete_custom_field

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/boards/{board}/custom-fields/{customField} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/boards/{board}/custom-fields/{customField} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/boards/{board}/custom-fields/{customField}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/boards/{board}/custom-fields/{customField}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/custom-fields/{customField}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/boards/{board}/custom-fields/{customField}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/boards/{board}/custom-fields/{customField}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/boards/{board}/custom-fields/{customField}

    +

    Delete a Custom Fields attached to a board

    +

    The Custom Field can't be retrieved after this operation

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board value
    customFieldpathstringtruethe ID of the custom field
    +

    Detailed descriptions

    +

    customField: the ID of the custom field

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    add_custom_field_dropdown_items

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/custom-fields/{customField}/dropdown-items \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/custom-fields/{customField}/dropdown-items HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "items": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}/dropdown-items',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "items": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}/dropdown-items',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/custom-fields/{customField}/dropdown-items',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/custom-fields/{customField}/dropdown-items', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/custom-fields/{customField}/dropdown-items");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/custom-fields/{customField}/dropdown-items", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/custom-fields/{customField}/dropdown-items', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/custom-fields/{customField}/dropdown-items

    +

    Update a Custom Field's dropdown items

    +
    +

    Body parameter

    +
    +
    items: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board value
    customFieldpathstringtruethe customField value
    bodybodyobjectfalsenone
    » itemsbodystringfalsenames of the custom field
    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    edit_custom_field_dropdown_item

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X PUT /api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem} \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    PUT /api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem} HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "name": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}',
    +{
    +  method: 'PUT',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "name": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}',
    +{
    +  method: 'PUT',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.put '/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.put('/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("PUT");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("PUT", "/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('PUT','/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    PUT /api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}

    +

    Update a Custom Field's dropdown item

    +
    +

    Body parameter

    +
    +
    name: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board value
    customFieldpathstringtruethe customField value
    dropdownItempathstringtruethe dropdownItem value
    bodybodyobjecttruenone
    » namebodystringtruenames of the custom field
    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    delete_custom_field_dropdown_item

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}

    +

    Update a Custom Field's dropdown items

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board value
    customFieldpathstringtruethe customField value
    dropdownItempathstringtruethe dropdownItem value
    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    Integrations

    +

    get_all_integrations

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/integrations \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/integrations HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/integrations',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/integrations', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/integrations");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/integrations", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/integrations', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/integrations

    +

    Get all integrations in board

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    +

    Detailed descriptions

    +

    board: the board ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "enabled": true,
    +    "title": "string",
    +    "type": "string",
    +    "activities": [
    +      "string"
    +    ],
    +    "url": "string",
    +    "token": "string",
    +    "boardId": "string",
    +    "createdAt": "string",
    +    "modifiedAt": "string",
    +    "userId": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    anonymous[Integrations]falsenone[Integration with third-party applications]
    » enabledbooleantruenoneis the integration enabled?
    » titlestring¦nullfalsenonename of the integration
    » typestringtruenonetype of the integratation (Default to 'outgoing-webhooks')
    » activities[string]truenoneactivities the integration gets triggered (list)
    » urlstringtruenonenone
    » tokenstring¦nullfalsenonetoken of the integration
    » boardIdstringtruenoneBoard ID of the integration
    » createdAtstringtruenoneCreation date of the integration
    » modifiedAtstringtruenonenone
    » userIdstringtruenoneuser ID who created the interation
    + +

    new_integration

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/integrations \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/integrations HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "url": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "url": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/integrations',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/integrations', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/integrations");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/integrations", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/integrations', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/integrations

    +

    Create a new integration

    +
    +

    Body parameter

    +
    +
    url: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    bodybodyobjecttruenone
    » urlbodystringtruethe URL of the integration
    +

    Detailed descriptions

    +

    board: the board ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    get_integration

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/integrations/{int} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/integrations/{int} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations/{int}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations/{int}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/integrations/{int}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/integrations/{int}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/integrations/{int}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/integrations/{int}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/integrations/{int}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/integrations/{int}

    +

    Get a single integration in board

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    intpathstringtruethe integration ID
    +

    Detailed descriptions

    +

    board: the board ID

    +

    int: the integration ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "enabled": true,
    +  "title": "string",
    +  "type": "string",
    +  "activities": [
    +    "string"
    +  ],
    +  "url": "string",
    +  "token": "string",
    +  "boardId": "string",
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "userId": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseIntegrations
    + +

    edit_integration

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X PUT /api/boards/{board}/integrations/{int} \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    PUT /api/boards/{board}/integrations/{int} HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "enabled": "string",
    +  "title": "string",
    +  "url": "string",
    +  "token": "string",
    +  "activities": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations/{int}',
    +{
    +  method: 'PUT',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "enabled": "string",
    +  "title": "string",
    +  "url": "string",
    +  "token": "string",
    +  "activities": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations/{int}',
    +{
    +  method: 'PUT',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.put '/api/boards/{board}/integrations/{int}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.put('/api/boards/{board}/integrations/{int}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/integrations/{int}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("PUT");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("PUT", "/api/boards/{board}/integrations/{int}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('PUT','/api/boards/{board}/integrations/{int}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    PUT /api/boards/{board}/integrations/{int}

    +

    Edit integration data

    +
    +

    Body parameter

    +
    +
    enabled: string
    +title: string
    +url: string
    +token: string
    +activities: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    intpathstringtruethe integration ID
    bodybodyobjectfalsenone
    » enabledbodystringfalseis the integration enabled?
    » titlebodystringfalsenew name of the integration
    » urlbodystringfalsenew URL of the integration
    » tokenbodystringfalsenew token of the integration
    » activitiesbodystringfalsenew list of activities of the integration
    +

    Detailed descriptions

    +

    board: the board ID

    +

    int: the integration ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    delete_integration

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/boards/{board}/integrations/{int} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/boards/{board}/integrations/{int} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations/{int}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations/{int}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/boards/{board}/integrations/{int}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/boards/{board}/integrations/{int}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/integrations/{int}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/boards/{board}/integrations/{int}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/boards/{board}/integrations/{int}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/boards/{board}/integrations/{int}

    +

    Delete integration

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    intpathstringtruethe integration ID
    +

    Detailed descriptions

    +

    board: the board ID

    +

    int: the integration ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    delete_integration_activities

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/boards/{board}/integrations/{int}/activities \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/boards/{board}/integrations/{int}/activities HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations/{int}/activities',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations/{int}/activities',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/boards/{board}/integrations/{int}/activities',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/boards/{board}/integrations/{int}/activities', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/integrations/{int}/activities");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/boards/{board}/integrations/{int}/activities", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/boards/{board}/integrations/{int}/activities', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/boards/{board}/integrations/{int}/activities

    +

    Delete subscribed activities

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    intpathstringtruethe integration ID
    +

    Detailed descriptions

    +

    board: the board ID

    +

    int: the integration ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "enabled": true,
    +  "title": "string",
    +  "type": "string",
    +  "activities": [
    +    "string"
    +  ],
    +  "url": "string",
    +  "token": "string",
    +  "boardId": "string",
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "userId": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseIntegrations
    + +

    new_integration_activities

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/integrations/{int}/activities \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/integrations/{int}/activities HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "activities": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations/{int}/activities',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "activities": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/integrations/{int}/activities',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/integrations/{int}/activities',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/integrations/{int}/activities', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/integrations/{int}/activities");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/integrations/{int}/activities", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/integrations/{int}/activities', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/integrations/{int}/activities

    +

    Add subscribed activities

    +
    +

    Body parameter

    +
    +
    activities: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    intpathstringtruethe integration ID
    bodybodyobjecttruenone
    » activitiesbodystringtruethe activities value
    +

    Detailed descriptions

    +

    board: the board ID

    +

    int: the integration ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "enabled": true,
    +  "title": "string",
    +  "type": "string",
    +  "activities": [
    +    "string"
    +  ],
    +  "url": "string",
    +  "token": "string",
    +  "boardId": "string",
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "userId": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseIntegrations
    + +

    Lists

    +

    get_all_lists

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/lists \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/lists HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/lists',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/lists', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/lists");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/lists", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/lists', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/lists

    +

    Get the list of Lists attached to a board

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    +

    Detailed descriptions

    +

    board: the board ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "title": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » titlestringfalsenonenone
    + +

    new_list

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/lists \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/lists HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "title": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "title": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/lists',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/lists', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/lists");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/lists", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/lists', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/lists

    +

    Add a List to a board

    +
    +

    Body parameter

    +
    +
    title: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    bodybodyobjecttruenone
    » titlebodystringtruethe title of the List
    +

    Detailed descriptions

    +

    board: the board ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    get_list

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/lists/{list} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/lists/{list} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/lists/{list}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/lists/{list}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/lists/{list}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/lists/{list}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/lists/{list}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/lists/{list}

    +

    Get a List attached to a board

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    listpathstringtruethe List ID
    +

    Detailed descriptions

    +

    board: the board ID

    +

    list: the List ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "title": "string",
    +  "starred": true,
    +  "archived": true,
    +  "archivedAt": "string",
    +  "boardId": "string",
    +  "swimlaneId": "string",
    +  "createdAt": "string",
    +  "sort": 0,
    +  "updatedAt": "string",
    +  "modifiedAt": "string",
    +  "wipLimit": {
    +    "value": 0,
    +    "enabled": true,
    +    "soft": true
    +  },
    +  "color": "white",
    +  "type": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseLists
    + +

    delete_list

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/boards/{board}/lists/{list} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/boards/{board}/lists/{list} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/lists/{list}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/boards/{board}/lists/{list}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/boards/{board}/lists/{list}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/lists/{list}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/boards/{board}/lists/{list}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/boards/{board}/lists/{list}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/boards/{board}/lists/{list}

    +

    Delete a List

    +

    This deletes a list from a board. +The list is not put in the recycle bin.

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    listpathstringtruethe ID of the list to remove
    +

    Detailed descriptions

    +

    board: the board ID

    +

    list: the ID of the list to remove

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    Users

    +

    add_board_member

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/members/{user}/add \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/members/{user}/add HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "action": "string",
    +  "isAdmin": true,
    +  "isNoComments": true,
    +  "isCommentOnly": true
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/members/{user}/add',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "action": "string",
    +  "isAdmin": true,
    +  "isNoComments": true,
    +  "isCommentOnly": true
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/members/{user}/add',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/members/{user}/add',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/members/{user}/add', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/members/{user}/add");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/members/{user}/add", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/members/{user}/add', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/members/{user}/add

    +

    Add New Board Member with Role

    +

    Only the admin user (the first user) can call the REST API.

    +

    Note: see Boards.set_board_member_permission +to later change the permissions.

    +
    +

    Body parameter

    +
    +
    action: string
    +isAdmin: true
    +isNoComments: true
    +isCommentOnly: true
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    userpathstringtruethe user ID
    bodybodyobjecttruenone
    » actionbodystringtruethe action value
    » isAdminbodybooleantrueis the user an admin of the board
    » isNoCommentsbodybooleantruedisable comments
    » isCommentOnlybodybooleantrueonly enable comments
    +

    Detailed descriptions

    +

    board: the board ID

    +

    user: the user ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string",
    +  "title": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » titlestringfalsenonenone
    + +

    remove_board_member

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/members/{user}/remove \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/members/{user}/remove HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "action": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/members/{user}/remove',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "action": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/members/{user}/remove',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/members/{user}/remove',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/members/{user}/remove', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/members/{user}/remove");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/members/{user}/remove", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/members/{user}/remove', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/members/{user}/remove

    +

    Remove Member from Board

    +

    Only the admin user (the first user) can call the REST API.

    +
    +

    Body parameter

    +
    +
    action: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe board ID
    userpathstringtruethe user ID
    bodybodyobjecttruenone
    » actionbodystringtruethe action (needs to be remove)
    +

    Detailed descriptions

    +

    board: the board ID

    +

    user: the user ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string",
    +  "title": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » titlestringfalsenonenone
    + +

    create_user_token

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/createtoken/{user} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/createtoken/{user} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/createtoken/{user}',
    +{
    +  method: 'POST',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/createtoken/{user}',
    +{
    +  method: 'POST',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/createtoken/{user}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/createtoken/{user}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/createtoken/{user}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/createtoken/{user}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/createtoken/{user}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/createtoken/{user}

    +

    Create a user token

    +

    Only the admin user (the first user) can call the REST API.

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    userpathstringtruethe ID of the user to create token for.
    +

    Detailed descriptions

    +

    user: the ID of the user to create token for.

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    get_current_user

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/user \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/user HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/user',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/user',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/user',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/user', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/user");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/user", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/user', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/user

    +

    returns the current user

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "username": "string",
    +  "emails": [
    +    {
    +      "address": "string",
    +      "verified": true
    +    }
    +  ],
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "profile": {
    +    "avatarUrl": "string",
    +    "emailBuffer": [
    +      "string"
    +    ],
    +    "fullname": "string",
    +    "showDesktopDragHandles": true,
    +    "hideCheckedItems": true,
    +    "hiddenSystemMessages": true,
    +    "hiddenMinicardLabelText": true,
    +    "initials": "string",
    +    "invitedBoards": [
    +      "string"
    +    ],
    +    "language": "string",
    +    "notifications": [],
    +    "activity": "string",
    +    "read": "string",
    +    "showCardsCountAt": 0,
    +    "startDayOfWeek": 0,
    +    "starredBoards": [
    +      "string"
    +    ],
    +    "icode": "string",
    +    "boardView": "board-view-swimlanes",
    +    "listSortBy": "-modifiedat",
    +    "templatesBoardId": "string",
    +    "cardTemplatesSwimlaneId": "string",
    +    "listTemplatesSwimlaneId": "string",
    +    "boardTemplatesSwimlaneId": "string"
    +  },
    +  "services": {},
    +  "heartbeat": "string",
    +  "isAdmin": true,
    +  "createdThroughApi": true,
    +  "loginDisabled": true,
    +  "authenticationMethod": "string",
    +  "sessionData": {
    +    "totalHits": 0,
    +    "lastHit": 0
    +  },
    +  "importUsernames": [
    +    "string"
    +  ]
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseUsers
    + +

    get_all_users

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/users \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/users HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/users',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/users', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/users");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/users", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/users', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/users

    +

    return all the users

    +

    Only the admin user (the first user) can call the REST API.

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "username": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » usernamestringfalsenonenone
    + +

    new_user

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/users \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/users HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "username": "string",
    +  "email": "string",
    +  "password": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "username": "string",
    +  "email": "string",
    +  "password": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/users',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/users', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/users");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/users", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/users', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/users

    +

    Create a new user

    +

    Only the admin user (the first user) can call the REST API.

    +
    +

    Body parameter

    +
    +
    username: string
    +email: string
    +password: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    bodybodyobjecttruenone
    » usernamebodystringtruethe new username
    » emailbodystringtruethe email of the new user
    » passwordbodystringtruethe password of the new user
    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    get_user

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/users/{user} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/users/{user} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users/{user}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users/{user}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/users/{user}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/users/{user}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/users/{user}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/users/{user}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/users/{user}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/users/{user}

    +

    get a given user

    +

    Only the admin user (the first user) can call the REST API.

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    userpathstringtruethe user ID or username
    +

    Detailed descriptions

    +

    user: the user ID or username

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "username": "string",
    +  "emails": [
    +    {
    +      "address": "string",
    +      "verified": true
    +    }
    +  ],
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "profile": {
    +    "avatarUrl": "string",
    +    "emailBuffer": [
    +      "string"
    +    ],
    +    "fullname": "string",
    +    "showDesktopDragHandles": true,
    +    "hideCheckedItems": true,
    +    "hiddenSystemMessages": true,
    +    "hiddenMinicardLabelText": true,
    +    "initials": "string",
    +    "invitedBoards": [
    +      "string"
    +    ],
    +    "language": "string",
    +    "notifications": [],
    +    "activity": "string",
    +    "read": "string",
    +    "showCardsCountAt": 0,
    +    "startDayOfWeek": 0,
    +    "starredBoards": [
    +      "string"
    +    ],
    +    "icode": "string",
    +    "boardView": "board-view-swimlanes",
    +    "listSortBy": "-modifiedat",
    +    "templatesBoardId": "string",
    +    "cardTemplatesSwimlaneId": "string",
    +    "listTemplatesSwimlaneId": "string",
    +    "boardTemplatesSwimlaneId": "string"
    +  },
    +  "services": {},
    +  "heartbeat": "string",
    +  "isAdmin": true,
    +  "createdThroughApi": true,
    +  "loginDisabled": true,
    +  "authenticationMethod": "string",
    +  "sessionData": {
    +    "totalHits": 0,
    +    "lastHit": 0
    +  },
    +  "importUsernames": [
    +    "string"
    +  ]
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseUsers
    + +

    edit_user

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X PUT /api/users/{user} \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    PUT /api/users/{user} HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "action": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users/{user}',
    +{
    +  method: 'PUT',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "action": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users/{user}',
    +{
    +  method: 'PUT',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.put '/api/users/{user}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.put('/api/users/{user}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/users/{user}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("PUT");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("PUT", "/api/users/{user}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('PUT','/api/users/{user}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    PUT /api/users/{user}

    +

    edit a given user

    +

    Only the admin user (the first user) can call the REST API.

    +

    Possible values for action:

    +
      +
    • takeOwnership: The admin takes the ownership of ALL boards of the user (archived and not archived) where the user is admin on.
    • +
    • disableLogin: Disable a user (the user is not allowed to login and his login tokens are purged)
    • +
    • enableLogin: Enable a user
    • +
    +
    +

    Body parameter

    +
    +
    action: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    userpathstringtruethe user ID
    bodybodyobjecttruenone
    » actionbodystringtruethe action
    +

    Detailed descriptions

    +

    user: the user ID

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string",
    +  "title": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » titlestringfalsenonenone
    + +

    delete_user

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/users/{user} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/users/{user} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users/{user}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/users/{user}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/users/{user}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/users/{user}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/users/{user}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/users/{user}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/users/{user}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/users/{user}

    +

    Delete a user

    +

    Only the admin user (the first user) can call the REST API.

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    userpathstringtruethe ID of the user to delete
    +

    Detailed descriptions

    +

    user: the ID of the user to delete

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    Swimlanes

    +

    get_all_swimlanes

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/swimlanes \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/swimlanes HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/swimlanes',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/swimlanes',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/swimlanes',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/swimlanes', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/swimlanes");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/swimlanes", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/swimlanes', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/swimlanes

    +

    Get the list of swimlanes attached to a board

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe ID of the board
    +

    Detailed descriptions

    +

    board: the ID of the board

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    [
    +  {
    +    "_id": "string",
    +    "title": "string"
    +  }
    +]
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    » titlestringfalsenonenone
    + +

    new_swimlane

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X POST /api/boards/{board}/swimlanes \
    +  -H 'Content-Type: multipart/form-data' \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    POST /api/boards/{board}/swimlanes HTTP/1.1
    +
    +Content-Type: multipart/form-data
    +Accept: application/json
    +
    +
    +
    const inputBody = '{
    +  "title": "string"
    +}';
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/swimlanes',
    +{
    +  method: 'POST',
    +  body: inputBody,
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +const inputBody = {
    +  "title": "string"
    +};
    +const headers = {
    +  'Content-Type':'multipart/form-data',
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/swimlanes',
    +{
    +  method: 'POST',
    +  body: JSON.stringify(inputBody),
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Content-Type' => 'multipart/form-data',
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.post '/api/boards/{board}/swimlanes',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Content-Type': 'multipart/form-data',
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.post('/api/boards/{board}/swimlanes', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/swimlanes");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("POST");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Content-Type": []string{"multipart/form-data"},
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("POST", "/api/boards/{board}/swimlanes", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'multipart/form-data',
    +    'Accept' => 'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('POST','/api/boards/{board}/swimlanes', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    POST /api/boards/{board}/swimlanes

    +

    Add a swimlane to a board

    +
    +

    Body parameter

    +
    +
    title: string
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe ID of the board
    bodybodyobjecttruenone
    » titlebodystringtruethe new title of the swimlane
    +

    Detailed descriptions

    +

    board: the ID of the board

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    get_swimlane

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X GET /api/boards/{board}/swimlanes/{swimlane} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    GET /api/boards/{board}/swimlanes/{swimlane} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/swimlanes/{swimlane}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/swimlanes/{swimlane}',
    +{
    +  method: 'GET',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.get '/api/boards/{board}/swimlanes/{swimlane}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.get('/api/boards/{board}/swimlanes/{swimlane}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/swimlanes/{swimlane}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("GET");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("GET", "/api/boards/{board}/swimlanes/{swimlane}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('GET','/api/boards/{board}/swimlanes/{swimlane}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    GET /api/boards/{board}/swimlanes/{swimlane}

    +

    Get a swimlane

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe ID of the board
    swimlanepathstringtruethe ID of the swimlane
    +

    Detailed descriptions

    +

    board: the ID of the board

    +

    swimlane: the ID of the swimlane

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "title": "string",
    +  "archived": true,
    +  "archivedAt": "string",
    +  "boardId": "string",
    +  "createdAt": "string",
    +  "sort": 0,
    +  "color": "white",
    +  "updatedAt": "string",
    +  "modifiedAt": "string",
    +  "type": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseSwimlanes
    + +

    delete_swimlane

    +

    +
    +

    Code samples

    +
    +
    # You can also use wget
    +curl -X DELETE /api/boards/{board}/swimlanes/{swimlane} \
    +  -H 'Accept: application/json' \
    +  -H 'Authorization: API_KEY'
    +
    +
    +
    DELETE /api/boards/{board}/swimlanes/{swimlane} HTTP/1.1
    +
    +Accept: application/json
    +
    +
    +
    
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/swimlanes/{swimlane}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    const fetch = require('node-fetch');
    +
    +const headers = {
    +  'Accept':'application/json',
    +  'Authorization':'API_KEY'
    +};
    +
    +fetch('/api/boards/{board}/swimlanes/{swimlane}',
    +{
    +  method: 'DELETE',
    +
    +  headers: headers
    +})
    +.then(function(res) {
    +    return res.json();
    +}).then(function(body) {
    +    console.log(body);
    +});
    +
    +
    +
    require 'rest-client'
    +require 'json'
    +
    +headers = {
    +  'Accept' => 'application/json',
    +  'Authorization' => 'API_KEY'
    +}
    +
    +result = RestClient.delete '/api/boards/{board}/swimlanes/{swimlane}',
    +  params: {
    +  }, headers: headers
    +
    +p JSON.parse(result)
    +
    +
    +
    import requests
    +headers = {
    +  'Accept': 'application/json',
    +  'Authorization': 'API_KEY'
    +}
    +
    +r = requests.delete('/api/boards/{board}/swimlanes/{swimlane}', headers = headers)
    +
    +print(r.json())
    +
    +
    +
    URL obj = new URL("/api/boards/{board}/swimlanes/{swimlane}");
    +HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    +con.setRequestMethod("DELETE");
    +int responseCode = con.getResponseCode();
    +BufferedReader in = new BufferedReader(
    +    new InputStreamReader(con.getInputStream()));
    +String inputLine;
    +StringBuffer response = new StringBuffer();
    +while ((inputLine = in.readLine()) != null) {
    +    response.append(inputLine);
    +}
    +in.close();
    +System.out.println(response.toString());
    +
    +
    +
    package main
    +
    +import (
    +       "bytes"
    +       "net/http"
    +)
    +
    +func main() {
    +
    +    headers := map[string][]string{
    +        "Accept": []string{"application/json"},
    +        "Authorization": []string{"API_KEY"},
    +    }
    +
    +    data := bytes.NewBuffer([]byte{jsonReq})
    +    req, err := http.NewRequest("DELETE", "/api/boards/{board}/swimlanes/{swimlane}", data)
    +    req.Header = headers
    +
    +    client := &http.Client{}
    +    resp, err := client.Do(req)
    +    // ...
    +}
    +
    +
    +
     'application/json',
    +    'Authorization' => 'API_KEY',
    +);
    +
    +$client = new \GuzzleHttp\Client();
    +
    +// Define array of request body.
    +$request_body = array();
    +
    +try {
    +    $response = $client->request('DELETE','/api/boards/{board}/swimlanes/{swimlane}', array(
    +        'headers' => $headers,
    +        'json' => $request_body,
    +       )
    +    );
    +    print_r($response->getBody()->getContents());
    + }
    + catch (\GuzzleHttp\Exception\BadResponseException $e) {
    +    // handle exception or api errors.
    +    print_r($e->getMessage());
    + }
    +
    + // ...
    +
    +
    +

    DELETE /api/boards/{board}/swimlanes/{swimlane}

    +

    Delete a swimlane

    +

    The swimlane will be deleted, not moved to the recycle bin

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameInTypeRequiredDescription
    boardpathstringtruethe ID of the board
    swimlanepathstringtruethe ID of the swimlane
    +

    Detailed descriptions

    +

    board: the ID of the board

    +

    swimlane: the ID of the swimlane

    +
    +

    Example responses

    +
    +
    +

    200 Response

    +
    +
    {
    +  "_id": "string"
    +}
    +
    +

    Responses

    + + + + + + + + + + + + + + + + + +
    StatusMeaningDescriptionSchema
    200OK200 responseInline
    +

    Response Schema

    +

    Status Code 200

    + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    » _idstringfalsenonenone
    + +

    Schemas

    +

    Boards

    +

    + + +

    +
    {
    +  "title": "string",
    +  "slug": "string",
    +  "archived": true,
    +  "archivedAt": "string",
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "stars": 0,
    +  "labels": [
    +    {
    +      "_id": "string",
    +      "name": "string",
    +      "color": "green"
    +    }
    +  ],
    +  "members": [
    +    {
    +      "userId": "string",
    +      "isAdmin": true,
    +      "isActive": true,
    +      "isNoComments": true,
    +      "isCommentOnly": true,
    +      "isWorker": true
    +    }
    +  ],
    +  "permission": "public",
    +  "color": "belize",
    +  "description": "string",
    +  "subtasksDefaultBoardId": "string",
    +  "subtasksDefaultListId": "string",
    +  "dateSettingsDefaultBoardId": "string",
    +  "dateSettingsDefaultListId": "string",
    +  "allowsSubtasks": true,
    +  "allowsAttachments": true,
    +  "allowsChecklists": true,
    +  "allowsComments": true,
    +  "allowsDescriptionTitle": true,
    +  "allowsDescriptionText": true,
    +  "allowsActivities": true,
    +  "allowsLabels": true,
    +  "allowsAssignee": true,
    +  "allowsMembers": true,
    +  "allowsRequestedBy": true,
    +  "allowsAssignedBy": true,
    +  "allowsReceivedDate": true,
    +  "allowsStartDate": true,
    +  "allowsEndDate": true,
    +  "allowsDueDate": true,
    +  "presentParentTask": "prefix-with-full-path",
    +  "startAt": "string",
    +  "dueAt": "string",
    +  "endAt": "string",
    +  "spentTime": 0,
    +  "isOvertime": true,
    +  "type": "string",
    +  "sort": 0
    +}
    +
    +
    +

    This is a Board.

    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    titlestringtruenoneThe title of the board
    slugstringtruenoneThe title slugified.
    archivedbooleantruenoneIs the board archived?
    archivedAtstring¦nullfalsenoneLatest archiving time of the board
    createdAtstringtruenoneCreation time of the board
    modifiedAtstring¦nullfalsenoneLast modification time of the board
    starsnumbertruenoneHow many stars the board has
    labels[BoardsLabels]truenoneList of labels attached to a board
    members[BoardsMembers]truenoneList of members of a board
    permissionstringtruenonevisibility of the board
    colorstringtruenoneThe color of the board.
    descriptionstring¦nullfalsenoneThe description of the board
    subtasksDefaultBoardIdstring¦nullfalsenoneThe default board ID assigned to subtasks.
    subtasksDefaultListIdstring¦nullfalsenoneThe default List ID assigned to subtasks.
    dateSettingsDefaultBoardIdstring¦nullfalsenonenone
    dateSettingsDefaultListIdstring¦nullfalsenonenone
    allowsSubtasksbooleantruenoneDoes the board allows subtasks?
    allowsAttachmentsbooleantruenoneDoes the board allows attachments?
    allowsChecklistsbooleantruenoneDoes the board allows checklists?
    allowsCommentsbooleantruenoneDoes the board allows comments?
    allowsDescriptionTitlebooleantruenoneDoes the board allows description title?
    allowsDescriptionTextbooleantruenoneDoes the board allows description text?
    allowsActivitiesbooleantruenoneDoes the board allows comments?
    allowsLabelsbooleantruenoneDoes the board allows labels?
    allowsAssigneebooleantruenoneDoes the board allows assignee?
    allowsMembersbooleantruenoneDoes the board allows members?
    allowsRequestedBybooleantruenoneDoes the board allows requested by?
    allowsAssignedBybooleantruenoneDoes the board allows requested by?
    allowsReceivedDatebooleantruenoneDoes the board allows received date?
    allowsStartDatebooleantruenoneDoes the board allows start date?
    allowsEndDatebooleantruenoneDoes the board allows end date?
    allowsDueDatebooleantruenoneDoes the board allows due date?
    presentParentTaskstring¦nullfalsenoneControls how to present the parent task:

    - prefix-with-full-path: add a prefix with the full path
    - prefix-with-parent: add a prefisx with the parent name
    - subtext-with-full-path: add a subtext with the full path
    - subtext-with-parent: add a subtext with the parent name
    - no-parent: does not show the parent at all
    startAtstring¦nullfalsenoneStarting date of the board.
    dueAtstring¦nullfalsenoneDue date of the board.
    endAtstring¦nullfalsenoneEnd date of the board.
    spentTimenumber¦nullfalsenoneTime spent in the board.
    isOvertimeboolean¦nullfalsenoneIs the board overtimed?
    typestringtruenoneThe type of board
    sortnumbertruenoneSort value
    +

    Enumerated Values

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyValue
    permissionpublic
    permissionprivate
    colorbelize
    colornephritis
    colorpomegranate
    colorpumpkin
    colorwisteria
    colormoderatepink
    colorstrongcyan
    colorlimegreen
    colormidnight
    colordark
    colorrelax
    colorcorteza
    colorclearblue
    colornatural
    colormodern
    colormoderndark
    presentParentTaskprefix-with-full-path
    presentParentTaskprefix-with-parent
    presentParentTasksubtext-with-full-path
    presentParentTasksubtext-with-parent
    presentParentTaskno-parent
    +

    BoardsLabels

    +

    + + +

    +
    {
    +  "_id": "string",
    +  "name": "string",
    +  "color": "green"
    +}
    +
    +
    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    _idstringtruenoneUnique id of a label
    namestringfalsenoneName of a label
    colorstringtruenonecolor of a label.

    Can be amongst green, yellow, orange, red, purple,
    blue, sky, lime, pink, black,
    silver, peachpuff, crimson, plum, darkgreen,
    slateblue, magenta, gold, navy, gray,
    saddlebrown, paleturquoise, mistyrose, indigo
    +

    Enumerated Values

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyValue
    colorgreen
    coloryellow
    colororange
    colorred
    colorpurple
    colorblue
    colorsky
    colorlime
    colorpink
    colorblack
    colorsilver
    colorpeachpuff
    colorcrimson
    colorplum
    colordarkgreen
    colorslateblue
    colormagenta
    colorgold
    colornavy
    colorgray
    colorsaddlebrown
    colorpaleturquoise
    colormistyrose
    colorindigo
    +

    BoardsMembers

    +

    + + +

    +
    {
    +  "userId": "string",
    +  "isAdmin": true,
    +  "isActive": true,
    +  "isNoComments": true,
    +  "isCommentOnly": true,
    +  "isWorker": true
    +}
    +
    +
    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    userIdstringtruenoneThe uniq ID of the member
    isAdminbooleantruenoneIs the member an admin of the board?
    isActivebooleantruenoneIs the member active?
    isNoCommentsbooleanfalsenoneIs the member not allowed to make comments
    isCommentOnlybooleanfalsenoneIs the member only allowed to comment on the board
    isWorkerbooleanfalsenoneIs the member only allowed to move card, assign himself to card and comment
    +

    CardComments

    +

    + + +

    +
    {
    +  "boardId": "string",
    +  "cardId": "string",
    +  "text": "string",
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "userId": "string"
    +}
    +
    +
    +

    A comment on a card

    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    boardIdstringtruenonethe board ID
    cardIdstringtruenonethe card ID
    textstringtruenonethe text of the comment
    createdAtstringtruenonewhen was the comment created
    modifiedAtstringtruenonenone
    userIdstringtruenonethe author ID of the comment
    +

    Cards

    +

    + + +

    +
    {
    +  "title": "string",
    +  "archived": true,
    +  "archivedAt": "string",
    +  "parentId": "string",
    +  "listId": "string",
    +  "swimlaneId": "string",
    +  "boardId": "string",
    +  "coverId": "string",
    +  "color": "white",
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "customFields": [
    +    {}
    +  ],
    +  "dateLastActivity": "string",
    +  "description": "string",
    +  "requestedBy": "string",
    +  "assignedBy": "string",
    +  "labelIds": [
    +    "string"
    +  ],
    +  "members": [
    +    "string"
    +  ],
    +  "assignees": [
    +    "string"
    +  ],
    +  "receivedAt": "string",
    +  "startAt": "string",
    +  "dueAt": "string",
    +  "endAt": "string",
    +  "spentTime": 0,
    +  "isOvertime": true,
    +  "userId": "string",
    +  "sort": 0,
    +  "subtaskSort": 0,
    +  "type": "string",
    +  "linkedId": "string",
    +  "vote": {
    +    "question": "string",
    +    "positive": [
    +      "string"
    +    ],
    +    "negative": [
    +      "string"
    +    ],
    +    "end": "string",
    +    "public": true,
    +    "allowNonBoardMembers": true
    +  }
    +}
    +
    +
    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    titlestring¦nullfalsenonethe title of the card
    archivedbooleantruenoneis the card archived
    archivedAtstring¦nullfalsenonelatest archiving date
    parentIdstring¦nullfalsenoneID of the parent card
    listIdstring¦nullfalsenoneList ID where the card is
    swimlaneIdstringtruenoneSwimlane ID where the card is
    boardIdstring¦nullfalsenoneBoard ID of the card
    coverIdstring¦nullfalsenoneCover ID of the card
    colorstring¦nullfalsenonenone
    createdAtstringtruenonecreation date
    modifiedAtstringtruenonenone
    customFields[CardsCustomfields]¦nullfalsenonelist of custom fields
    dateLastActivitystringtruenoneDate of last activity
    descriptionstring¦nullfalsenonedescription of the card
    requestedBystring¦nullfalsenonewho requested the card (ID of the user)
    assignedBystring¦nullfalsenonewho assigned the card (ID of the user)
    labelIds[string]¦nullfalsenonelist of labels ID the card has
    members[string]¦nullfalsenonelist of members (user IDs)
    assignees[string]¦nullfalsenonewho is assignee of the card (user ID),
    maximum one ID of assignee in array.
    receivedAtstring¦nullfalsenoneDate the card was received
    startAtstring¦nullfalsenoneDate the card was started to be worked on
    dueAtstring¦nullfalsenoneDate the card is due
    endAtstring¦nullfalsenoneDate the card ended
    spentTimenumber¦nullfalsenoneHow much time has been spent on this
    isOvertimeboolean¦nullfalsenoneis the card over time?
    userIdstringtruenoneuser ID of the author of the card
    sortnumbertruenoneSort value
    subtaskSortnumber¦nullfalsenonesubtask sort value
    typestringtruenonetype of the card
    linkedIdstring¦nullfalsenoneID of the linked card
    voteCardsVotefalsenonenone
    +

    Enumerated Values

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyValue
    colorwhite
    colorgreen
    coloryellow
    colororange
    colorred
    colorpurple
    colorblue
    colorsky
    colorlime
    colorpink
    colorblack
    colorsilver
    colorpeachpuff
    colorcrimson
    colorplum
    colordarkgreen
    colorslateblue
    colormagenta
    colorgold
    colornavy
    colorgray
    colorsaddlebrown
    colorpaleturquoise
    colormistyrose
    colorindigo
    +

    CardsVote

    +

    + + +

    +
    {
    +  "question": "string",
    +  "positive": [
    +    "string"
    +  ],
    +  "negative": [
    +    "string"
    +  ],
    +  "end": "string",
    +  "public": true,
    +  "allowNonBoardMembers": true
    +}
    +
    +
    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    questionstringtruenonenone
    positive[string]falsenonelist of members (user IDs)
    negative[string]falsenonelist of members (user IDs)
    endstringfalsenonenone
    publicbooleantruenonenone
    allowNonBoardMembersbooleantruenonenone
    +

    CardsCustomfields

    +

    + + +

    +
    {}
    +
    +
    +

    Properties

    +

    None

    +

    ChecklistItems

    +

    + + +

    +
    {
    +  "title": "string",
    +  "sort": 0,
    +  "isFinished": true,
    +  "checklistId": "string",
    +  "cardId": "string",
    +  "createdAt": "string",
    +  "modifiedAt": "string"
    +}
    +
    +
    +

    An item in a checklist

    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    titlestringtruenonethe text of the item
    sortnumbertruenonethe sorting field of the item
    isFinishedbooleantruenoneIs the item checked?
    checklistIdstringtruenonethe checklist ID the item is attached to
    cardIdstringtruenonethe card ID the item is attached to
    createdAtstring¦nullfalsenonenone
    modifiedAtstringtruenonenone
    +

    Checklists

    +

    + + +

    +
    {
    +  "cardId": "string",
    +  "title": "string",
    +  "finishedAt": "string",
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "sort": 0
    +}
    +
    +
    +

    A Checklist

    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    cardIdstringtruenoneThe ID of the card the checklist is in
    titlestringtruenonethe title of the checklist
    finishedAtstring¦nullfalsenoneWhen was the checklist finished
    createdAtstringtruenoneCreation date of the checklist
    modifiedAtstringtruenonenone
    sortnumbertruenonesorting value of the checklist
    +

    CustomFields

    +

    + + +

    +
    {
    +  "boardIds": [
    +    "string"
    +  ],
    +  "name": "string",
    +  "type": "text",
    +  "settings": {
    +    "currencyCode": "string",
    +    "dropdownItems": [
    +      {}
    +    ]
    +  },
    +  "showOnCard": true,
    +  "automaticallyOnCard": true,
    +  "alwaysOnCard": true,
    +  "showLabelOnMiniCard": true,
    +  "createdAt": "string",
    +  "modifiedAt": "string"
    +}
    +
    +
    +

    A custom field on a card in the board

    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    boardIds[string]truenonethe ID of the board
    namestringtruenonename of the custom field
    typestringtruenonetype of the custom field
    settingsCustomFieldsSettingstruenonenone
    showOnCardbooleantruenoneshould we show on the cards this custom field
    automaticallyOnCardbooleantruenoneshould the custom fields automatically be added on cards?
    alwaysOnCardbooleantruenoneshould the custom field be automatically added to all cards?
    showLabelOnMiniCardbooleantruenoneshould the label of the custom field be shown on minicards?
    createdAtstring¦nullfalsenonenone
    modifiedAtstringtruenonenone
    +

    Enumerated Values

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyValue
    typetext
    typenumber
    typedate
    typedropdown
    typecheckbox
    typecurrency
    +

    CustomFieldsSettings

    +

    + + +

    +
    {
    +  "currencyCode": "string",
    +  "dropdownItems": [
    +    {}
    +  ]
    +}
    +
    +
    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    currencyCodestringfalsenonenone
    dropdownItems[CustomFieldsSettingsDropdownitems]falsenonelist of drop down items objects
    +

    CustomFieldsSettingsDropdownitems

    +

    + + +

    +
    {}
    +
    +
    +

    Properties

    +

    None

    +

    Integrations

    +

    + + +

    +
    {
    +  "enabled": true,
    +  "title": "string",
    +  "type": "string",
    +  "activities": [
    +    "string"
    +  ],
    +  "url": "string",
    +  "token": "string",
    +  "boardId": "string",
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "userId": "string"
    +}
    +
    +
    +

    Integration with third-party applications

    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    enabledbooleantruenoneis the integration enabled?
    titlestring¦nullfalsenonename of the integration
    typestringtruenonetype of the integratation (Default to 'outgoing-webhooks')
    activities[string]truenoneactivities the integration gets triggered (list)
    urlstringtruenonenone
    tokenstring¦nullfalsenonetoken of the integration
    boardIdstringtruenoneBoard ID of the integration
    createdAtstringtruenoneCreation date of the integration
    modifiedAtstringtruenonenone
    userIdstringtruenoneuser ID who created the interation
    +

    Lists

    +

    + + +

    +
    {
    +  "title": "string",
    +  "starred": true,
    +  "archived": true,
    +  "archivedAt": "string",
    +  "boardId": "string",
    +  "swimlaneId": "string",
    +  "createdAt": "string",
    +  "sort": 0,
    +  "updatedAt": "string",
    +  "modifiedAt": "string",
    +  "wipLimit": {
    +    "value": 0,
    +    "enabled": true,
    +    "soft": true
    +  },
    +  "color": "white",
    +  "type": "string"
    +}
    +
    +
    +

    A list (column) in the Wekan board.

    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    titlestringtruenonethe title of the list
    starredboolean¦nullfalsenoneif a list is stared
    then we put it on the top
    archivedbooleantruenoneis the list archived
    archivedAtstring¦nullfalsenonelatest archiving date
    boardIdstringtruenonethe board associated to this list
    swimlaneIdstringtruenonethe swimlane associated to this list. Used for templates
    createdAtstringtruenonecreation date
    sortnumber¦nullfalsenoneis the list sorted
    updatedAtstring¦nullfalsenonelast update of the list
    modifiedAtstringtruenonenone
    wipLimitListsWiplimitfalsenonenone
    colorstring¦nullfalsenonethe color of the list
    typestringtruenoneThe type of list
    +

    Enumerated Values

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyValue
    colorwhite
    colorgreen
    coloryellow
    colororange
    colorred
    colorpurple
    colorblue
    colorsky
    colorlime
    colorpink
    colorblack
    colorpeachpuff
    colorcrimson
    colorplum
    colordarkgreen
    colorslateblue
    colormagenta
    colorgold
    colornavy
    colorgray
    colorsaddlebrown
    colorpaleturquoise
    colormistyrose
    colorindigo
    +

    ListsWiplimit

    +

    + + +

    +
    {
    +  "value": 0,
    +  "enabled": true,
    +  "soft": true
    +}
    +
    +
    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    valuenumbertruenonevalue of the WIP
    enabledbooleantruenoneis the WIP enabled
    softbooleantruenoneis the WIP a soft or hard requirement
    +

    Swimlanes

    +

    + + +

    +
    {
    +  "title": "string",
    +  "archived": true,
    +  "archivedAt": "string",
    +  "boardId": "string",
    +  "createdAt": "string",
    +  "sort": 0,
    +  "color": "white",
    +  "updatedAt": "string",
    +  "modifiedAt": "string",
    +  "type": "string"
    +}
    +
    +
    +

    A swimlane is an line in the kaban board.

    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    titlestringtruenonethe title of the swimlane
    archivedbooleantruenoneis the swimlane archived?
    archivedAtstring¦nullfalsenonelatest archiving date of the swimlane
    boardIdstringtruenonethe ID of the board the swimlane is attached to
    createdAtstringtruenonecreation date of the swimlane
    sortnumber¦nullfalsenonethe sort value of the swimlane
    colorstring¦nullfalsenonethe color of the swimlane
    updatedAtstring¦nullfalsenonewhen was the swimlane last edited
    modifiedAtstringtruenonenone
    typestringtruenoneThe type of swimlane
    +

    Enumerated Values

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyValue
    colorwhite
    colorgreen
    coloryellow
    colororange
    colorred
    colorpurple
    colorblue
    colorsky
    colorlime
    colorpink
    colorblack
    colorpeachpuff
    colorcrimson
    colorplum
    colordarkgreen
    colorslateblue
    colormagenta
    colorgold
    colornavy
    colorgray
    colorsaddlebrown
    colorpaleturquoise
    colormistyrose
    colorindigo
    +

    Users

    +

    + + +

    +
    {
    +  "username": "string",
    +  "emails": [
    +    {
    +      "address": "string",
    +      "verified": true
    +    }
    +  ],
    +  "createdAt": "string",
    +  "modifiedAt": "string",
    +  "profile": {
    +    "avatarUrl": "string",
    +    "emailBuffer": [
    +      "string"
    +    ],
    +    "fullname": "string",
    +    "showDesktopDragHandles": true,
    +    "hideCheckedItems": true,
    +    "hiddenSystemMessages": true,
    +    "hiddenMinicardLabelText": true,
    +    "initials": "string",
    +    "invitedBoards": [
    +      "string"
    +    ],
    +    "language": "string",
    +    "notifications": [],
    +    "activity": "string",
    +    "read": "string",
    +    "showCardsCountAt": 0,
    +    "startDayOfWeek": 0,
    +    "starredBoards": [
    +      "string"
    +    ],
    +    "icode": "string",
    +    "boardView": "board-view-swimlanes",
    +    "listSortBy": "-modifiedat",
    +    "templatesBoardId": "string",
    +    "cardTemplatesSwimlaneId": "string",
    +    "listTemplatesSwimlaneId": "string",
    +    "boardTemplatesSwimlaneId": "string"
    +  },
    +  "services": {},
    +  "heartbeat": "string",
    +  "isAdmin": true,
    +  "createdThroughApi": true,
    +  "loginDisabled": true,
    +  "authenticationMethod": "string",
    +  "sessionData": {
    +    "totalHits": 0,
    +    "lastHit": 0
    +  },
    +  "importUsernames": [
    +    "string"
    +  ]
    +}
    +
    +
    +

    A User in wekan

    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    usernamestring¦nullfalsenonethe username of the user
    emails[UsersEmails]¦nullfalsenonethe list of emails attached to a user
    createdAtstringtruenonecreation date of the user
    modifiedAtstringtruenonenone
    profileUsersProfilefalsenonenone
    servicesobject¦nullfalsenoneservices field of the user
    heartbeatstring¦nullfalsenonelast time the user has been seen
    isAdminboolean¦nullfalsenoneis the user an admin of the board?
    createdThroughApiboolean¦nullfalsenonewas the user created through the API?
    loginDisabledboolean¦nullfalsenoneloginDisabled field of the user
    authenticationMethodstringtruenoneauthentication method of the user
    sessionDataUsersSessiondatafalsenonenone
    importUsernames[string]¦nullfalsenoneusername for imported
    +

    UsersEmails

    +

    + + +

    +
    {
    +  "address": "string",
    +  "verified": true
    +}
    +
    +
    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    addressstringtruenoneThe email address
    verifiedbooleantruenoneHas the email been verified
    +

    UsersProfile

    +

    + + +

    +
    {
    +  "avatarUrl": "string",
    +  "emailBuffer": [
    +    "string"
    +  ],
    +  "fullname": "string",
    +  "showDesktopDragHandles": true,
    +  "hideCheckedItems": true,
    +  "hiddenSystemMessages": true,
    +  "hiddenMinicardLabelText": true,
    +  "initials": "string",
    +  "invitedBoards": [
    +    "string"
    +  ],
    +  "language": "string",
    +  "notifications": [],
    +  "activity": "string",
    +  "read": "string",
    +  "showCardsCountAt": 0,
    +  "startDayOfWeek": 0,
    +  "starredBoards": [
    +    "string"
    +  ],
    +  "icode": "string",
    +  "boardView": "board-view-swimlanes",
    +  "listSortBy": "-modifiedat",
    +  "templatesBoardId": "string",
    +  "cardTemplatesSwimlaneId": "string",
    +  "listTemplatesSwimlaneId": "string",
    +  "boardTemplatesSwimlaneId": "string"
    +}
    +
    +
    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    avatarUrlstringfalsenoneURL of the avatar of the user
    emailBuffer[string]falsenonelist of email buffers of the user
    fullnamestringfalsenonefull name of the user
    showDesktopDragHandlesbooleanfalsenonedoes the user want to hide system messages?
    hideCheckedItemsbooleanfalsenonedoes the user want to hide checked checklist items?
    hiddenSystemMessagesbooleanfalsenonedoes the user want to hide system messages?
    hiddenMinicardLabelTextbooleanfalsenonedoes the user want to hide minicard label texts?
    initialsstringfalsenoneinitials of the user
    invitedBoards[string]falsenoneboard IDs the user has been invited to
    languagestringfalsenonelanguage of the user
    notifications[UsersProfileNotifications]falsenoneenabled notifications for the user
    activitystringtruenoneThe id of the activity this notification references
    readstringfalsenonethe date on which this notification was read
    showCardsCountAtnumberfalsenoneshowCardCountAt field of the user
    startDayOfWeeknumberfalsenonestartDayOfWeek field of the user
    starredBoards[string]falsenonelist of starred board IDs
    icodestringfalsenoneicode
    boardViewstringfalsenoneboardView field of the user
    listSortBystringfalsenonedefault sort list for user
    templatesBoardIdstringtruenoneReference to the templates board
    cardTemplatesSwimlaneIdstringtruenoneReference to the card templates swimlane Id
    listTemplatesSwimlaneIdstringtruenoneReference to the list templates swimlane Id
    boardTemplatesSwimlaneIdstringtruenoneReference to the board templates swimlane Id
    +

    Enumerated Values

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyValue
    boardViewboard-view-swimlanes
    boardViewboard-view-lists
    boardViewboard-view-cal
    listSortBy-modifiedat
    listSortBymodifiedat
    listSortBy-title
    listSortBytitle
    listSortBy-sort
    listSortBysort
    +

    UsersSessiondata

    +

    + + +

    +
    {
    +  "totalHits": 0,
    +  "lastHit": 0
    +}
    +
    +
    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    totalHitsnumberfalsenoneTotal hits from last search
    lastHitnumberfalsenonelast hit that was returned
    + + + + + + + + + + + + + + + + + + + +
    diff --git a/public/api/wekan.yml b/public/api/wekan.yml index daaf75ef0..934069184 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v5.05 + version: v5.14 description: | The REST API allows you to control and extend Wekan with ease. @@ -134,4 +134,3680 @@ paths: description: | Error in registration + /api/boards: + get: + operationId: get_public_boards + summary: Get all public boards + tags: + - Boards + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + title: + type: string + post: + operationId: new_board + summary: Create a board + description: | + This allows to create a board. + + The color has to be chosen between `belize`, `nephritis`, `pomegranate`, + `pumpkin`, `wisteria`, `moderatepink`, `strongcyan`, + `limegreen`, `midnight`, `dark`, `relax`, `corteza`: + + Wekan logo + tags: + - Boards + consumes: + - multipart/form-data + - application/json + parameters: + - name: title + in: formData + description: | + the new title of the board + type: string + required: true + - name: owner + in: formData + description: | + "ABCDE12345" <= User ID in Wekan. + (Not username or email) + type: string + required: true + - name: isAdmin + in: formData + description: | + is the owner an admin of the board (default true) + type: boolean + required: false + - name: isActive + in: formData + description: | + is the board active (default true) + type: boolean + required: false + - name: isNoComments + in: formData + description: | + disable comments (default false) + type: boolean + required: false + - name: isCommentOnly + in: formData + description: | + only enable comments (default false) + type: boolean + required: false + - name: isWorker + in: formData + description: | + only move cards, assign himself to card and comment (default false) + type: boolean + required: false + - name: permission + in: formData + description: | + "private" board <== Set to "public" if you + want public Wekan board + type: string + required: false + - name: color + in: formData + description: | + the color of the board + type: string + required: false + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + defaultSwimlaneId: + type: string + /api/boards/{board}: + get: + operationId: get_board + summary: Get the board with that particular ID + tags: + - Boards + parameters: + - name: board + in: path + description: | + the ID of the board to retrieve the data + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + $ref: "#/definitions/Boards" + delete: + operationId: delete_board + summary: Delete a board + tags: + - Boards + parameters: + - name: board + in: path + description: | + the ID of the board + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + /api/boards/{board}/attachments: + get: + operationId: get_board_attachments + summary: Get the list of attachments of a board + tags: + - Boards + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + attachmentId: + type: string + attachmentName: + type: string + attachmentType: + type: string + cardId: + type: string + listId: + type: string + swimlaneId: + type: string + /api/boards/{board}/attachments/{attachment}/export: + get: + operationId: exportJson + summary: This route is used to export a attachement to a json file format. + description: | + If user is already logged-in, pass loginToken as param + "authToken": '/api/boards/:boardId/attachments/:attachmentId/export?authToken=:token' + tags: + - Boards + parameters: + - name: board + in: path + description: | + the ID of the board we are exporting + type: string + required: true + - name: attachment + in: path + description: | + the ID of the attachment we are exporting + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + /api/boards/{board}/cards/{card}/checklists: + get: + operationId: get_all_checklists + summary: Get the list of checklists attached to a card + tags: + - Checklists + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: card + in: path + description: | + the card ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + title: + type: string + post: + operationId: new_checklist + summary: create a new checklist + tags: + - Checklists + consumes: + - multipart/form-data + - application/json + parameters: + - name: title + in: formData + description: | + the title of the new checklist + type: string + required: true + - name: items + in: formData + description: | + the list of items on the new checklist + type: string + required: false + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: card + in: path + description: | + the card ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/cards/{card}/checklists/{checklist}: + get: + operationId: get_checklist + summary: Get a checklist + tags: + - Checklists + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: card + in: path + description: | + the card ID + type: string + required: true + - name: checklist + in: path + description: | + the ID of the checklist + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + cardId: + type: string + title: + type: string + finishedAt: + type: string + createdAt: + type: string + sort: + type: number + items: + type: array + items: + type: object + properties: + _id: + type: string + title: + type: string + isFinished: + type: boolean + delete: + operationId: delete_checklist + summary: Delete a checklist + description: | + The checklist will be removed, not put in the recycle bin. + tags: + - Checklists + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: card + in: path + description: | + the card ID + type: string + required: true + - name: checklist + in: path + description: | + the ID of the checklist to remove + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/cards/{card}/checklists/{checklist}/items/{item}: + get: + operationId: get_checklist_item + summary: Get a checklist item + tags: + - ChecklistItems + - Checklists + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: card + in: path + description: | + the card ID + type: string + required: true + - name: checklist + in: path + description: | + the checklist ID + type: string + required: true + - name: item + in: path + description: | + the ID of the item + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + $ref: "#/definitions/ChecklistItems" + put: + operationId: edit_checklist_item + summary: Edit a checklist item + tags: + - ChecklistItems + - Checklists + consumes: + - multipart/form-data + - application/json + parameters: + - name: isFinished + in: formData + description: | + is the item checked? + type: string + required: false + - name: title + in: formData + description: | + the new text of the item + type: string + required: false + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: card + in: path + description: | + the card ID + type: string + required: true + - name: checklist + in: path + description: | + the checklist ID + type: string + required: true + - name: item + in: path + description: | + the ID of the item + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + delete: + operationId: delete_checklist_item + summary: Delete a checklist item + description: | + Note: this operation can't be reverted. + tags: + - ChecklistItems + - Checklists + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: card + in: path + description: | + the card ID + type: string + required: true + - name: checklist + in: path + description: | + the checklist ID + type: string + required: true + - name: item + in: path + description: | + the ID of the item to be removed + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/cards/{card}/comments: + get: + operationId: get_all_comments + summary: Get all comments attached to a card + tags: + - CardComments + parameters: + - name: board + in: path + description: | + the board ID of the card + type: string + required: true + - name: card + in: path + description: | + the ID of the card + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + comment: + type: string + authorId: + type: string + post: + operationId: new_comment + summary: Add a comment on a card + tags: + - CardComments + consumes: + - multipart/form-data + - application/json + parameters: + - name: authorId + in: formData + description: | + the user who 'posted' the comment + type: string + required: true + - name: comment + in: formData + description: the comment value + type: string + required: true + - name: board + in: path + description: | + the board ID of the card + type: string + required: true + - name: card + in: path + description: | + the ID of the card + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/cards/{card}/comments/{comment}: + get: + operationId: get_comment + summary: Get a comment on a card + tags: + - CardComments + parameters: + - name: board + in: path + description: | + the board ID of the card + type: string + required: true + - name: card + in: path + description: | + the ID of the card + type: string + required: true + - name: comment + in: path + description: | + the ID of the comment to retrieve + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + $ref: "#/definitions/CardComments" + delete: + operationId: delete_comment + summary: Delete a comment on a card + tags: + - CardComments + parameters: + - name: board + in: path + description: | + the board ID of the card + type: string + required: true + - name: card + in: path + description: | + the ID of the card + type: string + required: true + - name: comment + in: path + description: | + the ID of the comment to delete + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/cardsByCustomField/{customField}/{customFieldValue}: + get: + operationId: get_cards_by_custom_field + summary: Get all Cards that matchs a value of a specific custom field + tags: + - Cards + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: customField + in: path + description: | + the list ID + type: string + required: true + - name: customFieldValue + in: path + description: | + the value to look for + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + title: + type: string + description: + type: string + listId: + type: string + swinlaneId: + type: string + /api/boards/{board}/custom-fields: + get: + operationId: get_all_custom_fields + summary: Get the list of Custom Fields attached to a board + tags: + - CustomFields + parameters: + - name: board + in: path + description: the board value + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + name: + type: string + type: + type: string + post: + operationId: new_custom_field + summary: Create a Custom Field + tags: + - CustomFields + consumes: + - multipart/form-data + - application/json + parameters: + - name: name + in: formData + description: | + the name of the custom field + type: string + required: true + - name: type + in: formData + description: | + the type of the custom field + type: string + required: true + - name: settings + in: formData + description: | + the settings object of the custom field + type: string + required: true + - name: showOnCard + in: formData + description: | + should we show the custom field on cards? + type: boolean + required: true + - name: automaticallyOnCard + in: formData + description: | + should the custom fields automatically be added on cards? + type: boolean + required: true + - name: showLabelOnMiniCard + in: formData + description: | + should the label of the custom field be shown on minicards? + type: boolean + required: true + - name: authorId + in: formData + description: the authorId value + type: string + required: true + - name: board + in: path + description: the board value + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/custom-fields/{customField}: + get: + operationId: get_custom_field + summary: Get a Custom Fields attached to a board + tags: + - CustomFields + parameters: + - name: board + in: path + description: the board value + type: string + required: true + - name: customField + in: path + description: | + the ID of the custom field + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + boardIds: + type: string + put: + operationId: edit_custom_field + summary: Update a Custom Field + tags: + - CustomFields + consumes: + - multipart/form-data + - application/json + parameters: + - name: name + in: formData + description: | + the name of the custom field + type: string + required: true + - name: type + in: formData + description: | + the type of the custom field + type: string + required: true + - name: settings + in: formData + description: | + the settings object of the custom field + type: string + required: true + - name: showOnCard + in: formData + description: | + should we show the custom field on cards + type: boolean + required: true + - name: automaticallyOnCard + in: formData + description: | + should the custom fields automatically be added on cards + type: boolean + required: true + - name: alwaysOnCard + in: formData + description: the alwaysOnCard value + type: string + required: true + - name: showLabelOnMiniCard + in: formData + description: | + should the label of the custom field be shown on minicards + type: boolean + required: true + - name: board + in: path + description: the board value + type: string + required: true + - name: customField + in: path + description: the customField value + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + delete: + operationId: delete_custom_field + summary: Delete a Custom Fields attached to a board + description: | + The Custom Field can't be retrieved after this operation + tags: + - CustomFields + parameters: + - name: board + in: path + description: the board value + type: string + required: true + - name: customField + in: path + description: | + the ID of the custom field + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/custom-fields/{customField}/dropdown-items: + post: + operationId: add_custom_field_dropdown_items + summary: Update a Custom Field's dropdown items + tags: + - CustomFields + consumes: + - multipart/form-data + - application/json + parameters: + - name: items + in: formData + description: | + names of the custom field + type: string + required: false + - name: board + in: path + description: the board value + type: string + required: true + - name: customField + in: path + description: the customField value + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/custom-fields/{customField}/dropdown-items/{dropdownItem}: + put: + operationId: edit_custom_field_dropdown_item + summary: Update a Custom Field's dropdown item + tags: + - CustomFields + consumes: + - multipart/form-data + - application/json + parameters: + - name: name + in: formData + description: | + names of the custom field + type: string + required: true + - name: board + in: path + description: the board value + type: string + required: true + - name: customField + in: path + description: the customField value + type: string + required: true + - name: dropdownItem + in: path + description: the dropdownItem value + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + delete: + operationId: delete_custom_field_dropdown_item + summary: Update a Custom Field's dropdown items + tags: + - CustomFields + parameters: + - name: board + in: path + description: the board value + type: string + required: true + - name: customField + in: path + description: the customField value + type: string + required: true + - name: dropdownItem + in: path + description: the dropdownItem value + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/export: + get: + operationId: exportJson + summary: This route is used to export the board to a json file format. + description: | + If user is already logged-in, pass loginToken as param + "authToken": '/api/boards/:boardId/export?authToken=:token' + + See https://blog.kayla.com.au/server-side-route-authentication-in-meteor/ + for detailed explanations + tags: + - Boards + parameters: + - name: board + in: path + description: | + the ID of the board we are exporting + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + /api/boards/{board}/integrations: + get: + operationId: get_all_integrations + summary: Get all integrations in board + tags: + - Integrations + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + $ref: "#/definitions/Integrations" + post: + operationId: new_integration + summary: Create a new integration + tags: + - Integrations + consumes: + - multipart/form-data + - application/json + parameters: + - name: url + in: formData + description: | + the URL of the integration + type: string + required: true + - name: board + in: path + description: | + the board ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/integrations/{int}: + get: + operationId: get_integration + summary: Get a single integration in board + tags: + - Integrations + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: int + in: path + description: | + the integration ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + $ref: "#/definitions/Integrations" + put: + operationId: edit_integration + summary: Edit integration data + tags: + - Integrations + consumes: + - multipart/form-data + - application/json + parameters: + - name: enabled + in: formData + description: | + is the integration enabled? + type: string + required: false + - name: title + in: formData + description: | + new name of the integration + type: string + required: false + - name: url + in: formData + description: | + new URL of the integration + type: string + required: false + - name: token + in: formData + description: | + new token of the integration + type: string + required: false + - name: activities + in: formData + description: | + new list of activities of the integration + type: string + required: false + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: int + in: path + description: | + the integration ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + delete: + operationId: delete_integration + summary: Delete integration + tags: + - Integrations + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: int + in: path + description: | + the integration ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/integrations/{int}/activities: + delete: + operationId: delete_integration_activities + summary: Delete subscribed activities + tags: + - Integrations + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: int + in: path + description: | + the integration ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + $ref: "#/definitions/Integrations" + post: + operationId: new_integration_activities + summary: Add subscribed activities + tags: + - Integrations + consumes: + - multipart/form-data + - application/json + parameters: + - name: activities + in: formData + description: the activities value + type: string + required: true + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: int + in: path + description: | + the integration ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + $ref: "#/definitions/Integrations" + /api/boards/{board}/labels: + put: + operationId: add_board_label + summary: Add a label to a board + description: | + If the board doesn't have the name/color label, this function + adds the label to the board. + tags: + - Boards + consumes: + - multipart/form-data + - application/json + parameters: + - name: label + in: formData + description: the label value + type: string + required: true + - name: board + in: path + description: | + the board + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: string + /api/boards/{board}/lists: + get: + operationId: get_all_lists + summary: Get the list of Lists attached to a board + tags: + - Lists + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + title: + type: string + post: + operationId: new_list + summary: Add a List to a board + tags: + - Lists + consumes: + - multipart/form-data + - application/json + parameters: + - name: title + in: formData + description: | + the title of the List + type: string + required: true + - name: board + in: path + description: | + the board ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/lists/{list}: + get: + operationId: get_list + summary: Get a List attached to a board + tags: + - Lists + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: list + in: path + description: | + the List ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + $ref: "#/definitions/Lists" + delete: + operationId: delete_list + summary: Delete a List + description: | + This **deletes** a list from a board. + The list is not put in the recycle bin. + tags: + - Lists + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: list + in: path + description: | + the ID of the list to remove + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/lists/{list}/cards: + get: + operationId: get_all_cards + summary: Get all Cards attached to a List + tags: + - Cards + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: list + in: path + description: | + the list ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + title: + type: string + description: + type: string + post: + operationId: new_card + summary: Create a new Card + tags: + - Cards + consumes: + - multipart/form-data + - application/json + parameters: + - name: authorId + in: formData + description: the authorId value + type: string + required: true + - name: members + in: formData + description: | + the member IDs list of the new card + type: string + required: false + - name: assignees + in: formData + description: | + the array of maximum one ID of assignee of the new card + type: string + required: false + - name: title + in: formData + description: | + the title of the new card + type: string + required: true + - name: description + in: formData + description: | + the description of the new card + type: string + required: true + - name: swimlaneId + in: formData + description: | + the swimlane ID of the new card + type: string + required: true + - name: board + in: path + description: | + the board ID of the new card + type: string + required: true + - name: list + in: path + description: | + the list ID of the new card + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/lists/{list}/cards/{card}: + get: + operationId: get_card + summary: Get a Card + tags: + - Cards + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: list + in: path + description: | + the list ID of the card + type: string + required: true + - name: card + in: path + description: | + the card ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + $ref: "#/definitions/Cards" + put: + operationId: edit_card + summary: Edit Fields in a Card + description: | + Edit a card + + The color has to be chosen between `white`, `green`, `yellow`, `orange`, + `red`, `purple`, `blue`, `sky`, `lime`, `pink`, `black`, `silver`, + `peachpuff`, `crimson`, `plum`, `darkgreen`, `slateblue`, `magenta`, + `gold`, `navy`, `gray`, `saddlebrown`, `paleturquoise`, `mistyrose`, + `indigo`: + + Wekan card colors + + Note: setting the color to white has the same effect than removing it. + tags: + - Cards + consumes: + - multipart/form-data + - application/json + parameters: + - name: title + in: formData + description: | + the new title of the card + type: string + required: false + - name: sort + in: formData + description: | + the new sort value of the card + type: string + required: false + - name: parentId + in: formData + description: | + change the parent of the card + type: string + required: false + - name: description + in: formData + description: | + the new description of the card + type: string + required: false + - name: color + in: formData + description: | + the new color of the card + type: string + required: false + - name: vote + in: formData + description: | + the vote object + type: object + required: false + - name: labelIds + in: formData + description: | + the new list of label IDs attached to the card + type: string + required: false + - name: requestedBy + in: formData + description: | + the new requestedBy field of the card + type: string + required: false + - name: assignedBy + in: formData + description: | + the new assignedBy field of the card + type: string + required: false + - name: receivedAt + in: formData + description: | + the new receivedAt field of the card + type: string + required: false + - name: startAt + in: formData + description: | + the new startAt field of the card + type: string + required: false + - name: dueAt + in: formData + description: | + the new dueAt field of the card + type: string + required: false + - name: endAt + in: formData + description: | + the new endAt field of the card + type: string + required: false + - name: spentTime + in: formData + description: | + the new spentTime field of the card + type: string + required: false + - name: isOverTime + in: formData + description: | + the new isOverTime field of the card + type: boolean + required: false + - name: customFields + in: formData + description: | + the new customFields value of the card + type: string + required: false + - name: members + in: formData + description: | + the new list of member IDs attached to the card + type: string + required: false + - name: assignees + in: formData + description: | + the array of maximum one ID of assignee attached to the card + type: string + required: false + - name: swimlaneId + in: formData + description: | + the new swimlane ID of the card + type: string + required: false + - name: listId + in: formData + description: | + the new list ID of the card (move operation) + type: string + required: false + - name: authorId + in: formData + description: | + change the owner of the card + type: string + required: false + - name: board + in: path + description: | + the board ID of the card + type: string + required: true + - name: list + in: path + description: | + the list ID of the card + type: string + required: true + - name: card + in: path + description: | + the ID of the card + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + delete: + operationId: delete_card + summary: Delete a card from a board + description: | + This operation **deletes** a card, and therefore the card + is not put in the recycle bin. + tags: + - Cards + parameters: + - name: board + in: path + description: | + the board ID of the card + type: string + required: true + - name: list + in: path + description: | + the list ID of the card + type: string + required: true + - name: card + in: path + description: | + the ID of the card + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/members/{member}: + post: + operationId: set_board_member_permission + summary: Change the permission of a member of a board + tags: + - Boards + - Users + consumes: + - multipart/form-data + - application/json + parameters: + - name: isAdmin + in: formData + description: | + admin capability + type: boolean + required: true + - name: isNoComments + in: formData + description: | + NoComments capability + type: boolean + required: true + - name: isCommentOnly + in: formData + description: | + CommentsOnly capability + type: boolean + required: true + - name: isWorker + in: formData + description: | + Worker capability + type: boolean + required: true + - name: board + in: path + description: | + the ID of the board that we are changing + type: string + required: true + - name: member + in: path + description: | + the ID of the user to change permissions + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + /api/boards/{board}/members/{user}/add: + post: + operationId: add_board_member + summary: Add New Board Member with Role + description: | + Only the admin user (the first user) can call the REST API. + + **Note**: see [Boards.set_board_member_permission](#set_board_member_permission) + to later change the permissions. + tags: + - Users + - Boards + consumes: + - multipart/form-data + - application/json + parameters: + - name: action + in: formData + description: the action value + type: string + required: true + - name: isAdmin + in: formData + description: | + is the user an admin of the board + type: boolean + required: true + - name: isNoComments + in: formData + description: | + disable comments + type: boolean + required: true + - name: isCommentOnly + in: formData + description: | + only enable comments + type: boolean + required: true + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: user + in: path + description: | + the user ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + title: + type: string + /api/boards/{board}/members/{user}/remove: + post: + operationId: remove_board_member + summary: Remove Member from Board + description: | + Only the admin user (the first user) can call the REST API. + tags: + - Users + - Boards + consumes: + - multipart/form-data + - application/json + parameters: + - name: action + in: formData + description: | + the action (needs to be `remove`) + type: string + required: true + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: user + in: path + description: | + the user ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + title: + type: string + /api/boards/{board}/swimlanes: + get: + operationId: get_all_swimlanes + summary: Get the list of swimlanes attached to a board + tags: + - Swimlanes + parameters: + - name: board + in: path + description: | + the ID of the board + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + title: + type: string + post: + operationId: new_swimlane + summary: Add a swimlane to a board + tags: + - Swimlanes + consumes: + - multipart/form-data + - application/json + parameters: + - name: title + in: formData + description: | + the new title of the swimlane + type: string + required: true + - name: board + in: path + description: | + the ID of the board + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/swimlanes/{swimlane}: + get: + operationId: get_swimlane + summary: Get a swimlane + tags: + - Swimlanes + parameters: + - name: board + in: path + description: | + the ID of the board + type: string + required: true + - name: swimlane + in: path + description: | + the ID of the swimlane + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + $ref: "#/definitions/Swimlanes" + delete: + operationId: delete_swimlane + summary: Delete a swimlane + description: | + The swimlane will be deleted, not moved to the recycle bin + tags: + - Swimlanes + parameters: + - name: board + in: path + description: | + the ID of the board + type: string + required: true + - name: swimlane + in: path + description: | + the ID of the swimlane + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/boards/{board}/swimlanes/{swimlane}/cards: + get: + operationId: get_swimlane_cards + summary: get all cards attached to a swimlane + tags: + - Cards + parameters: + - name: board + in: path + description: | + the board ID + type: string + required: true + - name: swimlane + in: path + description: | + the swimlane ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + title: + type: string + description: + type: string + listId: + type: string + /api/boards_count: + get: + operationId: get_boards_count + summary: Get public and private boards count + tags: + - Boards + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + private: + type: integer + public: + type: integer + /api/createtoken/{user}: + post: + operationId: create_user_token + summary: Create a user token + description: | + Only the admin user (the first user) can call the REST API. + tags: + - Users + consumes: + - multipart/form-data + - application/json + parameters: + - name: user + in: path + description: | + the ID of the user to create token for. + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/user: + get: + operationId: get_current_user + summary: returns the current user + tags: + - Users + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + $ref: "#/definitions/Users" + /api/users: + get: + operationId: get_all_users + summary: return all the users + description: | + Only the admin user (the first user) can call the REST API. + tags: + - Users + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + username: + type: string + post: + operationId: new_user + summary: Create a new user + description: | + Only the admin user (the first user) can call the REST API. + tags: + - Users + consumes: + - multipart/form-data + - application/json + parameters: + - name: username + in: formData + description: | + the new username + type: string + required: true + - name: email + in: formData + description: | + the email of the new user + type: string + required: true + - name: password + in: formData + description: | + the password of the new user + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/users/{user}: + get: + operationId: get_user + summary: get a given user + description: | + Only the admin user (the first user) can call the REST API. + tags: + - Users + parameters: + - name: user + in: path + description: | + the user ID or username + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + $ref: "#/definitions/Users" + put: + operationId: edit_user + summary: edit a given user + description: | + Only the admin user (the first user) can call the REST API. + + Possible values for *action*: + - `takeOwnership`: The admin takes the ownership of ALL boards of the user (archived and not archived) where the user is admin on. + - `disableLogin`: Disable a user (the user is not allowed to login and his login tokens are purged) + - `enableLogin`: Enable a user + tags: + - Users + consumes: + - multipart/form-data + - application/json + parameters: + - name: action + in: formData + description: | + the action + type: string + required: true + - name: user + in: path + description: | + the user ID + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + title: + type: string + delete: + operationId: delete_user + summary: Delete a user + description: | + Only the admin user (the first user) can call the REST API. + tags: + - Users + parameters: + - name: user + in: path + description: | + the ID of the user to delete + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: object + properties: + _id: + type: string + /api/users/{user}/boards: + get: + operationId: get_boards_from_user + summary: Get all boards attached to a user + tags: + - Boards + parameters: + - name: user + in: path + description: | + the ID of the user to retrieve the data + type: string + required: true + produces: + - application/json + security: + - UserSecurity: [] + responses: + '200': + description: |- + 200 response + schema: + type: array + items: + type: object + properties: + _id: + type: string + title: + type: string definitions: + Boards: + type: object + description: This is a Board. + properties: + title: + description: | + The title of the board + type: string + slug: + description: | + The title slugified. + type: string + archived: + description: | + Is the board archived? + type: boolean + archivedAt: + description: | + Latest archiving time of the board + type: string + x-nullable: true + createdAt: + description: | + Creation time of the board + type: string + modifiedAt: + description: | + Last modification time of the board + type: string + x-nullable: true + stars: + description: | + How many stars the board has + type: number + labels: + description: | + List of labels attached to a board + type: array + items: + $ref: "#/definitions/BoardsLabels" + members: + description: | + List of members of a board + type: array + items: + $ref: "#/definitions/BoardsMembers" + permission: + description: | + visibility of the board + type: string + enum: + - public + - private + color: + description: | + The color of the board. + type: string + enum: + - belize + - nephritis + - pomegranate + - pumpkin + - wisteria + - moderatepink + - strongcyan + - limegreen + - midnight + - dark + - relax + - corteza + - clearblue + - natural + - modern + - moderndark + description: + description: | + The description of the board + type: string + x-nullable: true + subtasksDefaultBoardId: + description: | + The default board ID assigned to subtasks. + type: string + x-nullable: true + subtasksDefaultListId: + description: | + The default List ID assigned to subtasks. + type: string + x-nullable: true + dateSettingsDefaultBoardId: + type: string + x-nullable: true + dateSettingsDefaultListId: + type: string + x-nullable: true + allowsSubtasks: + description: | + Does the board allows subtasks? + type: boolean + allowsAttachments: + description: | + Does the board allows attachments? + type: boolean + allowsChecklists: + description: | + Does the board allows checklists? + type: boolean + allowsComments: + description: | + Does the board allows comments? + type: boolean + allowsDescriptionTitle: + description: | + Does the board allows description title? + type: boolean + allowsDescriptionText: + description: | + Does the board allows description text? + type: boolean + allowsActivities: + description: | + Does the board allows comments? + type: boolean + allowsLabels: + description: | + Does the board allows labels? + type: boolean + allowsAssignee: + description: | + Does the board allows assignee? + type: boolean + allowsMembers: + description: | + Does the board allows members? + type: boolean + allowsRequestedBy: + description: | + Does the board allows requested by? + type: boolean + allowsAssignedBy: + description: | + Does the board allows requested by? + type: boolean + allowsReceivedDate: + description: | + Does the board allows received date? + type: boolean + allowsStartDate: + description: | + Does the board allows start date? + type: boolean + allowsEndDate: + description: | + Does the board allows end date? + type: boolean + allowsDueDate: + description: | + Does the board allows due date? + type: boolean + presentParentTask: + description: | + Controls how to present the parent task: + + - `prefix-with-full-path`: add a prefix with the full path + - `prefix-with-parent`: add a prefisx with the parent name + - `subtext-with-full-path`: add a subtext with the full path + - `subtext-with-parent`: add a subtext with the parent name + - `no-parent`: does not show the parent at all + type: string + enum: + - prefix-with-full-path + - prefix-with-parent + - subtext-with-full-path + - subtext-with-parent + - no-parent + x-nullable: true + startAt: + description: | + Starting date of the board. + type: string + x-nullable: true + dueAt: + description: | + Due date of the board. + type: string + x-nullable: true + endAt: + description: | + End date of the board. + type: string + x-nullable: true + spentTime: + description: | + Time spent in the board. + type: number + x-nullable: true + isOvertime: + description: | + Is the board overtimed? + type: boolean + x-nullable: true + type: + description: | + The type of board + type: string + sort: + description: | + Sort value + type: number + required: + - title + - slug + - archived + - createdAt + - stars + - labels + - members + - permission + - color + - allowsSubtasks + - allowsAttachments + - allowsChecklists + - allowsComments + - allowsDescriptionTitle + - allowsDescriptionText + - allowsActivities + - allowsLabels + - allowsAssignee + - allowsMembers + - allowsRequestedBy + - allowsAssignedBy + - allowsReceivedDate + - allowsStartDate + - allowsEndDate + - allowsDueDate + - type + - sort + BoardsLabels: + type: object + properties: + _id: + description: | + Unique id of a label + type: string + name: + description: | + Name of a label + type: string + color: + description: | + color of a label. + + Can be amongst `green`, `yellow`, `orange`, `red`, `purple`, + `blue`, `sky`, `lime`, `pink`, `black`, + `silver`, `peachpuff`, `crimson`, `plum`, `darkgreen`, + `slateblue`, `magenta`, `gold`, `navy`, `gray`, + `saddlebrown`, `paleturquoise`, `mistyrose`, `indigo` + type: string + enum: + - green + - yellow + - orange + - red + - purple + - blue + - sky + - lime + - pink + - black + - silver + - peachpuff + - crimson + - plum + - darkgreen + - slateblue + - magenta + - gold + - navy + - gray + - saddlebrown + - paleturquoise + - mistyrose + - indigo + required: + - _id + - color + BoardsMembers: + type: object + properties: + userId: + description: | + The uniq ID of the member + type: string + isAdmin: + description: | + Is the member an admin of the board? + type: boolean + isActive: + description: | + Is the member active? + type: boolean + isNoComments: + description: | + Is the member not allowed to make comments + type: boolean + isCommentOnly: + description: | + Is the member only allowed to comment on the board + type: boolean + isWorker: + description: | + Is the member only allowed to move card, assign himself to card and comment + type: boolean + required: + - userId + - isAdmin + - isActive + CardComments: + type: object + description: A comment on a card + properties: + boardId: + description: | + the board ID + type: string + cardId: + description: | + the card ID + type: string + text: + description: | + the text of the comment + type: string + createdAt: + description: | + when was the comment created + type: string + modifiedAt: + type: string + userId: + description: | + the author ID of the comment + type: string + required: + - boardId + - cardId + - text + - createdAt + - modifiedAt + - userId + Cards: + type: object + properties: + title: + description: | + the title of the card + type: string + x-nullable: true + archived: + description: | + is the card archived + type: boolean + archivedAt: + description: | + latest archiving date + type: string + x-nullable: true + parentId: + description: | + ID of the parent card + type: string + x-nullable: true + listId: + description: | + List ID where the card is + type: string + x-nullable: true + swimlaneId: + description: | + Swimlane ID where the card is + type: string + boardId: + description: | + Board ID of the card + type: string + x-nullable: true + coverId: + description: | + Cover ID of the card + type: string + x-nullable: true + color: + type: string + enum: + - white + - green + - yellow + - orange + - red + - purple + - blue + - sky + - lime + - pink + - black + - silver + - peachpuff + - crimson + - plum + - darkgreen + - slateblue + - magenta + - gold + - navy + - gray + - saddlebrown + - paleturquoise + - mistyrose + - indigo + x-nullable: true + createdAt: + description: | + creation date + type: string + modifiedAt: + type: string + customFields: + description: | + list of custom fields + type: array + items: + $ref: "#/definitions/CardsCustomfields" + x-nullable: true + dateLastActivity: + description: | + Date of last activity + type: string + description: + description: | + description of the card + type: string + x-nullable: true + requestedBy: + description: | + who requested the card (ID of the user) + type: string + x-nullable: true + assignedBy: + description: | + who assigned the card (ID of the user) + type: string + x-nullable: true + labelIds: + description: | + list of labels ID the card has + type: array + items: + type: string + x-nullable: true + x-nullable: true + members: + description: | + list of members (user IDs) + type: array + items: + type: string + x-nullable: true + x-nullable: true + assignees: + description: | + who is assignee of the card (user ID), + maximum one ID of assignee in array. + type: array + items: + type: string + x-nullable: true + x-nullable: true + receivedAt: + description: | + Date the card was received + type: string + x-nullable: true + startAt: + description: | + Date the card was started to be worked on + type: string + x-nullable: true + dueAt: + description: | + Date the card is due + type: string + x-nullable: true + endAt: + description: | + Date the card ended + type: string + x-nullable: true + spentTime: + description: | + How much time has been spent on this + type: number + x-nullable: true + isOvertime: + description: | + is the card over time? + type: boolean + x-nullable: true + userId: + description: | + user ID of the author of the card + type: string + sort: + description: | + Sort value + type: number + subtaskSort: + description: | + subtask sort value + type: number + x-nullable: true + type: + description: | + type of the card + type: string + linkedId: + description: | + ID of the linked card + type: string + x-nullable: true + vote: + description: | + vote object, see below + $ref: "#/definitions/CardsVote" + x-nullable: true + required: + - archived + - swimlaneId + - createdAt + - modifiedAt + - dateLastActivity + - userId + - sort + - type + CardsVote: + type: object + properties: + question: + type: string + positive: + description: | + list of members (user IDs) + type: array + items: + type: string + x-nullable: true + negative: + description: | + list of members (user IDs) + type: array + items: + type: string + x-nullable: true + end: + type: string + public: + type: boolean + allowNonBoardMembers: + type: boolean + required: + - question + - public + - allowNonBoardMembers + CardsCustomfields: + type: object + ChecklistItems: + type: object + description: An item in a checklist + properties: + title: + description: | + the text of the item + type: string + sort: + description: | + the sorting field of the item + type: number + isFinished: + description: | + Is the item checked? + type: boolean + checklistId: + description: | + the checklist ID the item is attached to + type: string + cardId: + description: | + the card ID the item is attached to + type: string + createdAt: + type: string + x-nullable: true + modifiedAt: + type: string + required: + - title + - sort + - isFinished + - checklistId + - cardId + - modifiedAt + Checklists: + type: object + description: A Checklist + properties: + cardId: + description: | + The ID of the card the checklist is in + type: string + title: + description: | + the title of the checklist + type: string + finishedAt: + description: | + When was the checklist finished + type: string + x-nullable: true + createdAt: + description: | + Creation date of the checklist + type: string + modifiedAt: + type: string + sort: + description: | + sorting value of the checklist + type: number + required: + - cardId + - title + - createdAt + - modifiedAt + - sort + CustomFields: + type: object + description: A custom field on a card in the board + properties: + boardIds: + description: | + the ID of the board + type: array + items: + type: string + name: + description: | + name of the custom field + type: string + type: + description: | + type of the custom field + type: string + enum: + - text + - number + - date + - dropdown + - checkbox + - currency + settings: + description: | + settings of the custom field + $ref: "#/definitions/CustomFieldsSettings" + showOnCard: + description: | + should we show on the cards this custom field + type: boolean + automaticallyOnCard: + description: | + should the custom fields automatically be added on cards? + type: boolean + alwaysOnCard: + description: | + should the custom field be automatically added to all cards? + type: boolean + showLabelOnMiniCard: + description: | + should the label of the custom field be shown on minicards? + type: boolean + createdAt: + type: string + x-nullable: true + modifiedAt: + type: string + required: + - boardIds + - name + - type + - settings + - showOnCard + - automaticallyOnCard + - alwaysOnCard + - showLabelOnMiniCard + - modifiedAt + CustomFieldsSettings: + type: object + properties: + currencyCode: + type: string + dropdownItems: + description: | + list of drop down items objects + type: array + items: + $ref: "#/definitions/CustomFieldsSettingsDropdownitems" + CustomFieldsSettingsDropdownitems: + type: object + Integrations: + type: object + description: Integration with third-party applications + properties: + enabled: + description: | + is the integration enabled? + type: boolean + title: + description: | + name of the integration + type: string + x-nullable: true + type: + description: | + type of the integratation (Default to 'outgoing-webhooks') + type: string + activities: + description: | + activities the integration gets triggered (list) + type: array + items: + type: string + url: + type: string + token: + description: | + token of the integration + type: string + x-nullable: true + boardId: + description: | + Board ID of the integration + type: string + createdAt: + description: | + Creation date of the integration + type: string + modifiedAt: + type: string + userId: + description: | + user ID who created the interation + type: string + required: + - enabled + - type + - activities + - url + - boardId + - createdAt + - modifiedAt + - userId + Lists: + type: object + description: A list (column) in the Wekan board. + properties: + title: + description: | + the title of the list + type: string + starred: + description: | + if a list is stared + then we put it on the top + type: boolean + x-nullable: true + archived: + description: | + is the list archived + type: boolean + archivedAt: + description: | + latest archiving date + type: string + x-nullable: true + boardId: + description: | + the board associated to this list + type: string + swimlaneId: + description: | + the swimlane associated to this list. Used for templates + type: string + createdAt: + description: | + creation date + type: string + sort: + description: | + is the list sorted + type: number + x-nullable: true + updatedAt: + description: | + last update of the list + type: string + x-nullable: true + modifiedAt: + type: string + wipLimit: + description: | + WIP object, see below + $ref: "#/definitions/ListsWiplimit" + x-nullable: true + color: + description: | + the color of the list + type: string + enum: + - white + - green + - yellow + - orange + - red + - purple + - blue + - sky + - lime + - pink + - black + - peachpuff + - crimson + - plum + - darkgreen + - slateblue + - magenta + - gold + - navy + - gray + - saddlebrown + - paleturquoise + - mistyrose + - indigo + x-nullable: true + type: + description: | + The type of list + type: string + required: + - title + - archived + - boardId + - swimlaneId + - createdAt + - modifiedAt + - type + ListsWiplimit: + type: object + properties: + value: + description: | + value of the WIP + type: number + enabled: + description: | + is the WIP enabled + type: boolean + soft: + description: | + is the WIP a soft or hard requirement + type: boolean + required: + - value + - enabled + - soft + Swimlanes: + type: object + description: A swimlane is an line in the kaban board. + properties: + title: + description: | + the title of the swimlane + type: string + archived: + description: | + is the swimlane archived? + type: boolean + archivedAt: + description: | + latest archiving date of the swimlane + type: string + x-nullable: true + boardId: + description: | + the ID of the board the swimlane is attached to + type: string + createdAt: + description: | + creation date of the swimlane + type: string + sort: + description: | + the sort value of the swimlane + type: number + x-nullable: true + color: + description: | + the color of the swimlane + type: string + enum: + - white + - green + - yellow + - orange + - red + - purple + - blue + - sky + - lime + - pink + - black + - peachpuff + - crimson + - plum + - darkgreen + - slateblue + - magenta + - gold + - navy + - gray + - saddlebrown + - paleturquoise + - mistyrose + - indigo + x-nullable: true + updatedAt: + description: | + when was the swimlane last edited + type: string + x-nullable: true + modifiedAt: + type: string + type: + description: | + The type of swimlane + type: string + required: + - title + - archived + - boardId + - createdAt + - modifiedAt + - type + Users: + type: object + description: A User in wekan + properties: + username: + description: | + the username of the user + type: string + x-nullable: true + emails: + description: | + the list of emails attached to a user + type: array + items: + $ref: "#/definitions/UsersEmails" + x-nullable: true + createdAt: + description: | + creation date of the user + type: string + modifiedAt: + type: string + profile: + description: | + profile settings + $ref: "#/definitions/UsersProfile" + x-nullable: true + services: + description: | + services field of the user + type: object + x-nullable: true + heartbeat: + description: | + last time the user has been seen + type: string + x-nullable: true + isAdmin: + description: | + is the user an admin of the board? + type: boolean + x-nullable: true + createdThroughApi: + description: | + was the user created through the API? + type: boolean + x-nullable: true + loginDisabled: + description: | + loginDisabled field of the user + type: boolean + x-nullable: true + authenticationMethod: + description: | + authentication method of the user + type: string + sessionData: + description: | + profile settings + $ref: "#/definitions/UsersSessiondata" + x-nullable: true + importUsernames: + description: | + username for imported + type: array + items: + type: string + x-nullable: true + x-nullable: true + required: + - 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: + avatarUrl: + description: | + URL of the avatar of the user + type: string + emailBuffer: + description: | + list of email buffers of the user + type: array + items: + type: string + x-nullable: true + fullname: + description: | + full name of the user + type: string + showDesktopDragHandles: + description: | + does the user want to hide system messages? + type: boolean + hideCheckedItems: + description: | + does the user want to hide checked checklist items? + type: boolean + hiddenSystemMessages: + description: | + does the user want to hide system messages? + type: boolean + hiddenMinicardLabelText: + description: | + does the user want to hide minicard label texts? + type: boolean + initials: + description: | + initials of the user + type: string + invitedBoards: + description: | + board IDs the user has been invited to + type: array + items: + type: string + x-nullable: true + language: + description: | + language of the user + type: string + notifications: + description: | + enabled notifications for the user + 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 + type: number + startDayOfWeek: + description: | + startDayOfWeek field of the user + type: number + starredBoards: + description: | + list of starred board IDs + type: array + items: + type: string + x-nullable: true + icode: + description: | + icode + type: string + boardView: + description: | + boardView field of the user + type: string + enum: + - board-view-swimlanes + - board-view-lists + - board-view-cal + listSortBy: + description: | + default sort list for user + type: string + enum: + - -modifiedat + - modifiedat + - -title + - title + - -sort + - sort + templatesBoardId: + description: | + Reference to the templates board + type: string + cardTemplatesSwimlaneId: + description: | + Reference to the card templates swimlane Id + type: string + listTemplatesSwimlaneId: + description: | + Reference to the list templates swimlane Id + type: string + boardTemplatesSwimlaneId: + description: | + Reference to the board templates swimlane Id + type: string + required: + - activity + - templatesBoardId + - cardTemplatesSwimlaneId + - listTemplatesSwimlaneId + - boardTemplatesSwimlaneId + UsersSessiondata: + type: object + properties: + totalHits: + description: | + Total hits from last search + type: number + lastHit: + description: | + last hit that was returned + type: number diff --git a/releases/clone-release-repos.sh b/releases/clone-release-repos.sh new file mode 100755 index 000000000..dac9eb1d8 --- /dev/null +++ b/releases/clone-release-repos.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# With this, clone all release related repos. + +# 1) Check that this script has no parameters +if [ $# -ne 0 ] + then + echo "Syntax, no parameters:" + echo " ./releases/clone-release-repos.sh" + exit 1 +fi + +# 2) Create directories, clone repos +mkdir ../w +cd ../w +git clone git@github.com:wekan/wekan.github.io.git +git clone git@github.com:wekan/wekan-ondra.git +git clone git@github.com:wekan/wekan-gantt-gpl.git + +# 3) Set upstreams +cd wekan-ondra +git remote add upstream https://github.com/wekan/wekan + +cd ../wekan-gantt-gpl +git remote add upstream https://github.com/wekan/wekan + +# 4) Go back to Wekan repo directory +cd ../wekan + +echo "Release repos ondra, gantt-gpl, and website cloned and upstreams set." diff --git a/releases/maintainer-make-bundle-a.sh b/releases/maintainer-make-bundle-a.sh index 98dfa3d99..71ef923a5 100755 --- a/releases/maintainer-make-bundle-a.sh +++ b/releases/maintainer-make-bundle-a.sh @@ -3,6 +3,13 @@ # This script is only for Wekan maintainer to # convert x64 bundle to arm64 bundle. +if [ $# -ne 1 ] + then + echo "Syntax with Wekan version number:" + echo " ./maintainer-make-bundle-a.sh 5.10" + exit 1 +fi + cd ~/repos rm -rf bundle @@ -21,13 +28,11 @@ sudo rm -rf /home/wekan/repos/bundle/programs/server/npm/node_modules/meteor/ost cd bundle/programs/server chmod u+w *.json -npm uninstall fibers node-gyp node-pre-gyp -npm install node-gyp@5.0.4 node-pre-gyp fibers +npm uninstall fibers node-gyp node-pre-gyp @mapbox/node-pre-gyp npm install -npm uninstall fibers node-gyp node-pre-gyp -npm install node-pre-gyp +npm install node-gyp +npm install @mapbox/node-pre-gyp npm install fibers -npm install node-gyp@5.0.4 cd /home/wekan/repos/bundle find . -type d -name '*-garbage*' | xargs rm -rf diff --git a/releases/maintainer-make-bundle-o.sh b/releases/maintainer-make-bundle-o.sh index 4d459a3e5..51004dc4f 100755 --- a/releases/maintainer-make-bundle-o.sh +++ b/releases/maintainer-make-bundle-o.sh @@ -1,3 +1,20 @@ +#!/bin/bash + +# This script is only for Wekan maintainer to +# convert x64 bundle to ppc64le bundle. + +# 1) Check that there is only one parameter +# of Wekan version number + +if [ $# -ne 1 ] + then + echo "Syntax with Wekan version number:" + echo " ./maintainer-make-bundle-o.sh 5.10" + exit 1 +fi + +# 2) Build bundle + cd /home/ubuntu rm -rf bundle #wget https://releases.wekan.team/wekan-$1.zip @@ -7,7 +24,7 @@ chmod u+w *.json cd /home/ubuntu/bundle/programs/server/node_modules/fibers node build.js cd /home/ubuntu -cp -pR /home/ubuntu/node-fibers/bin/linux-ppc64-72-glibc bundle/programs/server/node_modules/fibers/bin/ +#cp -pR /home/ubuntu/node-fibers/bin/linux-ppc64-72-glibc bundle/programs/server/node_modules/fibers/bin/ cd bundle find . -type d -name '*-garbage*' | xargs rm -rf find . -name '*phantom*' | xargs rm -rf diff --git a/releases/maintainer-make-bundle-s.sh b/releases/maintainer-make-bundle-s.sh index 149d51e76..eae1f82f3 100755 --- a/releases/maintainer-make-bundle-s.sh +++ b/releases/maintainer-make-bundle-s.sh @@ -1,3 +1,15 @@ +#!/bin/bash + +# This script is only for Wekan maintainer to +# convert x64 bundle to s390x bundle. + +if [ $# -ne 1 ] + then + echo "Syntax with Wekan version number:" + echo " ./maintainer-make-bundle-s.sh 5.10" + exit 1 +fi + cd /home/linux1 rm -rf bundle unzip wekan-$1.zip diff --git a/releases/node-version.sh b/releases/node-version.sh new file mode 100755 index 000000000..a5089fdba --- /dev/null +++ b/releases/node-version.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cat ~/repos/wekan/Dockerfile | grep NODE_VERSION=v | sed 's|\\||g' - | sed 's| ||g' - | sed 's|NODE_VERSION=v||g' - diff --git a/releases/rebuild-docs-install-deps.sh b/releases/rebuild-docs-install-deps.sh deleted file mode 100755 index 51c2ef94f..000000000 --- a/releases/rebuild-docs-install-deps.sh +++ /dev/null @@ -1,15 +0,0 @@ -# Extract the OpenAPI specification. - -# Install dependencies. -sudo apt-get install python3-pip -sudo pip3 install -U setuptools wheel -sudo npm install -g api2html -cd ~/repos/wekan -mkdir -p public/api - -# Generate docs. -python3 ./openapi/generate_openapi.py --release $(git describe --tags --abbrev=0) > ./public/api/wekan.yml -api2html -c ./public/logo-header.png -o ./public/api/wekan.html ./public/api/wekan.yml - -# Copy docs to bundle -#cp -pR ./public/api ~/repos/wekan/.build/bundle/programs/web.browser/app/ diff --git a/releases/rebuild-docs.sh b/releases/rebuild-docs.sh index 2ac46eb34..c7938793f 100755 --- a/releases/rebuild-docs.sh +++ b/releases/rebuild-docs.sh @@ -1,9 +1,41 @@ -# Generate docs. +# Extract the OpenAPI specification. -#mkdir -p public/api -python3 ./openapi/generate_openapi.py --release $(git describe --tags --abbrev=0) > ./public/api/wekan.yml +# 1) Check that there is only one parameter +# of Wekan version number: + +if [ $# -ne 1 ] + then + echo "Syntax with Wekan version number:" + echo " ./rebuild-docs.sh 5.10" + exit 1 +fi + +# 2) If esprima-python directory does not exist, +# install dependencies. + +if [ ! -d ~/python/esprima-python ]; then + sudo apt-get -y install python3-pip + sudo pip3 install -U setuptools wheel + sudo npm install -g api2html + mkdir -p ~/python + cd ~/python + git clone --depth 1 -b master https://github.com/Kronuz/esprima-python + cd ~/python/esprima-python + sudo python3 setup.py install --record files.txt +fi + +# 2) Go to Wekan repo directory +cd ~/repos/wekan + +# 3) Create api docs directory, if it does not exist +if [ ! -d public/api ]; then + mkdir -p public/api +fi + +# 4) Generate docs. +#python3 ./openapi/generate_openapi.py --release $(git describe --tags --abbrev=0) > ./public/api/wekan.yml +python3 ./openapi/generate_openapi.py --release v$1 > ./public/api/wekan.yml api2html -c ./public/logo-header.png -o ./public/api/wekan.html ./public/api/wekan.yml # Copy docs to bundle #cp -pR ./public/api ~/repos/wekan/.build/bundle/programs/web.browser/app/ -#cp -pR ./public/api ~/repos/wekan/.build/bundle/programs/web.browser.legacy/app/ diff --git a/releases/release-bundle.sh b/releases/release-bundle.sh index b6de8d820..309c041a0 100755 --- a/releases/release-bundle.sh +++ b/releases/release-bundle.sh @@ -6,6 +6,9 @@ cd ~/repos/wekan/.build zip -r wekan-$1.zip bundle { + scp ~/repos/wekan/releases/maintainer-make-bundle-a.sh a:/home/wekan/repos/maintainer-make-bundle.sh + scp ~/repos/wekan/releases/maintainer-make-bundle-s.sh s:/home/linux1/maintainer-make-bundle.sh + scp ~/repos/wekan/releases/maintainer-make-bundle-o.sh o:/home/ubuntu/maintainer-make-bundle.sh scp wekan-$1.zip x2:/var/snap/wekan/common/releases.wekan.team/ scp wekan-$1.zip a:/home/wekan/repos/ scp wekan-$1.zip s:/home/linux1/ @@ -14,4 +17,4 @@ zip -r wekan-$1.zip bundle cd .. -echo "Bundle uploaded to x2/a/s/o." +echo "x64 bundle and arm64/s390x/ppc64le build scripts uploaded to x2/a/s/o." diff --git a/releases/release-ondra-1.sh b/releases/release-ondra-1.sh index ee499e8db..986f8f0c0 100755 --- a/releases/release-ondra-1.sh +++ b/releases/release-ondra-1.sh @@ -1,2 +1,18 @@ +#!/bin/bash + +# Release script for wekan-ondra and wekan-gantt-gpl +# part 1. After this merge and fix merge conflicts, and part 2. + +# 1) Check that there is only one parameter +# of Wekan version number: + +if [ $# -ne 1 ] + then + echo "Syntax with Wekan version number:" + echo " ./release-ondra-2.sh 5.10" + exit 1 +fi + +# 2) Get up git fetch upstream git merge upstream/master diff --git a/releases/release-ondra-2.sh b/releases/release-ondra-2.sh index a78cd13e7..7278c08dd 100755 --- a/releases/release-ondra-2.sh +++ b/releases/release-ondra-2.sh @@ -1 +1,20 @@ +#/bin/bash + +# Release script for wekan-ondra and wekan-gantt-gpl +# part 2. Before these, part 1 and merge and fix merge conflicts. + +# 1) Check that there is only one parameter +# of Wekan version number: + +if [ $# -ne 1 ] + then + echo "Syntax with Wekan version number:" + echo " ./release-ondra-2.sh 5.10" + exit 1 +fi + +# 2) Move Wekan version tag to be newest after merge +# and push to repo. +git tag --force v$1 HEAD +git push --tags --force git push --follow-tags diff --git a/releases/release-website.sh b/releases/release-website.sh new file mode 100755 index 000000000..cdf0c60ab --- /dev/null +++ b/releases/release-website.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Release website with new Wekan version number +# and new API docs. + +# 1) Check that there is only 2 parameters +# of Wekan previous and new version number: + +if [ $# -ne 2 ] + then + echo "Syntax with Wekan previous and new version number:" + echo " ./release-website.sh 5.09 5.10" + exit 1 +fi + +# 2) Go to website directory +cd ~/repos/w/wekan.github.io + +# 3) Get latest changes to website +git pull + +# 4) Change version number in website +sed -i 's|v$1|v$2|g' index.html + +# 5) Change version number in API docs index page +cd api +sed -i 's|v$1|v$2|g' index.html + +# 6) Create directory for new docs +mkdir v$2 + +# 7) Go to new docs directory +cd v$2 + +# 8) Copy new docs from Wekan repo to new docs directory +cp ~/repos/wekan/public/api/* . + +# 9) Move wekan.html to index.html +mv wekan.html index.html + +# 10) Go to docs repo +cd ~/repos/w/wekan.github.io + +# 11) Commit all changes to git and push website changes live +git add --all +git commit -m "v$2" +git push diff --git a/releases/release.sh b/releases/release.sh index 9dc503d4b..6d8dfe394 100755 --- a/releases/release.sh +++ b/releases/release.sh @@ -1,21 +1,33 @@ -# Usage: ./release.sh 4.37 +#!/bin/bash -# Commit and push version number changes +# Release script for wekan. + +# 1) Check that there is only one parameter +# of Wekan version number: + +if [ $# -ne 1 ] + then + echo "Syntax with Wekan version number:" + echo " ./release.sh 5.10" + exit 1 +fi + +# 2) Commit and push version number changes cd ~/repos/wekan git add --all git commit -m "v$1" git push -# Add release tag +# 3) Add release tag ~/repos/wekan/releases/add-tag.sh v$1 -# Push to repo +# 4) Push to repo git push -# Build Bundle +# 5) Build Bundle ~/repos/wekan/releases/release-bundle.sh $1 -# Build Sandstorm +# 6) Build Sandstorm ~/repos/wekan/releases/release-sandstorm.sh $1 # Build Snap diff --git a/releases/translations/pull-translations.sh b/releases/translations/pull-translations.sh index 3dcb89015..9b642b43f 100755 --- a/releases/translations/pull-translations.sh +++ b/releases/translations/pull-translations.sh @@ -151,6 +151,9 @@ tx pull -f -l es_AR echo "Spanish (Chile):" tx pull -f -l es_CL +echo "Spanish (Latin America)": +tx pull -f -l es_419 + echo "Spanish (Mexico)": tx pull -f -l es_MX diff --git a/releases/up-a.sh b/releases/up-a.sh index a474a1856..7eebc9270 100755 --- a/releases/up-a.sh +++ b/releases/up-a.sh @@ -1,2 +1,17 @@ +#!/bin/bash + +# 1) Check that there is only one parameter +# of Wekan version number + +if [ $# -ne 1 ] + then + echo "Syntax with Wekan version number:" + echo " ./up-a.sh 5.10" + exit 1 +fi + +# 2) Download release from arm64 build server scp a:/home/wekan/repos/wekan-$1-arm64.zip . + +# 3) Upload arm64 release to download server scp wekan-$1-arm64.zip x2:/var/snap/wekan/common/releases.wekan.team/raspi3/ diff --git a/releases/up-o.sh b/releases/up-o.sh index 3d8368371..6fe939073 100755 --- a/releases/up-o.sh +++ b/releases/up-o.sh @@ -1,2 +1,17 @@ +#!/bin/bash + +# 1) Check that there is only one parameter +# of Wekan version number + +if [ $# -ne 1 ] + then + echo "Syntax with Wekan version number:" + echo " ./up-o.sh 5.10" + exit 1 +fi + +# 2) Download release from ppc64le build server scp o:/home/ubuntu/wekan-$1-ppc64le.zip . + +# 3) Upload ppc64le release to download server scp wekan-$1-ppc64le.zip x2:/var/snap/wekan/common/releases.wekan.team/ppc64le/ diff --git a/releases/up-s.sh b/releases/up-s.sh index dc847add0..37c47c77c 100755 --- a/releases/up-s.sh +++ b/releases/up-s.sh @@ -1,2 +1,17 @@ +#!/bin/bash + +# 1) Check that there is only one parameter +# of Wekan version number + +if [ $# -ne 1 ] + then + echo "Syntax with Wekan version number:" + echo " ./up-s.sh 5.10" + exit 1 +fi + +# 2) Download release from s390x build server scp s:/home/linux1/wekan-$1-s390x.zip . + +# 3) Upload s390x release to download server scp wekan-$1-s390x.zip x2:/var/snap/wekan/common/releases.wekan.team/s390x/ diff --git a/releases/up.sh b/releases/up.sh index d437a9d1a..357e29cf2 100755 --- a/releases/up.sh +++ b/releases/up.sh @@ -1,7 +1,22 @@ #!/bin/bash +# 1) Check that there is only one parameter +# of Wekan version number + +if [ $# -ne 1 ] + then + echo "Syntax with Wekan version number:" + echo " ./maintainer-make-bundle-o.sh 5.10" + exit 1 +fi + +# 2) Install parallel if it's not installed yet sudo apt-get -y install parallel +# 3) Download releases from build servers and +# upload releases to download server, +# all at the same time in parallel. + { ~/repos/wekan/releases/up-a.sh $1 ~/repos/wekan/releases/up-s.sh $1 diff --git a/releases/virtualbox/start-wekan.sh b/releases/virtualbox/start-wekan.sh index 30036fd70..728358d7f 100755 --- a/releases/virtualbox/start-wekan.sh +++ b/releases/virtualbox/start-wekan.sh @@ -22,6 +22,9 @@ # This is local port where Wekan Node.js runs, same as below on Caddyfile settings. export PORT=2000 #--------------------------------------------- + # ==== NUMBER OF SEARCH RESULTS PER PAGE BY DEFAULT ==== + #export RESULTS_PER_PAGE=20 + #--------------------------------------------- # Wekan Export Board works when WITH_API=true. # If you disable Wekan API with false, Export Board does not work. export WITH_API='true' diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index e0183b269..600305e01 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 505, + appVersion = 514, # Increment this for every release. - appMarketingVersion = (defaultText = "5.05.0~2021-03-11"), + appMarketingVersion = (defaultText = "5.14.0~2021-03-29"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, @@ -237,6 +237,7 @@ const myCommand :Spk.Manifest.Command = ( environ = [ # Note that this defines the *entire* environment seen by your app. (key = "PATH", value = "/usr/local/bin:/usr/bin:/bin"), + (key = "RESULTS_PER_PAGE", value = ""), (key = "WITH_API", value = "true"), (key = "RICHER_CARD_COMMENT_EDITOR", value="false"), (key = "CARD_OPENED_WEBHOOK_ENABLED", value="false"), diff --git a/server/publications/cards.js b/server/publications/cards.js index 53f831557..99cc596a8 100644 --- a/server/publications/cards.js +++ b/server/publications/cards.js @@ -1,3 +1,50 @@ +import moment from 'moment'; +import Users from '../../models/users'; +import Boards from '../../models/boards'; +import Lists from '../../models/lists'; +import Swimlanes from '../../models/swimlanes'; +import Cards from '../../models/cards'; +import CardComments from '../../models/cardComments'; +import Attachments from '../../models/attachments'; +import Checklists from '../../models/checklists'; +import ChecklistItems from '../../models/checklistItems'; +import SessionData from '../../models/usersessiondata'; +import CustomFields from '../../models/customFields'; +import { + DEFAULT_LIMIT, + OPERATOR_ASSIGNEE, + OPERATOR_BOARD, + OPERATOR_COMMENT, + OPERATOR_DUE, + OPERATOR_HAS, + OPERATOR_LABEL, + OPERATOR_LIMIT, + OPERATOR_LIST, + OPERATOR_MEMBER, + OPERATOR_SORT, + OPERATOR_STATUS, + OPERATOR_SWIMLANE, + OPERATOR_USER, + ORDER_ASCENDING, + PREDICATE_ALL, + PREDICATE_ARCHIVED, + PREDICATE_ASSIGNEES, + PREDICATE_ATTACHMENT, + PREDICATE_CHECKLIST, + PREDICATE_CREATED_AT, + PREDICATE_DESCRIPTION, + PREDICATE_DUE_AT, + PREDICATE_END_AT, + PREDICATE_ENDED, + PREDICATE_MEMBERS, + PREDICATE_MODIFIED_AT, + PREDICATE_PRIVATE, + PREDICATE_PUBLIC, + PREDICATE_START_AT, + PREDICATE_SYSTEM, +} from '../../config/search-const'; +import { QueryErrors, QueryParams, Query } from '../../config/query-classes'; + const escapeForRegex = require('escape-string-regexp'); Meteor.publish('card', cardId => { @@ -5,260 +52,50 @@ Meteor.publish('card', cardId => { return Cards.find({ _id: cardId }); }); -Meteor.publish('myCards', function() { - const userId = Meteor.userId(); +Meteor.publish('myCards', function(sessionId) { + const queryParams = new QueryParams(); + queryParams.addPredicate(OPERATOR_USER, Meteor.user().username); - const archivedBoards = []; - Boards.find({ archived: true }).forEach(board => { - archivedBoards.push(board._id); - }); - - const archivedSwimlanes = []; - Swimlanes.find({ archived: true }).forEach(swimlane => { - archivedSwimlanes.push(swimlane._id); - }); - - const archivedLists = []; - Lists.find({ archived: true }).forEach(list => { - archivedLists.push(list._id); - }); - - selector = { - archived: false, - boardId: { $nin: archivedBoards }, - swimlaneId: { $nin: archivedSwimlanes }, - listId: { $nin: archivedLists }, - $or: [{ members: userId }, { assignees: userId }], - }; - - const cards = Cards.find(selector, { - fields: { - _id: 1, - archived: 1, - boardId: 1, - swimlaneId: 1, - listId: 1, - title: 1, - type: 1, - sort: 1, - members: 1, - assignees: 1, - colors: 1, - dueAt: 1, - }, - }); - - const boards = []; - const swimlanes = []; - const lists = []; - const users = []; - - cards.forEach(card => { - if (card.boardId) boards.push(card.boardId); - if (card.swimlaneId) swimlanes.push(card.swimlaneId); - if (card.listId) lists.push(card.listId); - if (card.members) { - card.members.forEach(userId => { - users.push(userId); - }); - } - if (card.assignees) { - card.assignees.forEach(userId => { - users.push(userId); - }); - } - }); - - return [ - cards, - Boards.find({ _id: { $in: boards } }), - Swimlanes.find({ _id: { $in: swimlanes } }), - Lists.find({ _id: { $in: lists } }), - Users.find({ _id: { $in: users } }, { fields: Users.safeFields }), - ]; + return findCards(sessionId, buildQuery(queryParams)); }); -Meteor.publish('dueCards', function(allUsers = false) { - check(allUsers, Boolean); +// Meteor.publish('dueCards', function(sessionId, allUsers = false) { +// check(sessionId, String); +// check(allUsers, Boolean); +// +// // eslint-disable-next-line no-console +// // console.log('all users:', allUsers); +// +// const queryParams = { +// has: [{ field: 'dueAt', exists: true }], +// limit: 25, +// skip: 0, +// sort: { name: 'dueAt', order: 'des' }, +// }; +// +// if (!allUsers) { +// queryParams.users = [Meteor.user().username]; +// } +// +// return buildQuery(sessionId, queryParams); +// }); - // eslint-disable-next-line no-console - // console.log('all users:', allUsers); - - const user = Users.findOne({ _id: this.userId }); - - const archivedBoards = []; - Boards.find({ archived: true }).forEach(board => { - archivedBoards.push(board._id); - }); - - const permiitedBoards = []; - let selector = { - archived: false, - }; - - selector.$or = [ - { permission: 'public' }, - { members: { $elemMatch: { userId: user._id, isActive: true } } }, - ]; - - Boards.find(selector).forEach(board => { - permiitedBoards.push(board._id); - }); - - const archivedSwimlanes = []; - Swimlanes.find({ archived: true }).forEach(swimlane => { - archivedSwimlanes.push(swimlane._id); - }); - - const archivedLists = []; - Lists.find({ archived: true }).forEach(list => { - archivedLists.push(list._id); - }); - - selector = { - archived: false, - boardId: { $nin: archivedBoards, $in: permiitedBoards }, - swimlaneId: { $nin: archivedSwimlanes }, - listId: { $nin: archivedLists }, - dueAt: { $ne: null }, - endAt: null, - }; - - if (!allUsers) { - selector.$or = [{ members: user._id }, { assignees: user._id }]; - } - - const cards = Cards.find(selector, { - fields: { - _id: 1, - archived: 1, - boardId: 1, - swimlaneId: 1, - listId: 1, - title: 1, - type: 1, - sort: 1, - members: 1, - assignees: 1, - colors: 1, - dueAt: 1, - }, - }); - - const boards = []; - const swimlanes = []; - const lists = []; - const users = []; - - cards.forEach(card => { - if (card.boardId) boards.push(card.boardId); - if (card.swimlaneId) swimlanes.push(card.swimlaneId); - if (card.listId) lists.push(card.listId); - if (card.members) { - card.members.forEach(userId => { - users.push(userId); - }); - } - if (card.assignees) { - card.assignees.forEach(userId => { - users.push(userId); - }); - } - }); - - return [ - cards, - Boards.find({ _id: { $in: boards } }), - Swimlanes.find({ _id: { $in: swimlanes } }), - Lists.find({ _id: { $in: lists } }), - Users.find({ _id: { $in: users } }, { fields: Users.safeFields }), - ]; -}); - -Meteor.publish('globalSearch', function(sessionId, queryParams) { +Meteor.publish('globalSearch', function(sessionId, params) { check(sessionId, String); - check(queryParams, Object); + check(params, Object); // eslint-disable-next-line no-console - // console.log('queryParams:', queryParams); + // console.log('queryParams:', params); + return findCards(sessionId, buildQuery(new QueryParams(params))); +}); + +function buildSelector(queryParams) { const userId = Meteor.userId(); - // eslint-disable-next-line no-console - // console.log('userId:', userId); - const errors = new (class { - constructor() { - this.notFound = { - boards: [], - swimlanes: [], - lists: [], - labels: [], - users: [], - members: [], - assignees: [], - status: [], - comments: [], - }; - - this.colorMap = Boards.colorMap(); - } - - hasErrors() { - for (const value of Object.values(this.notFound)) { - if (value.length) { - return true; - } - } - return false; - } - - errorMessages() { - const messages = []; - - this.notFound.boards.forEach(board => { - messages.push({ tag: 'board-title-not-found', value: board }); - }); - this.notFound.swimlanes.forEach(swim => { - messages.push({ tag: 'swimlane-title-not-found', value: swim }); - }); - this.notFound.lists.forEach(list => { - messages.push({ tag: 'list-title-not-found', value: list }); - }); - this.notFound.comments.forEach(comments => { - comments.forEach(text => { - messages.push({ tag: 'comment-not-found', value: text }); - }); - }); - this.notFound.labels.forEach(label => { - messages.push({ - tag: 'label-not-found', - value: label, - color: Boards.labelColors().includes(label), - }); - }); - this.notFound.users.forEach(user => { - messages.push({ tag: 'user-username-not-found', value: user }); - }); - this.notFound.members.forEach(user => { - messages.push({ tag: 'user-username-not-found', value: user }); - }); - this.notFound.assignees.forEach(user => { - messages.push({ tag: 'user-username-not-found', value: user }); - }); - - return messages; - } - })(); + const errors = new QueryErrors(); let selector = {}; - let skip = 0; - if (queryParams.skip) { - skip = queryParams.skip; - } - let limit = 25; - if (queryParams.limit) { - limit = queryParams.limit; - } if (queryParams.selector) { selector = queryParams.selector; @@ -267,15 +104,15 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { let archived = false; let endAt = null; - if (queryParams.status.length) { - queryParams.status.forEach(status => { - if (status === 'archived') { + if (queryParams.hasOperator(OPERATOR_STATUS)) { + queryParams.getPredicates(OPERATOR_STATUS).forEach(status => { + if (status === PREDICATE_ARCHIVED) { archived = true; - } else if (status === 'all') { + } else if (status === PREDICATE_ALL) { archived = null; - } else if (status === 'ended') { + } else if (status === PREDICATE_ENDED) { endAt = { $nin: [null, ''] }; - } else if (['private', 'public'].includes(status)) { + } else if ([PREDICATE_PRIVATE, PREDICATE_PUBLIC].includes(status)) { boardsSelector.permission = status; } }); @@ -320,9 +157,9 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { selector.endAt = endAt; } - if (queryParams.boards.length) { + if (queryParams.hasOperator(OPERATOR_BOARD)) { const queryBoards = []; - queryParams.boards.forEach(query => { + queryParams.hasOperator(OPERATOR_BOARD).forEach(query => { const boards = Boards.userSearch(userId, { title: new RegExp(escapeForRegex(query), 'i'), }); @@ -331,16 +168,16 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { queryBoards.push(board._id); }); } else { - errors.notFound.boards.push(query); + errors.addNotFound(OPERATOR_BOARD, query); } }); selector.boardId.$in = queryBoards; } - if (queryParams.swimlanes.length) { + if (queryParams.hasOperator(OPERATOR_SWIMLANE)) { const querySwimlanes = []; - queryParams.swimlanes.forEach(query => { + queryParams.getPredicates(OPERATOR_SWIMLANE).forEach(query => { const swimlanes = Swimlanes.find({ title: new RegExp(escapeForRegex(query), 'i'), }); @@ -349,7 +186,7 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { querySwimlanes.push(swim._id); }); } else { - errors.notFound.swimlanes.push(query); + errors.addNotFound(OPERATOR_SWIMLANE, query); } }); @@ -360,9 +197,9 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { selector.swimlaneId.$in = querySwimlanes; } - if (queryParams.lists.length) { + if (queryParams.hasOperator(OPERATOR_LIST)) { const queryLists = []; - queryParams.lists.forEach(query => { + queryParams.getPredicates(OPERATOR_LIST).forEach(query => { const lists = Lists.find({ title: new RegExp(escapeForRegex(query), 'i'), }); @@ -371,7 +208,7 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { queryLists.push(list._id); }); } else { - errors.notFound.lists.push(query); + errors.addNotFound(OPERATOR_LIST, query); } }); @@ -382,8 +219,10 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { selector.listId.$in = queryLists; } - if (queryParams.comments.length) { - const cardIds = CardComments.textSearch(userId, queryParams.comments).map( + if (queryParams.hasOperator(OPERATOR_COMMENT)) { + const cardIds = CardComments.textSearch( + userId, + queryParams.getPredicates(OPERATOR_COMMENT), com => { return com.cardId; }, @@ -391,82 +230,75 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { if (cardIds.length) { selector._id = { $in: cardIds }; } else { - errors.notFound.comments.push(queryParams.comments); + queryParams.getPredicates(OPERATOR_COMMENT).forEach(comment => { + errors.addNotFound(OPERATOR_COMMENT, comment); + }); } } - ['dueAt', 'createdAt', 'modifiedAt'].forEach(field => { - if (queryParams[field]) { + [OPERATOR_DUE, 'createdAt', 'modifiedAt'].forEach(field => { + if (queryParams.hasOperator(field)) { selector[field] = {}; - selector[field][queryParams[field]['operator']] = new Date( - queryParams[field]['value'], - ); + const predicate = queryParams.getPredicate(field); + selector[field][predicate.operator] = new Date(predicate.value); } }); - const queryMembers = []; - const queryAssignees = []; - if (queryParams.users.length) { - queryParams.users.forEach(query => { + const queryUsers = {}; + queryUsers[OPERATOR_ASSIGNEE] = []; + queryUsers[OPERATOR_MEMBER] = []; + + if (queryParams.hasOperator(OPERATOR_USER)) { + queryParams.getPredicates(OPERATOR_USER).forEach(query => { const users = Users.find({ username: query, }); if (users.count()) { users.forEach(user => { - queryMembers.push(user._id); - queryAssignees.push(user._id); + queryUsers[OPERATOR_MEMBER].push(user._id); + queryUsers[OPERATOR_ASSIGNEE].push(user._id); }); } else { - errors.notFound.users.push(query); + errors.addNotFound(OPERATOR_USER, query); } }); } - if (queryParams.members.length) { - queryParams.members.forEach(query => { - const users = Users.find({ - username: query, + [OPERATOR_MEMBER, OPERATOR_ASSIGNEE].forEach(key => { + if (queryParams.hasOperator(key)) { + queryParams.getPredicates(key).forEach(query => { + const users = Users.find({ + username: query, + }); + if (users.count()) { + users.forEach(user => { + queryUsers[key].push(user._id); + }); + } else { + errors.addNotFound(key, query); + } }); - if (users.count()) { - users.forEach(user => { - queryMembers.push(user._id); - }); - } else { - errors.notFound.members.push(query); - } - }); - } + } + }); - if (queryParams.assignees.length) { - queryParams.assignees.forEach(query => { - const users = Users.find({ - username: query, - }); - if (users.count()) { - users.forEach(user => { - queryAssignees.push(user._id); - }); - } else { - errors.notFound.assignees.push(query); - } - }); - } - - if (queryMembers.length && queryAssignees.length) { + if ( + queryUsers[OPERATOR_MEMBER].length && + queryUsers[OPERATOR_ASSIGNEE].length + ) { selector.$and.push({ $or: [ - { members: { $in: queryMembers } }, - { assignees: { $in: queryAssignees } }, + { members: { $in: queryUsers[OPERATOR_MEMBER] } }, + { assignees: { $in: queryUsers[OPERATOR_ASSIGNEE] } }, ], }); - } else if (queryMembers.length) { - selector.members = { $in: queryMembers }; - } else if (queryAssignees.length) { - selector.assignees = { $in: queryAssignees }; + } else if (queryUsers[OPERATOR_MEMBER].length) { + selector.members = { $in: queryUsers[OPERATOR_MEMBER] }; + } else if (queryUsers[OPERATOR_ASSIGNEE].length) { + selector.assignees = { $in: queryUsers[OPERATOR_ASSIGNEE] }; } - if (queryParams.labels.length) { - queryParams.labels.forEach(label => { + if (queryParams.hasOperator(OPERATOR_LABEL)) { + queryParams.getPredicates(OPERATOR_LABEL).forEach(label => { const queryLabels = []; let boards = Boards.userSearch(userId, { @@ -511,39 +343,47 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { }); }); } else { - errors.notFound.labels.push(label); + errors.addNotFound(OPERATOR_LABEL, label); } } - selector.labelIds = { $in: queryLabels }; + selector.labelIds = { $in: _.uniq(queryLabels) }; }); } - if (queryParams.has.length) { - queryParams.has.forEach(has => { + if (queryParams.hasOperator(OPERATOR_HAS)) { + queryParams.getPredicates(OPERATOR_HAS).forEach(has => { switch (has.field) { - case 'attachment': - const attachments = Attachments.find({}, { fields: { cardId: 1 } }); + case PREDICATE_ATTACHMENT: selector.$and.push({ - _id: { $in: attachments.map(a => a.cardId) }, + _id: { + $in: Attachments.find({}, { fields: { cardId: 1 } }).map( + a => a.cardId, + ), + }, }); break; - case 'checklist': - const checklists = Checklists.find({}, { fields: { cardId: 1 } }); - selector.$and.push({ _id: { $in: checklists.map(a => a.cardId) } }); + case PREDICATE_CHECKLIST: + selector.$and.push({ + _id: { + $in: Checklists.find({}, { fields: { cardId: 1 } }).map( + a => a.cardId, + ), + }, + }); break; - case 'description': - case 'startAt': - case 'dueAt': - case 'endAt': + case PREDICATE_DESCRIPTION: + case PREDICATE_START_AT: + case PREDICATE_DUE_AT: + case PREDICATE_END_AT: if (has.exists) { selector[has.field] = { $exists: true, $nin: [null, ''] }; } else { selector[has.field] = { $in: [null, ''] }; } break; - case 'assignees': - case 'members': + case PREDICATE_ASSIGNEES: + case PREDICATE_MEMBERS: if (has.exists) { selector[has.field] = { $exists: true, $nin: [null, []] }; } else { @@ -573,26 +413,26 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { const attachments = Attachments.find({ 'original.name': regex }); - // const comments = CardComments.find( - // { text: regex }, - // { fields: { cardId: 1 } }, - // ); + const comments = CardComments.find( + { text: regex }, + { fields: { cardId: 1 } }, + ); selector.$and.push({ $or: [ { title: regex }, { description: regex }, { customFields: { $elemMatch: { value: regex } } }, - { - _id: { - $in: CardComments.textSearch(userId, [queryParams.text]).map( - com => com.cardId, - ), - }, - }, + // { + // _id: { + // $in: CardComments.textSearch(userId, [queryParams.text]).map( + // com => com.cardId, + // ), + // }, + // }, { _id: { $in: checklists.map(list => list.cardId) } }, { _id: { $in: attachments.map(attach => attach.cardId) } }, - // { _id: { $in: comments.map(com => com.cardId) } }, + { _id: { $in: comments.map(com => com.cardId) } }, ], }); } @@ -607,6 +447,29 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { // eslint-disable-next-line no-console // console.log('selector.$and:', selector.$and); + const query = new Query(); + query.selector = selector; + query.params = queryParams; + query._errors = errors; + + return query; +} + +function buildProjection(query) { + let skip = 0; + if (query.params.skip) { + skip = query.params.skip; + } + let limit = DEFAULT_LIMIT; + const configLimit = parseInt(process.env.RESULTS_PER_PAGE, 10); + if (!isNaN(configLimit) && configLimit > 0) { + limit = configLimit; + } + + if (query.params.hasOperator(OPERATOR_LIMIT)) { + limit = query.params.getPredicate(OPERATOR_LIMIT); + } + const projection = { fields: { _id: 1, @@ -636,10 +499,13 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { limit, }; - if (queryParams.sort) { - const order = queryParams.sort.order === 'asc' ? 1 : -1; - switch (queryParams.sort.name) { - case 'dueAt': + if (query.params.hasOperator(OPERATOR_SORT)) { + const order = + query.params.getPredicate(OPERATOR_SORT).order === ORDER_ASCENDING + ? 1 + : -1; + switch (query.params.getPredicate(OPERATOR_SORT).name) { + case PREDICATE_DUE_AT: projection.sort = { dueAt: order, boardId: 1, @@ -648,7 +514,7 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { sort: 1, }; break; - case 'modifiedAt': + case PREDICATE_MODIFIED_AT: projection.sort = { modifiedAt: order, boardId: 1, @@ -657,7 +523,7 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { sort: 1, }; break; - case 'createdAt': + case PREDICATE_CREATED_AT: projection.sort = { createdAt: order, boardId: 1, @@ -666,7 +532,7 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { sort: 1, }; break; - case 'system': + case PREDICATE_SYSTEM: projection.sort = { boardId: order, swimlaneId: order, @@ -681,77 +547,31 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) { // eslint-disable-next-line no-console // console.log('projection:', projection); - return findCards(sessionId, selector, projection, errors); -}); + query.projection = projection; -Meteor.publish('brokenCards', function() { - const user = Users.findOne({ _id: this.userId }); + return query; +} - const permiitedBoards = [null]; - let selector = {}; - selector.$or = [ - { permission: 'public' }, - { members: { $elemMatch: { userId: user._id, isActive: true } } }, +function buildQuery(queryParams) { + const query = buildSelector(queryParams); + + return buildProjection(query); +} + +Meteor.publish('brokenCards', function(sessionId) { + check(sessionId, String); + + const params = new QueryParams(); + params.addPredicate(OPERATOR_STATUS, PREDICATE_ALL); + const query = buildQuery(params); + query.selector.$or = [ + { boardId: { $in: [null, ''] } }, + { swimlaneId: { $in: [null, ''] } }, + { listId: { $in: [null, ''] } }, ]; + // console.log('brokenCards selector:', query.selector); - Boards.find(selector).forEach(board => { - permiitedBoards.push(board._id); - }); - - selector = { - boardId: { $in: permiitedBoards }, - $or: [ - { boardId: { $in: [null, ''] } }, - { swimlaneId: { $in: [null, ''] } }, - { listId: { $in: [null, ''] } }, - ], - }; - - const cards = Cards.find(selector, { - fields: { - _id: 1, - archived: 1, - boardId: 1, - swimlaneId: 1, - listId: 1, - title: 1, - type: 1, - sort: 1, - members: 1, - assignees: 1, - colors: 1, - dueAt: 1, - }, - }); - - const boards = []; - const swimlanes = []; - const lists = []; - const users = []; - - cards.forEach(card => { - if (card.boardId) boards.push(card.boardId); - if (card.swimlaneId) swimlanes.push(card.swimlaneId); - if (card.listId) lists.push(card.listId); - if (card.members) { - card.members.forEach(userId => { - users.push(userId); - }); - } - if (card.assignees) { - card.assignees.forEach(userId => { - users.push(userId); - }); - } - }); - - return [ - cards, - Boards.find({ _id: { $in: boards } }), - Swimlanes.find({ _id: { $in: swimlanes } }), - Lists.find({ _id: { $in: lists } }), - Users.find({ _id: { $in: users } }, { fields: Users.safeFields }), - ]; + return findCards(sessionId, query); }); Meteor.publish('nextPage', function(sessionId) { @@ -761,7 +581,7 @@ Meteor.publish('nextPage', function(sessionId) { const projection = session.getProjection(); projection.skip = session.lastHit; - return findCards(sessionId, session.getSelector(), projection); + return findCards(sessionId, new Query(session.getSelector(), projection)); }); Meteor.publish('previousPage', function(sessionId) { @@ -771,19 +591,20 @@ Meteor.publish('previousPage', function(sessionId) { const projection = session.getProjection(); projection.skip = session.lastHit - session.resultsCount - projection.limit; - return findCards(sessionId, session.getSelector(), projection); + return findCards(sessionId, new Query(session.getSelector(), projection)); }); -function findCards(sessionId, selector, projection, errors = null) { +function findCards(sessionId, query) { const userId = Meteor.userId(); // eslint-disable-next-line no-console - // console.log('selector:', selector); + // console.log('selector:', query.selector); + // console.log('selector.$and:', query.selector.$and); // eslint-disable-next-line no-console // console.log('projection:', projection); let cards; - if (!errors || !errors.hasErrors()) { - cards = Cards.find(selector, projection); + if (!query.hasErrors()) { + cards = Cards.find(query.selector, query.projection); } // eslint-disable-next-line no-console // console.log('count:', cards.count()); @@ -794,19 +615,17 @@ function findCards(sessionId, selector, projection, errors = null) { lastHit: 0, resultsCount: 0, cards: [], - selector: SessionData.pickle(selector), - projection: SessionData.pickle(projection), + selector: SessionData.pickle(query.selector), + projection: SessionData.pickle(query.projection), + errors: query.errors(), }, }; - if (errors) { - update.$set.errors = errors.errorMessages(); - } if (cards) { update.$set.totalHits = cards.count(); update.$set.lastHit = - projection.skip + projection.limit < cards.count() - ? projection.skip + projection.limit + query.projection.skip + query.projection.limit < cards.count() + ? query.projection.skip + query.projection.limit : cards.count(); update.$set.cards = cards.map(card => { return card._id; @@ -884,5 +703,5 @@ function findCards(sessionId, selector, projection, errors = null) { ]; } - return [SessionData.find({ userId: userId, sessionId })]; + return [SessionData.find({ userId, sessionId })]; } diff --git a/server/publications/swimlanes.js b/server/publications/swimlanes.js new file mode 100644 index 000000000..533f5159c --- /dev/null +++ b/server/publications/swimlanes.js @@ -0,0 +1,53 @@ +Meteor.methods({ + 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(); + + return true; + } + + return false; + }, +}); diff --git a/snap-src/bin/config b/snap-src/bin/config index 5b426c0a8..52c46f365 100755 --- a/snap-src/bin/config +++ b/snap-src/bin/config @@ -3,7 +3,7 @@ # All supported keys are defined here together with descriptions and default values # list of supported keys -keys="DEBUG MONGO_LOG_DESTINATION MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CA_CERT OAUTH2_LOGIN_STYLE OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS OAUTH2_ADFS_ENABLED LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD ATTACHMENTS_STORE_PATH PASSWORD_LOGIN_ENABLED CAS_ENABLED CAS_BASE_URL CAS_LOGIN_URL CAS_VALIDATE_URL SAML_ENABLED SAML_PROVIDER SAML_ENTRYPOINT SAML_ISSUER SAML_CERT SAML_IDPSLO_REDIRECTURL SAML_PRIVATE_KEYFILE SAML_PUBLIC_CERTFILE SAML_IDENTIFIER_FORMAT SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE SAML_ATTRIBUTES ORACLE_OIM_ENABLED" +keys="DEBUG MONGO_LOG_DESTINATION MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CA_CERT OAUTH2_LOGIN_STYLE OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS OAUTH2_ADFS_ENABLED LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD ATTACHMENTS_STORE_PATH PASSWORD_LOGIN_ENABLED CAS_ENABLED CAS_BASE_URL CAS_LOGIN_URL CAS_VALIDATE_URL SAML_ENABLED SAML_PROVIDER SAML_ENTRYPOINT SAML_ISSUER SAML_CERT SAML_IDPSLO_REDIRECTURL SAML_PRIVATE_KEYFILE SAML_PUBLIC_CERTFILE SAML_IDENTIFIER_FORMAT SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE SAML_ATTRIBUTES ORACLE_OIM_ENABLED RESULTS_PER_PAGE" # default values DESCRIPTION_DEBUG="Debug OIDC OAuth2 etc. Example: sudo snap set wekan debug='true'" @@ -543,3 +543,7 @@ KEY_SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE="saml-local-profile-match-attribute" DESCRIPTION_SAML_ATTRIBUTES="SAML Attributes" DEFAULT_SAML_ATTRIBUTES="" KEY_SAML_ATTRIBUTES="saml-attributes" + +DESCRIPTION_RESULTS_PER_PAGE="Number of search results to show per page by default" +DEFAULT_RESULTS_PER_PAGE="" +KEY_RESULTS_PER_PAGE="results-per-page" diff --git a/snap-src/bin/wekan-help b/snap-src/bin/wekan-help index 1da203d8d..b544046f6 100755 --- a/snap-src/bin/wekan-help +++ b/snap-src/bin/wekan-help @@ -49,6 +49,11 @@ echo -e "\t$ snap set $SNAP_NAME with-api='true'" echo -e "\t-Disable the API:" echo -e "\t$ snap unset $SNAP_NAME with-api" echo -e "\n" +echo -e "Number of search results to show per page by default:" +echo -e "\t$ snap set $SNAP_NAME results-per-page='20'" +echo -e "\t-Restore default:" +echo -e "\t$ snap unset $SNAP_NAME results-per-page" +echo -e "\n" echo -e "Accounts lockout known users failures before, greater than 0. Default: 3" echo -e "\t$ snap set $SNAP_NAME accounts-lockout-known-users-failures-before='3'" echo -e "\t-Restore default:" diff --git a/start-wekan.bat b/start-wekan.bat index 6db11e0d8..5779fd6fc 100644 --- a/start-wekan.bat +++ b/start-wekan.bat @@ -11,10 +11,13 @@ SET ROOT_URL=http://localhost SET PORT=80 SET MONGO_URL=mongodb://127.0.0.1:27017/wekan -REM https://github.com/wekan/wekan/wiki/Troubleshooting-Mail +REM # https://github.com/wekan/wekan/wiki/Troubleshooting-Mail REM SET MAIL_URL=smtps://username:password@email-smtp.eu-west-1.amazonaws.com:587/ REM SET MAIL_FROM="Wekan Boards " +REM # ==== NUMBER OF SEARCH RESULTS PER PAGE BY DEFAULT ==== +REM SET RESULTS_PER_PAGE=20 + REM # If you disable Wekan API with false, Export Board does not work. SET WITH_API=true diff --git a/start-wekan.sh b/start-wekan.sh index f9dbbb6bc..bbdb4e26c 100755 --- a/start-wekan.sh +++ b/start-wekan.sh @@ -23,6 +23,9 @@ # This is local port where Wekan Node.js runs, same as below on Caddyfile settings. export PORT=2000 #--------------------------------------------- + # ==== NUMBER OF SEARCH RESULTS PER PAGE BY DEFAULT ==== + #export RESULTS_PER_PAGE=20 + #--------------------------------------------- # Wekan Export Board works when WITH_API=true. # If you disable Wekan API with false, Export Board does not work. export WITH_API='true' diff --git a/torodb-postgresql/docker-compose.yml b/torodb-postgresql/docker-compose.yml index bcf70d261..f2fd68df8 100644 --- a/torodb-postgresql/docker-compose.yml +++ b/torodb-postgresql/docker-compose.yml @@ -210,6 +210,9 @@ services: # There is Feature Request: Logging date and time of all activity with summary reports, # and requesting reason for changing card to other column https://github.com/wekan/wekan/issues/1598 #--------------------------------------------------------------- + # ==== NUMBER OF SEARCH RESULTS PER PAGE BY DEFAULT ==== + #- RESULTS_PER_PAGE=20 + #--------------------------------------------------------------- # ==== WEKAN API AND EXPORT BOARD ==== # Wekan Export Board works when WITH_API=true. # https://github.com/wekan/wekan/wiki/REST-API